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的主要内容,如果未能解决你的问题,请参考以下文章

1336 - Sigma Functio

我写了一个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/