Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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

+1-1
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

+31-24
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

+4-6
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

+14-11
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)