PostgreSQL C 语言函数中的基准到底是什么?



到目前为止,我知道Datum是PostgreSQL中C语言函数中使用的数据类型之一,它可以表示有效SQL类型的任何值。我没有得到的是,如果它可以保存任何类型的值,那么调用函数如何知道被调用函数返回的值的数据类型?基准面内部是否是包含此类附加信息的结构?请解释一下。

Datum是保存可以存储在PostgreSQL表中的基准面的内部表示的泛型类型。它在postgres.h中定义,注释很有启发性:

/*
* A Datum contains either a value of a pass-by-value type or a pointer to a
* value of a pass-by-reference type.  Therefore, we require:
*
* sizeof(Datum) == sizeof(void *) == 4 or 8
*
* The macros below and the analogous macros for other types should be used to
* convert between a Datum and the appropriate C type.
*/

您可以使用DatumGet*宏将其强制转换为特定数据类型之一。

Datum不包含有关数据类型的任何信息,但此知识必须来自其他地方。

编写 C 函数时,参数的数据类型将始终与函数中声明的数据类型相同。

来自PostgreSQL邮件列表,引用rsmogura:

[...]简单 词,基准面就像带有附加尺寸标题的void *

和汤姆·莱恩:

它是任何SQL的单个值的后端内部表示形式 数据类型。 使用Datum的代码必须知道它是哪种类型, 因为Datum本身不包含该信息。 通常 C 代码将使用"本机"表示中的值,然后 转换为Datum或从转换,以便传递值 与数据类型无关的接口。

Datum被定义为typedef uintptr_t Datum,因此在PostgreSQL支持的平台上它是4或8字节

最新更新