数据库内核研发学习之路(五)创建postgres系统表

写在前面

在使用postgres的时候,有很多表是我们一开始安装好数据库就存在的,这些表称为系统表,他们记载一些数据库信息,比如我们做运维工作常用的pg_stat_activity;我们在数据库中查询这张表可以发现他存储了一些数据库连接信息。如下所示:

本次的任务就是新增一张系统表pg_test,这张表有三个字段,oid、id、ipaddr,字段所属的类型分别为Oid、int32、text,并且初始化一些值,实现能够在psql命令中使用select 命令查询得到。

1、创建系统表的声明

1.1、pg_extension系统表的理解

比如说我们查询pg_extension这张表,我们可以发现它具有这些信息

首先就是它具有一些字段属性,然后就是你会发现他还有index索引,有主键索引,有唯一性索引,然后我们在源码中搜索pg_extension找到这张系统表的声明,观察这张表的实现,对其进行模仿写出我们自己的pg_test系统表。

#ifndef PG_EXTENSION_H
#define PG_EXTENSION_H#include "catalog/genbki.h"
#include "catalog/pg_extension_d.h"CATALOG(pg_extension,3079,ExtensionRelationId)
{Oid			oid;			/* oid */NameData	extname;		/* extension name */Oid			extowner BKI_LOOKUP(pg_authid); /* extension owner */Oid			extnamespace BKI_LOOKUP(pg_namespace);	/* namespace of* contained objects */bool		extrelocatable; /* if true, allow ALTER EXTENSION SET SCHEMA */#ifdef CATALOG_VARLEN			/* variable-length fields start here *//* extversion may never be null, but the others can be. */text		extversion BKI_FORCE_NOT_NULL;	/* extension version name */Oid			extconfig[1] BKI_LOOKUP(pg_class);	/* dumpable configuration* tables */text		extcondition[1];	/* WHERE clauses for config tables */
#endif
} FormData_pg_extension;typedef FormData_pg_extension *Form_pg_extension;DECLARE_TOAST(pg_extension, 4147, 4148);DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, on pg_extension using btree(oid oid_ops));
DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, on pg_extension using btree(extname name_ops));#endif							/* PG_EXTENSION_H */

 去掉注释的结果如上所示。

首先它写了预处理指令,防止该头文件被重复定义,然后他引用了两个头文件,其中genbki头文件它包含了一些宏定义,我们可以打开很多系统表的定义,可以发现都包含了这个头文件,另外一个是pg_extension_d头文件,他比较特殊,我们打开这个头文件可以发现有如下信息:

其中比较显眼的我们可以看到用英文写着不要编辑这个文件,也就是说明这个文件是自动生成的,再观察其他部分,发现这个文件里面有很多的宏定义,对照前面的pg_extension头文件里面的信息一起观察,可以发现

上图所示前八个分别对应了pg_extension系统表的八个属性,然后最后一个宏定义则是表示具有八个属性列,这一点在我们后面对系统表进行操作的时候会常用到,然后还有如下几个宏:

其中第一个是指系统表的唯一标识的id值,这一点在前面的博客中已经提到过了,如何获取未被使用的id值,后面两个是索引的id值。

1.2、创建自己的系统表

所以我们就明确了系统表的创建方法:

  1. 预处理语句
  2. 引用头文件 catalog/genbki.h和自动生成的头文件"catalog/pg_extension_d.h"
  3. 对表的属性进行定义
  4. 创建表的索引

所以我们在include/catalog下面创建我们自己的pg_test头文件,编写如下:

#ifndef PG_TEST_H
#define PG_TEST_H#include "catalog/genbki.h" // 该文件中定义了 CATALOG, BKI_BOOTSTRAP 等相关的宏。
#include "catalog/pg_test_d.h"CATALOG(pg_test,3813,TestRelationId)
{Oid oid;int32 id2;text ipaddr;}FormData_pg_test;typedef FormData_pg_test *Form_pg_test;DECLARE_UNIQUE_INDEX_PKEY(pg_test_relid_seqno_index, 1382, TestRelidSeqnoIndexId, on pg_test using btree(oid oid_ops));
DECLARE_INDEX(pg_test_relid_id2_index,388,TestRelidid2IndexId,on pg_test using btree(id2 int4_ops));
DECLARE_INDEX(pg_test_relid_ipaddr_index,389,TestRelidipaddrIndexId,on pg_test using btree(ipaddr text_ops));#endif

 在这其中CATALOG的方式创建可能与我们之前学习的创建一个结构体的方法不同,但是其实他也是创建了一个结构体,转到CATALOG的定义处可以发现其实也是创建了一个结构体。

