De-anonymize the union in JsonbValue.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2014 18:30:08 +0000 (14:30 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2014 18:30:08 +0000 (14:30 -0400)
Needed for strict C89 compliance.

contrib/hstore/hstore_io.c
src/backend/utils/adt/jsonb.c
src/backend/utils/adt/jsonb_gin.c
src/backend/utils/adt/jsonb_op.c
src/backend/utils/adt/jsonb_util.c
src/backend/utils/adt/jsonfuncs.c
src/include/utils/jsonb.h

index 6cfc93578876a19e42e52ad6463903f6545eef11..6ec0b9cbf19ea60de751ba1854d1451d88f8c013 100644 (file)
@@ -1397,9 +1397,9 @@ hstore_to_jsonb(PG_FUNCTION_ARGS)
 
                key.estSize = sizeof(JEntry);
                key.type = jbvString;
-               key.string.len = HS_KEYLEN(entries, i);
-               key.string.val = pnstrdup(HS_KEY(entries, base, i), key.string.len);
-               key.estSize += key.string.len;
+               key.val.string.len = HS_KEYLEN(entries, i);
+               key.val.string.val = pnstrdup(HS_KEY(entries, base, i), key.val.string.len);
+               key.estSize += key.val.string.len;
 
                res = pushJsonbValue(&state, WJB_KEY, &key);
 
@@ -1412,9 +1412,9 @@ hstore_to_jsonb(PG_FUNCTION_ARGS)
                {
                        val.estSize = sizeof(JEntry);
                        val.type = jbvString;
-                       val.string.len = HS_VALLEN(entries, i);
-                       val.string.val = pnstrdup(HS_VAL(entries, base, i), val.string.len);
-                       val.estSize += val.string.len;
+                       val.val.string.len = HS_VALLEN(entries, i);
+                       val.val.string.val = pnstrdup(HS_VAL(entries, base, i), val.val.string.len);
+                       val.estSize += val.val.string.len;
                }
                res = pushJsonbValue(&state, WJB_VALUE, &val);
        }
@@ -1449,9 +1449,9 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
 
                key.estSize = sizeof(JEntry);
                key.type = jbvString;
-               key.string.len = HS_KEYLEN(entries, i);
-               key.string.val = pnstrdup(HS_KEY(entries, base, i), key.string.len);
-               key.estSize += key.string.len;
+               key.val.string.len = HS_KEYLEN(entries, i);
+               key.val.string.val = pnstrdup(HS_KEY(entries, base, i), key.val.string.len);
+               key.estSize += key.val.string.len;
 
                res = pushJsonbValue(&state, WJB_KEY, &key);
 
@@ -1465,12 +1465,12 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
                else if (HS_VALLEN(entries, i) == 1 && *(HS_VAL(entries, base, i)) == 't')
                {
                        val.type = jbvBool;
-                       val.boolean = true;
+                       val.val.boolean = true;
                }
                else if (HS_VALLEN(entries, i) == 1 && *(HS_VAL(entries, base, i)) == 'f')
                {
                        val.type = jbvBool;
-                       val.boolean = false;
+                       val.val.boolean = false;
                }
                else
                {
@@ -1519,17 +1519,17 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
                        if (is_number)
                        {
                                val.type = jbvNumeric;
-                               val.numeric = DatumGetNumeric(
+                               val.val.numeric = DatumGetNumeric(
                                        DirectFunctionCall3(numeric_in, CStringGetDatum(tmp.data), 0, -1));
-                               val.estSize += VARSIZE_ANY(val.numeric) +sizeof(JEntry);
+                               val.estSize += VARSIZE_ANY(val.val.numeric) +sizeof(JEntry);
                        }
                        else
                        {
                                val.estSize = sizeof(JEntry);
                                val.type = jbvString;
-                               val.string.len = HS_VALLEN(entries, i);
-                               val.string.val = pnstrdup(HS_VAL(entries, base, i), val.string.len);
-                               val.estSize += val.string.len;
+                               val.val.string.len = HS_VALLEN(entries, i);
+                               val.val.string.val = pnstrdup(HS_VAL(entries, base, i), val.val.string.len);
+                               val.estSize += val.val.string.len;
                        }
                }
                res = pushJsonbValue(&state, WJB_VALUE, &val);
index b30e79e425bedefce631fafe108f66ae7b45b010..781ab66ef2c9c5db6353836350e0fc398ef8c4af 100644 (file)
@@ -247,9 +247,9 @@ jsonb_in_object_field_start(void *pstate, char *fname, bool isnull)
 
        Assert (fname != NULL);
        v.type = jbvString;
-       v.string.len = checkStringLen(strlen(fname));
-       v.string.val = pnstrdup(fname, v.string.len);
-       v.estSize = sizeof(JEntry) + v.string.len;
+       v.val.string.len = checkStringLen(strlen(fname));
+       v.val.string.val = pnstrdup(fname, v.val.string.len);
+       v.estSize = sizeof(JEntry) + v.val.string.len;
 
        _state->res = pushJsonbValue(&_state->parseState, WJB_KEY, &v);
 }
@@ -263,15 +263,15 @@ jsonb_put_escaped_value(StringInfo out, JsonbValue * scalarVal)
                        appendBinaryStringInfo(out, "null", 4);
                        break;
                case jbvString:
-                       escape_json(out, pnstrdup(scalarVal->string.val, scalarVal->string.len));
+                       escape_json(out, pnstrdup(scalarVal->val.string.val, scalarVal->val.string.len));
                        break;
                case jbvNumeric:
                        appendStringInfoString(out,
                                                                   DatumGetCString(DirectFunctionCall1(numeric_out,
-                                                                                                                                          PointerGetDatum(scalarVal->numeric))));
+                                                                                                                                          PointerGetDatum(scalarVal->val.numeric))));
                        break;
                case jbvBool:
-                       if (scalarVal->boolean)
+                       if (scalarVal->val.boolean)
                                appendBinaryStringInfo(out, "true", 4);
                        else
                                appendBinaryStringInfo(out, "false", 5);
@@ -298,9 +298,9 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
                case JSON_TOKEN_STRING:
                        Assert (token != NULL);
                        v.type = jbvString;
-                       v.string.len = checkStringLen(strlen(token));
-                       v.string.val = pnstrdup(token, v.string.len);
-                       v.estSize += v.string.len;
+                       v.val.string.len = checkStringLen(strlen(token));
+                       v.val.string.val = pnstrdup(token, v.val.string.len);
+                       v.estSize += v.val.string.len;
                        break;
                case JSON_TOKEN_NUMBER:
                        /*
@@ -309,16 +309,16 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
                         */
                        Assert (token != NULL);
                        v.type = jbvNumeric;
