#
# This test verify if executing DDL statement before trying to manipulate
# a temporary table causes row-based replication to break with error 'table
# does not exist'.
#

# CREATE TABLE when a temporary table is open.
CREATE TEMPORARY TABLE t1 (a INT);
EVAL CREATE TABLE t2 (a INT, b INT) ENGINE= $ENGINE_TYPE;
INSERT INTO t1 VALUES (1);

# CREATE EVENT when a temporary table is open.
CREATE EVENT e1 ON SCHEDULE EVERY 10 HOUR DO SELECT 1;
INSERT INTO t1 VALUES (1);

# ALTER EVENT when a temporary table is open.
ALTER EVENT e1 ON SCHEDULE EVERY 20 HOUR DO SELECT 1;
INSERT INTO t1 VALUES (1);

# DROP EVENT when a temporary table is open.
DROP EVENT IF EXISTS e1;
INSERT INTO t1 VALUES (1);

# CREATE PROCEDURE when a temporary table is open.
CREATE PROCEDURE p1() SELECT 1;
INSERT INTO t1 VALUES (1);

# Alter PROCEDURE when a temporary table is open.
ALTER PROCEDURE p1 SQL SECURITY INVOKER;
INSERT INTO t1 VALUES (1);

# CREATE FUNCTION when a temporary table is open.
CREATE FUNCTION f1() RETURNS INT RETURN 123;
INSERT INTO t1 VALUES (1);

# ALTER FUNCTION when a temporary table is open.
ALTER FUNCTION f1 SQL SECURITY INVOKER;
INSERT INTO t1 VALUES (1);

# CREATE DATABASE when a temporary table is open.
CREATE DATABASE mysqltest1;
INSERT INTO t1 VALUES (1);

# DROP DATABASE when a temporary table is open.
DROP DATABASE mysqltest1;
INSERT INTO t1 VALUES (1);

# CREATE USER when a temporary table is open.
CREATE USER test_1@localhost;
INSERT INTO t1 VALUES (1);

# GRANT select on table to user when a temporary table is open.
GRANT SELECT ON t2 TO test_1@localhost;
INSERT INTO t1 VALUES (1);

# GRANT all on function to user  when a temporary table is open.
GRANT ALL ON f1 TO test_1@localhost;
INSERT INTO t1 VALUES (1);

# GRANT all on procedure to user when a temporary table is open.
GRANT ALL ON p1 TO test_1@localhost;
INSERT INTO t1 VALUES (1);

# GRANT usage on *.* to user when a temporary table is open.
GRANT USAGE ON *.* TO test_1@localhost;
INSERT INTO t1 VALUES (1);

# REVOKE ALL PRIVILEGES on function to user when a temporary table is open.
REVOKE ALL PRIVILEGES ON f1 FROM test_1@localhost;
INSERT INTO t1 VALUES (1);

# REVOKE ALL PRIVILEGES on procedure to user when a temporary table is open.
REVOKE ALL PRIVILEGES ON p1 FROM test_1@localhost;
INSERT INTO t1 VALUES (1);

# REVOKE ALL PRIVILEGES on table to user when a temporary table is open.
REVOKE ALL PRIVILEGES ON t2 FROM test_1@localhost;
INSERT INTO t1 VALUES (1);

# REVOKE usage on *.* from user when a temporary table is open.
REVOKE USAGE ON *.* FROM test_1@localhost;
INSERT INTO t1 VALUES (1);

# RENAME USER when a temporary table is open.
RENAME USER test_1@localhost TO test_2@localhost;
INSERT INTO t1 VALUES (1);

# DROP USER when a temporary table is open.
DROP USER test_2@localhost;
INSERT INTO t1 VALUES (1);

# Test ACL statement in sub statement
DELIMITER |;
CREATE PROCEDURE p2()
BEGIN
    # CREATE USER when a temporary table is open. 
    CREATE TEMPORARY TABLE t3 (a INT);
    CREATE USER test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # GRANT select on table to user when a temporary table is open.
    GRANT SELECT ON t2 TO test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # GRANT all on function to user  when a temporary table is open.
    GRANT ALL ON f1 TO test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # GRANT all on procedure to user when a temporary table is open.
    GRANT ALL ON p1 TO test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # GRANT usage on *.* to user  when a temporary table is open.
    GRANT USAGE ON *.* TO test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # REVOKE ALL PRIVILEGES on function to user when a temporary table is open.
    REVOKE ALL PRIVILEGES ON f1 FROM test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # REVOKE ALL PRIVILEGES on procedure to user when a temporary table is open.
    REVOKE ALL PRIVILEGES ON p1 FROM test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # REVOKE ALL PRIVILEGES on table to user when a temporary table is open.
    REVOKE ALL PRIVILEGES ON t2 FROM test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # REVOKE usage on *.* from user when a temporary table is open.
    REVOKE USAGE ON *.* FROM test_2@localhost;
    INSERT INTO t1 VALUES (1);

    # RENAME USER when a temporary table is open.
    RENAME USER test_2@localhost TO test_3@localhost;
    INSERT INTO t1 VALUES (1);

    # DROP USER when a temporary table is open.
    DROP USER test_3@localhost;
    INSERT INTO t1 VALUES (1);
    DROP TEMPORARY TABLE t3;
END |
DELIMITER ;|

# DROP PROCEDURE when a temporary table is open.
DROP PROCEDURE p1;
INSERT INTO t1 VALUES (1);
DROP PROCEDURE p2;
INSERT INTO t1 VALUES (1);

# DROP FUNCTION when a temporary table is open.
DROP FUNCTION f1;
INSERT INTO t1 VALUES (1);

# DROP TABLE when a temporary table is open.
DROP TABLE t2;
INSERT INTO t1 VALUES (1);

DROP TEMPORARY TABLE t1;

