in src/backend/utils/adt/agtype_util.c [2449:2509]
void pfree_agtype_value_content(agtype_value* value)
{
int i;
/* guards against stack overflow due to deeply nested agtype_value */
check_stack_depth();
switch (value->type)
{
case AGTV_NUMERIC:
pfree_if_not_null(value->val.numeric);
break;
case AGTV_STRING:
/*
* The char pointer (val.string.val) is not free'd because
* it is not allocated by an agtype helper function.
*/
pfree_if_not_null(value->val.string.val);
break;
case AGTV_ARRAY:
case AGTV_PATH:
for (i = 0; i < value->val.array.num_elems; i++)
{
pfree_agtype_value_content(&value->val.array.elems[i]);
}
pfree_if_not_null(value->val.array.elems);
break;
case AGTV_OBJECT:
case AGTV_VERTEX:
case AGTV_EDGE:
for (i = 0; i < value->val.object.num_pairs; i++)
{
pfree_agtype_value_content(&value->val.object.pairs[i].key);
pfree_agtype_value_content(&value->val.object.pairs[i].value);
}
pfree_if_not_null(value->val.object.pairs);
break;
case AGTV_BINARY:
pfree_if_not_null(value->val.binary.data);
break;
case AGTV_NULL:
case AGTV_INTEGER:
case AGTV_FLOAT:
case AGTV_BOOL:
/*
* These are deallocated by the calling function.
*/
break;
default:
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("unknown agtype")));
break;
}
}