-                       v.numeric = DatumGetNumeric(DirectFunctionCall3(numeric_in, CStringGetDatum(token), 0, -1));
-                       v.estSize += VARSIZE_ANY(v.numeric) + sizeof(JEntry) /* alignment */ ;
+                       v.val.numeric = DatumGetNumeric(DirectFunctionCall3(numeric_in, CStringGetDatum(token), 0, -1));
+                       v.estSize += VARSIZE_ANY(v.val.numeric) + sizeof(JEntry) /* alignment */ ;
                        break;
                case JSON_TOKEN_TRUE:
                        v.type = jbvBool;
-                       v.boolean = true;
+                       v.val.boolean = true;
                        break;
                case JSON_TOKEN_FALSE:
                        v.type = jbvBool;
-                       v.boolean = false;
+                       v.val.boolean = false;
                        break;
                case JSON_TOKEN_NULL:
                        v.type = jbvNull;
@@ -335,8 +335,8 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
                JsonbValue      va;
 
                va.type = jbvArray;
-               va.array.rawScalar = true;
-               va.array.nElems = 1;
+               va.val.array.rawScalar = true;
+               va.val.array.nElems = 1;
 
                _state->res = pushJsonbValue(&_state->parseState, WJB_BEGIN_ARRAY, &va);
                _state->res = pushJsonbValue(&_state->parseState, WJB_ELEM, &v);
@@ -399,7 +399,7 @@ JsonbToCString(StringInfo out, JsonbSuperHeader in, int estimated_len)
                                        appendBinaryStringInfo(out, ", ", 2);
                                first = true;
 
-                               if (!v.array.rawScalar)
+                               if (!v.val.array.rawScalar)
                                        appendStringInfoChar(out, '[');
                                level++;
                                break;
@@ -448,7 +448,7 @@ JsonbToCString(StringInfo out, JsonbSuperHeader in, int estimated_len)
                                break;
                        case WJB_END_ARRAY:
                                level--;
-                               if (!v.array.rawScalar)
+                               if (!v.val.array.rawScalar)
                                        appendStringInfoChar(out, ']');
                                first = false;
                                break;
index 32ca024c694b5995559833a0b8f4eae828fa23f9..62546ebaf28e39565456451f953b9ab5c6033201 100644 (file)
@@ -618,7 +618,7 @@ make_scalar_key(const JsonbValue * scalarVal, char flag)
                        item = make_text_key("n", 1, flag);
                        break;
                case jbvBool:
-                       item = make_text_key(scalarVal->boolean ? "t" : "f", 1, flag);
+                       item = make_text_key(scalarVal->val.boolean ? "t" : "f", 1, flag);
                        break;
                case jbvNumeric:
                        /*
@@ -630,12 +630,12 @@ make_scalar_key(const JsonbValue * scalarVal, char flag)
                         * storing a "union" type in the GIN B-Tree, and indexing Jsonb
                         * strings takes precedence.
                         */
-                       cstr = numeric_normalize(scalarVal->numeric);
+                       cstr = numeric_normalize(scalarVal->val.numeric);
                        item = make_text_key(cstr, strlen(cstr), flag);
                        pfree(cstr);
                        break;
                case jbvString:
-                       item = make_text_key(scalarVal->string.val, scalarVal->string.len,
+                       item = make_text_key(scalarVal->val.string.val, scalarVal->val.string.len,
                                                                 flag);
                        break;
                default:
index d6b1855c195f8eedab0ac6afff2e9a142cf92ef1..cfddccbbbbf7716bdf9357c849b36d15071f8949 100644 (file)
@@ -31,8 +31,8 @@ jsonb_exists(PG_FUNCTION_ARGS)
         * top level.  No recursion occurs.
         */
        kval.type = jbvString;
-       kval.string.val = VARDATA_ANY(key);
-       kval.string.len = VARSIZE_ANY_EXHDR(key);
+       kval.val.string.val = VARDATA_ANY(key);
+       kval.val.string.len = VARSIZE_ANY_EXHDR(key);
 
        v = findJsonbValueFromSuperHeader(VARDATA(jb),
                                                                          JB_FOBJECT | JB_FARRAY,
@@ -52,7 +52,7 @@ jsonb_exists_any(PG_FUNCTION_ARGS)
                                lowbound = 0;
        int                     i;
 
-       if (arrKey == NULL || arrKey->object.nPairs == 0)
+       if (arrKey == NULL || arrKey->val.object.nPairs == 0)
                PG_RETURN_BOOL(false);
 
        if (JB_ROOT_IS_OBJECT(jb))
@@ -64,12 +64,12 @@ jsonb_exists_any(PG_FUNCTION_ARGS)
         * each search can start one entry past the previous "found" entry, or at
         * the lower bound of the last search.
         */
-       for (i = 0; i < arrKey->array.nElems; i++)
+       for (i = 0; i < arrKey->val.array.nElems; i++)
        {
                if (findJsonbValueFromSuperHeader(VARDATA(jb),
                                                                                  JB_FOBJECT | JB_FARRAY,
                                                                                  plowbound,
-                                                                                 arrKey->array.elems + i) != NULL)
+                                                                                 arrKey->val.array.elems + i) != NULL)
                        PG_RETURN_BOOL(true);
        }
 
@@ -86,7 +86,7 @@ jsonb_exists_all(PG_FUNCTION_ARGS)
        uint32          lowbound = 0;
        int                     i;
 
-       if (arrKey == NULL || arrKey->array.nElems == 0)
+       if (arrKey == NULL || arrKey->val.array.nElems == 0)
                PG_RETURN_BOOL(true);
 
        if (JB_ROOT_IS_OBJECT(jb))
@@ -98,12 +98,12 @@ jsonb_exists_all(PG_FUNCTION_ARGS)
         * each search can start one entry past the previous "found" entry, or at
         * the lower bound of the last search.
         */
-       for (i = 0; i < arrKey->array.nElems; i++)
+       for (i = 0; i < arrKey->val.array.nElems; i++)
        {
                if (findJsonbValueFromSuperHeader(VARDATA(jb),
                                                                                  JB_FOBJECT | JB_FARRAY,
                                                                                  plowbound,
-                                                                                 arrKey->array.elems + i) == NULL)
+                                                                                 arrKey->val.array.elems + i) == NULL)
                        PG_RETURN_BOOL(false);
        }
 
index 86e48a322e038592992250094c2294df80c1c8ee..1ac145b1cd94a17b141d6658414bc7182b5b6aff 100644 (file)
@@ -120,8 +120,8 @@ JsonbValueToJsonb(JsonbValue * val)
                JsonbValue      scalarArray;
 
                scalarArray.type = jbvArray;
-               scalarArray.array.rawScalar = true;
-               scalarArray.array.nElems = 1;
+               scalarArray.val.array.rawScalar = true;
+               scalarArray.val.array.nElems = 1;
 
                pushJsonbValue(&pstate, WJB_BEGIN_ARRAY, &scalarArray);
                pushJsonbValue(&pstate, WJB_ELEM, val);
@@ -142,9 +142,9 @@ JsonbValueToJsonb(JsonbValue * val)
        else
        {
                Assert(val->type == jbvBinary);
-               out = palloc(VARHDRSZ + val->binary.len);
-               SET_VARSIZE(out, VARHDRSZ + val->binary.len);
-               memcpy(VARDATA(out), val->binary.data, val->binary.len);
+               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);
        }
 
        return out;
@@ -214,14 +214,14 @@ compareJsonbSuperHeaderValue(JsonbSuperHeader a, JsonbSuperHeader b)
                                                 * general type-based comparisons to apply, and as far
                                                 * as we're concerned a pseudo array is just a scalar.
                                                 */
-                                               if (va.array.rawScalar != vb.array.rawScalar)
-                                                       res = (va.array.rawScalar) ? -1 : 1;
-                                               if (va.array.nElems != vb.array.nElems)
-                                                       res = (va.array.nElems > vb.array.nElems) ? 1 : -1;
+                                               if (va.val.array.rawScalar != vb.val.array.rawScalar)
+                                                       res = (va.val.array.rawScalar) ? -1 : 1;
+                                               if (va.val.array.nElems != vb.val.array.nElems)
+                                                       res = (va.val.array.nElems > vb.val.array.nElems) ? 1 : -1;
                                                break;
                                        case jbvObject:
-                                               if (va.object.nPairs != vb.object.nPairs)
-                                                       res = (va.object.nPairs > vb.object.nPairs) ? 1 : -1;
+                                               if (va.val.object.nPairs != vb.val.object.nPairs)
+                                                       res = (va.val.object.nPairs > vb.val.object.nPairs) ? 1 : -1;
                                                break;
                                        case jbvBinary:
                                                elog(ERROR, "unexpected jbvBinary value");
@@ -339,21 +339,21 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                        else if (JBE_ISSTRING(*e) && key->type == jbvString)
                        {
                                result->type = jbvString;
-                               result->string.val = data + JBE_OFF(*e);
-                               result->string.len = JBE_LEN(*e);
-                               result->estSize = sizeof(JEntry) + result->string.len;
+                               result->val.string.val = data + JBE_OFF(*e);
+                               result->val.string.len = JBE_LEN(*e);
+                               result->estSize = sizeof(JEntry) + result->val.string.len;
                        }
                        else if (JBE_ISNUMERIC(*e) && key->type == jbvNumeric)
                        {
                                result->type = jbvNumeric;
-                               result->numeric = (Numeric) (data + INTALIGN(JBE_OFF(*e)));
+                               result->val.numeric = (Numeric) (data + INTALIGN(JBE_OFF(*e)));
                                result->estSize = 2 * sizeof(JEntry) +
-                                       VARSIZE_ANY(result->numeric);
+                                       VARSIZE_ANY(result->val.numeric);
                        }
                        else if (JBE_ISBOOL(*e) && key->type == jbvBool)
                        {
                                result->type = jbvBool;
-                               result->boolean = JBE_ISBOOL_TRUE(*e) != 0;
+                               result->val.boolean = JBE_ISBOOL_TRUE(*e) != 0;
                                result->estSize = sizeof(JEntry);
                        }
                        else
@@ -389,9 +389,9 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                        entry = array + stopMiddle * 2;
 
                        candidate.type = jbvString;
-                       candidate.string.val = data + JBE_OFF(*entry);
-                       candidate.string.len = JBE_LEN(*entry);
-                       candidate.estSize = sizeof(JEntry) + candidate.string.len;
+                       candidate.val.string.val = data + JBE_OFF(*entry);
+                       candidate.val.string.len = JBE_LEN(*entry);
+                       candidate.estSize = sizeof(JEntry) + candidate.val.string.len;
 
                        difference = lengthCompareJsonbStringValue(&candidate, key, NULL);
 
@@ -411,21 +411,21 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                                else if (JBE_ISSTRING(*v))
                                {
                                        result->type = jbvString;
-                                       result->string.val = data + JBE_OFF(*v);
-                                       result->string.len = JBE_LEN(*v);
-                                       result->estSize = sizeof(JEntry) + result->string.len;
+                                       result->val.string.val = data + JBE_OFF(*v);
+                                       result->val.string.len = JBE_LEN(*v);
+                                       result->estSize = sizeof(JEntry) + result->val.string.len;
                                }
                                else if (JBE_ISNUMERIC(*v))
                                {
                                        result->type = jbvNumeric;
-                                       result->numeric = (Numeric) (data + INTALIGN(JBE_OFF(*v)));
+                                       result->val.numeric = (Numeric) (data + INTALIGN(JBE_OFF(*v)));
                                        result->estSize = 2 * sizeof(JEntry) +
-                                               VARSIZE_ANY(result->numeric);
+                                               VARSIZE_ANY(result->val.numeric);
                                }
                                else if (JBE_ISBOOL(*v))
                                {
                                        result->type = jbvBool;
-                                       result->boolean = JBE_ISBOOL_TRUE(*v) != 0;
+                                       result->val.boolean = JBE_ISBOOL_TRUE(*v) != 0;
                                        result->estSize = sizeof(JEntry);
                                }
                                else
@@ -435,10 +435,10 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                                         * with arrays
                                         */
                                        result->type = jbvBinary;
-                                       result->binary.data = data + INTALIGN(JBE_OFF(*v));
-                                       result->binary.len = JBE_LEN(*v) -
+                                       result->val.binary.data = data + INTALIGN(JBE_OFF(*v));
+                                       result->val.binary.len = JBE_LEN(*v) -
                                                (INTALIGN(JBE_OFF(*v)) - JBE_OFF(*v));
-                                       result->estSize = 2 * sizeof(JEntry) + result->binary.len;
+                                       result->estSize = 2 * sizeof(JEntry) + result->val.binary.len;
                                }
 
                                return result;
@@ -500,28 +500,28 @@ getIthJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 i)
        else if (JBE_ISSTRING(*e))
        {
                result->type = jbvString;
-               result->string.val = data + JBE_OFF(*e);
-               result->string.len = JBE_LEN(*e);
-               result->estSize = sizeof(JEntry) + result->string.len;
+               result->val.string.val = data + JBE_OFF(*e);
+               result->val.string.len = JBE_LEN(*e);
+               result->estSize = sizeof(JEntry) + result->val.string.len;
        }
        else if (JBE_ISNUMERIC(*e))
        {
                result->type = jbvNumeric;
-               result->numeric = (Numeric) (data + INTALIGN(JBE_OFF(*e)));
-               result->estSize = 2 * sizeof(JEntry) + VARSIZE_ANY(result->numeric);
+               result->val.numeric = (Numeric) (data + INTALIGN(JBE_OFF(*e)));
+               result->estSize = 2 * sizeof(JEntry) + VARSIZE_ANY(result->val.numeric);
        }
        else if (JBE_ISBOOL(*e))
        {
                result->type = jbvBool;
-               result->boolean = JBE_ISBOOL_TRUE(*e) != 0;
+               result->val.boolean = JBE_ISBOOL_TRUE(*e) != 0;
                result->estSize = sizeof(JEntry);
        }
        else
        {
                result->type = jbvBinary;
-               result->binary.data = data + INTALIGN(JBE_OFF(*e));
-               result->binary.len = JBE_LEN(*e) - (INTALIGN(JBE_OFF(*e)) - JBE_OFF(*e));
-               result->estSize = result->binary.len + 2 * sizeof(JEntry);
+               result->val.binary.data = data + INTALIGN(JBE_OFF(*e));
+               result->val.binary.len = JBE_LEN(*e) - (INTALIGN(JBE_OFF(*e)) - JBE_OFF(*e));
+               result->estSize = result->val.binary.len + 2 * sizeof(JEntry);
        }
 
        return result;
@@ -548,25 +548,25 @@ pushJsonbValue(JsonbParseState ** pstate, int seq, JsonbValue * scalarVal)
        switch (seq)
        {
                case WJB_BEGIN_ARRAY:
-                       Assert(!scalarVal || scalarVal->array.rawScalar);
+                       Assert(!scalarVal || scalarVal->val.array.rawScalar);
                        *pstate = pushState(pstate);
                        result = &(*pstate)->contVal;
                        (*pstate)->contVal.type = jbvArray;
                        (*pstate)->contVal.estSize = 3 * sizeof(JEntry);
-                       (*pstate)->contVal.array.nElems = 0;
-                       (*pstate)->contVal.array.rawScalar = (scalarVal &&
-                                                                                                 scalarVal->array.rawScalar);
-                       if (scalarVal && scalarVal->array.nElems > 0)
+                       (*pstate)->contVal.val.array.nElems = 0;
+                       (*pstate)->contVal.val.array.rawScalar = (scalarVal &&
+                                                                                                 scalarVal->val.array.rawScalar);
+                       if (scalarVal && scalarVal->val.array.nElems > 0)
                        {
                                /* Assume that this array is still really a scalar */
                                Assert(scalarVal->type == jbvArray);
-                               (*pstate)->size = scalarVal->array.nElems;
+                               (*pstate)->size = scalarVal->val.array.nElems;
                        }
                        else
                        {
                                (*pstate)->size = 4;
                        }
-                       (*pstate)->contVal.array.elems = palloc(sizeof(JsonbValue) *
+                       (*pstate)->contVal.val.array.elems = palloc(sizeof(JsonbValue) *
                                                                                                        (*pstate)->size);
                        break;
                case WJB_BEGIN_OBJECT:
@@ -575,9 +575,9 @@ pushJsonbValue(JsonbParseState ** pstate, int seq, JsonbValue * scalarVal)
                        result = &(*pstate)->contVal;
                        (*pstate)->contVal.type = jbvObject;
                        (*pstate)->contVal.estSize = 3 * sizeof(JEntry);
-                       (*pstate)->contVal.object.nPairs = 0;
+                       (*pstate)->contVal.val.object.nPairs = 0;
                        (*pstate)->size = 4;
-                       (*pstate)->contVal.object.pairs = palloc(sizeof(JsonbPair) *
+                       (*pstate)->contVal.val.object.pairs = palloc(sizeof(JsonbPair) *
                                                                                                         (*pstate)->size);
                        break;
                case WJB_KEY:
@@ -693,12 +693,12 @@ JsonbIteratorNext(JsonbIterator ** it, JsonbValue * val, bool skipNested)
                {
                        /* Set v to array on first array call */
                        val->type = jbvArray;
-                       val->array.nElems = (*it)->nElems;
+                       val->val.array.nElems = (*it)->nElems;
                        /*
-                        * v->array.elems is not actually set, because we aren't doing a
+                        * v->val.array.elems is not actually set, because we aren't doing a
                         * full conversion
                         */
-                       val->array.rawScalar = (*it)->isScalar;
+                       val->val.array.rawScalar = (*it)->isScalar;
                        (*it)->i = 0;
                        /* Set state for next call */
                        (*it)->state = jbi_elem;
@@ -740,10 +740,10 @@ JsonbIteratorNext(JsonbIterator ** it, JsonbValue * val, bool skipNested)
                {
                        /* Set v to object on first object call */
                        val->type = jbvObject;
-                       val->object.nPairs = (*it)->nElems;
+                       val->val.object.nPairs = (*it)->nElems;
                        /*
-                        * v->object.pairs is not actually set, because we aren't doing a
-                        * full conversion
+                        * v->val.object.pairs is not actually set, because we aren't
+                        * doing a full conversion
                         */
                        (*it)->i = 0;
                        /* Set state for next call */
@@ -903,8 +903,8 @@ JsonbDeepContains(JsonbIterator ** val, JsonbIterator ** mContained)
                                Assert(lhsVal->type == jbvBinary);
                                Assert(vcontained.type == jbvBinary);
 
-                               nestval = JsonbIteratorInit(lhsVal->binary.data);
-                               nestContained = JsonbIteratorInit(vcontained.binary.data);
+                               nestval = JsonbIteratorInit(lhsVal->val.binary.data);
+                               nestContained = JsonbIteratorInit(vcontained.val.binary.data);
 
                                /*
                                 * Match "value" side of rhs datum object's pair recursively.
@@ -933,7 +933,7 @@ JsonbDeepContains(JsonbIterator ** val, JsonbIterator ** mContained)
        else if (rcont == WJB_BEGIN_ARRAY)
        {
                JsonbValue *lhsConts = NULL;
-               uint32          nLhsElems = vval.array.nElems;
+               uint32          nLhsElems = vval.val.array.nElems;
 
                Assert(vcontained.type == jbvArray);
 
@@ -947,7 +947,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.array.rawScalar && !vcontained.array.rawScalar)
+               if (vval.val.array.rawScalar && !vcontained.val.array.rawScalar)
                        return false;
 
                /* Work through rhs "is it contained within?" array */
@@ -1012,8 +1012,8 @@ JsonbDeepContains(JsonbIterator ** val, JsonbIterator ** mContained)
                                        JsonbIterator  *nestval, *nestContained;
                                        bool                    contains;
 
-                                       nestval = JsonbIteratorInit(lhsConts[i].binary.data);
-                                       nestContained = JsonbIteratorInit(vcontained.binary.data);
+                                       nestval = JsonbIteratorInit(lhsConts[i].val.binary.data);
+                                       nestContained = JsonbIteratorInit(vcontained.val.binary.data);
 
                                        contains = JsonbDeepContains(&nestval, &nestContained);
 
@@ -1081,20 +1081,20 @@ arrayToJsonbSortedArray(ArrayType *array)
 
        result = palloc(sizeof(JsonbValue));
        result->type = jbvArray;
-       result->array.rawScalar = false;
-       result->array.elems = palloc(sizeof(JsonbPair) * elem_count);
+       result->val.array.rawScalar = false;
+       result->val.array.elems = palloc(sizeof(JsonbPair) * elem_count);
 
        for (i = 0, j = 0; i < elem_count; i++)
        {
                if (!key_nulls[i])
                {
-                       result->array.elems[j].type = jbvString;
-                       result->array.elems[j].string.val = VARDATA(key_datums[i]);
-                       result->array.elems[j].string.len = VARSIZE(key_datums[i]) - VARHDRSZ;
+                       result->val.array.elems[j].type = jbvString;
+                       result->val.array.elems[j].val.string.val = VARDATA(key_datums[i]);
+                       result->val.array.elems[j].val.string.len = VARSIZE(key_datums[i]) - VARHDRSZ;
                        j++;
                }
        }
-       result->array.nElems = j;
+       result->val.array.nElems = j;
 
        uniqueifyJsonbArray(result);
        return result;
@@ -1124,18 +1124,18 @@ JsonbHashScalarValue(const JsonbValue * scalarVal, uint32 * hash)
                        *hash ^= 0x01;
                        return;
                case jbvString:
-                       tmp = hash_any((unsigned char *) scalarVal->string.val,
-                                                  scalarVal->string.len);
+                       tmp = hash_any((unsigned char *) scalarVal->val.string.val,
+                                                  scalarVal->val.string.len);
                        *hash ^= tmp;
                        return;
                case jbvNumeric:
                        /* Must be unaffected by trailing zeroes */
                        tmp = DatumGetInt32(DirectFunctionCall1(hash_numeric,
-                                                                                                       NumericGetDatum(scalarVal->numeric)));
+                                                                                                       NumericGetDatum(scalarVal->val.numeric)));
                        *hash ^= tmp;
                        return;
                case jbvBool:
-                       *hash ^= scalarVal->boolean? 0x02:0x04;
+                       *hash ^= scalarVal->val.boolean? 0x02:0x04;
                        return;
                default:
                        elog(ERROR, "invalid jsonb scalar type");
@@ -1162,11 +1162,11 @@ compareJsonbScalarValue(JsonbValue * aScalar, JsonbValue * bScalar)
                                return lengthCompareJsonbStringValue(aScalar, bScalar, NULL);
                        case jbvNumeric:
                                return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
-                                                                                                                PointerGetDatum(aScalar->numeric),
-                                                                                                                PointerGetDatum(bScalar->numeric)));
+                                                                                                                PointerGetDatum(aScalar->val.numeric),
+                                                                                                                PointerGetDatum(bScalar->val.numeric)));
                        case jbvBool:
