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

Commitc4bd4d8

Browse files
author
Nikita Glukhov
committed
Add uniquification for binary jsons in JsonbGetDatum()
1 parentc7372ea commitc4bd4d8

File tree

5 files changed

+52
-11
lines changed

5 files changed

+52
-11
lines changed

‎src/backend/utils/adt/json.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
#definejsonb_to_recordsetjson_to_recordset
6464

6565
#defineJsonxContainerOps(&jsontContainerOps)
66+
#defineJsonxGetUniquified(json)(json)
6667
#ifdefJSON_FLATTEN_INTO_TARGET
6768
# defineJsonxGetDatum(json)\
6869
PointerGetDatum(cstring_to_text(JsonToCString(JsonRoot(json))))

‎src/backend/utils/adt/json_gin.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#definegin_triconsistent_jsonb_pathgin_triconsistent_json_path
2020

2121
#defineJsonxContainerOps(&jsontContainerOps)
22+
#defineJsonxGetUniquified(json)(json)
2223
#ifdefJSON_FLATTEN_INTO_TARGET
2324
# defineJsonxGetDatum(json)\
2425
PointerGetDatum(cstring_to_text(JsonToCString(JsonRoot(json))))

‎src/backend/utils/adt/json_op.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#definejsonb_hashjson_hash
2424

2525
#defineJsonxContainerOps(&jsontContainerOps)
26+
#defineJsonxGetUniquified(json)(json)
2627
#ifdefJSON_FLATTEN_INTO_TARGET
2728
# defineJsonxGetDatum(json)\
2829
PointerGetDatum(cstring_to_text(JsonToCString(JsonRoot(json))))

‎src/backend/utils/adt/jsonb_util.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2038,6 +2038,9 @@ JsonValueUniquify(JsonValue *res, const JsonValue *val)
20382038
{
20392039
check_stack_depth();
20402040

2041+
if (!res)
2042+
res= (JsonValue*)palloc(sizeof(JsonValue));
2043+
20412044
if (val->type==jbvObject&&
20422045
(!val->val.object.valuesUniquified|| !val->val.object.uniquified))
20432046
{
@@ -2091,6 +2094,31 @@ JsonValueUniquify(JsonValue *res, const JsonValue *val)
20912094
returnres;
20922095
}
20932096

2097+
Json*
2098+
JsonUniquify(Json*json)
2099+
{
2100+
if (JsonRoot(json)->ops==&jsontContainerOps)
2101+
{
2102+
JsonValueval;
2103+
Json*res=JsonValueToJson(JsonValueUnpackBinary(JsonToJsonValue(json,&val)));
2104+
res->is_json=json->is_json;
2105+
returnres;
2106+
}
2107+
elseif (JsonRoot(json)->ops==&jsonvContainerOps)
2108+
{
2109+
constJsonValue*val= (constJsonValue*)JsonRoot(json)->data;
2110+
2111+
if (!JsonValueIsUniquified(val))
2112+
{
2113+
Json*res=JsonValueToJson(JsonValueUniquify(NULL,val));
2114+
res->is_json=json->is_json;
2115+
returnres;
2116+
}
2117+
}
2118+
2119+
returnjson;
2120+
}
2121+
20942122
staticvoid
20952123
jsonbInitContainer(JsonContainerData*jc,JsonbContainer*jbc,intlen)
20962124
{

‎src/include/utils/json_generic.h

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,19 @@ typedef struct Json
121121

122122
#undef JsonbGetDatum
123123
#ifdefJSON_FLATTEN_INTO_TARGET
124-
# defineJsonbGetDatum(json)JsonFlattenToJsonbDatum(json)
124+
# defineJsonbGetDatum(json)JsonFlattenToJsonbDatum(JsonGetUniquified(json))
125125
#else
126-
# defineJsonbGetDatum(json)JsonGetEOHDatum(json)
126+
# defineJsonbGetDatum(json)JsonGetEOHDatum(JsonGetUniquified(json))
127127
#endif
128128

129-
#ifndefJsonxGetDatum
130-
# defineJsonxGetDatum(json)JsonbGetDatum(json)
129+
#ifdefJsonxGetDatum
130+
# defineJsonGetDatum(json)JsonxGetDatum(json)
131+
#elif defined(JsonxGetUniquified)
132+
# defineJsonGetDatum(json)JsonGetEOHDatum(JsonxGetUniquified(json))
133+
#else
134+
# defineJsonGetDatum(json)JsonbGetDatum(json)
131135
#endif
132136

133-
#defineJsonGetDatum(json)JsonxGetDatum(json)
134-
135137
#undef DatumGetJsonb
136138
#defineDatumGetJsonb(datum) \
137139
DatumGetJson(datum, &jsonbContainerOps, NULL, NULL)
@@ -180,14 +182,15 @@ typedef struct Json
180182
((jc)->ops != &jsonvContainerOps || \
181183
JsonValueIsUniquified((JsonValue *) jc->data)))
182184

185+
#defineJsonIsUniquified(json)JsonContainerIsUniquified(JsonRoot(json))
186+
183187
#defineJsonValueIsScalar(jsval)IsAJsonbScalar(jsval)
184188

185189
#defineJsonContainerGetType(jc) ((jc)->ops->type)
186190
#defineJsonContainerGetOpsByType(type) \
187191
((type) == JsonContainerJsont ? &jsontContainerOps : \
188192
(type) == JsonContainerJsonb ? &jsonbContainerOps : NULL)
189193

190-
191194
#ifdefJSONB_UTIL_C
192195
#defineJsonbValueToJsonb JsonValueToJsonb
193196
#else
@@ -256,11 +259,16 @@ JsonIteratorNext(JsonIterator **it, JsonValue *val, bool skipNested)
256259
#definecompareJsonbContainersJsonCompareContainers
257260
#defineequalsJsonbScalarValueJsonValueScalarEquals
258261

262+
externJsonContainerOpsjsonbContainerOps;
263+
externJsonContainerOpsjsontContainerOps;
264+
externJsonContainerOpsjsonvContainerOps;
265+
259266
externJson*DatumGetJson(Datumval,JsonContainerOps*ops,
260267
CompressionOptionsoptions,Json*tmp);
261268

262269
externvoidJsonFree(Json*json);
263270
externJson*JsonCopyTemporary(Json*tmp);
271+
externJson*JsonUniquify(Json*json);
264272

265273
#defineJsonContainerAlloc() \
266274
((JsonContainerData *) palloc(sizeof(JsonContainerData)))
@@ -302,6 +310,12 @@ JsonGetNonTemporary(Json *json)
302310
returnJsonIsTemporary(json) ?JsonCopyTemporary(json) :json;
303311
}
304312

313+
staticinlineJson*
314+
JsonGetUniquified(Json*json)
315+
{
316+
returnJsonIsUniquified(json) ?json :JsonUniquify(json);
317+
}
318+
305319
staticinlineJsonValue*
306320
JsonValueInitObject(JsonValue*val,intnPairs,intnPairsAllocated,
307321
booluniquified)
@@ -410,8 +424,4 @@ extern void JsonbEncode(StringInfo, const JsonValue *, CompressionOptions);
410424

411425
externintlengthCompareJsonbStringValue(constvoid*a,constvoid*b);
412426

413-
externJsonContainerOpsjsonbContainerOps;
414-
externJsonContainerOpsjsontContainerOps;
415-
externJsonContainerOpsjsonvContainerOps;
416-
417427
#endif/* UTILS_JSON_GENERIC_H */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp