summaryrefslogtreecommitdiff
path: root/contrib/hstore
diff options
context:
space:
mode:
authorTom Lane2025-12-07 16:46:49 +0000
committerTom Lane2025-12-07 16:51:33 +0000
commit0986e95161cec929d8f39c01e9848f34526be421 (patch)
tree68142932ef76e1bf3ae95e58ac605920ecaf5c22 /contrib/hstore
parent3628af42107d588af73280d7e96d1c6188aadad7 (diff)
Revise APIs for pushJsonbValue() and associated routines.
Instead of passing "JsonbParseState **" to pushJsonbValue(), pass a pointer to a JsonbInState, which will contain the parseState stack pointer as well as other useful fields. Also, instead of returning a JsonbValue pointer that is often meaningless/ignored, return the top-level JsonbValue pointer in the "result" field of the JsonbInState. This involves a lot of (mostly mechanical) edits, but I think the results are notationally cleaner and easier to understand. Certainly the business with sometimes capturing the result of pushJsonbValue() and sometimes not was bug-prone and incapable of mechanical verification. In the new arrangement, JsonbInState.result remains null until we've completed a valid sequence of pushes, so that an incorrect sequence will result in a null-pointer dereference, not mistaken use of a partial result. However, this isn't simply an exercise in prettier notation. The real reason for doing it is to provide a mechanism whereby pushJsonbValue() can be told to construct the JsonbValue tree in a context that is not CurrentMemoryContext. That happens when a non-null "outcontext" is specified in the JsonbInState. No callers exercise that option in this patch, but the next patch in the series will make use of it. I tried to improve the comments in this area too. Author: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: jian he <jian.universality@gmail.com> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Discussion: https://postgr.es/m/1060917.1753202222@sss.pgh.pa.us
Diffstat (limited to 'contrib/hstore')
-rw-r--r--contrib/hstore/hstore_io.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c
index 6b01f27c5a4..34e3918811c 100644
--- a/contrib/hstore/hstore_io.c
+++ b/contrib/hstore/hstore_io.c
@@ -1439,10 +1439,9 @@ hstore_to_jsonb(PG_FUNCTION_ARGS)
int count = HS_COUNT(in);
char *base = STRPTR(in);
HEntry *entries = ARRPTR(in);
- JsonbParseState *state = NULL;
- JsonbValue *res;
+ JsonbInState state = {0};
- (void) pushJsonbValue(&state, WJB_BEGIN_OBJECT, NULL);
+ pushJsonbValue(&state, WJB_BEGIN_OBJECT, NULL);
for (i = 0; i < count; i++)
{
@@ -1453,7 +1452,7 @@ hstore_to_jsonb(PG_FUNCTION_ARGS)
key.val.string.len = HSTORE_KEYLEN(entries, i);
key.val.string.val = HSTORE_KEY(entries, base, i);
- (void) pushJsonbValue(&state, WJB_KEY, &key);
+ pushJsonbValue(&state, WJB_KEY, &key);
if (HSTORE_VALISNULL(entries, i))
{
@@ -1465,12 +1464,12 @@ hstore_to_jsonb(PG_FUNCTION_ARGS)
val.val.string.len = HSTORE_VALLEN(entries, i);
val.val.string.val = HSTORE_VAL(entries, base, i);
}
- (void) pushJsonbValue(&state, WJB_VALUE, &val);
+ pushJsonbValue(&state, WJB_VALUE, &val);
}
- res = pushJsonbValue(&state, WJB_END_OBJECT, NULL);
+ pushJsonbValue(&state, WJB_END_OBJECT, NULL);
- PG_RETURN_POINTER(JsonbValueToJsonb(res));
+ PG_RETURN_POINTER(JsonbValueToJsonb(state.result));
}
PG_FUNCTION_INFO_V1(hstore_to_jsonb_loose);
@@ -1482,13 +1481,12 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
int count = HS_COUNT(in);
char *base = STRPTR(in);
HEntry *entries = ARRPTR(in);
- JsonbParseState *state = NULL;
- JsonbValue *res;
+ JsonbInState state = {0};
StringInfoData tmp;
initStringInfo(&tmp);
- (void) pushJsonbValue(&state, WJB_BEGIN_OBJECT, NULL);
+ pushJsonbValue(&state, WJB_BEGIN_OBJECT, NULL);
for (i = 0; i < count; i++)
{
@@ -1499,7 +1497,7 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
key.val.string.len = HSTORE_KEYLEN(entries, i);
key.val.string.val = HSTORE_KEY(entries, base, i);
- (void) pushJsonbValue(&state, WJB_KEY, &key);
+ pushJsonbValue(&state, WJB_KEY, &key);
if (HSTORE_VALISNULL(entries, i))
{
@@ -1541,10 +1539,10 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
val.val.string.val = HSTORE_VAL(entries, base, i);
}
}
- (void) pushJsonbValue(&state, WJB_VALUE, &val);
+ pushJsonbValue(&state, WJB_VALUE, &val);
}
- res = pushJsonbValue(&state, WJB_END_OBJECT, NULL);
+ pushJsonbValue(&state, WJB_END_OBJECT, NULL);
- PG_RETURN_POINTER(JsonbValueToJsonb(res));
+ PG_RETURN_POINTER(JsonbValueToJsonb(state.result));
}