summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dunstan2006-05-26 17:34:16 +0000
committerAndrew Dunstan2006-05-26 17:34:16 +0000
commit2837f095f1b1b08015c625cc30d615a7a38f8645 (patch)
treee046a25f898fa5470f5f1bb296950c2f1d3abb4e
parent47195b112fd625645f8df11dfac08acc9b7ace98 (diff)
Add table_name and table_schema to plperl trigger data. relname is
kept but now deprecated. Patch from Adam Sjøgren. Add regression test to show plperl trigger data (Andrew). TBD: apply similar changes to plpgsql, plpython and pltcl.
-rw-r--r--doc/src/sgml/plperl.sgml22
-rw-r--r--src/pl/plperl/expected/plperl_trigger.out89
-rw-r--r--src/pl/plperl/plperl.c6
-rw-r--r--src/pl/plperl/sql/plperl_trigger.sql58
4 files changed, 174 insertions, 1 deletions
diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml
index 76a3699aaf..596beca416 100644
--- a/doc/src/sgml/plperl.sgml
+++ b/doc/src/sgml/plperl.sgml
@@ -728,7 +728,7 @@ $$ LANGUAGE plperl;
</varlistentry>
<varlistentry>
- <term><literal>$_TD-&gt;{relname}</literal></term>
+ <term><literal>$_TD-&gt;{table_name}</literal></term>
<listitem>
<para>
Name of the table on which the trigger fired
@@ -737,6 +737,26 @@ $$ LANGUAGE plperl;
</varlistentry>
<varlistentry>
+ <term><literal>$_TD-&gt;{relname}</literal></term>
+ <listitem>
+ <para>
+ Name of the table on which the trigger fired. This has been deprecated,
+ and could be removed in a future release.
+ Please use $_TD-&gt;{table_name} instead.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>$_TD-&gt;{table_schema}</literal></term>
+ <listitem>
+ <para>
+ Name of the schema in which the table on which the trigger fired, is
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>$_TD-&gt;{argc}</literal></term>
<listitem>
<para>
diff --git a/src/pl/plperl/expected/plperl_trigger.out b/src/pl/plperl/expected/plperl_trigger.out
index 9c0bae9d36..48a4853e21 100644
--- a/src/pl/plperl/expected/plperl_trigger.out
+++ b/src/pl/plperl/expected/plperl_trigger.out
@@ -3,6 +3,95 @@ CREATE TABLE trigger_test (
i int,
v varchar
);
+CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger LANGUAGE plperl AS $$
+
+ # make sure keys are sorted for consistent results - perl no longer
+ # hashes in repeatable fashion across runs
+
+ foreach my $key (sort keys %$_TD)
+ {
+
+ my $val = $_TD->{$key};
+
+ # relid is variable, so we can not use it repeatably
+ $val = "bogus:12345" if $key eq 'relid';
+
+ if (! defined $val)
+ {
+ elog(NOTICE, "\$_TD->\{$key\} = NULL");
+ }
+ elsif (not ref $val)
+ {
+ elog(NOTICE, "\$_TD->\{$key\} = '$val'");
+ }
+ elsif (ref $val eq 'HASH')
+ {
+ my $str = "";
+ foreach my $rowkey (sort keys %$val)
+ {
+ $str .= ", " if $str;
+ my $rowval = $val->{$rowkey};
+ $str .= "'$rowkey' => '$rowval'";
+ }
+ elog(NOTICE, "\$_TD->\{$key\} = \{$str\}");
+ }
+ elsif (ref $val eq 'ARRAY')
+ {
+ my $str = "";
+ foreach my $argval (@$val)
+ {
+ $str .= ", " if $str;
+ $str .= "'$argval'";
+ }
+ elog(NOTICE, "\$_TD->\{$key\} = \[$str\]");
+ }
+ }
+ return undef; # allow statement to proceed;
+$$;
+CREATE TRIGGER show_trigger_data_trig
+BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
+FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
+insert into trigger_test values(1,'insert');
+NOTICE: $_TD->{argc} = '2'
+NOTICE: $_TD->{args} = ['23', 'skidoo']
+NOTICE: $_TD->{event} = 'INSERT'
+NOTICE: $_TD->{level} = 'ROW'
+NOTICE: $_TD->{name} = 'show_trigger_data_trig'
+NOTICE: $_TD->{new} = {'i' => '1', 'v' => 'insert'}
+NOTICE: $_TD->{relid} = 'bogus:12345'
+NOTICE: $_TD->{relname} = 'trigger_test'
+NOTICE: $_TD->{table_name} = 'trigger_test'
+NOTICE: $_TD->{table_schema} = 'public'
+NOTICE: $_TD->{when} = 'BEFORE'
+update trigger_test set v = 'update' where i = 1;
+NOTICE: $_TD->{argc} = '2'
+NOTICE: $_TD->{args} = ['23', 'skidoo']
+NOTICE: $_TD->{event} = 'UPDATE'
+NOTICE: $_TD->{level} = 'ROW'
+NOTICE: $_TD->{name} = 'show_trigger_data_trig'
+NOTICE: $_TD->{new} = {'i' => '1', 'v' => 'update'}
+NOTICE: $_TD->{old} = {'i' => '1', 'v' => 'insert'}
+NOTICE: $_TD->{relid} = 'bogus:12345'
+NOTICE: $_TD->{relname} = 'trigger_test'
+NOTICE: $_TD->{table_name} = 'trigger_test'
+NOTICE: $_TD->{table_schema} = 'public'
+NOTICE: $_TD->{when} = 'BEFORE'
+delete from trigger_test;
+NOTICE: $_TD->{argc} = '2'
+NOTICE: $_TD->{args} = ['23', 'skidoo']
+NOTICE: $_TD->{event} = 'DELETE'
+NOTICE: $_TD->{level} = 'ROW'
+NOTICE: $_TD->{name} = 'show_trigger_data_trig'
+NOTICE: $_TD->{old} = {'i' => '1', 'v' => 'update'}
+NOTICE: $_TD->{relid} = 'bogus:12345'
+NOTICE: $_TD->{relname} = 'trigger_test'
+NOTICE: $_TD->{table_name} = 'trigger_test'
+NOTICE: $_TD->{table_schema} = 'public'
+NOTICE: $_TD->{when} = 'BEFORE'
+
+DROP TRIGGER show_trigger_data_trig on trigger_test;
+
+DROP FUNCTION trigger_data();
CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$
if (($_TD->{new}{i}>=100) || ($_TD->{new}{i}<=0))
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index b53e933273..0bfd1306ec 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -525,6 +525,12 @@ plperl_trigger_build_args(FunctionCallInfo fcinfo)
hv_store(hv, "relname", 7,
newSVpv(SPI_getrelname(tdata->tg_relation), 0), 0);
+ hv_store(hv, "table_name", 10,
+ newSVpv(SPI_getrelname(tdata->tg_relation), 0), 0);
+
+ hv_store(hv, "table_schema", 12,
+ newSVpv(SPI_getnspname(tdata->tg_relation), 0), 0);
+
if (TRIGGER_FIRED_BEFORE(tdata->tg_event))
when = "BEFORE";
else if (TRIGGER_FIRED_AFTER(tdata->tg_event))
diff --git a/src/pl/plperl/sql/plperl_trigger.sql b/src/pl/plperl/sql/plperl_trigger.sql
index 34ce9c484a..c8042d67ff 100644
--- a/src/pl/plperl/sql/plperl_trigger.sql
+++ b/src/pl/plperl/sql/plperl_trigger.sql
@@ -5,6 +5,64 @@ CREATE TABLE trigger_test (
v varchar
);
+CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger LANGUAGE plperl AS $$
+
+ # make sure keys are sorted for consistent results - perl no longer
+ # hashes in repeatable fashion across runs
+
+ foreach my $key (sort keys %$_TD)
+ {
+
+ my $val = $_TD->{$key};
+
+ # relid is variable, so we can not use it repeatably
+ $val = "bogus:12345" if $key eq 'relid';
+
+ if (! defined $val)
+ {
+ elog(NOTICE, "\$_TD->\{$key\} = NULL");
+ }
+ elsif (not ref $val)
+ {
+ elog(NOTICE, "\$_TD->\{$key\} = '$val'");
+ }
+ elsif (ref $val eq 'HASH')
+ {
+ my $str = "";
+ foreach my $rowkey (sort keys %$val)
+ {
+ $str .= ", " if $str;
+ my $rowval = $val->{$rowkey};
+ $str .= "'$rowkey' => '$rowval'";
+ }
+ elog(NOTICE, "\$_TD->\{$key\} = \{$str\}");
+ }
+ elsif (ref $val eq 'ARRAY')
+ {
+ my $str = "";
+ foreach my $argval (@$val)
+ {
+ $str .= ", " if $str;
+ $str .= "'$argval'";
+ }
+ elog(NOTICE, "\$_TD->\{$key\} = \[$str\]");
+ }
+ }
+ return undef; # allow statement to proceed;
+$$;
+
+CREATE TRIGGER show_trigger_data_trig
+BEFORE INSERT OR UPDATE OR DELETE ON trigger_test
+FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
+
+insert into trigger_test values(1,'insert');
+update trigger_test set v = 'update' where i = 1;
+delete from trigger_test;
+
+DROP TRIGGER show_trigger_data_trig on trigger_test;
+
+DROP FUNCTION trigger_data();
+
CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$
if (($_TD->{new}{i}>=100) || ($_TD->{new}{i}<=0))