Skip to content

Commit 4eaf89f

Browse files
author
Nikita Glukhov
committed
Add variable-length JsonContainer data
1 parent 66b28c2 commit 4eaf89f

File tree

8 files changed

+92
-78
lines changed

8 files changed

+92
-78
lines changed

src/backend/tsearch/wparser.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ ts_headline_json_byid_opt(PG_FUNCTION_ARGS)
484484

485485
{
486486
Jsonb *jsonb = transform_jsonb_string_values(json, state, action, true);
487-
char *str = JsonToCString(&jsonb->root);
487+
char *str = JsonToCString(&jsonb->root, NULL);
488488

489489
out = cstring_to_text(str);
490490

src/backend/utils/adt/json_generic.c

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ JsonValueUnwrap(const JsonValue *val, JsonValue *valbuf)
128128

129129
if (jc->ops == &jsonvContainerOps)
130130
{
131-
val = (JsonbValue *) jc->data;
131+
val = (JsonbValue *) JsonContainerDataPtr(jc);
132132
Assert(val->type != jbvBinary);
133133
}
134134
else if (JsonContainerIsScalar(jc))
@@ -304,7 +304,7 @@ static void
304304
jsonvInitContainer(JsonContainerData *jc, const JsonValue *val)
305305
{
306306
jc->ops = &jsonvContainerOps;
307-
jc->data = (void *) val;
307+
JsonContainerDataPtr(jc) = (void *) val;
308308
jc->len = 0;
309309
jc->size = val->type == jbvBinary ? val->val.binary.data->size :
310310
val->type == jbvObject ? val->val.object.nPairs :
@@ -322,7 +322,7 @@ JsonValueToContainer(const JsonValue *val)
322322
return val->val.binary.data;
323323
else
324324
{
325-
JsonContainerData *jc = JsonContainerAlloc();
325+
JsonContainerData *jc = JsonContainerAlloc(&jsonvContainerOps);
326326
jsonvInitContainer(jc, val);
327327
return jc;
328328
}
@@ -354,7 +354,7 @@ static JsonIteratorToken
354354
jsonvScalarIteratorNext(JsonIterator **it, JsonValue *res, bool skipNested)
355355
{
356356
JsonvScalarIterator *sit = (JsonvScalarIterator *) *it;
357-
JsonValue *val = (*it)->container->data;
357+
JsonValue *val = JsonContainerDataPtr((*it)->container);
358358

359359
Assert(IsAJsonbScalar(val));
360360

@@ -384,7 +384,7 @@ static JsonIteratorToken
384384
jsonvArrayIteratorNext(JsonIterator **it, JsonValue *res, bool skipNested)
385385
{
386386
JsonvArrayIterator *ait = (JsonvArrayIterator *) *it;
387-
JsonValue *arr = (*it)->container->data;
387+
JsonValue *arr = JsonContainerDataPtr((*it)->container);
388388
JsonValue *val;
389389

390390
Assert(arr->type == jbvArray);
@@ -428,7 +428,7 @@ static JsonIteratorToken
428428
jsonvObjectIteratorNext(JsonIterator **it, JsonValue *res, bool skipNested)
429429
{
430430
JsonvObjectIterator *oit = (JsonvObjectIterator *) *it;
431-
JsonValue *obj = (*it)->container->data;
431+
JsonValue *obj = JsonContainerDataPtr((*it)->container);
432432
JsonPair *pair;
433433

434434
Assert(obj->type == jbvObject);
@@ -553,13 +553,13 @@ jsonvIteratorInitFromValue(JsonValue *val, JsonContainer *jsc)
553553
static JsonIterator *
554554
jsonvIteratorInit(JsonContainer *jsc)
555555
{
556-
return jsonvIteratorInitFromValue(jsc->data, jsc);
556+
return jsonvIteratorInitFromValue(JsonContainerDataPtr(jsc), jsc);
557557
}
558558

559559
static JsonValue *
560560
jsonvFindKeyInObject(JsonContainer *objc, const char *key, int len)
561561
{
562-
JsonValue *obj = (JsonValue *) objc->data;
562+
JsonValue *obj = JsonContainerDataPtr(objc);
563563
JsonValue *res;
564564
JsonValue *jv;
565565
int i;
@@ -605,7 +605,7 @@ jsonvFindKeyInObject(JsonContainer *objc, const char *key, int len)
605605
static JsonValue *
606606
jsonvFindValueInArray(JsonContainer *arrc, const JsonValue *val)
607607
{
608-
JsonValue *arr = (JsonValue *) arrc->data;
608+
JsonValue *arr = JsonContainerDataPtr(arrc);
609609

610610
Assert(JsonContainerIsArray(arrc));
611611
Assert(IsAJsonbScalar(val));
@@ -640,7 +640,7 @@ jsonvFindValueInArray(JsonContainer *arrc, const JsonValue *val)
640640
static JsonValue *
641641
jsonvGetArrayElement(JsonContainer *arrc, uint32 index)
642642
{
643-
JsonValue *arr = (JsonValue *) arrc->data;
643+
JsonValue *arr = JsonContainerDataPtr(arrc);
644644

645645
Assert(JsonContainerIsArray(arrc));
646646

@@ -668,7 +668,7 @@ jsonvGetArrayElement(JsonContainer *arrc, uint32 index)
668668
static uint32
669669
jsonvGetArraySize(JsonContainer *arrc)
670670
{
671-
JsonValue *arr = (JsonValue *) arrc->data;
671+
JsonValue *arr = JsonContainerDataPtr(arrc);
672672

673673
Assert(JsonContainerIsArray(arrc));
674674

@@ -692,17 +692,18 @@ jsonvGetArraySize(JsonContainer *arrc)
692692
static JsonContainer *
693693
jsonvCopy(JsonContainer *jc)
694694
{
695-
JsonContainerData *res = JsonContainerAlloc();
695+
JsonContainerData *res = JsonContainerAlloc(&jsonvContainerOps);
696696

697697
*res = *jc;
698-
res->data = JsonValueCopy(NULL, (JsonValue *) jc->data);
698+
JsonContainerDataPtr(res) = JsonValueCopy(NULL, JsonContainerDataPtr(jc));
699699

700700
return res;
701701
}
702702

703703
JsonContainerOps
704704
jsonvContainerOps =
705705
{
706+
sizeof(JsonValue *),
706707
NULL,
707708
jsonvIteratorInit,
708709
jsonvFindKeyInObject,
@@ -717,7 +718,7 @@ JsonValue *
717718
JsonToJsonValue(Json *json, JsonValue *jv)
718719
{
719720
if (JsonRoot(json)->ops == &jsonvContainerOps)
720-
return (JsonValue *) JsonRoot(json)->data;
721+
return JsonContainerDataPtr(JsonRoot(json));
721722

722723
if (!jv)
723724
jv = palloc(sizeof(JsonValue));
@@ -731,9 +732,9 @@ JsonInit(Json *json)
731732
const void *data = DatumGetPointer(json->obj.value);
732733
const void *detoasted_data;
733734

734-
Assert(json->root.data || data);
735+
Assert(JsonContainerDataPtr(&json->root) || data);
735736

736-
if (json->root.data || !data)
737+
if (JsonContainerDataPtr(&json->root) || !data) /* FIXME */
737738
return;
738739

739740
detoasted_data = PG_DETOAST_DATUM(json->obj.value);
@@ -750,13 +751,16 @@ JsonExpand(Json *tmp, Datum value, bool freeValue, JsonContainerOps *ops)
750751

751752
if (tmp)
752753
{
754+
Assert(0);
753755
json = tmp;
754756
json->obj.isTemporary = true;
755757
}
756758
else
757759
{
760+
Size size = JsonAllocSize(ops->data_size);
761+
758762
#ifndef JSON_EXPANDED_OBJECT_MCXT
759-
json = (Json *) palloc(sizeof(Json));
763+
json = (Json *) palloc(size);
760764
#else
761765
/*
762766
* Allocate private context for expanded object. We start by assuming
@@ -770,20 +774,21 @@ JsonExpand(Json *tmp, Datum value, bool freeValue, JsonContainerOps *ops)
770774
ALLOCSET_SMALL_INITSIZE,
771775
ALLOCSET_DEFAULT_MAXSIZE);
772776

773-
json = (Json *) MemoryContextAlloc(objcxt, sizeof(Json));
777+
json = (Json *) MemoryContextAlloc(objcxt, size);
774778
#endif
775779
json->obj.isTemporary = false;
776780
}
777781

778782
json->obj.value = value;
779783
json->obj.freeValue = freeValue;
780-
json->root.data = NULL;
781784
json->root.len = 0;
782785
json->root.ops = ops;
783786
json->root.size = -1;
784787
json->root.type = jbvBinary;
785788
json->is_json = false;
786789

790+
memset(json->root._data, 0, ops->data_size);
791+
787792
return json;
788793
}
789794

@@ -819,9 +824,10 @@ JsonFree(Json *json)
819824
Json *
820825
JsonCopyTemporary(Json *tmp)
821826
{
822-
Json *json = (Json *) palloc(sizeof(Json));
827+
Size size = JsonAllocSize(tmp->root.ops->data_size);
828+
Json *json = (Json *) palloc(size);
823829

824-
memcpy(json, tmp, sizeof(Json));
830+
memcpy(json, tmp, size);
825831
tmp->obj.freeValue = false;
826832
tmp->obj.isTemporary = false;
827833

@@ -838,6 +844,7 @@ JsonValueToJson(JsonValue *val)
838844
jc->ops);
839845

840846
json->root = *jc;
847+
memcpy(json->root._data, jc->_data, jc->ops->data_size);
841848

842849
return json;
843850
}
@@ -855,11 +862,11 @@ JsonValueToJson(JsonValue *val)
855862
JsonContainer *
856863
JsonCopyFlat(JsonContainer *jc)
857864
{
858-
JsonContainerData *res = JsonContainerAlloc();
865+
JsonContainerData *res = JsonContainerAlloc(jc->ops);
859866

860867
*res = *jc;
861-
res->data = palloc(jc->len);
862-
memcpy(res->data, jc->data, jc->len);
868+
JsonContainerDataPtr(res) = palloc(jc->len);
869+
memcpy(JsonContainerDataPtr(res), JsonContainerDataPtr(jc), jc->len);
863870

864871
return res;
865872
}

src/backend/utils/adt/jsonb.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ jsonb_out(PG_FUNCTION_ARGS)
144144
Jsonb *jb = PG_GETARG_JSONB_P(0);
145145
char *out;
146146

147-
out = JsonToCString(JsonbRoot(jb));
147+
out = JsonToCString(JsonbRoot(jb), NULL);
148148

149149
PG_RETURN_CSTRING(out);
150150
}
@@ -162,7 +162,7 @@ jsonb_send(PG_FUNCTION_ARGS)
162162
StringInfo jtext = makeStringInfo();
163163
int version = 1;
164164

165-
(void) JsonbToCString(jtext, JsonbRoot(jb), JsonbGetSize(jb));
165+
(void) JsonToCString(JsonbRoot(jb), jtext);
166166

167167
pq_begintypsend(&buf);
168168
pq_sendint8(&buf, version);
@@ -600,8 +600,7 @@ JsonbToCStringWorker(StringInfo out, JsonbContainer *in, int estimated_len,
600600
{
601601
first = false;
602602
if (v.type == jbvBinary)
603-
JsonbToCString(out, v.val.binary.data,
604-
v.val.binary.data->len);
603+
JsonToCString(v.val.binary.data, out);
605604
else
606605
jsonb_put_escaped_value(out, &v);
607606
}
@@ -627,8 +626,7 @@ JsonbToCStringWorker(StringInfo out, JsonbContainer *in, int estimated_len,
627626
add_indent(out, use_indent, level);
628627

629628
if (v.type == jbvBinary)
630-
JsonbToCString(out, v.val.binary.data,
631-
v.val.binary.data->len);
629+
JsonToCString(v.val.binary.data, out);
632630
else
633631
jsonb_put_escaped_value(out, &v);
634632
break;

src/backend/utils/adt/jsonb_util.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,12 @@ JsonContainerFlatten(JsonContainer *jc, JsonValueEncoder encoder,
155155

156156
if (jc->ops == ops)
157157
{
158-
int size = jc->len;
159-
void *out = palloc(VARHDRSZ + size);
158+
int size = jc->len;
159+
void *out = palloc(VARHDRSZ + size);
160+
160161
SET_VARSIZE(out, VARHDRSZ + size);
161-
memcpy(VARDATA(out), jc->data, size);
162+
memcpy(VARDATA(out), JsonContainerDataPtr(jc), size);
163+
162164
return out;
163165
}
164166

@@ -492,7 +494,7 @@ jsonbFindValueInArrayContainer(const JsonbContainer *container,
492494
static JsonbValue *
493495
jsonbFindValueInArray(JsonContainer *jsc, const JsonbValue *key)
494496
{
495-
return jsonbFindValueInArrayContainer(jsc->data, key);
497+
return jsonbFindValueInArrayContainer(JsonContainerDataPtr(jsc), key);
496498
}
497499

498500
/*
@@ -555,7 +557,7 @@ JsonbValue *
555557
getKeyJsonValueFromContainer(JsonContainer *jsc,
556558
const char *keyVal, int keyLen, JsonbValue *res)
557559
{
558-
const JsonbContainer *container = jsc->data;
560+
const JsonbContainer *container = JsonContainerDataPtr(jsc);
559561
const JEntry *children = container->children;
560562
int count = JsonContainerSize(jsc);
561563
char *baseAddr;
@@ -630,7 +632,7 @@ jsonbGetArrayElement(JsonContainer *jsc, uint32 i)
630632
if (!JsonContainerIsArray(jsc))
631633
elog(ERROR, "not a jsonb array");
632634

633-
JsonbArrayIteratorInit(&it, jsc->data);
635+
JsonbArrayIteratorInit(&it, JsonContainerDataPtr(jsc));
634636

635637
return JsonbArrayIteratorGetIth(&it, i);
636638
}
@@ -682,7 +684,7 @@ fillJsonbValue(const JsonbContainer *container, int index,
682684
}
683685
else
684686
{
685-
JsonContainerData *cont = JsonContainerAlloc();
687+
JsonContainerData *cont = JsonContainerAlloc(&jsonbContainerOps);
686688

687689
Assert(JBE_ISCONTAINER(entry));
688690

@@ -1286,7 +1288,7 @@ jsonbIteratorInit(JsonContainer *cont, const JsonbContainer *container,
12861288
static JsonIterator *
12871289
JsonbIteratorInit(JsonContainer *cont)
12881290
{
1289-
return jsonbIteratorInit(cont, (const JsonbContainer *) cont->data, NULL);
1291+
return jsonbIteratorInit(cont, (const JsonbContainer *) JsonContainerDataPtr(cont), NULL);
12901292
}
12911293

12921294
/*
@@ -2299,7 +2301,7 @@ JsonValueUniquify(JsonValue *res, const JsonValue *val)
22992301
JsonContainer *jc = val->val.binary.data;
23002302

23012303
if (jc->ops == &jsonvContainerOps)
2302-
JsonValueUniquify(res, jc->data);
2304+
JsonValueUniquify(res, JsonContainerDataPtr(jc));
23032305
else
23042306
{
23052307
Assert(jc->ops == &jsontContainerOps);
@@ -2324,7 +2326,7 @@ JsonUniquify(Json *json)
23242326
}
23252327
else if (JsonRoot(json)->ops == &jsonvContainerOps)
23262328
{
2327-
const JsonValue *val = (const JsonValue *) JsonRoot(json)->data;
2329+
const JsonValue *val = (const JsonValue *) JsonContainerDataPtr(JsonRoot(json));
23282330

23292331
if (!JsonValueIsUniquified(val))
23302332
{
@@ -2341,7 +2343,7 @@ static void
23412343
jsonbInitContainer(JsonContainerData *jc, JsonbContainer *jbc, int len)
23422344
{
23432345
jc->ops = &jsonbContainerOps;
2344-
jc->data = jbc;
2346+
JsonContainerDataPtr(jc) = jbc;
23452347
jc->len = len;
23462348
jc->size = jbc->header & JB_CMASK;
23472349
jc->type = jbc->header & JB_FOBJECT ? jbvObject :
@@ -2360,6 +2362,7 @@ jsonbInit(JsonContainerData *jc, Datum value)
23602362
JsonContainerOps
23612363
jsonbContainerOps =
23622364
{
2365+
sizeof(JsonbContainer *),
23632366
jsonbInit,
23642367
JsonbIteratorInit,
23652368
jsonbFindKeyInObject,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy