目录
一般接触到的普通的web段上层应用都是基于http的REST传递数据,数据库则使用安全可靠的tcp长连接进行数据交互,在拓展pg功能时候,有几个交互验证的方式:
- 内置sql函数(如字符串处理、数值计算、日期时间处理、类型转换函数);
- 命令行(checkpoint),
postgres=# SELECT trim(both ' ' FROM ' Hello World ');
btrim
-------------
Hello World
(1 row)
postgres=# checkpoint ;
CHECKPOINT
内置函数在广义上是全局共享/不区分权限的,本次增加1个pg_test_function()函数,入参是1个整型的变量,输出2倍数;
函数定义
服用 src/backend/utils/adt/ 目录下其他.c文件(如datum.c),增加 pg_test_function这个函数的定义,可以参考同类函数定义方式:
Datum
pg_test_function(PG_FUNCTION_ARGS)
{
int32 input = PG_GETARG_INT32(0);
int32 result;
result = input * 2;
PG_RETURN_INT32(result);
}
函数注册/声明
在 src/include/catalog/pg_proc.dat 文件中添加新函数的元数据此文件用于定义函数的元数据,如函数名、参数类型、返回类型等。
{ oid => '8888', descr => 'pg_test_function',
proname => 'pg_test_function',
prorettype => 'int4', proargtypes => 'int4',
prosrc => 'pg_test_function' },
在 src/include/catalog/pg_proc.dat 文件中添加新函数声明:
extern Datum pg_test_function(PG_FUNCTION_ARGS);
函数验证
修改代码后,重新执行编译:
cd /home/yzg/postgresql-14.5
make clean
CFLAGS=-O0 ./configure --prefix=/usr/local/pgsql --enable-debug
make
make install
cp -R /usr/local/pgsql /home/postgres/
chown -R postgres:postgres /home/postgres/pgsql
# 切换用户
su - postgres
cd ~/pgsql/bin
# 初始化postgresql并启动
./initdb -D ~/data
./pg_ctl start -D ~/data
直接执行函数:
postgres=# select pg_test_function(10);
pg_test_function
------------------
20
(1 row)
本例是个简单的内置函数增加方法与测试,在扩展/新增功能点时候内置函数可能是对用户暴露的调用方法,根据实际的业务需求应该还有对应的逻辑;