From d15e0fd28601ff163e356a5cb7ae946f8d50d4ad Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 22 Sep 2025 14:47:49 +0200 Subject: [PATCH 23/23] C11 anonymous unions [json] --- contrib/hstore/hstore_io.c | 22 +- contrib/jsonb_plperl/jsonb_plperl.c | 28 +- contrib/jsonb_plpython/jsonb_plpython.c | 22 +- src/backend/executor/execExprInterp.c | 24 +- src/backend/utils/adt/jsonb.c | 157 ++++++------ src/backend/utils/adt/jsonb_gin.c | 38 +-- src/backend/utils/adt/jsonb_op.c | 12 +- src/backend/utils/adt/jsonb_util.c | 240 ++++++++--------- src/backend/utils/adt/jsonbsubs.c | 6 +- src/backend/utils/adt/jsonfuncs.c | 328 ++++++++++++------------ src/backend/utils/adt/jsonpath.c | 170 ++++++------ src/backend/utils/adt/jsonpath_exec.c | 248 +++++++++--------- src/backend/utils/adt/jsonpath_gram.y | 56 ++-- src/include/utils/jsonb.h | 2 +- src/include/utils/jsonpath.h | 4 +- 15 files changed, 678 insertions(+), 679 deletions(-) diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c index 9c53877c4a5..3673f2bb6dd 100644 --- a/contrib/hstore/hstore_io.c +++ b/contrib/hstore/hstore_io.c @@ -1450,8 +1450,8 @@ hstore_to_jsonb(PG_FUNCTION_ARGS) val; key.type = jbvString; - key.val.string.len = HSTORE_KEYLEN(entries, i); - key.val.string.val = HSTORE_KEY(entries, base, i); + key.string.len = HSTORE_KEYLEN(entries, i); + key.string.val = HSTORE_KEY(entries, base, i); (void) pushJsonbValue(&state, WJB_KEY, &key); @@ -1462,8 +1462,8 @@ hstore_to_jsonb(PG_FUNCTION_ARGS) else { val.type = jbvString; - val.val.string.len = HSTORE_VALLEN(entries, i); - val.val.string.val = HSTORE_VAL(entries, base, i); + val.string.len = HSTORE_VALLEN(entries, i); + val.string.val = HSTORE_VAL(entries, base, i); } (void) pushJsonbValue(&state, WJB_VALUE, &val); } @@ -1496,8 +1496,8 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS) val; key.type = jbvString; - key.val.string.len = HSTORE_KEYLEN(entries, i); - key.val.string.val = HSTORE_KEY(entries, base, i); + key.string.len = HSTORE_KEYLEN(entries, i); + key.string.val = HSTORE_KEY(entries, base, i); (void) pushJsonbValue(&state, WJB_KEY, &key); @@ -1510,13 +1510,13 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS) *(HSTORE_VAL(entries, base, i)) == 't') { val.type = jbvBool; - val.val.boolean = true; + val.boolean = true; } else if (HSTORE_VALLEN(entries, i) == 1 && *(HSTORE_VAL(entries, base, i)) == 'f') { val.type = jbvBool; - val.val.boolean = false; + val.boolean = false; } else { @@ -1532,13 +1532,13 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS) CStringGetDatum(tmp.data), ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1)); - val.val.numeric = DatumGetNumeric(numd); + val.numeric = DatumGetNumeric(numd); } else { val.type = jbvString; - val.val.string.len = HSTORE_VALLEN(entries, i); - val.val.string.val = HSTORE_VAL(entries, base, i); + val.string.len = HSTORE_VALLEN(entries, i); + val.string.val = HSTORE_VAL(entries, base, i); } } (void) pushJsonbValue(&state, WJB_VALUE, &val); diff --git a/contrib/jsonb_plperl/jsonb_plperl.c b/contrib/jsonb_plperl/jsonb_plperl.c index c02e2d41af1..2b5e16c22f6 100644 --- a/contrib/jsonb_plperl/jsonb_plperl.c +++ b/contrib/jsonb_plperl/jsonb_plperl.c @@ -24,12 +24,12 @@ JsonbValue_to_SV(JsonbValue *jbv) switch (jbv->type) { case jbvBinary: - return Jsonb_to_SV(jbv->val.binary.data); + return Jsonb_to_SV(jbv->binary.data); case jbvNumeric: { char *str = DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(jbv->val.numeric))); + NumericGetDatum(jbv->numeric))); SV *result = newSVnv(SvNV(cstr2sv(str))); pfree(str); @@ -38,8 +38,8 @@ JsonbValue_to_SV(JsonbValue *jbv) case jbvString: { - char *str = pnstrdup(jbv->val.string.val, - jbv->val.string.len); + char *str = pnstrdup(jbv->string.val, + jbv->string.len); SV *result = cstr2sv(str); pfree(str); @@ -47,7 +47,7 @@ JsonbValue_to_SV(JsonbValue *jbv) } case jbvBool: - return newSVnv(SvNV(jbv->val.boolean ? &PL_sv_yes : &PL_sv_no)); + return newSVnv(SvNV(jbv->boolean ? &PL_sv_yes : &PL_sv_no)); case jbvNull: return newSV(0); @@ -72,7 +72,7 @@ Jsonb_to_SV(JsonbContainer *jsonb) switch (r) { case WJB_BEGIN_ARRAY: - if (v.val.array.rawScalar) + if (v.array.rawScalar) { JsonbValue tmp; @@ -112,7 +112,7 @@ Jsonb_to_SV(JsonbContainer *jsonb) SV *value = JsonbValue_to_SV(&val); (void) hv_store(hv, - v.val.string.val, v.val.string.len, + v.string.val, v.string.len, value, 0); } } @@ -164,8 +164,8 @@ HV_to_JsonbValue(HV *obj, JsonbParseState **jsonb_state) while ((val = hv_iternextsv(obj, &kstr, &klen))) { - key.val.string.val = pnstrdup(kstr, klen); - key.val.string.len = klen; + key.string.val = pnstrdup(kstr, klen); + key.string.len = klen; pushJsonbValue(jsonb_state, WJB_KEY, &key); (void) SV_to_JsonbValue(val, jsonb_state, false); } @@ -207,7 +207,7 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem) const char *strval = SvPV_nolen(in); out.type = jbvNumeric; - out.val.numeric = + out.numeric = DatumGetNumeric(DirectFunctionCall3(numeric_in, CStringGetDatum(strval), ObjectIdGetDatum(InvalidOid), @@ -218,7 +218,7 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem) IV ival = SvIV(in); out.type = jbvNumeric; - out.val.numeric = int64_to_numeric(ival); + out.numeric = int64_to_numeric(ival); } else if (SvNOK(in)) { @@ -240,15 +240,15 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem) errmsg("cannot convert NaN to jsonb"))); out.type = jbvNumeric; - out.val.numeric = + out.numeric = DatumGetNumeric(DirectFunctionCall1(float8_numeric, Float8GetDatum(nval))); } else if (SvPOK(in)) { out.type = jbvString; - out.val.string.val = sv2cstr(in); - out.val.string.len = strlen(out.val.string.val); + out.string.val = sv2cstr(in); + out.string.len = strlen(out.string.val); } else { diff --git a/contrib/jsonb_plpython/jsonb_plpython.c b/contrib/jsonb_plpython/jsonb_plpython.c index 9383615abbf..10a3be28fcb 100644 --- a/contrib/jsonb_plpython/jsonb_plpython.c +++ b/contrib/jsonb_plpython/jsonb_plpython.c @@ -70,7 +70,7 @@ PLyUnicode_FromJsonbValue(JsonbValue *jbv) { Assert(jbv->type == jbvString); - return PLyUnicode_FromStringAndSize(jbv->val.string.val, jbv->val.string.len); + return PLyUnicode_FromStringAndSize(jbv->string.val, jbv->string.len); } /* @@ -82,8 +82,8 @@ static void PLyUnicode_ToJsonbValue(PyObject *obj, JsonbValue *jbvElem) { jbvElem->type = jbvString; - jbvElem->val.string.val = PLyObject_AsString(obj); - jbvElem->val.string.len = strlen(jbvElem->val.string.val); + jbvElem->string.val = PLyObject_AsString(obj); + jbvElem->string.len = strlen(jbvElem->string.val); } /* @@ -100,14 +100,14 @@ PLyObject_FromJsonbValue(JsonbValue *jsonbValue) Py_RETURN_NONE; case jbvBinary: - return PLyObject_FromJsonbContainer(jsonbValue->val.binary.data); + return PLyObject_FromJsonbContainer(jsonbValue->binary.data); case jbvNumeric: { Datum num; char *str; - num = NumericGetDatum(jsonbValue->val.numeric); + num = NumericGetDatum(jsonbValue->numeric); str = DatumGetCString(DirectFunctionCall1(numeric_out, num)); return PyObject_CallFunction(decimal_constructor, "s", str); @@ -117,7 +117,7 @@ PLyObject_FromJsonbValue(JsonbValue *jsonbValue) return PLyUnicode_FromJsonbValue(jsonbValue); case jbvBool: - if (jsonbValue->val.boolean) + if (jsonbValue->boolean) Py_RETURN_TRUE; else Py_RETURN_FALSE; @@ -147,7 +147,7 @@ PLyObject_FromJsonbContainer(JsonbContainer *jsonb) switch (r) { case WJB_BEGIN_ARRAY: - if (v.val.array.rawScalar) + if (v.array.rawScalar) { JsonbValue tmp; @@ -288,8 +288,8 @@ PLyMapping_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state) if (key == Py_None) { jbvKey.type = jbvString; - jbvKey.val.string.len = 0; - jbvKey.val.string.val = ""; + jbvKey.string.len = 0; + jbvKey.string.val = ""; } else { @@ -396,7 +396,7 @@ PLyNumber_ToJsonbValue(PyObject *obj, JsonbValue *jbvNum) errmsg("cannot convert infinity to jsonb"))); jbvNum->type = jbvNumeric; - jbvNum->val.numeric = num; + jbvNum->numeric = num; return jbvNum; } @@ -433,7 +433,7 @@ PLyObject_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state, bool is_ele else if (PyBool_Check(obj)) { out->type = jbvBool; - out->val.boolean = (obj == Py_True); + out->boolean = (obj == Py_True); } else if (PyNumber_Check(obj)) out = PLyNumber_ToJsonbValue(obj, out); diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 51f498bd79a..5958324000c 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -5047,42 +5047,42 @@ ExecGetJsonValueItemString(JsonbValue *item, bool *resnull) case jbvString: { - char *str = palloc(item->val.string.len + 1); + char *str = palloc(item->string.len + 1); - memcpy(str, item->val.string.val, item->val.string.len); - str[item->val.string.len] = '\0'; + memcpy(str, item->string.val, item->string.len); + str[item->string.len] = '\0'; return str; } case jbvNumeric: return DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(item->val.numeric))); + NumericGetDatum(item->numeric))); case jbvBool: return DatumGetCString(DirectFunctionCall1(boolout, - BoolGetDatum(item->val.boolean))); + BoolGetDatum(item->boolean))); case jbvDatetime: - switch (item->val.datetime.typid) + switch (item->datetime.typid) { case DATEOID: return DatumGetCString(DirectFunctionCall1(date_out, - item->val.datetime.value)); + item->datetime.value)); case TIMEOID: return DatumGetCString(DirectFunctionCall1(time_out, - item->val.datetime.value)); + item->datetime.value)); case TIMETZOID: return DatumGetCString(DirectFunctionCall1(timetz_out, - item->val.datetime.value)); + item->datetime.value)); case TIMESTAMPOID: return DatumGetCString(DirectFunctionCall1(timestamp_out, - item->val.datetime.value)); + item->datetime.value)); case TIMESTAMPTZOID: return DatumGetCString(DirectFunctionCall1(timestamptz_out, - item->val.datetime.value)); + item->datetime.value)); default: elog(ERROR, "unexpected jsonb datetime type oid %u", - item->val.datetime.typid); + item->datetime.typid); } break; diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index da94d424d61..ae9562cefc9 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -182,7 +182,7 @@ JsonbTypeName(JsonbValue *val) switch (val->type) { case jbvBinary: - return JsonbContainerTypeName(val->val.binary.data); + return JsonbContainerTypeName(val->binary.data); case jbvObject: return "object"; case jbvArray: @@ -196,7 +196,7 @@ JsonbTypeName(JsonbValue *val) case jbvNull: return "null"; case jbvDatetime: - switch (val->val.datetime.typid) + switch (val->datetime.typid) { case DATEOID: return "date"; @@ -210,7 +210,7 @@ JsonbTypeName(JsonbValue *val) return "timestamp with time zone"; default: elog(ERROR, "unrecognized jsonb value datetime type: %d", - val->val.datetime.typid); + val->datetime.typid); } return "unknown"; default: @@ -335,10 +335,10 @@ jsonb_in_object_field_start(void *pstate, char *fname, bool isnull) Assert(fname != NULL); v.type = jbvString; - v.val.string.len = strlen(fname); - if (!checkStringLen(v.val.string.len, _state->escontext)) + v.string.len = strlen(fname); + if (!checkStringLen(v.string.len, _state->escontext)) return JSON_SEM_ACTION_FAILED; - v.val.string.val = fname; + v.string.val = fname; _state->res = pushJsonbValue(&_state->parseState, WJB_KEY, &v); @@ -354,15 +354,15 @@ jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal) appendBinaryStringInfo(out, "null", 4); break; case jbvString: - escape_json_with_len(out, scalarVal->val.string.val, scalarVal->val.string.len); + escape_json_with_len(out, scalarVal->string.val, scalarVal->string.len); break; case jbvNumeric: appendStringInfoString(out, DatumGetCString(DirectFunctionCall1(numeric_out, - PointerGetDatum(scalarVal->val.numeric)))); + PointerGetDatum(scalarVal->numeric)))); break; case jbvBool: - if (scalarVal->val.boolean) + if (scalarVal->boolean) appendBinaryStringInfo(out, "true", 4); else appendBinaryStringInfo(out, "false", 5); @@ -388,10 +388,10 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype) case JSON_TOKEN_STRING: Assert(token != NULL); v.type = jbvString; - v.val.string.len = strlen(token); - if (!checkStringLen(v.val.string.len, _state->escontext)) + v.string.len = strlen(token); + if (!checkStringLen(v.string.len, _state->escontext)) return JSON_SEM_ACTION_FAILED; - v.val.string.val = token; + v.string.val = token; break; case JSON_TOKEN_NUMBER: @@ -406,15 +406,15 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype) _state->escontext, &numd)) return JSON_SEM_ACTION_FAILED; - v.val.numeric = DatumGetNumeric(numd); + v.numeric = DatumGetNumeric(numd); break; case JSON_TOKEN_TRUE: v.type = jbvBool; - v.val.boolean = true; + v.boolean = true; break; case JSON_TOKEN_FALSE: v.type = jbvBool; - v.val.boolean = false; + v.boolean = false; break; case JSON_TOKEN_NULL: v.type = jbvNull; @@ -431,8 +431,8 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype) JsonbValue va; va.type = jbvArray; - va.val.array.rawScalar = true; - va.val.array.nElems = 1; + va.array.rawScalar = true; + va.array.nElems = 1; _state->res = pushJsonbValue(&_state->parseState, WJB_BEGIN_ARRAY, &va); _state->res = pushJsonbValue(&_state->parseState, WJB_ELEM, &v); @@ -525,7 +525,7 @@ JsonbToCStringWorker(StringInfo out, JsonbContainer *in, int estimated_len, bool if (!first) appendBinaryStringInfo(out, ", ", ispaces); - if (!v.val.array.rawScalar) + if (!v.array.rawScalar) { add_indent(out, use_indent && !last_was_key, level); appendStringInfoCharMacro(out, '['); @@ -681,13 +681,13 @@ datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, { outputstr = DatumGetBool(val) ? "true" : "false"; jb.type = jbvString; - jb.val.string.len = strlen(outputstr); - jb.val.string.val = outputstr; + jb.string.len = strlen(outputstr); + jb.string.val = outputstr; } else { jb.type = jbvBool; - jb.val.boolean = DatumGetBool(val); + jb.boolean = DatumGetBool(val); } break; case JSONTYPE_NUMERIC: @@ -696,8 +696,8 @@ datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, { /* always quote keys */ jb.type = jbvString; - jb.val.string.len = strlen(outputstr); - jb.val.string.val = outputstr; + jb.string.len = strlen(outputstr); + jb.string.val = outputstr; } else { @@ -717,34 +717,34 @@ datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, CStringGetDatum(outputstr), ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1)); - jb.val.numeric = DatumGetNumeric(numd); + jb.numeric = DatumGetNumeric(numd); pfree(outputstr); } else { jb.type = jbvString; - jb.val.string.len = strlen(outputstr); - jb.val.string.val = outputstr; + jb.string.len = strlen(outputstr); + jb.string.val = outputstr; } } break; case JSONTYPE_DATE: jb.type = jbvString; - jb.val.string.val = JsonEncodeDateTime(NULL, val, - DATEOID, NULL); - jb.val.string.len = strlen(jb.val.string.val); + jb.string.val = JsonEncodeDateTime(NULL, val, + DATEOID, NULL); + jb.string.len = strlen(jb.string.val); break; case JSONTYPE_TIMESTAMP: jb.type = jbvString; - jb.val.string.val = JsonEncodeDateTime(NULL, val, - TIMESTAMPOID, NULL); - jb.val.string.len = strlen(jb.val.string.val); + jb.string.val = JsonEncodeDateTime(NULL, val, + TIMESTAMPOID, NULL); + jb.string.len = strlen(jb.string.val); break; case JSONTYPE_TIMESTAMPTZ: jb.type = jbvString; - jb.val.string.val = JsonEncodeDateTime(NULL, val, - TIMESTAMPTZOID, NULL); - jb.val.string.len = strlen(jb.val.string.val); + jb.string.val = JsonEncodeDateTime(NULL, val, + TIMESTAMPTZOID, NULL); + jb.string.len = strlen(jb.string.val); break; case JSONTYPE_CAST: case JSONTYPE_JSON: @@ -806,9 +806,9 @@ datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, default: outputstr = OidOutputFunctionCall(outfuncoid, val); jb.type = jbvString; - jb.val.string.len = strlen(outputstr); - (void) checkStringLen(jb.val.string.len, NULL); - jb.val.string.val = outputstr; + jb.string.len = strlen(outputstr); + (void) checkStringLen(jb.string.len, NULL); + jb.string.val = outputstr; break; } } @@ -826,8 +826,8 @@ datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, JsonbValue va; va.type = jbvArray; - va.val.array.rawScalar = true; - va.val.array.nElems = 1; + va.array.rawScalar = true; + va.array.nElems = 1; result->res = pushJsonbValue(&result->parseState, WJB_BEGIN_ARRAY, &va); result->res = pushJsonbValue(&result->parseState, WJB_ELEM, &jb); @@ -980,8 +980,8 @@ composite_to_jsonb(Datum composite, JsonbInState *result) v.type = jbvString; /* don't need checkStringLen here - can't exceed maximum name length */ - v.val.string.len = strlen(attname); - v.val.string.val = attname; + v.string.len = strlen(attname); + v.string.val = attname; result->res = pushJsonbValue(&result->parseState, WJB_KEY, &v); @@ -1337,8 +1337,8 @@ jsonb_object(PG_FUNCTION_ARGS) v.type = jbvString; - v.val.string.len = len; - v.val.string.val = str; + v.string.len = len; + v.string.val = str; (void) pushJsonbValue(&result.parseState, WJB_KEY, &v); @@ -1353,8 +1353,8 @@ jsonb_object(PG_FUNCTION_ARGS) v.type = jbvString; - v.val.string.len = len; - v.val.string.val = str; + v.string.len = len; + v.string.val = str; } (void) pushJsonbValue(&result.parseState, WJB_VALUE, &v); @@ -1427,8 +1427,8 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS) v.type = jbvString; - v.val.string.len = len; - v.val.string.val = str; + v.string.len = len; + v.string.val = str; (void) pushJsonbValue(&result.parseState, WJB_KEY, &v); @@ -1443,8 +1443,8 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS) v.type = jbvString; - v.val.string.len = len; - v.val.string.val = str; + v.string.len = len; + v.string.val = str; } (void) pushJsonbValue(&result.parseState, WJB_VALUE, &v); @@ -1571,7 +1571,7 @@ jsonb_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) switch (type) { case WJB_BEGIN_ARRAY: - if (v.val.array.rawScalar) + if (v.array.rawScalar) single_scalar = true; else result->res = pushJsonbValue(&result->parseState, @@ -1593,17 +1593,17 @@ jsonb_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) if (v.type == jbvString) { /* copy string values in the aggregate context */ - char *buf = palloc(v.val.string.len + 1); + char *buf = palloc(v.string.len + 1); - snprintf(buf, v.val.string.len + 1, "%s", v.val.string.val); - v.val.string.val = buf; + snprintf(buf, v.string.len + 1, "%s", v.string.val); + v.string.val = buf; } else if (v.type == jbvNumeric) { /* same for numeric */ - v.val.numeric = + v.numeric = DatumGetNumeric(DirectFunctionCall1(numeric_uplus, - NumericGetDatum(v.val.numeric))); + NumericGetDatum(v.numeric))); } result->res = pushJsonbValue(&result->parseState, type, &v); @@ -1787,17 +1787,17 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, switch (type) { case WJB_BEGIN_ARRAY: - if (!v.val.array.rawScalar) + if (!v.array.rawScalar) elog(ERROR, "unexpected structure for key"); break; case WJB_ELEM: if (v.type == jbvString) { /* copy string values in the aggregate context */ - char *buf = palloc(v.val.string.len + 1); + char *buf = palloc(v.string.len + 1); - snprintf(buf, v.val.string.len + 1, "%s", v.val.string.val); - v.val.string.val = buf; + snprintf(buf, v.string.len + 1, "%s", v.string.val); + v.string.val = buf; } else { @@ -1841,7 +1841,7 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, switch (type) { case WJB_BEGIN_ARRAY: - if (v.val.array.rawScalar) + if (v.array.rawScalar) single_scalar = true; else result->res = pushJsonbValue(&result->parseState, @@ -1863,17 +1863,17 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, if (v.type == jbvString) { /* copy string values in the aggregate context */ - char *buf = palloc(v.val.string.len + 1); + char *buf = palloc(v.string.len + 1); - snprintf(buf, v.val.string.len + 1, "%s", v.val.string.val); - v.val.string.val = buf; + snprintf(buf, v.string.len + 1, "%s", v.string.val); + v.string.val = buf; } else if (v.type == jbvNumeric) { /* same for numeric */ - v.val.numeric = + v.numeric = DatumGetNumeric(DirectFunctionCall1(numeric_uplus, - NumericGetDatum(v.val.numeric))); + NumericGetDatum(v.numeric))); } result->res = pushJsonbValue(&result->parseState, single_scalar ? WJB_VALUE : type, @@ -1986,7 +1986,7 @@ JsonbExtractScalar(JsonbContainer *jbc, JsonbValue *res) tok = JsonbIteratorNext(&it, &tmp, true); Assert(tok == WJB_BEGIN_ARRAY); - Assert(tmp.val.array.nElems == 1 && tmp.val.array.rawScalar); + Assert(tmp.array.nElems == 1 && tmp.array.rawScalar); tok = JsonbIteratorNext(&it, res, true); Assert(tok == WJB_ELEM); @@ -2054,7 +2054,7 @@ jsonb_bool(PG_FUNCTION_ARGS) PG_FREE_IF_COPY(in, 0); - PG_RETURN_BOOL(v.val.boolean); + PG_RETURN_BOOL(v.boolean); } Datum @@ -2077,10 +2077,9 @@ jsonb_numeric(PG_FUNCTION_ARGS) cannotCastJsonbValue(v.type, "numeric"); /* - * v.val.numeric points into jsonb body, so we need to make a copy to - * return + * v.numeric points into jsonb body, so we need to make a copy to return */ - retValue = DatumGetNumericCopy(NumericGetDatum(v.val.numeric)); + retValue = DatumGetNumericCopy(NumericGetDatum(v.numeric)); PG_FREE_IF_COPY(in, 0); @@ -2107,7 +2106,7 @@ jsonb_int2(PG_FUNCTION_ARGS) cannotCastJsonbValue(v.type, "smallint"); retValue = DirectFunctionCall1(numeric_int2, - NumericGetDatum(v.val.numeric)); + NumericGetDatum(v.numeric)); PG_FREE_IF_COPY(in, 0); @@ -2134,7 +2133,7 @@ jsonb_int4(PG_FUNCTION_ARGS) cannotCastJsonbValue(v.type, "integer"); retValue = DirectFunctionCall1(numeric_int4, - NumericGetDatum(v.val.numeric)); + NumericGetDatum(v.numeric)); PG_FREE_IF_COPY(in, 0); @@ -2161,7 +2160,7 @@ jsonb_int8(PG_FUNCTION_ARGS) cannotCastJsonbValue(v.type, "bigint"); retValue = DirectFunctionCall1(numeric_int8, - NumericGetDatum(v.val.numeric)); + NumericGetDatum(v.numeric)); PG_FREE_IF_COPY(in, 0); @@ -2188,7 +2187,7 @@ jsonb_float4(PG_FUNCTION_ARGS) cannotCastJsonbValue(v.type, "real"); retValue = DirectFunctionCall1(numeric_float4, - NumericGetDatum(v.val.numeric)); + NumericGetDatum(v.numeric)); PG_FREE_IF_COPY(in, 0); @@ -2215,7 +2214,7 @@ jsonb_float8(PG_FUNCTION_ARGS) cannotCastJsonbValue(v.type, "double precision"); retValue = DirectFunctionCall1(numeric_float8, - NumericGetDatum(v.val.numeric)); + NumericGetDatum(v.numeric)); PG_FREE_IF_COPY(in, 0); @@ -2235,12 +2234,12 @@ JsonbUnquote(Jsonb *jb) (void) JsonbExtractScalar(&jb->root, &v); if (v.type == jbvString) - return pnstrdup(v.val.string.val, v.val.string.len); + return pnstrdup(v.string.val, v.string.len); else if (v.type == jbvBool) - return pstrdup(v.val.boolean ? "true" : "false"); + return pstrdup(v.boolean ? "true" : "false"); else if (v.type == jbvNumeric) return DatumGetCString(DirectFunctionCall1(numeric_out, - PointerGetDatum(v.val.numeric))); + PointerGetDatum(v.numeric))); else if (v.type == jbvNull) return pstrdup("null"); else diff --git a/src/backend/utils/adt/jsonb_gin.c b/src/backend/utils/adt/jsonb_gin.c index 9b56248cf0b..4b7cb39e96d 100644 --- a/src/backend/utils/adt/jsonb_gin.c +++ b/src/backend/utils/adt/jsonb_gin.c @@ -104,7 +104,7 @@ struct JsonPathGinNode * nodes after entries output */ Datum entryDatum; /* path hash or key name/scalar, valid for * ENTRY nodes before entries output */ - } val; + }; JsonPathGinNode *args[FLEXIBLE_ARRAY_MEMBER]; /* valid for OR and AND * nodes */ }; @@ -333,7 +333,7 @@ jsonb_path_ops__add_path_item(JsonPathGinPath *path, JsonPathItem *jsp) JsonbValue jbv; jbv.type = jbvString; - jbv.val.string.val = jspGetString(jsp, &jbv.val.string.len); + jbv.string.val = jspGetString(jsp, &jbv.string.len); JsonbHashScalarValue(&jbv, &path->hash); return true; @@ -355,7 +355,7 @@ make_jsp_entry_node(Datum entry) JsonPathGinNode *node = palloc(offsetof(JsonPathGinNode, args)); node->type = JSP_GIN_ENTRY; - node->val.entryDatum = entry; + node->entryDatum = entry; return node; } @@ -373,7 +373,7 @@ make_jsp_expr_node(JsonPathGinNodeType type, int nargs) sizeof(node->args[0]) * nargs); node->type = type; - node->val.nargs = nargs; + node->nargs = nargs; return node; } @@ -687,18 +687,18 @@ extract_jsp_bool_expr(JsonPathGinContext *cxt, JsonPathGinPath path, break; case jpiBool: scalar.type = jbvBool; - scalar.val.boolean = !!*scalar_item->content.value.data; + scalar.boolean = !!*scalar_item->value.data; break; case jpiNumeric: scalar.type = jbvNumeric; - scalar.val.numeric = - (Numeric) scalar_item->content.value.data; + scalar.numeric = + (Numeric) scalar_item->value.data; break; case jpiString: scalar.type = jbvString; - scalar.val.string.val = scalar_item->content.value.data; - scalar.val.string.len = - scalar_item->content.value.datalen; + scalar.string.val = scalar_item->value.data; + scalar.string.len = + scalar_item->value.datalen; break; default: elog(ERROR, "invalid scalar jsonpath item type: %d", @@ -724,7 +724,7 @@ emit_jsp_gin_entries(JsonPathGinNode *node, GinEntries *entries) { case JSP_GIN_ENTRY: /* replace datum with its index in the array */ - node->val.entryIndex = add_gin_entry(entries, node->val.entryDatum); + node->entryIndex = add_gin_entry(entries, node->entryDatum); break; case JSP_GIN_OR: @@ -732,7 +732,7 @@ emit_jsp_gin_entries(JsonPathGinNode *node, GinEntries *entries) { int i; - for (i = 0; i < node->val.nargs; i++) + for (i = 0; i < node->nargs; i++) emit_jsp_gin_entries(node->args[i], entries); break; @@ -806,7 +806,7 @@ execute_jsp_gin_node(JsonPathGinNode *node, void *check, bool ternary) { case JSP_GIN_AND: res = GIN_TRUE; - for (i = 0; i < node->val.nargs; i++) + for (i = 0; i < node->nargs; i++) { v = execute_jsp_gin_node(node->args[i], check, ternary); if (v == GIN_FALSE) @@ -818,7 +818,7 @@ execute_jsp_gin_node(JsonPathGinNode *node, void *check, bool ternary) case JSP_GIN_OR: res = GIN_FALSE; - for (i = 0; i < node->val.nargs; i++) + for (i = 0; i < node->nargs; i++) { v = execute_jsp_gin_node(node->args[i], check, ternary); if (v == GIN_TRUE) @@ -830,7 +830,7 @@ execute_jsp_gin_node(JsonPathGinNode *node, void *check, bool ternary) case JSP_GIN_ENTRY: { - int index = node->val.entryIndex; + int index = node->entryIndex; if (ternary) return ((GinTernaryValue *) check)[index]; @@ -1375,7 +1375,7 @@ make_scalar_key(const JsonbValue *scalarVal, bool is_key) case jbvBool: Assert(!is_key); item = make_text_key(JGINFLAG_BOOL, - scalarVal->val.boolean ? "t" : "f", 1); + scalarVal->boolean ? "t" : "f", 1); break; case jbvNumeric: Assert(!is_key); @@ -1390,14 +1390,14 @@ make_scalar_key(const JsonbValue *scalarVal, bool is_key) * storing a "union" type in the GIN B-Tree, and indexing Jsonb * strings takes precedence. */ - cstr = numeric_normalize(scalarVal->val.numeric); + cstr = numeric_normalize(scalarVal->numeric); item = make_text_key(JGINFLAG_NUM, cstr, strlen(cstr)); pfree(cstr); break; case jbvString: item = make_text_key(is_key ? JGINFLAG_KEY : JGINFLAG_STR, - scalarVal->val.string.val, - scalarVal->val.string.len); + scalarVal->string.val, + scalarVal->string.len); break; default: elog(ERROR, "unrecognized jsonb scalar type: %d", scalarVal->type); diff --git a/src/backend/utils/adt/jsonb_op.c b/src/backend/utils/adt/jsonb_op.c index 51d38e321fb..df4552b0620 100644 --- a/src/backend/utils/adt/jsonb_op.c +++ b/src/backend/utils/adt/jsonb_op.c @@ -32,8 +32,8 @@ jsonb_exists(PG_FUNCTION_ARGS) * top level. No recursion occurs. */ kval.type = jbvString; - kval.val.string.val = VARDATA_ANY(key); - kval.val.string.len = VARSIZE_ANY_EXHDR(key); + kval.string.val = VARDATA_ANY(key); + kval.string.len = VARSIZE_ANY_EXHDR(key); v = findJsonbValueFromContainer(&jb->root, JB_FOBJECT | JB_FARRAY, @@ -63,8 +63,8 @@ jsonb_exists_any(PG_FUNCTION_ARGS) strVal.type = jbvString; /* We rely on the array elements not being toasted */ - strVal.val.string.val = VARDATA_ANY(DatumGetPointer(key_datums[i])); - strVal.val.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(key_datums[i])); + strVal.string.val = VARDATA_ANY(DatumGetPointer(key_datums[i])); + strVal.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(key_datums[i])); if (findJsonbValueFromContainer(&jb->root, JB_FOBJECT | JB_FARRAY, @@ -96,8 +96,8 @@ jsonb_exists_all(PG_FUNCTION_ARGS) strVal.type = jbvString; /* We rely on the array elements not being toasted */ - strVal.val.string.val = VARDATA_ANY(DatumGetPointer(key_datums[i])); - strVal.val.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(key_datums[i])); + strVal.string.val = VARDATA_ANY(DatumGetPointer(key_datums[i])); + strVal.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(key_datums[i])); if (findJsonbValueFromContainer(&jb->root, JB_FOBJECT | JB_FARRAY, diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 82b807d067a..998125f6f5a 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -72,8 +72,8 @@ void JsonbToJsonbValue(Jsonb *jsonb, JsonbValue *val) { val->type = jbvBinary; - val->val.binary.data = &jsonb->root; - val->val.binary.len = VARSIZE(jsonb) - VARHDRSZ; + val->binary.data = &jsonb->root; + val->binary.len = VARSIZE(jsonb) - VARHDRSZ; } /* @@ -101,8 +101,8 @@ JsonbValueToJsonb(JsonbValue *val) JsonbValue scalarArray; scalarArray.type = jbvArray; - scalarArray.val.array.rawScalar = true; - scalarArray.val.array.nElems = 1; + scalarArray.array.rawScalar = true; + scalarArray.array.nElems = 1; pushJsonbValue(&pstate, WJB_BEGIN_ARRAY, &scalarArray); pushJsonbValue(&pstate, WJB_ELEM, val); @@ -117,9 +117,9 @@ JsonbValueToJsonb(JsonbValue *val) else { Assert(val->type == jbvBinary); - out = palloc(VARHDRSZ + val->val.binary.len); - SET_VARSIZE(out, VARHDRSZ + val->val.binary.len); - memcpy(VARDATA(out), val->val.binary.data, val->val.binary.len); + out = palloc(VARHDRSZ + val->binary.len); + SET_VARSIZE(out, VARHDRSZ + val->binary.len); + memcpy(VARDATA(out), val->binary.data, val->binary.len); } return out; @@ -244,8 +244,8 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b) * general type-based comparisons to apply, and as far * as we're concerned a pseudo array is just a scalar. */ - if (va.val.array.rawScalar != vb.val.array.rawScalar) - res = (va.val.array.rawScalar) ? -1 : 1; + if (va.array.rawScalar != vb.array.rawScalar) + res = (va.array.rawScalar) ? -1 : 1; /* * There should be an "else" here, to prevent us from @@ -253,12 +253,12 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b) * order now, so there is a mild anomaly that an empty * top level array sorts less than null. */ - if (va.val.array.nElems != vb.val.array.nElems) - res = (va.val.array.nElems > vb.val.array.nElems) ? 1 : -1; + if (va.array.nElems != vb.array.nElems) + res = (va.array.nElems > vb.array.nElems) ? 1 : -1; break; case jbvObject: - if (va.val.object.nPairs != vb.val.object.nPairs) - res = (va.val.object.nPairs > vb.val.object.nPairs) ? 1 : -1; + if (va.object.nPairs != vb.object.nPairs) + res = (va.object.nPairs > vb.object.nPairs) ? 1 : -1; break; case jbvBinary: elog(ERROR, "unexpected jbvBinary value"); @@ -381,8 +381,8 @@ findJsonbValueFromContainer(JsonbContainer *container, uint32 flags, /* Object key passed by caller must be a string */ Assert(key->type == jbvString); - return getKeyJsonValueFromContainer(container, key->val.string.val, - key->val.string.len, NULL); + return getKeyJsonValueFromContainer(container, key->string.val, + key->string.len, NULL); } /* Not found */ @@ -516,32 +516,32 @@ fillJsonbValue(JsonbContainer *container, int index, else if (JBE_ISSTRING(entry)) { result->type = jbvString; - result->val.string.val = base_addr + offset; - result->val.string.len = getJsonbLength(container, index); - Assert(result->val.string.len >= 0); + result->string.val = base_addr + offset; + result->string.len = getJsonbLength(container, index); + Assert(result->string.len >= 0); } else if (JBE_ISNUMERIC(entry)) { result->type = jbvNumeric; - result->val.numeric = (Numeric) (base_addr + INTALIGN(offset)); + result->numeric = (Numeric) (base_addr + INTALIGN(offset)); } else if (JBE_ISBOOL_TRUE(entry)) { result->type = jbvBool; - result->val.boolean = true; + result->boolean = true; } else if (JBE_ISBOOL_FALSE(entry)) { result->type = jbvBool; - result->val.boolean = false; + result->boolean = false; } else { Assert(JBE_ISCONTAINER(entry)); result->type = jbvBinary; /* Remove alignment padding from data pointer and length */ - result->val.binary.data = (JsonbContainer *) (base_addr + INTALIGN(offset)); - result->val.binary.len = getJsonbLength(container, index) - + result->binary.data = (JsonbContainer *) (base_addr + INTALIGN(offset)); + result->binary.len = getJsonbLength(container, index) - (INTALIGN(offset) - offset); } } @@ -576,10 +576,10 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, if (jbval && (seq == WJB_ELEM || seq == WJB_VALUE) && jbval->type == jbvObject) { pushJsonbValue(pstate, WJB_BEGIN_OBJECT, NULL); - for (i = 0; i < jbval->val.object.nPairs; i++) + for (i = 0; i < jbval->object.nPairs; i++) { - pushJsonbValue(pstate, WJB_KEY, &jbval->val.object.pairs[i].key); - pushJsonbValue(pstate, WJB_VALUE, &jbval->val.object.pairs[i].value); + pushJsonbValue(pstate, WJB_KEY, &jbval->object.pairs[i].key); + pushJsonbValue(pstate, WJB_VALUE, &jbval->object.pairs[i].value); } return pushJsonbValue(pstate, WJB_END_OBJECT, NULL); @@ -588,9 +588,9 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, if (jbval && (seq == WJB_ELEM || seq == WJB_VALUE) && jbval->type == jbvArray) { pushJsonbValue(pstate, WJB_BEGIN_ARRAY, NULL); - for (i = 0; i < jbval->val.array.nElems; i++) + for (i = 0; i < jbval->array.nElems; i++) { - pushJsonbValue(pstate, WJB_ELEM, &jbval->val.array.elems[i]); + pushJsonbValue(pstate, WJB_ELEM, &jbval->array.elems[i]); } return pushJsonbValue(pstate, WJB_END_ARRAY, NULL); @@ -604,13 +604,13 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, } /* unpack the binary and add each piece to the pstate */ - it = JsonbIteratorInit(jbval->val.binary.data); + it = JsonbIteratorInit(jbval->binary.data); - if ((jbval->val.binary.data->header & JB_FSCALAR) && *pstate) + if ((jbval->binary.data->header & JB_FSCALAR) && *pstate) { tok = JsonbIteratorNext(&it, &v, true); Assert(tok == WJB_BEGIN_ARRAY); - Assert(v.type == jbvArray && v.val.array.rawScalar); + Assert(v.type == jbvArray && v.array.rawScalar); tok = JsonbIteratorNext(&it, &v, true); Assert(tok == WJB_ELEM); @@ -628,7 +628,7 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, res = pushJsonbValueScalar(pstate, tok, tok < WJB_BEGIN_ARRAY || (tok == WJB_BEGIN_ARRAY && - v.val.array.rawScalar) ? &v : NULL); + v.array.rawScalar) ? &v : NULL); return res; } @@ -646,35 +646,35 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq, switch (seq) { case WJB_BEGIN_ARRAY: - Assert(!scalarVal || scalarVal->val.array.rawScalar); + Assert(!scalarVal || scalarVal->array.rawScalar); *pstate = pushState(pstate); result = &(*pstate)->contVal; (*pstate)->contVal.type = jbvArray; - (*pstate)->contVal.val.array.nElems = 0; - (*pstate)->contVal.val.array.rawScalar = (scalarVal && - scalarVal->val.array.rawScalar); - if (scalarVal && scalarVal->val.array.nElems > 0) + (*pstate)->contVal.array.nElems = 0; + (*pstate)->contVal.array.rawScalar = (scalarVal && + scalarVal->array.rawScalar); + if (scalarVal && scalarVal->array.nElems > 0) { /* Assume that this array is still really a scalar */ Assert(scalarVal->type == jbvArray); - (*pstate)->size = scalarVal->val.array.nElems; + (*pstate)->size = scalarVal->array.nElems; } else { (*pstate)->size = 4; } - (*pstate)->contVal.val.array.elems = palloc(sizeof(JsonbValue) * - (*pstate)->size); + (*pstate)->contVal.array.elems = palloc(sizeof(JsonbValue) * + (*pstate)->size); break; case WJB_BEGIN_OBJECT: Assert(!scalarVal); *pstate = pushState(pstate); result = &(*pstate)->contVal; (*pstate)->contVal.type = jbvObject; - (*pstate)->contVal.val.object.nPairs = 0; + (*pstate)->contVal.object.nPairs = 0; (*pstate)->size = 4; - (*pstate)->contVal.val.object.pairs = palloc(sizeof(JsonbPair) * - (*pstate)->size); + (*pstate)->contVal.object.pairs = palloc(sizeof(JsonbPair) * + (*pstate)->size); break; case WJB_KEY: Assert(scalarVal->type == jbvString); @@ -751,21 +751,21 @@ appendKey(JsonbParseState *pstate, JsonbValue *string) Assert(object->type == jbvObject); Assert(string->type == jbvString); - if (object->val.object.nPairs >= JSONB_MAX_PAIRS) + if (object->object.nPairs >= JSONB_MAX_PAIRS) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("number of jsonb object pairs exceeds the maximum allowed (%zu)", JSONB_MAX_PAIRS))); - if (object->val.object.nPairs >= pstate->size) + if (object->object.nPairs >= pstate->size) { pstate->size *= 2; - object->val.object.pairs = repalloc(object->val.object.pairs, - sizeof(JsonbPair) * pstate->size); + object->object.pairs = repalloc(object->object.pairs, + sizeof(JsonbPair) * pstate->size); } - object->val.object.pairs[object->val.object.nPairs].key = *string; - object->val.object.pairs[object->val.object.nPairs].order = object->val.object.nPairs; + object->object.pairs[object->object.nPairs].key = *string; + object->object.pairs[object->object.nPairs].order = object->object.nPairs; } /* @@ -779,7 +779,7 @@ appendValue(JsonbParseState *pstate, JsonbValue *scalarVal) Assert(object->type == jbvObject); - object->val.object.pairs[object->val.object.nPairs++].value = *scalarVal; + object->object.pairs[object->object.nPairs++].value = *scalarVal; } /* @@ -792,20 +792,20 @@ appendElement(JsonbParseState *pstate, JsonbValue *scalarVal) Assert(array->type == jbvArray); - if (array->val.array.nElems >= JSONB_MAX_ELEMS) + if (array->array.nElems >= JSONB_MAX_ELEMS) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("number of jsonb array elements exceeds the maximum allowed (%zu)", JSONB_MAX_ELEMS))); - if (array->val.array.nElems >= pstate->size) + if (array->array.nElems >= pstate->size) { pstate->size *= 2; - array->val.array.elems = repalloc(array->val.array.elems, - sizeof(JsonbValue) * pstate->size); + array->array.elems = repalloc(array->array.elems, + sizeof(JsonbValue) * pstate->size); } - array->val.array.elems[array->val.array.nElems++] = *scalarVal; + array->array.elems[array->array.nElems++] = *scalarVal; } /* @@ -873,13 +873,13 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) case JBI_ARRAY_START: /* Set v to array on first array call */ val->type = jbvArray; - val->val.array.nElems = (*it)->nElems; + val->array.nElems = (*it)->nElems; /* - * v->val.array.elems is not actually set, because we aren't doing - * a full conversion + * v->array.elems is not actually set, because we aren't doing a + * full conversion */ - val->val.array.rawScalar = (*it)->isScalar; + val->array.rawScalar = (*it)->isScalar; (*it)->curIndex = 0; (*it)->curDataOffset = 0; (*it)->curValueOffset = 0; /* not actually used */ @@ -912,7 +912,7 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) if (!IsAJsonbScalar(val) && !skipNested) { /* Recurse into container. */ - *it = iteratorFromContainer(val->val.binary.data, *it); + *it = iteratorFromContainer(val->binary.data, *it); goto recurse; } else @@ -927,11 +927,11 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) case JBI_OBJECT_START: /* Set v to object on first object call */ val->type = jbvObject; - val->val.object.nPairs = (*it)->nElems; + val->object.nPairs = (*it)->nElems; /* - * v->val.object.pairs is not actually set, because we aren't - * doing a full conversion + * v->object.pairs is not actually set, because we aren't doing a + * full conversion */ (*it)->curIndex = 0; (*it)->curDataOffset = 0; @@ -989,7 +989,7 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) */ if (!IsAJsonbScalar(val) && !skipNested) { - *it = iteratorFromContainer(val->val.binary.data, *it); + *it = iteratorFromContainer(val->binary.data, *it); goto recurse; } else @@ -1111,7 +1111,7 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained) * optimization in the array case.) The case probably won't arise * often, but since it's such a cheap check we may as well make it. */ - if (vval.val.object.nPairs < vcontained.val.object.nPairs) + if (vval.object.nPairs < vcontained.object.nPairs) return false; /* Work through rhs "is it contained within?" object */ @@ -1136,8 +1136,8 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained) /* First, find value by key... */ lhsVal = getKeyJsonValueFromContainer((*val)->container, - vcontained.val.string.val, - vcontained.val.string.len, + vcontained.string.val, + vcontained.string.len, &lhsValBuf); if (!lhsVal) return false; @@ -1172,8 +1172,8 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained) Assert(lhsVal->type == jbvBinary); Assert(vcontained.type == jbvBinary); - nestval = JsonbIteratorInit(lhsVal->val.binary.data); - nestContained = JsonbIteratorInit(vcontained.val.binary.data); + nestval = JsonbIteratorInit(lhsVal->binary.data); + nestContained = JsonbIteratorInit(vcontained.binary.data); /* * Match "value" side of rhs datum object's pair recursively. @@ -1203,7 +1203,7 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained) else if (rcont == WJB_BEGIN_ARRAY) { JsonbValue *lhsConts = NULL; - uint32 nLhsElems = vval.val.array.nElems; + uint32 nLhsElems = vval.array.nElems; Assert(vval.type == jbvArray); Assert(vcontained.type == jbvArray); @@ -1218,7 +1218,7 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained) * only contain pairs, never raw scalars (a pair is represented by an * rhs object argument with a single contained pair). */ - if (vval.val.array.rawScalar && !vcontained.val.array.rawScalar) + if (vval.array.rawScalar && !vcontained.array.rawScalar) return false; /* Work through rhs "is it contained within?" array */ @@ -1284,8 +1284,8 @@ JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained) *nestContained; bool contains; - nestval = JsonbIteratorInit(lhsConts[i].val.binary.data); - nestContained = JsonbIteratorInit(vcontained.val.binary.data); + nestval = JsonbIteratorInit(lhsConts[i].binary.data); + nestContained = JsonbIteratorInit(vcontained.binary.data); contains = JsonbDeepContains(&nestval, &nestContained); @@ -1334,16 +1334,16 @@ JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash) tmp = 0x01; break; case jbvString: - tmp = DatumGetUInt32(hash_any((const unsigned char *) scalarVal->val.string.val, - scalarVal->val.string.len)); + tmp = DatumGetUInt32(hash_any((const unsigned char *) scalarVal->string.val, + scalarVal->string.len)); break; case jbvNumeric: /* Must hash equal numerics to equal hash codes */ tmp = DatumGetUInt32(DirectFunctionCall1(hash_numeric, - NumericGetDatum(scalarVal->val.numeric))); + NumericGetDatum(scalarVal->numeric))); break; case jbvBool: - tmp = scalarVal->val.boolean ? 0x02 : 0x04; + tmp = scalarVal->boolean ? 0x02 : 0x04; break; default: @@ -1377,22 +1377,22 @@ JsonbHashScalarValueExtended(const JsonbValue *scalarVal, uint64 *hash, tmp = seed + 0x01; break; case jbvString: - tmp = DatumGetUInt64(hash_any_extended((const unsigned char *) scalarVal->val.string.val, - scalarVal->val.string.len, + tmp = DatumGetUInt64(hash_any_extended((const unsigned char *) scalarVal->string.val, + scalarVal->string.len, seed)); break; case jbvNumeric: tmp = DatumGetUInt64(DirectFunctionCall2(hash_numeric_extended, - NumericGetDatum(scalarVal->val.numeric), + NumericGetDatum(scalarVal->numeric), UInt64GetDatum(seed))); break; case jbvBool: if (seed) tmp = DatumGetUInt64(DirectFunctionCall2(hashcharextended, - BoolGetDatum(scalarVal->val.boolean), + BoolGetDatum(scalarVal->boolean), UInt64GetDatum(seed))); else - tmp = scalarVal->val.boolean ? 0x02 : 0x04; + tmp = scalarVal->boolean ? 0x02 : 0x04; break; default: @@ -1420,10 +1420,10 @@ equalsJsonbScalarValue(JsonbValue *a, JsonbValue *b) return lengthCompareJsonbStringValue(a, b) == 0; case jbvNumeric: return DatumGetBool(DirectFunctionCall2(numeric_eq, - PointerGetDatum(a->val.numeric), - PointerGetDatum(b->val.numeric))); + PointerGetDatum(a->numeric), + PointerGetDatum(b->numeric))); case jbvBool: - return a->val.boolean == b->val.boolean; + return a->boolean == b->boolean; default: elog(ERROR, "invalid jsonb scalar type"); @@ -1449,19 +1449,19 @@ compareJsonbScalarValue(JsonbValue *a, JsonbValue *b) case jbvNull: return 0; case jbvString: - return varstr_cmp(a->val.string.val, - a->val.string.len, - b->val.string.val, - b->val.string.len, + return varstr_cmp(a->string.val, + a->string.len, + b->string.val, + b->string.len, DEFAULT_COLLATION_OID); case jbvNumeric: return DatumGetInt32(DirectFunctionCall2(numeric_cmp, - PointerGetDatum(a->val.numeric), - PointerGetDatum(b->val.numeric))); + PointerGetDatum(a->numeric), + PointerGetDatum(b->numeric))); case jbvBool: - if (a->val.boolean == b->val.boolean) + if (a->boolean == b->boolean) return 0; - else if (a->val.boolean > b->val.boolean) + else if (a->boolean > b->boolean) return 1; else return -1; @@ -1629,7 +1629,7 @@ convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level) int i; int totallen; uint32 containerhead; - int nElems = val->val.array.nElems; + int nElems = val->array.nElems; /* Remember where in the buffer this array starts. */ base_offset = buffer->len; @@ -1642,7 +1642,7 @@ convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level) * variable-length payload. */ containerhead = nElems | JB_FARRAY; - if (val->val.array.rawScalar) + if (val->array.rawScalar) { Assert(nElems == 1); Assert(level == 0); @@ -1657,7 +1657,7 @@ convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level) totallen = 0; for (i = 0; i < nElems; i++) { - JsonbValue *elem = &val->val.array.elems[i]; + JsonbValue *elem = &val->array.elems[i]; int len; JEntry meta; @@ -1713,7 +1713,7 @@ convertJsonbObject(StringInfo buffer, JEntry *header, JsonbValue *val, int level int i; int totallen; uint32 containerheader; - int nPairs = val->val.object.nPairs; + int nPairs = val->object.nPairs; /* Remember where in the buffer this object starts. */ base_offset = buffer->len; @@ -1738,7 +1738,7 @@ convertJsonbObject(StringInfo buffer, JEntry *header, JsonbValue *val, int level totallen = 0; for (i = 0; i < nPairs; i++) { - JsonbPair *pair = &val->val.object.pairs[i]; + JsonbPair *pair = &val->object.pairs[i]; int len; JEntry meta; @@ -1773,7 +1773,7 @@ convertJsonbObject(StringInfo buffer, JEntry *header, JsonbValue *val, int level } for (i = 0; i < nPairs; i++) { - JsonbPair *pair = &val->val.object.pairs[i]; + JsonbPair *pair = &val->object.pairs[i]; int len; JEntry meta; @@ -1834,22 +1834,22 @@ convertJsonbScalar(StringInfo buffer, JEntry *header, JsonbValue *scalarVal) break; case jbvString: - appendToBuffer(buffer, scalarVal->val.string.val, scalarVal->val.string.len); + appendToBuffer(buffer, scalarVal->string.val, scalarVal->string.len); - *header = scalarVal->val.string.len; + *header = scalarVal->string.len; break; case jbvNumeric: - numlen = VARSIZE_ANY(scalarVal->val.numeric); + numlen = VARSIZE_ANY(scalarVal->numeric); padlen = padBufferToInt(buffer); - appendToBuffer(buffer, scalarVal->val.numeric, numlen); + appendToBuffer(buffer, scalarVal->numeric, numlen); *header = JENTRY_ISNUMERIC | (padlen + numlen); break; case jbvBool: - *header = (scalarVal->val.boolean) ? + *header = (scalarVal->boolean) ? JENTRY_ISBOOL_TRUE : JENTRY_ISBOOL_FALSE; break; @@ -1859,9 +1859,9 @@ convertJsonbScalar(StringInfo buffer, JEntry *header, JsonbValue *scalarVal) size_t len; JsonEncodeDateTime(buf, - scalarVal->val.datetime.value, - scalarVal->val.datetime.typid, - &scalarVal->val.datetime.tz); + scalarVal->datetime.value, + scalarVal->datetime.typid, + &scalarVal->datetime.tz); len = strlen(buf); appendToBuffer(buffer, buf, len); @@ -1895,8 +1895,8 @@ lengthCompareJsonbStringValue(const void *a, const void *b) Assert(va->type == jbvString); Assert(vb->type == jbvString); - return lengthCompareJsonbString(va->val.string.val, va->val.string.len, - vb->val.string.val, vb->val.string.len); + return lengthCompareJsonbString(va->string.val, va->string.len, + vb->string.val, vb->string.len); } /* @@ -1956,8 +1956,8 @@ uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls) Assert(object->type == jbvObject); - if (object->val.object.nPairs > 1) - qsort_arg(object->val.object.pairs, object->val.object.nPairs, sizeof(JsonbPair), + if (object->object.nPairs > 1) + qsort_arg(object->object.pairs, object->object.nPairs, sizeof(JsonbPair), lengthCompareJsonbPair, &hasNonUniq); if (hasNonUniq && unique_keys) @@ -1970,20 +1970,20 @@ uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls) JsonbPair *ptr, *res; - while (skip_nulls && object->val.object.nPairs > 0 && - object->val.object.pairs->value.type == jbvNull) + while (skip_nulls && object->object.nPairs > 0 && + object->object.pairs->value.type == jbvNull) { /* If skip_nulls is true, remove leading items with null */ - object->val.object.pairs++; - object->val.object.nPairs--; + object->object.pairs++; + object->object.nPairs--; } - if (object->val.object.nPairs > 0) + if (object->object.nPairs > 0) { - ptr = object->val.object.pairs + 1; - res = object->val.object.pairs; + ptr = object->object.pairs + 1; + res = object->object.pairs; - while (ptr - object->val.object.pairs < object->val.object.nPairs) + while (ptr - object->object.pairs < object->object.nPairs) { /* Avoid copying over duplicate or null */ if (lengthCompareJsonbStringValue(ptr, res) != 0 && @@ -1996,7 +1996,7 @@ uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls) ptr++; } - object->val.object.nPairs = res + 1 - object->val.object.pairs; + object->object.nPairs = res + 1 - object->object.pairs; } } } diff --git a/src/backend/utils/adt/jsonbsubs.c b/src/backend/utils/adt/jsonbsubs.c index 8211de23d59..8231cde7dbe 100644 --- a/src/backend/utils/adt/jsonbsubs.c +++ b/src/backend/utils/adt/jsonbsubs.c @@ -289,13 +289,13 @@ jsonb_subscript_assign(ExprState *state, if (workspace->expectArray) { newSource.type = jbvArray; - newSource.val.array.nElems = 0; - newSource.val.array.rawScalar = false; + newSource.array.nElems = 0; + newSource.array.rawScalar = false; } else { newSource.type = jbvObject; - newSource.val.object.nPairs = 0; + newSource.object.nPairs = 0; } jsonbSource = JsonbValueToJsonb(&newSource); diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index c5e1a027956..adfdd487bcf 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -175,7 +175,7 @@ typedef struct CompositeIOData { /* * We use pointer to a RecordIOData here because variable-length struct - * RecordIOData can't be used directly in ColumnIOData.io union + * RecordIOData can't be used directly in ColumnIOData union */ RecordIOData *record_io; /* metadata cache for populate_record() */ TupleDesc tupdesc; /* cached tuple descriptor */ @@ -220,7 +220,7 @@ struct ColumnIOData ArrayIOData array; CompositeIOData composite; DomainIOData domain; - } io; /* metadata cache for various column type + }; /* metadata cache for various column type * categories */ }; @@ -303,7 +303,7 @@ typedef struct JsValue } json; /* json value */ JsonbValue *jsonb; /* jsonb value */ - } val; + }; } JsValue; typedef struct JsObject @@ -313,29 +313,29 @@ typedef struct JsObject { HTAB *json_hash; JsonbContainer *jsonb_cont; - } val; + }; } JsObject; /* useful macros for testing JsValue properties */ #define JsValueIsNull(jsv) \ ((jsv)->is_json ? \ - (!(jsv)->val.json.str || (jsv)->val.json.type == JSON_TOKEN_NULL) : \ - (!(jsv)->val.jsonb || (jsv)->val.jsonb->type == jbvNull)) + (!(jsv)->json.str || (jsv)->json.type == JSON_TOKEN_NULL) : \ + (!(jsv)->jsonb || (jsv)->jsonb->type == jbvNull)) #define JsValueIsString(jsv) \ - ((jsv)->is_json ? (jsv)->val.json.type == JSON_TOKEN_STRING \ - : ((jsv)->val.jsonb && (jsv)->val.jsonb->type == jbvString)) + ((jsv)->is_json ? (jsv)->json.type == JSON_TOKEN_STRING \ + : ((jsv)->jsonb && (jsv)->jsonb->type == jbvString)) #define JsObjectIsEmpty(jso) \ ((jso)->is_json \ - ? hash_get_num_entries((jso)->val.json_hash) == 0 \ - : ((jso)->val.jsonb_cont == NULL || \ - JsonContainerSize((jso)->val.jsonb_cont) == 0)) + ? hash_get_num_entries((jso)->json_hash) == 0 \ + : ((jso)->jsonb_cont == NULL || \ + JsonContainerSize((jso)->jsonb_cont) == 0)) #define JsObjectFree(jso) \ do { \ if ((jso)->is_json) \ - hash_destroy((jso)->val.json_hash); \ + hash_destroy((jso)->json_hash); \ } while (0) static int report_json_context(JsonLexContext *lex); @@ -610,9 +610,9 @@ jsonb_object_keys(PG_FUNCTION_ARGS) { char *cstr; - cstr = palloc(v.val.string.len + 1 * sizeof(char)); - memcpy(cstr, v.val.string.val, v.val.string.len); - cstr[v.val.string.len] = '\0'; + cstr = palloc(v.string.len + 1 * sizeof(char)); + memcpy(cstr, v.string.val, v.string.len); + cstr[v.string.len] = '\0'; state->result[state->result_count++] = cstr; } } @@ -1643,7 +1643,7 @@ jsonb_get_element(Jsonb *jb, Datum *path, int npath, bool *isnull, bool as_text) if (jbvp->type == jbvBinary) { - container = jbvp->val.binary.data; + container = jbvp->binary.data; have_object = JsonContainerIsObject(container); have_array = JsonContainerIsArray(container); Assert(!JsonContainerIsScalar(container)); @@ -1684,8 +1684,8 @@ jsonb_set_element(Jsonb *jb, Datum *path, int path_len, JsonbIterator *it; bool *path_nulls = palloc0(path_len * sizeof(bool)); - if (newval->type == jbvArray && newval->val.array.rawScalar) - *newval = newval->val.array.elems[0]; + if (newval->type == jbvArray && newval->array.rawScalar) + *newval = newval->array.elems[0]; it = JsonbIteratorInit(&jb->root); @@ -1755,8 +1755,8 @@ push_path(JsonbParseState **st, int level, Datum *path_elems, { /* text, an object is expected */ newkey.type = jbvString; - newkey.val.string.val = c; - newkey.val.string.len = strlen(c); + newkey.string.val = c; + newkey.string.len = strlen(c); (void) pushJsonbValue(st, WJB_BEGIN_OBJECT, NULL); (void) pushJsonbValue(st, WJB_KEY, &newkey); @@ -1810,20 +1810,20 @@ JsonbValueAsText(JsonbValue *v) return NULL; case jbvBool: - return v->val.boolean ? + return v->boolean ? cstring_to_text_with_len("true", 4) : cstring_to_text_with_len("false", 5); case jbvString: - return cstring_to_text_with_len(v->val.string.val, - v->val.string.len); + return cstring_to_text_with_len(v->string.val, + v->string.len); case jbvNumeric: { Datum cstr; cstr = DirectFunctionCall1(numeric_out, - PointerGetDatum(v->val.numeric)); + PointerGetDatum(v->numeric)); return cstring_to_text(DatumGetCString(cstr)); } @@ -1833,8 +1833,8 @@ JsonbValueAsText(JsonbValue *v) StringInfoData jtext; initStringInfo(&jtext); - (void) JsonbToCString(&jtext, v->val.binary.data, - v->val.binary.len); + (void) JsonbToCString(&jtext, v->binary.data, + v->binary.len); return cstring_to_text_with_len(jtext.data, jtext.len); } @@ -2010,7 +2010,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) /* Use the tmp context so we can clean up after each tuple is done */ old_cxt = MemoryContextSwitchTo(tmp_cxt); - key = cstring_to_text_with_len(v.val.string.val, v.val.string.len); + key = cstring_to_text_with_len(v.string.val, v.string.len); /* * The next thing the iterator fetches should be the value, no @@ -2720,24 +2720,24 @@ populate_array_element_end(void *_state, bool isnull) JsValue jsv; jsv.is_json = true; - jsv.val.json.type = state->element_type; + jsv.json.type = state->element_type; if (isnull) { - Assert(jsv.val.json.type == JSON_TOKEN_NULL); - jsv.val.json.str = NULL; - jsv.val.json.len = 0; + Assert(jsv.json.type == JSON_TOKEN_NULL); + jsv.json.str = NULL; + jsv.json.len = 0; } else if (state->element_scalar) { - jsv.val.json.str = state->element_scalar; - jsv.val.json.len = -1; /* null-terminated */ + jsv.json.str = state->element_scalar; + jsv.json.len = -1; /* null-terminated */ } else { - jsv.val.json.str = state->element_start; - jsv.val.json.len = (state->lex->prev_token_terminator - - state->element_start) * sizeof(char); + jsv.json.str = state->element_start; + jsv.json.len = (state->lex->prev_token_terminator - + state->element_start) * sizeof(char); } /* Report if an error occurred. */ @@ -2826,7 +2826,7 @@ populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ JsonbValue *jbv, /* jsonb sub-array */ int ndim) /* current dimension */ { - JsonbContainer *jbc = jbv->val.binary.data; + JsonbContainer *jbc = jbv->binary.data; JsonbIterator *it; JsonbIteratorToken tok; JsonbValue val; @@ -2860,14 +2860,14 @@ populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ (tok == WJB_END_ARRAY || (tok == WJB_ELEM && (val.type != jbvBinary || - !JsonContainerIsArray(val.val.binary.data))))) + !JsonContainerIsArray(val.binary.data))))) { if (!populate_array_assign_ndims(ctx, ndim)) return false; } jsv.is_json = false; - jsv.val.jsonb = &val; + jsv.jsonb = &val; /* process all the array elements */ while (tok == WJB_ELEM) @@ -2937,9 +2937,9 @@ populate_array(ArrayIOData *aio, if (jsv->is_json) { /* Return null if an error was found. */ - if (!populate_array_json(&ctx, jsv->val.json.str, - jsv->val.json.len >= 0 ? jsv->val.json.len - : strlen(jsv->val.json.str))) + if (!populate_array_json(&ctx, jsv->json.str, + jsv->json.len >= 0 ? jsv->json.len + : strlen(jsv->json.str))) { *isnull = true; return (Datum) 0; @@ -2948,7 +2948,7 @@ populate_array(ArrayIOData *aio, else { /* Return null if an error was found. */ - if (!populate_array_dim_jsonb(&ctx, jsv->val.jsonb, 1)) + if (!populate_array_dim_jsonb(&ctx, jsv->jsonb, 1)) { *isnull = true; return (Datum) 0; @@ -2986,23 +2986,23 @@ JsValueToJsObject(JsValue *jsv, JsObject *jso, Node *escontext) if (jsv->is_json) { /* convert plain-text json into a hash table */ - jso->val.json_hash = - get_json_object_as_hash(jsv->val.json.str, - jsv->val.json.len >= 0 - ? jsv->val.json.len - : strlen(jsv->val.json.str), + jso->json_hash = + get_json_object_as_hash(jsv->json.str, + jsv->json.len >= 0 + ? jsv->json.len + : strlen(jsv->json.str), "populate_composite", escontext); - Assert(jso->val.json_hash != NULL || SOFT_ERROR_OCCURRED(escontext)); + Assert(jso->json_hash != NULL || SOFT_ERROR_OCCURRED(escontext)); } else { - JsonbValue *jbv = jsv->val.jsonb; + JsonbValue *jbv = jsv->jsonb; if (jbv->type == jbvBinary && - JsonContainerIsObject(jbv->val.binary.data)) + JsonContainerIsObject(jbv->binary.data)) { - jso->val.jsonb_cont = jbv->val.binary.data; + jso->jsonb_cont = jbv->binary.data; } else { @@ -3010,7 +3010,7 @@ JsValueToJsObject(JsValue *jsv, JsObject *jso, Node *escontext) is_scalar = IsAJsonbScalar(jbv) || (jbv->type == jbvBinary && - JsonContainerIsScalar(jbv->val.binary.data)); + JsonContainerIsScalar(jbv->binary.data)); errsave(escontext, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), is_scalar @@ -3131,14 +3131,14 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv, if (jsv->is_json) { - int len = jsv->val.json.len; + int len = jsv->json.len; - json = jsv->val.json.str; + json = jsv->json.str; Assert(json); /* If converting to json/jsonb, make string into valid JSON literal */ if ((typid == JSONOID || typid == JSONBOID) && - jsv->val.json.type == JSON_TOKEN_STRING) + jsv->json.type == JSON_TOKEN_STRING) { StringInfoData buf; @@ -3164,10 +3164,10 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv, } else { - JsonbValue *jbv = jsv->val.jsonb; + JsonbValue *jbv = jsv->jsonb; if (jbv->type == jbvString && omit_quotes) - str = pnstrdup(jbv->val.string.val, jbv->val.string.len); + str = pnstrdup(jbv->string.val, jbv->string.len); else if (typid == JSONBOID) { Jsonb *jsonb = JsonbValueToJsonb(jbv); /* directly use jsonb */ @@ -3186,15 +3186,15 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv, str = JsonbToCString(NULL, &jsonb->root, VARSIZE(jsonb)); } else if (jbv->type == jbvString) /* quotes are stripped */ - str = pnstrdup(jbv->val.string.val, jbv->val.string.len); + str = pnstrdup(jbv->string.val, jbv->string.len); else if (jbv->type == jbvBool) - str = pstrdup(jbv->val.boolean ? "true" : "false"); + str = pstrdup(jbv->boolean ? "true" : "false"); else if (jbv->type == jbvNumeric) str = DatumGetCString(DirectFunctionCall1(numeric_out, - PointerGetDatum(jbv->val.numeric))); + PointerGetDatum(jbv->numeric))); else if (jbv->type == jbvBinary) - str = JsonbToCString(NULL, jbv->val.binary.data, - jbv->val.binary.len); + str = JsonbToCString(NULL, jbv->binary.data, + jbv->binary.len); else elog(ERROR, "unrecognized jsonb type: %d", (int) jbv->type); } @@ -3280,40 +3280,40 @@ prepare_column_cache(ColumnIOData *column, { /* domain over composite has its own code path */ column->typcat = TYPECAT_COMPOSITE_DOMAIN; - column->io.composite.record_io = NULL; - column->io.composite.tupdesc = NULL; - column->io.composite.base_typid = base_typid; - column->io.composite.base_typmod = base_typmod; - column->io.composite.domain_info = NULL; + column->composite.record_io = NULL; + column->composite.tupdesc = NULL; + column->composite.base_typid = base_typid; + column->composite.base_typmod = base_typmod; + column->composite.domain_info = NULL; } else { /* domain over anything else */ column->typcat = TYPECAT_DOMAIN; - column->io.domain.base_typid = base_typid; - column->io.domain.base_typmod = base_typmod; - column->io.domain.base_io = + column->domain.base_typid = base_typid; + column->domain.base_typmod = base_typmod; + column->domain.base_io = MemoryContextAllocZero(mcxt, sizeof(ColumnIOData)); - column->io.domain.domain_info = NULL; + column->domain.domain_info = NULL; } } else if (type->typtype == TYPTYPE_COMPOSITE || typid == RECORDOID) { column->typcat = TYPECAT_COMPOSITE; - column->io.composite.record_io = NULL; - column->io.composite.tupdesc = NULL; - column->io.composite.base_typid = typid; - column->io.composite.base_typmod = typmod; - column->io.composite.domain_info = NULL; + column->composite.record_io = NULL; + column->composite.tupdesc = NULL; + column->composite.base_typid = typid; + column->composite.base_typmod = typmod; + column->composite.domain_info = NULL; } else if (IsTrueArrayType(type)) { column->typcat = TYPECAT_ARRAY; - column->io.array.element_info = MemoryContextAllocZero(mcxt, - sizeof(ColumnIOData)); - column->io.array.element_type = type->typelem; + column->array.element_info = MemoryContextAllocZero(mcxt, + sizeof(ColumnIOData)); + column->array.element_type = type->typelem; /* array element typemod stored in attribute's typmod */ - column->io.array.element_typmod = typmod; + column->array.element_typmod = typmod; } else { @@ -3356,24 +3356,24 @@ json_populate_type(Datum json_val, Oid json_type, if (*isnull) { if (jsv.is_json) - jsv.val.json.str = NULL; + jsv.json.str = NULL; else - jsv.val.jsonb = NULL; + jsv.jsonb = NULL; } else if (jsv.is_json) { text *json = DatumGetTextPP(json_val); - jsv.val.json.str = VARDATA_ANY(json); - jsv.val.json.len = VARSIZE_ANY_EXHDR(json); - jsv.val.json.type = JSON_TOKEN_INVALID; /* not used in - * populate_composite() */ + jsv.json.str = VARDATA_ANY(json); + jsv.json.len = VARSIZE_ANY_EXHDR(json); + jsv.json.type = JSON_TOKEN_INVALID; /* not used in + * populate_composite() */ } else { Jsonb *jsonb = DatumGetJsonbP(json_val); - jsv.val.jsonb = &jbv; + jsv.jsonb = &jbv; if (omit_quotes) { @@ -3381,15 +3381,15 @@ json_populate_type(Datum json_val, Oid json_type, /* fill the quote-stripped string */ jbv.type = jbvString; - jbv.val.string.len = strlen(str); - jbv.val.string.val = str; + jbv.string.len = strlen(str); + jbv.string.val = str; } else { /* fill binary jsonb value pointing to jb */ jbv.type = jbvBinary; - jbv.val.binary.data = &jsonb->root; - jbv.val.binary.len = VARSIZE(jsonb) - VARHDRSZ; + jbv.binary.data = &jsonb->root; + jbv.binary.len = VARSIZE(jsonb) - VARHDRSZ; } } @@ -3449,12 +3449,12 @@ populate_record_field(ColumnIOData *col, isnull, escontext, omit_scalar_quotes); case TYPECAT_ARRAY: - return populate_array(&col->io.array, colname, mcxt, jsv, + return populate_array(&col->array, colname, mcxt, jsv, isnull, escontext); case TYPECAT_COMPOSITE: case TYPECAT_COMPOSITE_DOMAIN: - return populate_composite(&col->io.composite, typid, + return populate_composite(&col->composite, typid, colname, mcxt, DatumGetPointer(defaultval) ? DatumGetHeapTupleHeader(defaultval) @@ -3463,7 +3463,7 @@ populate_record_field(ColumnIOData *col, escontext); case TYPECAT_DOMAIN: - return populate_domain(&col->io.domain, typid, colname, mcxt, + return populate_domain(&col->domain, typid, colname, mcxt, jsv, isnull, escontext, omit_scalar_quotes); default: @@ -3495,23 +3495,23 @@ JsObjectGetField(JsObject *obj, char *field, JsValue *jsv) if (jsv->is_json) { - JsonHashEntry *hashentry = hash_search(obj->val.json_hash, field, + JsonHashEntry *hashentry = hash_search(obj->json_hash, field, HASH_FIND, NULL); - jsv->val.json.type = hashentry ? hashentry->type : JSON_TOKEN_NULL; - jsv->val.json.str = jsv->val.json.type == JSON_TOKEN_NULL ? NULL : + jsv->json.type = hashentry ? hashentry->type : JSON_TOKEN_NULL; + jsv->json.str = jsv->json.type == JSON_TOKEN_NULL ? NULL : hashentry->val; - jsv->val.json.len = jsv->val.json.str ? -1 : 0; /* null-terminated */ + jsv->json.len = jsv->json.str ? -1 : 0; /* null-terminated */ return hashentry != NULL; } else { - jsv->val.jsonb = !obj->val.jsonb_cont ? NULL : - getKeyJsonValueFromContainer(obj->val.jsonb_cont, field, strlen(field), + jsv->jsonb = !obj->jsonb_cont ? NULL : + getKeyJsonValueFromContainer(obj->jsonb_cont, field, strlen(field), NULL); - return jsv->val.jsonb != NULL; + return jsv->jsonb != NULL; } } @@ -3680,14 +3680,14 @@ get_record_type_from_query(FunctionCallInfo fcinfo, cache->argtype = tupdesc->tdtypeid; /* If we go through this more than once, avoid memory leak */ - if (cache->c.io.composite.tupdesc) - FreeTupleDesc(cache->c.io.composite.tupdesc); + if (cache->c.composite.tupdesc) + FreeTupleDesc(cache->c.composite.tupdesc); /* Save identified tupdesc */ old_cxt = MemoryContextSwitchTo(cache->fn_mcxt); - cache->c.io.composite.tupdesc = CreateTupleDescCopy(tupdesc); - cache->c.io.composite.base_typid = tupdesc->tdtypeid; - cache->c.io.composite.base_typmod = tupdesc->tdtypmod; + cache->c.composite.tupdesc = CreateTupleDescCopy(tupdesc); + cache->c.composite.base_typid = tupdesc->tdtypeid; + cache->c.composite.base_typmod = tupdesc->tdtypmod; MemoryContextSwitchTo(old_cxt); } @@ -3739,8 +3739,8 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname, */ if (cache->argtype == RECORDOID) { - cache->c.io.composite.base_typid = HeapTupleHeaderGetTypeId(rec); - cache->c.io.composite.base_typmod = HeapTupleHeaderGetTypMod(rec); + cache->c.composite.base_typid = HeapTupleHeaderGetTypeId(rec); + cache->c.composite.base_typmod = HeapTupleHeaderGetTypMod(rec); } } else @@ -3774,25 +3774,25 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname, { text *json = PG_GETARG_TEXT_PP(json_arg_num); - jsv.val.json.str = VARDATA_ANY(json); - jsv.val.json.len = VARSIZE_ANY_EXHDR(json); - jsv.val.json.type = JSON_TOKEN_INVALID; /* not used in - * populate_composite() */ + jsv.json.str = VARDATA_ANY(json); + jsv.json.len = VARSIZE_ANY_EXHDR(json); + jsv.json.type = JSON_TOKEN_INVALID; /* not used in + * populate_composite() */ } else { Jsonb *jb = PG_GETARG_JSONB_P(json_arg_num); - jsv.val.jsonb = &jbv; + jsv.jsonb = &jbv; /* fill binary jsonb value pointing to jb */ jbv.type = jbvBinary; - jbv.val.binary.data = &jb->root; - jbv.val.binary.len = VARSIZE(jb) - VARHDRSZ; + jbv.binary.data = &jb->root; + jbv.binary.len = VARSIZE(jb) - VARHDRSZ; } isnull = false; - rettuple = populate_composite(&cache->c.io.composite, cache->argtype, + rettuple = populate_composite(&cache->c.composite, cache->argtype, NULL, fnmcxt, rec, &jsv, &isnull, escontext); Assert(!isnull || SOFT_ERROR_OCCURRED(escontext)); @@ -4006,11 +4006,11 @@ populate_recordset_record(PopulateRecordsetState *state, JsObject *obj) HeapTupleData tuple; /* acquire/update cached tuple descriptor */ - update_cached_tupdesc(&cache->c.io.composite, cache->fn_mcxt); + update_cached_tupdesc(&cache->c.composite, cache->fn_mcxt); /* replace record fields from json */ - tuphead = populate_record(cache->c.io.composite.tupdesc, - &cache->c.io.composite.record_io, + tuphead = populate_record(cache->c.composite.tupdesc, + &cache->c.composite.record_io, state->rec, cache->fn_mcxt, obj, @@ -4020,7 +4020,7 @@ populate_recordset_record(PopulateRecordsetState *state, JsObject *obj) if (cache->c.typcat == TYPECAT_COMPOSITE_DOMAIN) (void) domain_check_safe(HeapTupleHeaderGetDatum(tuphead), false, cache->argtype, - &cache->c.io.composite.domain_info, + &cache->c.composite.domain_info, cache->fn_mcxt, NULL); @@ -4092,8 +4092,8 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, */ if (cache->argtype == RECORDOID) { - cache->c.io.composite.base_typid = HeapTupleHeaderGetTypeId(rec); - cache->c.io.composite.base_typmod = HeapTupleHeaderGetTypMod(rec); + cache->c.composite.base_typid = HeapTupleHeaderGetTypeId(rec); + cache->c.composite.base_typmod = HeapTupleHeaderGetTypMod(rec); } } else @@ -4120,7 +4120,7 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, * Forcibly update the cached tupdesc, to ensure we have the right tupdesc * to return even if the JSON contains no rows. */ - update_cached_tupdesc(&cache->c.io.composite, cache->fn_mcxt); + update_cached_tupdesc(&cache->c.composite, cache->fn_mcxt); state = palloc0(sizeof(PopulateRecordsetState)); @@ -4186,14 +4186,14 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, JsObject obj; if (v.type != jbvBinary || - !JsonContainerIsObject(v.val.binary.data)) + !JsonContainerIsObject(v.binary.data)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("argument of %s must be an array of objects", funcname))); obj.is_json = false; - obj.val.jsonb_cont = v.val.binary.data; + obj.jsonb_cont = v.binary.data; populate_recordset_record(state, &obj); } @@ -4206,7 +4206,7 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, * we're called again in the same query. */ rsi->setResult = state->tuple_store; - rsi->setDesc = CreateTupleDescCopy(cache->c.io.composite.tupdesc); + rsi->setDesc = CreateTupleDescCopy(cache->c.composite.tupdesc); PG_RETURN_NULL(); } @@ -4252,7 +4252,7 @@ populate_recordset_object_end(void *state) return JSON_SUCCESS; obj.is_json = true; - obj.val.json_hash = _state->json_hash; + obj.json_hash = _state->json_hash; /* Otherwise, construct and return a tuple based on this level-1 object */ populate_recordset_record(_state, &obj); @@ -4689,8 +4689,8 @@ jsonb_delete(PG_FUNCTION_ARGS) skipNested = true; if ((r == WJB_ELEM || r == WJB_KEY) && - (v.type == jbvString && keylen == v.val.string.len && - memcmp(keyptr, v.val.string.val, keylen) == 0)) + (v.type == jbvString && keylen == v.string.len && + memcmp(keyptr, v.string.val, keylen) == 0)) { /* skip corresponding value as well */ if (r == WJB_KEY) @@ -4768,8 +4768,8 @@ jsonb_delete_array(PG_FUNCTION_ARGS) /* We rely on the array elements not being toasted */ keyptr = VARDATA_ANY(DatumGetPointer(keys_elems[i])); keylen = VARSIZE_ANY_EXHDR(DatumGetPointer(keys_elems[i])); - if (keylen == v.val.string.len && - memcmp(keyptr, v.val.string.val, keylen) == 0) + if (keylen == v.string.len && + memcmp(keyptr, v.string.val, keylen) == 0) { found = true; break; @@ -4830,7 +4830,7 @@ jsonb_delete_idx(PG_FUNCTION_ARGS) r = JsonbIteratorNext(&it, &v, false); Assert(r == WJB_BEGIN_ARRAY); - n = v.val.array.nElems; + n = v.array.nElems; if (idx < 0) { @@ -5230,7 +5230,7 @@ setPath(JsonbIterator **it, Datum *path_elems, * an object or an array, not raw scalar. */ if ((op_type & JB_PATH_FILL_GAPS) && (level <= path_len - 1) && - v.val.array.rawScalar) + v.array.rawScalar) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot replace existing key"), @@ -5239,7 +5239,7 @@ setPath(JsonbIterator **it, Datum *path_elems, (void) pushJsonbValue(st, r, NULL); setPathArray(it, path_elems, path_nulls, path_len, st, level, - newval, v.val.array.nElems, op_type); + newval, v.array.nElems, op_type); r = JsonbIteratorNext(it, &v, false); Assert(r == WJB_END_ARRAY); res = pushJsonbValue(st, r, NULL); @@ -5247,7 +5247,7 @@ setPath(JsonbIterator **it, Datum *path_elems, case WJB_BEGIN_OBJECT: (void) pushJsonbValue(st, r, NULL); setPathObject(it, path_elems, path_nulls, path_len, st, level, - newval, v.val.object.nPairs, op_type); + newval, v.object.nPairs, op_type); r = JsonbIteratorNext(it, &v, true); Assert(r == WJB_END_OBJECT); res = pushJsonbValue(st, r, NULL); @@ -5308,8 +5308,8 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls, JsonbValue newkey; newkey.type = jbvString; - newkey.val.string.val = VARDATA_ANY(pathelem); - newkey.val.string.len = VARSIZE_ANY_EXHDR(pathelem); + newkey.string.val = VARDATA_ANY(pathelem); + newkey.string.len = VARSIZE_ANY_EXHDR(pathelem); (void) pushJsonbValue(st, WJB_KEY, &newkey); (void) pushJsonbValue(st, WJB_VALUE, newval); @@ -5322,9 +5322,9 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls, Assert(r == WJB_KEY); if (!done && - k.val.string.len == VARSIZE_ANY_EXHDR(pathelem) && - memcmp(k.val.string.val, VARDATA_ANY(pathelem), - k.val.string.len) == 0) + k.string.len == VARSIZE_ANY_EXHDR(pathelem) && + memcmp(k.string.val, VARDATA_ANY(pathelem), + k.string.len) == 0) { done = true; @@ -5363,8 +5363,8 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls, JsonbValue newkey; newkey.type = jbvString; - newkey.val.string.val = VARDATA_ANY(pathelem); - newkey.val.string.len = VARSIZE_ANY_EXHDR(pathelem); + newkey.string.val = VARDATA_ANY(pathelem); + newkey.string.len = VARSIZE_ANY_EXHDR(pathelem); (void) pushJsonbValue(st, WJB_KEY, &newkey); (void) pushJsonbValue(st, WJB_VALUE, newval); @@ -5407,8 +5407,8 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls, JsonbValue newkey; newkey.type = jbvString; - newkey.val.string.val = VARDATA_ANY(pathelem); - newkey.val.string.len = VARSIZE_ANY_EXHDR(pathelem); + newkey.string.val = VARDATA_ANY(pathelem); + newkey.string.len = VARSIZE_ANY_EXHDR(pathelem); (void) pushJsonbValue(st, WJB_KEY, &newkey); (void) push_path(st, level, path_elems, path_nulls, @@ -5621,26 +5621,26 @@ parse_jsonb_index_flags(Jsonb *jb) errmsg("flag array element is not a string"), errhint("Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"."))); - if (v.val.string.len == 3 && - pg_strncasecmp(v.val.string.val, "all", 3) == 0) + if (v.string.len == 3 && + pg_strncasecmp(v.string.val, "all", 3) == 0) flags |= jtiAll; - else if (v.val.string.len == 3 && - pg_strncasecmp(v.val.string.val, "key", 3) == 0) + else if (v.string.len == 3 && + pg_strncasecmp(v.string.val, "key", 3) == 0) flags |= jtiKey; - else if (v.val.string.len == 6 && - pg_strncasecmp(v.val.string.val, "string", 6) == 0) + else if (v.string.len == 6 && + pg_strncasecmp(v.string.val, "string", 6) == 0) flags |= jtiString; - else if (v.val.string.len == 7 && - pg_strncasecmp(v.val.string.val, "numeric", 7) == 0) + else if (v.string.len == 7 && + pg_strncasecmp(v.string.val, "numeric", 7) == 0) flags |= jtiNumeric; - else if (v.val.string.len == 7 && - pg_strncasecmp(v.val.string.val, "boolean", 7) == 0) + else if (v.string.len == 7 && + pg_strncasecmp(v.string.val, "boolean", 7) == 0) flags |= jtiBool; else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("wrong flag in flag array: \"%s\"", - pnstrdup(v.val.string.val, v.val.string.len)), + pnstrdup(v.string.val, v.string.len)), errhint("Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"."))); } @@ -5679,7 +5679,7 @@ iterate_jsonb_values(Jsonb *jb, uint32 flags, void *state, if (type == WJB_KEY) { if (flags & jtiKey) - action(state, v.val.string.val, v.val.string.len); + action(state, v.string.val, v.string.len); continue; } @@ -5694,7 +5694,7 @@ iterate_jsonb_values(Jsonb *jb, uint32 flags, void *state, { case jbvString: if (flags & jtiString) - action(state, v.val.string.val, v.val.string.len); + action(state, v.string.val, v.string.len); break; case jbvNumeric: if (flags & jtiNumeric) @@ -5702,7 +5702,7 @@ iterate_jsonb_values(Jsonb *jb, uint32 flags, void *state, char *val; val = DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(v.val.numeric))); + NumericGetDatum(v.numeric))); action(state, val, strlen(val)); pfree(val); @@ -5711,7 +5711,7 @@ iterate_jsonb_values(Jsonb *jb, uint32 flags, void *state, case jbvBool: if (flags & jtiBool) { - if (v.val.boolean) + if (v.boolean) action(state, "true", 4); else action(state, "false", 5); @@ -5821,11 +5821,11 @@ transform_jsonb_string_values(Jsonb *jsonb, void *action_state, { if ((type == WJB_VALUE || type == WJB_ELEM) && v.type == jbvString) { - out = transform_action(action_state, v.val.string.val, v.val.string.len); + out = transform_action(action_state, v.string.val, v.string.len); /* out is probably not toasted, but let's be sure */ out = pg_detoast_datum_packed(out); - v.val.string.val = VARDATA_ANY(out); - v.val.string.len = VARSIZE_ANY_EXHDR(out); + v.string.val = VARDATA_ANY(out); + v.string.len = VARSIZE_ANY_EXHDR(out); res = pushJsonbValue(&st, type, type < WJB_BEGIN_ARRAY ? &v : NULL); } else @@ -5837,7 +5837,7 @@ transform_jsonb_string_values(Jsonb *jsonb, void *action_state, } if (res->type == jbvArray) - res->val.array.rawScalar = is_scalar; + res->array.rawScalar = is_scalar; return JsonbValueToJsonb(res); } diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c index 762f7e8a09d..65172405b6a 100644 --- a/src/backend/utils/adt/jsonpath.c +++ b/src/backend/utils/adt/jsonpath.c @@ -269,19 +269,19 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, case jpiString: case jpiVariable: case jpiKey: - appendBinaryStringInfo(buf, &item->value.string.len, - sizeof(item->value.string.len)); - appendBinaryStringInfo(buf, item->value.string.val, - item->value.string.len); + appendBinaryStringInfo(buf, &item->string.len, + sizeof(item->string.len)); + appendBinaryStringInfo(buf, item->string.val, + item->string.len); appendStringInfoChar(buf, '\0'); break; case jpiNumeric: - appendBinaryStringInfo(buf, item->value.numeric, - VARSIZE(item->value.numeric)); + appendBinaryStringInfo(buf, item->numeric, + VARSIZE(item->numeric)); break; case jpiBool: - appendBinaryStringInfo(buf, &item->value.boolean, - sizeof(item->value.boolean)); + appendBinaryStringInfo(buf, &item->boolean, + sizeof(item->boolean)); break; case jpiAnd: case jpiOr: @@ -307,19 +307,19 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, int32 left = reserveSpaceForItemPointer(buf); int32 right = reserveSpaceForItemPointer(buf); - if (!item->value.args.left) + if (!item->args.left) chld = pos; else if (!flattenJsonPathParseItem(buf, &chld, escontext, - item->value.args.left, + item->args.left, nestingLevel + argNestingLevel, insideArraySubscript)) return false; *(int32 *) (buf->data + left) = chld - pos; - if (!item->value.args.right) + if (!item->args.right) chld = pos; else if (!flattenJsonPathParseItem(buf, &chld, escontext, - item->value.args.right, + item->args.right, nestingLevel + argNestingLevel, insideArraySubscript)) return false; @@ -331,18 +331,18 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, int32 offs; appendBinaryStringInfo(buf, - &item->value.like_regex.flags, - sizeof(item->value.like_regex.flags)); + &item->like_regex.flags, + sizeof(item->like_regex.flags)); offs = reserveSpaceForItemPointer(buf); appendBinaryStringInfo(buf, - &item->value.like_regex.patternlen, - sizeof(item->value.like_regex.patternlen)); - appendBinaryStringInfo(buf, item->value.like_regex.pattern, - item->value.like_regex.patternlen); + &item->like_regex.patternlen, + sizeof(item->like_regex.patternlen)); + appendBinaryStringInfo(buf, item->like_regex.pattern, + item->like_regex.patternlen); appendStringInfoChar(buf, '\0'); if (!flattenJsonPathParseItem(buf, &chld, escontext, - item->value.like_regex.expr, + item->like_regex.expr, nestingLevel, insideArraySubscript)) return false; @@ -365,10 +365,10 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, { int32 arg = reserveSpaceForItemPointer(buf); - if (!item->value.arg) + if (!item->arg) chld = pos; else if (!flattenJsonPathParseItem(buf, &chld, escontext, - item->value.arg, + item->arg, nestingLevel + argNestingLevel, insideArraySubscript)) return false; @@ -396,7 +396,7 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, break; case jpiIndexArray: { - int32 nelems = item->value.array.nelems; + int32 nelems = item->array.nelems; int offset; int i; @@ -413,15 +413,15 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, int32 frompos; if (!flattenJsonPathParseItem(buf, &frompos, escontext, - item->value.array.elems[i].from, + item->array.elems[i].from, nestingLevel, true)) return false; frompos -= pos; - if (item->value.array.elems[i].to) + if (item->array.elems[i].to) { if (!flattenJsonPathParseItem(buf, &topos, escontext, - item->value.array.elems[i].to, + item->array.elems[i].to, nestingLevel, true)) return false; topos -= pos; @@ -438,11 +438,11 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, break; case jpiAny: appendBinaryStringInfo(buf, - &item->value.anybounds.first, - sizeof(item->value.anybounds.first)); + &item->anybounds.first, + sizeof(item->anybounds.first)); appendBinaryStringInfo(buf, - &item->value.anybounds.last, - sizeof(item->value.anybounds.last)); + &item->anybounds.last, + sizeof(item->anybounds.last)); break; case jpiType: case jpiSize: @@ -617,7 +617,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, break; case jpiIndexArray: appendStringInfoChar(buf, '['); - for (i = 0; i < v->content.array.nelems; i++) + for (i = 0; i < v->array.nelems; i++) { JsonPathItem from; JsonPathItem to; @@ -640,27 +640,27 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, if (inKey) appendStringInfoChar(buf, '.'); - if (v->content.anybounds.first == 0 && - v->content.anybounds.last == PG_UINT32_MAX) + if (v->anybounds.first == 0 && + v->anybounds.last == PG_UINT32_MAX) appendStringInfoString(buf, "**"); - else if (v->content.anybounds.first == v->content.anybounds.last) + else if (v->anybounds.first == v->anybounds.last) { - if (v->content.anybounds.first == PG_UINT32_MAX) + if (v->anybounds.first == PG_UINT32_MAX) appendStringInfoString(buf, "**{last}"); else appendStringInfo(buf, "**{%u}", - v->content.anybounds.first); + v->anybounds.first); } - else if (v->content.anybounds.first == PG_UINT32_MAX) + else if (v->anybounds.first == PG_UINT32_MAX) appendStringInfo(buf, "**{last to %u}", - v->content.anybounds.last); - else if (v->content.anybounds.last == PG_UINT32_MAX) + v->anybounds.last); + else if (v->anybounds.last == PG_UINT32_MAX) appendStringInfo(buf, "**{%u to last}", - v->content.anybounds.first); + v->anybounds.first); else appendStringInfo(buf, "**{%u to %u}", - v->content.anybounds.first, - v->content.anybounds.last); + v->anybounds.first, + v->anybounds.last); break; case jpiKey: if (inKey) @@ -713,7 +713,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, break; case jpiDatetime: appendStringInfoString(buf, ".datetime("); - if (v->content.arg) + if (v->arg) { jspGetArg(v, &elem); printJsonPathItem(buf, &elem, false, false); @@ -730,7 +730,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, if (printBracketes) appendStringInfoChar(buf, '('); - jspInitByBuffer(&elem, v->base, v->content.like_regex.expr); + jspInitByBuffer(&elem, v->base, v->like_regex.expr); printJsonPathItem(buf, &elem, false, operationPriority(elem.type) <= operationPriority(v->type)); @@ -738,22 +738,22 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, appendStringInfoString(buf, " like_regex "); escape_json_with_len(buf, - v->content.like_regex.pattern, - v->content.like_regex.patternlen); + v->like_regex.pattern, + v->like_regex.patternlen); - if (v->content.like_regex.flags) + if (v->like_regex.flags) { appendStringInfoString(buf, " flag \""); - if (v->content.like_regex.flags & JSP_REGEX_ICASE) + if (v->like_regex.flags & JSP_REGEX_ICASE) appendStringInfoChar(buf, 'i'); - if (v->content.like_regex.flags & JSP_REGEX_DOTALL) + if (v->like_regex.flags & JSP_REGEX_DOTALL) appendStringInfoChar(buf, 's'); - if (v->content.like_regex.flags & JSP_REGEX_MLINE) + if (v->like_regex.flags & JSP_REGEX_MLINE) appendStringInfoChar(buf, 'm'); - if (v->content.like_regex.flags & JSP_REGEX_WSPACE) + if (v->like_regex.flags & JSP_REGEX_WSPACE) appendStringInfoChar(buf, 'x'); - if (v->content.like_regex.flags & JSP_REGEX_QUOTE) + if (v->like_regex.flags & JSP_REGEX_QUOTE) appendStringInfoChar(buf, 'q'); appendStringInfoChar(buf, '"'); @@ -773,12 +773,12 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, break; case jpiDecimal: appendStringInfoString(buf, ".decimal("); - if (v->content.args.left) + if (v->args.left) { jspGetLeftArg(v, &elem); printJsonPathItem(buf, &elem, false, false); } - if (v->content.args.right) + if (v->args.right) { appendStringInfoChar(buf, ','); jspGetRightArg(v, &elem); @@ -797,7 +797,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, break; case jpiTime: appendStringInfoString(buf, ".time("); - if (v->content.arg) + if (v->arg) { jspGetArg(v, &elem); printJsonPathItem(buf, &elem, false, false); @@ -806,7 +806,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, break; case jpiTimeTz: appendStringInfoString(buf, ".time_tz("); - if (v->content.arg) + if (v->arg) { jspGetArg(v, &elem); printJsonPathItem(buf, &elem, false, false); @@ -815,7 +815,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, break; case jpiTimestamp: appendStringInfoString(buf, ".timestamp("); - if (v->content.arg) + if (v->arg) { jspGetArg(v, &elem); printJsonPathItem(buf, &elem, false, false); @@ -824,7 +824,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, break; case jpiTimestampTz: appendStringInfoString(buf, ".timestamp_tz("); - if (v->content.arg) + if (v->arg) { jspGetArg(v, &elem); printJsonPathItem(buf, &elem, false, false); @@ -1020,11 +1020,11 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) case jpiString: case jpiKey: case jpiVariable: - read_int32(v->content.value.datalen, base, pos); + read_int32(v->value.datalen, base, pos); /* FALLTHROUGH */ case jpiNumeric: case jpiBool: - v->content.value.data = base + pos; + v->value.data = base + pos; break; case jpiAnd: case jpiOr: @@ -1041,8 +1041,8 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) case jpiMod: case jpiStartsWith: case jpiDecimal: - read_int32(v->content.args.left, base, pos); - read_int32(v->content.args.right, base, pos); + read_int32(v->args.left, base, pos); + read_int32(v->args.right, base, pos); break; case jpiNot: case jpiIsUnknown: @@ -1055,22 +1055,22 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) case jpiTimeTz: case jpiTimestamp: case jpiTimestampTz: - read_int32(v->content.arg, base, pos); + read_int32(v->arg, base, pos); break; case jpiIndexArray: - read_int32(v->content.array.nelems, base, pos); - read_int32_n(v->content.array.elems, base, pos, - v->content.array.nelems * 2); + read_int32(v->array.nelems, base, pos); + read_int32_n(v->array.elems, base, pos, + v->array.nelems * 2); break; case jpiAny: - read_int32(v->content.anybounds.first, base, pos); - read_int32(v->content.anybounds.last, base, pos); + read_int32(v->anybounds.first, base, pos); + read_int32(v->anybounds.last, base, pos); break; case jpiLikeRegex: - read_int32(v->content.like_regex.flags, base, pos); - read_int32(v->content.like_regex.expr, base, pos); - read_int32(v->content.like_regex.patternlen, base, pos); - v->content.like_regex.pattern = base + pos; + read_int32(v->like_regex.flags, base, pos); + read_int32(v->like_regex.expr, base, pos); + read_int32(v->like_regex.patternlen, base, pos); + v->like_regex.pattern = base + pos; break; default: elog(ERROR, "unrecognized jsonpath item type: %d", v->type); @@ -1092,7 +1092,7 @@ jspGetArg(JsonPathItem *v, JsonPathItem *a) v->type == jpiTimestamp || v->type == jpiTimestampTz); - jspInitByBuffer(a, v->base, v->content.arg); + jspInitByBuffer(a, v->base, v->arg); } bool @@ -1181,7 +1181,7 @@ jspGetLeftArg(JsonPathItem *v, JsonPathItem *a) v->type == jpiStartsWith || v->type == jpiDecimal); - jspInitByBuffer(a, v->base, v->content.args.left); + jspInitByBuffer(a, v->base, v->args.left); } void @@ -1203,7 +1203,7 @@ jspGetRightArg(JsonPathItem *v, JsonPathItem *a) v->type == jpiStartsWith || v->type == jpiDecimal); - jspInitByBuffer(a, v->base, v->content.args.right); + jspInitByBuffer(a, v->base, v->args.right); } bool @@ -1211,7 +1211,7 @@ jspGetBool(JsonPathItem *v) { Assert(v->type == jpiBool); - return (bool) *v->content.value.data; + return (bool) *v->value.data; } Numeric @@ -1219,7 +1219,7 @@ jspGetNumeric(JsonPathItem *v) { Assert(v->type == jpiNumeric); - return (Numeric) v->content.value.data; + return (Numeric) v->value.data; } char * @@ -1230,8 +1230,8 @@ jspGetString(JsonPathItem *v, int32 *len) v->type == jpiVariable); if (len) - *len = v->content.value.datalen; - return v->content.value.data; + *len = v->value.datalen; + return v->value.data; } bool @@ -1240,12 +1240,12 @@ jspGetArraySubscript(JsonPathItem *v, JsonPathItem *from, JsonPathItem *to, { Assert(v->type == jpiIndexArray); - jspInitByBuffer(from, v->base, v->content.array.elems[i].from); + jspInitByBuffer(from, v->base, v->array.elems[i].from); - if (!v->content.array.elems[i].to) + if (!v->array.elems[i].to) return false; - jspInitByBuffer(to, v->base, v->content.array.elems[i].to); + jspInitByBuffer(to, v->base, v->array.elems[i].to); return true; } @@ -1423,7 +1423,7 @@ jspIsMutableWalker(JsonPathItem *jpi, struct JsonPathMutableContext *cxt) break; case jpiIndexArray: - for (int i = 0; i < jpi->content.array.nelems; i++) + for (int i = 0; i < jpi->array.nelems; i++) { JsonPathItem from; JsonPathItem to; @@ -1441,12 +1441,12 @@ jspIsMutableWalker(JsonPathItem *jpi, struct JsonPathMutableContext *cxt) break; case jpiAny: - if (jpi->content.anybounds.first > 0) + if (jpi->anybounds.first > 0) status = jpdsNonDateTime; break; case jpiDatetime: - if (jpi->content.arg) + if (jpi->arg) { char *template; @@ -1471,7 +1471,7 @@ jspIsMutableWalker(JsonPathItem *jpi, struct JsonPathMutableContext *cxt) case jpiLikeRegex: Assert(status == jpdsNonDateTime); - jspInitByBuffer(&arg, jpi->base, jpi->content.like_regex.expr); + jspInitByBuffer(&arg, jpi->base, jpi->like_regex.expr); jspIsMutableWalker(&arg, cxt); break; diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index 8156695e97e..779f32b4a0b 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -478,7 +478,7 @@ jsonb_path_match_internal(FunctionCallInfo fcinfo, bool tz) JsonbValue *jbv = JsonValueListHead(&found); if (jbv->type == jbvBool) - PG_RETURN_BOOL(jbv->val.boolean); + PG_RETURN_BOOL(jbv->boolean); if (jbv->type == jbvNull) PG_RETURN_NULL(); @@ -860,7 +860,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, return executeAnyItem (cxt, hasNext ? &elem : NULL, - jb->val.binary.data, found, 1, 1, 1, + jb->binary.data, found, 1, 1, 1, false, jspAutoUnwrap(cxt)); } else if (unwrap && JsonbType(jb) == jbvArray) @@ -888,7 +888,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, cxt->innermostArraySize = size; /* for LAST evaluation */ - for (i = 0; i < jsp->content.array.nelems; i++) + for (i = 0; i < jsp->array.nelems; i++) { JsonPathItem from; JsonPathItem to; @@ -941,7 +941,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, } else { - v = getIthJsonbValueFromContainer(jb->val.binary.data, + v = getIthJsonbValueFromContainer(jb->binary.data, (uint32) index); if (v == NULL) @@ -985,7 +985,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, bool hasNext = jspGetNext(jsp, &elem); /* first try without any intermediate steps */ - if (jsp->content.anybounds.first == 0) + if (jsp->anybounds.first == 0) { bool savedIgnoreStructuralErrors; @@ -1002,10 +1002,10 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, if (jb->type == jbvBinary) res = executeAnyItem (cxt, hasNext ? &elem : NULL, - jb->val.binary.data, found, + jb->binary.data, found, 1, - jsp->content.anybounds.first, - jsp->content.anybounds.last, + jsp->anybounds.first, + jsp->anybounds.last, true, jspAutoUnwrap(cxt)); break; } @@ -1017,9 +1017,9 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue key; key.type = jbvString; - key.val.string.val = jspGetString(jsp, &key.val.string.len); + key.string.val = jspGetString(jsp, &key.string.len); - v = findJsonbValueFromContainer(jb->val.binary.data, + v = findJsonbValueFromContainer(jb->binary.data, JB_FOBJECT, &key); if (v != NULL) @@ -1041,8 +1041,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, ereport(ERROR, (errcode(ERRCODE_SQL_JSON_MEMBER_NOT_FOUND), \ errmsg("JSON object does not contain key \"%s\"", - pnstrdup(key.val.string.val, - key.val.string.len)))); + pnstrdup(key.string.val, + key.string.len)))); } } else if (unwrap && JsonbType(jb) == jbvArray) @@ -1091,8 +1091,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *jbv = palloc(sizeof(*jbv)); jbv->type = jbvString; - jbv->val.string.val = pstrdup(JsonbTypeName(jb)); - jbv->val.string.len = strlen(jbv->val.string.val); + jbv->string.val = pstrdup(JsonbTypeName(jb)); + jbv->string.len = strlen(jbv->string.val); res = executeNextItem(cxt, jsp, NULL, jbv, found, false); @@ -1121,7 +1121,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = palloc(sizeof(*jb)); jb->type = jbvNumeric; - jb->val.numeric = int64_to_numeric(size); + jb->numeric = int64_to_numeric(size); res = executeNextItem(cxt, jsp, NULL, jb, found, false); } @@ -1150,7 +1150,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, if (jb->type == jbvNumeric) { char *tmp = DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(jb->val.numeric))); + NumericGetDatum(jb->numeric))); double val; ErrorSaveContext escontext = {T_ErrorSaveContext}; @@ -1176,8 +1176,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, { /* cast string as double */ double val; - char *tmp = pnstrdup(jb->val.string.val, - jb->val.string.len); + char *tmp = pnstrdup(jb->string.val, + jb->string.len); ErrorSaveContext escontext = {T_ErrorSaveContext}; val = float8in_internal(tmp, @@ -1199,8 +1199,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = &jbv; jb->type = jbvNumeric; - jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(float8_numeric, - Float8GetDatum(val))); + jb->numeric = DatumGetNumeric(DirectFunctionCall1(float8_numeric, + Float8GetDatum(val))); res = jperOk; } @@ -1252,7 +1252,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, lastjbv = hasNext ? &tmpjbv : palloc(sizeof(*lastjbv)); lastjbv->type = jbvNumeric; - lastjbv->val.numeric = int64_to_numeric(last); + lastjbv->numeric = int64_to_numeric(last); res = executeNextItem(cxt, jsp, &elem, lastjbv, found, hasNext); @@ -1273,14 +1273,14 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, ErrorSaveContext escontext = {T_ErrorSaveContext}; int64 val; - val = numeric_int8_safe(jb->val.numeric, + val = numeric_int8_safe(jb->numeric, (Node *) &escontext); if (escontext.error_occurred) RETURN_ERROR(ereport(ERROR, (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type %s", DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(jb->val.numeric))), + NumericGetDatum(jb->numeric))), jspOperationName(jsp->type), "bigint")))); @@ -1290,8 +1290,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, else if (jb->type == jbvString) { /* cast string as bigint */ - char *tmp = pnstrdup(jb->val.string.val, - jb->val.string.len); + char *tmp = pnstrdup(jb->string.val, + jb->string.len); ErrorSaveContext escontext = {T_ErrorSaveContext}; bool noerr; @@ -1316,8 +1316,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = &jbv; jb->type = jbvNumeric; - jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int8_numeric, - datum)); + jb->numeric = DatumGetNumeric(DirectFunctionCall1(int8_numeric, + datum)); res = executeNextItem(cxt, jsp, NULL, jb, found, true); } @@ -1334,7 +1334,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, if (jb->type == jbvBool) { - bval = jb->val.boolean; + bval = jb->boolean; res = jperOk; } @@ -1344,7 +1344,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, Datum datum; bool noerr; char *tmp = DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(jb->val.numeric))); + NumericGetDatum(jb->numeric))); ErrorSaveContext escontext = {T_ErrorSaveContext}; noerr = DirectInputFunctionCallSafe(int4in, tmp, @@ -1369,8 +1369,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, else if (jb->type == jbvString) { /* cast string as boolean */ - char *tmp = pnstrdup(jb->val.string.val, - jb->val.string.len); + char *tmp = pnstrdup(jb->string.val, + jb->string.len); if (!parse_bool(tmp, &bval)) RETURN_ERROR(ereport(ERROR, @@ -1389,7 +1389,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = &jbv; jb->type = jbvBool; - jb->val.boolean = bval; + jb->boolean = bval; res = executeNextItem(cxt, jsp, NULL, jb, found, true); } @@ -1408,7 +1408,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, if (jb->type == jbvNumeric) { - num = jb->val.numeric; + num = jb->numeric; if (numeric_is_nan(num) || numeric_is_inf(num)) RETURN_ERROR(ereport(ERROR, (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), @@ -1427,7 +1427,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, bool noerr; ErrorSaveContext escontext = {T_ErrorSaveContext}; - numstr = pnstrdup(jb->val.string.val, jb->val.string.len); + numstr = pnstrdup(jb->string.val, jb->string.len); noerr = DirectInputFunctionCallSafe(numeric_in, numstr, InvalidOid, -1, @@ -1462,7 +1462,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, * typmod equivalent and then truncate the numeric value per * this typmod details. */ - if (jsp->type == jpiDecimal && jsp->content.args.left) + if (jsp->type == jpiDecimal && jsp->args.left) { Datum numdatum; Datum dtypmod; @@ -1487,7 +1487,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, errmsg("precision of jsonpath item method .%s() is out of range for type integer", jspOperationName(jsp->type))))); - if (jsp->content.args.right) + if (jsp->args.right) { jspGetRightArg(jsp, &elem); if (elem.type != jpiNumeric) @@ -1534,7 +1534,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = &jbv; jb->type = jbvNumeric; - jb->val.numeric = num; + jb->numeric = num; res = executeNextItem(cxt, jsp, NULL, jb, found, true); } @@ -1554,14 +1554,14 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, int32 val; ErrorSaveContext escontext = {T_ErrorSaveContext}; - val = numeric_int4_safe(jb->val.numeric, + val = numeric_int4_safe(jb->numeric, (Node *) &escontext); if (escontext.error_occurred) RETURN_ERROR(ereport(ERROR, (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type %s", DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(jb->val.numeric))), + NumericGetDatum(jb->numeric))), jspOperationName(jsp->type), "integer")))); datum = Int32GetDatum(val); @@ -1570,8 +1570,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, else if (jb->type == jbvString) { /* cast string as integer */ - char *tmp = pnstrdup(jb->val.string.val, - jb->val.string.len); + char *tmp = pnstrdup(jb->string.val, + jb->string.len); ErrorSaveContext escontext = {T_ErrorSaveContext}; bool noerr; @@ -1596,8 +1596,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = &jbv; jb->type = jbvNumeric; - jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int4_numeric, - datum)); + jb->numeric = DatumGetNumeric(DirectFunctionCall1(int4_numeric, + datum)); res = executeNextItem(cxt, jsp, NULL, jb, found, true); } @@ -1619,24 +1619,24 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, * Value is not necessarily null-terminated, so we do * pnstrdup() here. */ - tmp = pnstrdup(jb->val.string.val, - jb->val.string.len); + tmp = pnstrdup(jb->string.val, + jb->string.len); break; case jbvNumeric: tmp = DatumGetCString(DirectFunctionCall1(numeric_out, - NumericGetDatum(jb->val.numeric))); + NumericGetDatum(jb->numeric))); break; case jbvBool: - tmp = (jb->val.boolean) ? "true" : "false"; + tmp = (jb->boolean) ? "true" : "false"; break; case jbvDatetime: { char buf[MAXDATELEN + 1]; JsonEncodeDateTime(buf, - jb->val.datetime.value, - jb->val.datetime.typid, - &jb->val.datetime.tz); + jb->datetime.value, + jb->datetime.typid, + &jb->datetime.tz); tmp = pstrdup(buf); } break; @@ -1653,8 +1653,8 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = &jbv; Assert(tmp != NULL); /* We must have set tmp above */ - jb->val.string.val = tmp; - jb->val.string.len = strlen(jb->val.string.val); + jb->string.val = tmp; + jb->string.len = strlen(jb->string.val); jb->type = jbvString; res = executeNextItem(cxt, jsp, NULL, jb, found, true); @@ -1683,7 +1683,7 @@ executeItemUnwrapTargetArray(JsonPathExecContext *cxt, JsonPathItem *jsp, } return executeAnyItem - (cxt, jsp, jb->val.binary.data, found, 1, 1, 1, + (cxt, jsp, jb->binary.data, found, 1, 1, 1, false, unwrapElements); } @@ -1863,7 +1863,7 @@ executeBoolItem(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonLikeRegexContext lrcxt = {0}; jspInitByBuffer(&larg, jsp->base, - jsp->content.like_regex.expr); + jsp->like_regex.expr); return executePredicate(cxt, jsp, &larg, NULL, jb, false, executeLikeRegex, &lrcxt); @@ -1996,7 +1996,7 @@ executeAnyItem(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbContainer *jbc, if (level < last && v.type == jbvBinary) { res = executeAnyItem - (cxt, jsp, v.val.binary.data, found, + (cxt, jsp, v.binary.data, found, level + 1, first, last, ignoreStructuralErrors, unwrapNext); @@ -2147,13 +2147,13 @@ executeBinaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp, if (jspThrowErrors(cxt)) { - res = func(lval->val.numeric, rval->val.numeric, NULL); + res = func(lval->numeric, rval->numeric, NULL); } else { ErrorSaveContext escontext = {T_ErrorSaveContext}; - res = func(lval->val.numeric, rval->val.numeric, (Node *) &escontext); + res = func(lval->numeric, rval->numeric, (Node *) &escontext); if (escontext.error_occurred) return jperError; @@ -2164,7 +2164,7 @@ executeBinaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp, lval = palloc(sizeof(*lval)); lval->type = jbvNumeric; - lval->val.numeric = res; + lval->numeric = res; return executeNextItem(cxt, jsp, &elem, lval, found, false); } @@ -2215,9 +2215,9 @@ executeUnaryArithmExpr(JsonPathExecContext *cxt, JsonPathItem *jsp, } if (func) - val->val.numeric = + val->numeric = DatumGetNumeric(DirectFunctionCall1(func, - NumericGetDatum(val->val.numeric))); + NumericGetDatum(val->numeric))); jper2 = executeNextItem(cxt, jsp, &elem, val, found, false); @@ -2250,10 +2250,10 @@ executeStartsWith(JsonPathItem *jsp, JsonbValue *whole, JsonbValue *initial, if (!(initial = getScalar(initial, jbvString))) return jpbUnknown; /* error */ - if (whole->val.string.len >= initial->val.string.len && - !memcmp(whole->val.string.val, - initial->val.string.val, - initial->val.string.len)) + if (whole->string.len >= initial->string.len && + !memcmp(whole->string.val, + initial->string.val, + initial->string.len)) return jpbTrue; return jpbFalse; @@ -2277,14 +2277,14 @@ executeLikeRegex(JsonPathItem *jsp, JsonbValue *str, JsonbValue *rarg, if (!cxt->regex) { cxt->regex = - cstring_to_text_with_len(jsp->content.like_regex.pattern, - jsp->content.like_regex.patternlen); - (void) jspConvertRegexFlags(jsp->content.like_regex.flags, + cstring_to_text_with_len(jsp->like_regex.pattern, + jsp->like_regex.patternlen); + (void) jspConvertRegexFlags(jsp->like_regex.flags, &(cxt->cflags), NULL); } - if (RE_compile_and_execute(cxt->regex, str->val.string.val, - str->val.string.len, + if (RE_compile_and_execute(cxt->regex, str->string.val, + str->string.len, cxt->cflags, DEFAULT_COLLATION_OID, 0, NULL)) return jpbTrue; @@ -2312,14 +2312,14 @@ executeNumericItemMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, errmsg("jsonpath item method .%s() can only be applied to a numeric value", jspOperationName(jsp->type))))); - datum = DirectFunctionCall1(func, NumericGetDatum(jb->val.numeric)); + datum = DirectFunctionCall1(func, NumericGetDatum(jb->numeric)); if (!jspGetNext(jsp, &next) && !found) return jperOk; jb = palloc(sizeof(*jb)); jb->type = jbvNumeric; - jb->val.numeric = DatumGetNumeric(datum); + jb->numeric = DatumGetNumeric(datum); return executeNextItem(cxt, jsp, &next, jb, found, false); } @@ -2358,8 +2358,8 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, errmsg("jsonpath item method .%s() can only be applied to a string", jspOperationName(jsp->type))))); - datetime = cstring_to_text_with_len(jb->val.string.val, - jb->val.string.len); + datetime = cstring_to_text_with_len(jb->string.val, + jb->string.len); /* * At some point we might wish to have callers supply the collation to @@ -2372,7 +2372,7 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, * .datetime(template) has an argument, the rest of the methods don't have * an argument. So we handle that separately. */ - if (jsp->type == jpiDatetime && jsp->content.arg) + if (jsp->type == jpiDatetime && jsp->arg) { text *template; char *template_str; @@ -2433,7 +2433,7 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, * .date() */ if (jsp->type != jpiDatetime && jsp->type != jpiDate && - jsp->content.arg) + jsp->arg) { ErrorSaveContext escontext = {T_ErrorSaveContext}; @@ -2786,10 +2786,10 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, jb = hasNext ? &jbvbuf : palloc(sizeof(*jb)); jb->type = jbvDatetime; - jb->val.datetime.value = value; - jb->val.datetime.typid = typid; - jb->val.datetime.typmod = typmod; - jb->val.datetime.tz = tz; + jb->datetime.value = value; + jb->datetime.typid = typid; + jb->datetime.typmod = typmod; + jb->datetime.tz = tz; return executeNextItem(cxt, jsp, &elem, jb, found, hasNext); } @@ -2841,7 +2841,7 @@ executeKeyValueMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, errmsg("jsonpath item method .%s() can only be applied to an object", jspOperationName(jsp->type))))); - jbc = jb->val.binary.data; + jbc = jb->binary.data; if (!JsonContainerSize(jbc)) return jperNotFound; /* no key-value pairs */ @@ -2849,16 +2849,16 @@ executeKeyValueMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, hasNext = jspGetNext(jsp, &next); keystr.type = jbvString; - keystr.val.string.val = "key"; - keystr.val.string.len = 3; + keystr.string.val = "key"; + keystr.string.len = 3; valstr.type = jbvString; - valstr.val.string.val = "value"; - valstr.val.string.len = 5; + valstr.string.val = "value"; + valstr.string.len = 5; idstr.type = jbvString; - idstr.val.string.val = "id"; - idstr.val.string.len = 2; + idstr.string.val = "id"; + idstr.string.len = 2; /* construct object id from its base object and offset inside that */ id = jb->type != jbvBinary ? 0 : @@ -2866,7 +2866,7 @@ executeKeyValueMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, id += (int64) cxt->baseObject.id * INT64CONST(10000000000); idval.type = jbvNumeric; - idval.val.numeric = int64_to_numeric(id); + idval.numeric = int64_to_numeric(id); it = JsonbIteratorInit(jbc); @@ -2944,7 +2944,7 @@ appendBoolResult(JsonPathExecContext *cxt, JsonPathItem *jsp, else { jbv.type = jbvBool; - jbv.val.boolean = res == jpbTrue; + jbv.boolean = res == jpbTrue; } return executeNextItem(cxt, jsp, &next, &jbv, found, true); @@ -2966,16 +2966,16 @@ getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item, break; case jpiBool: value->type = jbvBool; - value->val.boolean = jspGetBool(item); + value->boolean = jspGetBool(item); break; case jpiNumeric: value->type = jbvNumeric; - value->val.numeric = jspGetNumeric(item); + value->numeric = jspGetNumeric(item); break; case jpiString: value->type = jbvString; - value->val.string.val = jspGetString(item, - &value->val.string.len); + value->string.val = jspGetString(item, + &value->string.len); break; case jpiVariable: getJsonPathVariable(cxt, item, value); @@ -3053,7 +3053,7 @@ JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res) { case BOOLOID: res->type = jbvBool; - res->val.boolean = DatumGetBool(val); + res->boolean = DatumGetBool(val); break; case NUMERICOID: JsonbValueInitNumericDatum(res, val); @@ -3076,8 +3076,8 @@ JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res) case TEXTOID: case VARCHAROID: res->type = jbvString; - res->val.string.val = VARDATA_ANY(DatumGetPointer(val)); - res->val.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(val)); + res->string.val = VARDATA_ANY(DatumGetPointer(val)); + res->string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(val)); break; case DATEOID: case TIMEOID: @@ -3085,10 +3085,10 @@ JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res) case TIMESTAMPOID: case TIMESTAMPTZOID: res->type = jbvDatetime; - res->val.datetime.value = val; - res->val.datetime.typid = typid; - res->val.datetime.typmod = typmod; - res->val.datetime.tz = 0; + res->datetime.value = val; + res->datetime.typid = typid; + res->datetime.typmod = typmod; + res->datetime.tz = 0; break; case JSONBOID: { @@ -3132,7 +3132,7 @@ static void JsonbValueInitNumericDatum(JsonbValue *jbv, Datum num) { jbv->type = jbvNumeric; - jbv->val.numeric = DatumGetNumeric(num); + jbv->numeric = DatumGetNumeric(num); } /* @@ -3179,8 +3179,8 @@ getJsonPathVariableFromJsonb(void *varsJsonb, char *varName, int varNameLength, JsonbValue *result; tmp.type = jbvString; - tmp.val.string.val = varName; - tmp.val.string.len = varNameLength; + tmp.string.val = varName; + tmp.string.len = varNameLength; result = findJsonbValueFromContainer(&vars->root, JB_FOBJECT, &tmp); @@ -3229,7 +3229,7 @@ JsonbArraySize(JsonbValue *jb) if (jb->type == jbvBinary) { - JsonbContainer *jbc = jb->val.binary.data; + JsonbContainer *jbc = jb->binary.data; if (JsonContainerIsArray(jbc) && !JsonContainerIsScalar(jbc)) return JsonContainerSize(jbc); @@ -3364,30 +3364,30 @@ compareItems(int32 op, JsonbValue *jb1, JsonbValue *jb2, bool useTz) cmp = 0; break; case jbvBool: - cmp = jb1->val.boolean == jb2->val.boolean ? 0 : - jb1->val.boolean ? 1 : -1; + cmp = jb1->boolean == jb2->boolean ? 0 : + jb1->boolean ? 1 : -1; break; case jbvNumeric: - cmp = compareNumeric(jb1->val.numeric, jb2->val.numeric); + cmp = compareNumeric(jb1->numeric, jb2->numeric); break; case jbvString: if (op == jpiEqual) - return jb1->val.string.len != jb2->val.string.len || - memcmp(jb1->val.string.val, - jb2->val.string.val, - jb1->val.string.len) ? jpbFalse : jpbTrue; + return jb1->string.len != jb2->string.len || + memcmp(jb1->string.val, + jb2->string.val, + jb1->string.len) ? jpbFalse : jpbTrue; - cmp = compareStrings(jb1->val.string.val, jb1->val.string.len, - jb2->val.string.val, jb2->val.string.len); + cmp = compareStrings(jb1->string.val, jb1->string.len, + jb2->string.val, jb2->string.len); break; case jbvDatetime: { bool cast_error; - cmp = compareDatetime(jb1->val.datetime.value, - jb1->val.datetime.typid, - jb2->val.datetime.value, - jb2->val.datetime.typid, + cmp = compareDatetime(jb1->datetime.value, + jb1->datetime.typid, + jb2->datetime.value, + jb2->datetime.typid, useTz, &cast_error); @@ -3476,7 +3476,7 @@ getArrayIndex(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *jb, errmsg("jsonpath array subscript is not a single numeric value")))); numeric_index = DirectFunctionCall2(numeric_trunc, - NumericGetDatum(jbv->val.numeric), + NumericGetDatum(jbv->numeric), Int32GetDatum(0)); *index = numeric_int4_safe(DatumGetNumeric(numeric_index), @@ -3497,7 +3497,7 @@ setBaseObject(JsonPathExecContext *cxt, JsonbValue *jbv, int32 id) JsonBaseObjectInfo baseObject = cxt->baseObject; cxt->baseObject.jbc = jbv->type != jbvBinary ? NULL : - (JsonbContainer *) jbv->val.binary.data; + (JsonbContainer *) jbv->binary.data; cxt->baseObject.id = id; return baseObject; @@ -3602,8 +3602,8 @@ static JsonbValue * JsonbInitBinary(JsonbValue *jbv, Jsonb *jb) { jbv->type = jbvBinary; - jbv->val.binary.data = &jb->root; - jbv->val.binary.len = VARSIZE_ANY_EXHDR(jb); + jbv->binary.data = &jb->root; + jbv->binary.len = VARSIZE_ANY_EXHDR(jb); return jbv; } @@ -3618,7 +3618,7 @@ JsonbType(JsonbValue *jb) if (jb->type == jbvBinary) { - JsonbContainer *jbc = jb->val.binary.data; + JsonbContainer *jbc = jb->binary.data; /* Scalars should be always extracted during jsonpath execution. */ Assert(!JsonContainerIsScalar(jbc)); @@ -3640,7 +3640,7 @@ getScalar(JsonbValue *scalar, enum jbvType type) { /* Scalars should be always extracted during jsonpath execution. */ Assert(scalar->type != jbvBinary || - !JsonContainerIsScalar(scalar->val.binary.data)); + !JsonContainerIsScalar(scalar->binary.data)); return scalar->type == type ? scalar : NULL; } @@ -4052,8 +4052,8 @@ JsonPathValue(Datum jb, JsonPath *jp, bool *empty, bool *error, List *vars, } res = JsonValueListHead(&found); - if (res->type == jbvBinary && JsonContainerIsScalar(res->val.binary.data)) - JsonbExtractScalar(res->val.binary.data, res); + if (res->type == jbvBinary && JsonContainerIsScalar(res->binary.data)) + JsonbExtractScalar(res->binary.data, res); /* JSON_VALUE expects to get only scalars. */ if (!IsAJsonbScalar(res)) diff --git a/src/backend/utils/adt/jsonpath_gram.y b/src/backend/utils/adt/jsonpath_gram.y index 499745a8fef..44301b0dcc3 100644 --- a/src/backend/utils/adt/jsonpath_gram.y +++ b/src/backend/utils/adt/jsonpath_gram.y @@ -406,8 +406,8 @@ makeItemString(JsonPathString *s) else { v = makeItemType(jpiString); - v->value.string.val = s->val; - v->value.string.len = s->len; + v->string.val = s->val; + v->string.len = s->len; } return v; @@ -419,8 +419,8 @@ makeItemVariable(JsonPathString *s) JsonPathParseItem *v; v = makeItemType(jpiVariable); - v->value.string.val = s->val; - v->value.string.len = s->len; + v->string.val = s->val; + v->string.len = s->len; return v; } @@ -442,7 +442,7 @@ makeItemNumeric(JsonPathString *s) JsonPathParseItem *v; v = makeItemType(jpiNumeric); - v->value.numeric = + v->numeric = DatumGetNumeric(DirectFunctionCall3(numeric_in, CStringGetDatum(s->val), ObjectIdGetDatum(InvalidOid), @@ -456,7 +456,7 @@ makeItemBool(bool val) { JsonPathParseItem *v = makeItemType(jpiBool); - v->value.boolean = val; + v->boolean = val; return v; } @@ -466,8 +466,8 @@ makeItemBinary(JsonPathItemType type, JsonPathParseItem *la, JsonPathParseItem * { JsonPathParseItem *v = makeItemType(type); - v->value.args.left = la; - v->value.args.right = ra; + v->args.left = la; + v->args.right = ra; return v; } @@ -483,15 +483,15 @@ makeItemUnary(JsonPathItemType type, JsonPathParseItem *a) if (type == jpiMinus && a->type == jpiNumeric && !a->next) { v = makeItemType(jpiNumeric); - v->value.numeric = + v->numeric = DatumGetNumeric(DirectFunctionCall1(numeric_uminus, - NumericGetDatum(a->value.numeric))); + NumericGetDatum(a->numeric))); return v; } v = makeItemType(type); - v->value.arg = a; + v->arg = a; return v; } @@ -531,10 +531,10 @@ makeIndexArray(List *list) int i = 0; Assert(list != NIL); - v->value.array.nelems = list_length(list); + v->array.nelems = list_length(list); - v->value.array.elems = palloc(sizeof(v->value.array.elems[0]) * - v->value.array.nelems); + v->array.elems = palloc(sizeof(v->array.elems[0]) * + v->array.nelems); foreach(cell, list) { @@ -542,8 +542,8 @@ makeIndexArray(List *list) Assert(jpi->type == jpiSubscript); - v->value.array.elems[i].from = jpi->value.args.left; - v->value.array.elems[i++].to = jpi->value.args.right; + v->array.elems[i].from = jpi->args.left; + v->array.elems[i++].to = jpi->args.right; } return v; @@ -554,8 +554,8 @@ makeAny(int first, int last) { JsonPathParseItem *v = makeItemType(jpiAny); - v->value.anybounds.first = (first >= 0) ? first : PG_UINT32_MAX; - v->value.anybounds.last = (last >= 0) ? last : PG_UINT32_MAX; + v->anybounds.first = (first >= 0) ? first : PG_UINT32_MAX; + v->anybounds.last = (last >= 0) ? last : PG_UINT32_MAX; return v; } @@ -569,30 +569,30 @@ makeItemLikeRegex(JsonPathParseItem *expr, JsonPathString *pattern, int i; int cflags; - v->value.like_regex.expr = expr; - v->value.like_regex.pattern = pattern->val; - v->value.like_regex.patternlen = pattern->len; + v->like_regex.expr = expr; + v->like_regex.pattern = pattern->val; + v->like_regex.patternlen = pattern->len; /* Parse the flags string, convert to bitmask. Duplicate flags are OK. */ - v->value.like_regex.flags = 0; + v->like_regex.flags = 0; for (i = 0; flags && i < flags->len; i++) { switch (flags->val[i]) { case 'i': - v->value.like_regex.flags |= JSP_REGEX_ICASE; + v->like_regex.flags |= JSP_REGEX_ICASE; break; case 's': - v->value.like_regex.flags |= JSP_REGEX_DOTALL; + v->like_regex.flags |= JSP_REGEX_DOTALL; break; case 'm': - v->value.like_regex.flags |= JSP_REGEX_MLINE; + v->like_regex.flags |= JSP_REGEX_MLINE; break; case 'x': - v->value.like_regex.flags |= JSP_REGEX_WSPACE; + v->like_regex.flags |= JSP_REGEX_WSPACE; break; case 'q': - v->value.like_regex.flags |= JSP_REGEX_QUOTE; + v->like_regex.flags |= JSP_REGEX_QUOTE; break; default: ereturn(escontext, false, @@ -605,7 +605,7 @@ makeItemLikeRegex(JsonPathParseItem *expr, JsonPathString *pattern, } /* Convert flags to what pg_regcomp needs */ - if (!jspConvertRegexFlags(v->value.like_regex.flags, &cflags, escontext)) + if (!jspConvertRegexFlags(v->like_regex.flags, &cflags, escontext)) return false; /* check regex validity */ diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h index fecb33b9c67..546d24cd819 100644 --- a/src/include/utils/jsonb.h +++ b/src/include/utils/jsonb.h @@ -291,7 +291,7 @@ struct JsonbValue int tz; /* Numeric time zone, in seconds, for * TimestampTz data type */ } datetime; - } val; + }; }; #define IsAJsonbScalar(jsonbval) (((jsonbval)->type >= jbvNull && \ diff --git a/src/include/utils/jsonpath.h b/src/include/utils/jsonpath.h index 23a76d233e9..817efd8bf87 100644 --- a/src/include/utils/jsonpath.h +++ b/src/include/utils/jsonpath.h @@ -188,7 +188,7 @@ typedef struct JsonPathItem int32 patternlen; uint32 flags; } like_regex; - } content; + }; } JsonPathItem; #define jspHasNext(jsp) ((jsp)->nextPos > 0) @@ -266,7 +266,7 @@ struct JsonPathParseItem uint32 len; char *val; /* could not be not null-terminated */ } string; - } value; + }; }; typedef struct JsonPathParseResult -- 2.51.0