Skip to content

Commit cc64c7f

Browse files
author
Nikita Glukhov
committed
Add variable-length JsonContainer data
1 parent ca5b66c commit cc64c7f

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

@@ -493,7 +495,7 @@ jsonbFindValueInArrayContainer(const JsonbContainer *container,
493495
static JsonbValue *
494496
jsonbFindValueInArray(JsonContainer *jsc, const JsonbValue *key)
495497
{
496-
return jsonbFindValueInArrayContainer(jsc->data, key);
498+
return jsonbFindValueInArrayContainer(JsonContainerDataPtr(jsc), key);
497499
}
498500

499501
/*
@@ -556,7 +558,7 @@ JsonbValue *
556558
getKeyJsonValueFromContainer(JsonContainer *jsc,
557559
const char *keyVal, int keyLen, JsonbValue *res)
558560
{
559-
const JsonbContainer *container = jsc->data;
561+
const JsonbContainer *container = JsonContainerDataPtr(jsc);
560562
const JEntry *children = container->children;
561563
int count = JsonContainerSize(jsc);
562564
char *baseAddr;
@@ -631,7 +633,7 @@ jsonbGetArrayElement(JsonContainer *jsc, uint32 i)
631633
if (!JsonContainerIsArray(jsc))
632634
elog(ERROR, "not a jsonb array");
633635

634-
JsonbArrayIteratorInit(&it, jsc->data);
636+
JsonbArrayIteratorInit(&it, JsonContainerDataPtr(jsc));
635637

636638
return JsonbArrayIteratorGetIth(&it, i);
637639
}
@@ -683,7 +685,7 @@ fillJsonbValue(const JsonbContainer *container, int index,
683685
}
684686
else
685687
{
686-
JsonContainerData *cont = JsonContainerAlloc();
688+
JsonContainerData *cont = JsonContainerAlloc(&jsonbContainerOps);
687689

688690
Assert(JBE_ISCONTAINER(entry));
689691

@@ -1223,7 +1225,7 @@ jsonbIteratorInit(JsonContainer *cont, const JsonbContainer *container,
12231225
static JsonIterator *
12241226
JsonbIteratorInit(JsonContainer *cont)
12251227
{
1226-
return jsonbIteratorInit(cont, (const JsonbContainer *) cont->data, NULL);
1228+
return jsonbIteratorInit(cont, (const JsonbContainer *) JsonContainerDataPtr(cont), NULL);
12271229
}
12281230

12291231
/*
@@ -2236,7 +2238,7 @@ JsonValueUniquify(JsonValue *res, const JsonValue *val)
22362238
JsonContainer *jc = val->val.binary.data;
22372239

22382240
if (jc->ops == &jsonvContainerOps)
2239-
JsonValueUniquify(res, jc->data);
2241+
JsonValueUniquify(res, JsonContainerDataPtr(jc));
22402242
else
22412243
{
22422244
Assert(jc->ops == &jsontContainerOps);
@@ -2261,7 +2263,7 @@ JsonUniquify(Json *json)
22612263
}
22622264
else if (JsonRoot(json)->ops == &jsonvContainerOps)
22632265
{
2264-
const JsonValue *val = (const JsonValue *) JsonRoot(json)->data;
2266+
const JsonValue *val = (const JsonValue *) JsonContainerDataPtr(JsonRoot(json));
22652267

22662268
if (!JsonValueIsUniquified(val))
22672269
{
@@ -2278,7 +2280,7 @@ static void
22782280
jsonbInitContainer(JsonContainerData *jc, JsonbContainer *jbc, int len)
22792281
{
22802282
jc->ops = &jsonbContainerOps;
2281-
jc->data = jbc;
2283+
JsonContainerDataPtr(jc) = jbc;
22822284
jc->len = len;
22832285
jc->size = jbc->header & JB_CMASK;
22842286
jc->type = jbc->header & JB_FOBJECT ? jbvObject :
@@ -2297,6 +2299,7 @@ jsonbInit(JsonContainerData *jc, Datum value)
22972299
JsonContainerOps
22982300
jsonbContainerOps =
22992301
{
2302+
sizeof(JsonbContainer *),
23002303
jsonbInit,
23012304
JsonbIteratorInit,
23022305
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