Question about error handling with UDF written in C - Mailing list pgsql-novice

From Terry Chong
Subject Question about error handling with UDF written in C
Date
Msg-id CAPx7QHGggiA6rEMO8VpJyF3wooxD-o21JOmUQ80A76NWZ7tTbg@mail.gmail.com
Whole thread Raw
Responses Re: Question about error handling with UDF written in C
List pgsql-novice
Hello, I am trying to create a UDF in C that returns multiple rows.  I followed the examples in the contrib directory which does the following:

1       /* create a function context for cross-call persistence */
2       funcctx = SRF_FIRSTCALL_INIT();
3
4       /* switch to memory context appropriate for multiple function calls */
5       oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
6
7      /* Prepare the inter call array for returning the data */
8       someVariable = palloc(size);
9
10      /* total number of tuples to be returned */
11      funcctx->max_calls = NUM_OUTPUT_VARIABLES;
12       funcctx->user_fctx = someVariable;
13
14       /* Build a tuple descriptor for our result type */
15      if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
16           ereport(ERROR,
17                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18                    errmsg("function returning record called in context "
19                           "that cannot accept type record")));

My question is that if we detect an error at line 15 and we get into the ereport code, would the memory allocated under multi_call_memory_ctx gets cleaned up properly?  The document only states that the memory allocated under multi_call_memory_ctx will be cleaned up by SRF_RETURN_DONE, but what about error situations such as the above?

Thanks

pgsql-novice by date:

Previous
From: Tom Lane
Date:
Subject: Re: Roles and passwds
Next
From: Tom Lane
Date:
Subject: Re: Question about error handling with UDF written in C