mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			290 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			290 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # Test case(s) in this file contain(s) GRANT/REVOKE statements, which are not
 | |
| # supported in embedded server. So, this test should not be run on embedded
 | |
| # server.
 | |
| 
 | |
| -- source include/not_embedded.inc
 | |
| 
 | |
| ###########################################################################
 | |
| #
 | |
| # Tests for WL#2818:
 | |
| #   - Check that triggers created w/o DEFINER information work well:
 | |
| #     - create the first trigger;
 | |
| #     - manually remove definer information from corresponding TRG file;
 | |
| #     - create the second trigger (the first trigger will be reloaded; check
 | |
| #       that we receive a warning);
 | |
| #     - check that the triggers loaded correctly;
 | |
| #
 | |
| ###########################################################################
 | |
| 
 | |
| #
 | |
| # Prepare environment.
 | |
| #
 | |
| 
 | |
| DELETE FROM mysql.user WHERE User LIKE 'mysqltest_%';
 | |
| DELETE FROM mysql.db WHERE User LIKE 'mysqltest_%';
 | |
| DELETE FROM mysql.tables_priv WHERE User LIKE 'mysqltest_%';
 | |
| DELETE FROM mysql.columns_priv WHERE User LIKE 'mysqltest_%';
 | |
| FLUSH PRIVILEGES;
 | |
| 
 | |
| --disable_warnings
 | |
| DROP DATABASE IF EXISTS mysqltest_db1;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE DATABASE mysqltest_db1;
 | |
| 
 | |
| CREATE USER mysqltest_dfn@localhost;
 | |
| CREATE USER mysqltest_inv@localhost;
 | |
| 
 | |
| GRANT CREATE, TRIGGER ON mysqltest_db1.* TO mysqltest_dfn@localhost;
 | |
| 
 | |
| #
 | |
| # Create a table and the first trigger.
 | |
| #
 | |
| 
 | |
| --connect (wl2818_definer_con,localhost,mysqltest_dfn,,mysqltest_db1)
 | |
| --connection wl2818_definer_con
 | |
| --echo
 | |
| --echo ---> connection: wl2818_definer_con
 | |
| 
 | |
| CREATE TABLE t1(num_value INT);
 | |
| CREATE TABLE t2(user_str TEXT);
 | |
| 
 | |
| CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES(CURRENT_USER());
 | |
| 
 | |
| #
 | |
| # Remove definers from TRG file.
 | |
| #
 | |
| 
 | |
| --echo
 | |
| --echo ---> patching t1.TRG...
 | |
| 
 | |
| # Here we remove definers.  This is somewhat complex than the original test
 | |
| # Previously, the test only used grep -v 'definers=' t1.TRG, but grep is not
 | |
| # portable and we have to load the file into a table, exclude the definers line,
 | |
| # then load the data to an outfile to accomplish the same effect
 | |
| 
 | |
| --disable_query_log
 | |
| --connection default
 | |
| CREATE TABLE patch (a blob);
 | |
| let $MYSQLD_DATADIR = `select @@datadir`;
 | |
| eval LOAD DATA LOCAL INFILE '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' INTO TABLE patch;
 | |
| # remove original t1.TRG file so SELECT INTO OUTFILE won't fail
 | |
| --remove_file $MYSQLD_DATADIR/mysqltest_db1/t1.TRG
 | |
| eval SELECT SUBSTRING_INDEX(a,'definers=',1) INTO OUTFILE
 | |
|  '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' 
 | |
| FROM patch;
 | |
| DROP TABLE patch;
 | |
| --connection wl2818_definer_con
 | |
| --enable_query_log
 | |
| 
 | |
| #
 | |
| # Create a new trigger.
 | |
| #
 | |
| 
 | |
| --echo
 | |
| 
 | |
| CREATE TRIGGER wl2818_trg2 AFTER INSERT ON t1
 | |
|   FOR EACH ROW
 | |
