diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c index 0dc0e0b37e..1d542fd661 100644 --- a/src/pl/plpgsql/src/pl_comp.c +++ b/src/pl/plpgsql/src/pl_comp.c @@ -285,6 +285,7 @@ do_compile(FunctionCallInfo fcinfo, int *in_arg_varnos = NULL; PLpgSQL_variable **out_arg_variables; MemoryContext func_cxt; + PLpgSQL_trigtype fn_is_trigger; /* * Setup the scanner input and error info. We assume that this function @@ -352,11 +353,12 @@ do_compile(FunctionCallInfo fcinfo, function->resolve_option = plpgsql_variable_conflict; if (is_dml_trigger) - function->fn_is_trigger = PLPGSQL_DML_TRIGGER; + fn_is_trigger = PLPGSQL_DML_TRIGGER; else if (is_event_trigger) - function->fn_is_trigger = PLPGSQL_EVENT_TRIGGER; + fn_is_trigger = PLPGSQL_EVENT_TRIGGER; else - function->fn_is_trigger = PLPGSQL_NOT_TRIGGER; + fn_is_trigger = PLPGSQL_NOT_TRIGGER; + function->fn_is_trigger = fn_is_trigger; /* * Initialize the compiler, particularly the namespace stack. The @@ -374,6 +376,7 @@ do_compile(FunctionCallInfo fcinfo, sizeof(PLpgSQL_datum *) * datums_alloc); datums_last = 0; + Assert(fn_is_trigger == function->fn_is_trigger); switch (function->fn_is_trigger) { case PLPGSQL_NOT_TRIGGER: @@ -537,9 +540,13 @@ do_compile(FunctionCallInfo fcinfo, rettypeid == RECORDOID) /* okay */ ; else if (rettypeid == TRIGGEROID || rettypeid == EVTTRIGGEROID) + { ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("trigger functions can only be called as triggers"))); + errmsg("trigger functions can only be called as triggers"), + errhint("CALLED_AS_TRIGGER=%d CALLED_AS_EVENT_TRIGGER=%d", + CALLED_AS_TRIGGER(fcinfo), CALLED_AS_EVENT_TRIGGER(fcinfo)))); + } else ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),