11/**********************************************************************
22 * plpython.c - python as a procedural language for PostgreSQL
33 *
4- *$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.126 2009/08/2508:14:42 petere Exp $
4+ *$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.127 2009/08/2512:44:59 petere Exp $
55 *
66 *********************************************************************
77 */
@@ -339,6 +339,20 @@ plpython_error_callback(void *arg)
339339errcontext ("PL/Python function \"%s\"" ,PLy_procedure_name (PLy_curr_procedure ));
340340}
341341
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+
342356Datum
343357plpython_call_handler (PG_FUNCTION_ARGS )
344358{
@@ -506,6 +520,11 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
506520Datum * volatile modvalues ;
507521char * volatile modnulls ;
508522TupleDesc tupdesc ;
523+ ErrorContextCallback plerrcontext ;
524+
525+ plerrcontext .callback = plpython_trigger_error_callback ;
526+ plerrcontext .previous = error_context_stack ;
527+ error_context_stack = & plerrcontext ;
509528
510529plntup = plkeys = platt = plval = plstr = NULL ;
511530modattrs = NULL ;
@@ -563,7 +582,7 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
563582{
564583plstr = PyObject_Str (plval );
565584if (!plstr )
566- PLy_elog (ERROR ,"could notcompute string representation of Python object, while modifying trigger row " );
585+ PLy_elog (ERROR ,"could notcreate string representation of Python object" );
567586src = PyString_AsString (plstr );
568587
569588modvalues [i ]=
@@ -620,6 +639,8 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
620639pfree (modvalues );
621640pfree (modnulls );
622641
642+ error_context_stack = plerrcontext .previous ;
643+
623644return rtup ;
624645}
625646
@@ -811,6 +832,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
811832PyObject * volatile plrv = NULL ;
812833PyObject * volatile plrv_so = NULL ;
813834char * plrv_sc ;
835+ ErrorContextCallback plerrcontext ;
814836
815837PG_TRY ();
816838{
@@ -901,6 +923,10 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
901923}
902924}
903925
926+ plerrcontext .callback = plpython_return_error_callback ;
927+ plerrcontext .previous = error_context_stack ;
928+ error_context_stack = & plerrcontext ;
929+
904930/*
905931 * If the function is declared to return void, the Python return value
906932 * must be None. For void-returning functions, we also treat a None
@@ -959,7 +985,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
959985fcinfo -> isnull = false;
960986plrv_so = PyObject_Str (plrv );
961987if (!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" );
963989plrv_sc = PyString_AsString (plrv_so );
964990rv = InputFunctionCall (& proc -> result .out .d .typfunc ,
965991plrv_sc ,
@@ -977,6 +1003,8 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
9771003}
9781004PG_END_TRY ();
9791005
1006+ error_context_stack = plerrcontext .previous ;
1007+
9801008Py_XDECREF (plargs );
9811009Py_DECREF (plrv );
9821010Py_XDECREF (plrv_so );