1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00

MDEV-6112 multiple triggers per table

This is similar to MysQL Worklog 3253, but with
a different implementation. The disk format and
SQL syntax is identical with MySQL 5.7.

Fetures supported:
- "Any" ammount of any trigger
- Supports FOLLOWS and PRECEDES to be
  able to put triggers in a certain execution order.

Implementation details:
- Class Trigger added to hold information about a trigger.
  Before this trigger information was stored in a set of lists in
  Table_triggers_list and in Table_triggers_list::bodies
- Each Trigger has a next field that poinst to the next Trigger with the
  same action and time.
- When accessing a trigger, we now always access all linked triggers
- The list are now only used to load and save trigger files.
- MySQL trigger test case (trigger_wl3253) added and we execute these
  identically.
- Even more gracefully handling of wrong trigger files than before. This
  is useful if a trigger file uses functions or syntax not provided by
  the server.
- Each trigger now has a "Created" field that shows when the trigger was
  created, with 2 decimals.

Other comments:
- Many of the changes in test files was done because of the new "Created"
  field in the trigger file. This shows up in SHOW ... TRIGGER and when
  using information_schema.trigger.
- Don't check if all memory is released if on uses --gdb;  This is needed
  to be able to get a list from safemalloc of not freed memory while
  debugging.
- Added option to trim_whitespace() to know how many prefix characters
  was skipped.
- Changed a few ulonglong sql_mode to sql_mode_t, to find some wrong usage
  of sql_mode.
This commit is contained in:
Monty
2016-10-02 15:35:08 +03:00
parent 0bae1957dd
commit 8be53a389c
73 changed files with 2553 additions and 1175 deletions

View File

@@ -120,6 +120,7 @@ let $message= no trigger privilege on table level for create:;
connection default;
select current_user;
--replace_column 6 #
show triggers;
grant TRIGGER on priv1_db.t1 to test_yesprivs@localhost;
show grants for test_yesprivs@localhost;
@@ -128,6 +129,7 @@ let $message= trigger privilege on table level for create:;
--source include/show_msg.inc
connection yes_privs;
select current_user;
--replace_column 6 #
show triggers;
create trigger trg1_2 before INSERT on t1 for each row
set new.f1 = 'trig 1_2-yes';

View File

@@ -84,6 +84,7 @@ let $message= trigger privilege on user level for create:;
connect (yes_privs,localhost,test_yesprivs,PWD,test,$MASTER_MYPORT,$MASTER_MYSOCK);
select current_user;
use priv_db;
--replace_column 6 #
show triggers;
select * from information_schema.triggers;
--error ER_TABLEACCESS_DENIED_ERROR

View File

@@ -36,6 +36,7 @@ let $message= #### Testcase for trigger privilege on execution time ########;
connection default;
select current_user;
--replace_column 6 #
show triggers;
grant select, insert, update ,trigger
on priv_db.t1 to test_yesprivs@localhost

View File

@@ -44,6 +44,7 @@ let $message= no trigger privilege on table level for create:;
--source include/show_msg.inc
connection default;
select current_user;
--replace_column 6 #
show triggers;
grant select, insert, update on priv_db.t1 to test_yesprivs@localhost;
show grants for test_yesprivs@localhost;
@@ -68,6 +69,7 @@ let $message= no trigger privilege on table level for create:;
connection default;
select current_user;
--replace_column 6 #
show triggers;
show tables;
insert into t1 (f1) values ('insert2-yes');
@@ -81,6 +83,7 @@ let $message= trigger privilege on table level for create:;
--source include/show_msg.inc
connection yes_privs;
select current_user;
--replace_column 6 #
show triggers;
create trigger trg1_2 before INSERT on t1 for each row
set new.f1 = 'trig 1_2-yes';
@@ -179,6 +182,7 @@ let $message= use table with trigger privilege and without...:;
set new.f1 = 'trig 2_2-no';
create trigger trg1_4 before UPDATE on t1 for each row
set new.f1 = 'trig 1_4-yes';
--replace_column 6 #
show triggers;
connection no_privs;
select current_user;

View File

@@ -420,16 +420,15 @@ let $message= Testcase 3.5.7.4:;
--enable_warnings
#Section 3.5.7.5 / 3.5.7.6
# Test case: Ensure that it is not possible to create multiple BEFORE INSERT triggers
# on the same table, even if the triggers have different names / different
# triggered actions.
# Test case: Ensure that it is possible to create multiple BEFORE INSERT
# triggers on the same table
#
let $message= Testcase 3.5.7.5 / 3.5.7.6:;
--source include/show_msg.inc
Create trigger trg5_1 BEFORE INSERT
on tb3 for each row set new.f122='Trigger1 3.5.7.5/6';
--error ER_NOT_SUPPORTED_YET
Create trigger trg5_2 BEFORE INSERT
on tb3 for each row set new.f122='Trigger2 3.5.7.5';
@@ -441,16 +440,14 @@ let $message= Testcase 3.5.7.5 / 3.5.7.6:;
#Cleanup
--disable_warnings
drop trigger trg5_1;
--error 0, ER_TRG_DOES_NOT_EXIST
drop trigger trg5_2;
delete from tb3 where f121='Test 3.5.7.5/6';
--enable_warnings
#Section 3.5.7.7 / 3.5.7.8
# Test case: Ensure that it is not possible to create multiple AFTER INSERT triggers
# on the same table, even if the triggers have different names / different
# triggered actions.
# Test case: Ensure that it is possible to create multiple AFTER INSERT
# triggers on the same table
let $message= Testcase 3.5.7.7 / 3.5.7.8:;
--source include/show_msg.inc
@@ -458,7 +455,6 @@ let $message= Testcase 3.5.7.7 / 3.5.7.8:;
Create trigger trg6_1 AFTER INSERT
on tb3 for each row set @test_var='Trigger1 3.5.7.7/8';
--error ER_NOT_SUPPORTED_YET
Create trigger trg6_2 AFTER INSERT
on tb3 for each row set @test_var='Trigger2 3.5.7.7';
@@ -473,23 +469,20 @@ let $message= Testcase 3.5.7.7 / 3.5.7.8:;
#Cleanup
--disable_warnings
drop trigger trg6_1;
--error 0, ER_TRG_DOES_NOT_EXIST
drop trigger trg6_2;
delete from tb3 where f121='Test 3.5.7.7/8';
--enable_warnings
#Section 3.5.7.9 / 3.5.7.10
# Test case: Ensure that it is not possible to create multiple BEFORE UPDATE triggers
# on the same table, even if the triggers have different names / different
# triggered actions.
# Test case: Ensure that it is possible to create multiple BEFORE UPDATE
# triggers on the same table
let $message= Testcase 3.5.7.9/10:;
--source include/show_msg.inc
Create trigger trg7_1 BEFORE UPDATE
on tb3 for each row set new.f122='Trigger1 3.5.7.9/10';
--error ER_NOT_SUPPORTED_YET
Create trigger trg7_2 BEFORE UPDATE
on tb3 for each row set new.f122='Trigger2 3.5.7.9';
@@ -501,14 +494,12 @@ let $message= Testcase 3.5.7.9/10:;
#Cleanup
--disable_warnings
drop trigger trg7_1;
--error 0, ER_TRG_DOES_NOT_EXIST
drop trigger trg7_2;
delete from tb3 where f121='Test 3.5.7.9/10';
#Section 3.5.7.11 / 3.5.7.12
# Test case: Ensure that it is not possible to create multiple AFTER UPDATE triggers
# on the same table, even if the triggers have different names / different
# triggered actions.
# Test case: Ensure that it is possible to create multiple AFTER UPDATE
# triggers on the same table
let $message= Testcase 3.5.7.11/12:;
--source include/show_msg.inc
@@ -516,11 +507,9 @@ let $message= Testcase 3.5.7.11/12:;
Create trigger trg8_1 AFTER UPDATE
on tb3 for each row set @test_var='Trigger 3.5.7.11/12';
--error ER_NOT_SUPPORTED_YET
Create trigger trg8_2 AFTER UPDATE
on tb3 for each row set @test_var='Trigger2 3.5.7.11';
select @test_var;
Insert into tb3 (f121,f122) values ('Test 3.5.7.11/12','Insert 3.5.7.11/12');
select @test_var;
@@ -533,14 +522,12 @@ let $message= Testcase 3.5.7.11/12:;
#Cleanup
--disable_warnings
drop trigger trg8_1;
--error 0, ER_TRG_DOES_NOT_EXIST
drop trigger trg8_2;
delete from tb3 where f121='Test 3.5.7.11/12';
#Section 3.5.7.13 / 3.5.7.14
# Test case: Ensure that it is not possible to create multiple BEFORE DELETE triggers
# on the same table, even if the triggers have different names / different
# triggered actions.
# Test case: Ensure that it is possible to create multiple BEFORE DELETE
# triggers on the same table
let $message= Testcase 3.5.7.13/14:;
--source include/show_msg.inc
@@ -548,7 +535,6 @@ let $message= Testcase 3.5.7.13/14:;
Create trigger trg9_1 BEFORE DELETE
on tb3 for each row set @test_var=@test_var+1;
--error ER_NOT_SUPPORTED_YET
Create trigger trg9_2 BEFORE DELETE
on tb3 for each row set @test_var=@test_var+10;
@@ -565,14 +551,12 @@ let $message= Testcase 3.5.7.13/14:;
#Cleanup
--disable_warnings
drop trigger trg9_1;
--error 0, ER_TRG_DOES_NOT_EXIST
drop trigger trg9_2;
delete from tb3 where f121='Test 3.5.7.13/14';
#Section 3.5.7.15 / 3.5.7.16
# Test case: Ensure that it is not possible to create multiple AFTER DELETE triggers
# on the same table, even if the triggers have different names / different
# triggered actions.
# Test case: Ensure that possible to create multiple AFTER DELETE triggers
# on the same table
let $message= Testcase 3.5.7.15/16:;
--source include/show_msg.inc
@@ -580,7 +564,6 @@ let $message= Testcase 3.5.7.15/16:;
Create trigger trg_3_406010_1 AFTER DELETE
on tb3 for each row set @test_var=@test_var+5;
--error ER_NOT_SUPPORTED_YET
Create trigger trg_3_406010_2 AFTER DELETE
on tb3 for each row set @test_var=@test_var+50;
@@ -601,7 +584,6 @@ let $message= Testcase 3.5.7.15/16:;
#Cleanup
--disable_warnings
drop trigger trg_3_406010_1;
--error 0, ER_TRG_DOES_NOT_EXIST
drop trigger trg_3_406010_2;
delete from tb3 where f121='Test 3.5.7.15/16';
--enable_warnings