###############################################################################
# Bug#20049894: AUTOMATIC_SP_PRIVILEGES ARE NOT CORRECTLY REPLICATED WHEN
# SETTING DEFINER
#
# Problem:
# ========
# Privileges created by automatic_sp_privileges are not correctly replicated
# when the procedure is created by a super user using DEFINER.
#
# Test:
# =====
# Have a privileged user who already has EXECUTE and ALTER ROUTINE privileges
# and execute CREATE PROCEDURE command with and without DEFINER class.
# mysq.procs_priv table should not be updated. Take a non privileged user and
# execute CREATE PROCEDURE command with and without DEFINER class.
# mysql.procs_priv table should be updated.
###############################################################################
--source include/master-slave.inc
--source include/rpl_connection_master.inc

CREATE TABLE t1 (f INT);
INSERT INTO t1 VALUES (10);
INSERT INTO t1 VALUES (20);
--source include/sync_slave_sql_with_master.inc

# Case 1: Privileged user root creating procedure with
# Definer. Procs_priv table should be empty
--source include/rpl_connection_master.inc
CREATE USER 'testuser'@'localhost';
GRANT CREATE ROUTINE ON test.* TO 'testuser'@'localhost';
GRANT REPLICATION CLIENT ON *.* TO 'testuser'@'localhost';
FLUSH PRIVILEGES;

DELIMITER |;
CREATE DEFINER='testuser'@'localhost' PROCEDURE row_cnt()
BEGIN
SELECT COUNT(*) as total_rows FROM test.t1;
END|
DELIMITER ;|
--source include/sync_slave_sql_with_master.inc

--source include/rpl_connection_master.inc
--let $assert_text= Assert that mysql.procs_priv table is empty
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv] = 0
--source include/assert.inc

--source include/rpl_connection_slave.inc
--let $assert_text= Assert that mysql.procs_priv table is empty
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv] = 0
--source include/assert.inc

--source include/rpl_connection_master.inc
DROP PROCEDURE row_cnt;
--source include/sync_slave_sql_with_master.inc

# Case 2: Privileged user root creating procedure without
# Definer. Procs_priv table should be empty
--source include/rpl_connection_master.inc
DELIMITER |;
CREATE  PROCEDURE row_cnt()
BEGIN
SELECT COUNT(*) as total_rows FROM test.t1;
END|
DELIMITER ;|
--source include/sync_slave_sql_with_master.inc

--source include/rpl_connection_master.inc
--let $assert_text= Assert that mysql.procs_priv table is empty
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv] = 0
--source include/assert.inc

--source include/rpl_connection_slave.inc
--let $assert_text= Assert that mysql.procs_priv table is empty
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv] = 0
--source include/assert.inc

--source include/rpl_connection_master.inc
DROP PROCEDURE row_cnt;
--source include/sync_slave_sql_with_master.inc

# Case 3: Non Privileged user testuser creating procedure with
# Definer. Procs_priv table should be updated
--connect(con1,localhost,testuser,,)
--connection con1
DELIMITER |;
CREATE DEFINER='testuser'@'localhost' PROCEDURE row_cnt()
BEGIN
SELECT COUNT(*) as total_rows FROM test.t1;
END|
DELIMITER ;|
--source include/sync_slave_sql_with_master.inc

--source include/rpl_connection_master.inc
--let $assert_text= Assert that mysql.procs_priv table has one row for testuser
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv WHERE User="testuser"] = 1
--source include/assert.inc

--source include/rpl_connection_slave.inc
--let $assert_text= Assert that mysql.procs_priv table has one row for testuser
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv WHERE User="testuser"] = 1
--source include/assert.inc

--connection con1
DROP PROCEDURE row_cnt;
--source include/sync_slave_sql_with_master.inc

# Case 4: Non Privileged user testuser creating procedure with
# Definer. Procs_priv table should be updated
--connection con1
DELIMITER |;
CREATE PROCEDURE row_cnt()
BEGIN
SELECT COUNT(*) as total_rows FROM test.t1;
END|
DELIMITER ;|
--source include/sync_slave_sql_with_master.inc

--source include/rpl_connection_master.inc
--let $assert_text= Assert that mysql.procs_priv table has one row for testuser
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv WHERE User="testuser"] = 1
--source include/assert.inc

--source include/rpl_connection_slave.inc
--let $assert_text= Assert that mysql.procs_priv table has one row for testuser
--let $assert_cond= [SELECT COUNT(*) FROM mysql.procs_priv WHERE User="testuser"] = 1
--source include/assert.inc

# Cleanup
--source include/rpl_connection_master.inc
DROP TABLE t1;
DROP PROCEDURE row_cnt;
DROP USER 'testuser'@'localhost';

--source include/rpl_end.inc
