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)