Postgresql 中的 CStringGetTextDatum() 和 CStringGetDatum() 有什么区别?

What is the difference between CStringGetTextDatum() and CStringGetDatum() in Postgresql?

在上一个关于使用 CString 在 SQL 扩展中创建 table 数据的问题中,使用 CStringGetDatum() 生成的数据用于 table 列是一个问题变量。解决方案是使用 CStringGetTextDatum()。现在我很好奇为什么。

这里是函数定义,但我不确定,如果不能将第一个与 CString 一起使用,在哪种情况下应该在第二种情况下使用 CStringGetDatum():

 #define CStringGetDatum(X) PointerGetDatum(X)
 #define CStringGetTextDatum(s) PointerGetDatum(cstring_to_text(s))

 #define PointerGetDatum(X) ((Datum) (X))

 text *
 cstring_to_text(const char *s)
 {
     return cstring_to_text_with_len(s, strlen(s));
 }
 
 text *
 cstring_to_text_with_len(const char *s, int len)
 {
     text       *result = (text *) palloc(len + VARHDRSZ);
 
     SET_VARSIZE(result, len + VARHDRSZ);
     memcpy(VARDATA(result), s, len);
 
     return result;
 }

数据类型 textvarchar 而不是 存储为以零结尾的字符数组。它是一个 varlena,其长度(和其他内容)存储在开头。

数据类型cstring用于C字符串,是PostgreSQL的内部数据类型。您永远不能在 SQL.

中使用它

每当你需要传递一个 C 字符串的 Datum 并使用 CStringGetTextDatum 将 C 字符串转换为 text 或 [=11] 时,请使用 CStringGetDatum =] 您需要作为 Datum.

传递