33 * procedural language
44 *
55 * IDENTIFICATION
6- * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.132 2005/02/24 01:11:40 tgl Exp $
6+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.133 2005/03/25 01:45:42 tgl Exp $
77 *
88 * This software is copyrighted by Jan Wieck - Hamburg.
99 *
@@ -497,9 +497,6 @@ plpgsql_exec_trigger(PLpgSQL_function *func,
497497 */
498498
499499var = (PLpgSQL_var * ) (estate .datums [func -> tg_op_varno ]);
500- var -> isnull = false;
501- var -> freeval = false;
502-
503500if (TRIGGER_FIRED_BY_INSERT (trigdata -> tg_event ))
504501var -> value = DirectFunctionCall1 (textin ,CStringGetDatum ("INSERT" ));
505502else if (TRIGGER_FIRED_BY_UPDATE (trigdata -> tg_event ))
@@ -508,48 +505,50 @@ plpgsql_exec_trigger(PLpgSQL_function *func,
508505var -> value = DirectFunctionCall1 (textin ,CStringGetDatum ("DELETE" ));
509506else
510507elog (ERROR ,"unrecognized trigger action: not INSERT, DELETE, or UPDATE" );
511-
512- var = (PLpgSQL_var * ) (estate .datums [func -> tg_name_varno ]);
513508var -> isnull = false;
514509var -> freeval = true;
510+
511+ var = (PLpgSQL_var * ) (estate .datums [func -> tg_name_varno ]);
515512var -> value = DirectFunctionCall1 (namein ,
516513CStringGetDatum (trigdata -> tg_trigger -> tgname ));
517-
518- var = (PLpgSQL_var * ) (estate .datums [func -> tg_when_varno ]);
519514var -> isnull = false;
520515var -> freeval = true;
516+
517+ var = (PLpgSQL_var * ) (estate .datums [func -> tg_when_varno ]);
521518if (TRIGGER_FIRED_BEFORE (trigdata -> tg_event ))
522519var -> value = DirectFunctionCall1 (textin ,CStringGetDatum ("BEFORE" ));
523520else if (TRIGGER_FIRED_AFTER (trigdata -> tg_event ))
524521var -> value = DirectFunctionCall1 (textin ,CStringGetDatum ("AFTER" ));
525522else
526523elog (ERROR ,"unrecognized trigger execution time: not BEFORE or AFTER" );
527-
528- var = (PLpgSQL_var * ) (estate .datums [func -> tg_level_varno ]);
529524var -> isnull = false;
530525var -> freeval = true;
526+
527+ var = (PLpgSQL_var * ) (estate .datums [func -> tg_level_varno ]);
531528if (TRIGGER_FIRED_FOR_ROW (trigdata -> tg_event ))
532529var -> value = DirectFunctionCall1 (textin ,CStringGetDatum ("ROW" ));
533530else if (TRIGGER_FIRED_FOR_STATEMENT (trigdata -> tg_event ))
534531var -> value = DirectFunctionCall1 (textin ,CStringGetDatum ("STATEMENT" ));
535532else
536533elog (ERROR ,"unrecognized trigger event type: not ROW or STATEMENT" );
534+ var -> isnull = false;
535+ var -> freeval = true;
537536
538537var = (PLpgSQL_var * ) (estate .datums [func -> tg_relid_varno ]);
538+ var -> value = ObjectIdGetDatum (trigdata -> tg_relation -> rd_id );
539539var -> isnull = false;
540540var -> freeval = false;
541- var -> value = ObjectIdGetDatum (trigdata -> tg_relation -> rd_id );
542541
543542var = (PLpgSQL_var * ) (estate .datums [func -> tg_relname_varno ]);
544- var -> isnull = false;
545- var -> freeval = true;
546543var -> value = DirectFunctionCall1 (namein ,
547544CStringGetDatum (RelationGetRelationName (trigdata -> tg_relation )));
545+ var -> isnull = false;
546+ var -> freeval = true;
548547
549548var = (PLpgSQL_var * ) (estate .datums [func -> tg_nargs_varno ]);
549+ var -> value = Int16GetDatum (trigdata -> tg_trigger -> tgnargs );
550550var -> isnull = false;
551551var -> freeval = false;
552- var -> value = Int16GetDatum (trigdata -> tg_trigger -> tgnargs );
553552
554553/*
555554 * Store the actual call argument values into the special execution
@@ -712,6 +711,9 @@ plpgsql_exec_error_callback(void *arg)
712711
713712/* ----------
714713 * Support functions for copying local execution variables
714+ *
715+ * NB: this is not a generic copy operation because it assumes that any
716+ * pass-by-ref original values will live as long as the copy is needed.
715717 * ----------
716718 */
717719static PLpgSQL_datum *