From 7cc09a452ce4407fad83e0fcc9723d43121d4db1 Mon Sep 17 00:00:00 2001 From: coreyhuinker Date: Mon, 30 Oct 2023 16:21:30 -0400 Subject: [PATCH v3 1/9] Additional internal jsonb access functions. Make JsonbContainerTypeName externally visible. Add JsonbStringValueToCString. --- src/include/utils/jsonb.h | 4 ++++ src/backend/utils/adt/jsonb.c | 2 +- src/backend/utils/adt/jsonb_util.c | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h index addc9b608e..b3c1e104f2 100644 --- a/src/include/utils/jsonb.h +++ b/src/include/utils/jsonb.h @@ -424,6 +424,8 @@ extern char *JsonbToCStringIndent(StringInfo out, JsonbContainer *in, int estimated_len); extern bool JsonbExtractScalar(JsonbContainer *jbc, JsonbValue *res); extern const char *JsonbTypeName(JsonbValue *val); +extern const char *JsonbContainerTypeName(JsonbContainer *jbc); + extern Datum jsonb_set_element(Jsonb *jb, Datum *path, int path_len, JsonbValue *newval); @@ -436,4 +438,6 @@ extern Datum jsonb_build_object_worker(int nargs, const Datum *args, const bool extern Datum jsonb_build_array_worker(int nargs, const Datum *args, const bool *nulls, const Oid *types, bool absent_on_null); +extern char *JsonbStringValueToCString(JsonbValue *j); + #endif /* __JSONB_H__ */ diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index 6f445f5c2b..0ad4e81d89 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -160,7 +160,7 @@ jsonb_from_text(text *js, bool unique_keys) /* * Get the type name of a jsonb container. */ -static const char * +const char * JsonbContainerTypeName(JsonbContainer *jbc) { JsonbValue scalar; diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 9cc95b773d..ae311b38ba 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -1992,3 +1992,18 @@ uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls) } } } + +/* + * Extract a JsonbValue as a cstring. + */ +char *JsonbStringValueToCString(JsonbValue *j) +{ + char *s; + + Assert(j->type == jbvString); + /* make a string that we are sure is null-terminated */ + s = palloc(j->val.string.len + 1); + memcpy(s, j->val.string.val, j->val.string.len); + s[j->val.string.len] = '\0'; + return s; +} -- 2.43.0