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

Commit61e8839

Browse files
author
Nikita Glukhov
committed
Add jsonbzDecompressTo()
1 parent8a5b92d commit61e8839

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

‎contrib/jsonb_toaster/jsonb_toaster.c

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ static JsonbValue *fillCompressedJsonbValue(CompressedJsonb *cjb,
189189
intindex,char*base_addr,
190190
uint32offset,JsonValue*result);
191191
staticJsonbContainerHeader*jsonxzDecompress(JsonContainer*jc);
192+
staticvoidjsonxzDecompressTo(CompressedJsonb*cjb,Sizeoffset);
192193
staticboolJsonContainerIsToasted(JsonContainer*jc,
193194
JsonbToastedContainerPointerData*jbcptr);
194195
staticboolJsonContainerIsCompressed(JsonContainer*jc,
@@ -747,7 +748,7 @@ JsonxIteratorInit(JsonContainer *cont, const JsonbContainerHeader *container,
747748

748749
/* decompress container header */
749750
if (cjb)
750-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+cjb->offset+ offsetof(JsonbDatum,root.children));
751+
jsonxzDecompressTo(cjb,cjb->offset+ offsetof(JsonbContainerHeader,children));
751752

752753
type=container->header&JBC_TMASK;
753754

@@ -792,7 +793,7 @@ JsonxIteratorInit(JsonContainer *cont, const JsonbContainerHeader *container,
792793
}
793794

794795
if (it->dataProper&&cjb)
795-
PG_DETOAST_ITERATE(cjb->iter,it->dataProper);
796+
jsonxzDecompressTo(cjb,cjb->offset+ (it->dataProper- (char*)container));
796797

797798
return (JsonIterator*)it;
798799
}
@@ -1616,14 +1617,26 @@ jsonxzInitContainer(JsonContainerData *jc, CompressedJsonb *cjb,
16161617
jsonxInitContainerFromHeader(jc,header);
16171618
}
16181619

1620+
staticvoid
1621+
jsonxzDecompressAll(CompressedJsonb*cjb)
1622+
{
1623+
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->capacity);
1624+
}
1625+
1626+
staticvoid
1627+
jsonxzDecompressTo(CompressedJsonb*cjb,Sizeoffset)
1628+
{
1629+
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+offset);
1630+
}
1631+
16191632
staticJsonbContainerHeader*
16201633
jsonxzDecompress(JsonContainer*jc)
16211634
{
16221635
CompressedJsonb*cjb=jsonbzGetCompressedJsonb(jc);
16231636
JsonbDatum*jb= (JsonbDatum*)cjb->iter->buf->buf;
16241637
JsonbContainerHeader*container= (JsonbContainerHeader*)((char*)jb+cjb->offset);
16251638

1626-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+cjb->offset+jc->len);
1639+
jsonxzDecompressTo(cjb,cjb->offset+jc->len);
16271640

16281641
returncontainer;
16291642
}
@@ -1658,15 +1671,13 @@ fillCompressedJsonbValue(CompressedJsonb *cjb, const JsonbContainerHeader *conta
16581671

16591672
len-=INTALIGN(offset)-offset;
16601673

1661-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+cjb2.offset+
1662-
offsetof(JsonbContainerHeader,children));
1663-
1674+
jsonxzDecompressTo(cjb,cjb2.offset+ offsetof(JsonbContainerHeader,children));
16641675
jsonxzInitContainer(cont,&cjb2,NULL,len);
16651676
JsonValueInitBinary(result,cont);
16661677
}
16671678
else
16681679
{
1669-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+base_offset+offset+len);
1680+
jsonxzDecompressTo(cjb,base_offset+offset+len);
16701681
jsonxFillValue(container,index,base_addr,offset,result);
16711682
}
16721683

@@ -1702,7 +1713,7 @@ findValueInCompressedJsonbObject(CompressedJsonb *cjb, const char *keystr, int k
17021713
key.val.string.val=keystr;
17031714
key.val.string.len=keylen;
17041715

1705-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+base_offset);
1716+
jsonxzDecompressTo(cjb,base_offset);
17061717