|     INSERT INTO t2 VALUES(CURRENT_USER());
 | |
| 
 | |
| --echo
 | |
| 
 | |
| SELECT trigger_name, definer FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
 | |
| 
 | |
| --echo
 | |
| 
 | |
| SELECT * FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
 | |
| 
 | |
| # Clean up
 | |
| DROP TRIGGER wl2818_trg1;
 | |
| DROP TRIGGER wl2818_trg2;
 | |
| disconnect wl2818_definer_con;
 | |
| connection default;
 | |
| use mysqltest_db1;
 | |
| DROP TABLE t1;
 | |
| DROP TABLE t2;
 | |
| DROP USER mysqltest_dfn@localhost;
 | |
| DROP USER mysqltest_inv@localhost;
 | |
| DROP DATABASE mysqltest_db1;
 | |
| USE test;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug#45235: 5.1 does not support 5.0-only syntax triggers in any way
 | |
| --echo #
 | |
| let $MYSQLD_DATADIR=`SELECT @@datadir`;
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS t1, t2, t3;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE t1 ( a INT );
 | |
| CREATE TABLE t2 ( a INT );
 | |
| CREATE TABLE t3 ( a INT );
 | |
| INSERT INTO t1 VALUES (1), (2), (3);
 | |
| INSERT INTO t2 VALUES (1), (2), (3);
 | |
| INSERT INTO t3 VALUES (1), (2), (3);
 | |
| 
 | |
| --echo # We simulate importing a trigger from 5.0 by writing a .TRN file for
 | |
| --echo # each trigger plus a .TRG file the way MySQL 5.0 would have done it, 
 | |
| --echo # with syntax allowed in 5.0 only.
 | |
| --echo #
 | |
| --echo # Note that in 5.0 the following lines are missing from t1.TRG:
 | |
| --echo #
 | |
| --echo # client_cs_names='latin1'
 | |
| --echo # connection_cl_names='latin1_swedish_ci'
 | |
| --echo # db_cl_names='latin1_swedish_ci'
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr11.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr12.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr13.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr14.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr15.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/t1.TRG
 | |
| TYPE=TRIGGERS
 | |
| triggers='CREATE DEFINER=`root`@`localhost` TRIGGER tr11 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr12 AFTER INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr13 BEFORE DELETE ON t1 FOR EACH ROW DELETE FROM t1 a USING t1 a' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr14 AFTER DELETE ON t1 FOR EACH ROW DELETE FROM non_existing_table' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr15 BEFORE UPDATE ON t1 FOR EACH ROW DELETE FROM non_existing_table a USING non_existing_table a'
 | |
| sql_modes=0 0 0 0 0
 | |
| definers='root@localhost' 'root@localhost' 'root@localhost' 'root@localhost' 'root@localhost'
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/t2.TRG
 | |
| TYPE=TRIGGERS
 | |
| triggers='Not allowed syntax here, and trigger name cant be extracted either.'
 | |
| sql_modes=0
 | |
| definers='root@localhost'
 | |
| EOF
 | |
| 
 | |
| FLUSH TABLE t1;
 | |
| FLUSH TABLE t2;
 | |
| 
 | |
| --echo # We will get parse errors for most DDL and DML statements when the table
 | |
| --echo # has broken triggers. The parse error refers to the first broken 
 | |
| --echo # trigger.
 | |
| --error ER_PARSE_ERROR
 | |
| CREATE TRIGGER tr16 AFTER UPDATE ON t1 FOR EACH ROW INSERT INTO t1 VALUES (1);
 | |
| --error ER_PARSE_ERROR
 | |
| CREATE TRIGGER tr22 BEFORE INSERT ON t2 FOR EACH ROW DELETE FROM non_existing_table;
 | |
| SHOW TRIGGERS;
 | |
| --error ER_PARSE_ERROR
 | |
| INSERT INTO t1 VALUES (1);
 | |
| --error ER_PARSE_ERROR
 | |
| INSERT INTO t2 VALUES (1);
 | |
| --error ER_PARSE_ERROR
 | |
| DELETE FROM t1;
 | |
| --error ER_PARSE_ERROR
 | |
| UPDATE t1 SET a = 1 WHERE a = 1;
 | |
| SELECT * FROM t1;
 | |
| --error ER_PARSE_ERROR
 | |
| RENAME TABLE t1 TO t1_2;
 | |
| SHOW TRIGGERS;
 | |
| 
 | |
| DROP TRIGGER tr11;
 | |
| DROP TRIGGER tr12;
 | |
| DROP TRIGGER tr13;
 | |
| DROP TRIGGER tr14;
 | |
| DROP TRIGGER tr15;
 | |
| 
 | |
| SHOW TRIGGERS;
 | |
| 
 | |
| --echo # Make sure there is no trigger file left.
 | |
| --list_files $MYSQLD_DATADIR/test/ tr*
 | |
| 
 | |
| --echo # We write the same trigger files one more time to test DROP TABLE.
 | |
| --write_file $MYSQLD_DATADIR/test/tr11.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr12.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr13.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr14.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr15.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/t1.TRG
 | |
| TYPE=TRIGGERS
 | |
| triggers='CREATE DEFINER=`root`@`localhost` TRIGGER tr11 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr12 AFTER INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr13 BEFORE DELETE ON t1 FOR EACH ROW DELETE FROM t1 a USING t1 a' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr14 AFTER DELETE ON t1 FOR EACH ROW DELETE FROM non_existing_table' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr15 BEFORE UPDATE ON t1 FOR EACH ROW DELETE FROM non_existing_table a USING non_existing_table a'
 | |
| sql_modes=0 0 0 0 0
 | |
| definers='root@localhost' 'root@localhost' 'root@localhost' 'root@localhost' 'root@localhost'
 | |
| EOF
 | |
| 
 | |
| FLUSH TABLE t1;
 | |
| FLUSH TABLE t2;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| DROP TABLE t2;
 | |
| DROP TABLE t3;
 | |
| 
 | |
| --echo # Make sure there is no trigger file left.
 | |
| 
 | |
| --list_files $MYSQLD_DATADIR/test/ tr*
 | |
| 
 | |
| CREATE TABLE t1 ( a INT );
 | |
| CREATE TABLE t2 ( a INT );
 | |
| INSERT INTO t1 VALUES (1), (2), (3);
 | |
| INSERT INTO t2 VALUES (1), (2), (3);
 | |
| 
 | |
| --echo # We write three trigger files. First trigger is syntaxically incorrect, next trigger is correct
 | |
| --echo # and last trigger is broken.
 | |
| --echo # Next we try to execute SHOW CREATE TRGGIR command for broken trigger and then try to drop one.
 | |
| --write_file $MYSQLD_DATADIR/test/tr11.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/tr12.TRN
 | |
| TYPE=TRIGGERNAME
 | |
| trigger_table=t1
 | |
| EOF
 | |
| 
 | |
| --write_file $MYSQLD_DATADIR/test/t1.TRG
 | |
| TYPE=TRIGGERS
 | |
| triggers='CREATE the wrongest trigger_in_the_world' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr11 BEFORE DELETE ON t1 FOR EACH ROW DELETE FROM t1 a USING t1 a' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr12 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t2'
 | |
| sql_modes=0 0 0
 | |
| definers='root@localhost' 'root@localhost' 'root@localhost'
 | |
| EOF
 | |
| 
 | |
| FLUSH TABLE t1;
 | |
| 
 | |
| SHOW CREATE TRIGGER tr12;
 | |
| SHOW CREATE TRIGGER tr11;
 | |
| DROP TRIGGER tr12;
 | |
| DROP TRIGGER tr11;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| DROP TABLE t2;
 |