37.10. C-Language Functions
Posted 丹心明月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37.10. C-Language Functions相关的知识,希望对你有一定的参考价值。
37.10 C语言函数
用户自定义函数可使用C语言(或与其兼容的语言,例如C++)编写。
37.10.1 动态加载
使用CREATE FUNCTION命令创建的用户自定义C函数需要指定两个部分的信息:加载的对象文件名以及在对象文件中的函数的C名称。
37.10.2 C语言函数中的基本类型
在内部,PostgreSQL将基本类型看做“内存中的blob”。
基本类型可使用以下三种内部格式的一种:
-
传递值,固定长度;
-
传递引用,固定长度;
-
传递引用,变长;
C数据类型与内置SQL数据类型的对应:
37.10.3 版本1调用约定
version-1调用约定依赖于宏来限制传递参数或结果的复杂度。version-1的C声明:
Datum funcname(PG_FUNCTION_ARGS)
宏调用必须出现在相同源文件中:
PG_FUNCTION_INFO_V1(funcname);
37.10.4 代码编写
编写C函数的基本规则:
-
使用pg_config --includedir-server以查看PostgreSQL服务头文件安装路径;
-
编译,链接;
-
定义“magic block”;
-
使用PostgreSQL的palloc和pfree分配内存;
-
使用memset将结构清零;
-
需要包含postgres.h和fmgr.h文件;
-
符号名称需唯一,不可冲突;
37.10.5 编译和链接动态加载函数
在使用自定义的C扩展函数前,需要首先编译(cc)和链接(ld)。需要创建共享库。
37.10.6 复合类型参数
PostgreSQL提供函数接口以访问C的复合数据库类型。
37.10.7 返回行(复合类型)
为从C函数返回行或复合类型,可通过将funcapi.h文件包含在内以使用提供宏和函数的API。
37.10.8 返回集合
C原因函数有两种方式返回集合(即多行)。调用ValuePerCall模块或调用Materialize模块。
37.10.9 多态参数及返回类型
当函数的参数或返回类型定义为多态类型时,无法提前预知调用或返回时的数据类型。fmgr.h中提供了get_fn_expr_rettype(FmgrInfo *flinfo)和get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)来确认数据类型。
37.10.10 共享内存和轻量级锁(lightweight lock)
加载项可以在数据库服务启动时保留轻量锁和分配共享内存。加载项必须指定在shared_preload_libraries指定。共享内存通过从_PG_init调用以下函数保留:
void RequestAddinShmemSpace(int size)
轻量锁通过调用_PG_init中的以下函数保留:
void RequestNamedLWLockTranche(const char *tranche_name, int num_lwlocks)
以上是关于37.10. C-Language Functions的主要内容,如果未能解决你的问题,请参考以下文章
我写了一个SQL自定义函数,执行不成功,急!! 具体如下: GO CREATE FUNCTIO
text 保存自https://wpshout.com/learning-php-for-wordpress-development-introduction-to-php-functions/
text 保存自https://wpshout.com/learning-php-for-wordpress-development-introduction-to-php-functions/
text 保存自https://wpshout.com/learning-php-for-wordpress-development-introduction-to-php-functions/
text 保存自https://wpshout.com/learning-php-for-wordpress-development-introduction-to-php-functions/