Как я могу вернуть простой объект jsonb в функции PostgreSQL, написанной на C?
Я недостаточно знаю о postgres программировании на стороне сервера. И ниже моя попытка вернуть простой объект json / jsonb на основе исходного кода C для hstore_to_jsonb_loose
, который является наиболее близким примером, который я могу найти. Я пытаюсь вернуть {"hi": -101}
из функции C, но получил ошибку:
=> ОШИБКА: неожиданный тип jsonb в качестве ключа объекта
Может кто-нибудь помогите объяснить, как получить это право?
Мой C код:
PG_FUNCTION_INFO_V1(test_return_jsonb);
Datum
test_return_jsonb( PG_FUNCTION_ARGS) {
JsonbParseState *state = NULL;
JsonbValue *res;
StringInfoData tmp;
initStringInfo(&tmp);
(void) pushJsonbValue(&state, WJB_BEGIN_OBJECT, NULL);
JsonbValue key, val;
//key
key.type = jbvString;
key.val.string.len = 2;
key.val.string.val = "hi";
Datum numd;
//value
val.type = jbvNumeric;
numd = DirectFunctionCall3(numeric_in, CStringGetDatum("-101"), //!tmp.data),
ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1));
val.val.numeric = DatumGetNumeric(numd);
(void) pushJsonbValue(&state, WJB_VALUE, &val);
res = pushJsonbValue(&state, WJB_END_OBJECT, NULL);
PG_RETURN_POINTER(JsonbValueToJsonb(res));
}
А код интерфейса SQL:
CREATE OR REPLACE FUNCTION test_return_jsonb()
RETURNS jsonb
AS '$libdir/pgtest', 'test_return_jsonb'
LANGUAGE 'c' IMMUTABLE STRICT COST 100; -- Guessed cost
Это с PostgreSQL 12 и Ubuntu 18.04 LTS.