11/**********************************************************************
22 * plperl.c - perl as a procedural language for PostgreSQL
33 *
4- * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.150 2009/06/11 14:49:14 momjian Exp $
4+ * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.151 2009/09/16 06:06:12 petere Exp $
55 *
66 **********************************************************************/
77
@@ -162,6 +162,8 @@ static SV **hv_store_string(HV *hv, const char *key, SV *val);
162162static SV * * hv_fetch_string (HV * hv , const char * key );
163163static SV * plperl_create_sub (char * proname , char * s , bool trusted );
164164static SV * plperl_call_perl_func (plperl_proc_desc * desc , FunctionCallInfo fcinfo );
165+ static void plperl_compile_callback (void * arg );
166+ static void plperl_exec_callback (void * arg );
165167
166168/*
167169 * This routine is a crock, and so is everyplace that calls it. The problem
@@ -1019,9 +1021,7 @@ plperl_create_sub(char *proname, char *s, bool trusted)
10191021 LEAVE ;
10201022 ereport (ERROR ,
10211023 (errcode (ERRCODE_SYNTAX_ERROR ),
1022- errmsg ("creation of Perl function \"%s\" failed: %s" ,
1023- proname ,
1024- strip_trailing_ws (SvPV (ERRSV , PL_na )))));
1024+ errmsg ("%s" , strip_trailing_ws (SvPV (ERRSV , PL_na )))));
10251025 }
10261026
10271027 /*
@@ -1149,9 +1149,7 @@ plperl_call_perl_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo)
11491149 LEAVE ;
11501150 /* XXX need to find a way to assign an errcode here */
11511151 ereport (ERROR ,
1152- (errmsg ("error from Perl function \"%s\": %s" ,
1153- desc -> proname ,
1154- strip_trailing_ws (SvPV (ERRSV , PL_na )))));
1152+ (errmsg ("%s" , strip_trailing_ws (SvPV (ERRSV , PL_na )))));
11551153 }
11561154
11571155 retval = newSVsv (POPs );
@@ -1207,9 +1205,7 @@ plperl_call_perl_trigger_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo,
12071205 LEAVE ;
12081206 /* XXX need to find a way to assign an errcode here */
12091207 ereport (ERROR ,
1210- (errmsg ("error from Perl function \"%s\": %s" ,
1211- desc -> proname ,
1212- strip_trailing_ws (SvPV (ERRSV , PL_na )))));
1208+ (errmsg ("%s" , strip_trailing_ws (SvPV (ERRSV , PL_na )))));
12131209 }
12141210
12151211 retval = newSVsv (POPs );
@@ -1231,6 +1227,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
12311227 ReturnSetInfo * rsi ;
12321228 SV * array_ret = NULL ;
12331229 bool oldcontext = trusted_context ;
1230+ ErrorContextCallback pl_error_context ;
12341231
12351232 /*
12361233 * Create the call_data beforing connecting to SPI, so that it is not
@@ -1245,6 +1242,12 @@ plperl_func_handler(PG_FUNCTION_ARGS)
12451242 prodesc = compile_plperl_function (fcinfo -> flinfo -> fn_oid , false);
12461243 current_call_data -> prodesc = prodesc ;
12471244
1245+ /* Set a callback for error reporting */
1246+ pl_error_context .callback = plperl_exec_callback ;
1247+ pl_error_context .previous = error_context_stack ;
1248+ pl_error_context .arg = prodesc -> proname ;
1249+ error_context_stack = & pl_error_context ;
1250+
12481251 rsi = (ReturnSetInfo * ) fcinfo -> resultinfo ;
12491252
12501253 if (prodesc -> fn_retisset )
@@ -1367,6 +1370,9 @@ plperl_func_handler(PG_FUNCTION_ARGS)
13671370 prodesc -> result_typioparam , -1 );
13681371 }
13691372
1373+ /* Restore the previous error callback */
1374+ error_context_stack = pl_error_context .previous ;
1375+
13701376 if (array_ret == NULL )
13711377 SvREFCNT_dec (perlret );
13721378
@@ -1386,6 +1392,7 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
13861392 SV * svTD ;
13871393 HV * hvTD ;
13881394 bool oldcontext = trusted_context ;
1395+ ErrorContextCallback pl_error_context ;
13891396
13901397 /*
13911398 * Create the call_data beforing connecting to SPI, so that it is not
@@ -1402,6 +1409,12 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
14021409 prodesc = compile_plperl_function (fcinfo -> flinfo -> fn_oid , true);
14031410 current_call_data -> prodesc = prodesc ;
14041411
1412+ /* Set a callback for error reporting */
1413+ pl_error_context .callback = plperl_exec_callback ;
1414+ pl_error_context .previous = error_context_stack ;
1415+ pl_error_context .arg = prodesc -> proname ;
1416+ error_context_stack = & pl_error_context ;
1417+
14051418 check_interp (prodesc -> lanpltrusted );
14061419
14071420 svTD = plperl_trigger_build_args (fcinfo );
@@ -1471,6 +1484,9 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
14711484 retval = PointerGetDatum (trv );
14721485 }
14731486
1487+ /* Restore the previous error callback */
1488+ error_context_stack = pl_error_context .previous ;
1489+
14741490 SvREFCNT_dec (svTD );
14751491 if (perlret )
14761492 SvREFCNT_dec (perlret );
@@ -1492,6 +1508,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
14921508 plperl_proc_entry * hash_entry ;
14931509 bool found ;
14941510 bool oldcontext = trusted_context ;
1511+ ErrorContextCallback plperl_error_context ;
14951512
14961513 /* We'll need the pg_proc tuple in any case... */
14971514 procTup = SearchSysCache (PROCOID ,
@@ -1501,6 +1518,12 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
15011518 elog (ERROR , "cache lookup failed for function %u" , fn_oid );
15021519 procStruct = (Form_pg_proc ) GETSTRUCT (procTup );
15031520
1521+ /* Set a callback for reporting compilation errors */
1522+ plperl_error_context .callback = plperl_compile_callback ;
1523+ plperl_error_context .previous = error_context_stack ;
1524+ plperl_error_context .arg = NameStr (procStruct -> proname );
1525+ error_context_stack = & plperl_error_context ;
1526+
15041527 /************************************************************
15051528 * Build our internal proc name from the function's Oid
15061529 ************************************************************/
@@ -1731,6 +1754,9 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
17311754 hash_entry -> proc_data = prodesc ;
17321755 }
17331756
1757+ /* restore previous error callback */
1758+ error_context_stack = plperl_error_context .previous ;
1759+
17341760 ReleaseSysCache (procTup );
17351761
17361762 return prodesc ;
@@ -2683,3 +2709,25 @@ hv_fetch_string(HV *hv, const char *key)
26832709#endif
26842710 return hv_fetch (hv , key , klen , 0 );
26852711}
2712+
2713+ /*
2714+ * Provide function name for PL/Perl execution errors
2715+ */
2716+ static void
2717+ plperl_exec_callback (void * arg )
2718+ {
2719+ char * procname = (char * ) arg ;
2720+ if (procname )
2721+ errcontext ("PL/Perl function \"%s\"" , procname );
2722+ }
2723+
2724+ /*
2725+ * Provide function name for PL/Perl compilation errors
2726+ */
2727+ static void
2728+ plperl_compile_callback (void * arg )
2729+ {
2730+ char * procname = (char * ) arg ;
2731+ if (procname )
2732+ errcontext ("compilation of PL/Perl function \"%s\"" , procname );
2733+ }
0 commit comments