PostgreSQL内核开发——添加内核函数

在PostgreSQL内核的学习过程中,可以尝试向内核中添加一些函数,扩展PostgreSQL的功能。同时可以增加自己对PG内核的理解。这里我们以简单的添加一个helloworld函数为例,分析一下这个过程中涉及到的相关源码。

PostgreSQL添加pg_helloworld函数

这里总结一下如何向PostgreSQL中添加内核函数,以helloworld为例,添加一个内核函数pg_helloworld,显示Hello PostgreSQL!。在添加之前,我们输入select pg_helloworld(),因为PostgreSQL中没有该内核函数,所以显示如下错误:

postgres=# select pg_helloworld();
ERROR:  function pg_helloworld() does not exist
LINE 1: select pg_helloworld();^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

这里我们实现这个函数。过程如下:

  1. src/include/catalog/pg_proc.dat中添加如下声明
# add function helloworld()    by chirpyli
{ oid => '9999', descr => 'Hello PostgreSQL',proname => 'pg_helloworld', prorettype => 'text',proargtypes => '', prosrc => 'pg_helloworld' },

其中含义如下:
oid:对象id,唯一不重复
descr:函数描述信息
proname:函数名称
prorettype:返回值类型
proargtypes:参数列表
prosrc:函数名称

  1. src/backend/utils/adt/pseudotypes.c中添加函数pg_helloworld
/*
* pg_helloworld
* function to show 'Hello PostgreSQL!'
*/
Datum
pg_helloworld(PG_FUNCTION_ARGS)
{char str[] = "Hello PostgreSQL!";PG_RETURN_TEXT_P(cstring_to_text(str));
}

这里说明一下参数,能够直接用SQL语句调用的函数(prosrc),他的参数必须是PG_FUNCTION_ARGS,其定义(src/include/fmgr.h)如下:

/* Standard parameter list for fmgr-compatible functions */
#define PG_FUNCTION_ARGS	FunctionCallInfo fcinfo
typedef struct FunctionCallInfoBaseData *FunctionCallInfo;
typedef struct FunctionCallInfoBaseData
{FmgrInfo   *flinfo;			/* ptr to lookup info used for this call */fmNodePtr	context;		/* pass info about context of call */fmNodePtr	resultinfo;		/* pass or return extra info about result */Oid			fncollation;	/* collation for function to use */
#define FIELDNO_FUNCTIONCALLINFODATA_ISNULL 4bool		isnull;			/* function must set true if result is NULL */short		nargs;			/* # arguments actually passed */
#define FIELDNO_FUNCTIONCALLINFODATA_ARGS 6NullableDatum args[FLEXIBLE_ARRAY_MEMBER];
} FunctionCallInfoBaseData;typedef Datum (*PGFunction) (FunctionCallInfo fcinfo);typedef struct FmgrInfo
{PGFunction	fn_addr;		/* pointer to function or handler to be called */Oid			fn_oid;			/* OID of function (NOT of handler, if any) */short		fn_nargs;		/* number of input args (0..FUNC_MAX_ARGS) */bool		fn_strict;		/* function is "strict" (NULL in => NULL out) */bool		fn_retset;		/* function returns a set */unsigned char fn_stats;		/* collect stats if track_functions > this */void	   *fn_extra;		/* extra space for use by handler */MemoryContext fn_mcxt;		/* memory context to store fn_extra in */fmNodePtr	fn_expr;		/* expression parse tree for call, or NULL */
} FmgrInfo;
  1. 验证是否添加成功,重新编译make && make install,初始化数据库initdbpsql连接数据库,select pg_helloworld()查看是否添加成功,结果如下,添加成功。
postgres=# select pg_helloworld();pg_helloworld   
-------------------Hello PostgreSQL!
(1 row)

源码分析

上面成功的添加了pg_helloworld函数后,我们深入思考一下,进行源码分析,看一下其中的细节。数据库处理函数大概的流程是用户发起了调用函数的SQL语句,PG要解析SQL语句,生成语法解析树,首先要识别出是调用系统函数,然后在pg_proc系统表中查询是否有该函数,这个过程是在语义分析阶段做的,最后生成计划树。我们一步一步进行源码分析。具体分析跟踪源码的时候可以用select pg_backend_pid()进行分析。

