32 #define JSONB_MAX_ELEMS (Min(MaxAllocSize / sizeof(JsonbValue), JB_CMASK))
33 #define JSONB_MAX_PAIRS (Min(MaxAllocSize / sizeof(JsonbPair), JB_CMASK))
36 char *base_addr,
uint32 offset,
89 scalarArray.
type = jbvArray;
90 scalarArray.
val.array.rawScalar =
true;
91 scalarArray.
val.array.nElems = 1;
99 else if (val->
type == jbvObject || val->
type == jbvArray)
108 memcpy(
VARDATA(out), val->
val.binary.data, val->
val.binary.len);
130 for (i = index - 1; i >= 0; i--)
233 if (va.
val.array.rawScalar != vb.
val.array.rawScalar)
234 res = (va.
val.array.rawScalar) ? -1 : 1;
235 if (va.
val.array.nElems != vb.
val.array.nElems)
236 res = (va.
val.array.nElems > vb.
val.array.nElems) ? 1 : -1;
239 if (va.
val.object.nPairs != vb.
val.object.nPairs)
240 res = (va.
val.object.nPairs > vb.
val.object.nPairs) ? 1 : -1;
243 elog(
ERROR,
"unexpected jbvBinary value");
343 char *base_addr = (
char *) (children + count);
347 for (i = 0; i < count; i++)
363 char *base_addr = (
char *) (children + count * 2);
371 while (stopLow < stopHigh)
377 stopMiddle = stopLow + (stopHigh - stopLow) / 2;
379 candidate.
type = jbvString;
380 candidate.
val.string.val =
389 int index = stopMiddle + count;
400 stopLow = stopMiddle + 1;
402 stopHigh = stopMiddle;
428 base_addr = (
char *) &container->
children[nelements];
456 char *base_addr,
uint32 offset,
463 result->
type = jbvNull;
467 result->
type = jbvString;
468 result->
val.string.val = base_addr + offset;
474 result->
type = jbvNumeric;
479 result->
type = jbvBool;
480 result->
val.boolean =
true;
484 result->
type = jbvBool;
485 result->
val.boolean =
false;
490 result->
type = jbvBinary;
525 jbval->
type != jbvBinary)
553 Assert(!scalarVal || scalarVal->
val.array.rawScalar);
555 result = &(*pstate)->contVal;
556 (*pstate)->contVal.
type = jbvArray;
557 (*pstate)->contVal.
val.array.nElems = 0;
558 (*pstate)->contVal.val.array.rawScalar = (scalarVal &&
559 scalarVal->
val.array.rawScalar);
560 if (scalarVal && scalarVal->
val.array.nElems > 0)
564 (*pstate)->size = scalarVal->
val.array.nElems;
576 result = &(*pstate)->contVal;
577 (*pstate)->contVal.
type = jbvObject;
578 (*pstate)->contVal.
val.object.nPairs = 0;
601 result = &(*pstate)->contVal;
607 *pstate = (*pstate)->
next;
610 switch ((*pstate)->contVal.type)
619 elog(
ERROR,
"invalid jsonb container type");
624 elog(
ERROR,
"unrecognized jsonb sequential processing token");
655 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
656 errmsg(
"number of jsonb object pairs exceeds the maximum allowed (%zu)",
659 if (object->
val.object.nPairs >= pstate->
size)
662 object->val.object.pairs =
repalloc(object->
val.object.pairs,
666 object->val.object.pairs[
object->val.object.nPairs].key = *
string;
667 object->val.object.pairs[
object->val.object.nPairs].order =
object->val.object.nPairs;
681 object->val.object.pairs[
object->val.object.nPairs++].value = *scalarVal;
696 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
697 errmsg(
"number of jsonb array elements exceeds the maximum allowed (%zu)",
700 if (array->
val.array.nElems >= pstate->
size)
707 array->
val.array.elems[array->
val.array.nElems++] = *scalarVal;
765 switch ((*it)->state)
769 val->
type = jbvArray;
770 val->
val.array.nElems = (*it)->nElems;
776 val->
val.array.rawScalar = (*it)->isScalar;
778 (*it)->curDataOffset = 0;
779 (*it)->curValueOffset = 0;
785 if ((*it)->curIndex >= (*it)->nElems)
798 (*it)->dataProper, (*it)->curDataOffset,
802 (*it)->children[(*it)->curIndex]);
822 val->
type = jbvObject;
823 val->
val.object.nPairs = (*it)->nElems;
830 (*it)->curDataOffset = 0;
838 if ((*it)->curIndex >= (*it)->nElems)
853 (*it)->dataProper, (*it)->curDataOffset,
855 if (val->
type != jbvString)
856 elog(
ERROR,
"unexpected jsonb type as object key");
868 (*it)->dataProper, (*it)->curValueOffset,
872 (*it)->children[(*it)->curIndex]);
874 (*it)->children[(*it)->curIndex + (*it)->nElems]);
930 elog(
ERROR,
"unknown type of jsonb container");
1004 if (vval.
val.object.nPairs < vcontained.
val.object.nPairs)
1044 if (lhsVal->
type != vcontained.
type)
1093 uint32 nLhsElems = vval.
val.array.nElems;
1108 if (vval.
val.array.rawScalar && !vcontained.
val.array.rawScalar)
1141 if (lhsConts ==
NULL)
1148 for (i = 0; i < nLhsElems; i++)
1154 if (vval.
type == jbvBinary)
1155 lhsConts[j++] = vval;
1167 for (i = 0; i < nLhsElems; i++)
1182 pfree(nestContained);
1198 elog(
ERROR,
"invalid jsonb container type");
1201 elog(
ERROR,
"unexpectedly fell off end of jsonb container");
1218 switch (scalarVal->
type)
1225 scalarVal->
val.string.len));
1233 tmp = scalarVal->
val.boolean ? 0x02 : 0x04;
1237 elog(
ERROR,
"invalid jsonb scalar type");
1247 *hash = (*hash << 1) | (*hash >> 31);
1257 if (aScalar->
type == bScalar->
type)
1259 switch (aScalar->
type)
1270 return aScalar->
val.boolean == bScalar->
val.boolean;
1273 elog(
ERROR,
"invalid jsonb scalar type");
1276 elog(
ERROR,
"jsonb scalar type mismatch");
1289 if (aScalar->
type == bScalar->
type)
1291 switch (aScalar->
type)
1297 aScalar->
val.string.len,
1298 bScalar->
val.string.val,
1299 bScalar->
val.string.len,
1306 if (aScalar->
val.boolean == bScalar->
val.boolean)
1308 else if (aScalar->
val.boolean > bScalar->
val.boolean)
1313 elog(
ERROR,
"invalid jsonb scalar type");
1316 elog(
ERROR,
"jsonb scalar type mismatch");
1340 offset = buffer->
len;
1349 buffer->
data[buffer->
len] =
'\0';
1360 memcpy(buffer->
data + offset, data, len);
1392 for (p = 0; p < padlen; p++)
1393 buffer->
data[offset + p] =
'\0';
1460 else if (val->
type == jbvArray)
1462 else if (val->
type == jbvObject)
1465 elog(
ERROR,
"unknown type of jsonb container to convert");
1476 int nElems = val->
val.array.nElems;
1479 base_offset = buffer->
len;
1489 if (val->
val.array.rawScalar)
1502 for (i = 0; i < nElems; i++)
1524 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1525 errmsg(
"total size of jsonb array elements exceeds the maximum of %u bytes",
1535 jentry_offset +=
sizeof(
JEntry);
1539 totallen = buffer->
len - base_offset;
1544 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1545 errmsg(
"total size of jsonb array elements exceeds the maximum of %u bytes",
1560 int nPairs = val->
val.object.nPairs;
1563 base_offset = buffer->
len;
1583 for (i = 0; i < nPairs; i++)
1605 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1606 errmsg(
"total size of jsonb object elements exceeds the maximum of %u bytes",
1616 jentry_offset +=
sizeof(
JEntry);
1618 for (i = 0; i < nPairs; i++)
1640 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1641 errmsg(
"total size of jsonb object elements exceeds the maximum of %u bytes",
1651 jentry_offset +=
sizeof(
JEntry);
1655 totallen = buffer->
len - base_offset;
1660 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1661 errmsg(
"total size of jsonb object elements exceeds the maximum of %u bytes",
1674 switch (scalarVal->
type)
1683 *jentry = scalarVal->
val.string.len;
1696 *jentry = (scalarVal->
val.boolean) ?
1701 elog(
ERROR,
"invalid jsonb scalar type");
1727 if (va->
val.string.len == vb->
val.string.len)
1729 res = memcmp(va->
val.string.val, vb->
val.string.val, va->
val.string.len);
1733 res = (va->
val.string.len > vb->
val.string.len) ? 1 : -1;
1758 if (res == 0 && binequal)
1759 *((
bool *) binequal) =
true;
1777 bool hasNonUniq =
false;
1781 if (object->
val.object.nPairs > 1)
1787 JsonbPair *ptr =
object->val.object.pairs + 1,
1788 *res =
object->val.object.pairs;
1790 while (ptr - object->
val.object.pairs < object->
val.object.nPairs)
1802 object->val.object.nPairs = res + 1 -
object->val.object.pairs;
#define DatumGetUInt32(X)
JEntry children[FLEXIBLE_ARRAY_MEMBER]
struct PathHashStack * parent
static void appendValue(JsonbParseState *pstate, JsonbValue *scalarVal)
uint32 getJsonbOffset(const JsonbContainer *jc, int index)
Jsonb * JsonbValueToJsonb(JsonbValue *val)
#define JBE_ISCONTAINER(je_)
Datum hash_numeric(PG_FUNCTION_ARGS)
bool JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained)
#define PointerGetDatum(X)
static void convertJsonbValue(StringInfo buffer, JEntry *header, JsonbValue *val, int level)
#define NumericGetDatum(X)
#define JBE_ISBOOL_TRUE(je_)
static void appendToBuffer(StringInfo buffer, const char *data, int len)
Datum numeric_cmp(PG_FUNCTION_ARGS)
uint32 getJsonbLength(const JsonbContainer *jc, int index)
static JsonbParseState * pushState(JsonbParseState **pstate)
int errcode(int sqlerrcode)
#define JENTRY_OFFLENMASK
static JsonbIterator * freeAndGetParent(JsonbIterator *it)
static void appendElement(JsonbParseState *pstate, JsonbValue *scalarVal)
#define DirectFunctionCall1(func, arg1)
struct NumericData * Numeric
#define JBE_OFFLENFLD(je_)
struct JsonbParseState * next
#define JBE_ISSTRING(je_)
Datum numeric_eq(PG_FUNCTION_ARGS)
#define JBE_ADVANCE_OFFSET(offset, je)
JsonbValue * pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *jbval)
void JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash)
void pfree(void *pointer)
static int lengthCompareJsonbPair(const void *a, const void *b, void *arg)
JsonbContainer * container
#define DEFAULT_COLLATION_OID
void check_stack_depth(void)
static int reserveFromBuffer(StringInfo buffer, int len)
void enlargeStringInfo(StringInfo str, int needed)
int compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
static void fillJsonbValue(JsonbContainer *container, int index, char *base_addr, uint32 offset, JsonbValue *result)
static JsonbValue * pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *scalarVal)
#define ereport(elevel, rest)
static void uniqueifyJsonbObject(JsonbValue *object)
static bool equalsJsonbScalarValue(JsonbValue *a, JsonbValue *b)
static void convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level)
void initStringInfo(StringInfo str)
void qsort_arg(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg)
static void convertJsonbScalar(StringInfo buffer, JEntry *header, JsonbValue *scalarVal)
static short padBufferToInt(StringInfo buffer)
Datum difference(PG_FUNCTION_ARGS)
static void copyToBuffer(StringInfo buffer, int offset, const char *data, int len)
#define JENTRY_ISCONTAINER
static int compareJsonbScalarValue(JsonbValue *a, JsonbValue *b)
JsonbValue * getIthJsonbValueFromContainer(JsonbContainer *container, uint32 i)
static JsonbIterator * iteratorFromContainer(JsonbContainer *container, JsonbIterator *parent)
#define Assert(condition)
JsonbIterator * JsonbIteratorInit(JsonbContainer *container)
#define JBE_ISNUMERIC(je_)
struct JsonbIterator * parent
Datum hash_any(register const unsigned char *k, register int keylen)
int varstr_cmp(char *arg1, int len1, char *arg2, int len2, Oid collid)
static Jsonb * convertToJsonb(JsonbValue *val)
#define IsAJsonbScalar(jsonbval)
static void header(const char *fmt,...) pg_attribute_printf(1
void * repalloc(void *pointer, Size size)
int errmsg(const char *fmt,...)
#define JENTRY_ISBOOL_TRUE
#define JENTRY_ISBOOL_FALSE
#define JBE_ISBOOL_FALSE(je_)
JsonbValue * findJsonbValueFromContainer(JsonbContainer *container, uint32 flags, JsonbValue *key)
#define SET_VARSIZE(PTR, len)
static void convertJsonbObject(StringInfo buffer, JEntry *header, JsonbValue *val, int level)
static unsigned hash(unsigned *uv, int n)
static int lengthCompareJsonbStringValue(const void *a, const void *b)
enum JsonbValue::@70 type
#define DirectFunctionCall2(func, arg1, arg2)
JsonbIteratorToken JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested)
static void appendKey(JsonbParseState *pstate, JsonbValue *scalarVal)