Consistently use "superuser" instead of "super user"
[pgsql.git] / src / pl / plpython / plpy_exec.c
blobc6f6a6fbccaa61766b517f609fa2854ade7c303a
1 /*
2 * executing Python code
4 * src/pl/plpython/plpy_exec.c
5 */
7 #include "postgres.h"
9 #include "access/htup_details.h"
10 #include "access/xact.h"
11 #include "catalog/pg_type.h"
12 #include "commands/trigger.h"
13 #include "executor/spi.h"
14 #include "funcapi.h"
15 #include "plpy_elog.h"
16 #include "plpy_exec.h"
17 #include "plpy_main.h"
18 #include "plpy_procedure.h"
19 #include "plpy_subxactobject.h"
20 #include "plpython.h"
21 #include "utils/builtins.h"
22 #include "utils/lsyscache.h"
23 #include "utils/rel.h"
24 #include "utils/typcache.h"
26 /* saved state for a set-returning function */
27 typedef struct PLySRFState
29 PyObject *iter; /* Python iterator producing results */
30 PLySavedArgs *savedargs; /* function argument values */
31 MemoryContextCallback callback; /* for releasing refcounts when done */
32 } PLySRFState;
34 static PyObject *PLy_function_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc);
35 static PLySavedArgs *PLy_function_save_args(PLyProcedure *proc);
36 static void PLy_function_restore_args(PLyProcedure *proc, PLySavedArgs *savedargs);
37 static void PLy_function_drop_args(PLySavedArgs *savedargs);
38 static void PLy_global_args_push(PLyProcedure *proc);
39 static void PLy_global_args_pop(PLyProcedure *proc);
40 static void plpython_srf_cleanup_callback(void *arg);
41 static void plpython_return_error_callback(void *arg);
43 static PyObject *PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc,
44 HeapTuple *rv);
45 static HeapTuple PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd,
46 TriggerData *tdata, HeapTuple otup);
47 static void plpython_trigger_error_callback(void *arg);
49 static PyObject *PLy_procedure_call(PLyProcedure *proc, const char *kargs, PyObject *vargs);
50 static void PLy_abort_open_subtransactions(int save_subxact_level);
53 /* function subhandler */
54 Datum
55 PLy_exec_function(FunctionCallInfo fcinfo, PLyProcedure *proc)
57 bool is_setof = proc->is_setof;
58 Datum rv;
59 PyObject *volatile plargs = NULL;
60 PyObject *volatile plrv = NULL;
61 FuncCallContext *volatile funcctx = NULL;
62 PLySRFState *volatile srfstate = NULL;
63 ErrorContextCallback plerrcontext;
66 * If the function is called recursively, we must push outer-level
67 * arguments into the stack. This must be immediately before the PG_TRY
68 * to ensure that the corresponding pop happens.
70 PLy_global_args_push(proc);
72 PG_TRY();
74 if (is_setof)
76 /* First Call setup */
77 if (SRF_IS_FIRSTCALL())
79 funcctx = SRF_FIRSTCALL_INIT();
80 srfstate = (PLySRFState *)
81 MemoryContextAllocZero(funcctx->multi_call_memory_ctx,
82 sizeof(PLySRFState));
83 /* Immediately register cleanup callback */
84 srfstate->callback.func = plpython_srf_cleanup_callback;
85 srfstate->callback.arg = (void *) srfstate;
86 MemoryContextRegisterResetCallback(funcctx->multi_call_memory_ctx,
87 &srfstate->callback);
88 funcctx->user_fctx = (void *) srfstate;
90 /* Every call setup */
91 funcctx = SRF_PERCALL_SETUP();
92 Assert(funcctx != NULL);
93 srfstate = (PLySRFState *) funcctx->user_fctx;
94 Assert(srfstate != NULL);
97 if (srfstate == NULL || srfstate->iter == NULL)
100 * Non-SETOF function or first time for SETOF function: build
101 * args, then actually execute the function.
103 plargs = PLy_function_build_args(fcinfo, proc);
104 plrv = PLy_procedure_call(proc, "args", plargs);
105 Assert(plrv != NULL);
107 else
110 * Second or later call for a SETOF function: restore arguments in
111 * globals dict to what they were when we left off. We must do
112 * this in case multiple evaluations of the same SETOF function
113 * are interleaved. It's a bit annoying, since the iterator may
114 * not look at the arguments at all, but we have no way to know
115 * that. Fortunately this isn't terribly expensive.
117 if (srfstate->savedargs)
118 PLy_function_restore_args(proc, srfstate->savedargs);
119 srfstate->savedargs = NULL; /* deleted by restore_args */
123 * If it returns a set, call the iterator to get the next return item.
124 * We stay in the SPI context while doing this, because PyIter_Next()
125 * calls back into Python code which might contain SPI calls.
127 if (is_setof)
129 if (srfstate->iter == NULL)
131 /* first time -- do checks and setup */
132 ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo;
134 if (!rsi || !IsA(rsi, ReturnSetInfo) ||
135 (rsi->allowedModes & SFRM_ValuePerCall) == 0)
137 ereport(ERROR,
138 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
139 errmsg("unsupported set function return mode"),
140 errdetail("PL/Python set-returning functions only support returning one value per call.")));
142 rsi->returnMode = SFRM_ValuePerCall;
144 /* Make iterator out of returned object */
145 srfstate->iter = PyObject_GetIter(plrv);
147 Py_DECREF(plrv);
148 plrv = NULL;
150 if (srfstate->iter == NULL)
151 ereport(ERROR,
152 (errcode(ERRCODE_DATATYPE_MISMATCH),
153 errmsg("returned object cannot be iterated"),
154 errdetail("PL/Python set-returning functions must return an iterable object.")));
157 /* Fetch next from iterator */
158 plrv = PyIter_Next(srfstate->iter);
159 if (plrv == NULL)
161 /* Iterator is exhausted or error happened */
162 bool has_error = (PyErr_Occurred() != NULL);
164 Py_DECREF(srfstate->iter);
165 srfstate->iter = NULL;
167 if (has_error)
168 PLy_elog(ERROR, "error fetching next item from iterator");
170 /* Pass a null through the data-returning steps below */
171 Py_INCREF(Py_None);
172 plrv = Py_None;
174 else
177 * This won't be last call, so save argument values. We do
178 * this again each time in case the iterator is changing those
179 * values.
181 srfstate->savedargs = PLy_function_save_args(proc);
186 * Disconnect from SPI manager and then create the return values datum
187 * (if the input function does a palloc for it this must not be
188 * allocated in the SPI memory context because SPI_finish would free
189 * it).
191 if (SPI_finish() != SPI_OK_FINISH)
192 elog(ERROR, "SPI_finish failed");
194 plerrcontext.callback = plpython_return_error_callback;
195 plerrcontext.previous = error_context_stack;
196 error_context_stack = &plerrcontext;
199 * For a procedure or function declared to return void, the Python
200 * return value must be None. For void-returning functions, we also
201 * treat a None return value as a special "void datum" rather than
202 * NULL (as is the case for non-void-returning functions).
204 if (proc->result.typoid == VOIDOID)
206 if (plrv != Py_None)
208 if (proc->is_procedure)
209 ereport(ERROR,
210 (errcode(ERRCODE_DATATYPE_MISMATCH),
211 errmsg("PL/Python procedure did not return None")));
212 else
213 ereport(ERROR,
214 (errcode(ERRCODE_DATATYPE_MISMATCH),
215 errmsg("PL/Python function with return type \"void\" did not return None")));
218 fcinfo->isnull = false;
219 rv = (Datum) 0;
221 else if (plrv == Py_None &&
222 srfstate && srfstate->iter == NULL)
225 * In a SETOF function, the iteration-ending null isn't a real
226 * value; don't pass it through the input function, which might
227 * complain.
229 fcinfo->isnull = true;
230 rv = (Datum) 0;
232 else
234 /* Normal conversion of result */
235 rv = PLy_output_convert(&proc->result, plrv,
236 &fcinfo->isnull);
239 PG_CATCH();
241 /* Pop old arguments from the stack if they were pushed above */
242 PLy_global_args_pop(proc);
244 Py_XDECREF(plargs);
245 Py_XDECREF(plrv);
248 * If there was an error within a SRF, the iterator might not have
249 * been exhausted yet. Clear it so the next invocation of the
250 * function will start the iteration again. (This code is probably
251 * unnecessary now; plpython_srf_cleanup_callback should take care of
252 * cleanup. But it doesn't hurt anything to do it here.)
254 if (srfstate)
256 Py_XDECREF(srfstate->iter);
257 srfstate->iter = NULL;
258 /* And drop any saved args; we won't need them */
259 if (srfstate->savedargs)
260 PLy_function_drop_args(srfstate->savedargs);
261 srfstate->savedargs = NULL;
264 PG_RE_THROW();
266 PG_END_TRY();
268 error_context_stack = plerrcontext.previous;
270 /* Pop old arguments from the stack if they were pushed above */
271 PLy_global_args_pop(proc);
273 Py_XDECREF(plargs);
274 Py_DECREF(plrv);
276 if (srfstate)
278 /* We're in a SRF, exit appropriately */
279 if (srfstate->iter == NULL)
281 /* Iterator exhausted, so we're done */
282 SRF_RETURN_DONE(funcctx);
284 else if (fcinfo->isnull)
285 SRF_RETURN_NEXT_NULL(funcctx);
286 else
287 SRF_RETURN_NEXT(funcctx, rv);
290 /* Plain function, just return the Datum value (possibly null) */
291 return rv;
294 /* trigger subhandler
296 * the python function is expected to return Py_None if the tuple is
297 * acceptable and unmodified. Otherwise it should return a PyString
298 * object who's value is SKIP, or MODIFY. SKIP means don't perform
299 * this action. MODIFY means the tuple has been modified, so update
300 * tuple and perform action. SKIP and MODIFY assume the trigger fires
301 * BEFORE the event and is ROW level. postgres expects the function
302 * to take no arguments and return an argument of type trigger.
304 HeapTuple
305 PLy_exec_trigger(FunctionCallInfo fcinfo, PLyProcedure *proc)
307 HeapTuple rv = NULL;
308 PyObject *volatile plargs = NULL;
309 PyObject *volatile plrv = NULL;
310 TriggerData *tdata;
311 TupleDesc rel_descr;
313 Assert(CALLED_AS_TRIGGER(fcinfo));
314 tdata = (TriggerData *) fcinfo->context;
317 * Input/output conversion for trigger tuples. We use the result and
318 * result_in fields to store the tuple conversion info. We do this over
319 * again on each call to cover the possibility that the relation's tupdesc
320 * changed since the trigger was last called. The PLy_xxx_setup_func
321 * calls should only happen once, but PLy_input_setup_tuple and
322 * PLy_output_setup_tuple are responsible for not doing repetitive work.
324 rel_descr = RelationGetDescr(tdata->tg_relation);
325 if (proc->result.typoid != rel_descr->tdtypeid)
326 PLy_output_setup_func(&proc->result, proc->mcxt,
327 rel_descr->tdtypeid,
328 rel_descr->tdtypmod,
329 proc);
330 if (proc->result_in.typoid != rel_descr->tdtypeid)
331 PLy_input_setup_func(&proc->result_in, proc->mcxt,
332 rel_descr->tdtypeid,
333 rel_descr->tdtypmod,
334 proc);
335 PLy_output_setup_tuple(&proc->result, rel_descr, proc);
336 PLy_input_setup_tuple(&proc->result_in, rel_descr, proc);
338 PG_TRY();
340 int rc PG_USED_FOR_ASSERTS_ONLY;
342 rc = SPI_register_trigger_data(tdata);
343 Assert(rc >= 0);
345 plargs = PLy_trigger_build_args(fcinfo, proc, &rv);
346 plrv = PLy_procedure_call(proc, "TD", plargs);
348 Assert(plrv != NULL);
351 * Disconnect from SPI manager
353 if (SPI_finish() != SPI_OK_FINISH)
354 elog(ERROR, "SPI_finish failed");
357 * return of None means we're happy with the tuple
359 if (plrv != Py_None)
361 char *srv;
363 if (PyString_Check(plrv))
364 srv = PyString_AsString(plrv);
365 else if (PyUnicode_Check(plrv))
366 srv = PLyUnicode_AsString(plrv);
367 else
369 ereport(ERROR,
370 (errcode(ERRCODE_DATA_EXCEPTION),
371 errmsg("unexpected return value from trigger procedure"),
372 errdetail("Expected None or a string.")));
373 srv = NULL; /* keep compiler quiet */
376 if (pg_strcasecmp(srv, "SKIP") == 0)
377 rv = NULL;
378 else if (pg_strcasecmp(srv, "MODIFY") == 0)
380 TriggerData *tdata = (TriggerData *) fcinfo->context;
382 if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event) ||
383 TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
384 rv = PLy_modify_tuple(proc, plargs, tdata, rv);
385 else
386 ereport(WARNING,
387 (errmsg("PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored")));
389 else if (pg_strcasecmp(srv, "OK") != 0)
392 * accept "OK" as an alternative to None; otherwise, raise an
393 * error
395 ereport(ERROR,
396 (errcode(ERRCODE_DATA_EXCEPTION),
397 errmsg("unexpected return value from trigger procedure"),
398 errdetail("Expected None, \"OK\", \"SKIP\", or \"MODIFY\".")));
402 PG_FINALLY();
404 Py_XDECREF(plargs);
405 Py_XDECREF(plrv);
407 PG_END_TRY();
409 return rv;
412 /* helper functions for Python code execution */
414 static PyObject *
415 PLy_function_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc)
417 PyObject *volatile arg = NULL;
418 PyObject *volatile args = NULL;
419 int i;
421 PG_TRY();
423 args = PyList_New(proc->nargs);
424 if (!args)
425 return NULL;
427 for (i = 0; i < proc->nargs; i++)
429 PLyDatumToOb *arginfo = &proc->args[i];
431 if (fcinfo->args[i].isnull)
432 arg = NULL;
433 else
434 arg = PLy_input_convert(arginfo, fcinfo->args[i].value);
436 if (arg == NULL)
438 Py_INCREF(Py_None);
439 arg = Py_None;
442 if (PyList_SetItem(args, i, arg) == -1)
443 PLy_elog(ERROR, "PyList_SetItem() failed, while setting up arguments");
445 if (proc->argnames && proc->argnames[i] &&
446 PyDict_SetItemString(proc->globals, proc->argnames[i], arg) == -1)
447 PLy_elog(ERROR, "PyDict_SetItemString() failed, while setting up arguments");
448 arg = NULL;
451 /* Set up output conversion for functions returning RECORD */
452 if (proc->result.typoid == RECORDOID)
454 TupleDesc desc;
456 if (get_call_result_type(fcinfo, NULL, &desc) != TYPEFUNC_COMPOSITE)
457 ereport(ERROR,
458 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
459 errmsg("function returning record called in context "
460 "that cannot accept type record")));
462 /* cache the output conversion functions */
463 PLy_output_setup_record(&proc->result, desc, proc);
466 PG_CATCH();
468 Py_XDECREF(arg);
469 Py_XDECREF(args);
471 PG_RE_THROW();
473 PG_END_TRY();
475 return args;
479 * Construct a PLySavedArgs struct representing the current values of the
480 * procedure's arguments in its globals dict. This can be used to restore
481 * those values when exiting a recursive call level or returning control to a
482 * set-returning function.
484 * This would not be necessary except for an ancient decision to make args
485 * available via the proc's globals :-( ... but we're stuck with that now.
487 static PLySavedArgs *
488 PLy_function_save_args(PLyProcedure *proc)
490 PLySavedArgs *result;
492 /* saved args are always allocated in procedure's context */
493 result = (PLySavedArgs *)
494 MemoryContextAllocZero(proc->mcxt,
495 offsetof(PLySavedArgs, namedargs) +
496 proc->nargs * sizeof(PyObject *));
497 result->nargs = proc->nargs;
499 /* Fetch the "args" list */
500 result->args = PyDict_GetItemString(proc->globals, "args");
501 Py_XINCREF(result->args);
503 /* Fetch all the named arguments */
504 if (proc->argnames)
506 int i;
508 for (i = 0; i < result->nargs; i++)
510 if (proc->argnames[i])
512 result->namedargs[i] = PyDict_GetItemString(proc->globals,
513 proc->argnames[i]);
514 Py_XINCREF(result->namedargs[i]);
519 return result;
523 * Restore procedure's arguments from a PLySavedArgs struct,
524 * then free the struct.
526 static void
527 PLy_function_restore_args(PLyProcedure *proc, PLySavedArgs *savedargs)
529 /* Restore named arguments into their slots in the globals dict */
530 if (proc->argnames)
532 int i;
534 for (i = 0; i < savedargs->nargs; i++)
536 if (proc->argnames[i] && savedargs->namedargs[i])
538 PyDict_SetItemString(proc->globals, proc->argnames[i],
539 savedargs->namedargs[i]);
540 Py_DECREF(savedargs->namedargs[i]);
545 /* Restore the "args" object, too */
546 if (savedargs->args)
548 PyDict_SetItemString(proc->globals, "args", savedargs->args);
549 Py_DECREF(savedargs->args);
552 /* And free the PLySavedArgs struct */
553 pfree(savedargs);
557 * Free a PLySavedArgs struct without restoring the values.
559 static void
560 PLy_function_drop_args(PLySavedArgs *savedargs)
562 int i;
564 /* Drop references for named args */
565 for (i = 0; i < savedargs->nargs; i++)
567 Py_XDECREF(savedargs->namedargs[i]);
570 /* Drop ref to the "args" object, too */
571 Py_XDECREF(savedargs->args);
573 /* And free the PLySavedArgs struct */
574 pfree(savedargs);
578 * Save away any existing arguments for the given procedure, so that we can
579 * install new values for a recursive call. This should be invoked before
580 * doing PLy_function_build_args().
582 * NB: caller must ensure that PLy_global_args_pop gets invoked once, and
583 * only once, per successful completion of PLy_global_args_push. Otherwise
584 * we'll end up out-of-sync between the actual call stack and the contents
585 * of proc->argstack.
587 static void
588 PLy_global_args_push(PLyProcedure *proc)
590 /* We only need to push if we are already inside some active call */
591 if (proc->calldepth > 0)
593 PLySavedArgs *node;
595 /* Build a struct containing current argument values */
596 node = PLy_function_save_args(proc);
599 * Push the saved argument values into the procedure's stack. Once we
600 * modify either proc->argstack or proc->calldepth, we had better
601 * return without the possibility of error.
603 node->next = proc->argstack;
604 proc->argstack = node;
606 proc->calldepth++;
610 * Pop old arguments when exiting a recursive call.
612 * Note: the idea here is to adjust the proc's callstack state before doing
613 * anything that could possibly fail. In event of any error, we want the
614 * callstack to look like we've done the pop. Leaking a bit of memory is
615 * tolerable.
617 static void
618 PLy_global_args_pop(PLyProcedure *proc)
620 Assert(proc->calldepth > 0);
621 /* We only need to pop if we were already inside some active call */
622 if (proc->calldepth > 1)
624 PLySavedArgs *ptr = proc->argstack;
626 /* Pop the callstack */
627 Assert(ptr != NULL);
628 proc->argstack = ptr->next;
629 proc->calldepth--;
631 /* Restore argument values, then free ptr */
632 PLy_function_restore_args(proc, ptr);
634 else
636 /* Exiting call depth 1 */
637 Assert(proc->argstack == NULL);
638 proc->calldepth--;
641 * We used to delete the named arguments (but not "args") from the
642 * proc's globals dict when exiting the outermost call level for a
643 * function. This seems rather pointless though: nothing can see the
644 * dict until the function is called again, at which time we'll
645 * overwrite those dict entries. So don't bother with that.
651 * Memory context deletion callback for cleaning up a PLySRFState.
652 * We need this in case execution of the SRF is terminated early,
653 * due to error or the caller simply not running it to completion.
655 static void
656 plpython_srf_cleanup_callback(void *arg)
658 PLySRFState *srfstate = (PLySRFState *) arg;
660 /* Release refcount on the iter, if we still have one */
661 Py_XDECREF(srfstate->iter);
662 srfstate->iter = NULL;
663 /* And drop any saved args; we won't need them */
664 if (srfstate->savedargs)
665 PLy_function_drop_args(srfstate->savedargs);
666 srfstate->savedargs = NULL;
669 static void
670 plpython_return_error_callback(void *arg)
672 PLyExecutionContext *exec_ctx = PLy_current_execution_context();
674 if (exec_ctx->curr_proc &&
675 !exec_ctx->curr_proc->is_procedure)
676 errcontext("while creating return value");
679 static PyObject *
680 PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *rv)
682 TriggerData *tdata = (TriggerData *) fcinfo->context;
683 TupleDesc rel_descr = RelationGetDescr(tdata->tg_relation);
684 PyObject *pltname,
685 *pltevent,
686 *pltwhen,
687 *pltlevel,
688 *pltrelid,
689 *plttablename,
690 *plttableschema;
691 PyObject *pltargs,
692 *pytnew,
693 *pytold;
694 PyObject *volatile pltdata = NULL;
695 char *stroid;
697 PG_TRY();
699 pltdata = PyDict_New();
700 if (!pltdata)
701 return NULL;
703 pltname = PyString_FromString(tdata->tg_trigger->tgname);
704 PyDict_SetItemString(pltdata, "name", pltname);
705 Py_DECREF(pltname);
707 stroid = DatumGetCString(DirectFunctionCall1(oidout,
708 ObjectIdGetDatum(tdata->tg_relation->rd_id)));
709 pltrelid = PyString_FromString(stroid);
710 PyDict_SetItemString(pltdata, "relid", pltrelid);
711 Py_DECREF(pltrelid);
712 pfree(stroid);
714 stroid = SPI_getrelname(tdata->tg_relation);
715 plttablename = PyString_FromString(stroid);
716 PyDict_SetItemString(pltdata, "table_name", plttablename);
717 Py_DECREF(plttablename);
718 pfree(stroid);
720 stroid = SPI_getnspname(tdata->tg_relation);
721 plttableschema = PyString_FromString(stroid);
722 PyDict_SetItemString(pltdata, "table_schema", plttableschema);
723 Py_DECREF(plttableschema);
724 pfree(stroid);
726 if (TRIGGER_FIRED_BEFORE(tdata->tg_event))
727 pltwhen = PyString_FromString("BEFORE");
728 else if (TRIGGER_FIRED_AFTER(tdata->tg_event))
729 pltwhen = PyString_FromString("AFTER");
730 else if (TRIGGER_FIRED_INSTEAD(tdata->tg_event))
731 pltwhen = PyString_FromString("INSTEAD OF");
732 else
734 elog(ERROR, "unrecognized WHEN tg_event: %u", tdata->tg_event);
735 pltwhen = NULL; /* keep compiler quiet */
737 PyDict_SetItemString(pltdata, "when", pltwhen);
738 Py_DECREF(pltwhen);
740 if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
742 pltlevel = PyString_FromString("ROW");
743 PyDict_SetItemString(pltdata, "level", pltlevel);
744 Py_DECREF(pltlevel);
747 * Note: In BEFORE trigger, stored generated columns are not
748 * computed yet, so don't make them accessible in NEW row.
751 if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
753 pltevent = PyString_FromString("INSERT");
755 PyDict_SetItemString(pltdata, "old", Py_None);
756 pytnew = PLy_input_from_tuple(&proc->result_in,
757 tdata->tg_trigtuple,
758 rel_descr,
759 !TRIGGER_FIRED_BEFORE(tdata->tg_event));
760 PyDict_SetItemString(pltdata, "new", pytnew);
761 Py_DECREF(pytnew);
762 *rv = tdata->tg_trigtuple;
764 else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
766 pltevent = PyString_FromString("DELETE");
768 PyDict_SetItemString(pltdata, "new", Py_None);
769 pytold = PLy_input_from_tuple(&proc->result_in,
770 tdata->tg_trigtuple,
771 rel_descr,
772 true);
773 PyDict_SetItemString(pltdata, "old", pytold);
774 Py_DECREF(pytold);
775 *rv = tdata->tg_trigtuple;
777 else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
779 pltevent = PyString_FromString("UPDATE");
781 pytnew = PLy_input_from_tuple(&proc->result_in,
782 tdata->tg_newtuple,
783 rel_descr,
784 !TRIGGER_FIRED_BEFORE(tdata->tg_event));
785 PyDict_SetItemString(pltdata, "new", pytnew);
786 Py_DECREF(pytnew);
787 pytold = PLy_input_from_tuple(&proc->result_in,
788 tdata->tg_trigtuple,
789 rel_descr,
790 true);
791 PyDict_SetItemString(pltdata, "old", pytold);
792 Py_DECREF(pytold);
793 *rv = tdata->tg_newtuple;
795 else
797 elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
798 pltevent = NULL; /* keep compiler quiet */
801 PyDict_SetItemString(pltdata, "event", pltevent);
802 Py_DECREF(pltevent);
804 else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event))
806 pltlevel = PyString_FromString("STATEMENT");
807 PyDict_SetItemString(pltdata, "level", pltlevel);
808 Py_DECREF(pltlevel);
810 PyDict_SetItemString(pltdata, "old", Py_None);
811 PyDict_SetItemString(pltdata, "new", Py_None);
812 *rv = NULL;
814 if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
815 pltevent = PyString_FromString("INSERT");
816 else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
817 pltevent = PyString_FromString("DELETE");
818 else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
819 pltevent = PyString_FromString("UPDATE");
820 else if (TRIGGER_FIRED_BY_TRUNCATE(tdata->tg_event))
821 pltevent = PyString_FromString("TRUNCATE");
822 else
824 elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
825 pltevent = NULL; /* keep compiler quiet */
828 PyDict_SetItemString(pltdata, "event", pltevent);
829 Py_DECREF(pltevent);
831 else
832 elog(ERROR, "unrecognized LEVEL tg_event: %u", tdata->tg_event);
834 if (tdata->tg_trigger->tgnargs)
837 * all strings...
839 int i;
840 PyObject *pltarg;
842 pltargs = PyList_New(tdata->tg_trigger->tgnargs);
843 if (!pltargs)
845 Py_DECREF(pltdata);
846 return NULL;
848 for (i = 0; i < tdata->tg_trigger->tgnargs; i++)
850 pltarg = PyString_FromString(tdata->tg_trigger->tgargs[i]);
853 * stolen, don't Py_DECREF
855 PyList_SetItem(pltargs, i, pltarg);
858 else
860 Py_INCREF(Py_None);
861 pltargs = Py_None;
863 PyDict_SetItemString(pltdata, "args", pltargs);
864 Py_DECREF(pltargs);
866 PG_CATCH();
868 Py_XDECREF(pltdata);
869 PG_RE_THROW();
871 PG_END_TRY();
873 return pltdata;
877 * Apply changes requested by a MODIFY return from a trigger function.
879 static HeapTuple
880 PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
881 HeapTuple otup)
883 HeapTuple rtup;
884 PyObject *volatile plntup;
885 PyObject *volatile plkeys;
886 PyObject *volatile plval;
887 Datum *volatile modvalues;
888 bool *volatile modnulls;
889 bool *volatile modrepls;
890 ErrorContextCallback plerrcontext;
892 plerrcontext.callback = plpython_trigger_error_callback;
893 plerrcontext.previous = error_context_stack;
894 error_context_stack = &plerrcontext;
896 plntup = plkeys = plval = NULL;
897 modvalues = NULL;
898 modnulls = NULL;
899 modrepls = NULL;
901 PG_TRY();
903 TupleDesc tupdesc;
904 int nkeys,
907 if ((plntup = PyDict_GetItemString(pltd, "new")) == NULL)
908 ereport(ERROR,
909 (errcode(ERRCODE_UNDEFINED_OBJECT),
910 errmsg("TD[\"new\"] deleted, cannot modify row")));
911 Py_INCREF(plntup);
912 if (!PyDict_Check(plntup))
913 ereport(ERROR,
914 (errcode(ERRCODE_DATATYPE_MISMATCH),
915 errmsg("TD[\"new\"] is not a dictionary")));
917 plkeys = PyDict_Keys(plntup);
918 nkeys = PyList_Size(plkeys);
920 tupdesc = RelationGetDescr(tdata->tg_relation);
922 modvalues = (Datum *) palloc0(tupdesc->natts * sizeof(Datum));
923 modnulls = (bool *) palloc0(tupdesc->natts * sizeof(bool));
924 modrepls = (bool *) palloc0(tupdesc->natts * sizeof(bool));
926 for (i = 0; i < nkeys; i++)
928 PyObject *platt;
929 char *plattstr;
930 int attn;
931 PLyObToDatum *att;
933 platt = PyList_GetItem(plkeys, i);
934 if (PyString_Check(platt))
935 plattstr = PyString_AsString(platt);
936 else if (PyUnicode_Check(platt))
937 plattstr = PLyUnicode_AsString(platt);
938 else
940 ereport(ERROR,
941 (errcode(ERRCODE_DATATYPE_MISMATCH),
942 errmsg("TD[\"new\"] dictionary key at ordinal position %d is not a string", i)));
943 plattstr = NULL; /* keep compiler quiet */
945 attn = SPI_fnumber(tupdesc, plattstr);
946 if (attn == SPI_ERROR_NOATTRIBUTE)
947 ereport(ERROR,
948 (errcode(ERRCODE_UNDEFINED_COLUMN),
949 errmsg("key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row",
950 plattstr)));
951 if (attn <= 0)
952 ereport(ERROR,
953 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
954 errmsg("cannot set system attribute \"%s\"",
955 plattstr)));
956 if (TupleDescAttr(tupdesc, attn - 1)->attgenerated)
957 ereport(ERROR,
958 (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
959 errmsg("cannot set generated column \"%s\"",
960 plattstr)));
962 plval = PyDict_GetItem(plntup, platt);
963 if (plval == NULL)
964 elog(FATAL, "Python interpreter is probably corrupted");
966 Py_INCREF(plval);
968 /* We assume proc->result is set up to convert tuples properly */
969 att = &proc->result.u.tuple.atts[attn - 1];
971 modvalues[attn - 1] = PLy_output_convert(att,
972 plval,
973 &modnulls[attn - 1]);
974 modrepls[attn - 1] = true;
976 Py_DECREF(plval);
977 plval = NULL;
980 rtup = heap_modify_tuple(otup, tupdesc, modvalues, modnulls, modrepls);
982 PG_CATCH();
984 Py_XDECREF(plntup);
985 Py_XDECREF(plkeys);
986 Py_XDECREF(plval);
988 if (modvalues)
989 pfree(modvalues);
990 if (modnulls)
991 pfree(modnulls);
992 if (modrepls)
993 pfree(modrepls);
995 PG_RE_THROW();
997 PG_END_TRY();
999 Py_DECREF(plntup);
1000 Py_DECREF(plkeys);
1002 pfree(modvalues);
1003 pfree(modnulls);
1004 pfree(modrepls);
1006 error_context_stack = plerrcontext.previous;
1008 return rtup;
1011 static void
1012 plpython_trigger_error_callback(void *arg)
1014 PLyExecutionContext *exec_ctx = PLy_current_execution_context();
1016 if (exec_ctx->curr_proc)
1017 errcontext("while modifying trigger row");
1020 /* execute Python code, propagate Python errors to the backend */
1021 static PyObject *
1022 PLy_procedure_call(PLyProcedure *proc, const char *kargs, PyObject *vargs)
1024 PyObject *rv = NULL;
1025 int volatile save_subxact_level = list_length(explicit_subtransactions);
1027 PyDict_SetItemString(proc->globals, kargs, vargs);
1029 PG_TRY();
1031 #if PY_VERSION_HEX >= 0x03020000
1032 rv = PyEval_EvalCode(proc->code,
1033 proc->globals, proc->globals);
1034 #else
1035 rv = PyEval_EvalCode((PyCodeObject *) proc->code,
1036 proc->globals, proc->globals);
1037 #endif
1040 * Since plpy will only let you close subtransactions that you
1041 * started, you cannot *unnest* subtransactions, only *nest* them
1042 * without closing.
1044 Assert(list_length(explicit_subtransactions) >= save_subxact_level);
1046 PG_FINALLY();
1048 PLy_abort_open_subtransactions(save_subxact_level);
1050 PG_END_TRY();
1052 /* If the Python code returned an error, propagate it */
1053 if (rv == NULL)
1054 PLy_elog(ERROR, NULL);
1056 return rv;
1060 * Abort lingering subtransactions that have been explicitly started
1061 * by plpy.subtransaction().start() and not properly closed.
1063 static void
1064 PLy_abort_open_subtransactions(int save_subxact_level)
1066 Assert(save_subxact_level >= 0);
1068 while (list_length(explicit_subtransactions) > save_subxact_level)
1070 PLySubtransactionData *subtransactiondata;
1072 Assert(explicit_subtransactions != NIL);
1074 ereport(WARNING,
1075 (errmsg("forcibly aborting a subtransaction that has not been exited")));
1077 RollbackAndReleaseCurrentSubTransaction();
1079 subtransactiondata = (PLySubtransactionData *) linitial(explicit_subtransactions);
1080 explicit_subtransactions = list_delete_first(explicit_subtransactions);
1082 MemoryContextSwitchTo(subtransactiondata->oldcontext);
1083 CurrentResourceOwner = subtransactiondata->oldowner;
1084 pfree(subtransactiondata);