然后值得一说的是它对应三个参数,name即系统表的名字,oid即系统表的唯一标识,oidmacro即系统表的唯一标识oid的宏定义名称。

然后就是系统表的参数,再然后就是系统表这个结构体的名称即FormData_pg_test这里使用的是同意的命名方法,可以参考pg_extension头文件。

紧接着就是索引的创建,首先是创建一个什么样的索引,这里使用DECLARE_UNIQUE_INDEX_PKEY方法创建一个唯一性的主键索引,使用DECLARE_INDEX创建两个普通的btree索引,他们的参数分别是索引的名称,索引对应的唯一的id值,索引唯一的id值所对应的宏,然后就是创建一个什么类型的索引,并且指明创建的索引存在那一个列属性上面。

2、初始化系统表的数据

细心的朋友可以发现在这个文件夹里面不仅存在.h头文件,还存在一个.dat的文件,这里以pg_tablespace.dat文件为例,点进去可以发现,里面分别对应该系统表的所有属性列,再在数据库中查询这张系统表,查询结果如下图,也就是说这里存储的就是系统表的初始值。

所以我们也创建一个pg_test.dat文件,并且按照上面的格式对数据进行初始化,但是有一点需要格外注意,这里的oid也是不可以重复的值哦!也是需要查询未被使用id作为可以初始化的id。

3、 编写Makefile文件加载新增的头文件

在catalog下面的Makefile中添加如下所示的内容:

4、重新configure和编译安装

首先使用make maintainer-clean命令清楚之前执行的configure

然后使用configure命令重新安装,(具体命令可见之前的博客内容)

其次使用make -j6命令进行编译

然后使用make install命令进行安装

最后记得重新初始化一个数据库data才可以生效

5、结果验证

首先使用psql命令登录数据库,然后使用\d+命令查看pg_test系统表的详细定义,最后使用select * from pg_test命令查询该系统表是否存在初始化的数据。验证结果图如下:

6、错误:

问题描述:开始这里存在波浪线提示引用错误,如图所示

解决方法:是因为这个文件是自动生成的,目前还没有进行编译,自然就还没有生成,所以会报错,忽略即可。

问题描述:在执行make命令的时候出现如下图所示报错

解决办法:报错出现的原因是因为所使用的oid值重复了,这里再使用unused_oids命令查询未被使用的oid即可

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GO:Socket编程

