PostgreSQL数据库内核(一):增加系统表pg_test_catalog

news2024/9/20 19:48:58

目录

编译环境准备

gdb调试

CLion配置

增加系统表pg_test_catalog


编译环境准备

        使用PostgreSQL14.5源码版本编译,操作系统CentOS,本地windos系统+CLion代码工具,首先下载pg源码,上传CentOS系统:

more /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"

 下载必要的系统环境依赖包:

yum install -y openssl-devel readline-devel ]
yum install -y zlib-devel bison flex 
yum install -y libxml2-devel libxslt-devel 
yum install -y perl gdb gdbsever

 configure校验源码(debug模式),make编译后安装到系统,创建postgres用户/组后把编译文件目录都赋权给postgres,通常数据库跑在普通用户下的:

# 检查环境,生成debug模式的makefile
/home/yzg/postgresql-14.5/configure --prefix=/usr/local/pgsql --enable-debug
# 构建编译
make
# 可选项,跑源码自带的测试例
make check
# 编译安装系统上
make install
# 新建postgres用户和组
groupadd postgres
useradd -r -g postgres -d /home/postgres -s /bin/bash -m postgres
# copy编译目录到home,赋权
cp -R /usr/local/pgsql /home/postgres/
chown -R postgres:postgres /home/postgres/pgsql
# 切换用户
su - postgres
cd ~/pgsql/bin
# 初始化postgresql并启动
./initdb -D ~/data
# 初始化成功
Success. You can now start the database server using:

# 启动
./pg_ctl start -D /home/postgres/data  

waiting for server to start.... done
server started
[postgres@iZ8vb5e8o9vgrwc6estwgjZ bin]$ ps -ef |grep postgres
root     21038  8375  0 10:23 pts/0    00:00:00 su - postgres
postgres 21039 21038  0 10:23 pts/0    00:00:00 -bash
postgres 21192     1  0 10:25 ?        00:00:00 /home/postgres/pgsql/bin/postgres -D /home/postgres/data
postgres 21194 21192  0 10:25 ?        00:00:00 postgres: checkpointer
postgres 21195 21192  0 10:25 ?        00:00:00 postgres: background writer
postgres 21196 21192  0 10:25 ?        00:00:00 postgres: walwriter
postgres 21197 21192  0 10:25 ?        00:00:00 postgres: autovacuum launcher
postgres 21198 21192  0 10:25 ?        00:00:00 postgres: stats collector
postgres 21199 21192  0 10:25 ?        00:00:00 postgres: logical replication launcher
postgres 21209 21039  0 10:25 pts/0    00:00:00 ps -ef
postgres 21210 21039  0 10:25 pts/0    00:00:00 grep --color=auto postgres

gdb调试

psql测试并打断点进行源码调试,这里以select 1的查询路径为例,其调用函数exec_simple_query在postgres.c文件的955行:

# 增加bin目录环境变量,不然psql需要全路径
export PATH=/home/postgres/pgsql/bin/:$PATH
# psql测试
whereis psql
psql: /home/postgres/pgsql/bin/psql

psql
psql (14.5)
Type "help" for help.

postgres=# select 1;
 ?column?
----------
        1
(1 row)

# gdb调试指定psql的pid和源码目录
gdb -p 13326 -d /home/yzg/postgresql-14.5/

# gdb打断点到xact.c的988行
(gdb) b xact.c:899

CLion配置

CLion是JetBrains 的类似于idea的工具,其界面/快捷键与idea一致,但其使用cmake作为项目管理和扫描默认工具,pg源码用configure+makefile实现编译的,好比maven和gradle的区别,这里我们本地只保证其能够代码转跳并且能够提示代码规范就行,创建CMakeList.txt文件让CLion能够识别代码结构:

cmake_minimum_required(VERSION 3.10)
project(PostgreSQL VERSION 14.5)

# Set the build type (Debug or Release)
set(CMAKE_C_STANDARD  99)

# Add the PostgreSQL source directories
set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(INCLUDE_DIRS "${SOURCE_DIR}/include")

# Specify the PostgreSQL libraries and headers location
set(LIBRARY_DIRS "${SOURCE_DIR}/backend")

