]> granicus.if.org Git - postgresql/commitdiff
TG_table_name and TG_table_schema for pl/tcl, plus regression test and docs.
authorAndrew Dunstan <andrew@dunslane.net>
Sat, 27 May 2006 20:24:16 +0000 (20:24 +0000)
committerAndrew Dunstan <andrew@dunslane.net>
Sat, 27 May 2006 20:24:16 +0000 (20:24 +0000)
doc/src/sgml/pltcl.sgml
src/pl/tcl/expected/pltcl_queries.out
src/pl/tcl/expected/pltcl_setup.out
src/pl/tcl/pltcl.c
src/pl/tcl/sql/pltcl_queries.sql
src/pl/tcl/sql/pltcl_setup.sql

index 2a12a5b26adcb8e6d65fd782a97bacce56f7bf93..3ffaf81fe5ee64762688ba37839e628ec25b7219 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/pltcl.sgml,v 2.39 2006/03/10 19:10:48 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/pltcl.sgml,v 2.40 2006/05/27 20:24:16 adunstan Exp $ -->
 
  <chapter id="pltcl">
   <title>PL/Tcl - Tcl Procedural Language</title>
@@ -527,6 +527,26 @@ SELECT 'doesn''t' AS ret
        </listitem>
       </varlistentry>
 
+      <varlistentry>
+       <term><varname>$TG_table_name</varname></term>
+       <listitem>
+        <para>
+         The name of the table that caused the trigger procedure
+         to be invoked.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term><varname>$TG_table_schema</varname></term>
+       <listitem>
+        <para>
+         The schema of the table that caused the trigger procedure
+         to be invoked.
+        </para>
+       </listitem>
+      </varlistentry>
+
       <varlistentry>
        <term><varname>$TG_relatts</varname></term>
        <listitem>
index 600b15821bc2160b492bd14404cc3bec86c338e5..6b02fb4b48f64555df915b758ad5cbe6c4a2663f 100644 (file)
@@ -183,3 +183,41 @@ select * from T_pkey2 order by key1 using @<, key2;
     2 | KEY2-9               | test key                                
 (4 rows)
 
+-- show dump of trigger data
+insert into trigger_test values(1,'insert');
+NOTICE:  NEW: {i: 1, v: insert}
+NOTICE:  OLD: {}
+NOTICE:  TG_level: ROW
+NOTICE:  TG_name: show_trigger_data_trig
+NOTICE:  TG_op: INSERT
+NOTICE:  TG_relatts: {{} i v}
+NOTICE:  TG_relid: bogus:12345
+NOTICE:  TG_table_name: trigger_test
+NOTICE:  TG_table_schema: public
+NOTICE:  TG_when: BEFORE
+NOTICE:  args: {23 skidoo}
+update trigger_test set v = 'update' where i = 1;
+NOTICE:  NEW: {i: 1, v: update}
+NOTICE:  OLD: {i: 1, v: insert}
+NOTICE:  TG_level: ROW
+NOTICE:  TG_name: show_trigger_data_trig
+NOTICE:  TG_op: UPDATE
+NOTICE:  TG_relatts: {{} i v}
+NOTICE:  TG_relid: bogus:12345
+NOTICE:  TG_table_name: trigger_test
+NOTICE:  TG_table_schema: public
+NOTICE:  TG_when: BEFORE
+NOTICE:  args: {23 skidoo}
+delete from trigger_test;
+NOTICE:  NEW: {}
+NOTICE:  OLD: {i: 1, v: update}
+NOTICE:  TG_level: ROW
+NOTICE:  TG_name: show_trigger_data_trig
+NOTICE:  TG_op: DELETE
+NOTICE:  TG_relatts: {{} i v}
+NOTICE:  TG_relid: bogus:12345
+NOTICE:  TG_table_name: trigger_test
+NOTICE:  TG_table_schema: public
+NOTICE:  TG_when: BEFORE
+NOTICE:  args: {23 skidoo}
+      
index 583fd4fe76ae553835c2222e84bc6f10426ec681..111d999af20e7daa7e5c4d2eab53c02778822581 100644 (file)
@@ -53,6 +53,43 @@ create function check_pkey1_exists(int4, bpchar) returns bool as E'
     }
     return "f"
 ' language pltcl;