目录 一、TCP/IP协议族和四层模型概述 1.1 互联网协议族(TCP/IP) 1.2 TCP/IP四层模型 1. 网络访问层(Network Access Layer) 2. 网络层(Internet Layer) 3. 传输层(Transport Layer&#…

WPF+Mvvm 项目入门完整教程(一)

WPF+Mvvm 入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架安装…

【JavaScript 算法】双指针法:高效处理数组问题

🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现示例问题1:两数之和 II - 输入有序数组示例问题2:反转字符串中的元音字母注释说明: 三、应用场景四、总结 双指针法(Two Pointer Technique&#xff…

深入理解Java并发线程阻塞唤醒类LockSupport

LockSupprot 用来阻塞和唤醒线程,底层实现依赖于Unsafe类 该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕 park 和 unpark 展开 public class LockSupportDemo1 {public static void main(String[] args) {Thread mainThread Thread.cu…

微信小程序(百战商城)的实战项目的首页的制作及讲解

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【人工智能】基于香橙派AIpro和昇腾AI计算芯片的面部口罩检测(详细教程)

目录 前言 1.介绍开发板 2.应用场景 3.安装操作系统 3.1 下载工具 3.2 烧录系统 3.3 系统装载 4.配置操作系统 4.1 登录系统账户 4.2 配置网络连接 4.3 查看设备网络 4.4 配置远程连接 5.部署目标检测应用 5.1 准备运行环境 5.2 模型二次训练 ​5.3 热成像温度…

数据结构 day4

目录 思维导图: 学习内容: 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

pikachu之暴力破解

1基于表单的暴力破解 随便输入然后抓包 选中添加账号密码 添加分别添加payload1,2,的字典 开始攻击 2验证码绕过on server 和基于表单的暴力破解相比,多了一个验证码功能 这个验证码是前端的验证码(和前面那个一样选中添加账号密码…

Java小技能:多级组织机构排序并返回树结构(包含每个层级的子节点和业务数据集合)

文章目录 引言I 实体定义1.1 部门1.2 用户组织机构中间表1.3 树状DTOII 抽取组织机构排序方法2.1 树状排序方法2.2 案例III 查询条件构建3.1 根据部门进行权限控制3.2 注入风险引言 需求: 根据组织机构进行数据授权控制,例如控制船舶、船舶设备、摄像头、港区查看权限。 一…

kettle从入门到精通 第七十六课 ETL之kettle kettle连接hive教程

1、群里有小伙伴询问kettle连接hive的demo,今天抽点时间整理下。其实kettle连接hive和连接mysql数据库也是一样的。 1)kettle中的lib目录下放hive驱动jar,这里我使用的是kyuubi-hive-jdbc-shaded-1.9.0.jar。 2)设置hive连接参数…

pytorch学习(九)激活函数

1.pytorch常用激活函数如下: #ReLU激活函数 #Leaky ReLU激活函数 #Sigmoid激活函数 #Tanh激活函数 #Softmax激活函数 #Softplus2.代码 import torch.nn as nn import torch import numpy from torch.utils.tensorboard import SummaryWriterwriter SummaryWriter…

ModuleNotFoundError: No module named ‘lime‘,lime。 安装 LIME库

LIME LIME 的作用安装 LIME示例代码详细解释 总结 LIME(Local Interpretable Model-agnostic Explanations,局部可解释不可知模型)是一个Python库,用于解释机器学习模型的预测结果。它通过构建一个简单的、本地的可解释模型来近似…

【BUG】已解决:ModuleNotFoundError: No module named ‘torch‘

已解决:ModuleNotFoundError: No module named ‘torch‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市…

Unity UGUI 之EventSystem

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.EventSystem是什么? 有需要请查看手册:Unity - 手册&#xff1…

2024.7.19最新详细的VMware17.0.0安装

VM官网VMware - Delivering a Digital Foundation For Businesses。现在官网无法下载,点击会跳转到https://access.broadcom.com/default/ui/v1/signin/ 要注册一个账号: 注册登录以后,点击Please select your identity provider. - Support …

昇思25天学习打卡营第2天 | 快速入门

在快速发展的人工智能领域,深度学习已经成为数据分析和模式识别的核心技术。作为一名深度学习初学者,我有幸通过MindSpore平台进行了实战演练,从数据预处理到模型训练与测试,再到模型保存与加载,经历了一次完整的深度学…

基于SpringBoot+Vue的校园台球厅设备管理系统(带1w+文档)

基于SpringBootVue的校园台球厅设备管理系统(带1w文档) 基于SpringBootVue的校园台球厅设备管理系统(带1w文档) 本次设计任务是要设计一个校园台球厅人员与设备管理系统,这个系统能够满足校园台球厅人员与设备的管理及用户的校园台球厅人员与设备管理功能。系统的主…

彻底卸载360安全卫士的方法

法一: 按下WindowsR键,并输入msconfig, 在“引导”选项卡中选择“安全引导”,并重新启动进入安全模式。此时,重复第一种方法“应用和功能”-“360安全卫士”-“卸载”,在弹出的对话框中残忍的拒绝它的各种令人发指的无…

go-微服务的设计概括

一、微服务到底是什么? 初学者很容易把微服务和分布式混为一谈,但其实二者之间存在非常大的差异,我个人认为主要有以下几点: 分布式主要是一种技术手段,用来保证多个相同的进程能够共同工作而不出错。采用各种复杂的…

基于Ubuntu2310搭建openstack高可用集群B版

openstack-ha 环境初始化安装haproxy安装keepalived数据库集群高可用rabbitmq集群高可用memcache集群配置 keystone高可用glance高可用placement高可用nova高可用neutron高可用horizon高可用 本实验使用两台节点master和node配置haproxy高可用,keepliaved配置主备抢…