Don't bother checking the result of SPI_connect[_ext] anymore.
SPI_connect/SPI_connect_ext have not returned any value other than SPI_OK_CONNECT since commit 1833f1a1c in v10; any errors are thrown via ereport. (The most likely failure is out-of-memory, which has always been thrown that way, so callers had better be prepared for such errors.) This makes it somewhat pointless to check these functions' result, and some callers within our code haven't been bothering; indeed, the only usage example within spi.sgml doesn't bother. So it's likely that the omission has propagated into extensions too. Hence, let's standardize on not checking, and document the return value as historical, while not actually changing these functions' behavior. (The original proposal was to change their return type to "void", but that would needlessly break extensions that are conforming to the old practice.) This saves a small amount of boilerplate code in a lot of places. Stepan Neretin Discussion: https://postgr.es/m/CAMaYL5Z9Uk8cD9qGz9QaZ2UBJFOu7jFx5Mwbznz-1tBbPDQZow@mail.gmail.com
This commit is contained in:
parent
cdb6b0fdb0
commit
218527d014
@ -2377,9 +2377,7 @@ get_tuple_of_interest(Relation rel, int *pkattnums, int pknumatts, char **src_pk
|
|||||||
/*
|
/*
|
||||||
* Connect to SPI manager
|
* Connect to SPI manager
|
||||||
*/
|
*/
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
/* internal error */
|
|
||||||
elog(ERROR, "SPI connect failure - returned %d", ret);
|
|
||||||
|
|
||||||
initStringInfo(&buf);
|
initStringInfo(&buf);
|
||||||
|
|
||||||
|
@ -108,9 +108,7 @@ check_primary_key(PG_FUNCTION_ARGS)
|
|||||||
tupdesc = rel->rd_att;
|
tupdesc = rel->rd_att;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
/* internal error */
|
|
||||||
elog(ERROR, "check_primary_key: SPI_connect returned %d", ret);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We use SPI plan preparation feature, so allocate space to place key
|
* We use SPI plan preparation feature, so allocate space to place key
|
||||||
@ -328,9 +326,7 @@ check_foreign_key(PG_FUNCTION_ARGS)
|
|||||||
tupdesc = rel->rd_att;
|
tupdesc = rel->rd_att;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
/* internal error */
|
|
||||||
elog(ERROR, "check_foreign_key: SPI_connect returned %d", ret);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We use SPI plan preparation feature, so allocate space to place key
|
* We use SPI plan preparation feature, so allocate space to place key
|
||||||
|
@ -385,9 +385,7 @@ crosstab(PG_FUNCTION_ARGS)
|
|||||||
per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
|
per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
/* internal error */
|
|
||||||
elog(ERROR, "crosstab: SPI_connect returned %d", ret);
|
|
||||||
|
|
||||||
/* Retrieve the desired rows */
|
/* Retrieve the desired rows */
|
||||||
ret = SPI_execute(sql, true, 0);
|
ret = SPI_execute(sql, true, 0);
|
||||||
@ -724,9 +722,7 @@ load_categories_hash(char *cats_sql, MemoryContext per_query_ctx)
|
|||||||
HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
|
HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
/* internal error */
|
|
||||||
elog(ERROR, "load_categories_hash: SPI_connect returned %d", ret);
|
|
||||||
|
|
||||||
/* Retrieve the category name rows */
|
/* Retrieve the category name rows */
|
||||||
ret = SPI_execute(cats_sql, true, 0);
|
ret = SPI_execute(cats_sql, true, 0);
|
||||||
@ -806,9 +802,7 @@ get_crosstab_tuplestore(char *sql,
|
|||||||
tupstore = tuplestore_begin_heap(randomAccess, false, work_mem);
|
tupstore = tuplestore_begin_heap(randomAccess, false, work_mem);
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
/* internal error */
|
|
||||||
elog(ERROR, "get_crosstab_tuplestore: SPI_connect returned %d", ret);
|
|
||||||
|
|
||||||
/* Now retrieve the crosstab source rows */
|
/* Now retrieve the crosstab source rows */
|
||||||
ret = SPI_execute(sql, true, 0);
|
ret = SPI_execute(sql, true, 0);
|
||||||
@ -1151,15 +1145,11 @@ connectby(char *relname,
|
|||||||
AttInMetadata *attinmeta)
|
AttInMetadata *attinmeta)
|
||||||
{
|
{
|
||||||
Tuplestorestate *tupstore = NULL;
|
Tuplestorestate *tupstore = NULL;
|
||||||
int ret;
|
|
||||||
MemoryContext oldcontext;
|
MemoryContext oldcontext;
|
||||||
|
|
||||||
int serial = 1;
|
int serial = 1;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
/* internal error */
|
|
||||||
elog(ERROR, "connectby: SPI_connect returned %d", ret);
|
|
||||||
|
|
||||||
/* switch to longer term context to create the tuple store */
|
/* switch to longer term context to create the tuple store */
|
||||||
oldcontext = MemoryContextSwitchTo(per_query_ctx);
|
oldcontext = MemoryContextSwitchTo(per_query_ctx);
|
||||||
|
@ -560,8 +560,7 @@ xpath_table(PG_FUNCTION_ARGS)
|
|||||||
relname,
|
relname,
|
||||||
condition);
|
condition);
|
||||||
|
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
elog(ERROR, "xpath_table: SPI_connect returned %d", ret);
|
|
||||||
|
|
||||||
if ((ret = SPI_exec(query_buf.data, 0)) != SPI_OK_SELECT)
|
if ((ret = SPI_exec(query_buf.data, 0)) != SPI_OK_SELECT)
|
||||||
elog(ERROR, "xpath_table: SPI execution failed for query %s",
|
elog(ERROR, "xpath_table: SPI execution failed for query %s",
|
||||||
|
@ -126,16 +126,16 @@ int SPI_connect_ext(int <parameter>options</parameter>)
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><symbol>SPI_ERROR_CONNECT</symbol></term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
on error
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The fact that these functions return <type>int</type>
|
||||||
|
not <type>void</type> is historical. All failure cases are reported
|
||||||
|
via <function>ereport</function> or <function>elog</function>.
|
||||||
|
(In versions before <productname>PostgreSQL</productname> v10,
|
||||||
|
some but not all failures would be reported with a result value
|
||||||
|
of <symbol>SPI_ERROR_CONNECT</symbol>.)
|
||||||
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
</refentry>
|
</refentry>
|
||||||
|
|
||||||
|
@ -915,8 +915,7 @@ trigf(PG_FUNCTION_ARGS)
|
|||||||
tupdesc = trigdata->tg_relation->rd_att;
|
tupdesc = trigdata->tg_relation->rd_att;
|
||||||
|
|
||||||
/* connect to SPI manager */
|
/* connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
elog(ERROR, "trigf (fired %s): SPI_connect returned %d", when, ret);
|
|
||||||
|
|
||||||
/* get number of rows in table */
|
/* get number of rows in table */
|
||||||
ret = SPI_exec("SELECT count(*) FROM ttest", 0);
|
ret = SPI_exec("SELECT count(*) FROM ttest", 0);
|
||||||
|
@ -639,8 +639,7 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner,
|
|||||||
relnatts = RelationGetNumberOfAttributes(matviewRel);
|
relnatts = RelationGetNumberOfAttributes(matviewRel);
|
||||||
|
|
||||||
/* Open SPI context. */
|
/* Open SPI context. */
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/* Analyze the temp table with the new contents. */
|
/* Analyze the temp table with the new contents. */
|
||||||
appendStringInfo(&querybuf, "ANALYZE %s", tempname);
|
appendStringInfo(&querybuf, "ANALYZE %s", tempname);
|
||||||
|
@ -340,8 +340,7 @@ RI_FKey_check(TriggerData *trigdata)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/* Fetch or prepare a saved plan for the real check */
|
/* Fetch or prepare a saved plan for the real check */
|
||||||
ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK);
|
ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CHECK_LOOKUPPK);
|
||||||
@ -469,8 +468,7 @@ ri_Check_Pk_Match(Relation pk_rel, Relation fk_rel,
|
|||||||
/* Only called for non-null rows */
|
/* Only called for non-null rows */
|
||||||
Assert(ri_NullCheck(RelationGetDescr(pk_rel), oldslot, riinfo, true) == RI_KEYS_NONE_NULL);
|
Assert(ri_NullCheck(RelationGetDescr(pk_rel), oldslot, riinfo, true) == RI_KEYS_NONE_NULL);
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fetch or prepare a saved plan for checking PK table with values coming
|
* Fetch or prepare a saved plan for checking PK table with values coming
|
||||||
@ -656,8 +654,7 @@ ri_restrict(TriggerData *trigdata, bool is_no_action)
|
|||||||
return PointerGetDatum(NULL);
|
return PointerGetDatum(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fetch or prepare a saved plan for the restrict lookup (it's the same
|
* Fetch or prepare a saved plan for the restrict lookup (it's the same
|
||||||
@ -766,8 +763,7 @@ RI_FKey_cascade_del(PG_FUNCTION_ARGS)
|
|||||||
pk_rel = trigdata->tg_relation;
|
pk_rel = trigdata->tg_relation;
|
||||||
oldslot = trigdata->tg_trigslot;
|
oldslot = trigdata->tg_trigslot;
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/* Fetch or prepare a saved plan for the cascaded delete */
|
/* Fetch or prepare a saved plan for the cascaded delete */
|
||||||
ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CASCADE_ONDELETE);
|
ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CASCADE_ONDELETE);
|
||||||
@ -875,8 +871,7 @@ RI_FKey_cascade_upd(PG_FUNCTION_ARGS)
|
|||||||
newslot = trigdata->tg_newslot;
|
newslot = trigdata->tg_newslot;
|
||||||
oldslot = trigdata->tg_trigslot;
|
oldslot = trigdata->tg_trigslot;
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/* Fetch or prepare a saved plan for the cascaded update */
|
/* Fetch or prepare a saved plan for the cascaded update */
|
||||||
ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CASCADE_ONUPDATE);
|
ri_BuildQueryKey(&qkey, riinfo, RI_PLAN_CASCADE_ONUPDATE);
|
||||||
@ -1051,8 +1046,7 @@ ri_set(TriggerData *trigdata, bool is_set_null, int tgkind)
|
|||||||
pk_rel = trigdata->tg_relation;
|
pk_rel = trigdata->tg_relation;
|
||||||
oldslot = trigdata->tg_trigslot;
|
oldslot = trigdata->tg_trigslot;
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fetch or prepare a saved plan for the trigger.
|
* Fetch or prepare a saved plan for the trigger.
|
||||||
@ -1547,8 +1541,7 @@ RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
|
|||||||
PGC_USERSET, PGC_S_SESSION,
|
PGC_USERSET, PGC_S_SESSION,
|
||||||
GUC_ACTION_SAVE, true, 0, false);
|
GUC_ACTION_SAVE, true, 0, false);
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generate the plan. We don't need to cache it, and there are no
|
* Generate the plan. We don't need to cache it, and there are no
|
||||||
@ -1787,8 +1780,7 @@ RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
|
|||||||
PGC_USERSET, PGC_S_SESSION,
|
PGC_USERSET, PGC_S_SESSION,
|
||||||
GUC_ACTION_SAVE, true, 0, false);
|
GUC_ACTION_SAVE, true, 0, false);
|
||||||
|
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generate the plan. We don't need to cache it, and there are no
|
* Generate the plan. We don't need to cache it, and there are no
|
||||||
|
@ -589,8 +589,7 @@ pg_get_ruledef_worker(Oid ruleoid, int prettyFlags)
|
|||||||
/*
|
/*
|
||||||
* Connect to SPI manager
|
* Connect to SPI manager
|
||||||
*/
|
*/
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On the first call prepare the plan to lookup pg_rewrite. We read
|
* On the first call prepare the plan to lookup pg_rewrite. We read
|
||||||
@ -782,8 +781,7 @@ pg_get_viewdef_worker(Oid viewoid, int prettyFlags, int wrapColumn)
|
|||||||
/*
|
/*
|
||||||
* Connect to SPI manager
|
* Connect to SPI manager
|
||||||
*/
|
*/
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On the first call prepare the plan to lookup pg_rewrite. We read
|
* On the first call prepare the plan to lookup pg_rewrite. We read
|
||||||
|
@ -1947,8 +1947,7 @@ plperl_inline_handler(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
current_call_data = &this_call_data;
|
current_call_data = &this_call_data;
|
||||||
|
|
||||||
if (SPI_connect_ext(codeblock->atomic ? 0 : SPI_OPT_NONATOMIC) != SPI_OK_CONNECT)
|
SPI_connect_ext(codeblock->atomic ? 0 : SPI_OPT_NONATOMIC);
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
select_perl_context(desc.lanpltrusted);
|
select_perl_context(desc.lanpltrusted);
|
||||||
|
|
||||||
@ -2412,8 +2411,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
|
|||||||
IsA(fcinfo->context, CallContext) &&
|
IsA(fcinfo->context, CallContext) &&
|
||||||
!castNode(CallContext, fcinfo->context)->atomic;
|
!castNode(CallContext, fcinfo->context)->atomic;
|
||||||
|
|
||||||
if (SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0) != SPI_OK_CONNECT)
|
SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0);
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
prodesc = compile_plperl_function(fcinfo->flinfo->fn_oid, false, false);
|
prodesc = compile_plperl_function(fcinfo->flinfo->fn_oid, false, false);
|
||||||
current_call_data->prodesc = prodesc;
|
current_call_data->prodesc = prodesc;
|
||||||
@ -2530,8 +2528,7 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
|
|||||||
int rc PG_USED_FOR_ASSERTS_ONLY;
|
int rc PG_USED_FOR_ASSERTS_ONLY;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
/* Make transition tables visible to this SPI connection */
|
/* Make transition tables visible to this SPI connection */
|
||||||
tdata = (TriggerData *) fcinfo->context;
|
tdata = (TriggerData *) fcinfo->context;
|
||||||
@ -2638,8 +2635,7 @@ plperl_event_trigger_handler(PG_FUNCTION_ARGS)
|
|||||||
ErrorContextCallback pl_error_context;
|
ErrorContextCallback pl_error_context;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
/* Find or compile the function */
|
/* Find or compile the function */
|
||||||
prodesc = compile_plperl_function(fcinfo->flinfo->fn_oid, false, true);
|
prodesc = compile_plperl_function(fcinfo->flinfo->fn_oid, false, true);
|
||||||
|
@ -235,8 +235,7 @@ plpgsql_call_handler(PG_FUNCTION_ARGS)
|
|||||||
/*
|
/*
|
||||||
* Connect to SPI manager
|
* Connect to SPI manager
|
||||||
*/
|
*/
|
||||||
if ((rc = SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0)) != SPI_OK_CONNECT)
|
SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0);
|
||||||
elog(ERROR, "SPI_connect failed: %s", SPI_result_code_string(rc));
|
|
||||||
|
|
||||||
/* Find or compile the function */
|
/* Find or compile the function */
|
||||||
func = plpgsql_compile(fcinfo, false);
|
func = plpgsql_compile(fcinfo, false);
|
||||||
@ -326,8 +325,7 @@ plpgsql_inline_handler(PG_FUNCTION_ARGS)
|
|||||||
/*
|
/*
|
||||||
* Connect to SPI manager
|
* Connect to SPI manager
|
||||||
*/
|
*/
|
||||||
if ((rc = SPI_connect_ext(codeblock->atomic ? 0 : SPI_OPT_NONATOMIC)) != SPI_OK_CONNECT)
|
SPI_connect_ext(codeblock->atomic ? 0 : SPI_OPT_NONATOMIC);
|
||||||
elog(ERROR, "SPI_connect failed: %s", SPI_result_code_string(rc));
|
|
||||||
|
|
||||||
/* Compile the anonymous code block */
|
/* Compile the anonymous code block */
|
||||||
func = plpgsql_compile_inline(codeblock->source_text);
|
func = plpgsql_compile_inline(codeblock->source_text);
|
||||||
@ -510,8 +508,7 @@ plpgsql_validator(PG_FUNCTION_ARGS)
|
|||||||
/*
|
/*
|
||||||
* Connect to SPI manager (is this needed for compilation?)
|
* Connect to SPI manager (is this needed for compilation?)
|
||||||
*/
|
*/
|
||||||
if ((rc = SPI_connect()) != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed: %s", SPI_result_code_string(rc));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up a fake fcinfo with just enough info to satisfy
|
* Set up a fake fcinfo with just enough info to satisfy
|
||||||
|
@ -202,8 +202,7 @@ plpython3_call_handler(PG_FUNCTION_ARGS)
|
|||||||
!castNode(CallContext, fcinfo->context)->atomic;
|
!castNode(CallContext, fcinfo->context)->atomic;
|
||||||
|
|
||||||
/* Note: SPI_finish() happens in plpy_exec.c, which is dubious design */
|
/* Note: SPI_finish() happens in plpy_exec.c, which is dubious design */
|
||||||
if (SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0) != SPI_OK_CONNECT)
|
SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0);
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Push execution context onto stack. It is important that this get
|
* Push execution context onto stack. It is important that this get
|
||||||
@ -272,8 +271,7 @@ plpython3_inline_handler(PG_FUNCTION_ARGS)
|
|||||||
PLy_initialize();
|
PLy_initialize();
|
||||||
|
|
||||||
/* Note: SPI_finish() happens in plpy_exec.c, which is dubious design */
|
/* Note: SPI_finish() happens in plpy_exec.c, which is dubious design */
|
||||||
if (SPI_connect_ext(codeblock->atomic ? 0 : SPI_OPT_NONATOMIC) != SPI_OK_CONNECT)
|
SPI_connect_ext(codeblock->atomic ? 0 : SPI_OPT_NONATOMIC);
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
MemSet(fcinfo, 0, SizeForFunctionCallInfo(0));
|
MemSet(fcinfo, 0, SizeForFunctionCallInfo(0));
|
||||||
MemSet(&flinfo, 0, sizeof(flinfo));
|
MemSet(&flinfo, 0, sizeof(flinfo));
|
||||||
|
@ -808,8 +808,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state,
|
|||||||
!castNode(CallContext, fcinfo->context)->atomic;
|
!castNode(CallContext, fcinfo->context)->atomic;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if (SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0) != SPI_OK_CONNECT)
|
SPI_connect_ext(nonatomic ? SPI_OPT_NONATOMIC : 0);
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
/* Find or compile the function */
|
/* Find or compile the function */
|
||||||
prodesc = compile_pltcl_function(fcinfo->flinfo->fn_oid, InvalidOid,
|
prodesc = compile_pltcl_function(fcinfo->flinfo->fn_oid, InvalidOid,
|
||||||
@ -1072,8 +1071,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state,
|
|||||||
call_state->trigdata = trigdata;
|
call_state->trigdata = trigdata;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
/* Make transition tables visible to this SPI connection */
|
/* Make transition tables visible to this SPI connection */
|
||||||
rc = SPI_register_trigger_data(trigdata);
|
rc = SPI_register_trigger_data(trigdata);
|
||||||
@ -1321,8 +1319,7 @@ pltcl_event_trigger_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state,
|
|||||||
int tcl_rc;
|
int tcl_rc;
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
/* Find or compile the function */
|
/* Find or compile the function */
|
||||||
prodesc = compile_pltcl_function(fcinfo->flinfo->fn_oid,
|
prodesc = compile_pltcl_function(fcinfo->flinfo->fn_oid,
|
||||||
|
@ -220,8 +220,7 @@ plsample_trigger_handler(PG_FUNCTION_ARGS)
|
|||||||
elog(ERROR, "not called by trigger manager");
|
elog(ERROR, "not called by trigger manager");
|
||||||
|
|
||||||
/* Connect to the SPI manager */
|
/* Connect to the SPI manager */
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "could not connect to SPI manager");
|
|
||||||
|
|
||||||
rc = SPI_register_trigger_data(trigdata);
|
rc = SPI_register_trigger_data(trigdata);
|
||||||
Assert(rc >= 0);
|
Assert(rc >= 0);
|
||||||
|
@ -54,8 +54,7 @@ test_predtest(PG_FUNCTION_ARGS)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* We use SPI to parse, plan, and execute the test query */
|
/* We use SPI to parse, plan, and execute the test query */
|
||||||
if (SPI_connect() != SPI_OK_CONNECT)
|
SPI_connect();
|
||||||
elog(ERROR, "SPI_connect failed");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First, plan and execute the query, and inspect the results. To the
|
* First, plan and execute the query, and inspect the results. To the
|
||||||
|
@ -379,8 +379,7 @@ ttdummy(PG_FUNCTION_ARGS)
|
|||||||
newoff = Int32GetDatum((int32) DatumGetInt64(newoff));
|
newoff = Int32GetDatum((int32) DatumGetInt64(newoff));
|
||||||
|
|
||||||
/* Connect to SPI manager */
|
/* Connect to SPI manager */
|
||||||
if ((ret = SPI_connect()) < 0)
|
SPI_connect();
|
||||||
elog(ERROR, "ttdummy (%s): SPI_connect returned %d", relname, ret);
|
|
||||||
|
|
||||||
/* Fetch tuple values and nulls */
|
/* Fetch tuple values and nulls */
|
||||||
cvals = (Datum *) palloc(natts * sizeof(Datum));
|
cvals = (Datum *) palloc(natts * sizeof(Datum));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user