21#include "utils/fmgrprotos.h"
36#define JSONB_MAX_ELEMS (Min(MaxAllocSize / sizeof(JsonbValue), JB_CMASK))
37#define JSONB_MAX_PAIRS (Min(MaxAllocSize / sizeof(JsonbPair), JB_CMASK))
40 char *base_addr,
uint32 offset,
63 const char *val2,
int len2);
75 val->val.binary.data = &jsonb->
root;
104 scalarArray.
val.array.rawScalar =
true;
105 scalarArray.
val.array.nElems = 1;
122 memcpy(
VARDATA(out),
val->val.binary.data,
val->val.binary.len);
247 if (va.
val.array.rawScalar != vb.
val.array.rawScalar)
248 res = (va.
val.array.rawScalar) ? -1 : 1;
256 if (va.
val.array.nElems != vb.
val.array.nElems)
257 res = (va.
val.array.nElems > vb.
val.array.nElems) ? 1 : -1;
260 if (va.
val.object.nPairs != vb.
val.object.nPairs)
261 res = (va.
val.object.nPairs > vb.
val.object.nPairs) ? 1 : -1;
264 elog(
ERROR,
"unexpected jbvBinary value");
267 elog(
ERROR,
"unexpected jbvDatetime value");
360 char *base_addr = (
char *) (children + count);
364 for (
i = 0;
i < count;
i++)
385 key->val.string.len, NULL);
400 const char *keyVal,
int keyLen,
JsonbValue *res)
418 baseAddr = (
char *) (children + count * 2);
421 while (stopLow < stopHigh)
425 const char *candidateVal;
428 stopMiddle = stopLow + (stopHigh - stopLow) / 2;
439 int index = stopMiddle + count;
453 stopLow = stopMiddle + 1;
455 stopHigh = stopMiddle;
479 base_addr = (
char *) &container->
children[nelements];
507 char *base_addr,
uint32 offset,
519 result->
val.string.val = base_addr + offset;
531 result->
val.boolean =
true;
536 result->
val.boolean =
false;
579 for (
i = 0;
i < jbval->
val.object.nPairs;
i++)
591 for (
i = 0;
i < jbval->
val.array.nElems;
i++)
609 if ((jbval->
val.binary.data->header &
JB_FSCALAR) && *pstate)
631 v.
val.array.rawScalar) ? &v : NULL);
649 Assert(!scalarVal || scalarVal->
val.array.rawScalar);
651 result = &(*pstate)->contVal;
653 (*pstate)->contVal.val.array.nElems = 0;
654 (*pstate)->contVal.val.array.rawScalar = (scalarVal &&
655 scalarVal->
val.array.rawScalar);
656 if (scalarVal && scalarVal->
val.array.nElems > 0)
660 (*pstate)->size = scalarVal->
val.array.nElems;
672 result = &(*pstate)->contVal;
674 (*pstate)->contVal.val.object.nPairs = 0;
693 (*pstate)->unique_keys,
694 (*pstate)->skip_nulls);
699 result = &(*pstate)->contVal;
705 *pstate = (*pstate)->
next;
708 switch ((*pstate)->contVal.type)
717 elog(
ERROR,
"invalid jsonb container type");
722 elog(
ERROR,
"unrecognized jsonb sequential processing token");
756 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
757 errmsg(
"number of jsonb object pairs exceeds the maximum allowed (%zu)",
760 if (object->
val.object.nPairs >= pstate->
size)
763 object->val.object.pairs =
repalloc(object->
val.object.pairs,
767 object->val.object.pairs[
object->val.object.nPairs].key = *
string;
768 object->val.object.pairs[
object->val.object.nPairs].order =
object->val.object.nPairs;
782 object->val.object.pairs[
object->val.object.nPairs++].value = *scalarVal;
797 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
798 errmsg(
"number of jsonb array elements exceeds the maximum allowed (%zu)",
801 if (array->
val.array.nElems >= pstate->
size)
808 array->
val.array.elems[array->
val.array.nElems++] = *scalarVal;
871 switch ((*it)->state)
876 val->val.array.nElems = (*it)->nElems;
882 val->val.array.rawScalar = (*it)->isScalar;
884 (*it)->curDataOffset = 0;
885 (*it)->curValueOffset = 0;
891 if ((*it)->curIndex >= (*it)->nElems)
905 (*it)->dataProper, (*it)->curDataOffset,
909 (*it)->children[(*it)->curIndex]);
930 val->val.object.nPairs = (*it)->nElems;
937 (*it)->curDataOffset = 0;
945 if ((*it)->curIndex >= (*it)->nElems)
961 (*it)->dataProper, (*it)->curDataOffset,
964 elog(
ERROR,
"unexpected jsonb type as object key");
976 (*it)->dataProper, (*it)->curValueOffset,
980 (*it)->children[(*it)->curIndex]);
982 (*it)->children[(*it)->curIndex + (*it)->nElems]);
999 elog(
ERROR,
"invalid jsonb iterator state");
1040 elog(
ERROR,
"unknown type of jsonb container");
1114 if (vval.
val.object.nPairs < vcontained.
val.object.nPairs)
1139 vcontained.
val.string.val,
1140 vcontained.
val.string.len,
1157 if (lhsVal->
type != vcontained.
type)
1206 uint32 nLhsElems = vval.
val.array.nElems;
1221 if (vval.
val.array.rawScalar && !vcontained.
val.array.rawScalar)
1254 if (lhsConts == NULL)
1261 for (
i = 0;
i < nLhsElems;
i++)
1268 lhsConts[
j++] = vval;
1280 for (
i = 0;
i < nLhsElems;
i++)
1295 pfree(nestContained);
1311 elog(
ERROR,
"invalid jsonb container type");
1314 elog(
ERROR,
"unexpectedly fell off end of jsonb container");
1331 switch (scalarVal->
type)
1338 scalarVal->
val.string.len));
1346 tmp = scalarVal->
val.boolean ? 0x02 : 0x04;
1350 elog(
ERROR,
"invalid jsonb scalar type");
1374 switch (scalarVal->
type)
1381 scalarVal->
val.string.len,
1395 tmp = scalarVal->
val.boolean ? 0x02 : 0x04;
1399 elog(
ERROR,
"invalid jsonb scalar type");
1413 if (
a->type ==
b->type)
1426 return a->val.boolean ==
b->val.boolean;
1429 elog(
ERROR,
"invalid jsonb scalar type");
1432 elog(
ERROR,
"jsonb scalar type mismatch");
1445 if (
a->type ==
b->type)
1456 DEFAULT_COLLATION_OID);
1462 if (
a->val.boolean ==
b->val.boolean)
1464 else if (
a->val.boolean >
b->val.boolean)
1469 elog(
ERROR,
"invalid jsonb scalar type");
1472 elog(
ERROR,
"jsonb scalar type mismatch");
1496 offset = buffer->
len;
1505 buffer->
data[buffer->
len] =
'\0';
1548 for (p = 0; p < padlen; p++)
1549 buffer->
data[offset + p] =
'\0';
1621 elog(
ERROR,
"unknown type of jsonb container to convert");
1632 int nElems =
val->val.array.nElems;
1635 base_offset = buffer->
len;
1645 if (
val->val.array.rawScalar)
1658 for (
i = 0;
i < nElems;
i++)
1680 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1681 errmsg(
"total size of jsonb array elements exceeds the maximum of %d bytes",
1691 jentry_offset +=
sizeof(
JEntry);
1695 totallen = buffer->
len - base_offset;
1700 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1701 errmsg(
"total size of jsonb array elements exceeds the maximum of %d bytes",
1716 int nPairs =
val->val.object.nPairs;
1719 base_offset = buffer->
len;
1739 for (
i = 0;
i < nPairs;
i++)
1761 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1762 errmsg(
"total size of jsonb object elements exceeds the maximum of %d bytes",
1772 jentry_offset +=
sizeof(
JEntry);
1774 for (
i = 0;
i < nPairs;
i++)
1796 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1797 errmsg(
"total size of jsonb object elements exceeds the maximum of %d bytes",
1807 jentry_offset +=
sizeof(
JEntry);
1811 totallen = buffer->
len - base_offset;
1816 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1817 errmsg(
"total size of jsonb object elements exceeds the maximum of %d bytes",
1830 switch (scalarVal->
type)
1839 *header = scalarVal->
val.string.len;
1852 *header = (scalarVal->
val.boolean) ?
1862 scalarVal->
val.datetime.value,
1863 scalarVal->
val.datetime.typid,
1864 &scalarVal->
val.datetime.tz);
1873 elog(
ERROR,
"invalid jsonb scalar type");
1899 vb->
val.string.val, vb->
val.string.len);
1912 return memcmp(val1, val2, len1);
1914 return len1 > len2 ? 1 : -1;
1936 if (res == 0 && binequal)
1937 *((
bool *) binequal) =
true;
1955 bool hasNonUniq =
false;
1959 if (object->
val.object.nPairs > 1)
1963 if (hasNonUniq && unique_keys)
1965 errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE),
1966 errmsg(
"duplicate JSON object key value"));
1968 if (hasNonUniq || skip_nulls)
1973 while (skip_nulls && object->
val.object.nPairs > 0 &&
1974 object->
val.object.pairs->value.type ==
jbvNull)
1977 object->val.object.pairs++;
1978 object->val.object.nPairs--;
1981 if (object->
val.object.nPairs > 0)
1983 ptr =
object->val.object.pairs + 1;
1984 res =
object->val.object.pairs;
1986 while (ptr - object->
val.object.pairs < object->
val.object.nPairs)
1999 object->val.object.nPairs = res + 1 -
object->val.object.pairs;
Datum hash_numeric(PG_FUNCTION_ARGS)
Datum hash_numeric_extended(PG_FUNCTION_ARGS)
Datum numeric_cmp(PG_FUNCTION_ARGS)
Datum numeric_eq(PG_FUNCTION_ARGS)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define DirectFunctionCall2(func, arg1, arg2)
#define DirectFunctionCall1(func, arg1)
Datum difference(PG_FUNCTION_ARGS)
#define ROTATE_HIGH_AND_LOW_32BITS(v)
static Datum hash_any_extended(const unsigned char *k, int keylen, uint64 seed)
static Datum hash_any(const unsigned char *k, int keylen)
Assert(PointerIsAligned(start, uint64))
Datum hashcharextended(PG_FUNCTION_ARGS)
if(TABLE==NULL||TABLE_index==NULL)
char * JsonEncodeDateTime(char *buf, Datum value, Oid typid, const int *tzp)
#define JsonContainerIsScalar(jc)
#define JsonContainerIsArray(jc)
#define JsonContainerSize(jc)
#define JBE_ISBOOL_TRUE(je_)
#define IsAJsonbScalar(jsonbval)
#define JENTRY_OFFLENMASK
#define JBE_ISNUMERIC(je_)
#define JBE_ISBOOL_FALSE(je_)
#define JENTRY_ISCONTAINER
#define JBE_ISSTRING(je_)
#define JENTRY_ISBOOL_FALSE
#define JBE_OFFLENFLD(je_)
#define JsonContainerIsObject(jc)
#define JENTRY_ISBOOL_TRUE
#define JBE_ISCONTAINER(je_)
#define JBE_ADVANCE_OFFSET(offset, je)
static int lengthCompareJsonbString(const char *val1, int len1, const char *val2, int len2)
static void appendElement(JsonbParseState *pstate, JsonbValue *scalarVal)
static void convertJsonbScalar(StringInfo buffer, JEntry *header, JsonbValue *scalarVal)
static void convertJsonbObject(StringInfo buffer, JEntry *header, JsonbValue *val, int level)
static int lengthCompareJsonbStringValue(const void *a, const void *b)
static JsonbIterator * iteratorFromContainer(JsonbContainer *container, JsonbIterator *parent)
static void fillJsonbValue(JsonbContainer *container, int index, char *base_addr, uint32 offset, JsonbValue *result)
static void copyToBuffer(StringInfo buffer, int offset, const void *data, int len)
static void convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level)
static void appendToBuffer(StringInfo buffer, const void *data, int len)
static void uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls)
static void appendValue(JsonbParseState *pstate, JsonbValue *scalarVal)
static JsonbValue * pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *scalarVal)
JsonbValue * getKeyJsonValueFromContainer(JsonbContainer *container, const char *keyVal, int keyLen, JsonbValue *res)
int compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
uint32 getJsonbLength(const JsonbContainer *jc, int index)
static short padBufferToInt(StringInfo buffer)
JsonbValue * pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *jbval)
JsonbIterator * JsonbIteratorInit(JsonbContainer *container)
void JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash)
static JsonbParseState * pushState(JsonbParseState **pstate)
void JsonbToJsonbValue(Jsonb *jsonb, JsonbValue *val)
JsonbValue * findJsonbValueFromContainer(JsonbContainer *container, uint32 flags, JsonbValue *key)
JsonbIteratorToken JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested)
static int compareJsonbScalarValue(JsonbValue *a, JsonbValue *b)
static void appendKey(JsonbParseState *pstate, JsonbValue *string)
static bool equalsJsonbScalarValue(JsonbValue *a, JsonbValue *b)
uint32 getJsonbOffset(const JsonbContainer *jc, int index)
void JsonbHashScalarValueExtended(const JsonbValue *scalarVal, uint64 *hash, uint64 seed)
static Jsonb * convertToJsonb(JsonbValue *val)
JsonbValue * getIthJsonbValueFromContainer(JsonbContainer *container, uint32 i)
Jsonb * JsonbValueToJsonb(JsonbValue *val)
static int lengthCompareJsonbPair(const void *a, const void *b, void *binequal)
bool JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained)
static JsonbIterator * freeAndGetParent(JsonbIterator *it)
static void convertJsonbValue(StringInfo buffer, JEntry *header, JsonbValue *val, int level)
static int reserveFromBuffer(StringInfo buffer, int len)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
void * palloc0(Size size)
struct NumericData * Numeric
static Datum NumericGetDatum(Numeric X)
static uint32 pg_rotate_left32(uint32 word, int n)
void qsort_arg(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg)
static uint32 DatumGetUInt32(Datum X)
static uint64 DatumGetUInt64(Datum X)
static bool DatumGetBool(Datum X)
static Datum PointerGetDatum(const void *X)
static Datum UInt64GetDatum(uint64 X)
static Datum BoolGetDatum(bool X)
static int32 DatumGetInt32(Datum X)
static unsigned hash(unsigned *uv, int n)
void check_stack_depth(void)
void enlargeStringInfo(StringInfo str, int needed)
void initStringInfo(StringInfo str)
JEntry children[FLEXIBLE_ARRAY_MEMBER]
struct JsonbIterator * parent
JsonbContainer * container
struct JsonbParseState * next
static Size VARSIZE_ANY(const void *PTR)
static Size VARSIZE(const void *PTR)
static char * VARDATA(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)
int varstr_cmp(const char *arg1, int len1, const char *arg2, int len2, Oid collid)