mirror of
https://github.com/postgres/postgres.git
synced 2025-08-25 20:23:07 +03:00
TG_table_name and TG_table_schema for pl/tcl, plus regression test and docs.
This commit is contained in:
@@ -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">
|
<chapter id="pltcl">
|
||||||
<title>PL/Tcl - Tcl Procedural Language</title>
|
<title>PL/Tcl - Tcl Procedural Language</title>
|
||||||
@@ -527,6 +527,26 @@ SELECT 'doesn''t' AS ret
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</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>
|
<varlistentry>
|
||||||
<term><varname>$TG_relatts</varname></term>
|
<term><varname>$TG_relatts</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@@ -183,3 +183,41 @@ select * from T_pkey2 order by key1 using @<, key2;
|
|||||||
2 | KEY2-9 | test key
|
2 | KEY2-9 | test key
|
||||||
(4 rows)
|
(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}
|
||||||
|
|
||||||
|
@@ -53,6 +53,43 @@ create function check_pkey1_exists(int4, bpchar) returns bool as E'
|
|||||||
}
|
}
|
||||||
return "f"
|
return "f"
|
||||||
' language pltcl;
|
' 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
|
-- Trigger function on every change to T_pkey1
|
||||||
--
|
--
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
* pltcl.c - PostgreSQL support for Tcl as
|
* pltcl.c - PostgreSQL support for Tcl as
|
||||||
* procedural language (PL)
|
* 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);
|
Tcl_DStringAppendElement(&tcl_cmd, stroid);
|
||||||
pfree(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 */
|
/* A list of attribute names for argument TG_relatts */
|
||||||
Tcl_DStringAppendElement(&tcl_trigtup, "");
|
Tcl_DStringAppendElement(&tcl_trigtup, "");
|
||||||
for (i = 0; i < tupdesc->natts; i++)
|
for (i = 0; i < tupdesc->natts; i++)
|
||||||
@@ -1142,7 +1152,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
|
|||||||
{
|
{
|
||||||
/* trigger procedure has fixed args */
|
/* trigger procedure has fixed args */
|
||||||
strcpy(proc_internal_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");
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
|
@@ -73,3 +73,11 @@ select 100 @< 4;
|
|||||||
select * from T_pkey1 order by key1 using @<, key2;
|
select * from T_pkey1 order by key1 using @<, key2;
|
||||||
select * from T_pkey2 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;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -61,6 +61,48 @@ create function check_pkey1_exists(int4, bpchar) returns bool as E'
|
|||||||
' language pltcl;
|
' 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
|
-- Trigger function on every change to T_pkey1
|
||||||
--
|
--
|
||||||
|
Reference in New Issue
Block a user