void pfree_agtype_value_content()

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;
    }
}