到目前为止,我知道Datum
是PostgreSQL中C语言函数中使用的数据类型之一,它可以表示有效SQL类型中的任何值。我没有得到的是,如果它可以保存任何类型的值,那么调用函数如何知道被调用函数返回的值的数据类型? Datum内部是否包含此类附加信息的结构?请解释。
答案 0 :(得分:2)
在PostgreSQL邮件列表中,引用rsmogura:
[...]简单 单词,基准就像
Release-iphoneos/
,带有附加的大小标题。
和Tom Lane:
它是任何SQL的单个值的后端内部表示形式 数据类型。使用
Release-iphoneos/
的代码必须知道它是哪种类型, 因为void *
本身不包含该信息。通常, C代码将使用“本地”表示形式的值,然后 与Datum
之间进行转换,以使值通过 数据类型无关的接口。
Datum
被定义为typedef uintptr_t Datum
,因此在PostgreSQL支持的平台上它是4或8个字节
答案 1 :(得分:1)
Datum
是通用类型,用于保存可以存储在PostgreSQL表中的er数据的内部表示。它在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函数时,参数的数据类型将始终与该函数中声明的一样。