17071718
/* Binary search on object/pair keys *only* */
17081719
while (stopLow<stopHigh)
@@ -1717,7 +1728,7 @@ findValueInCompressedJsonbObject(CompressedJsonb *cjb, const char *keystr, int k
17171728
offset=getJsonbOffset(container,stopMiddle);
17181729
len=getJsonbLength(container,stopMiddle);
17191730

1720-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+base_offset+offset+len);
1731+
jsonxzDecompressTo(cjb,base_offset+offset+len);
17211732

17221733
difference=lengthCompareJsonbString(base_addr+offset,len,
17231734
key.val.string.val,
@@ -1767,7 +1778,7 @@ jsonxzFindKeyInObject(JsonContainer *jc, const char *key, int len, JsonValue *re
17671778

17681779
CompressedDatumDecompress(cjb->datum,cjb->offset+ offsetof(JsonbContainerHeader,header));
17691780
#else
1770-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->buf+cjb->offset+ offsetof(JsonbContainerHeader,header));
1781+
jsonxzDecompressTo(cjb,cjb->offset+ offsetof(JsonbContainerHeader,children));
17711782
#endif
17721783

17731784
returnfindValueInCompressedJsonbObject(cjb,key,len,res);
@@ -1789,11 +1800,11 @@ JsonbzArrayIteratorInit(JsonbzArrayIterator *it, CompressedJsonb *cjb)
17891800
JsonbDatum*jb= (JsonbDatum*)cjb->iter->buf->buf;
17901801
constJsonbContainerHeader*jbc= (constJsonbContainerHeader*)((char*)jb+cjb->offset);
17911802

1792-
PG_DETOAST_ITERATE(cjb->iter, (constchar*)&jbc->children);
1803+
jsonxzDecompressTo(cjb,cjb->offset+ ((char*)&jbc->children- (char*)jbc));
17931804

17941805
it->count= (cjb->header&JBC_CMASK);
17951806

1796-
PG_DETOAST_ITERATE(cjb->iter, (constchar*)&jbc->children[it->count]);
1807+
jsonxzDecompressTo(cjb,cjb->offset+ ((char*)&jbc->children[it->count]- (char*)jbc));
17971808

17981809
it->cjb=cjb;
17991810
it->container=jbc;
@@ -1871,7 +1882,7 @@ jsonxzIteratorInit(JsonContainer *jc)
18711882
JsonbContainerHeader*jbc= (JsonbContainerHeader*)((char*)jb+cjb->offset);
18721883

18731884
if (!jsonb_partial_decompression)
1874-
PG_DETOAST_ITERATE(cjb->iter,cjb->iter->buf->capacity);
1885+
jsonxzDecompressAll(cjb);
18751886

18761887
returnJsonxIteratorInit(jc,jbc,cjb);
18771888
}
@@ -1880,15 +1891,17 @@ static void
18801891
jsonxzInitFromDetoastIterator(JsonContainerData*jc,DetoastIteratoriter,JsonbContainerHdr*header)
18811892
{
18821893
CompressedJsonb*cjb=palloc(sizeof(*cjb));
1894+
intlen=VARSIZE_ANY_EXHDR(iter->buf->buf);
1895+
18831896
cjb->iter=iter;
18841897
cjb->offset= offsetof(JsonbDatum,root);
18851898

18861899
if (!jsonb_partial_decompression)
1887-
PG_DETOAST_ITERATE(iter,iter->buf->capacity);
1900+
jsonxzDecompressAll(cjb);
18881901
elseif (!header)
1889-
PG_DETOAST_ITERATE(iter,Min(iter->buf->buf+offsetof(JsonbDatum,root.children),iter->buf->capacity));
1902+
jsonxzDecompressTo(cjb,Min(offsetof(JsonbDatum,root.children),iter->buf->capacity-iter->buf->buf));
18901903

1891-
jsonxzInitContainer(jc,cjb,header,VARSIZE_ANY_EXHDR(iter->buf->buf));// cd->total_len - VARHDRSZ
1904+
jsonxzInitContainer(jc,cjb,header,len);
18921905
}
18931906

18941907
staticvoid

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp