Question about error handling with UDF written in C
От | Terry Chong |
---|---|
Тема | Question about error handling with UDF written in C |
Дата | |
Msg-id | CAPx7QHGggiA6rEMO8VpJyF3wooxD-o21JOmUQ80A76NWZ7tTbg@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: Question about error handling with UDF written in C
|
Список | 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 по дате отправления: