Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 22b118b

Browse files
committed
TG_table_name and TG_table_schema for pl/tcl, plus regression test and docs.
1 parent 4627a8f commit 22b118b

File tree

6 files changed

+158
-3
lines changed

6 files changed

+158
-3
lines changed

doc/src/sgml/pltcl.sgml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- $PostgreSQL: pgsql/doc/src/sgml/pltcl.sgml,v 2.39 2006/03/10 19:10:48 momjian Exp $ -->
1+
<!-- $PostgreSQL: pgsql/doc/src/sgml/pltcl.sgml,v 2.40 2006/05/27 20:24:16 adunstan Exp $ -->
22

33
<chapter id="pltcl">
44
<title>PL/Tcl - Tcl Procedural Language</title>
@@ -527,6 +527,26 @@ SELECT 'doesn''t' AS ret
527527
</listitem>
528528
</varlistentry>
529529

530+
<varlistentry>
531+
<term><varname>$TG_table_name</varname></term>
532+
<listitem>
533+
<para>
534+
The name of the table that caused the trigger procedure
535+
to be invoked.
536+
</para>
537+
</listitem>
538+
</varlistentry>
539+
540+
<varlistentry>
541+
<term><varname>$TG_table_schema</varname></term>
542+
<listitem>
543+
<para>
544+
The schema of the table that caused the trigger procedure
545+
to be invoked.
546+
</para>
547+
</listitem>
548+
</varlistentry>
549+
530550
<varlistentry>
531551
<term><varname>$TG_relatts</varname></term>
532552
<listitem>

src/pl/tcl/expected/pltcl_queries.out

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,41 @@ select * from T_pkey2 order by key1 using @<, key2;
183183
2 | KEY2-9 | test key
184184
(4 rows)
185185

186+
-- show dump of trigger data
187+
insert into trigger_test values(1,'insert');
188+
NOTICE: NEW: {i: 1, v: insert}
189+
NOTICE: OLD: {}
190+
NOTICE: TG_level: ROW
191+
NOTICE: TG_name: show_trigger_data_trig
192+
NOTICE: TG_op: INSERT
193+
NOTICE: TG_relatts: {{} i v}
194+
NOTICE: TG_relid: bogus:12345
195+
NOTICE: TG_table_name: trigger_test
196+
NOTICE: TG_table_schema: public
197+
NOTICE: TG_when: BEFORE
198+
NOTICE: args: {23 skidoo}
199+
update trigger_test set v = 'update' where i = 1;
200+
NOTICE: NEW: {i: 1, v: update}
201+
NOTICE: OLD: {i: 1, v: insert}
202+
NOTICE: TG_level: ROW
203+
NOTICE: TG_name: show_trigger_data_trig
204+
NOTICE: TG_op: UPDATE
205+
NOTICE: TG_relatts: {{} i v}
206+
NOTICE: TG_relid: bogus:12345
207+
NOTICE: TG_table_name: trigger_test
208+
NOTICE: TG_table_schema: public
209+
NOTICE: TG_when: BEFORE
210+
NOTICE: args: {23 skidoo}
211+
delete from trigger_test;
212+
NOTICE: NEW: {}
213+
NOTICE: OLD: {i: 1, v: update}
214+
NOTICE: TG_level: ROW
215+
NOTICE: TG_name: show_trigger_data_trig
216+
NOTICE: TG_op: DELETE
217+
NOTICE: TG_relatts: {{} i v}
218+
NOTICE: TG_relid: bogus:12345
219+
NOTICE: TG_table_name: trigger_test
220+
NOTICE: TG_table_schema: public
221+
NOTICE: TG_when: BEFORE
222+
NOTICE: args: {23 skidoo}
223+

src/pl/tcl/expected/pltcl_setup.out

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,43 @@ create function check_pkey1_exists(int4, bpchar) returns bool as E'
5353
}
5454
return "f"
5555
' language pltcl;
56+
-- dump trigger data
57+
CREATE TABLE trigger_test
58+
(i int, v text );
59+
CREATE FUNCTION trigger_data() returns trigger language pltcl as $_$
60+
61+
if { [info exists TG_relid] } {
62+
set TG_relid "bogus:12345"
63+
}
64+
65+
set dnames [info locals {[a-zA-Z]*} ]
66+
67+
foreach key [lsort $dnames] {
68+
69+
if { [array exists $key] } {
70+
set str "{"
71+
foreach akey [lsort [ array names $key ] ] {
72+
if {[string length $str] > 1} { set str "$str, " }
73+
set cmd "($akey)"
74+
set cmd "set val \$$key$cmd"
75+
eval $cmd
76+
set str "$str$akey: $val"
77+
}
78+
set str "$str}"
79+
elog NOTICE "$key: $str"
80+
} else {
81+
set val [eval list "\$$key" ]
82+
elog NOTICE "$key: $val"
83+
}
84+
}
85+
86+
87+
return OK
88+
89+
$_$;
90+
CREATE TRIGGER show_trigger_data_trig
91+
BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
92+
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
5693
--
5794
-- Trigger function on every change to T_pkey1
5895
--

src/pl/tcl/pltcl.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* pltcl.c - PostgreSQL support for Tcl as
33
* procedural language (PL)
44
*
5-
* $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.102 2006/04/04 19:35:37 tgl Exp $
5+
* $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.103 2006/05/27 20:24:16 adunstan Exp $
66
*
77
**********************************************************************/
88

@@ -657,6 +657,16 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
657657
Tcl_DStringAppendElement(&tcl_cmd, stroid);
658658
pfree(stroid);
659659

660+
/* The name of the table the trigger is acting on: TG_table_name */
661+
stroid = SPI_getrelname(trigdata->tg_relation);
662+
Tcl_DStringAppendElement(&tcl_cmd, stroid);
663+
pfree(stroid);
664+
665+
/* The schema of the table the trigger is acting on: TG_table_schema */
666+
stroid = SPI_getnspname(trigdata->tg_relation);
667+
Tcl_DStringAppendElement(&tcl_cmd, stroid);
668+
pfree(stroid);
669+
660670
/* A list of attribute names for argument TG_relatts */
661671
Tcl_DStringAppendElement(&tcl_trigtup, "");
662672
for (i = 0; i < tupdesc->natts; i++)
@@ -1142,7 +1152,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
11421152
{
11431153
/* trigger procedure has fixed args */
11441154
strcpy(proc_internal_args,
1145-
"TG_name TG_relid TG_relatts TG_when TG_level TG_op __PLTcl_Tup_NEW __PLTcl_Tup_OLD args");
1155+
"TG_name TG_relid TG_table_name TG_table_schema TG_relatts TG_when TG_level TG_op __PLTcl_Tup_NEW __PLTcl_Tup_OLD args");
11461156
}
11471157

11481158
/************************************************************

src/pl/tcl/sql/pltcl_queries.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,11 @@ select 100 @< 4;
7373
select * from T_pkey1 order by key1 using @<, key2;
7474
select * from T_pkey2 order by key1 using @<, key2;
7575

76+
77+
-- show dump of trigger data
78+
insert into trigger_test values(1,'insert');
79+
update trigger_test set v = 'update' where i = 1;
80+
delete from trigger_test;
81+
82+
83+

src/pl/tcl/sql/pltcl_setup.sql

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,48 @@ create function check_pkey1_exists(int4, bpchar) returns bool as E'
6161
' language pltcl;
6262

6363

64+
-- dump trigger data
65+
66+
CREATE TABLE trigger_test
67+
(i int, v text );
68+
69+
CREATE FUNCTION trigger_data() returns trigger language pltcl as $_$
70+
71+
if { [info exists TG_relid] } {
72+
set TG_relid "bogus:12345"
73+
}
74+
75+
set dnames [info locals {[a-zA-Z]*} ]
76+
77+
foreach key [lsort $dnames] {
78+
79+
if { [array exists $key] } {
80+
set str "{"
81+
foreach akey [lsort [ array names $key ] ] {
82+
if {[string length $str] > 1} { set str "$str, " }
83+
set cmd "($akey)"
84+
set cmd "set val \$$key$cmd"
85+
eval $cmd
86+
set str "$str$akey: $val"
87+
}
88+
set str "$str}"
89+
elog NOTICE "$key: $str"
90+
} else {
91+
set val [eval list "\$$key" ]
92+
elog NOTICE "$key: $val"
93+
}
94+
}
95+
96+
97+
return OK
98+
99+
$_$;
100+
101+
CREATE TRIGGER show_trigger_data_trig
102+
BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
103+
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
104+
105+
64106
--
65107
-- Trigger function on every change to T_pkey1
66108
--

0 commit comments

Comments
 (0)