inline_callback.diff
application/octet-stream
Filename: inline_callback.diff
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/pl/plperl/expected/plperl_do.out | 2 | 0 |
| src/pl/plperl/plperl.c | 18 | 0 |
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");
+}