Skip to content

Commit 0a63f99

Browse files
committed
Change PROCEDURE to FUNCTION in CREATE TRIGGER syntax
Since procedures are now a different thing from functions, change the CREATE TRIGGER and CREATE EVENT TRIGGER syntax to use FUNCTION in the clause that specifies the function. PROCEDURE is still accepted for compatibility. pg_dump and ruleutils.c output is not changed yet, because that would require a change in information_schema.sql and thus a catversion change. Reported-by: Peter Geoghegan <pg@bowt.ie> Reviewed-by: Jonathan S. Katz <jonathan.katz@excoventures.com>
1 parent d127828 commit 0a63f99

File tree

16 files changed

+62
-41
lines changed

16 files changed

+62
-41
lines changed

doc/src/sgml/ddl.sgml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3580,7 +3580,7 @@ LANGUAGE plpgsql;
35803580
<programlisting>
35813581
CREATE TRIGGER insert_measurement_trigger
35823582
BEFORE INSERT ON measurement
3583-
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
3583+
FOR EACH ROW EXECUTE FUNCTION measurement_insert_trigger();
35843584
</programlisting>
35853585

35863586
We must redefine the trigger function each month so that it always

doc/src/sgml/event-trigger.sgml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ CREATE FUNCTION noddl() RETURNS event_trigger
10441044
AS 'noddl' LANGUAGE C;
10451045

10461046
CREATE EVENT TRIGGER noddl ON ddl_command_start
1047-
EXECUTE PROCEDURE noddl();
1047+
EXECUTE FUNCTION noddl();
10481048
</programlisting>
10491049
</para>
10501050

@@ -1129,7 +1129,7 @@ $$;
11291129

11301130
CREATE EVENT TRIGGER no_rewrite_allowed
11311131
ON table_rewrite
1132-
EXECUTE PROCEDURE no_rewrite();
1132+
EXECUTE FUNCTION no_rewrite();
11331133
</programlisting>
11341134
</para>
11351135
</sect1>

doc/src/sgml/func.sgml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20594,7 +20594,7 @@ SELECT (pg_stat_file('filename')).modification;
2059420594
<programlisting>
2059520595
CREATE TRIGGER z_min_update
2059620596
BEFORE UPDATE ON tablename
20597-
FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger();
20597+
FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();
2059820598
</programlisting>
2059920599
In most cases, you would want to fire this trigger last for each row.
2060020600
Bearing in mind that triggers fire in name order, you would then
@@ -20846,7 +20846,7 @@ END
2084620846
$$;
2084720847
CREATE EVENT TRIGGER test_event_trigger_for_drops
2084820848
ON sql_drop
20849-
EXECUTE PROCEDURE test_event_trigger_for_drops();
20849+
EXECUTE FUNCTION test_event_trigger_for_drops();
2085020850
</programlisting>
2085120851
</para>
2085220852
</sect2>
@@ -20911,7 +20911,7 @@ $$;
2091120911

2091220912
CREATE EVENT TRIGGER test_table_rewrite_oid
2091320913
ON table_rewrite
20914-
EXECUTE PROCEDURE test_event_trigger_table_rewrite_oid();
20914+
EXECUTE FUNCTION test_event_trigger_table_rewrite_oid();
2091520915
</programlisting>
2091620916
</para>
2091720917
</sect2>

doc/src/sgml/information_schema.sgml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5793,7 +5793,7 @@ ORDER BY c.ordinal_position;
57935793
<entry><type>character_data</type></entry>
57945794
<entry>
57955795
Statement that is executed by the trigger (currently always
5796-
<literal>EXECUTE PROCEDURE
5796+
<literal>EXECUTE FUNCTION
57975797
<replaceable>function</replaceable>(...)</literal>)
57985798
</entry>
57995799
</row>

doc/src/sgml/lo.sgml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
CREATE TABLE image (title text, raster lo);
7171

7272
CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON image
73-
FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster);
73+
FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);
7474
</programlisting>
7575

7676
<para>

doc/src/sgml/plperl.sgml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,7 @@ $$ LANGUAGE plperl;
13001300

13011301
CREATE TRIGGER test_valid_id_trig
13021302
BEFORE INSERT OR UPDATE ON test
1303-
FOR EACH ROW EXECUTE PROCEDURE valid_id();
1303+
FOR EACH ROW EXECUTE FUNCTION valid_id();
13041304
</programlisting>
13051305
</para>
13061306
</sect1>
@@ -1350,7 +1350,7 @@ $$ LANGUAGE plperl;
13501350

13511351
CREATE EVENT TRIGGER perl_a_snitch
13521352
ON ddl_command_start
1353-
EXECUTE PROCEDURE perlsnitch();
1353+
EXECUTE FUNCTION perlsnitch();
13541354
</programlisting>
13551355
</para>
13561356
</sect1>

doc/src/sgml/plpgsql.sgml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4069,7 +4069,7 @@ CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
40694069
$emp_stamp$ LANGUAGE plpgsql;
40704070

40714071
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
4072-
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
4072+
FOR EACH ROW EXECUTE FUNCTION emp_stamp();
40734073
</programlisting>
40744074
</example>
40754075

@@ -4124,7 +4124,7 @@ $emp_audit$ LANGUAGE plpgsql;
41244124

41254125
CREATE TRIGGER emp_audit
41264126
AFTER INSERT OR UPDATE OR DELETE ON emp
4127-
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
4127+
FOR EACH ROW EXECUTE FUNCTION process_emp_audit();
41284128
</programlisting>
41294129
</example>
41304130

@@ -4203,7 +4203,7 @@ $$ LANGUAGE plpgsql;
42034203

42044204
CREATE TRIGGER emp_audit
42054205
INSTEAD OF INSERT OR UPDATE OR DELETE ON emp_view
4206-
FOR EACH ROW EXECUTE PROCEDURE update_emp_view();
4206+
FOR EACH ROW EXECUTE FUNCTION update_emp_view();
42074207
</programlisting>
42084208
</example>
42094209

@@ -4348,7 +4348,7 @@ $maint_sales_summary_bytime$ LANGUAGE plpgsql;
43484348

43494349
CREATE TRIGGER maint_sales_summary_bytime
43504350
AFTER INSERT OR UPDATE OR DELETE ON sales_fact
4351-
FOR EACH ROW EXECUTE PROCEDURE maint_sales_summary_bytime();
4351+
FOR EACH ROW EXECUTE FUNCTION maint_sales_summary_bytime();
43524352

43534353
INSERT INTO sales_fact VALUES(1,1,1,10,3,15);
43544354
INSERT INTO sales_fact VALUES(1,2,1,20,5,35);
@@ -4425,15 +4425,15 @@ $emp_audit$ LANGUAGE plpgsql;
44254425
CREATE TRIGGER emp_audit_ins
44264426
AFTER INSERT ON emp
44274427
REFERENCING NEW TABLE AS new_table
4428-
FOR EACH STATEMENT EXECUTE PROCEDURE process_emp_audit();
4428+
FOR EACH STATEMENT EXECUTE FUNCTION process_emp_audit();
44294429
CREATE TRIGGER emp_audit_upd
44304430
AFTER UPDATE ON emp
44314431
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
4432-
FOR EACH STATEMENT EXECUTE PROCEDURE process_emp_audit();
4432+
FOR EACH STATEMENT EXECUTE FUNCTION process_emp_audit();
44334433
CREATE TRIGGER emp_audit_del
44344434
AFTER DELETE ON emp
44354435
REFERENCING OLD TABLE AS old_table
4436-
FOR EACH STATEMENT EXECUTE PROCEDURE process_emp_audit();
4436+
FOR EACH STATEMENT EXECUTE FUNCTION process_emp_audit();
44374437
</programlisting>
44384438
</example>
44394439

@@ -4498,7 +4498,7 @@ BEGIN
44984498
END;
44994499
$$ LANGUAGE plpgsql;
45004500

4501-
CREATE EVENT TRIGGER snitch ON ddl_command_start EXECUTE PROCEDURE snitch();
4501+
CREATE EVENT TRIGGER snitch ON ddl_command_start EXECUTE FUNCTION snitch();
45024502
</programlisting>
45034503
</example>
45044504
</sect2>

doc/src/sgml/pltcl.sgml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ $$ LANGUAGE pltcl;
789789
CREATE TABLE mytab (num integer, description text, modcnt integer);
790790

791791
CREATE TRIGGER trig_mytab_modcount BEFORE INSERT OR UPDATE ON mytab
792-
FOR EACH ROW EXECUTE PROCEDURE trigfunc_modcount('modcnt');
792+
FOR EACH ROW EXECUTE FUNCTION trigfunc_modcount('modcnt');
793793
</programlisting>
794794

795795
Notice that the trigger function itself does not know the column
@@ -852,7 +852,7 @@ CREATE OR REPLACE FUNCTION tclsnitch() RETURNS event_trigger AS $$
852852
elog NOTICE "tclsnitch: $TG_event $TG_tag"
853853
$$ LANGUAGE pltcl;
854854

855-
CREATE EVENT TRIGGER tcl_a_snitch ON ddl_command_start EXECUTE PROCEDURE tclsnitch();
855+
CREATE EVENT TRIGGER tcl_a_snitch ON ddl_command_start EXECUTE FUNCTION tclsnitch();
856856
</programlisting>
857857
</para>
858858
</sect1>

doc/src/sgml/ref/create_event_trigger.sgml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ PostgreSQL documentation
2424
CREATE EVENT TRIGGER <replaceable class="parameter">name</replaceable>
2525
ON <replaceable class="parameter">event</replaceable>
2626
[ WHEN <replaceable class="parameter">filter_variable</replaceable> IN (filter_value [, ... ]) [ AND ... ] ]
27-
EXECUTE PROCEDURE <replaceable class="parameter">function_name</replaceable>()
27+
EXECUTE { FUNCTION | PROCEDURE } <replaceable class="parameter">function_name</replaceable>()
2828
</synopsis>
2929
</refsynopsisdiv>
3030

@@ -98,6 +98,14 @@ CREATE EVENT TRIGGER <replaceable class="parameter">name</replaceable>
9898
A user-supplied function that is declared as taking no argument and
9999
returning type <literal>event_trigger</literal>.
100100
</para>
101+
102+
<para>
103+
In the syntax of <literal>CREATE EVENT TRIGGER</literal>, the keywords
104+
<literal>FUNCTION</literal> and <literal>PROCEDURE</literal> are
105+
equivalent, but the referenced function must in any case be a function,
106+
not a procedure. The use of the keyword <literal>PROCEDURE</literal>
107+
here is historical and deprecated.
108+
</para>
101109
</listitem>
102110
</varlistentry>
103111

@@ -136,7 +144,7 @@ END;
136144
$$;
137145

138146
CREATE EVENT TRIGGER abort_ddl ON ddl_command_start
139-
EXECUTE PROCEDURE abort_any_command();
147+
EXECUTE FUNCTION abort_any_command();
140148
</programlisting></para>
141149
</refsect1>
142150

doc/src/sgml/ref/create_trigger.sgml

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ CREATE [ CONSTRAINT ] TRIGGER <replaceable class="parameter">name</replaceable>
3333
[ REFERENCING { { OLD | NEW } TABLE [ AS ] <replaceable class="parameter">transition_relation_name</replaceable> } [ ... ] ]
3434
[ FOR [ EACH ] { ROW | STATEMENT } ]
3535
[ WHEN ( <replaceable class="parameter">condition</replaceable> ) ]
36-
EXECUTE PROCEDURE <replaceable class="parameter">function_name</replaceable> ( <replaceable class="parameter">arguments</replaceable> )
36+
EXECUTE { FUNCTION | PROCEDURE } <replaceable class="parameter">function_name</replaceable> ( <replaceable class="parameter">arguments</replaceable> )
3737

3838
<phrase>where <replaceable class="parameter">event</replaceable> can be one of:</phrase>
3939

