到目前为止,我知道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字节