-                               if (aScalar->boolean != bScalar->boolean)
-                                       return (aScalar->boolean > bScalar->boolean) ? 1 : -1;
+                               if (aScalar->val.boolean != bScalar->val.boolean)
+                                       return (aScalar->val.boolean > bScalar->val.boolean) ? 1 : -1;
                                else
                                        return 0;
                        default:
@@ -1192,8 +1192,8 @@ lexicalCompareJsonbStringValue(const void *a, const void *b)
        Assert(va->type == jbvString);
        Assert(vb->type == jbvString);
 
-       return varstr_cmp(va->string.val, va->string.len, vb->string.val,
-                                         vb->string.len, DEFAULT_COLLATION_OID);
+       return varstr_cmp(va->val.string.val, va->val.string.len, vb->val.string.val,
+                                         vb->val.string.len, DEFAULT_COLLATION_OID);
 }
 
 /*
@@ -1247,14 +1247,14 @@ walkJsonbValueConversion(JsonbValue * val, convertState * cstate,
                case jbvArray:
 
                        putJsonbValueConversion(cstate, val, WJB_BEGIN_ARRAY, nestlevel);
-                       for (i = 0; i < val->array.nElems; i++)
+                       for (i = 0; i < val->val.array.nElems; i++)
                        {
-                               if (IsAJsonbScalar(&val->array.elems[i]) ||
-                                       val->array.elems[i].type == jbvBinary)
-                                       putJsonbValueConversion(cstate, val->array.elems + i,
+                               if (IsAJsonbScalar(&val->val.array.elems[i]) ||
+                                       val->val.array.elems[i].type == jbvBinary)
+                                       putJsonbValueConversion(cstate, val->val.array.elems + i,
                                                                                        WJB_ELEM, nestlevel);
                                else
-                                       walkJsonbValueConversion(val->array.elems + i, cstate,
+                                       walkJsonbValueConversion(val->val.array.elems + i, cstate,
                                                                                         nestlevel + 1);
                        }
                        putJsonbValueConversion(cstate, val, WJB_END_ARRAY, nestlevel);
@@ -1263,18 +1263,18 @@ walkJsonbValueConversion(JsonbValue * val, convertState * cstate,
                case jbvObject:
 
                        putJsonbValueConversion(cstate, val, WJB_BEGIN_OBJECT, nestlevel);
-                       for (i = 0; i < val->object.nPairs; i++)
+                       for (i = 0; i < val->val.object.nPairs; i++)
                        {
-                               putJsonbValueConversion(cstate, &val->object.pairs[i].key,
+                               putJsonbValueConversion(cstate, &val->val.object.pairs[i].key,
                                                                                WJB_KEY, nestlevel);
 
-                               if (IsAJsonbScalar(&val->object.pairs[i].value) ||
-                                       val->object.pairs[i].value.type == jbvBinary)
+                               if (IsAJsonbScalar(&val->val.object.pairs[i].value) ||
+                                       val->val.object.pairs[i].value.type == jbvBinary)
                                        putJsonbValueConversion(cstate,
-                                                                                       &val->object.pairs[i].value,
+                                                                                       &val->val.object.pairs[i].value,
                                                                                        WJB_VALUE, nestlevel);
                                else
-                                       walkJsonbValueConversion(&val->object.pairs[i].value,
+                                       walkJsonbValueConversion(&val->val.object.pairs[i].value,
                                                                                         cstate, nestlevel + 1);
                        }
                        putJsonbValueConversion(cstate, val, WJB_END_OBJECT, nestlevel);
@@ -1351,20 +1351,20 @@ putJsonbValueConversion(convertState * cstate, JsonbValue * val, uint32 flags,
 
                if (val->type == jbvArray)
                {
-                       *cstate->contPtr->header = val->array.nElems | JB_FARRAY;
-                       cstate->ptr += sizeof(JEntry) * val->array.nElems;
+                       *cstate->contPtr->header = val->val.array.nElems | JB_FARRAY;
+                       cstate->ptr += sizeof(JEntry) * val->val.array.nElems;
 
-                       if (val->array.rawScalar)
+                       if (val->val.array.rawScalar)
                        {
-                               Assert(val->array.nElems == 1);
+                               Assert(val->val.array.nElems == 1);
                                Assert(level == 0);
                                *cstate->contPtr->header |= JB_FSCALAR;
                        }
                }
                else
                {
-                       *cstate->contPtr->header = val->object.nPairs | JB_FOBJECT;
-                       cstate->ptr += sizeof(JEntry) * val->object.nPairs * 2;
+                       *cstate->contPtr->header = val->val.object.nPairs | JB_FOBJECT;
+                       cstate->ptr += sizeof(JEntry) * val->val.object.nPairs * 2;
                }
        }
        else if (flags & WJB_ELEM)
@@ -1466,21 +1466,21 @@ putScalarConversion(convertState * cstate, JsonbValue * scalarVal, uint32 level,
                                        cstate->contPtr->meta[i - 1].header & JENTRY_POSMASK;
                        break;
                case jbvString:
-                       memcpy(cstate->ptr, scalarVal->string.val, scalarVal->string.len);
-                       cstate->ptr += scalarVal->string.len;
+                       memcpy(cstate->ptr, scalarVal->val.string.val, scalarVal->val.string.len);
+                       cstate->ptr += scalarVal->val.string.len;
 
                        if (i == 0)
-                               cstate->contPtr->meta[0].header |= scalarVal->string.len;
+                               cstate->contPtr->meta[0].header |= scalarVal->val.string.len;
                        else
                                cstate->contPtr->meta[i].header |=
                                        (cstate->contPtr->meta[i - 1].header & JENTRY_POSMASK) +
-                                       scalarVal->string.len;
+                                       scalarVal->val.string.len;
                        break;
                case jbvNumeric:
-                       numlen = VARSIZE_ANY(scalarVal->numeric);
+                       numlen = VARSIZE_ANY(scalarVal->val.numeric);
                        padlen = addPaddingInt(cstate);
 
-                       memcpy(cstate->ptr, scalarVal->numeric, numlen);
+                       memcpy(cstate->ptr, scalarVal->val.numeric, numlen);
                        cstate->ptr += numlen;
 
                        cstate->contPtr->meta[i].header |= JENTRY_ISNUMERIC;
@@ -1492,7 +1492,7 @@ putScalarConversion(convertState * cstate, JsonbValue * scalarVal, uint32 level,
                                        + padlen + numlen;
                        break;
                case jbvBool:
-                       cstate->contPtr->meta[i].header |= (scalarVal->boolean) ?
+                       cstate->contPtr->meta[i].header |= (scalarVal->val.boolean) ?
                                JENTRY_ISTRUE : JENTRY_ISFALSE;
 
                        if (i > 0)
@@ -1575,24 +1575,24 @@ formIterIsContainer(JsonbIterator ** it, JsonbValue * val, JEntry * ent,
        else if (JBE_ISSTRING(*ent))
        {
                val->type = jbvString;
-               val->string.val = (*it)->dataProper + JBE_OFF(*ent);
-               val->string.len = JBE_LEN(*ent);
-               val->estSize = sizeof(JEntry) + val->string.len;
+               val->val.string.val = (*it)->dataProper + JBE_OFF(*ent);
+               val->val.string.len = JBE_LEN(*ent);
+               val->estSize = sizeof(JEntry) + val->val.string.len;
 
                return false;
        }
        else if (JBE_ISNUMERIC(*ent))
        {
                val->type = jbvNumeric;
-               val->numeric = (Numeric) ((*it)->dataProper + INTALIGN(JBE_OFF(*ent)));
-               val->estSize = 2 * sizeof(JEntry) + VARSIZE_ANY(val->numeric);
+               val->val.numeric = (Numeric) ((*it)->dataProper + INTALIGN(JBE_OFF(*ent)));
+               val->estSize = 2 * sizeof(JEntry) + VARSIZE_ANY(val->val.numeric);
 
                return false;
        }
        else if (JBE_ISBOOL(*ent))
        {
                val->type = jbvBool;
-               val->boolean = JBE_ISBOOL_TRUE(*ent) != 0;
+               val->val.boolean = JBE_ISBOOL_TRUE(*ent) != 0;
                val->estSize = sizeof(JEntry);
 
                return false;
@@ -1600,9 +1600,9 @@ formIterIsContainer(JsonbIterator ** it, JsonbValue * val, JEntry * ent,
        else if (skipNested)
        {
                val->type = jbvBinary;
-               val->binary.data = (*it)->dataProper + INTALIGN(JBE_OFF(*ent));
-               val->binary.len = JBE_LEN(*ent) - (INTALIGN(JBE_OFF(*ent)) - JBE_OFF(*ent));
-               val->estSize = val->binary.len + 2 * sizeof(JEntry);
+               val->val.binary.data = (*it)->dataProper + INTALIGN(JBE_OFF(*ent));
+               val->val.binary.len = JBE_LEN(*ent) - (INTALIGN(JBE_OFF(*ent)) - JBE_OFF(*ent));
+               val->estSize = val->val.binary.len + 2 * sizeof(JEntry);
 
                return false;
        }
@@ -1662,21 +1662,21 @@ appendKey(JsonbParseState * pstate, JsonbValue * string)
        Assert(object->type == jbvObject);
        Assert(string->type == jbvString);
 
-       if (object->object.nPairs >= JSONB_MAX_PAIRS)
+       if (object->val.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->object.nPairs >= pstate->size)
+       if (object->val.object.nPairs >= pstate->size)
        {
                pstate->size *= 2;
-               object->object.pairs = repalloc(object->object.pairs,
+               object->val.object.pairs = repalloc(object->val.object.pairs,
                                                                                sizeof(JsonbPair) * pstate->size);
        }
 
-       object->object.pairs[object->object.nPairs].key = *string;
-       object->object.pairs[object->object.nPairs].order = object->object.nPairs;
+       object->val.object.pairs[object->val.object.nPairs].key = *string;
+       object->val.object.pairs[object->val.object.nPairs].order = object->val.object.nPairs;
 
        object->estSize += string->estSize;
 }
@@ -1692,7 +1692,7 @@ appendValue(JsonbParseState * pstate, JsonbValue * scalarVal)
 
        Assert(object->type == jbvObject);
 
-       object->object.pairs[object->object.nPairs++].value = *scalarVal;
+       object->val.object.pairs[object->val.object.nPairs++].value = *scalarVal;
        object->estSize += scalarVal->estSize;
 }
 
@@ -1706,20 +1706,20 @@ appendElement(JsonbParseState * pstate, JsonbValue * scalarVal)
 
        Assert(array->type == jbvArray);
 
-       if (array->array.nElems >= JSONB_MAX_ELEMS)
+       if (array->val.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->array.nElems >= pstate->size)
+       if (array->val.array.nElems >= pstate->size)
        {
                pstate->size *= 2;
-               array->array.elems = repalloc(array->array.elems,
+               array->val.array.elems = repalloc(array->val.array.elems,
                                                                          sizeof(JsonbValue) * pstate->size);
        }
 
-       array->array.elems[array->array.nElems++] = *scalarVal;
+       array->val.array.elems[array->val.array.nElems++] = *scalarVal;
        array->estSize += scalarVal->estSize;
 }
 
@@ -1749,15 +1749,15 @@ lengthCompareJsonbStringValue(const void *a, const void *b, void *binequal)
        Assert(va->type == jbvString);
        Assert(vb->type == jbvString);
 
-       if (va->string.len == vb->string.len)
+       if (va->val.string.len == vb->val.string.len)
        {
-               res = memcmp(va->string.val, vb->string.val, va->string.len);
+               res = memcmp(va->val.string.val, vb->val.string.val, va->val.string.len);
                if (res == 0 && binequal)
                        *((bool *) binequal) = true;
        }
        else
        {
-               res = (va->string.len > vb->string.len) ? 1 : -1;
+               res = (va->val.string.len > vb->val.string.len) ? 1 : -1;
        }
 
        return res;
@@ -1803,16 +1803,16 @@ uniqueifyJsonbObject(JsonbValue * object)
 
        Assert(object->type == jbvObject);
 
-       if (object->object.nPairs > 1)
-               qsort_arg(object->object.pairs, object->object.nPairs, sizeof(JsonbPair),
+       if (object->val.object.nPairs > 1)
+               qsort_arg(object->val.object.pairs, object->val.object.nPairs, sizeof(JsonbPair),
                                  lengthCompareJsonbPair, &hasNonUniq);
 
        if (hasNonUniq)
        {
-               JsonbPair  *ptr = object->object.pairs + 1,
-                                  *res = object->object.pairs;
+               JsonbPair  *ptr = object->val.object.pairs + 1,
+                                  *res = object->val.object.pairs;
 
-               while (ptr - object->object.pairs < object->object.nPairs)
+               while (ptr - object->val.object.pairs < object->val.object.nPairs)
                {
                        /* Avoid copying over duplicate */
                        if (lengthCompareJsonbStringValue(ptr, res, NULL) == 0)
