Add more tests on event triggers

Started by Fabien COELHOalmost 11 years ago6 messages
#1Fabien COELHO
coelho@cri.ensmp.fr
1 attachment(s)

Here are some more tests for event triggers, especially about new features
introduced recently in 296f3a6053844089bc533630fffafaba8f016384.

Check that COMMENT, GRANT and REVOKE do trigger some events.

The patch also check some more error cases: SQL function, functions with
declared arguments, arguments passed to the trigger, event trigger on
global objects (ROLE, TABLESPACE, DATABASE).

I have left out "SECURITY LABEL" which would require a special security
label provider. Note that they do not seem to be tested at all anyway:-(
The "security_label.sql" really tests that all fails when no plugin is
available. If some actual tests are added to security label some day, I
think that event triggers about them should be tested there.

--
Fabien.

Attachments:

event-test-1.difftext/x-diff; name=event-test-1.diffDownload
diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out
index 2095794..2690c49 100644
--- a/src/test/regress/expected/event_trigger.out
+++ b/src/test/regress/expected/event_trigger.out
@@ -9,6 +9,15 @@ BEGIN
     RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag;
 END
 $$ language plpgsql;
+-- should fail, event triggers cannot have declared arguments
+create function test_event_trigger_arg(name text)
+returns event_trigger as $$ BEGIN RETURN 1; END $$ language plpgsql;
+ERROR:  event trigger functions cannot have declared arguments
+CONTEXT:  compilation of PL/pgSQL function "test_event_trigger_arg" near line 1
+-- should fail, SQL functions cannot be event triggers
+create function test_event_trigger_sql() returns event_trigger as $$
+SELECT 1 $$ language sql;
+ERROR:  SQL functions cannot return type event_trigger
 -- should fail, no elephant_bootstrap entry point
 create event trigger regress_event_trigger on elephant_bootstrap
    execute procedure test_event_trigger();
@@ -39,11 +48,32 @@ create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('DROP EVENT TRIGGER')
    execute procedure test_event_trigger();
 ERROR:  event triggers are not supported for DROP EVENT TRIGGER
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE ROLE')
+   execute procedure test_event_trigger();
+ERROR:  event triggers are not supported for CREATE ROLE
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE DATABASE')
+   execute procedure test_event_trigger();
+ERROR:  event triggers are not supported for CREATE DATABASE
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE TABLESPACE')
+   execute procedure test_event_trigger();
+ERROR:  event triggers are not supported for CREATE TABLESPACE
 -- should fail, can't have same filter variable twice
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table') and tag in ('CREATE FUNCTION')
    execute procedure test_event_trigger();
 ERROR:  filter variable "tag" specified more than once
+-- should fail, can't have arguments
+create event trigger regress_event_trigger2 on ddl_command_start
+   execute procedure test_event_trigger('argument not allowed');
+ERROR:  syntax error at or near "'argument not allowed'"
+LINE 2:    execute procedure test_event_trigger('argument not allowe...
+                                                ^
 -- OK
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table', 'CREATE FUNCTION')
@@ -72,6 +102,15 @@ create table event_trigger_fire1 (a int);
 NOTICE:  test_event_trigger: ddl_command_start CREATE TABLE
 NOTICE:  test_event_trigger: ddl_command_end CREATE TABLE
 -- regress_event_trigger_end should fire here
+grant all on table event_trigger_fire1 to public;
+NOTICE:  test_event_trigger: ddl_command_end GRANT
+-- regress_event_trigger_end should fire here
+comment on table event_trigger_fire1 is 'here is a comment';
+NOTICE:  test_event_trigger: ddl_command_end COMMENT
+-- regress_event_trigger_end should fire here
+revoke all on table event_trigger_fire1 from public;
+NOTICE:  test_event_trigger: ddl_command_end REVOKE
+-- regress_event_trigger_end should fire here
 drop table event_trigger_fire1;
 NOTICE:  test_event_trigger: ddl_command_end DROP TABLE
 -- alter owner to non-superuser should fail
diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql
index c6e47ed..a584d33 100644
--- a/src/test/regress/sql/event_trigger.sql
+++ b/src/test/regress/sql/event_trigger.sql
@@ -10,6 +10,14 @@ BEGIN
 END
 $$ language plpgsql;
 
+-- should fail, event triggers cannot have declared arguments
+create function test_event_trigger_arg(name text)
+returns event_trigger as $$ BEGIN RETURN 1; END $$ language plpgsql;
+
+-- should fail, SQL functions cannot be event triggers
+create function test_event_trigger_sql() returns event_trigger as $$
+SELECT 1 $$ language sql;
+
 -- should fail, no elephant_bootstrap entry point
 create event trigger regress_event_trigger on elephant_bootstrap
    execute procedure test_event_trigger();
@@ -42,11 +50,30 @@ create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('DROP EVENT TRIGGER')
    execute procedure test_event_trigger();
 
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE ROLE')
+   execute procedure test_event_trigger();
+
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE DATABASE')
+   execute procedure test_event_trigger();
+
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE TABLESPACE')
+   execute procedure test_event_trigger();
+
 -- should fail, can't have same filter variable twice
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table') and tag in ('CREATE FUNCTION')
    execute procedure test_event_trigger();
 
+-- should fail, can't have arguments
+create event trigger regress_event_trigger2 on ddl_command_start
+   execute procedure test_event_trigger('argument not allowed');
+
 -- OK
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table', 'CREATE FUNCTION')
@@ -76,6 +103,15 @@ alter event trigger regress_event_trigger disable;
 create table event_trigger_fire1 (a int);
 
 -- regress_event_trigger_end should fire here
+grant all on table event_trigger_fire1 to public;
+
+-- regress_event_trigger_end should fire here
+comment on table event_trigger_fire1 is 'here is a comment';
+
+-- regress_event_trigger_end should fire here
+revoke all on table event_trigger_fire1 from public;
+
+-- regress_event_trigger_end should fire here
 drop table event_trigger_fire1;
 
 -- alter owner to non-superuser should fail
#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Fabien COELHO (#1)
Re: Add more tests on event triggers

Fabien COELHO wrote:

Here are some more tests for event triggers, especially about new features
introduced recently in 296f3a6053844089bc533630fffafaba8f016384.

Check that COMMENT, GRANT and REVOKE do trigger some events.

The patch also check some more error cases: SQL function, functions with
declared arguments, arguments passed to the trigger, event trigger on global
objects (ROLE, TABLESPACE, DATABASE).

Will have a look later, thanks.

I have left out "SECURITY LABEL" which would require a special security
label provider. Note that they do not seem to be tested at all anyway:-( The
"security_label.sql" really tests that all fails when no plugin is
available. If some actual tests are added to security label some day, I
think that event triggers about them should be tested there.

You can add tests in src/test/modules/dummy_seclabel.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Fabien COELHO
coelho@cri.ensmp.fr
In reply to: Alvaro Herrera (#2)
Re: Add more tests on event triggers

I have left out "SECURITY LABEL" which would require a special security
label provider. [...]

You can add tests in src/test/modules/dummy_seclabel.

Thanks for the pointer, I have indeed missed these special tests. I'll
have a look.

--
Fabien.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Fabien COELHO
coelho@cri.ensmp.fr
In reply to: Alvaro Herrera (#2)
1 attachment(s)
Re: Add more tests on event triggers

You can add tests in src/test/modules/dummy_seclabel.

Patch attached to test sec label there, in addition to the other more
standard checks in event_trigger.

--
Fabien.

Attachments:

event-test-2.difftext/x-diff; name=event-test-2.diffDownload
diff --git a/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out b/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out
index a16558e..4e4905b 100644
--- a/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out
+++ b/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out
@@ -85,3 +85,21 @@ SELECT objtype, objname, provider, label FROM pg_seclabels
  view     | dummy_seclabel_view1  | dummy    | classified
 (9 rows)
 
+-- check for event trigger
+CREATE FUNCTION event_trigger_test()
+RETURNS event_trigger AS $$
+  BEGIN RAISE NOTICE 'event %: %', TG_EVENT, TG_TAG; END;
+$$ LANGUAGE plpgsql;
+CREATE EVENT TRIGGER always_start ON ddl_command_start
+EXECUTE PROCEDURE event_trigger_test();
+CREATE EVENT TRIGGER always_end ON ddl_command_end
+EXECUTE PROCEDURE event_trigger_test();
+CREATE EVENT TRIGGER always_drop ON sql_drop
+EXECUTE PROCEDURE event_trigger_test();
+CREATE EVENT TRIGGER always_rewrite ON table_rewrite
+EXECUTE PROCEDURE event_trigger_test();
+-- should trigger ddl_commend_{start,end}
+SECURITY LABEL ON TABLE dummy_seclabel_tbl1 IS 'classified';
+NOTICE:  event ddl_command_start: SECURITY LABEL
+NOTICE:  event ddl_command_end: SECURITY LABEL
+DROP EVENT TRIGGER always_start, always_end, always_drop, always_rewrite;
diff --git a/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql b/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql
index 49777aa..aecffe2 100644
--- a/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql
+++ b/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql
@@ -77,3 +77,26 @@ SECURITY LABEL ON SCHEMA dummy_seclabel_test IS 'unclassified';		-- OK
 
 SELECT objtype, objname, provider, label FROM pg_seclabels
 	ORDER BY objtype, objname;
+
+-- check for event trigger
+CREATE FUNCTION event_trigger_test()
+RETURNS event_trigger AS $$
+  BEGIN RAISE NOTICE 'event %: %', TG_EVENT, TG_TAG; END;
+$$ LANGUAGE plpgsql;
+
+CREATE EVENT TRIGGER always_start ON ddl_command_start
+EXECUTE PROCEDURE event_trigger_test();
+
+CREATE EVENT TRIGGER always_end ON ddl_command_end
+EXECUTE PROCEDURE event_trigger_test();
+
+CREATE EVENT TRIGGER always_drop ON sql_drop
+EXECUTE PROCEDURE event_trigger_test();
+
+CREATE EVENT TRIGGER always_rewrite ON table_rewrite
+EXECUTE PROCEDURE event_trigger_test();
+
+-- should trigger ddl_commend_{start,end}
+SECURITY LABEL ON TABLE dummy_seclabel_tbl1 IS 'classified';
+
+DROP EVENT TRIGGER always_start, always_end, always_drop, always_rewrite;
diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out
index 2095794..2690c49 100644
--- a/src/test/regress/expected/event_trigger.out
+++ b/src/test/regress/expected/event_trigger.out
@@ -9,6 +9,15 @@ BEGIN
     RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag;
 END
 $$ language plpgsql;
+-- should fail, event triggers cannot have declared arguments
+create function test_event_trigger_arg(name text)
+returns event_trigger as $$ BEGIN RETURN 1; END $$ language plpgsql;
+ERROR:  event trigger functions cannot have declared arguments
+CONTEXT:  compilation of PL/pgSQL function "test_event_trigger_arg" near line 1
+-- should fail, SQL functions cannot be event triggers
+create function test_event_trigger_sql() returns event_trigger as $$
+SELECT 1 $$ language sql;
+ERROR:  SQL functions cannot return type event_trigger
 -- should fail, no elephant_bootstrap entry point
 create event trigger regress_event_trigger on elephant_bootstrap
    execute procedure test_event_trigger();
@@ -39,11 +48,32 @@ create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('DROP EVENT TRIGGER')
    execute procedure test_event_trigger();
 ERROR:  event triggers are not supported for DROP EVENT TRIGGER
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE ROLE')
+   execute procedure test_event_trigger();
+ERROR:  event triggers are not supported for CREATE ROLE
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE DATABASE')
+   execute procedure test_event_trigger();
+ERROR:  event triggers are not supported for CREATE DATABASE
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE TABLESPACE')
+   execute procedure test_event_trigger();
+ERROR:  event triggers are not supported for CREATE TABLESPACE
 -- should fail, can't have same filter variable twice
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table') and tag in ('CREATE FUNCTION')
    execute procedure test_event_trigger();
 ERROR:  filter variable "tag" specified more than once
+-- should fail, can't have arguments
+create event trigger regress_event_trigger2 on ddl_command_start
+   execute procedure test_event_trigger('argument not allowed');
+ERROR:  syntax error at or near "'argument not allowed'"
+LINE 2:    execute procedure test_event_trigger('argument not allowe...
+                                                ^
 -- OK
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table', 'CREATE FUNCTION')
@@ -72,6 +102,15 @@ create table event_trigger_fire1 (a int);
 NOTICE:  test_event_trigger: ddl_command_start CREATE TABLE
 NOTICE:  test_event_trigger: ddl_command_end CREATE TABLE
 -- regress_event_trigger_end should fire here
+grant all on table event_trigger_fire1 to public;
+NOTICE:  test_event_trigger: ddl_command_end GRANT
+-- regress_event_trigger_end should fire here
+comment on table event_trigger_fire1 is 'here is a comment';
+NOTICE:  test_event_trigger: ddl_command_end COMMENT
+-- regress_event_trigger_end should fire here
+revoke all on table event_trigger_fire1 from public;
+NOTICE:  test_event_trigger: ddl_command_end REVOKE
+-- regress_event_trigger_end should fire here
 drop table event_trigger_fire1;
 NOTICE:  test_event_trigger: ddl_command_end DROP TABLE
 -- alter owner to non-superuser should fail
diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql
index c6e47ed..a584d33 100644
--- a/src/test/regress/sql/event_trigger.sql
+++ b/src/test/regress/sql/event_trigger.sql
@@ -10,6 +10,14 @@ BEGIN
 END
 $$ language plpgsql;
 
+-- should fail, event triggers cannot have declared arguments
+create function test_event_trigger_arg(name text)
+returns event_trigger as $$ BEGIN RETURN 1; END $$ language plpgsql;
+
+-- should fail, SQL functions cannot be event triggers
+create function test_event_trigger_sql() returns event_trigger as $$
+SELECT 1 $$ language sql;
+
 -- should fail, no elephant_bootstrap entry point
 create event trigger regress_event_trigger on elephant_bootstrap
    execute procedure test_event_trigger();
@@ -42,11 +50,30 @@ create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('DROP EVENT TRIGGER')
    execute procedure test_event_trigger();
 
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE ROLE')
+   execute procedure test_event_trigger();
+
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE DATABASE')
+   execute procedure test_event_trigger();
+
+-- should fail, can't have event triggers on global objects
+create event trigger regress_event_trigger2 on ddl_command_start
+   when tag in ('CREATE TABLESPACE')
+   execute procedure test_event_trigger();
+
 -- should fail, can't have same filter variable twice
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table') and tag in ('CREATE FUNCTION')
    execute procedure test_event_trigger();
 
+-- should fail, can't have arguments
+create event trigger regress_event_trigger2 on ddl_command_start
+   execute procedure test_event_trigger('argument not allowed');
+
 -- OK
 create event trigger regress_event_trigger2 on ddl_command_start
    when tag in ('create table', 'CREATE FUNCTION')
@@ -76,6 +103,15 @@ alter event trigger regress_event_trigger disable;
 create table event_trigger_fire1 (a int);
 
 -- regress_event_trigger_end should fire here
+grant all on table event_trigger_fire1 to public;
+
+-- regress_event_trigger_end should fire here
+comment on table event_trigger_fire1 is 'here is a comment';
+
+-- regress_event_trigger_end should fire here
+revoke all on table event_trigger_fire1 from public;
+
+-- regress_event_trigger_end should fire here
 drop table event_trigger_fire1;
 
 -- alter owner to non-superuser should fail
#5Robert Haas
robertmhaas@gmail.com
In reply to: Fabien COELHO (#4)
Re: Add more tests on event triggers

On Wed, Feb 25, 2015 at 10:03 AM, Fabien COELHO <coelho@cri.ensmp.fr> wrote:

You can add tests in src/test/modules/dummy_seclabel.

Patch attached to test sec label there, in addition to the other more
standard checks in event_trigger.

These tests seem worthwhile to me.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#5)
Re: Add more tests on event triggers

Robert Haas wrote:

On Wed, Feb 25, 2015 at 10:03 AM, Fabien COELHO <coelho@cri.ensmp.fr> wrote:

You can add tests in src/test/modules/dummy_seclabel.

Patch attached to test sec label there, in addition to the other more
standard checks in event_trigger.

These tests seem worthwhile to me.

Pushed, thanks.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers