linux setuid函数_[输出]PostgreSQL增加一个函数步骤和验证流程

DB增加一个函数的步骤和验证流程

高斯实验室

作者:陈黎栋

在源码里新增函数我只想

源码包括内核和OM、redis等组件。

在对应头文件添加外部访问支持

extern Datum pgxc_stat_total_tuples();

注册函数到名字空间src/include/catalog/pg_proc.h中

注册语句

DATA(insert OID = 与已经注册的OID不同的新OID (新函数名 PGNSP PGUID 12 t f f f t f v 2 17 17 i f i f f "23 23" _null_ _null_ _null_ _null_ _null_ _null_ sys_read_page 2D _null_ ));

DESCR("函数作用的注释");

比如redis模块的gs_switch_relname函数:

114adc97b697dc38d5fdb8a0fabffc86.png

语句中的其他参数讲解

未被使用的OID

postgres内部预留了1W多个oid

在linux环境下运行srcincludecatalog脚本文件unused_oids,显示未被使用的OID

PGNSP PGUID 12 为内置函数的固定书写:

PGNSP–函数所属的名字空间的OID,PGNSP即pg_catalog(oid=11),内置函数添加此值固定

PGUID–函数的拥有者OID,PGUID及initdb时指定用户(oid=10),内置函数添加此值固定

12–实现语言或该函数的调用接口,内置函数使用12(internal),SQL用14

t 和 f 表示是否:

第一处t–表示函数是一个聚集函数
第二处f–函数否为一个窗口函数
f–函数是一个安全性定义者(即,一个”setuid”函数)
f–该函数没有副作用。除了通过返回值,没有关于参数的信息被传播。任何会抛出基于其参数值的错误信息的函数都不是泄露验证的。
t–当任意调用函数为空时,函数是否会返回空值。在那种情况下函数实际上根本不会被调用。非”strict”函数必须准备好处理空值输入。
f–函数是否返回一个集合(即,指定数据类型的多个值)
v–未知

t f f f t f v后面的2 17 17 的含义:

2–输入参数的个数, 对应后面的”23 23”两个参数

第一个17–具有默认值的参数个数

第二个17表示返回值的数据类型:

TEST=# select oid,typname from pg_type where oid in (1082,23,1114,1184,17,25);

OID | TYPNAME

------+-------------

17 | BYTEA

23 | INT4

25 | TEXT

1082 | DATE

1114 | TIMESTAMP

1184 | TIMESTAMPTZ

”23 23”表示函数参数的数据类型数组:

TEST=# select oid,typname from pg_type where oid in (1082,23,1114,1184,17,25);

OID | TYPNAME

------+-------------

17 | BYTEA

23 | INT4

25 | TEXT

1082 | DATE

1114 | TIMESTAMP

1184 | TIMESTAMPTZ

五个NULL的含义:

null–函数参数的数据类型的数组,这包括所有参数(含OUT和INOUT参数)。但是,如果所有参数都是IN参数,这个域将为空。注意下标是从1开始 ,然而由于历史原因proargtypes的下标是从0开始

null–函数参数的模式的数组。编码为: i表示IN参数 , o表示OUT参数, b表示INOUT参数, v表示VARIADIC参数, t表示TABLE参数。 如果所有的参数都是IN参数,这个域为空。注意这里的下标对应着proallargtypes而不是proargtypes中的位置

null–函数参数的名字的数组。没有名字的参数在数组中设置为空字符串。如果没有一个参数有名字,这个域为空。注意这里的下标对应着proallargtypes而不是proargtypes中的位置

null–默认值的表达式树(按照nodeToString()的表现方式)。这是一个pronargdefaults元素的列表,对应于最后N个input参数(即最后N个proargtypes位置)。如果没有一个参数具有默认值,这个域为空

null–数据类型OID为了应用转换

编译运行验证函数可用

编译启动步骤略

验证一、postgres-# df+ 函数名 -> 验证函数定义

功能列表

Schema | Name | Result data type | Argument data types | Owner | Language | Source code | Description

-------------+---------------+------------------+----------------------+--------+----------+---------------+-------------

SYS_CATALOG |新函数名 | BYTEA | TEXT, BIGINT, BIGINT | SYSTEM | INTERNAL | sys_test |

Result data type | Argument data types 检查左边这些字段是否符合预期逻辑

验证二、调用函数验证

postgres=# select SYS_TEST(1,2);

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值