Skip to content

Commit 9fee610

Browse files
author
Nikita Glukhov
committed
Add JsonValueInitBinary()
1 parent a0af4ad commit 9fee610

File tree

4 files changed

+20
-29
lines changed

4 files changed

+20
-29
lines changed

src/backend/utils/adt/json.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2764,13 +2764,10 @@ jsontFillValue(JsonIterator **pit, JsonValue *res, bool skipNested,
27642764
case JSON_TOKEN_OBJECT_START:
27652765
case JSON_TOKEN_ARRAY_START:
27662766
{
2767+
JsonContainerData *cont = JsonContainerAlloc();
27672768
char *token_start = lex->token_start;
27682769
int len;
27692770

2770-
res->type = jbvBinary;
2771-
res->val.binary.data = JsonContainerAlloc();
2772-
res->val.binary.uniquified = false;
2773-
27742771
if (skipNested)
27752772
{
27762773
if (tok == JSON_TOKEN_OBJECT_START)
@@ -2783,12 +2780,14 @@ jsontFillValue(JsonIterator **pit, JsonValue *res, bool skipNested,
27832780
else
27842781
len = lex->input_length - (lex->token_start - lex->input);
27852782

2786-
jsontInitContainer((JsonContainerData *) res->val.binary.data,
2783+
jsontInitContainer(cont,
27872784
token_start, len,
27882785
tok == JSON_TOKEN_OBJECT_START ? jbvObject
27892786
: jbvArray,
27902787
-1);
27912788

2789+
JsonValueInitBinary(res, cont);
2790+
27922791
if (skipNested)
27932792
return false;
27942793

src/backend/utils/adt/json_generic.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,10 @@ JsonValueUnwrap(const JsonValue *val, JsonValue *valbuf)
153153
JsonValue *
154154
JsonValueWrapInBinary(const JsonValue *val, JsonValue *bin)
155155
{
156-
JsonContainer *jc = JsonValueToContainer(val);
157-
158156
if (!bin)
159157
bin = (JsonValue *) palloc(sizeof(JsonValue));
160158

161-
bin->type = jbvBinary;
162-
bin->val.binary.data = jc;
163-
bin->val.binary.uniquified = JsonValueIsUniquified(val);
164-
165-
return bin;
159+
return JsonValueInitBinary(bin, JsonValueToContainer(val));
166160
}
167161

168162
static inline JsonValue *
@@ -708,11 +702,7 @@ JsonToJsonValue(Json *json, JsonValue *jv)
708702
if (!jv)
709703
jv = palloc(sizeof(JsonValue));
710704

711-
jv->type = jbvBinary;
712-
jv->val.binary.data = &json->root;
713-
jv->val.binary.uniquified = json->root.ops != &jsontContainerOps;
714-
715-
return jv;
705+
return JsonValueInitBinary(jv, &json->root);
716706
}
717707

718708
#define JSON_FLATTEN_INTO_TARGET

src/backend/utils/adt/jsonb_util.c

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,7 @@ JsonContainerFlatten(JsonContainer *jc, JsonValueEncoder encoder,
136136
if (binary)
137137
Assert(binary->type == jbvBinary);
138138
else
139-
{
140-
jbv.type = jbvBinary;
141-
jbv.val.binary.data = jc;
142-
jbv.val.binary.len = jc->len;
143-
jbv.val.binary.uniquified = JsonContainerIsUniquified(jc);
144-
145-
binary = &jbv;
146-
}
139+
binary = JsonValueInitBinary(&jbv, jc);
147140

148141
if (!binary->val.binary.uniquified)
149142
binary = JsonValueUniquify(&uniquified, binary);
@@ -624,15 +617,14 @@ fillJsonbValue(const JsonbContainer *container, int index,
624617
}
625618
else
626619
{
620+
JsonContainerData *cont = JsonContainerAlloc();
627621
Assert(JBE_ISCONTAINER(entry));
628-
result->type = jbvBinary;
629-
result->val.binary.data = JsonContainerAlloc();
630-
jsonbInitContainer((JsonContainerData *) result->val.binary.data,
622+
jsonbInitContainer(cont,
631623
/* Remove alignment padding from data pointer and length */
632624
(JsonbContainer *)(base_addr + INTALIGN(offset)),
633625
getJsonbLength(container, index) -
634626
(INTALIGN(offset) - offset));
635-
result->val.binary.uniquified = true;
627+
JsonValueInitBinary(result, cont);
636628
}
637629
}
638630

src/include/utils/json_generic.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,16 @@ JsonValueInitArray(JsonValue *val, int nElems, int nElemsAllocated,
355355
return val;
356356
}
357357

358+
static inline JsonValue *
359+
JsonValueInitBinary(JsonValue *val, JsonContainer *cont)
360+
{
361+
val->type = jbvBinary;
362+
val->val.binary.data = cont;
363+
val->val.binary.uniquified = JsonContainerIsUniquified(cont);
364+
365+
return val;
366+
}
367+
358368
extern Json *JsonValueToJson(JsonValue *val);
359369
extern JsonValue *JsonToJsonValue(Json *json, JsonValue *jv);
360370
extern JsonValue *JsonValueUnpackBinary(const JsonValue *jbv);

0 commit comments

Comments
 (0)