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

时间:2018-11-29 16:50:20

标签: c postgresql

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

2 个答案:

答案 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函数时,参数的数据类型将始终与该函数中声明的一样。