数据库内核研发学习之路(五)创建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,一经查实,立即删除!

相关文章

多租户架构的艺术:在SQL Server中实现数据库的多租户

多租户架构的艺术:在SQL Server中实现数据库的多租户 在云计算和SaaS(软件即服务)时代,多租户架构(Multi-Tenancy)成为了数据库设计中的一个关键概念。它允许多个租户(客户)共享相同…

初等数论精解【2】

文章目录 素数基础素数理论互素定义性质应用示例最大公约数方法一:欧几里得算法方法二:列举法(适用于较小的数)欧几里得算法编程实现扩展欧几里得算法概述算法背景算法原理算法步骤应用场景示例代码 结论素数分布素数概述一、定义…

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框架安装…

机器学习-19-基于交互式web应用框架streamlit和gradio转化数据和机器学习模型

参考Streamlit:简单快速的Python Web应用开发工具 参考Python(Web时代)—— 超简单:一行代码就能搭建网站 参考对比Streamlit和Gradio:选择最适合你的Python交互式应用框架 参考Gradio:构建交互式界面的简单而强大的Python库 参考【吴恩达 X HuggingFace】使用Gradio快速…

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

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

sqlalchemy_dm

1、参考文档: https://blog.csdn.net/njcwwddcz/article/details/126554118 https://eco.dameng.com/document/dm/zh-cn/pm/dmpython-dialect-package.html 2、生成工具 sqlalchemy2.0.0.zip 3、安装步骤 conda create --name kes --clone kes1 rz unzip sql…

高等数学用到的初等数学

指数 同指不同底乘法 (ab)xaxbx

如何做到高级Kotlin强化实战?(三)

高级Kotlin强化实战(二) 2.13 constructor 构造器2.14 Get Set 构造器2.15 操作符2.16 换行 2.13 constructor 构造器 //Java public class Utils { private Utils() {} public static int getScore(int value) { return 2 * value;} }//Kotlin class U…

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

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

实时吸烟检测系统:基于深度学习与YOLO模型的完整实现

引言 在公共场所吸烟不仅有害吸烟者的健康,也会影响到周围的人。为了更好地管理和监控公共场所的吸烟行为,本文介绍了一种基于深度学习的吸烟检测系统。该系统包含一个用户界面,利用YOLO(You Only Look Once)v8/v7/v6…

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

👨‍💻个人主页:开发者-曼亿点 👨‍💻 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 热成像温度…

JavaScript 异步编程:提升现代Web应用的性能与体验

异步概念解析 在编程领域,异步(Asynchronous)是一种允许程序继续执行而不等待某个操作完成的机制,与之相反的是同步(Synchronous),其中程序会暂停并等待每个操作完成才继续下一步。异步编程的核…

数据结构 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 注入风险引言 需求: 根据组织机构进行数据授权控制,例如控制船舶、船舶设备、摄像头、港区查看权限。 一…

3.设计模式--创建者模式--工厂模式

3.设计模式–创建者模式–工厂模式 3.1简单工厂和静态 工厂(不属于23中设计模式) //抽象类:定义了产品的规范,描述了产品的主要特性和功能 public interface Tea {public abstract void setName();public abstract String getNa…

Flask校验

WTForms 是一个 Python 库,用于处理和验证 Web 表单。它提供了很多功能来简化表单处理,包括字段类型、验证器、错误消息等。在 WTForms 中,validate 机制是用于确保表单数据满足特定条件的关键部分。 1.验证器(Validators&#x…

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连接参数…