@@ -401,6 +401,14 @@ UPDATE OF <replaceable>column_name1</replaceable> [, <replaceable>column_name2</
401401
and returning type <literal>trigger</literal>, which is executed when
402402
the trigger fires.
403403
</para>
404+
405+
<para>
406+
In the syntax of <literal>CREATE TRIGGER</literal>, the keywords
407+
<literal>FUNCTION</literal> and <literal>PROCEDURE</literal> are
408+
equivalent, but the referenced function must in any case be a function,
409+
not a procedure. The use of the keyword <literal>PROCEDURE</literal>
410+
here is historical and deprecated.
411+
</para>
404412
</listitem>
405413
</varlistentry>
406414

@@ -555,7 +563,7 @@ UPDATE OF <replaceable>column_name1</replaceable> [, <replaceable>column_name2</
555563
CREATE TRIGGER check_update
556564
BEFORE UPDATE ON accounts
557565
FOR EACH ROW
558-
EXECUTE PROCEDURE check_account_update();
566+
EXECUTE FUNCTION check_account_update();
559567
</programlisting>
560568

561569
The same, but only execute the function if column <literal>balance</literal>
@@ -565,7 +573,7 @@ CREATE TRIGGER check_update
565573
CREATE TRIGGER check_update
566574
BEFORE UPDATE OF balance ON accounts
567575
FOR EACH ROW
568-
EXECUTE PROCEDURE check_account_update();
576+
EXECUTE FUNCTION check_account_update();
569577
</programlisting>
570578

571579
This form only executes the function if column <literal>balance</literal>
@@ -576,7 +584,7 @@ CREATE TRIGGER check_update
576584
BEFORE UPDATE ON accounts
577585
FOR EACH ROW
578586
WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
579-
EXECUTE PROCEDURE check_account_update();
587+
EXECUTE FUNCTION check_account_update();
580588
</programlisting>
581589

582590
Call a function to log updates of <literal>accounts</literal>, but only if
@@ -587,7 +595,7 @@ CREATE TRIGGER log_update
587595
AFTER UPDATE ON accounts
588596
FOR EACH ROW
589597
WHEN (OLD.* IS DISTINCT FROM NEW.*)
590-
EXECUTE PROCEDURE log_account_update();
598+
EXECUTE FUNCTION log_account_update();
591599
</programlisting>
592600

593601
Execute the function <function>view_insert_row</function> for each row to insert
@@ -597,7 +605,7 @@ CREATE TRIGGER log_update
597605
CREATE TRIGGER view_insert
598606
INSTEAD OF INSERT ON my_view
599607
FOR EACH ROW
600-
EXECUTE PROCEDURE view_insert_row();
608+
EXECUTE FUNCTION view_insert_row();
601609
</programlisting>
602610

603611
Execute the function <function>check_transfer_balances_to_zero</function> for each
@@ -609,7 +617,7 @@ CREATE TRIGGER transfer_insert
609617
AFTER INSERT ON transfer
610618
REFERENCING NEW TABLE AS inserted
611619
FOR EACH STATEMENT
612-
EXECUTE PROCEDURE check_transfer_balances_to_zero();
620+
EXECUTE FUNCTION check_transfer_balances_to_zero();
613621
</programlisting>
614622

615623
Execute the function <function>check_matching_pairs</function> for each row to
@@ -621,7 +629,7 @@ CREATE TRIGGER paired_items_update
621629
AFTER UPDATE ON paired_items
622630
REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab
623631
FOR EACH ROW
624-
EXECUTE PROCEDURE check_matching_pairs();
632+
EXECUTE FUNCTION check_matching_pairs();
625633
</programlisting>
626634
</para>
627635

doc/src/sgml/tcn.sgml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ test(# );
4747
CREATE TABLE
4848
test=# create trigger tcndata_tcn_trigger
4949
test-# after insert or update or delete on tcndata
50-
test-# for each row execute procedure triggered_change_notification();
50+
test-# for each row execute function triggered_change_notification();
5151
CREATE TRIGGER
5252
test=# listen tcn;
5353
LISTEN

doc/src/sgml/textsearch.sgml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,7 +1884,7 @@ CREATE TABLE messages (
18841884
);
18851885

18861886
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
1887-
ON messages FOR EACH ROW EXECUTE PROCEDURE
1887+
ON messages FOR EACH ROW EXECUTE FUNCTION
18881888
tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);
18891889

18901890
INSERT INTO messages VALUES('title here', 'the body text is here');
@@ -1940,7 +1940,7 @@ end
19401940
$$ LANGUAGE plpgsql;
19411941

19421942
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
1943-
ON messages FOR EACH ROW EXECUTE PROCEDURE messages_trigger();
1943+
ON messages FOR EACH ROW EXECUTE FUNCTION messages_trigger();
19441944
</programlisting>
19451945
</para>
19461946

doc/src/sgml/trigger.sgml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -871,10 +871,10 @@ CREATE FUNCTION trigf() RETURNS trigger
871871
LANGUAGE C;
872872

873873
CREATE TRIGGER tbefore BEFORE INSERT OR UPDATE OR DELETE ON ttest
874-
FOR EACH ROW EXECUTE PROCEDURE trigf();
874+
FOR EACH ROW EXECUTE FUNCTION trigf();
875875

876876
CREATE TRIGGER tafter AFTER INSERT OR UPDATE OR DELETE ON ttest
877-
FOR EACH ROW EXECUTE PROCEDURE trigf();
877+
FOR EACH ROW EXECUTE FUNCTION trigf();
878878
</programlisting>
879879
</para>
880880

src/backend/parser/gram.y

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5344,7 +5344,7 @@ CreateAmStmt: CREATE ACCESS METHOD name TYPE_P INDEX HANDLER handler_name
53445344
CreateTrigStmt:
53455345
CREATE TRIGGER name TriggerActionTime TriggerEvents ON
53465346
qualified_name TriggerReferencing TriggerForSpec TriggerWhen
5347-
EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
5347+
EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
53485348
{
53495349
CreateTrigStmt *n = makeNode(CreateTrigStmt);
53505350
n->trigname = $3;
@@ -5366,7 +5366,7 @@ CreateTrigStmt:
53665366
| CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
53675367
qualified_name OptConstrFromTable ConstraintAttributeSpec
53685368
FOR EACH ROW TriggerWhen
5369-
EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
5369+
EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
53705370
{
53715371
CreateTrigStmt *n = makeNode(CreateTrigStmt);
53725372
n->trigname = $4;
@@ -5504,6 +5504,11 @@ TriggerWhen:
55045504
| /*EMPTY*/ { $$ = NULL; }
55055505
;
55065506

5507+
FUNCTION_or_PROCEDURE:
5508+
FUNCTION
5509+
| PROCEDURE
5510+
;
5511+
55075512
TriggerFuncArgs:
55085513
TriggerFuncArg { $$ = list_make1($1); }
55095514
| TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }

src/test/regress/expected/triggers.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ create unique index pkeys_i on pkeys (pkey1, pkey2);
2222
create trigger check_fkeys_pkey_exist
2323
before insert or update on fkeys
2424
for each row
25-
execute procedure
25+
execute function
2626
check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2');
2727
create trigger check_fkeys_pkey2_exist
2828
before insert or update on fkeys
2929
for each row
30-
execute procedure check_primary_key ('fkey3', 'fkeys2', 'pkey23');
30+
execute function check_primary_key ('fkey3', 'fkeys2', 'pkey23');
3131
--
3232
-- For fkeys2:
3333
-- (fkey21, fkey22) --> pkeys (pkey1, pkey2)

src/test/regress/sql/triggers.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ create unique index pkeys_i on pkeys (pkey1, pkey2);
2626
create trigger check_fkeys_pkey_exist
2727
before insert or update on fkeys
2828
for each row
29-
execute procedure
29+
execute function
3030
check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2');
3131

3232
create trigger check_fkeys_pkey2_exist
3333
before insert or update on fkeys
3434
for each row
35-
execute procedure check_primary_key ('fkey3', 'fkeys2', 'pkey23');
35+
execute function check_primary_key ('fkey3', 'fkeys2', 'pkey23');
3636

3737
--
3838
-- For fkeys2:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy