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

Lines changed: 23 additions & 2 deletions
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

Lines changed: 15 additions & 1 deletion
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

Lines changed: 16 additions & 1 deletion
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 100 additions & 0 deletions
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

Lines changed: 72 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy