1 /*
2 * executing Python code
3 *
4 * src/pl/plpython/plpy_exec.c
5 */
6
7 #include "postgres.h"
8
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"
25
26 /* saved state for a set-returning function */
27 typedef struct PLySRFState
28 {
29 PyObject *iter; /* Python iterator producing results */
30 PLySavedArgs *savedargs; /* function argument values */
31 MemoryContextCallback callback; /* for releasing refcounts when done */
32 } PLySRFState;
33
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);
42
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);
48
49 static PyObject *PLy_procedure_call(PLyProcedure *proc, const char *kargs, PyObject *vargs);
50 static void PLy_abort_open_subtransactions(int save_subxact_level);
51
52
53 /* function subhandler */
54 Datum
PLy_exec_function(FunctionCallInfo fcinfo,PLyProcedure * proc)55 PLy_exec_function(FunctionCallInfo fcinfo, PLyProcedure *proc)
56 {
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;
64
65 /*
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.
69 */
70 PLy_global_args_push(proc);
71
72 PG_TRY();
73 {
74 if (is_setof)
75 {
76 /* First Call setup */
77 if (SRF_IS_FIRSTCALL())
78 {
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;
89 }
90 /* Every call setup */
91 funcctx = SRF_PERCALL_SETUP();
92 Assert(funcctx != NULL);
93 srfstate = (PLySRFState *) funcctx->user_fctx;
94 Assert(srfstate != NULL);
95 }
96
97 if (srfstate == NULL || srfstate->iter == NULL)
98 {
99 /*
100 * Non-SETOF function or first time for SETOF function: build
101 * args, then actually execute the function.
102 */
103 plargs = PLy_function_build_args(fcinfo, proc);
104 plrv = PLy_procedure_call(proc, "args", plargs);
105 Assert(plrv != NULL);
106 }
107 else
108 {
109 /*
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.
116 */
117 if (srfstate->savedargs)
118 PLy_function_restore_args(proc, srfstate->savedargs);
119 srfstate->savedargs = NULL; /* deleted by restore_args */
120 }
121
122 /*
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.
126 */
127 if (is_setof)
128 {
129 if (srfstate->iter == NULL)
130 {
131 /* first time -- do checks and setup */
132 ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo;
133
134 if (!rsi || !IsA(rsi, ReturnSetInfo) ||
135 (rsi->allowedModes & SFRM_ValuePerCall) == 0)
136 {
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.")));
141 }
142 rsi->returnMode = SFRM_ValuePerCall;
143
144 /* Make iterator out of returned object */
145 srfstate->iter = PyObject_GetIter(plrv);
146
147 Py_DECREF(plrv);
148 plrv = NULL;
149
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.")));
155 }
156
157 /* Fetch next from iterator */
158 plrv = PyIter_Next(srfstate->iter);
159 if (plrv == NULL)
160 {
161 /* Iterator is exhausted or error happened */
162 bool has_error = (PyErr_Occurred() != NULL);
163
164 Py_DECREF(srfstate->iter);
165 srfstate->iter = NULL;
166
167 if (has_error)
168 PLy_elog(ERROR, "error fetching next item from iterator");
169
170 /* Pass a null through the data-returning steps below */
171 Py_INCREF(Py_None);
172 plrv = Py_None;
173 }
174 else
175 {
176 /*
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.
180 */
181 srfstate->savedargs = PLy_function_save_args(proc);
182 }
183 }
184
185 /*
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).
190 */
191 if (SPI_finish() != SPI_OK_FINISH)
192 elog(ERROR, "SPI_finish failed");
193
194 plerrcontext.callback = plpython_return_error_callback;
195 plerrcontext.previous = error_context_stack;
196 error_context_stack = &plerrcontext;
197
198 /*
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).
203 */
204 if (proc->result.typoid == VOIDOID)
205 {
206 if (plrv != Py_None)
207 {
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")));
216 }
217
218 fcinfo->isnull = false;
219 rv = (Datum) 0;
220 }
221 else if (plrv == Py_None &&
222 srfstate && srfstate->iter == NULL)
223 {
224 /*
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.
228 */
229 fcinfo->isnull = true;
230 rv = (Datum) 0;
231 }
232 else
233 {
234 /* Normal conversion of result */
235 rv = PLy_output_convert(&proc->result, plrv,
236 &fcinfo->isnull);
237 }
238 }
239 PG_CATCH();
240 {
241 /* Pop old arguments from the stack if they were pushed above */
242 PLy_global_args_pop(proc);
243
244 Py_XDECREF(plargs);
245 Py_XDECREF(plrv);
246
247 /*
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.)
253 */
254 if (srfstate)
255 {
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;
262 }
263
264 PG_RE_THROW();
265 }
266 PG_END_TRY();
267
268 error_context_stack = plerrcontext.previous;
269
270 /* Pop old arguments from the stack if they were pushed above */
271 PLy_global_args_pop(proc);
272
273 Py_XDECREF(plargs);
274 Py_DECREF(plrv);
275
276 if (srfstate)
277 {
278 /* We're in a SRF, exit appropriately */
279 if (srfstate->iter == NULL)
280 {
281 /* Iterator exhausted, so we're done */
282 SRF_RETURN_DONE(funcctx);
283 }
284 else if (fcinfo->isnull)
285 SRF_RETURN_NEXT_NULL(funcctx);
286 else
287 SRF_RETURN_NEXT(funcctx, rv);
288 }
289
290 /* Plain function, just return the Datum value (possibly null) */
291 return rv;
292 }
293
294 /* trigger subhandler
295 *
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.
303 */
304 HeapTuple
PLy_exec_trigger(FunctionCallInfo fcinfo,PLyProcedure * proc)305 PLy_exec_trigger(FunctionCallInfo fcinfo, PLyProcedure *proc)
306 {
307 HeapTuple rv = NULL;
308 PyObject *volatile plargs = NULL;
309 PyObject *volatile plrv = NULL;
310 TriggerData *tdata;
311 TupleDesc rel_descr;
312
313 Assert(CALLED_AS_TRIGGER(fcinfo));
314 tdata = (TriggerData *) fcinfo->context;
315
316 /*
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.
323 */
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);
337
338 PG_TRY();
339 {
340 int rc PG_USED_FOR_ASSERTS_ONLY;
341
342 rc = SPI_register_trigger_data(tdata);
343 Assert(rc >= 0);
344
345 plargs = PLy_trigger_build_args(fcinfo, proc, &rv);
346 plrv = PLy_procedure_call(proc, "TD", plargs);
347
348 Assert(plrv != NULL);
349
350 /*
351 * Disconnect from SPI manager
352 */
353 if (SPI_finish() != SPI_OK_FINISH)
354 elog(ERROR, "SPI_finish failed");
355
356 /*
357 * return of None means we're happy with the tuple
358 */
359 if (plrv != Py_None)
360 {
361 char *srv;
362
363 if (PyString_Check(plrv))
364 srv = PyString_AsString(plrv);
365 else if (PyUnicode_Check(plrv))
366 srv = PLyUnicode_AsString(plrv);
367 else
368 {
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 */
374 }
375
376 if (pg_strcasecmp(srv, "SKIP") == 0)
377 rv = NULL;
378 else if (pg_strcasecmp(srv, "MODIFY") == 0)
379 {
380 TriggerData *tdata = (TriggerData *) fcinfo->context;
381
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")));
388 }
389 else if (pg_strcasecmp(srv, "OK") != 0)
390 {
391 /*
392 * accept "OK" as an alternative to None; otherwise, raise an
393 * error
394 */
395 ereport(ERROR,
396 (errcode(ERRCODE_DATA_EXCEPTION),
397 errmsg("unexpected return value from trigger procedure"),
398 errdetail("Expected None, \"OK\", \"SKIP\", or \"MODIFY\".")));
399 }
400 }
401 }
402 PG_FINALLY();
403 {
404 Py_XDECREF(plargs);
405 Py_XDECREF(plrv);
406 }
407 PG_END_TRY();
408
409 return rv;
410 }
411
412 /* helper functions for Python code execution */
413
414 static PyObject *
PLy_function_build_args(FunctionCallInfo fcinfo,PLyProcedure * proc)415 PLy_function_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc)
416 {
417 PyObject *volatile arg = NULL;
418 PyObject *volatile args = NULL;
419 int i;
420
421 PG_TRY();
422 {
423 args = PyList_New(proc->nargs);
424 if (!args)
425 return NULL;
426
427 for (i = 0; i < proc->nargs; i++)
428 {
429 PLyDatumToOb *arginfo = &proc->args[i];
430
431 if (fcinfo->args[i].isnull)
432 arg = NULL;
433 else
434 arg = PLy_input_convert(arginfo, fcinfo->args[i].value);
435
436 if (arg == NULL)
437 {
438 Py_INCREF(Py_None);
439 arg = Py_None;
440 }
441
442 if (PyList_SetItem(args, i, arg) == -1)
443 PLy_elog(ERROR, "PyList_SetItem() failed, while setting up arguments");
444
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;
449 }
450
451 /* Set up output conversion for functions returning RECORD */
452 if (proc->result.typoid == RECORDOID)
453 {
454 TupleDesc desc;
455
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")));
461
462 /* cache the output conversion functions */
463 PLy_output_setup_record(&proc->result, desc, proc);
464 }
465 }
466 PG_CATCH();
467 {
468 Py_XDECREF(arg);
469 Py_XDECREF(args);
470
471 PG_RE_THROW();
472 }
473 PG_END_TRY();
474
475 return args;
476 }
477
478 /*
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.
483 *
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.
486 */
487 static PLySavedArgs *
PLy_function_save_args(PLyProcedure * proc)488 PLy_function_save_args(PLyProcedure *proc)
489 {
490 PLySavedArgs *result;
491
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;
498
499 /* Fetch the "args" list */
500 result->args = PyDict_GetItemString(proc->globals, "args");
501 Py_XINCREF(result->args);
502
503 /* Fetch all the named arguments */
504 if (proc->argnames)
505 {
506 int i;
507
508 for (i = 0; i < result->nargs; i++)
509 {
510 if (proc->argnames[i])
511 {
512 result->namedargs[i] = PyDict_GetItemString(proc->globals,
513 proc->argnames[i]);
514 Py_XINCREF(result->namedargs[i]);
515 }
516 }
517 }
518
519 return result;
520 }
521
522 /*
523 * Restore procedure's arguments from a PLySavedArgs struct,
524 * then free the struct.
525 */
526 static void
PLy_function_restore_args(PLyProcedure * proc,PLySavedArgs * savedargs)527 PLy_function_restore_args(PLyProcedure *proc, PLySavedArgs *savedargs)
528 {
529 /* Restore named arguments into their slots in the globals dict */
530 if (proc->argnames)
531 {
532 int i;
533
534 for (i = 0; i < savedargs->nargs; i++)
535 {
536 if (proc->argnames[i] && savedargs->namedargs[i])
537 {
538 PyDict_SetItemString(proc->globals, proc->argnames[i],
539 savedargs->namedargs[i]);
540 Py_DECREF(savedargs->namedargs[i]);
541 }
542 }
543 }
544
545 /* Restore the "args" object, too */
546 if (savedargs->args)
547 {
548 PyDict_SetItemString(proc->globals, "args", savedargs->args);
549 Py_DECREF(savedargs->args);
550 }
551
552 /* And free the PLySavedArgs struct */
553 pfree(savedargs);
554 }
555
556 /*
557 * Free a PLySavedArgs struct without restoring the values.
558 */
559 static void
PLy_function_drop_args(PLySavedArgs * savedargs)560 PLy_function_drop_args(PLySavedArgs *savedargs)
561 {
562 int i;
563
564 /* Drop references for named args */
565 for (i = 0; i < savedargs->nargs; i++)
566 {
567 Py_XDECREF(savedargs->namedargs[i]);
568 }
569
570 /* Drop ref to the "args" object, too */
571 Py_XDECREF(savedargs->args);
572
573 /* And free the PLySavedArgs struct */
574 pfree(savedargs);
575 }
576
577 /*
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().
581 *
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.
586 */
587 static void
PLy_global_args_push(PLyProcedure * proc)588 PLy_global_args_push(PLyProcedure *proc)
589 {
590 /* We only need to push if we are already inside some active call */
591 if (proc->calldepth > 0)
592 {
593 PLySavedArgs *node;
594
595 /* Build a struct containing current argument values */
596 node = PLy_function_save_args(proc);
597
598 /*
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.
602 */
603 node->next = proc->argstack;
604 proc->argstack = node;
605 }
606 proc->calldepth++;
607 }
608
609 /*
610 * Pop old arguments when exiting a recursive call.
611 *
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.
616 */
617 static void
PLy_global_args_pop(PLyProcedure * proc)618 PLy_global_args_pop(PLyProcedure *proc)
619 {
620 Assert(proc->calldepth > 0);
621 /* We only need to pop if we were already inside some active call */
622 if (proc->calldepth > 1)
623 {
624 PLySavedArgs *ptr = proc->argstack;
625
626 /* Pop the callstack */
627 Assert(ptr != NULL);
628 proc->argstack = ptr->next;
629 proc->calldepth--;
630
631 /* Restore argument values, then free ptr */
632 PLy_function_restore_args(proc, ptr);
633 }
634 else
635 {
636 /* Exiting call depth 1 */
637 Assert(proc->argstack == NULL);
638 proc->calldepth--;
639
640 /*
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.
646 */
647 }
648 }
649
650 /*
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.
654 */
655 static void
plpython_srf_cleanup_callback(void * arg)656 plpython_srf_cleanup_callback(void *arg)
657 {
658 PLySRFState *srfstate = (PLySRFState *) arg;
659
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;
667 }
668
669 static void
plpython_return_error_callback(void * arg)670 plpython_return_error_callback(void *arg)
671 {
672 PLyExecutionContext *exec_ctx = PLy_current_execution_context();
673
674 if (exec_ctx->curr_proc &&
675 !exec_ctx->curr_proc->is_procedure)
676 errcontext("while creating return value");
677 }
678
679 static PyObject *
PLy_trigger_build_args(FunctionCallInfo fcinfo,PLyProcedure * proc,HeapTuple * rv)680 PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *rv)
681 {
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;
696
697 PG_TRY();
698 {
699 pltdata = PyDict_New();
700 if (!pltdata)
701 return NULL;
702
703 pltname = PyString_FromString(tdata->tg_trigger->tgname);
704 PyDict_SetItemString(pltdata, "name", pltname);
705 Py_DECREF(pltname);
706
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);
713
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);
719
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);
725
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
733 {
734 elog(ERROR, "unrecognized WHEN tg_event: %u", tdata->tg_event);
735 pltwhen = NULL; /* keep compiler quiet */
736 }
737 PyDict_SetItemString(pltdata, "when", pltwhen);
738 Py_DECREF(pltwhen);
739
740 if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
741 {
742 pltlevel = PyString_FromString("ROW");
743 PyDict_SetItemString(pltdata, "level", pltlevel);
744 Py_DECREF(pltlevel);
745
746 /*
747 * Note: In BEFORE trigger, stored generated columns are not
748 * computed yet, so don't make them accessible in NEW row.
749 */
750
751 if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
752 {
753 pltevent = PyString_FromString("INSERT");
754
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;
763 }
764 else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
765 {
766 pltevent = PyString_FromString("DELETE");
767
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;
776 }
777 else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
778 {
779 pltevent = PyString_FromString("UPDATE");
780
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;
794 }
795 else
796 {
797 elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
798 pltevent = NULL; /* keep compiler quiet */
799 }
800
801 PyDict_SetItemString(pltdata, "event", pltevent);
802 Py_DECREF(pltevent);
803 }
804 else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event))
805 {
806 pltlevel = PyString_FromString("STATEMENT");
807 PyDict_SetItemString(pltdata, "level", pltlevel);
808 Py_DECREF(pltlevel);
809
810 PyDict_SetItemString(pltdata, "old", Py_None);
811 PyDict_SetItemString(pltdata, "new", Py_None);
812 *rv = NULL;
813
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
823 {
824 elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
825 pltevent = NULL; /* keep compiler quiet */
826 }
827
828 PyDict_SetItemString(pltdata, "event", pltevent);
829 Py_DECREF(pltevent);
830 }
831 else
832 elog(ERROR, "unrecognized LEVEL tg_event: %u", tdata->tg_event);
833
834 if (tdata->tg_trigger->tgnargs)
835 {
836 /*
837 * all strings...
838 */
839 int i;
840 PyObject *pltarg;
841
842 pltargs = PyList_New(tdata->tg_trigger->tgnargs);
843 if (!pltargs)
844 {
845 Py_DECREF(pltdata);
846 return NULL;
847 }
848 for (i = 0; i < tdata->tg_trigger->tgnargs; i++)
849 {
850 pltarg = PyString_FromString(tdata->tg_trigger->tgargs[i]);
851
852 /*
853 * stolen, don't Py_DECREF
854 */
855 PyList_SetItem(pltargs, i, pltarg);
856 }
857 }
858 else
859 {
860 Py_INCREF(Py_None);
861 pltargs = Py_None;
862 }
863 PyDict_SetItemString(pltdata, "args", pltargs);
864 Py_DECREF(pltargs);
865 }
866 PG_CATCH();
867 {
868 Py_XDECREF(pltdata);
869 PG_RE_THROW();
870 }
871 PG_END_TRY();
872
873 return pltdata;
874 }
875
876 /*
877 * Apply changes requested by a MODIFY return from a trigger function.
878 */
879 static HeapTuple
PLy_modify_tuple(PLyProcedure * proc,PyObject * pltd,TriggerData * tdata,HeapTuple otup)880 PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
881 HeapTuple otup)
882 {
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;
891
892 plerrcontext.callback = plpython_trigger_error_callback;
893 plerrcontext.previous = error_context_stack;
894 error_context_stack = &plerrcontext;
895
896 plntup = plkeys = plval = NULL;
897 modvalues = NULL;
898 modnulls = NULL;
899 modrepls = NULL;
900
901 PG_TRY();
902 {
903 TupleDesc tupdesc;
904 int nkeys,
905 i;
906
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")));
916
917 plkeys = PyDict_Keys(plntup);
918 nkeys = PyList_Size(plkeys);
919
920 tupdesc = RelationGetDescr(tdata->tg_relation);
921
922 modvalues = (Datum *) palloc0(tupdesc->natts * sizeof(Datum));
923 modnulls = (bool *) palloc0(tupdesc->natts * sizeof(bool));
924 modrepls = (bool *) palloc0(tupdesc->natts * sizeof(bool));
925
926 for (i = 0; i < nkeys; i++)
927 {
928 PyObject *platt;
929 char *plattstr;
930 int attn;
931 PLyObToDatum *att;
932
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
939 {
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 */
944 }
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)));
961
962 plval = PyDict_GetItem(plntup, platt);
963 if (plval == NULL)
964 elog(FATAL, "Python interpreter is probably corrupted");
965
966 Py_INCREF(plval);
967
968 /* We assume proc->result is set up to convert tuples properly */
969 att = &proc->result.u.tuple.atts[attn - 1];
970
971 modvalues[attn - 1] = PLy_output_convert(att,
972 plval,
973 &modnulls[attn - 1]);
974 modrepls[attn - 1] = true;
975
976 Py_DECREF(plval);
977 plval = NULL;
978 }
979
980 rtup = heap_modify_tuple(otup, tupdesc, modvalues, modnulls, modrepls);
981 }
982 PG_CATCH();
983 {
984 Py_XDECREF(plntup);
985 Py_XDECREF(plkeys);
986 Py_XDECREF(plval);
987
988 if (modvalues)
989 pfree(modvalues);
990 if (modnulls)
991 pfree(modnulls);
992 if (modrepls)
993 pfree(modrepls);
994
995 PG_RE_THROW();
996 }
997 PG_END_TRY();
998
999 Py_DECREF(plntup);
1000 Py_DECREF(plkeys);
1001
1002 pfree(modvalues);
1003 pfree(modnulls);
1004 pfree(modrepls);
1005
1006 error_context_stack = plerrcontext.previous;
1007
1008 return rtup;
1009 }
1010
1011 static void
plpython_trigger_error_callback(void * arg)1012 plpython_trigger_error_callback(void *arg)
1013 {
1014 PLyExecutionContext *exec_ctx = PLy_current_execution_context();
1015
1016 if (exec_ctx->curr_proc)
1017 errcontext("while modifying trigger row");
1018 }
1019
1020 /* execute Python code, propagate Python errors to the backend */
1021 static PyObject *
PLy_procedure_call(PLyProcedure * proc,const char * kargs,PyObject * vargs)1022 PLy_procedure_call(PLyProcedure *proc, const char *kargs, PyObject *vargs)
1023 {
1024 PyObject *rv = NULL;
1025 int volatile save_subxact_level = list_length(explicit_subtransactions);
1026
1027 PyDict_SetItemString(proc->globals, kargs, vargs);
1028
1029 PG_TRY();
1030 {
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
1038
1039 /*
1040 * Since plpy will only let you close subtransactions that you
1041 * started, you cannot *unnest* subtransactions, only *nest* them
1042 * without closing.
1043 */
1044 Assert(list_length(explicit_subtransactions) >= save_subxact_level);
1045 }
1046 PG_FINALLY();
1047 {
1048 PLy_abort_open_subtransactions(save_subxact_level);
1049 }
1050 PG_END_TRY();
1051
1052 /* If the Python code returned an error, propagate it */
1053 if (rv == NULL)
1054 PLy_elog(ERROR, NULL);
1055
1056 return rv;
1057 }
1058
1059 /*
1060 * Abort lingering subtransactions that have been explicitly started
1061 * by plpy.subtransaction().start() and not properly closed.
1062 */
1063 static void
PLy_abort_open_subtransactions(int save_subxact_level)1064 PLy_abort_open_subtransactions(int save_subxact_level)
1065 {
1066 Assert(save_subxact_level >= 0);
1067
1068 while (list_length(explicit_subtransactions) > save_subxact_level)
1069 {
1070 PLySubtransactionData *subtransactiondata;
1071
1072 Assert(explicit_subtransactions != NIL);
1073
1074 ereport(WARNING,
1075 (errmsg("forcibly aborting a subtransaction that has not been exited")));
1076
1077 RollbackAndReleaseCurrentSubTransaction();
1078
1079 subtransactiondata = (PLySubtransactionData *) linitial(explicit_subtransactions);
1080 explicit_subtransactions = list_delete_first(explicit_subtransactions);
1081
1082 MemoryContextSwitchTo(subtransactiondata->oldcontext);
1083 CurrentResourceOwner = subtransactiondata->oldowner;
1084 pfree(subtransactiondata);
1085 }
1086 }
1087