diff --git a/src/pl/plperl/expected/plperl_do.out b/src/pl/plperl/expected/plperl_do.out index a955581..f5d56ed 100644 --- a/src/pl/plperl/expected/plperl_do.out +++ b/src/pl/plperl/expected/plperl_do.out @@ -3,5 +3,7 @@ DO $$ elog(NOTICE, $a); $$ LANGUAGE plperl; NOTICE: This is a test +CONTEXT: PL/Perl anonymous code block DO $$ use Config; $$ LANGUAGE plperl; ERROR: 'require' trapped by operation mask at line 1. +CONTEXT: PL/Perl anonymous code block diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 9bb588b..7f5d98e 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -165,6 +165,7 @@ static SV *plperl_create_sub(char *proname, char *s, bool trusted); static SV *plperl_call_perl_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo); static void plperl_compile_callback(void *arg); static void plperl_exec_callback(void *arg); +static void plperl_inline_callback(void *arg); /* * This routine is a crock, and so is everyplace that calls it. The problem @@ -912,6 +913,13 @@ plperl_inline_handler(PG_FUNCTION_ARGS) plperl_proc_desc desc; plperl_call_data *save_call_data = current_call_data; bool oldcontext = trusted_context; + ErrorContextCallback pl_error_context; + + /* Set a callback for error reporting */ + pl_error_context.callback = plperl_inline_callback; + pl_error_context.previous = error_context_stack; + pl_error_context.arg = (Datum) 0; + error_context_stack = &pl_error_context; if (SPI_connect() != SPI_OK_CONNECT) elog(ERROR, "could not connect to SPI manager"); @@ -959,6 +967,7 @@ plperl_inline_handler(PG_FUNCTION_ARGS) if (SPI_finish() != SPI_OK_FINISH) elog(ERROR, "SPI_finish() failed"); + error_context_stack = pl_error_context.previous; current_call_data = save_call_data; restore_context(oldcontext); @@ -2806,3 +2815,12 @@ plperl_compile_callback(void *arg) if (procname) errcontext("compilation of PL/Perl function \"%s\"", procname); } + +/* + * Error context for the inline handler + */ +static void +plperl_inline_callback(void *arg) +{ + errcontext("PL/Perl anonymous code block"); +}