# Include directories for the compiler to search for header files
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/include/*)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/include/*/*)
file(GLOB_RECURSE POSTGRESQL_SRC_FILES
        src/*/*.c
        src/*/*.h
        src/*.c
        src/*.h
        src/*/*.c
        contrib/*/*.c)
# Set the compiler flags if necessary
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")


# Add subdirectories to build
#[[add_subdirectory("${SOURCE_DIR}/backend")
add_subdirectory("${SOURCE_DIR}/interfaces/libpq")
add_subdirectory("${SOURCE_DIR}/contrib")]]

# Add any custom targets here
add_executable(postgres_server ${POSTGRESQL_SRC_FILES} )
target_link_libraries(postgres_server ${LIBRARIES})

# You may need to add more subdirectories and targets based on your needs.

增加系统表pg_test_catalog

配置好编译调试环境以及代码阅读环境后开始增加系统表,首先查看pg_database这个系统表有哪些信息可以借鉴的,参考源码看:pg_database有若干字段,其在代码中位置主要是:src/backend/catalog和src/include/catalog目录,两者区别如下:

  • src/include/catalog:这个目录存放所有系统表的头文件
  • src/backend/catalog:这个目录存放处理系统表的后端实现代码,包括用于操作系统表的函数,例如创建、读取、更新和删除,这些函数通常会在执行 SQL 语句时被调用,以便与系统目录进行交互。

在src/include/catalog目录下有这2个文件:

仿照创建pg_test_catalog文件:

pg_test_catalog.dat文件用于插入初始化数据:

#----------------------------------------------------------------------
#
# pg_database.dat
#    Initial contents of the pg_database system catalog.
#
# Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
# Portions Copyright (c) 1994, Regents of the University of California
#
# src/include/catalog/pg_test_catalog.dat
#
#----------------------------------------------------------------------

[

{ oid => '6668', oid_symbol => 'TEST_CATALOG_OID_S',
  descr => 'test catalog yzg',
  name => 'yzg', sex => 'boy'},

]

pg_test_catalog.h是头文件,全局可以使用:

/*-------------------------------------------------------------------------
 *
 * pg_test_catalog.h
 *	  definition of the "database" system catalog (pg_test_catalog)
 *
 *
 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_test_catalog.h
 *
 * NOTES
 *	  The Catalog.pm module reads this file and derives schema
 *	  information.
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_TEST_CATALOG_H
#define PG_TEST_CATALOG_H

#include "catalog/genbki.h"
#include "catalog/pg_test_catalog_d.h"

/* ----------------
 *		pg_test_catalog definition.  cpp turns this into
 *		typedef struct FormData_pg_test_catalog
 * ----------------
 */
CATALOG(pg_test_catalog,6666,TestCatalogRelationId)
{
	Oid			oid;
	char        name;
	char	    sex;
} FormData_pg_test_catalog;


typedef FormData_pg_test_catalog *Form_pg_test_catalog;

DECLARE_UNIQUE_INDEX_PKEY(pg_test_catalog_oid_index, 6667, on pg_test_catalog using btree(oid oid_ops));
#define TestCatalogOidIndexId	6667

#endif							/* pg_test_catalog_H */

修改src/backend/catalog/Makefile,添加刚才新增的文件:

重新编译安装:

postgres=# select * from pg_test_catalog;
 oid  | name | sex
------+------+-----
 6668 | y    | b
(1 row)

postgres=# \d pg_test_catalog;
        Table "pg_catalog.pg_test_catalog"
 Column |  Type  | Collation | Nullable | Default
--------+--------+-----------+----------+---------
 oid    | oid    |           | not null |
 name   | "char" |           | not null |
 sex    | "char" |           | not null |
Indexes:
    "pg_test_catalog_oid_index" PRIMARY KEY, btree (oid)

以上就完成了增加系统表流程,这里系统表并没有一些逻辑交互,如果涉及复杂的逻辑交互需要修改backend里面的代码或者调用;

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

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

相关文章

要 set 还是 map? 我全要

引子: 时隔多日,我又回来啦,接上回,我们讲到set的一小部分,我们今天来讲详细讲set与map,满满干货启动!根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型…

[240803] Prompt Fuzzer 新版本发布 | Windows 会在更新时进行时间调整以减少碳排放

目录 Prompt Fuzzer 新版本发布:更强大、更灵活的 GenAI 应用安全评估工具Windows 会在更新时进行时间调整以减少碳排放 Prompt Fuzzer 新版本发布:更强大、更灵活的 GenAI 应用安全评估工具 Prompt Security 发布了新版 Prompt Fuzzer,这是…

CSS+js:顶部导航栏背景滚动渐变、顶部背景滚动渐变

一、效果图 图1 图2 图3 二、gradual.html代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>顶部导航栏渐变和顶部背景渐变</title></head><body><div class"content-root" id&quo…

Linux PSCI框架

Linux PSCI框架 概述 参考链接&#xff1a; 简单讲解Linux PSCI框架-Linxu内核栈 概述 PSCI &#xff08;Power State Coordination Interface&#xff09; 是ARM定义的电源管理接口规范&#xff0c;由firm来实现。Linux系统通过smc/hvc指令&#xff08;设备树可查看是那种&a…

5.7软件质量和软件度量

软件质量和软件度量 软件质量软件质量特性ISO/EC9126软件质量模型练习题Mc Call质量模型 软件质量保证软件评审软件容错技术结构冗余信息冗余时间元余冗余附加技术 软件度量练习题 软件质量 软件质量&#xff1a;是指反映软件系统或软件产品满足规定或隐含需求的能力的特征和特…

代码随想录算法训练营day32 | 509. 斐波那契数 、70. 爬楼梯 、746. 使用最小花费爬楼梯

碎碎念&#xff1a;开始动态规划了&#xff01;加油&#xff01; 参考&#xff1a;代码随想录 动态规划理论基础 动态规划常见类型&#xff1a; 动规基础类题目背包问题打家劫舍股票问题子序列问题 解决动态规划问题应该要思考清楚的&#xff1a; 动态规划五部曲&#xff1…

使用 continue 自定义 AI 编程环境

一直在使用github 的 copilot 来编程&#xff0c;确实好用&#xff0c;对编码效率有很大提升。 但是站在公司角度&#xff0c;因为它只能对接公网&#xff08;有代码安全问题&#xff09;。另外&#xff0c;它的扩展能力也不强&#xff0c;无法适配公司特定领域的知识库&#x…

c# winform 创建日志登录界面

一.创建一个用于登录的Login的复合控件 1.右击项目文件&#xff0c;点击添加用户控件&#xff0c;设置为控件名为Login。 2.拉动两个lable控件&#xff0c;两个textBox控件&#xff0c;一个button,一个CheckBox控件。 3.将控件的权限&#xff08;Modifiers&#xff09;设置为Pu…

Unity2D在处理精灵表过程中出现不清晰的解决方法

问题阐述 在我们拿到一张精灵表的时候&#xff0c;我们通常要进行切割。但这样往往导致切割的效果不是很好&#xff0c;这里举一个简单的例子。 这是举例子用到的精灵表 我们先对他进行切割处理。 将single改为Multiope 进入精灵编辑器后&#xff0c;我们选择切割方式 此时我…

【数据结构】链表篇

1.链表的概念以及结构 概念&#xff1a;链表是一种物理储存结构上的非连续、非顺序的储存结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续现实中的节点一般都是从堆上申请出来的从堆上申…

中度自闭症儿童上普校还是特校好呢

当家中有中度自闭症儿童时&#xff0c;家长们常常面临一个艰难的抉择&#xff1a;是让孩子进入普通学校&#xff08;普校&#xff09;接受融合教育&#xff0c;还是选择特殊教育学校&#xff08;特校&#xff09;接受更具针对性的教育&#xff1f;这是一个没有标准答案的问题&a…

Python基于逻辑回归的L1正则化(Lasso Logistic Regression)进行分类数据的特征选择项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 可以使用Lasso回归进行特征选择&#xff0c;尽管它本质上是一个用于回归问题的技术&#xff0c;但通过…

Python基于Prophet实现时间序列数据趋势周期特征提取项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Prophet是Facebook开源的一个用于时间序列预测的库&#xff0c;它主要用于处理具有趋势、季节性和假期…

Springboot功能模块之文件上传(minio)

一、概述 1.1什么是MinIO&#xff1f; MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 官网…

基础第二关:8G 显存玩转书生大模型 Demo

基础任务 复现过程 结果截图 进阶任务 任务一 复现过程 结果截图 任务二 复现过程 结果截图

OpenFoam waves2foam 虚拟机 镜像 下载 Ubuntu

编译完成截图及安装版本信息&#xff1a; 下载地址(资源整理不易&#xff0c;下载使用需付费&#xff0c;且文件较大&#xff0c;不能接受请勿浪费时间下载): 链接&#xff1a;https://pan.baidu.com/s/1j0-MYpaG2rTYuizSWPFcxg?pwdmoxv 提取码&#xff1a;moxv

【String的介绍及使用】

String的介绍及使用 ## 小杨 为何学习string以及string的简单介绍 学习string类的原因 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&am…

详解基于百炼平台及函数计算快速上线网页AI助手

引言 在当今这个信息爆炸的时代&#xff0c;用户对于在线服务的需求越来越趋向于即时性和个性化。无论是寻找产品信息、解决问题还是寻求建议&#xff0c;人们都期望能够获得即时反馈。这对企业来说既是挑战也是机遇——如何在海量信息中脱颖而出&#xff0c;提供高效且贴心的…

【C语言】fseek、ftell以及rewind函数(随机文件读写)

文章目录 前言1. fseek1.1 fseek函数原型1.2 fseek函数的形式参数1.3 fseek实例演示 2. ftell2.1 ftell函数原型2.2 ftell函数的实例演示 3. rewind3.1 rewind函数原型3.2 rewind函数实例演示 前言 在之前&#xff0c;我讲过文件的顺序读写。但是我们可不可以随机读写文件呢&a…

PCL从理解到应用【09】 点云特征 | 关键点提取 | 方法汇总

前言 在PCL中&#xff0c;有多种方法和函数可以用来提取点云特征&#xff0c;本文介绍关键点提取。 提取点云关键点&#xff0c;本文介绍的方法包括&#xff1a;SIFT、Harris、NARF、ISS和SUSAN。 Harris 提取点云关键点&#xff0c;效果如下图所示&#xff1a; 白色点是原始…