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;
}
数据类型 text
或 varchar
是 而不是 存储为以零结尾的字符数组。它是一个 varlena
,其长度(和其他内容)存储在开头。
数据类型cstring
用于C字符串,是PostgreSQL的内部数据类型。您永远不能在 SQL.
中使用它
每当你需要传递一个 C 字符串的 Datum
并使用 CStringGetTextDatum
将 C 字符串转换为 text
或 [=11] 时,请使用 CStringGetDatum
=] 您需要作为 Datum
.
传递
在上一个关于使用 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;
}
数据类型 text
或 varchar
是 而不是 存储为以零结尾的字符数组。它是一个 varlena
,其长度(和其他内容)存储在开头。
数据类型cstring
用于C字符串,是PostgreSQL的内部数据类型。您永远不能在 SQL.
每当你需要传递一个 C 字符串的 Datum
并使用 CStringGetTextDatum
将 C 字符串转换为 text
或 [=11] 时,请使用 CStringGetDatum
=] 您需要作为 Datum
.