@@ -1828,7 +1828,7 @@ uniqueifyJsonbObject(JsonbValue * object)
                        ptr++;
                }
 
-               object->object.nPairs = res + 1 - object->object.pairs;
+               object->val.object.nPairs = res + 1 - object->val.object.pairs;
        }
 }
 
@@ -1848,17 +1848,17 @@ uniqueifyJsonbArray(JsonbValue * array)
         * Actually sort values, determining if any were equal on the basis of full
         * binary equality (rather than just having the same string length).
         */
-       if (array->array.nElems > 1)
-               qsort_arg(array->array.elems, array->array.nElems,
+       if (array->val.array.nElems > 1)
+               qsort_arg(array->val.array.elems, array->val.array.nElems,
                                  sizeof(JsonbValue), lengthCompareJsonbStringValue,
                                  &hasNonUniq);
 
        if (hasNonUniq)
        {
-               JsonbValue *ptr = array->array.elems + 1,
-                                  *res = array->array.elems;
+               JsonbValue *ptr = array->val.array.elems + 1,
+                                  *res = array->val.array.elems;
 
-               while (ptr - array->array.elems < array->array.nElems)
+               while (ptr - array->val.array.elems < array->val.array.nElems)
                {
                        /* Avoid copying over duplicate */
                        if (lengthCompareJsonbStringValue(ptr, res, NULL) != 0)
@@ -1870,6 +1870,6 @@ uniqueifyJsonbArray(JsonbValue * array)
                        ptr++;
                }
 
-               array->array.nElems = res + 1 - array->array.elems;
+               array->val.array.nElems = res + 1 - array->val.array.elems;
        }
 }
