59 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
61 MemoryContext per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
62 MemoryContext oldcontext = MemoryContextSwitchTo(per_query_ctx);
65 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) {
66 MemoryContextSwitchTo(oldcontext);
67 provsql_error(
"rv_families: function must return a row type");
69 tupdesc = BlessTupleDesc(tupdesc);
71 Tuplestorestate *tupstore = tuplestore_begin_heap(
72 rsinfo->allowedModes & SFRM_Materialize_Random,
false, work_mem);
73 rsinfo->returnMode = SFRM_Materialize;
74 rsinfo->setResult = tupstore;
75 rsinfo->setDesc = tupdesc;
81 bool nulls[4] = {
false,
false,
false,
false};
83 values[0] = PointerGetDatum(cstring_to_text(fam->
name));
84 values[1] = Int32GetDatum(
static_cast<int32
>(fam->
nparams));
85 values[2] = param_names_to_text_array(*fam);
86 values[3] = PointerGetDatum(cstring_to_text(fam->
label ? fam->
label
89 tuplestore_putvalues(tupstore, tupdesc, values, nulls);
91 }
catch (
const std::exception &e) {
92 MemoryContextSwitchTo(oldcontext);
95 MemoryContextSwitchTo(oldcontext);
99 MemoryContextSwitchTo(oldcontext);