+-- dump trigger data
+CREATE TABLE trigger_test
+    (i int, v text );
+CREATE FUNCTION trigger_data() returns trigger language pltcl as $_$
+
+       if { [info exists TG_relid] } {
+       set TG_relid "bogus:12345"
+       }
+
+       set dnames [info locals {[a-zA-Z]*} ]
+
+       foreach key [lsort $dnames] {
+    
+               if { [array exists $key] } { 
+                       set str "{"
+                       foreach akey [lsort [ array names $key ] ] {
+                               if {[string length $str] > 1} { set str "$str, " }
+                               set cmd "($akey)"
+                               set cmd "set val \$$key$cmd"
+                               eval $cmd
+                               set str "$str$akey: $val"
+                       }
+                       set str "$str}"
+               elog NOTICE "$key: $str"
+               } else {
+                       set val [eval list "\$$key" ]
+               elog NOTICE "$key: $val"
+               }
+       }
+
+
+       return OK  
+
+$_$;
+CREATE TRIGGER show_trigger_data_trig 
+BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
+FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
 --
 -- Trigger function on every change to T_pkey1
 --
index 07cbcc2eb315ab643d50fa7b8a6e33dfdfd70b0b..6705fd7ac6e8f20fd33155db1290d4ae6c54a76b 100644 (file)
@@ -2,7 +2,7 @@
  * pltcl.c             - PostgreSQL support for Tcl as
  *                               procedural language (PL)
  *
- *       $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.102 2006/04/04 19:35:37 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.103 2006/05/27 20:24:16 adunstan Exp $
  *
  **********************************************************************/
 
@@ -657,6 +657,16 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
                Tcl_DStringAppendElement(&tcl_cmd, stroid);
                pfree(stroid);
 
+               /* The name of the table the trigger is acting on: TG_table_name */
+        stroid = SPI_getrelname(trigdata->tg_relation);
+               Tcl_DStringAppendElement(&tcl_cmd, stroid);
+        pfree(stroid);
+               
+               /* The schema of the table the trigger is acting on: TG_table_schema */
+        stroid = SPI_getnspname(trigdata->tg_relation);
+               Tcl_DStringAppendElement(&tcl_cmd, stroid);
+        pfree(stroid);
+               
                /* A list of attribute names for argument TG_relatts */
                Tcl_DStringAppendElement(&tcl_trigtup, "");
                for (i = 0; i < tupdesc->natts; i++)
@@ -1142,7 +1152,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
                {
                        /* trigger procedure has fixed args */
                        strcpy(proc_internal_args,
-                                  "TG_name TG_relid TG_relatts TG_when TG_level TG_op __PLTcl_Tup_NEW __PLTcl_Tup_OLD args");
+                                  "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");
                }
 
                /************************************************************
index 9cb059ed15f8a946a48d87fa43b4b23e00218bc2..cc8b46842cdb0e6ff60e3ac7b94fbe9cd786f201 100644 (file)
@@ -73,3 +73,11 @@ select 100 @< 4;
 select * from T_pkey1 order by key1 using @<, key2;
 select * from T_pkey2 order by key1 using @<, key2;
 
+
+-- show dump of trigger data
+insert into trigger_test values(1,'insert');
+update trigger_test set v = 'update' where i = 1;
+delete from trigger_test;
+      
+
+
index b57a77880e3ee6f7961870fa364a9b2b61419669..062c9f195726950a883bc0754b0342c5a56351b1 100644 (file)
@@ -61,6 +61,48 @@ create function check_pkey1_exists(int4, bpchar) returns bool as E'
 ' language pltcl;
 
 
+-- dump trigger data
+
+CREATE TABLE trigger_test
+    (i int, v text );
+
+CREATE FUNCTION trigger_data() returns trigger language pltcl as $_$
+
+       if { [info exists TG_relid] } {
+       set TG_relid "bogus:12345"
+       }
+
+       set dnames [info locals {[a-zA-Z]*} ]
+
+       foreach key [lsort $dnames] {
+    
+               if { [array exists $key] } { 
+                       set str "{"
+                       foreach akey [lsort [ array names $key ] ] {
+                               if {[string length $str] > 1} { set str "$str, " }
+                               set cmd "($akey)"
+                               set cmd "set val \$$key$cmd"
+                               eval $cmd
+                               set str "$str$akey: $val"
+                       }
+                       set str "$str}"
+               elog NOTICE "$key: $str"
+               } else {
+                       set val [eval list "\$$key" ]
+               elog NOTICE "$key: $val"
+               }
+       }
+
+
+       return OK  
+
+$_$;
+
+CREATE TRIGGER show_trigger_data_trig 
+BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
+FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
+
+
 --
 -- Trigger function on every change to T_pkey1
 --