Commit 799b1e6c authored by unknown's avatar unknown
Browse files

BUG#13343 CREATE|etc TRIGGER|VIEW|USER don't commit the transaction (inconsistency)

Updated more DDL statements to cause implicit commit.


mysql-test/r/rpl_ddl.result:
  updated results to test for implicit commit for:
  CREATE OR REPLACE VIEW
  ALTER VIEW
  DROP VIEW
  CREATE TRIGGER
  DROP TRIGGER
  CREATE USER
  RENAME USER
  DROP USER
mysql-test/t/rpl_ddl.test:
  updated results to test for implicit commit for:
  CREATE OR REPLACE VIEW
  ALTER VIEW
  DROP VIEW
  CREATE TRIGGER
  DROP TRIGGER
  CREATE USER
  RENAME USER
  DROP USER
sql/sql_parse.cc:
  added implicit commit for:
  CREATE OR REPLACE VIEW
  ALTER VIEW
  DROP VIEW
  CREATE TRIGGER
  DROP TRIGGER
  CREATE USER
  RENAME USER
  DROP USER
parent 849eafa7
Loading
Loading
Loading
Loading
+434 −0
Original line number Diff line number Diff line
@@ -1254,6 +1254,440 @@ flush logs;
SHOW PROCEDURE STATUS LIKE 'p1';
	-------- switch to slave -------
SHOW PROCEDURE STATUS LIKE 'p1';

######## CREATE OR REPLACE VIEW v1 as select * from t1  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 18 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
19

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
18

-------- switch to master -------
CREATE OR REPLACE VIEW v1 as select * from t1;
SELECT MAX(f1) FROM t1;
MAX(f1)
19

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
19

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
19

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
19

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`f1` AS `f1` from `t1`

-------- switch to slave -------
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`f1` AS `f1` from `t1`

######## ALTER VIEW v1 AS select f1 from t1  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 19 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
20

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
19

-------- switch to master -------
ALTER VIEW v1 AS select f1 from t1;
SELECT MAX(f1) FROM t1;
MAX(f1)
20

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
20

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
20

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
20

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`f1` AS `f1` from `t1`

-------- switch to slave -------
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`f1` AS `f1` from `t1`

######## DROP VIEW IF EXISTS v1  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 20 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
21

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
20

-------- switch to master -------
DROP VIEW IF EXISTS v1;
SELECT MAX(f1) FROM t1;
MAX(f1)
21

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
21

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
21

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
21

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SHOW CREATE VIEW v1;
ERROR 42S02: Table 'mysqltest1.v1' doesn't exist

-------- switch to slave -------
SHOW CREATE VIEW v1;
ERROR 42S02: Table 'mysqltest1.v1' doesn't exist

######## CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET @a:=1  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 21 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
22

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
21

-------- switch to master -------
CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET @a:=1;
SELECT MAX(f1) FROM t1;
MAX(f1)
22

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
22

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
22

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
22

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SHOW TRIGGERS;
Trigger	Event	Table	Statement	Timing	Created	sql_mode
trg1	INSERT	t1	 SET @a:=1	BEFORE	NULL	

-------- switch to slave -------
SHOW TRIGGERS;
Trigger	Event	Table	Statement	Timing	Created	sql_mode
trg1	INSERT	t1	 SET @a:=1	BEFORE	NULL	

######## DROP TRIGGER trg1  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 22 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
23

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
22

-------- switch to master -------
DROP TRIGGER trg1;
SELECT MAX(f1) FROM t1;
MAX(f1)
23

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
23

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
23

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
23

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SHOW TRIGGERS;
Trigger	Event	Table	Statement	Timing	Created	sql_mode

-------- switch to slave -------
SHOW TRIGGERS;
Trigger	Event	Table	Statement	Timing	Created	sql_mode

######## CREATE USER user1@localhost  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 23 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
24

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
23

-------- switch to master -------
CREATE USER user1@localhost;
SELECT MAX(f1) FROM t1;
MAX(f1)
24

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
24

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
24

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
24

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SELECT user FROM mysql.user WHERE user = 'user1';
user
user1

-------- switch to slave -------
SELECT user FROM mysql.user WHERE user = 'user1';
user
user1

######## RENAME USER user1@localhost TO rename1@localhost  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 24 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
25

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
24

-------- switch to master -------
RENAME USER user1@localhost TO rename1@localhost;
SELECT MAX(f1) FROM t1;
MAX(f1)
25

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
25

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
25

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
25

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SELECT user FROM mysql.user WHERE user = 'rename1';
user
rename1

-------- switch to slave -------
SELECT user FROM mysql.user WHERE user = 'rename1';
user
rename1

######## DROP USER rename1@localhost  ########

-------- switch to master -------
INSERT INTO t1 SET f1= 25 + 1;
SELECT MAX(f1) FROM t1;
MAX(f1)
26

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
25

-------- switch to master -------
DROP USER rename1@localhost;
SELECT MAX(f1) FROM t1;
MAX(f1)
26

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
26

-------- switch to master -------
ROLLBACK;
SELECT MAX(f1) FROM t1;
MAX(f1)
26

TEST-INFO: MASTER: The INSERT is committed (Succeeded)

-------- switch to slave --------
SELECT MAX(f1) FROM t1;
MAX(f1)
26

TEST-INFO: SLAVE:  The INSERT is committed (Succeeded)

-------- switch to master -------
flush logs;

-------- switch to slave --------
flush logs;

-------- switch to master -------
SELECT user FROM mysql.user WHERE user = 'rename1';
user

-------- switch to slave -------
SELECT user FROM mysql.user WHERE user = 'rename1';
user
DROP DATABASE IF EXISTS mysqltest1;
DROP DATABASE IF EXISTS mysqltest2;
DROP DATABASE IF EXISTS mysqltest3;
+107 −0
Original line number Diff line number Diff line
@@ -391,6 +391,113 @@ SHOW PROCEDURE STATUS LIKE 'p1';
connection master;
--horizontal_results

###############################################################
# Cases with VIEWs
###############################################################
let $my_stmt= CREATE OR REPLACE VIEW v1 as select * from t1;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
SHOW CREATE VIEW v1;
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
SHOW CREATE VIEW v1;
connection master;

let $my_stmt= ALTER VIEW v1 AS select f1 from t1;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
SHOW CREATE VIEW v1;
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
SHOW CREATE VIEW v1;
connection master;

let $my_stmt= DROP VIEW IF EXISTS v1;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
--error 1146
SHOW CREATE VIEW v1;
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
--error 1146
SHOW CREATE VIEW v1;
connection master;

###############################################################
# Cases with TRIGGERs
###############################################################
let $my_stmt= CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET @a:=1;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
SHOW TRIGGERS;
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
SHOW TRIGGERS;
connection master;

let $my_stmt= DROP TRIGGER trg1;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
SHOW TRIGGERS;
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
SHOW TRIGGERS;
connection master;

###############################################################
# Cases with USERs
###############################################################
let $my_stmt= CREATE USER user1@localhost;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
SELECT user FROM mysql.user WHERE user = 'user1';
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
SELECT user FROM mysql.user WHERE user = 'user1';
connection master;

let $my_stmt= RENAME USER user1@localhost TO rename1@localhost;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
SELECT user FROM mysql.user WHERE user = 'rename1';
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
SELECT user FROM mysql.user WHERE user = 'rename1';
connection master;

let $my_stmt= DROP USER rename1@localhost;
let $my_master_commit= true;
let $my_slave_commit= true;
--source include/rpl_stmt_seq.inc
SELECT user FROM mysql.user WHERE user = 'rename1';
--disable_query_log
SELECT '-------- switch to slave -------' as "";
--enable_query_log
connection slave;
SELECT user FROM mysql.user WHERE user = 'rename1';
connection master;

###############################################################
# Cleanup
###############################################################
+15 −0
Original line number Diff line number Diff line
@@ -3684,6 +3684,8 @@ mysql_execute_command(THD *thd)
    if (check_access(thd, INSERT_ACL, "mysql", 0, 1, 1, 0) &&
        check_global_access(thd,CREATE_USER_ACL))
      break;
    if (end_active_trans(thd))
      goto error;
    if (!(res= mysql_create_user(thd, lex->users_list)))
    {
      if (mysql_bin_log.is_open())
@@ -3700,6 +3702,8 @@ mysql_execute_command(THD *thd)
    if (check_access(thd, DELETE_ACL, "mysql", 0, 1, 1, 0) &&
        check_global_access(thd,CREATE_USER_ACL))
      break;
    if (end_active_trans(thd))
      goto error;
    if (!(res= mysql_drop_user(thd, lex->users_list)))
    {
      if (mysql_bin_log.is_open())
@@ -3716,6 +3720,8 @@ mysql_execute_command(THD *thd)
    if (check_access(thd, UPDATE_ACL, "mysql", 0, 1, 1, 0) &&
        check_global_access(thd,CREATE_USER_ACL))
      break;
    if (end_active_trans(thd))
      goto error;
    if (!(res= mysql_rename_user(thd, lex->users_list)))
    {
      if (mysql_bin_log.is_open())
@@ -4510,6 +4516,9 @@ mysql_execute_command(THD *thd)
    }
  case SQLCOM_CREATE_VIEW:
    {
      if (end_active_trans(thd))
        goto error;

      if (!(res= mysql_create_view(thd, thd->lex->create_view_mode)) &&
          mysql_bin_log.is_open())
      {
@@ -4557,6 +4566,9 @@ mysql_execute_command(THD *thd)
    }
  case SQLCOM_CREATE_TRIGGER:
  {
    if (end_active_trans(thd))
      goto error;

    res= mysql_create_or_drop_trigger(thd, all_tables, 1);

    /* We don't care about trigger body after this point */
@@ -4566,6 +4578,9 @@ mysql_execute_command(THD *thd)
  }
  case SQLCOM_DROP_TRIGGER:
  {
    if (end_active_trans(thd))
      goto error;

    res= mysql_create_or_drop_trigger(thd, all_tables, 0);
    break;
  }