JsonbValue.size is an estimate
authorPeter Geoghegan <[email protected]>
Sun, 16 Mar 2014 05:55:12 +0000 (22:55 -0700)
committerPeter Geoghegan <[email protected]>
Sun, 16 Mar 2014 05:55:12 +0000 (22:55 -0700)
src/backend/utils/adt/jsonb.c
src/backend/utils/adt/jsonb_util.c
src/backend/utils/adt/jsonfuncs.c
src/include/utils/jsonb.h

index 9944110f69dff60133a04093f0695637772d4b99..a4b7a2c4a64b00a133a8cc90923e3d173c9a1c83 100644 (file)
@@ -244,7 +244,7 @@ jsonb_in_object_field_start(void *state, char *fname, bool isnull)
    v.type = jbvString;
    v.string.len = fname ? checkStringLen(strlen(fname)) : 0;
    v.string.val = fname ? pnstrdup(fname, v.string.len) : NULL;
-   v.size = sizeof(JEntry) + v.string.len;
+   v.estSize = sizeof(JEntry) + v.string.len;
 
    _state->res = pushJsonbValue(&_state->state, WJB_KEY, &v);
 }
@@ -285,7 +285,7 @@ jsonb_in_scalar(void *state, char *token, JsonTokenType tokentype)
    JsonbInState *_state = (JsonbInState *) state;
    JsonbValue  v;
 
-   v.size = sizeof(JEntry);
+   v.estSize = sizeof(JEntry);
 
    switch (tokentype)
    {
@@ -294,13 +294,13 @@ jsonb_in_scalar(void *state, char *token, JsonTokenType tokentype)
            v.type = jbvString;
            v.string.len = token ? checkStringLen(strlen(token)) : 0;
            v.string.val = token ? pnstrdup(token, v.string.len) : NULL;
-           v.size += v.string.len;
+           v.estSize += v.string.len;
            break;
        case JSON_TOKEN_NUMBER:
            v.type = jbvNumeric;
            v.numeric = DatumGetNumeric(DirectFunctionCall3(numeric_in, CStringGetDatum(token), 0, -1));
 
-           v.size += VARSIZE_ANY(v.numeric) +sizeof(JEntry) /* alignment */ ;
+           v.estSize += VARSIZE_ANY(v.numeric) +sizeof(JEntry) /* alignment */ ;
            break;
        case JSON_TOKEN_TRUE:
            v.type = jbvBool;
index b1e8ad6eb2f6307df08bcd5bcf42ac0f42a6a55f..584f1b0271be6406034560f43420a38fc9e80ed4 100644 (file)
@@ -95,18 +95,18 @@ JsonbValueToJsonb(JsonbValue * v)
        pushJsonbValue(&state, WJB_ELEM, v);
        res = pushJsonbValue(&state, WJB_END_ARRAY, NULL);
 
-       out = palloc(VARHDRSZ + res->size);
+       out = palloc(VARHDRSZ + res->estSize);
        sz = convertJsonb(res, out);
-       Assert(sz <= res->size);
+       Assert(sz <= res->estSize);
        SET_VARSIZE(out, sz + VARHDRSZ);
    }
    else if (v->type == jbvObject || v->type == jbvArray)
    {
        uint32      sz;
 
-       out = palloc(VARHDRSZ + v->size);
+       out = palloc(VARHDRSZ + v->estSize);
        sz = convertJsonb(v, out);
-       Assert(sz <= v->size);
+       Assert(sz <= v->estSize);
        SET_VARSIZE(out, VARHDRSZ + sz);
    }
    else
@@ -316,7 +316,7 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                r->type = jbvNull;
                if (lowbound)
                    *lowbound = i;
-               r->size = sizeof(JEntry);
+               r->estSize = sizeof(JEntry);
 
                return r;
            }
@@ -330,7 +330,7 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                    r->type = jbvString;
                    r->string.val = data + JBE_OFF(*e);
                    r->string.len = key->string.len;
-                   r->size = sizeof(JEntry) + r->string.len;
+                   r->estSize = sizeof(JEntry) + r->string.len;
                    if (lowbound)
                        *lowbound = i;
 
@@ -344,7 +344,7 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                {
                    /* Deep copy */
                    *r = *key;
-                   r->size = sizeof(JEntry);
+                   r->estSize = sizeof(JEntry);
                    if (lowbound)
                        *lowbound = i;
 
@@ -419,25 +419,25 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                    r->type = jbvString;
                    r->string.val = data + JBE_OFF(*v);
                    r->string.len = JBE_LEN(*v);
-                   r->size = sizeof(JEntry) + r->string.len;
+                   r->estSize = sizeof(JEntry) + r->string.len;
                }
                else if (JBE_ISBOOL(*v))
                {
                    r->type = jbvBool;
                    r->boolean = JBE_ISBOOL_TRUE(*v) != 0;
-                   r->size = sizeof(JEntry);
+                   r->estSize = sizeof(JEntry);
                }
                else if (JBE_ISNUMERIC(*v))
                {
                    r->type = jbvNumeric;
                    r->numeric = (Numeric) (data + INTALIGN(JBE_OFF(*v)));
 
-                   r->size = 2 * sizeof(JEntry) + VARSIZE_ANY(r->numeric);
+                   r->estSize = 2 * sizeof(JEntry) + VARSIZE_ANY(r->numeric);
                }
                else if (JBE_ISNULL(*v))
                {
                    r->type = jbvNull;
-                   r->size = sizeof(JEntry);
+                   r->estSize = sizeof(JEntry);
                }
                else
                {
@@ -449,7 +449,7 @@ findJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
                    r->binary.data = data + INTALIGN(JBE_OFF(*v));
                    r->binary.len = JBE_LEN(*v) -
                        (INTALIGN(JBE_OFF(*v)) - JBE_OFF(*v));
-                   r->size = 2 * sizeof(JEntry) + r->binary.len;
+                   r->estSize = 2 * sizeof(JEntry) + r->binary.len;
                }
 
                return r;
@@ -516,31 +516,31 @@ getIthJsonbValueFromSuperHeader(JsonbSuperHeader sheader, uint32 flags,
        r->type = jbvString;
        r->string.val = data + JBE_OFF(*e);
        r->string.len = JBE_LEN(*e);
-       r->size = sizeof(JEntry) + r->string.len;
+       r->estSize = sizeof(JEntry) + r->string.len;
    }
    else if (JBE_ISBOOL(*e))
    {
        r->type = jbvBool;
        r->boolean = JBE_ISBOOL_TRUE(*e) != 0;
-       r->size = sizeof(JEntry);
+       r->estSize = sizeof(JEntry);
    }
    else if (JBE_ISNUMERIC(*e))
    {
        r->type = jbvNumeric;
        r->numeric = (Numeric) (data + INTALIGN(JBE_OFF(*e)));
-       r->size = 2 * sizeof(JEntry) + VARSIZE_ANY(r->numeric);
+       r->estSize = 2 * sizeof(JEntry) + VARSIZE_ANY(r->numeric);
    }
    else if (JBE_ISNULL(*e))
    {
        r->type = jbvNull;
-       r->size = sizeof(JEntry);
+       r->estSize = sizeof(JEntry);
    }
    else
    {
        r->type = jbvBinary;
        r->binary.data = data + INTALIGN(JBE_OFF(*e));
        r->binary.len = JBE_LEN(*e) - (INTALIGN(JBE_OFF(*e)) - JBE_OFF(*e));
-       r->size = r->binary.len + 2 * sizeof(JEntry);
+       r->estSize = r->binary.len + 2 * sizeof(JEntry);
    }
 
    return r;
@@ -566,7 +566,7 @@ pushJsonbValue(ToJsonbState ** state, int r, JsonbValue * v)
            *state = pushState(state);
            result = &(*state)->v;
            (*state)->v.type = jbvArray;
-           (*state)->v.size = 3 * sizeof(JEntry);
+           (*state)->v.estSize = 3 * sizeof(JEntry);
            (*state)->v.array.nElems = 0;
            (*state)->v.array.scalar = (v && v->array.scalar) != 0;
            (*state)->size = (v && v->type == jbvArray && v->array.nElems > 0)
@@ -578,7 +578,7 @@ pushJsonbValue(ToJsonbState ** state, int r, JsonbValue * v)
            *state = pushState(state);
            result = &(*state)->v;
            (*state)->v.type = jbvObject;
-           (*state)->v.size = 3 * sizeof(JEntry);
+           (*state)->v.estSize = 3 * sizeof(JEntry);
            (*state)->v.object.nPairs = 0;
            (*state)->size = (v && v->type == jbvObject && v->object.nPairs > 0) ?
                v->object.nPairs : 4;
@@ -1151,7 +1151,7 @@ convertJsonb(JsonbValue * v, Jsonb *buffer)
 
    len = state.ptr - VARDATA(state.buffer);
 
-   Assert(len <= v->size);
+   Assert(len <= v->estSize);
    return len;
 }
 
@@ -1340,7 +1340,7 @@ putJsonbValueConversion(convertState * state, JsonbValue * value, uint32 flags,
            elog(ERROR, "invalid jsonb container type");
        }
 
-       Assert(state->ptr - state->curlptr->begin <= value->size);
+       Assert(state->ptr - state->curlptr->begin <= value->estSize);
        state->prvlptr->i++;
    }
    else
@@ -1489,7 +1489,7 @@ formIterIsContainer(JsonbIterator ** it, JsonbValue * v, JEntry * e,
        v->type = jbvString;
        v->string.val = (*it)->dataProper + JBE_OFF(*e);
        v->string.len = JBE_LEN(*e);
-       v->size = sizeof(JEntry) + v->string.len;
+       v->estSize = sizeof(JEntry) + v->string.len;
 
        return false;
    }
@@ -1497,7 +1497,7 @@ formIterIsContainer(JsonbIterator ** it, JsonbValue * v, JEntry * e,
    {
        v->type = jbvBool;
        v->boolean = JBE_ISBOOL_TRUE(*e) != 0;
-       v->size = sizeof(JEntry);
+       v->estSize = sizeof(JEntry);
 
        return false;
    }
@@ -1505,14 +1505,14 @@ formIterIsContainer(JsonbIterator ** it, JsonbValue * v, JEntry * e,
    {
        v->type = jbvNumeric;
        v->numeric = (Numeric) ((*it)->dataProper + INTALIGN(JBE_OFF(*e)));
-       v->size = 2 * sizeof(JEntry) + VARSIZE_ANY(v->numeric);
+       v->estSize = 2 * sizeof(JEntry) + VARSIZE_ANY(v->numeric);
 
        return false;
    }
    else if (JBE_ISNULL(*e))
    {
        v->type = jbvNull;
-       v->size = sizeof(JEntry);
+       v->estSize = sizeof(JEntry);
 
        return false;
    }
@@ -1521,7 +1521,7 @@ formIterIsContainer(JsonbIterator ** it, JsonbValue * v, JEntry * e,
        v->type = jbvBinary;
        v->binary.data = (*it)->dataProper + INTALIGN(JBE_OFF(*e));
        v->binary.len = JBE_LEN(*e) - (INTALIGN(JBE_OFF(*e)) - JBE_OFF(*e));
-       v->size = v->binary.len + 2 * sizeof(JEntry);
+       v->estSize = v->binary.len + 2 * sizeof(JEntry);
 
        return false;
    }
@@ -1586,7 +1586,7 @@ appendKey(ToJsonbState * state, JsonbValue * v)
    a->object.pairs[a->object.nPairs].key = *v;
    a->object.pairs[a->object.nPairs].order = a->object.nPairs;
 
-   a->size += v->size;
+   a->estSize += v->estSize;
 }
 
 static void
@@ -1597,7 +1597,7 @@ appendValue(ToJsonbState * state, JsonbValue * v)
    Assert(a->type == jbvObject);
 
    a->object.pairs[a->object.nPairs++].value = *v;
-   a->size += v->size;
+   a->estSize += v->estSize;
 }
 
 static void
@@ -1615,7 +1615,7 @@ appendElement(ToJsonbState * state, JsonbValue * v)
    }
 
    a->array.elems[a->array.nElems++] = *v;
-   a->size += v->size;
+   a->estSize += v->estSize;
 }
 
 /*
@@ -1712,7 +1712,7 @@ uniqueifyJsonbObject(JsonbValue * v)
            /* Avoid copying over duplicate */
            if (lengthCompareJsonbStringValue(ptr, res, NULL) == 0)
            {
-               v->size -= ptr->key.size + ptr->value.size;
+               v->estSize -= ptr->key.estSize + ptr->value.estSize;
            }
            else
            {
index fcd9562120d6c84840c26aae4b314d68a8cbdaf8..73d7d96145c8a266666429d5100283d0cc6e30bf 100644 (file)
@@ -1495,7 +1495,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, bool as_text)
                        StringInfo  jtext = makeStringInfo();
                        Jsonb      *jb = JsonbValueToJsonb(&v);
 
-                       (void) JsonbToCString(jtext, VARDATA(jb), 2 * v.size);
+                       (void) JsonbToCString(jtext, VARDATA(jb), 2 * v.estSize);
                        sv = cstring_to_text_with_len(jtext->data, jtext->len);
                    }
 
@@ -1815,7 +1815,7 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, bool as_text)
                        StringInfo  jtext = makeStringInfo();
                        Jsonb      *jb = JsonbValueToJsonb(&v);
 
-                       (void) JsonbToCString(jtext, VARDATA(jb), 2 * v.size);
+                       (void) JsonbToCString(jtext, VARDATA(jb), 2 * v.estSize);
                        sv = cstring_to_text_with_len(jtext->data, jtext->len);
                    }
 
index e0e40242533eeff3d32f0d13bfddffba7a2df02c..0c360db65f9b03ead84ec6f7353ced96192019a0 100644 (file)
@@ -160,7 +160,7 @@ struct JsonbValue
        jbvBinary
    } type;     /* Influences sort order */
 
-   Size        size;           /* Estimated size of node (including
+   Size        estSize;        /* Estimated size of node (including
                                 * subnodes) */
 
    union