解析部分

这部分主要是在词法语法分析阶段,识别出是调用函数。关于SQL调用的前期过程以及词法分析过程可参考上一篇PostgreSQL中表名,列名的长度限制,里面有相关的源码分析。这里不再细述。这里只关心解析出函数部分。

解析部分调用主流程如下:

main(int argc, char *argv[])
--> PostmasterMain(argc, argv);--> ServerLoop();--> BackendStartup(port);--> BackendRun(port);--> PostgresMain(ac, av, port->database_name, port->user_name);--> for (;;)        // 在这里不断接收客户端的请求,处理--> exec_simple_query(const char *query_string)     --> pg_parse_query(query_string)

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

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

相关文章

如何零基础学办公软件?沈阳电脑办公软件培训

你说的办公软件是指常用办公软件吧,一般就是office三件套:Word、Excel、PowerPoint,建议直接上手开始完成几个稍微复杂一点的任务: word,建议排版一份毕业论文,找一个大学生的毕业论文,或者随便…

基于MYSQL的JAVA初级优化措施

世界是草台班子,这句话视乎很流行! 经历过几家创业公司的项目优化,以及大公司项目. 很多优化非常初级,用心点都能自己找出来! 其实主要原因当初是为了赶进度,能省则省.什么设计啊? 什么性能压测啊. 都省掉吧! 质量都要靠测试人员帮忙找出来,更何况是性能问题呢! 那怕是配齐了…

线上扭蛋机小程序开发,潮玩时代的创新发展

随着互联网的发展,扭蛋机市场也进行了创新发展,线上扭蛋机小程序为市场带来了新活力。扭蛋机小程序将传统的模式与互联网结合,打造一个便捷有趣的扭蛋机市场。 一、扭蛋机小程序 在扭蛋机小程序上,用户通过扭蛋机抽取各种系列的…

如何查看Linux系统中占用CPU资源高的进程

在Linux系统中,管理进程并监控其资源使用情况是一项重要的任务。当系统性能下降或响应变慢时,通常是由于某个或多个进程占用了过多的CPU资源。为了找出这些进程并采取相应的措施,我们可以使用多种命令行工具。以下是几种常用的方法&#xff0…

Ubuntu乌班图安装VIM文本编辑器工具

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu-24.04-live-server-amd64启用ssh Ubuntu安装qemu-guest-agent 文章目录 系列文章目录前言一、安装VIM?二、VIM基本设置总结 前言 从centos转到Ubuntu发现默认安装没有vi 一、安装VIM&#xff1…

SpringMVC系列十一: 文件上传与自定义拦截器

文章目录 SpringMVC文件上传基本介绍需求分析 / 图解应用实例-代码实现 自定义拦截器什么是拦截器自定义拦截器执行流程分析图自定义拦截器应用实例快速入门注意事项和细节Debug执行流程 多个拦截器多个拦截器执行流程示意图应用实例1代码实现注意事项和细节 应用实例2 作业布置…

Mongodb UPDATE, 使用$position指定向数组中插入新元素的位置

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第72篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

HTML 全局属性介绍及示例

HTML 全局属性是一组可以在任何HTML元素中使用的属性。这些属性提供了一种方式来定义元素的通用行为或外观。以下是一些常见的HTML全局属性及其示例。 id id 属性为元素提供了一个唯一的标识符。它不能在 <head>, <html>, <meta>, <script>, <sty…

vue2+echart 树状图节点密集,可滚动鼠标缩放, 尺寸根据节点调整

vue2echart 树状图节点密集&#xff0c;可滚动鼠标缩放&#xff0c; 尺寸根据节点调整 <template><div ref"chart" style"width: 100%; height: 600px;"></div> </template><script> import * as echarts from echarts;exp…

9.2.2 DeepLab系列模型中每一代的创新是什么?是为了解决什么问题?

