89 char *tok = (
char *)
lfirst(l);
120 *myextra = extrachecks;
148 static bool inited =
false;
156 gettext_noop(
"Sets handling of conflicts between PL/pgSQL variable names and table column names."),
165 gettext_noop(
"Print information about parameters in the DETAIL part of the error messages generated on INTO ... STRICT failures."),
173 gettext_noop(
"Perform checks given in ASSERT statements."),
181 gettext_noop(
"List of programming constructs that should produce a warning."),
191 gettext_noop(
"List of programming constructs that should produce an error."),
231 nonatomic = fcinfo->context &&
288 if (procedure_resowner)
320 EState *simple_eval_estate;
342 MemSet(&flinfo, 0,
sizeof(flinfo));
343 fake_fcinfo->flinfo = &flinfo;
360 simple_eval_resowner =
368 simple_eval_resowner,
369 simple_eval_resowner,
450 bool is_dml_trigger =
false;
451 bool is_event_trigger =
false;
460 elog(
ERROR,
"cache lookup failed for function %u", funcoid);
467 if (functyptype == TYPTYPE_PSEUDO)
469 if (proc->prorettype == TRIGGEROID)
470 is_dml_trigger =
true;
471 else if (proc->prorettype == EVENT_TRIGGEROID)
472 is_event_trigger =
true;
473 else if (proc->prorettype != RECORDOID &&
474 proc->prorettype != VOIDOID &&
475 !IsPolymorphicType(proc->prorettype))
477 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
478 errmsg(
"PL/pgSQL functions cannot return type %s",
485 &argtypes, &argnames, &argmodes);
486 for (
i = 0;
i < numargs;
i++)
490 if (argtypes[
i] != RECORDOID &&
491 !IsPolymorphicType(argtypes[
i]))
493 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
494 errmsg(
"PL/pgSQL functions cannot accept type %s",
518 MemSet(&flinfo, 0,
sizeof(flinfo));
519 fake_fcinfo->flinfo = &flinfo;
524 MemSet(&trigdata, 0,
sizeof(trigdata));
525 trigdata.
type = T_TriggerData;
526 fake_fcinfo->context = (
Node *) &trigdata;
528 else if (is_event_trigger)
530 MemSet(&etrigdata, 0,
sizeof(etrigdata));
531 etrigdata.
type = T_EventTriggerData;
532 fake_fcinfo->context = (
Node *) &etrigdata;
#define Assert(condition)
#define MemSet(start, val, len)
void ** find_rendezvous_variable(const char *varName)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define CALLED_AS_EVENT_TRIGGER(fcinfo)
void FreeExecutorState(EState *estate)
EState * CreateExecutorState(void)
bool CheckFunctionValidatorAccess(Oid validatorOid, Oid functionOid)
#define SizeForFunctionCallInfo(nargs)
#define PG_GETARG_DATUM(n)
#define LOCAL_FCINFO(name, nargs)
int get_func_arg_info(HeapTuple procTup, Oid **p_argtypes, char ***p_argnames, char **p_argmodes)
void DefineCustomEnumVariable(const char *name, const char *short_desc, const char *long_desc, int *valueAddr, int bootValue, const struct config_enum_entry *options, GucContext context, int flags, GucEnumCheckHook check_hook, GucEnumAssignHook assign_hook, GucShowHook show_hook)
void DefineCustomStringVariable(const char *name, const char *short_desc, const char *long_desc, char **valueAddr, const char *bootValue, GucContext context, int flags, GucStringCheckHook check_hook, GucStringAssignHook assign_hook, GucShowHook show_hook)
void * guc_malloc(int elevel, size_t size)
void DefineCustomBoolVariable(const char *name, const char *short_desc, const char *long_desc, bool *valueAddr, bool bootValue, GucContext context, int flags, GucBoolCheckHook check_hook, GucBoolAssignHook assign_hook, GucShowHook show_hook)
void MarkGUCPrefixReserved(const char *className)
#define GUC_check_errdetail
bool check_function_bodies
#define HeapTupleIsValid(tuple)
void list_free(List *list)
char get_typtype(Oid typid)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
void pg_bindtextdomain(const char *domain)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
FormData_pg_proc * Form_pg_proc
static rewind_source * source
void plpgsql_HashTableInit(void)
PLpgSQL_function * plpgsql_compile(FunctionCallInfo fcinfo, bool forValidator)
PLpgSQL_function * plpgsql_compile_inline(char *proc_source)
Datum plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo, EState *simple_eval_estate, ResourceOwner simple_eval_resowner, ResourceOwner procedure_resowner, bool atomic)
HeapTuple plpgsql_exec_trigger(PLpgSQL_function *func, TriggerData *trigdata)
void plpgsql_subxact_cb(SubXactEvent event, SubTransactionId mySubid, SubTransactionId parentSubid, void *arg)
void plpgsql_exec_event_trigger(PLpgSQL_function *func, EventTriggerData *trigdata)
void plpgsql_xact_cb(XactEvent event, void *arg)
void plpgsql_free_function_memory(PLpgSQL_function *func)
int plpgsql_variable_conflict
static void plpgsql_extra_errors_assign_hook(const char *newvalue, void *extra)
bool plpgsql_check_asserts
static const struct config_enum_entry variable_conflict_options[]
int plpgsql_extra_warnings
Datum plpgsql_call_handler(PG_FUNCTION_ARGS)
static char * plpgsql_extra_errors_string
Datum plpgsql_inline_handler(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(plpgsql_call_handler)
bool plpgsql_print_strict_params
PLpgSQL_plugin ** plpgsql_plugin_ptr
static void plpgsql_extra_warnings_assign_hook(const char *newvalue, void *extra)
static bool plpgsql_extra_checks_check_hook(char **newvalue, void **extra, GucSource source)
static char * plpgsql_extra_warnings_string
Datum plpgsql_validator(PG_FUNCTION_ARGS)
void ReleaseAllPlanCacheRefsInOwner(ResourceOwner owner)
#define PLPGSQL_XCHECK_SHADOWVAR
#define PLPGSQL_XCHECK_ALL
@ PLPGSQL_RESOLVE_VARIABLE
#define PLPGSQL_XCHECK_NONE
#define PLPGSQL_XCHECK_TOOMANYROWS
#define PLPGSQL_XCHECK_STRICTMULTIASSIGNMENT
int pg_strcasecmp(const char *s1, const char *s2)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)
void ResourceOwnerDelete(ResourceOwner owner)
const char * SPI_result_code_string(int code)
int SPI_connect_ext(int options)
#define SPI_OPT_NONATOMIC
bool requires_procedure_resowner
struct PLpgSQL_execstate * cur_estate
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
#define CALLED_AS_TRIGGER(fcinfo)
bool SplitIdentifierString(char *rawstring, char separator, List **namelist)
SubTransactionId GetCurrentSubTransactionId(void)
void RegisterXactCallback(XactCallback callback, void *arg)
void RegisterSubXactCallback(SubXactCallback callback, void *arg)
@ SUBXACT_EVENT_ABORT_SUB