Для данных PostgreSQL использует собственный внутренний формат и структуры, которые не должны быть совместимы с языком Си.Для строк используется формат varlena
- в этом формате сначала N байтов кодируются длиной - и после этих байтов кодируются данные.Прямой доступ не рекомендуется - почти для всех работ есть макросы.
Например, небольшая функция hello
может выглядеть так:
Datum
Hello(PG_FUNCTION_ARGS)
{
text *txt = PG_GETARG_TEXT_PP(0);
text *result;
char *str;
char *hello = "Hello, ";
int size;
int hello_size;
-- conversion to c string
str = text_to_cstring(txt);
-- show it on debug console
elog(NOTICE, "input string: %s", str);
hello_size = strlen(hello);
size = hello_size + VARSIZE_ANY_EXHDR(txt) + VARHDRSZ;
-- allocate memory for result, use palloc, not malloc!
result = palloc(size);
--set size of result varlena type
SET_VARSIZE(result, size);
-- set data
memcpy(VARDATA(result), str, hello_size);
memcpy(VARDATA(result) + hello_size,
VARDATA_ANY(txt), VARSIZE_ANY_EXHDR(txt));
-- returns data
PG_RETURN_TEXT_P(result);
}
Как видите, этоC и это не C. Существует много макросов, которые можно использовать a) для целей переносимости, b) для сокрытия сложности.Хорошо бы начать читать документацию или какую-либо презентацию.
Эта тема не является слишком сложной или слишком сложной, но она не интуитивна - вы не можете начать без чтения документации.