9.2.2 DeepLab系列模型中每一代的创新是什么&#xff1f;是为了解决什么问题&#xff1f; 前情回顾&#xff1a;9.2.1 简述图像分割中经常用到的编码器-解码器网络结构的设计理念。 DeepLab是Google 团队提出的一系列图像分割算法。 DeepLab v1在2014年被提出&#xff0c;并在…

微信小程序接入lottie动画

1、注意&#xff1a;canvas渲染出来的层级太高&#xff0c;当有弹窗的情况会暴露在弹窗外 模拟器上会有这个问题&#xff0c;线上版本不会有 2、需求 需要把lottie动画在小程序的环境下进行展示 3、什么是lottie动画 由Airbnb开发并开源。允许设计师将复杂的矢量动画导出为…

李宏毅深度学习项目——HW1个人笔记

视频链接 PDF链接 googleColab链接 GoogleColab是一个免费的jupyter notebook&#xff0c;可以用上面的gpu资源进行训练 题目 通过前两天的数据&#xff0c;预测第三天某个人感染新冠的概率 范例 导包 # Numerical Operations import math import numpy as np# Reading/Wr…

欢迎莅临ARCHE-2024,共享智慧档案盛宴!

敬邀参观&#xff01;2024第三届上海国际智慧档案展览会&#xff08;ARCHE-2024&#xff09;将于2024年6月19-21日在上海跨国采购会展中心盛大开幕。深圳市铨顺宏科技有限公司将展示最新的智慧档案技术与解决方案&#xff0c;展位号H010-H011。期待您的光临&#xff0c;共同探索…

String类的默认实现

#pragma once #include <iostream> using namespace std; #include <assert.h>namespace yyqx//为了与库里面的string进行区分 {//仅仅实现一个简单的string&#xff0c;仅仅考虑资源管理深浅拷贝问题class string{public://构造函数string(const char* str):_size…

对比 Axios 和 Fetch:选择最适合的 HTTP 请求方法

在前端开发中&#xff0c;处理 HTTP 请求是一个常见且重要的任务。JavaScript 提供了多种方式来发送网络请求&#xff0c;其中最受欢迎的两种方式分别就是 Fetch API 和 Axios。尽管两者都能完成同样的任务&#xff0c;即从客户端向服务器发送请求并接收响应&#xff0c;但它们…

无线麦克风推荐哪些品牌?一文读懂家用无线麦克风哪个牌子好!

​在这个充满创意与表达的时代&#xff0c;无线领夹麦克风以其独特的魅力&#xff0c;成为了声音创作者们的得力助手。它小巧便携&#xff0c;功能强大&#xff0c;无论是日常拍摄、直播互动还是专业演出&#xff0c;都能轻松应对&#xff0c;让你的声音随时随地清晰传递。那么…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 04:对程序进行逐步跟踪

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

机器学习专题记录

有偏估计和无偏估计 无偏估计和有偏估计的区别 无偏估计 无偏估计是用样本统计量来估计总体参数时的一种无偏推断。估计量的数学期望等于被估计参数的真实值&#xff0c;则称此估计量为被估计参数的无偏估计&#xff0c;即具有无偏性&#xff0c;是一种用于评价估计量优良性的…

建筑工地通常那种考勤机好用?

建筑工地通常那种考勤机好用&#xff1f; 大量从乡村前往城市的务工者&#xff0c;所从事的多为建筑工程类行业&#xff0c;此种行业对学历与技能的要求不高&#xff0c;而工资水平倒也尚可&#xff0c;正因如此才吸引了众多劳动者。那要怎样管好工地上的项目呢&#xff1f;首要…

1999-2020年各地级市农村居民人均纯收入数据

1999-2020年各地级市农村居民人均纯收入数据 1、时间&#xff1a;1999-2020年 2、指标&#xff1a;年份、城市、农村居民人均纯收入 3、来源&#xff1a;区域年鉴、各省市年鉴 4、范围&#xff1a;地级市&#xff0c;具体每年城市数量参看下文图片&#xff0c;具体城市名单…