index 73923951e8073a0715f98a9951f93ac18caa7584..2423b737c9e48db49675de1ed83efc7e59d47f48 100644 (file)
@@ -295,9 +295,9 @@ jsonb_object_keys(PG_FUNCTION_ARGS)
                        {
                                char       *cstr;
 
-                               cstr = palloc(v.string.len + 1 * sizeof(char));
-                               memcpy(cstr, v.string.val, v.string.len);
-                               cstr[v.string.len] = '\0';
+                               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';
                                state->result[state->result_count++] = cstr;
                        }
                }
@@ -491,7 +491,7 @@ jsonb_object_field(PG_FUNCTION_ARGS)
 
                if (r == WJB_KEY)
                {
-                       if (klen == v.string.len && strncmp(key, v.string.val, klen) == 0)
+                       if (klen == v.val.string.len && strncmp(key, v.val.string.val, klen) == 0)
                        {
                                /*
                                 * The next thing the iterator fetches should be the value, no
@@ -552,7 +552,7 @@ jsonb_object_field_text(PG_FUNCTION_ARGS)
 
                if (r == WJB_KEY)
                {
-                       if (klen == v.string.len && strncmp(key, v.string.val, klen) == 0)
+                       if (klen == v.val.string.len && strncmp(key, v.val.string.val, klen) == 0)
                        {
                                text       *result;
 
@@ -568,7 +568,7 @@ jsonb_object_field_text(PG_FUNCTION_ARGS)
                                 */
                                if (v.type == jbvString)
                                {
-                                       result = cstring_to_text_with_len(v.string.val, v.string.len);
+                                       result = cstring_to_text_with_len(v.val.string.val, v.val.string.len);
                                }
                                else if (v.type == jbvNull)
                                {
@@ -699,7 +699,7 @@ jsonb_array_element_text(PG_FUNCTION_ARGS)
 
                                if (v.type == jbvString)
                                {
-                                       result = cstring_to_text_with_len(v.string.val, v.string.len);
+                                       result = cstring_to_text_with_len(v.val.string.val, v.val.string.len);
                                }
                                else if (v.type == jbvNull)
                                {
@@ -1209,11 +1209,11 @@ get_jsonb_path_all(FunctionCallInfo fcinfo, bool as_text)
 
                if (jbvp->type == jbvBinary)
                {
-                       JsonbIterator  *it = JsonbIteratorInit(jbvp->binary.data);
+                       JsonbIterator  *it = JsonbIteratorInit(jbvp->val.binary.data);
                        int                             r;
 
                        r = JsonbIteratorNext(&it, &tv, true);
-                       superHeader = (JsonbSuperHeader) jbvp->binary.data;
+                       superHeader = (JsonbSuperHeader) jbvp->val.binary.data;
                        have_object = r == WJB_BEGIN_OBJECT;
                        have_array = r == WJB_BEGIN_ARRAY;
                }
@@ -1227,7 +1227,7 @@ get_jsonb_path_all(FunctionCallInfo fcinfo, bool as_text)
        if (as_text)
        {
                if (jbvp->type == jbvString)
-                       PG_RETURN_TEXT_P(cstring_to_text_with_len(jbvp->string.val, jbvp->string.len));
+                       PG_RETURN_TEXT_P(cstring_to_text_with_len(jbvp->val.string.val, jbvp->val.string.len));
                else if (jbvp->type == jbvNull)
                        PG_RETURN_NULL();
        }
@@ -1443,7 +1443,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, 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.string.val, v.string.len);
+                       key = cstring_to_text_with_len(v.val.string.val, v.val.string.len);
 
                        /*
                         * The next thing the iterator fetches should be the value, no
@@ -1468,7 +1468,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, bool as_text)
                                        if (v.type == jbvString)
                                        {
                                                /* In text mode, scalar strings should be dequoted */
-                                               sv = cstring_to_text_with_len(v.string.val, v.string.len);
+                                               sv = cstring_to_text_with_len(v.val.string.val, v.val.string.len);
                                        }
                                        else
                                        {
@@ -1788,7 +1788,7 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, bool as_text)
                                        if (v.type == jbvString)
                                        {
                                                /* in text mode scalar strings should be dequoted */
-                                               sv = cstring_to_text_with_len(v.string.val, v.string.len);
+                                               sv = cstring_to_text_with_len(v.val.string.val, v.val.string.len);
                                        }
                                        else
                                        {
@@ -2270,18 +2270,18 @@ populate_record_worker(FunctionCallInfo fcinfo, bool have_record_arg)
                        else
                        {
                                if (v->type == jbvString)
-                                       s = pnstrdup(v->string.val, v->string.len);
+                                       s = pnstrdup(v->val.string.val, v->val.string.len);
                                else if (v->type == jbvBool)
-                                       s = pnstrdup((v->boolean) ? "t" : "f", 1);
+                                       s = pnstrdup((v->val.boolean) ? "t" : "f", 1);
                                else if (v->type == jbvNumeric)
                                        s = DatumGetCString(DirectFunctionCall1(numeric_out,
-                                                                                          PointerGetDatum(v->numeric)));
+                                                                                          PointerGetDatum(v->val.numeric)));
                                else if (!use_json_as_text)
                                        ereport(ERROR,
                                                        (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                         errmsg("cannot populate with a nested object unless use_json_as_text is true")));
                                else if (v->type == jbvBinary)
-                                       s = JsonbToCString(NULL, v->binary.data, v->binary.len);
+                                       s = JsonbToCString(NULL, v->val.binary.data, v->val.binary.len);
                                else
                                        elog(ERROR, "invalid jsonb type");
                        }
@@ -2570,18 +2570,18 @@ make_row_from_rec_and_jsonb(Jsonb * element, PopulateRecordsetState *state)
                        char       *s = NULL;
 
                        if (v->type == jbvString)
-                               s = pnstrdup(v->string.val, v->string.len);
+                               s = pnstrdup(v->val.string.val, v->val.string.len);
                        else if (v->type == jbvBool)
-                               s = pnstrdup((v->boolean) ? "t" : "f", 1);
+                               s = pnstrdup((v->val.boolean) ? "t" : "f", 1);
                        else if (v->type == jbvNumeric)
                                s = DatumGetCString(DirectFunctionCall1(numeric_out,
-                                                                                          PointerGetDatum(v->numeric)));
+                                                                                          PointerGetDatum(v->val.numeric)));
                        else if (!state->use_json_as_text)
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                 errmsg("cannot populate with a nested object unless use_json_as_text is true")));
                        else if (v->type == jbvBinary)
