Skip to content

Commit b470132

Browse files
author
Nikita Glukhov
committed
Remove ExpandedObject in Json
1 parent ca1886b commit b470132

File tree

4 files changed

+21
-376
lines changed

4 files changed

+21
-376
lines changed

src/backend/utils/adt/json_generic.c

Lines changed: 11 additions & 314 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818

1919
JsonContainerOps jsonvContainerOps;
2020

21-
static Json *JsonExpand(Json *tmp, Datum value, bool freeValue,
22-
JsonContainerOps *ops);
23-
2421
JsonValue *
2522
JsonValueCopy(JsonValue *res, const JsonValue *val)
2623
{
@@ -706,7 +703,6 @@ jsonvCopy(JsonContainer *jc)
706703
JsonContainerOps
707704
jsonvContainerOps =
708705
{
709-
JsonContainerJsonv,
710706
NULL,
711707
jsonvIteratorInit,
712708
jsonvFindKeyInObject,
@@ -729,88 +725,6 @@ JsonToJsonValue(Json *json, JsonValue *jv)
729725
return JsonValueInitBinary(jv, &json->root);
730726
}
731727

732-
#ifdef JSON_FLATTEN_INTO_JSONEXT
733-
typedef struct varatt_extended_json
734-
{
735-
varatt_extended_hdr vaext;
736-
JsonContainerType type;
737-
char params[FLEXIBLE_ARRAY_MEMBER];
738-
} varatt_extended_json;
739-
740-
static Size
741-
jsonGetExtendedSize(JsonContainer *jc)
742-
{
743-
return VARHDRSZ_EXTERNAL + offsetof(varatt_extended_json, params) + jc->len;
744-
}
745-
746-
static void
747-
jsonWriteExtended(JsonContainer *jc, void *ptr, Size allocated_size)
748-
{
749-
varatt_extended_json extjs,
750-
*pextjs;
751-
752-
Assert(allocated_size >= jsonGetExtendedSize(jc));
753-
754-
extjs.vaext.size = jsonGetExtendedSize(jc) - VARHDRSZ_EXTERNAL;
755-
extjs.type = JsonContainerGetType(jc);
756-
Assert(extjs.type != JsonContainerUnknown);
757-
758-
SET_VARTAG_EXTERNAL(ptr, VARTAG_EXTENDED);
759-
pextjs = (varatt_extended_json *) VARDATA_EXTERNAL(ptr);
760-
memcpy(pextjs, &extjs, offsetof(varatt_extended_json, params));
761-
memcpy(&pextjs->params, jc->data, jc->len);
762-
}
763-
764-
static Json *
765-
JsonInitExtended(Json *tmp, struct varlena *extvalue, bool freeValue)
766-
{
767-
JsonContainerOps *ops;
768-
CompressionMethodRoutine *cmr;
769-
varatt_extended_json *pextjs,
770-
extjs;
771-
void *val;
772-
int len;
773-
Datum value;
774-
775-
Assert(VARATT_IS_EXTERNAL_EXTENDED(extvalue));
776-
777-
pextjs = (varatt_extended_json *) VARDATA_EXTERNAL(extvalue);
778-
memcpy(&extjs, pextjs, offsetof(varatt_extended_json, data));
779-
780-
totalSize = extjs.vaext.size - offsetof(varatt_extended_json, data);
781-
782-
ops = JsonContainerGetOpsByType(extjs.type);
783-
784-
if (ops)
785-
cmr = NULL;
786-
else
787-
{
788-
cmr = GetCompressionMethodRoutine(extjs.type, InvalidOid);
789-
790-
if (!cmr)
791-
elog(ERROR, "unrecognized json container type %d", extjs.type);
792-
}
793-
794-
len = extjs.vaext.size - offsetof(varatt_extended_json, params);
795-
796-
val = palloc(VARHDRSZ + len); /* FIXME save value with varlena header */
797-
SET_VARSIZE(val, VARHDRSZ + len);
798-
memcpy(VARDATA(val), &pextjs->params, len);
799-
800-
if (freeValue)
801-
pfree(extvalue);
802-
803-
if (ops)
804-
return JsonExpand(tmp, value, true, ops);
805-
806-
value = cmr->decompress(PointerGetDatum(val), NULL);
807-
808-
Assert(VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(value)));
809-
810-
return (Json *) DatumGetEOHP(value);
811-
}
812-
#endif
813-
814728
static void
815729
JsonInit(Json *json)
816730
{
@@ -829,233 +743,36 @@ JsonInit(Json *json)
829743
json->root.ops->init(&json->root, json->obj.value);
830744
}
831745

832-
static Size
833-
jsonGetFlatSizeJsont(Json *json, void **context)
834-
{
835-
Size size;
836-
837-
if (json->root.ops == &jsontContainerOps)
838-
size = VARHDRSZ + json->root.len;
839-
else
840-
{
841-
char *str = JsonToCString(&json->root);
842-
size = VARHDRSZ + strlen(str);
843-
if (context)
844-
*context = str;
845-
else
846-
pfree(str);
847-
}
848-
849-
return size;
850-
}
851-
852-
static void *
853-
jsonFlattenJsont(Json *json, void **context)
854-
{
855-
if (json->root.ops == &jsontContainerOps)
856-
return cstring_to_text_with_len(json->root.data, json->root.len);
857-
else
858-
{
859-
char *str = context ? (char *) *context : JsonToCString(JsonRoot(json));
860-
text *text = cstring_to_text(str);
861-
pfree(str);
862-
return text;
863-
}
864-
}
865-
866-
static Size
867-
jsonGetFlatSize2(Json *json, void **context)
868-
{
869-
Size size;
870-
871-
#ifdef JSON_FLATTEN_INTO_TARGET
872-
if (json->is_json)
873-
#endif
874-
#if defined(JSON_FLATTEN_INTO_TARGET) || defined(JSON_FLATTEN_INTO_JSONT)
875-
size = jsonGetFlatSizeJsont(json, context);
876-
#endif
877-
#ifdef JSON_FLATTEN_INTO_TARGET
878-
else
879-
#endif
880-
#if defined(JSON_FLATTEN_INTO_TARGET) || defined(JSON_FLATTEN_INTO_JSONB)
881-
{
882-
if (json->root.ops == &jsonbContainerOps)
883-
size = VARHDRSZ + json->root.len;
884-
else
885-
{
886-
JsonValue val;
887-
void *js = JsonValueToJsonb(JsonToJsonValue(json, &val));
888-
size = VARSIZE(js);
889-
if (context)
890-
*context = js;
891-
else
892-
pfree(js);
893-
}
894-
}
895-
#endif
896-
897-
return size;
898-
}
899-
900-
static void *
901-
jsonFlatten(Json *json, void **context)
902-
{
903-
#ifdef JSON_FLATTEN_INTO_TARGET
904-
if (json->is_json)
905-
#endif
906-
#if defined(JSON_FLATTEN_INTO_TARGET) || defined(JSON_FLATTEN_INTO_JSONT)
907-
return jsonFlattenJsont(json, context);
908-
#endif
909-
#ifdef JSON_FLATTEN_INTO_TARGET
910-
else
911-
#endif
912-
#if defined(JSON_FLATTEN_INTO_TARGET) || defined(JSON_FLATTEN_INTO_JSONB)
913-
{
914-
if (json->root.ops == &jsonbContainerOps)
915-
{
916-
void *res = palloc(VARHDRSZ + json->root.len);
917-
SET_VARSIZE(res, VARHDRSZ + json->root.len);
918-
memcpy(VARDATA(res), json->root.data, json->root.len);
919-
return res;
920-
}
921-
else if (context)
922-
return *context;
923-
else
924-
{
925-
JsonValue val;
926-
return JsonValueToJsonb(JsonToJsonValue(json, &val));
927-
}
928-
}
929-
#endif
930-
}
931-
932-
static Size
933-
jsonGetFlatSize(ExpandedObjectHeader *eoh, void **context)
934-
{
935-
Json *json = (Json *) eoh;
936-
937-
JsonInit(json);
938-
939-
#ifdef JSON_FLATTEN_INTO_JSONEXT
940-
{
941-
JsonContainer *flat = JsonRoot(json);
942-
JsonContainerData tmp;
943-
944-
if (json->root.ops == &jsonvContainerOps)
945-
{
946-
JsonValue *val = (JsonValue *) flat->data;
947-
948-
if (JsonValueIsUniquified(val))
949-
{
950-
tmp.len = jsonGetFlatSize2(json, context) - VARHDRSZ;
951-
tmp.ops = flatContainerOps;
952-
}
953-
else
954-
{
955-
tmp.len = jsonGetFlatSizeJsont(json, context) - VARHDRSZ;
956-
tmp.ops = &jsontContainerOps;
957-
}
958-
959-
tmp.data = NULL;
960-
961-
flat = &tmp;
962-
}
963-
964-
return jsonGetExtendedSize(flat);
965-
}
966-
#else
967-
return jsonGetFlatSize2(json, context);
968-
#endif
969-
}
970-
971-
static void
972-
jsonFlattenInto(ExpandedObjectHeader *eoh, void *result, Size allocated_size,
973-
void **context)
974-
{
975-
Json *json = (Json *) eoh;
976-
977-
JsonInit(json);
978-
979-
#ifdef JSON_FLATTEN_INTO_JSONEXT
980-
{
981-
JsonContainer *flat = JsonRoot(json);
982-
JsonContainerData tmp;
983-
void *tmpData = NULL;
984-
985-
if (flat->ops == &jsonvContainerOps)
986-
{
987-
JsonValue *val = (JsonValue *) flat->data;
988-
989-
if (JsonValueIsUniquified(val))
990-
{
991-
tmpData = jsonFlatten(json, context);
992-
tmp.ops = flatContainerOps;
993-
}
994-
else
995-
{
996-
tmpData = jsonFlattenJsont(json, context);
997-
tmp.ops = &jsontContainerOps;
998-
}
999-
1000-
tmp.data = VARDATA(tmpData);
1001-
tmp.len = VARSIZE(tmpData) - VARHDRSZ;
1002-
1003-
flat = &tmp;
1004-
}
1005-
1006-
jsonWriteExtended(flat, result, allocated_size);
1007-
1008-
if (tmpData)
1009-
pfree(tmpData);
1010-
}
1011-
#else
1012-
{
1013-
void *data = jsonFlatten(json, context);
1014-
memcpy(result, data, allocated_size);
1015-
pfree(data);
1016-
}
1017-
#endif
1018-
}
1019-
1020-
static ExpandedObjectMethods
1021-
jsonExpandedObjectMethods =
1022-
{
1023-
jsonGetFlatSize,
1024-
jsonFlattenInto
1025-
};
1026-
1027746
static Json *
1028747
JsonExpand(Json *tmp, Datum value, bool freeValue, JsonContainerOps *ops)
1029748
{
1030-
MemoryContext objcxt;
1031749
Json *json;
1032750

1033751
if (tmp)
1034752
{
1035753
json = tmp;
1036-
json->obj.eoh.vl_len_ = 0;
754+
json->obj.isTemporary = true;
1037755
}
1038756
else
1039757
{
1040758
#ifndef JSON_EXPANDED_OBJECT_MCXT
1041759
json = (Json *) palloc(sizeof(Json));
1042-
objcxt = NULL;
1043760
#else
1044761
/*
1045762
* Allocate private context for expanded object. We start by assuming
1046763
* that the json won't be very large; but if it does grow a lot, don't
1047764
* constrain aset.c's large-context behavior.
1048765
*/
1049-
objcxt = AllocSetContextCreate(CurrentMemoryContext,
1050-
"expanded json",
1051-
ALLOCSET_SMALL_MINSIZE,
1052-
ALLOCSET_SMALL_INITSIZE,
1053-
ALLOCSET_DEFAULT_MAXSIZE);
766+
MemoryContext objcxt =
767+
AllocSetContextCreate(CurrentMemoryContext,
768+
"expanded json",
769+
ALLOCSET_SMALL_MINSIZE,
770+
ALLOCSET_SMALL_INITSIZE,
771+
ALLOCSET_DEFAULT_MAXSIZE);
1054772

1055773
json = (Json *) MemoryContextAlloc(objcxt, sizeof(Json));
1056774
#endif
1057-
1058-
EOH_init_header(&json->obj.eoh, &jsonExpandedObjectMethods, objcxt);
775+
json->obj.isTemporary = false;
1059776
}
1060777

1061778
json->obj.value = value;
@@ -1074,28 +791,9 @@ static Json *
1074791
JsonExpandDatum(Datum value, JsonContainerOps *ops, Json *tmp)
1075792
{
1076793
struct varlena *toasted = (struct varlena *) DatumGetPointer(value);
1077-
Json *json;
1078-
1079-
if (VARATT_IS_EXTERNAL_EXPANDED(toasted))
1080-
json = (Json *) DatumGetEOHP(value);
1081-
else
1082-
{
1083-
struct varlena *detoasted = pg_detoast_datum(toasted);
794+
struct varlena *detoasted = pg_detoast_datum(toasted);
1084795

1085-
/*
1086-
if (VARATT_IS_EXTERNAL_EXTENDED(detoasted))
1087-
#ifdef JSON_FLATTEN_INTO_JSONEXT
1088-
return JsonInitExtended(tmp, detoasted, toasted != detoasted);
1089-
#else
1090-
elog(ERROR, "unexpected extended json");
1091-
#endif
1092-
*/
1093-
1094-
json = JsonExpand(tmp, PointerGetDatum(detoasted), toasted != detoasted,
1095-
ops);
1096-
}
1097-
1098-
return json;
796+
return JsonExpand(tmp, PointerGetDatum(detoasted), toasted != detoasted, ops);
1099797
}
1100798

1101799
Json *
@@ -1124,8 +822,7 @@ JsonCopyTemporary(Json *tmp)
1124822

1125823
memcpy(json, tmp, sizeof(Json));
1126824
tmp->obj.freeValue = false;
1127-
1128-
EOH_init_header(&json->obj.eoh, &jsonExpandedObjectMethods, NULL);
825+
tmp->obj.isTemporary = false;
1129826

1130827
return json;
1131828
}

src/backend/utils/adt/jsonb_util.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2239,7 +2239,6 @@ jsonbInit(JsonContainerData *jc, Datum value)
22392239
JsonContainerOps
22402240
jsonbContainerOps =
22412241
{
2242-
JsonContainerJsonb,
22432242
jsonbInit,
22442243
JsonbIteratorInit,
22452244
jsonbFindKeyInObject,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy