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

Commit3f322af

Browse files
author
Nikita Glukhov
committed
Add JBC_TOBJECT_COMPRESSED
1 parente080b22 commit3f322af

File tree

1 file changed

+88
-21
lines changed

1 file changed

+88
-21
lines changed

‎contrib/jsonb_toaster/jsonb_toaster.c

Lines changed: 88 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ void _PG_init(void);
6060
#defineJBE_ISCONTAINER_PTR(je_)(((je_) & JENTRY_TYPEMASK) == JENTRY_ISCONTAINER_PTR)
6161

6262
#defineJBC_TOBJECT_TOASTED0x10000000/* object with toasted keys */
63+
#defineJBC_TOBJECT_COMPRESSED0x60000000/* object with compressed keys */
6364

6465
#defineJB_HEADER(jb) ((jb)->root.header)
6566
#defineJX_HEADER_IS_OBJECT(hdr) (((hdr) & JBC_TMASK) == JBC_TOBJECT || \
6667
((hdr) & JBC_TMASK) == JBC_TOBJECT_SORTED || \
67-
((hdr) & JBC_TMASK) == JBC_TOBJECT_TOASTED)
68+
((hdr) & JBC_TMASK) == JBC_TOBJECT_TOASTED || \
69+
((hdr) & JBC_TMASK) == JBC_TOBJECT_COMPRESSED)
6870
#defineJX_ROOT_IS_OBJECT(jbp_)JX_HEADER_IS_OBJECT(JB_HEADER(jbp_))
6971

7072
typedefstructvaratt_externalJsonbToastPointer;
@@ -195,10 +197,11 @@ static bool JsonContainerIsToasted(JsonContainer *jc,
195197
JsonbToastedContainerPointerData*jbcptr);
196198
staticboolJsonContainerIsCompressed(JsonContainer*jc,
197199
JsonbCompressedContainerData*jbcptr);
198-
staticboolJsonValueContainsToasted(constJsonValue*jv);
199-
staticboolJsonValueIsToasted(JsonValue*jv,JsonbToastedContainerPointerData*jbcptr);
200-
staticboolJsonValueIsCompressed(JsonValue*jv,JsonbCompressedContainerData*jbcptr);
200+
staticboolJsonValueIsToasted(constJsonValue*jv,JsonbToastedContainerPointerData*jbcptr);
201+
staticboolJsonValueIsCompressed(constJsonValue*jv,JsonbCompressedContainerData*jbcptr);
201202
staticboolJsonContainerContainsToasted(JsonContainer*jc);
203+
staticboolJsonContainerContainsToastedOrCompressed(JsonContainer*jc,bool*toasted,bool*compressed);
204+
staticboolJsonValueContainsToastedOrCompressed(constJsonValue*jv,bool*toasted,bool*compressed);
202205

203206
staticbooljsonb_toast_fields= true;/* GUC */
204207
staticbooljsonb_toast_fields_recursively= true;/* GUC */
@@ -822,6 +825,7 @@ JsonxIteratorInit(JsonContainer *cont, const JsonbContainerHeader *container,
822825
caseJBC_TOBJECT:
823826
caseJBC_TOBJECT_SORTED:
824827
caseJBC_TOBJECT_TOASTED:
828+
caseJBC_TOBJECT_COMPRESSED:
825829
it->dataProper=
826830
(char*)it->children+it->nElems*sizeof(JEntry)*2;
827831
it->dataProper=initKVMap(&it->kvmap,it->dataProper,it->nElems,
@@ -902,9 +906,14 @@ JsonxEncode(StringInfoData *buffer, const JsonbValue *val, void *cxt)
902906
staticvoid*
903907
jsonxEncode(JsonValue*jv,JsonContainerOps*ops,Oidtoasterid)
904908
{
905-
if (ops==&jsonbContainerOps&&
906-
JsonValueContainsToasted(jv))
907-
returnJsonEncode(jv,JsonxEncode, (void*)(intptr_t)toasterid);
909+
if (ops==&jsonbContainerOps)
910+
{
911+
booltoasted;
912+
boolcompressed;
913+
914+
if (JsonValueContainsToastedOrCompressed(jv,&toasted,&compressed))
915+
returnJsonEncode(jv,JsonxEncode, (void*)(intptr_t)toasterid);
916+
}
908917

909918
returnNULL;
910919
}
@@ -1204,24 +1213,83 @@ JsonContainerContainsToasted(JsonContainer *jc)
12041213
}
12051214

12061215
staticbool
1207-
JsonValueIsToasted(JsonValue*jv,JsonbToastedContainerPointerData*jbcptr)
1216+
JsonContainerContainsToastedOrCompressed(JsonContainer*jc,
1217+
bool*toasted,bool*compressed)
1218+
{
1219+
if (jc->ops==&jsonxContainerOps)
1220+
{
1221+
JsonbContainerHeader*jbc=JsonContainerDataPtr(jc);
1222+
1223+
*toasted= (jbc->header&JBC_TMASK)==JBC_TOBJECT_TOASTED;
1224+
*compressed= (jbc->header&JBC_TMASK)==JBC_TOBJECT_COMPRESSED;
1225+
1226+
return*toasted||*compressed;
1227+
}
1228+
elseif (jc->ops==&jsonxzContainerOps)
1229+
{
1230+
CompressedJsonx*cjb=jsonxzGetCompressedJsonx(jc);
1231+
1232+
*toasted= (cjb->header&JBC_TMASK)==JBC_TOBJECT_TOASTED;
1233+
*compressed= (cjb->header&JBC_TMASK)==JBC_TOBJECT_COMPRESSED;
1234+
1235+
return*toasted||*compressed;
1236+
}
1237+
#if0/* XXX jsonv */
1238+
elseif (jc->ops==&jsonvContainerOps)
1239+
returnJsonValueContainsToastedOrCompressed(JsonContainerDataPtr(jc),toasted,compressed);
1240+
#endif
1241+
else
1242+
{
1243+
*toasted=*compressed= false;
1244+
return false;/* XXX other container types */
1245+
}
1246+
}
1247+
1248+
staticbool
1249+
JsonValueIsToasted(constJsonValue*jv,JsonbToastedContainerPointerData*jbcptr)
12081250
{
12091251
returnjv->type==jbvBinary&&
12101252
JsonContainerIsToasted(jv->val.binary.data,jbcptr);
12111253
}
12121254

12131255
staticbool
1214-
JsonValueIsCompressed(JsonValue*jv,JsonbCompressedContainerData*jbcptr)
1256+
JsonValueIsCompressed(constJsonValue*jv,JsonbCompressedContainerData*jbcptr)
12151257
{
12161258
returnjv->type==jbvBinary&&
12171259
JsonContainerIsCompressed(jv->val.binary.data,jbcptr);
12181260
}
12191261

1262+
staticinlinebool
1263+
JsonValueContainsToastedOrCompressedAccum(constJsonValue*val,
1264+
bool*toasted,bool*compressed)
1265+
{
1266+
boolhas_toasted;
1267+
boolhas_compressed;
1268+
1269+
*toasted |=JsonValueIsToasted(val,NULL);
1270+
*compressed |=JsonValueIsCompressed(val,NULL);
1271+
1272+
if (*toasted&&*compressed)
1273+
return true;
1274+
1275+
if (JsonValueContainsToastedOrCompressed(val,&has_toasted,&has_compressed))
1276+
{
1277+
*toasted |=has_toasted;
1278+
*compressed |=has_compressed;
1279+
}
1280+
1281+
return*toasted&&*compressed;
1282+
}
1283+
12201284
staticbool
1221-
JsonValueContainsToasted(constJsonValue*jv)
1285+
JsonValueContainsToastedOrCompressed(constJsonValue*jv,
1286+
bool*toasted,bool*compressed)
12221287
{
12231288
if (jv->type==jbvBinary)
1224-
returnJsonContainerContainsToasted(jv->val.binary.data);
1289+
returnJsonContainerContainsToastedOrCompressed(jv->val.binary.data,
1290+
toasted,compressed);
1291+
1292+
*toasted=*compressed= false;
12251293

12261294
if (jv->type==jbvObject)
12271295
{
@@ -1231,8 +1299,7 @@ JsonValueContainsToasted(const JsonValue *jv)
12311299
{
12321300
JsonValue*val=&jv->val.object.pairs[i].value;
12331301

1234-
if (JsonValueIsToasted(val,NULL)||
1235-
JsonValueContainsToasted(val))
1302+
if (JsonValueContainsToastedOrCompressedAccum(val,toasted,compressed))
12361303
return true;
12371304
}
12381305
}
@@ -1244,15 +1311,15 @@ JsonValueContainsToasted(const JsonValue *jv)
12441311
{
12451312
JsonValue*val=&jv->val.array.elems[i];
12461313

1247-
if (JsonValueIsToasted(val,NULL)||
1248-
JsonValueContainsToasted(val))
1314+
if (JsonValueContainsToastedOrCompressedAccum(val,toasted,compressed))
12491315
return true;
12501316
}
12511317
}
12521318

1253-
returnfalse;
1319+
return*toasted||*compressed;
12541320
}
12551321

1322+
12561323
staticvoid
12571324
convertJsonbObject(StringInfobuffer,JEntry*pheader,constJsonbValue*val,intlevel)
12581325
{
@@ -1266,6 +1333,7 @@ convertJsonbObject(StringInfo buffer, JEntry *pheader, const JsonbValue *val, in
12661333
intkvmap_entry_size;
12671334
boolsorted_values=jsonb_sort_field_values&&nPairs>1;
12681335
boolhave_toasted_values= false;
1336+
boolhave_compressed_values= false;
12691337
struct
12701338
{
12711339
intsize;
@@ -1274,11 +1342,8 @@ convertJsonbObject(StringInfo buffer, JEntry *pheader, const JsonbValue *val, in
12741342

12751343
Assert(nPairs >=0);
12761344

1277-
if (JsonValueContainsToasted(val))
1278-
{
1279-
have_toasted_values= true;
1345+
if (JsonValueContainsToastedOrCompressed(val,&have_toasted_values,&have_compressed_values))
12801346
sorted_values= false;/* FIXME */
1281-
}
12821347

12831348
values=sorted_values ?palloc(sizeof(*values)*nPairs) :NULL;
12841349

@@ -1318,7 +1383,8 @@ convertJsonbObject(StringInfo buffer, JEntry *pheader, const JsonbValue *val, in
13181383
*/
13191384
header=nPairs |
13201385
(sorted_values ?JBC_TOBJECT_SORTED :
1321-
have_toasted_values ?JBC_TOBJECT_TOASTED :JBC_TOBJECT);
1386+
have_toasted_values ?JBC_TOBJECT_TOASTED :
1387+
have_compressed_values ?JBC_TOBJECT_COMPRESSED :JBC_TOBJECT);
13221388
appendToBuffer(buffer, (char*)&header,sizeof(uint32));
13231389

13241390
/* Reserve space for the JEntries of the keys and values. */
@@ -1617,6 +1683,7 @@ jsonxInitContainerFromHeader(JsonContainerData *jc, JsonbContainerHdr header)
16171683
caseJBC_TOBJECT:
16181684
caseJBC_TOBJECT_SORTED:
16191685
caseJBC_TOBJECT_TOASTED:
1686+
caseJBC_TOBJECT_COMPRESSED:
16201687
jc->type=jbvObject;
16211688
break;
16221689
caseJBC_TARRAY:

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp