Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitcc64c7f

Browse files
author
Nikita Glukhov
committed
Add variable-length JsonContainer data
1 parentca5b66c commitcc64c7f

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
elseif (JsonContainerIsScalar(jc))
@@ -304,7 +304,7 @@ static void
304304
jsonvInitContainer(JsonContainerData*jc,constJsonValue*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
returnval->val.binary.data;
323323
else
324324
{
325-
JsonContainerData*jc=JsonContainerAlloc();
325+
JsonContainerData*jc=JsonContainerAlloc(&jsonvContainerOps);
326326
jsonvInitContainer(jc,val);
327327
returnjc;
328328
}
@@ -354,7 +354,7 @@ static JsonIteratorToken
354354
jsonvScalarIteratorNext(JsonIterator**it,JsonValue*res,boolskipNested)
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,boolskipNested)
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,boolskipNested)
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
staticJsonIterator*
554554
jsonvIteratorInit(JsonContainer*jsc)
555555
{
556-
returnjsonvIteratorInitFromValue(jsc->data,jsc);
556+
returnjsonvIteratorInitFromValue(JsonContainerDataPtr(jsc),jsc);
557557
}
558558

559559
staticJsonValue*
560560
jsonvFindKeyInObject(JsonContainer*objc,constchar*key,intlen)
561561
{
562-
JsonValue*obj=(JsonValue*)objc->data;
562+
JsonValue*obj=JsonContainerDataPtr(objc);
563563
JsonValue*res;
564564
JsonValue*jv;
565565
inti;
@@ -605,7 +605,7 @@ jsonvFindKeyInObject(JsonContainer *objc, const char *key, int len)
605605
staticJsonValue*
606606
jsonvFindValueInArray(JsonContainer*arrc,constJsonValue*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
staticJsonValue*
641641
jsonvGetArrayElement(JsonContainer*arrc,uint32index)
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
staticuint32
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
staticJsonContainer*
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
returnres;
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+
returnJsonContainerDataPtr(JsonRoot(json));
721722

722723
if (!jv)
723724
jv=palloc(sizeof(JsonValue));
@@ -731,9 +732,9 @@ JsonInit(Json *json)
731732
constvoid*data=DatumGetPointer(json->obj.value);
732733
constvoid*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+
Sizesize=JsonAllocSize(ops->data_size);
761+
758762
#ifndefJSON_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
returnjson;
788793
}
789794

@@ -819,9 +824,10 @@ JsonFree(Json *json)
819824
Json*
820825
JsonCopyTemporary(Json*tmp)
821826
{
822-
Json*json= (Json*)palloc(sizeof(Json));
827+
Sizesize=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
returnjson;
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
returnres;
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
StringInfojtext=makeStringInfo();
163163
intversion=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-
intsize=jc->len;
159-
void*out=palloc(VARHDRSZ+size);
158+
intsize=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
returnout;
163165
}
164166

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

499501
/*
@@ -556,7 +558,7 @@ JsonbValue *
556558
getKeyJsonValueFromContainer(JsonContainer*jsc,
557559
constchar*keyVal,intkeyLen,JsonbValue*res)
558560
{
559-
constJsonbContainer*container=jsc->data;
561+
constJsonbContainer*container=JsonContainerDataPtr(jsc);
560562
constJEntry*children=container->children;
561563
intcount=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
returnJsonbArrayIteratorGetIth(&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
staticJsonIterator*
12241226
JsonbIteratorInit(JsonContainer*cont)
12251227
{
1226-
returnjsonbIteratorInit(cont, (constJsonbContainer*)cont->data,NULL);
1228+
returnjsonbIteratorInit(cont, (constJsonbContainer*)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
elseif (JsonRoot(json)->ops==&jsonvContainerOps)
22632265
{
2264-
constJsonValue*val= (constJsonValue*)JsonRoot(json)->data;
2266+
constJsonValue*val= (constJsonValue*)JsonContainerDataPtr(JsonRoot(json));
22652267

22662268
if (!JsonValueIsUniquified(val))
22672269
{
@@ -2278,7 +2280,7 @@ static void
22782280
jsonbInitContainer(JsonContainerData*jc,JsonbContainer*jbc,intlen)
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)

[8]ページ先頭

©2009-2025 Movatter.jp