TRUNCATE TABLE mysql.general_log; CALL mtr.add_suppression('Following users were specified in CREATE USER IF NOT EXISTS but they already exist'); CALL mtr.add_suppression('Following users were specified in ALTER USER IF EXISTS but they do not exist'); --------------- general log --------------------------------------- SET GLOBAL general_log_file = '.../log/rewrite_general.log'; SET GLOBAL log_output = 'FILE,TABLE'; SET GLOBAL general_log= 'ON'; set character set 'hebrew'; set charset default,@dummy='A'; set names 'latin1',@dummy='B'; set names 'latin1' collate 'latin1_german2_ci'; set names default,@dummy='c'; CREATE TABLE t1(f1 INT, f2 INT, f3 INT, f4 INT); CREATE PROCEDURE proc_rewrite_1() INSERT INTO test.t1 VALUES ("hocus pocus"); CREATE FUNCTION func_rewrite_1(i INT) RETURNS INT DETERMINISTIC RETURN i+1; CREATE USER test_user1 IDENTIFIED WITH mysql_native_password BY 'azundris1'; GRANT SELECT(f2), INSERT(f3), INDEX, UPDATE(f1,f3, f2, f4), ALTER on test.t1 TO test_user1; GRANT ALL ON PROCEDURE test.proc_rewrite_1 TO test_user1; GRANT EXECUTE ON FUNCTION test.func_rewrite_1 TO test_user1; CREATE USER test_user3@localhost IDENTIFIED WITH mysql_native_password BY 'meow' REQUIRE SSL; GRANT SELECT,USAGE ON test.* TO test_user3@localhost; ALTER USER test_user3@localhost IDENTIFIED BY 'meow' REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 2 MAX_CONNECTIONS_PER_HOUR 3 MAX_USER_CONNECTIONS 4; GRANT USAGE ON test.* TO test_user3@localhost WITH GRANT OPTION; ALTER USER test_user3@localhost REQUIRE NONE; DROP PROCEDURE proc_rewrite_1; DROP FUNCTION func_rewrite_1; DROP TABLE t1; CREATE USER test_user2 IDENTIFIED WITH mysql_native_password BY 'azundris2'; CHANGE MASTER TO MASTER_PASSWORD='azundris3'; CREATE USER 'test_user4'@'localhost' IDENTIFIED WITH mysql_native_password; ALTER USER 'test_user4'@'localhost' IDENTIFIED BY 'azundris4'; CREATE USER test_user5 IDENTIFIED WITH mysql_native_password AS '*67092806AE91BFB6BE72DE6C7BE2B7CCA8CFA9DF', test_user6 IDENTIFIED BY 'test'; ALTER USER IF EXISTS test_user5 IDENTIFIED BY 'test', test_user6 IDENTIFIED WITH mysql_native_password AS '*67092806AE91BFB6BE72DE6C7BE2B7CCA8CFA9DF', test_user7 IDENTIFIED BY 'test'; Warnings: Note 3162 Authorization ID 'test_user7'@'%' does not exist. CREATE USER IF NOT EXISTS test_user6 IDENTIFIED BY 'test', test_user7 IDENTIFIED BY 'test'; Warnings: Note 3163 Authorization ID 'test_user6'@'%' already exists. ALTER USER test_user7 IDENTIFIED WITH mysql_native_password AS '*67092806AE91BFB6BE72DE6C7BE2B7CCA8CFA9DF'; CREATE USER test_user8 IDENTIFIED BY ''; ALTER USER test_user8 IDENTIFIED BY ''; CREATE USER test_user9 IDENTIFIED WITH 'caching_sha2_password' BY ''; ALTER USER test_user9 IDENTIFIED WITH 'caching_sha2_password' BY ''; SET PASSWORD FOR test_user9 = ""; CREATE USER u1, u2; GRANT CREATE USER ON *.* to 'u1' WITH GRANT OPTION; SET PASSWORD = '' REPLACE ''; ALTER USER u1 IDENTIFIED BY '123' REPLACE '', u2 IDENTIFIED BY '456' PASSWORD REQUIRE CURRENT OPTIONAL; ALTER USER u2 IDENTIFIED BY 'xyz', u1 IDENTIFIED BY 'abc' REPLACE '123'; SET GLOBAL general_log= 'OFF'; DROP USER u1, u2; DROP USER 'test_user4'@'localhost'; DROP USER 'test_user3'@'localhost'; DROP USER test_user9, test_user8; DROP USER test_user7, test_user6, test_user5; DROP USER test_user2; DROP USER test_user1; CREATE TABLE test_log (argument TEXT); LOAD DATA LOCAL INFILE '.../log/rewrite_general.log' INTO TABLE test_log FIELDS TERMINATED BY '\n' LINES TERMINATED BY '\n'; This line should be followed by two SELECTs with empty result sets SELECT argument FROM test_log WHERE argument LIKE CONCAT('%azun','dris%'); argument SELECT argument FROM mysql.general_log WHERE argument LIKE CONCAT('%azun','dris%'); argument Show that we logged stuff at all: ------ from file ------ SELECT TRIM(LEADING '\t' FROM MID(argument,LOCATE('Query',argument)+5)) FROM test_log WHERE (argument LIKE '%BY %' OR argument LIKE '%AS %' OR argument LIKE '%PASSWORD %') AND argument NOT LIKE '%Prepare%'; TRIM(LEADING '\t' FROM MID(argument,LOCATE('Query',argument)+5)) CREATE USER 'test_user1'@'%' IDENTIFIED WITH 'mysql_native_password' BY CREATE USER 'test_user3'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY REQUIRE SSL ALTER USER 'test_user3'@'localhost' IDENTIFIED BY REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 2 MAX_CONNECTIONS_PER_HOUR 3 MAX_USER_CONNECTIONS 4 CREATE USER 'test_user2'@'%' IDENTIFIED WITH 'mysql_native_password' BY CHANGE MASTER TO MASTER_PASSWORD = ALTER USER 'test_user4'@'localhost' IDENTIFIED BY CREATE USER 'test_user5'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*67092806AE91BFB6BE72DE6C7BE2B7CCA8CFA9DF','test_user6'@'%' IDENTIFIED BY ALTER USER IF EXISTS 'test_user5'@'%' IDENTIFIED BY ,'test_user6'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*67092806AE91BFB6BE72DE6C7BE2B7CCA8CFA9DF','test_user7'@'%' IDENTIFIED BY CREATE USER IF NOT EXISTS 'test_user6'@'%' IDENTIFIED BY ,'test_user7'@'%' IDENTIFIED BY ALTER USER test_user7 IDENTIFIED WITH mysql_native_password AS CREATE USER 'test_user8'@'%' IDENTIFIED BY ALTER USER 'test_user8'@'%' IDENTIFIED BY CREATE USER 'test_user9'@'%' IDENTIFIED WITH 'caching_sha2_password' BY ALTER USER 'test_user9'@'%' IDENTIFIED WITH 'caching_sha2_password' BY SET PASSWORD FOR `test_user9`@`%`= SET PASSWORD FOR `u1`@`%`= REPLACE ALTER USER 'u1'@'%' IDENTIFIED BY REPLACE ,'u2'@'%' IDENTIFIED BY PASSWORD REQUIRE CURRENT OPTIONAL ALTER USER 'u2'@'%' IDENTIFIED BY ,'u1'@'%' IDENTIFIED BY REPLACE ------ from table ------ SELECT argument FROM mysql.general_log WHERE (argument LIKE '%BY %' OR argument LIKE '%AS %' OR argument LIKE '%PASSWORD %') AND command_type NOT LIKE 'Prepare'; argument CREATE USER 'test_user1'@'%' IDENTIFIED WITH 'mysql_native_password' BY CREATE USER 'test_user3'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY REQUIRE SSL ALTER USER 'test_user3'@'localhost' IDENTIFIED BY REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 2 MAX_CONNECTIONS_PER_HOUR 3 MAX_USER_CONNECTIONS 4 CREATE USER 'test_user2'@'%' IDENTIFIED WITH 'mysql_native_password' BY CHANGE MASTER TO MASTER_PASSWORD = ALTER USER 'test_user4'@'localhost' IDENTIFIED BY CREATE USER 'test_user5'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*67092806AE91BFB6BE72DE6C7BE2B7CCA8CFA9DF','test_user6'@'%' IDENTIFIED BY ALTER USER IF EXISTS 'test_user5'@'%' IDENTIFIED BY ,'test_user6'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*67092806AE91BFB6BE72DE6C7BE2B7CCA8CFA9DF','test_user7'@'%' IDENTIFIED BY CREATE USER IF NOT EXISTS 'test_user6'@'%' IDENTIFIED BY ,'test_user7'@'%' IDENTIFIED BY CREATE USER 'test_user8'@'%' IDENTIFIED BY ALTER USER 'test_user8'@'%' IDENTIFIED BY CREATE USER 'test_user9'@'%' IDENTIFIED WITH 'caching_sha2_password' BY ALTER USER 'test_user9'@'%' IDENTIFIED WITH 'caching_sha2_password' BY SET PASSWORD FOR `test_user9`@`%`= SET PASSWORD FOR `u1`@`%`= REPLACE ALTER USER 'u1'@'%' IDENTIFIED BY REPLACE ,'u2'@'%' IDENTIFIED BY PASSWORD REQUIRE CURRENT OPTIONAL ALTER USER 'u2'@'%' IDENTIFIED BY ,'u1'@'%' IDENTIFIED BY REPLACE ------ done ------ ------ rewrite ------ SELECT argument FROM mysql.general_log WHERE argument LIKE CONCAT('set ','character set %'); argument set character set 'hebrew' SELECT argument FROM mysql.general_log WHERE argument LIKE CONCAT('set ','names %'); argument set names 'latin1',@dummy='B' set names 'latin1' collate 'latin1_german2_ci' set names default,@dummy='c' SELECT argument FROM mysql.general_log WHERE argument LIKE 'GRANT %' AND command_type NOT LIKE 'Prepare'; argument GRANT SELECT(f2), INSERT(f3), INDEX, UPDATE(f1,f3, f2, f4), ALTER on test.t1 TO test_user1 GRANT ALL ON PROCEDURE test.proc_rewrite_1 TO test_user1 GRANT EXECUTE ON FUNCTION test.func_rewrite_1 TO test_user1 GRANT SELECT,USAGE ON test.* TO test_user3@localhost GRANT USAGE ON test.* TO test_user3@localhost WITH GRANT OPTION GRANT CREATE USER ON *.* to 'u1' WITH GRANT OPTION ------ done ------ see log_tables.test for more proof! :) SELECT COUNT(*)=1 OR COUNT(*)=2 FROM mysql.general_log WHERE argument LIKE 'CREATE USER%' AND argument LIKE CONCAT('%AS %'); COUNT(*)=1 OR COUNT(*)=2 1 Bug#13958454 -- show we print SET @a:=5, but SELECT (@a:=5) EXPLAIN SELECT @a=5,@b:=10,@c:=20,@d:=40+5,(@e:=80)+5; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: Warning 1287 Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. Warning 1287 Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. Warning 1287 Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. Warning 1287 Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. Note 1003 /* select#1 */ select ((@`a`) = 5) AS `@a=5`,(@b:=10) AS `@b:=10`,(@c:=20) AS `@c:=20`,(@d:=(40 + 5)) AS `@d:=40+5`,((@e:=80) + 5) AS `(@e:=80)+5` End of 5.6 tests! # # Bug#16953758: PREPARED STATEMENT IS WRITTEN TO GENERAL QUERY LOG AFTER ITS EXECUTION IS FINISH # TRUNCATE TABLE mysql.general_log; SET GLOBAL general_log='ON'; SET @sql='SELECT command_type, argument FROM mysql.general_log WHERE argument LIKE "%Bug#16953758%"'; PREPARE stmt FROM @sql; EXECUTE stmt; command_type argument Query SET @sql='SELECT command_type, argument FROM mysql.general_log WHERE argument LIKE "%Bug#16953758%"' Prepare SELECT command_type, argument FROM mysql.general_log WHERE argument LIKE "%Bug#16953758%" Execute SELECT command_type, argument FROM mysql.general_log WHERE argument LIKE "%Bug#16953758%" DEALLOCATE PREPARE stmt; # # Bug#18616826: PREPARED STATEMENTS WHOSE EXECUTION FAIL ARE NOT LOGGED TO THE GENERAL LOG # TRUNCATE TABLE mysql.general_log; SET @sql='DROP TABLE 18616826_does_not_exist'; PREPARE stmt FROM @sql; EXECUTE stmt; ERROR 42S02: Unknown table 'test.18616826_does_not_exist' DEALLOCATE PREPARE stmt; SELECT command_type, argument FROM mysql.general_log WHERE argument LIKE "DROP TABLE 18616826_does_not_exist"; command_type argument Prepare DROP TABLE 18616826_does_not_exist Execute DROP TABLE 18616826_does_not_exist End of 5.7 tests! # shutdown the server from mtr. # restart the server. SET GLOBAL general_log_file = '.../log/rewrite_general.log'; SET GLOBAL log_output = 'FILE,TABLE'; SET GLOBAL general_log= 'ON'; CREATE USER 'plaintext_test' IDENTIFIED BY 'pwd'; ALTER USER plaintext_test IDENTIFIED BY '' REPLACE 'pwd'; SET PASSWORD FOR plaintext_test='456' REPLACE ''; SET PASSWORD='789' REPLACE '456'; DROP USER plaintext_test; # shutdown the server from mtr. # restart the server. SELECT count(*)=6 or count(*)=9 FROM mysql.general_log WHERE argument LIKE '%plaintext_test%' or argument like '%789%'; count(*)=6 or count(*)=9 1 DROP TABLE test_log; SET GLOBAL general_log_file = '.../mysqld.1/mysqld.log'; SET GLOBAL log_output= 'FILE'; SET GLOBAL general_log= 1; End of 5.7 tests!