Skip to content

Commit 3a9ae3d

Browse files
committed
TG_table_name and TG_table_schema for plpgsql, plus docs and regression.
1 parent 3d58a1c commit 3a9ae3d

File tree

6 files changed

+229
-5
lines changed

6 files changed

+229
-5
lines changed

doc/src/sgml/plpgsql.sgml

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- $PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.88 2006/03/10 19:10:48 momjian Exp $ -->
1+
<!-- $PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.89 2006/05/28 03:03:17 adunstan Exp $ -->
22

33
<chapter id="plpgsql">
44
<title><application>PL/pgSQL</application> - <acronym>SQL</acronym> Procedural Language</title>
@@ -2745,7 +2745,28 @@ RAISE EXCEPTION 'Nonexistent ID --> %', user_id;
27452745
<listitem>
27462746
<para>
27472747
Data type <type>name</type>; the name of the table that caused the trigger
2748-
invocation.
2748+
invocation. This is now deprecated, and could disappear in a future
2749+
release. Use <literal>TG_TABLE_NAME</> instead.
2750+
</para>
2751+
</listitem>
2752+
</varlistentry>
2753+
2754+
<varlistentry>
2755+
<term><varname>TG_TABLE_NAME</varname></term>
2756+
<listitem>
2757+
<para>
2758+
Data type <type>name</type>; the name of the table that
2759+
caused the trigger invocation.
2760+
</para>
2761+
</listitem>
2762+
</varlistentry>
2763+
2764+
<varlistentry>
2765+
<term><varname>TG_TABLE_SCHEMA</varname></term>
2766+
<listitem>
2767+
<para>
2768+
Data type <type>name</type>; the name of the schema of the
2769+
table that caused the trigger invocation.
27492770
</para>
27502771
</listitem>
27512772
</varlistentry>

src/pl/plpgsql/src/pl_comp.c

+15-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.101 2006/03/14 22:48:23 tgl Exp $
11+
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.102 2006/05/28 03:03:17 adunstan Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -581,6 +581,20 @@ do_compile(FunctionCallInfo fcinfo,
581581
true);
582582
function->tg_relname_varno = var->dno;
583583

584+
/* tg_table_name is now preferred to tg_relname */
585+
var = plpgsql_build_variable("tg_table_name", 0,
586+
plpgsql_build_datatype(NAMEOID, -1),
587+
true);
588+
function->tg_table_name_varno = var->dno;
589+
590+
591+
/* add variable tg_table_schema */
592+
var = plpgsql_build_variable("tg_table_schema", 0,
593+
plpgsql_build_datatype(NAMEOID, -1),
594+
true);
595+
function->tg_table_schema_varno = var->dno;
596+
597+
584598
/* Add the variable tg_nargs */
585599
var = plpgsql_build_variable("tg_nargs", 0,
586600
plpgsql_build_datatype(INT4OID, -1),

src/pl/plpgsql/src/pl_exec.c

+16-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.164 2006/04/22 01:26:01 tgl Exp $
11+
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.165 2006/05/28 03:03:17 adunstan Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -539,6 +539,21 @@ plpgsql_exec_trigger(PLpgSQL_function *func,
539539
var->isnull = false;
540540
var->freeval = true;
541541

542+
var = (PLpgSQL_var *) (estate.datums[func->tg_table_name_varno]);
543+
var->value = DirectFunctionCall1(namein,
544+
CStringGetDatum(RelationGetRelationName(trigdata->tg_relation)));
545+
var->isnull = false;
546+
var->freeval = true;
547+
548+
var = (PLpgSQL_var *) (estate.datums[func->tg_table_schema_varno]);
549+
var->value = DirectFunctionCall1(namein,
550+
CStringGetDatum(
551+
get_namespace_name(
552+
RelationGetNamespace(
553+
trigdata->tg_relation))));
554+
var->isnull = false;
555+
var->freeval = true;
556+
542557
var = (PLpgSQL_var *) (estate.datums[func->tg_nargs_varno]);
543558
var->value = Int16GetDatum(trigdata->tg_trigger->tgnargs);
544559
var->isnull = false;

src/pl/plpgsql/src/plpgsql.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.69 2006/03/09 21:29:38 momjian Exp $
11+
* $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.70 2006/05/28 03:03:17 adunstan Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -572,6 +572,8 @@ typedef struct PLpgSQL_function
572572
int tg_op_varno;
573573
int tg_relid_varno;
574574
int tg_relname_varno;
575+
int tg_table_name_varno;
576+
int tg_table_schema_varno;
575577
int tg_nargs_varno;
576578

577579
int ndatums;

src/test/regress/expected/triggers.out

+100
Original file line numberDiff line numberDiff line change
@@ -386,3 +386,103 @@ select * from trigtest;
386386

387387
drop table trigtest2;
388388
drop table trigtest;
389+
-- dump trigger data
390+
CREATE TABLE trigger_test (
391+
i int,
392+
v varchar
393+
);
394+
CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger
395+
LANGUAGE plpgsql AS $$
396+
397+
declare
398+
399+
argstr text;
400+
relid text;
401+
402+
begin
403+
404+
relid := TG_relid::regclass;
405+
406+
-- plpgsql can't discover it's trigger data in a hash like perl and python
407+
-- can, or by a sort of reflection like tcl can,
408+
-- so we have to hard code the names.
409+
raise NOTICE 'TG_NAME: %', TG_name;
410+
raise NOTICE 'TG_WHEN: %', TG_when;
411+
raise NOTICE 'TG_LEVEL: %', TG_level;
412+
raise NOTICE 'TG_OP: %', TG_op;
413+
raise NOTICE 'TG_RELID::regclass: %', relid;
414+
raise NOTICE 'TG_RELNAME: %', TG_relname;
415+
raise NOTICE 'TG_TABLE_NAME: %', TG_table_name;
416+
raise NOTICE 'TG_TABLE_SCHEMA: %', TG_table_schema;
417+
raise NOTICE 'TG_NARGS: %', TG_nargs;
418+
419+
argstr := '[';
420+
for i in 0 .. TG_nargs - 1 loop
421+
if i > 0 then
422+
argstr := argstr || ', ';
423+
end if;
424+
argstr := argstr || TG_argv[i];
425+
end loop;
426+
argstr := argstr || ']';
427+
raise NOTICE 'TG_ARGV: %', argstr;
428+
429+
if TG_OP != 'INSERT' then
430+
raise NOTICE 'OLD: %', OLD;
431+
end if;
432+
433+
if TG_OP != 'DELETE' then
434+
raise NOTICE 'NEW: %', NEW;
435+
end if;
436+
if TG_OP = 'DELETE' then
437+
return OLD;
438+
else
439+
return NEW;
440+
end if;
441+
442+
end;
443+
$$;
444+
CREATE TRIGGER show_trigger_data_trig
445+
BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
446+
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
447+
insert into trigger_test values(1,'insert');
448+
NOTICE: TG_NAME: show_trigger_data_trig
449+
NOTICE: TG_WHEN: BEFORE
450+
NOTICE: TG_LEVEL: ROW
451+
NOTICE: TG_OP: INSERT
452+
NOTICE: TG_RELID::regclass: trigger_test
453+
NOTICE: TG_RELNAME: trigger_test
454+
NOTICE: TG_TABLE_NAME: trigger_test
455+
NOTICE: TG_TABLE_SCHEMA: public
456+
NOTICE: TG_NARGS: 2
457+
NOTICE: TG_ARGV: [23, skidoo]
458+
NOTICE: NEW: (1,insert)
459+
update trigger_test set v = 'update' where i = 1;
460+
NOTICE: TG_NAME: show_trigger_data_trig
461+
NOTICE: TG_WHEN: BEFORE
462+
NOTICE: TG_LEVEL: ROW
463+
NOTICE: TG_OP: UPDATE
464+
NOTICE: TG_RELID::regclass: trigger_test
465+
NOTICE: TG_RELNAME: trigger_test
466+
NOTICE: TG_TABLE_NAME: trigger_test
467+
NOTICE: TG_TABLE_SCHEMA: public
468+
NOTICE: TG_NARGS: 2
469+
NOTICE: TG_ARGV: [23, skidoo]
470+
NOTICE: OLD: (1,insert)
471+
NOTICE: NEW: (1,update)
472+
delete from trigger_test;
473+
NOTICE: TG_NAME: show_trigger_data_trig
474+
NOTICE: TG_WHEN: BEFORE
475+
NOTICE: TG_LEVEL: ROW
476+
NOTICE: TG_OP: DELETE
477+
NOTICE: TG_RELID::regclass: trigger_test
478+
NOTICE: TG_RELNAME: trigger_test
479+
NOTICE: TG_TABLE_NAME: trigger_test
480+
NOTICE: TG_TABLE_SCHEMA: public
481+
NOTICE: TG_NARGS: 2
482+
NOTICE: TG_ARGV: [23, skidoo]
483+
NOTICE: OLD: (1,update)
484+
485+
DROP TRIGGER show_trigger_data_trig on trigger_test;
486+
487+
DROP FUNCTION trigger_data();
488+
DROP TABLE trigger_test;

src/test/regress/sql/triggers.sql

+72
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,75 @@ insert into trigtest default values;
294294
select * from trigtest;
295295
drop table trigtest2;
296296
drop table trigtest;
297+
298+
299+
-- dump trigger data
300+
CREATE TABLE trigger_test (
301+
i int,
302+
v varchar
303+
);
304+
305+
CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger
306+
LANGUAGE plpgsql AS $$
307+
308+
declare
309+
310+
argstr text;
311+
relid text;
312+
313+
begin
314+
315+
relid := TG_relid::regclass;
316+
317+
-- plpgsql can't discover it's trigger data in a hash like perl and python
318+
-- can, or by a sort of reflection like tcl can,
319+
-- so we have to hard code the names.
320+
raise NOTICE 'TG_NAME: %', TG_name;
321+
raise NOTICE 'TG_WHEN: %', TG_when;
322+
raise NOTICE 'TG_LEVEL: %', TG_level;
323+
raise NOTICE 'TG_OP: %', TG_op;
324+
raise NOTICE 'TG_RELID::regclass: %', relid;
325+
raise NOTICE 'TG_RELNAME: %', TG_relname;
326+
raise NOTICE 'TG_TABLE_NAME: %', TG_table_name;
327+
raise NOTICE 'TG_TABLE_SCHEMA: %', TG_table_schema;
328+
raise NOTICE 'TG_NARGS: %', TG_nargs;
329+
330+
argstr := '[';
331+
for i in 0 .. TG_nargs - 1 loop
332+
if i > 0 then
333+
argstr := argstr || ', ';
334+
end if;
335+
argstr := argstr || TG_argv[i];
336+
end loop;
337+
argstr := argstr || ']';
338+
raise NOTICE 'TG_ARGV: %', argstr;
339+
340+
if TG_OP != 'INSERT' then
341+
raise NOTICE 'OLD: %', OLD;
342+
end if;
343+
344+
if TG_OP != 'DELETE' then
345+
raise NOTICE 'NEW: %', NEW;
346+
end if;
347+
if TG_OP = 'DELETE' then
348+
return OLD;
349+
else
350+
return NEW;
351+
end if;
352+
353+
end;
354+
$$;
355+
356+
CREATE TRIGGER show_trigger_data_trig
357+
BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
358+
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
359+
360+
insert into trigger_test values(1,'insert');
361+
update trigger_test set v = 'update' where i = 1;
362+
delete from trigger_test;
363+
364+
DROP TRIGGER show_trigger_data_trig on trigger_test;
365+
366+
DROP FUNCTION trigger_data();
367+
368+
DROP TABLE trigger_test;

0 commit comments

Comments
 (0)