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

Jes*_*man 6 c postgresql

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

Ant*_*ala 5

来自 PostgreSQL 邮件列表,引用rsmogura

[...]简单来说,数据就像void *带有附加尺寸标题。

汤姆·莱恩

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

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


Lau*_*lbe 5

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.
 */
Run Code Online (Sandbox Code Playgroud)

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

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

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