diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index ddc34ce..252fe3d 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -1802,3 +1802,71 @@ uniqueifyJsonbObject(JsonbValue *object) object->val.object.nPairs = res + 1 - object->val.object.pairs; } } + +/********** Utility functions to use internally to form jsonb record **************/ + +/* + * push_jsonb_string_key + * + * Function to push string key into jsonb object + */ +void +push_jsonb_string_key(JsonbParseState **pstate, char *string_key) +{ + JsonbValue jb; + + jb.type = jbvString; + jb.val.string.len = strlen(string_key); + jb.val.string.val = pstrdup(string_key); + pushJsonbValue(pstate, WJB_KEY, &jb); +} + +/* + * push_jsonb_string_key + * + * Function to push bool value into jsonb object + */ +void +push_jsonb_bool_value(JsonbParseState **pstate, bool bool_val) +{ + JsonbValue jb; + + jb.type = jbvBool; + jb.val.boolean = bool_val; + + pushJsonbValue(pstate, WJB_VALUE, &jb); +} + +/* + * push_jsonb_string_key + * + * Function to push int32 value into jsonb object + */ +void +push_jsonb_int32_value(JsonbParseState **pstate, int32 int32_val) +{ + JsonbValue jb; + char outputstr[64]; + + snprintf(outputstr, 64, "%d", int32_val); + jb.type = jbvNumeric; + jb.val.numeric = DatumGetNumeric(DirectFunctionCall3(numeric_in, CStringGetDatum(outputstr), 0, -1)); + + pushJsonbValue(pstate, WJB_VALUE, &jb); +} + +/* + * push_jsonb_string_key + * + * Function to push string value into jsonb object + */ +void +push_jsonb_string_value(JsonbParseState **pstate, char *string_value) +{ + JsonbValue jb; + + jb.type = jbvString; + jb.val.string.len = strlen(string_value); + jb.val.string.val = pstrdup(string_value); + pushJsonbValue(pstate, WJB_VALUE, &jb); +} diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h index fa52afc..5d51211 100644 --- a/src/include/utils/jsonb.h +++ b/src/include/utils/jsonb.h @@ -430,6 +430,12 @@ extern bool JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained); extern void JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash); +/* jsonb_util.c support functions */ +void push_jsonb_string_key(JsonbParseState **pstate, char *string_key); +void push_jsonb_bool_value(JsonbParseState **pstate, bool bool_val); +void push_jsonb_int32_value(JsonbParseState **pstate, int32 int32_val); +void push_jsonb_string_value(JsonbParseState **pstate, char *string_value); + /* jsonb.c support functions */ extern char *JsonbToCString(StringInfo out, JsonbContainer *in, int estimated_len);