-                               s = JsonbToCString(NULL, v->binary.data, v->binary.len);
+                               s = JsonbToCString(NULL, v->val.binary.data, v->val.binary.len);
                        else
                                elog(ERROR, "invalid jsonb type");
 
@@ -3027,8 +3027,8 @@ findJsonbValueFromSuperHeaderLen(JsonbSuperHeader sheader, uint32 flags,
        JsonbValue      k;
 
        k.type = jbvString;
-       k.string.val = key;
-       k.string.len = keylen;
+       k.val.string.val = key;
+       k.val.string.len = keylen;
 
        return findJsonbValueFromSuperHeader(sheader, flags, NULL, &k);
 }
index a70cbd59400dac9f3f793c14bca8cb4857fbc64b..00a6d4f9e0be139dca627666d6d7c175dbfda1d5 100644 (file)
@@ -141,7 +141,7 @@ typedef struct
 
 /*
  * JsonbValue:  In-memory representation of Jsonb.  This is a convenient
- * deserialized representation, that can easily support using the anonymous
+ * deserialized representation, that can easily support using the "val"
  * union across underlying types during manipulation.  The Jsonb on-disk
  * representation has various alignment considerations.
  */
@@ -192,7 +192,7 @@ struct JsonbValue
                        int                     len;
                        char       *data;
                } binary;
-       };
+       } val;
 };
 
 /*