Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3a9ae3d

Browse files
committed
TG_table_name and TG_table_schema for plpgsql, plus docs and regression.
1 parent3d58a1c commit3a9ae3d

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
inttg_op_varno;
573573
inttg_relid_varno;
574574
inttg_relname_varno;
575+
inttg_table_name_varno;
576+
inttg_table_schema_varno;
575577
inttg_nargs_varno;
576578

577579
intndatums;

‎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
droptable trigtest2;
296296
droptable trigtest;
297+
298+
299+
-- dump trigger data
300+
CREATETABLEtrigger_test (
301+
iint,
302+
vvarchar
303+
);
304+
305+
CREATE OR REPLACEFUNCTIONtrigger_data() RETURNS trigger
306+
LANGUAGE plpgsqlAS $$
307+
308+
declare
309+
310+
argstrtext;
311+
relidtext;
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 iin0 .. 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+
CREATETRIGGERshow_trigger_data_trig
357+
BEFORE INSERTORUPDATEORDELETEON trigger_test
358+
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
359+
360+
insert into trigger_testvalues(1,'insert');
361+
update trigger_testset v='update'where i=1;
362+
deletefrom trigger_test;
363+
364+
DROPTRIGGER show_trigger_data_trigon trigger_test;
365+
366+
DROPFUNCTION trigger_data();
367+
368+
DROPTABLE trigger_test;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp