Как вернуть объект jsonb из функции расширения PostgreSQL c? - PullRequest
1 голос
/ 18 января 2020

Как я могу вернуть простой объект 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...