1
1
/**********************************************************************
2
2
* plpython.c - python as a procedural language for PostgreSQL
3
3
*
4
- * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.126 2009/08/25 08:14:42 petere Exp $
4
+ * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.127 2009/08/25 12:44:59 petere Exp $
5
5
*
6
6
*********************************************************************
7
7
*/
@@ -339,6 +339,20 @@ plpython_error_callback(void *arg)
339
339
errcontext ("PL/Python function \"%s\"" , PLy_procedure_name (PLy_curr_procedure ));
340
340
}
341
341
342
+ static void
343
+ plpython_trigger_error_callback (void * arg )
344
+ {
345
+ if (PLy_curr_procedure )
346
+ errcontext ("while modifying trigger row" );
347
+ }
348
+
349
+ static void
350
+ plpython_return_error_callback (void * arg )
351
+ {
352
+ if (PLy_curr_procedure )
353
+ errcontext ("while creating return value" );
354
+ }
355
+
342
356
Datum
343
357
plpython_call_handler (PG_FUNCTION_ARGS )
344
358
{
@@ -506,6 +520,11 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
506
520
Datum * volatile modvalues ;
507
521
char * volatile modnulls ;
508
522
TupleDesc tupdesc ;
523
+ ErrorContextCallback plerrcontext ;
524
+
525
+ plerrcontext .callback = plpython_trigger_error_callback ;
526
+ plerrcontext .previous = error_context_stack ;
527
+ error_context_stack = & plerrcontext ;
509
528
510
529
plntup = plkeys = platt = plval = plstr = NULL ;
511
530
modattrs = NULL ;
@@ -563,7 +582,7 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
563
582
{
564
583
plstr = PyObject_Str (plval );
565
584
if (!plstr )
566
- PLy_elog (ERROR , "could not compute string representation of Python object, while modifying trigger row " );
585
+ PLy_elog (ERROR , "could not create string representation of Python object" );
567
586
src = PyString_AsString (plstr );
568
587
569
588
modvalues [i ] =
@@ -620,6 +639,8 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
620
639
pfree (modvalues );
621
640
pfree (modnulls );
622
641
642
+ error_context_stack = plerrcontext .previous ;
643
+
623
644
return rtup ;
624
645
}
625
646
@@ -811,6 +832,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
811
832
PyObject * volatile plrv = NULL ;
812
833
PyObject * volatile plrv_so = NULL ;
813
834
char * plrv_sc ;
835
+ ErrorContextCallback plerrcontext ;
814
836
815
837
PG_TRY ();
816
838
{
@@ -901,6 +923,10 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
901
923
}
902
924
}
903
925
926
+ plerrcontext .callback = plpython_return_error_callback ;
927
+ plerrcontext .previous = error_context_stack ;
928
+ error_context_stack = & plerrcontext ;
929
+
904
930
/*
905
931
* If the function is declared to return void, the Python return value
906
932
* must be None. For void-returning functions, we also treat a None
@@ -959,7 +985,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
959
985
fcinfo -> isnull = false;
960
986
plrv_so = PyObject_Str (plrv );
961
987
if (!plrv_so )
962
- PLy_elog (ERROR , "could not create string representation of Python object, while creating return value " );
988
+ PLy_elog (ERROR , "could not create string representation of Python object" );
963
989
plrv_sc = PyString_AsString (plrv_so );
964
990
rv = InputFunctionCall (& proc -> result .out .d .typfunc ,
965
991
plrv_sc ,
@@ -977,6 +1003,8 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
977
1003
}
978
1004
PG_END_TRY ();
979
1005
1006
+ error_context_stack = plerrcontext .previous ;
1007
+
980
1008
Py_XDECREF (plargs );
981
1009
Py_DECREF (plrv );
982
1010
Py_XDECREF (plrv_so );
0 commit comments