summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/client_priv.h5
-rw-r--r--client/mysql.cc2
-rw-r--r--client/mysqldump.c9
-rw-r--r--include/my_stacktrace.h2
-rw-r--r--mysql-test/collections/default.experimental1
-rw-r--r--mysql-test/extra/rpl_tests/rpl_current_user.test127
-rw-r--r--mysql-test/extra/rpl_tests/rpl_set_null.test86
-rwxr-xr-xmysql-test/lib/v1/mysql-test-run.pl6
-rwxr-xr-xmysql-test/mysql-test-run.pl8
-rw-r--r--mysql-test/r/delete.result13
-rw-r--r--mysql-test/r/mysqlbinlog.result6
-rw-r--r--mysql-test/r/openssl_1.result4
-rw-r--r--mysql-test/r/select.result63
-rw-r--r--mysql-test/std_data/bug47142_master-bin.000001bin0 -> 386 bytes
-rw-r--r--mysql-test/std_data/cacert.pem24
-rw-r--r--mysql-test/std_data/client-cert.pem83
-rw-r--r--mysql-test/std_data/client-key.pem20
-rw-r--r--mysql-test/std_data/server-cert.pem78
-rw-r--r--mysql-test/std_data/server-key.pem14
-rw-r--r--mysql-test/std_data/server8k-cert.pem243
-rw-r--r--mysql-test/std_data/server8k-key.pem194
-rw-r--r--mysql-test/suite/rpl/r/rpl_binlog_grant.result6
-rw-r--r--mysql-test/suite/rpl/r/rpl_events.result42
-rw-r--r--mysql-test/suite/rpl/r/rpl_get_master_version_and_clock.result5
-rw-r--r--mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result4
-rw-r--r--mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result4
-rw-r--r--mysql-test/suite/rpl/r/rpl_set_null_innodb.result35
-rw-r--r--mysql-test/suite/rpl/r/rpl_set_null_myisam.result35
-rw-r--r--mysql-test/suite/rpl/r/rpl_sp.result16
-rw-r--r--mysql-test/suite/rpl/r/rpl_stm_until.result20
-rw-r--r--mysql-test/suite/rpl/r/rpl_user.result1755
-rw-r--r--mysql-test/suite/rpl/t/rpl_binlog_grant.test4
-rw-r--r--mysql-test/suite/rpl/t/rpl_events.test82
-rw-r--r--mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test7
-rw-r--r--mysql-test/suite/rpl/t/rpl_set_null_innodb.test6
-rw-r--r--mysql-test/suite/rpl/t/rpl_set_null_myisam.test5
-rw-r--r--mysql-test/suite/rpl/t/rpl_stm_until.test35
-rw-r--r--mysql-test/suite/rpl/t/rpl_user.test83
-rw-r--r--mysql-test/suite/rpl_ndb/r/rpl_ndb_set_null.result35
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_set_null.test6
-rw-r--r--mysql-test/t/delete.test19
-rw-r--r--mysql-test/t/openssl_1.test4
-rw-r--r--mysql-test/t/select.test40
-rw-r--r--sql/events.cc79
-rw-r--r--sql/field.h7
-rw-r--r--sql/filesort.cc2
-rw-r--r--sql/item_strfunc.cc37
-rw-r--r--sql/item_strfunc.h4
-rw-r--r--sql/log_event.cc39
-rw-r--r--sql/log_event.h17
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/mysqld.cc42
-rw-r--r--sql/rpl_injector.cc12
-rw-r--r--sql/rpl_record.cc17
-rw-r--r--sql/sql_acl.cc124
-rw-r--r--sql/sql_db.cc2
-rw-r--r--sql/sql_lex.h25
-rw-r--r--sql/sql_parse.cc6
-rw-r--r--sql/sql_select.cc13
-rw-r--r--sql/sql_table.cc2
-rw-r--r--sql/sql_test.cc24
-rw-r--r--sql/sql_yacc.yy36
62 files changed, 3219 insertions, 507 deletions
diff --git a/client/client_priv.h b/client/client_priv.h
index fddffd70866..43698876a7b 100644
--- a/client/client_priv.h
+++ b/client/client_priv.h
@@ -37,7 +37,7 @@
#define WARN_DEPRECATED(Ver,Old,New) \
do { \
printf("Warning: The option '%s' is deprecated and will be removed " \
- "in MySQL %s. Please use %s instead.\n", (Old), (Ver), (New)); \
+ "in a future release. Please use %s instead.\n", (Old), (New)); \
} while(0);
enum options_client
@@ -57,7 +57,7 @@ enum options_client
OPT_PROMPT, OPT_IGN_LINES,OPT_TRANSACTION,OPT_MYSQL_PROTOCOL,
OPT_SHARED_MEMORY_BASE_NAME, OPT_FRM, OPT_SKIP_OPTIMIZATION,
OPT_COMPATIBLE, OPT_RECONNECT, OPT_DELIMITER, OPT_SECURE_AUTH,
- OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_CREATE_OPTIONS, OPT_SERVER_ARG,
+ OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_SERVER_ARG,
OPT_POSITION, OPT_STOP_POSITION, OPT_START_DATETIME, OPT_STOP_DATETIME,
OPT_SIGINT_IGNORE, OPT_HEXBLOB, OPT_ORDER_BY_PRIMARY, OPT_COUNT,
#ifdef HAVE_NDBCLUSTER_DB
@@ -91,5 +91,6 @@ enum options_client
OPT_WRITE_BINLOG, OPT_DUMP_DATE,
OPT_INIT_COMMAND,
OPT_FIRST_SLAVE,
+ OPT_ALL,
OPT_MAX_CLIENT_OPTION
};
diff --git a/client/mysql.cc b/client/mysql.cc
index a2f8044a978..6505676158c 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -1632,7 +1632,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
init_tee(argument);
break;
case OPT_NOTEE:
- printf("WARNING: option deprecated; use --disable-tee instead.\n");
+ WARN_DEPRECATED(VER_CELOSIA, "--no-tee", "--disable-tee");
if (opt_outfile)
end_tee();
break;
diff --git a/client/mysqldump.c b/client/mysqldump.c
index ab41b88493f..bb69801517c 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -179,7 +179,7 @@ HASH ignore_table;
static struct my_option my_long_options[] =
{
- {"all", 'a', "Deprecated. Use --create-options instead.",
+ {"all", OPT_ALL, "Deprecated. Use --create-options instead.",
(uchar**) &create_options, (uchar**) &create_options, 0, GET_BOOL, NO_ARG, 1,
0, 0, 0, 0, 0},
{"all-databases", 'A',
@@ -230,7 +230,7 @@ static struct my_option my_long_options[] =
{"compress", 'C', "Use compression in server/client protocol.",
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
0, 0, 0},
- {"create-options", OPT_CREATE_OPTIONS,
+ {"create-options", 'a',
"Include all MySQL specific create options.",
(uchar**) &create_options, (uchar**) &create_options, 0, GET_BOOL, NO_ARG, 1,
0, 0, 0, 0, 0},
@@ -268,7 +268,7 @@ static struct my_option my_long_options[] =
(uchar**) &opt_events, (uchar**) &opt_events, 0, GET_BOOL,
NO_ARG, 0, 0, 0, 0, 0, 0},
{"extended-insert", 'e',
- "Allows utilization of the new, much faster INSERT syntax.",
+ "Use multiple-row INSERT syntax that include several VALUES lists.",
(uchar**) &extended_insert, (uchar**) &extended_insert, 0, GET_BOOL, NO_ARG,
1, 0, 0, 0, 0, 0},
{"fields-terminated-by", OPT_FTB,
@@ -762,6 +762,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
case 'O':
WARN_DEPRECATED(VER_CELOSIA, "--set-variable", "--variable-name=value");
break;
+ case (int) OPT_ALL:
+ WARN_DEPRECATED(VER_CELOSIA, "--all", "--create-options");
+ break;
case (int) OPT_FIRST_SLAVE:
WARN_DEPRECATED(VER_CELOSIA, "--first-slave", "--lock-all-tables");
break;
diff --git a/include/my_stacktrace.h b/include/my_stacktrace.h
index df384b1c566..9250fd4579e 100644
--- a/include/my_stacktrace.h
+++ b/include/my_stacktrace.h
@@ -23,7 +23,7 @@
(defined(__alpha__) && defined(__GNUC__))
#define HAVE_STACKTRACE 1
#endif
-#elif defined(__WIN__) || defined(__sun)
+#elif defined(__WIN__) || defined(HAVE_PRINTSTACK)
#define HAVE_STACKTRACE 1
#endif
diff --git a/mysql-test/collections/default.experimental b/mysql-test/collections/default.experimental
index f661986ed25..b989491c193 100644
--- a/mysql-test/collections/default.experimental
+++ b/mysql-test/collections/default.experimental
@@ -16,7 +16,6 @@ main.plugin # Bug#47146 Linking problem with exampl
main.signal_demo3 @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun
main.sp @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun
-rpl.rpl_get_master_version_and_clock* # Bug#49191 2009-12-01 Daogang rpl_get_master_version_and_clock failed on PB2: COM_REGISTER_SLAVE failed
rpl.rpl_heartbeat_basic # BUG#43828 2009-10-22 luis fails sporadically
rpl.rpl_heartbeat_2slaves # BUG#43828 2009-10-22 luis fails sporadically
rpl.rpl_innodb_bug28430* # Bug#46029
diff --git a/mysql-test/extra/rpl_tests/rpl_current_user.test b/mysql-test/extra/rpl_tests/rpl_current_user.test
new file mode 100644
index 00000000000..7ec38e0c151
--- /dev/null
+++ b/mysql-test/extra/rpl_tests/rpl_current_user.test
@@ -0,0 +1,127 @@
+--let $count=1
+connection master;
+
+if (`SELECT '$diff_table' = ''`)
+{
+ let $diff_table= mysql.user;
+}
+
+--echo
+--echo
+--echo
+--echo TEST STATEMENT: '$statement'
+--echo --------------------------------------------------------------------------
+
+if (`SELECT '$diff_columns' = ''`)
+{
+ eval CREATE VIEW test.bug48321_v1 AS SELECT user FROM $diff_table
+ WHERE user LIKE 'bug48321%';
+}
+
+if (`SELECT '$diff_columns' <> ''`)
+{
+ eval CREATE VIEW test.bug48321_v1 AS SELECT user, $diff_columns
+ FROM $diff_table WHERE user LIKE 'bug48321%';
+}
+
+while (`SELECT $count < 6`)
+{
+ --echo
+ --echo TEST STATEMENT: '$statement'
+ --echo CASE $count:
+ --echo -------
+
+ let $user2= 'bug48321_2'@'localhost';
+ let $user3= 'bug48321_3'@'localhost';
+
+ let $user1= CURRENT_USER();
+ if (`SELECT '$action'='RENAME'`)
+ {
+ let $user1= $user1 TO 'bug48321_4'@'localhost';
+ let $user2= $user2 TO 'bug48321_5'@'localhost';
+ let $user3= $user3 TO 'bug48321_6'@'localhost';
+ }
+
+ if (`SELECT '$action'='GRANT'`)
+ {
+ let $user1= $user1 IDENTIFIED BY 'user1';
+ let $user3= $user3 IDENTIFIED BY '';
+ }
+
+ if (`SELECT $count=1`)
+ {
+ --echo # Only CURRENT_USER() in the user list of the test statement.
+ let $users_list= $user1;
+ }
+
+ if (`SELECT $count=2`)
+ {
+ --echo # Two users are in the test statement, CURRENT_USER is the first one.
+ let $users_list= $user1, $user2;
+ }
+
+ if (`SELECT $count=3`)
+ {
+ --echo # Two users are in the test statement, CURRENT_USER is the last one.
+ let $users_list= $user2, $user1;
+ }
+
+ if (`SELECT $count=4`)
+ {
+ --echo # Three users are in the test statement, CURRENT_USER is the second one.
+ let $users_list= $user2, $user1, $user3;
+ }
+
+ if (`SELECT $count=5`)
+ {
+ --echo # CURRENT_USER is not in the test statement.
+ let $users_list= $user2, $user3;
+ }
+
+ --echo users_list= $users_list
+ --echo
+ --echo # Connect to master with user1, so user1 always is the current user,
+ --echo # when test statement is runing.
+ eval GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+ eval CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+ if (`SELECT '$action'='REVOKE'`)
+ {
+ --echo
+ --echo # Grant some privileges to users at first when testing
+ --echo # 'REVOKE ...' statement.
+ eval GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+ 'bug48321_3'@'localhost' WITH GRANT OPTION;
+ eval GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+ 'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+ }
+
+ connect (conn1, 127.0.0.1, 'bug48321_1'@'localhost',,);
+ connection conn1;
+ --echo
+ let $temp= `SELECT "$statement"`;
+ eval $temp;
+ --echo
+
+ disconnect conn1;
+
+ connection master;
+ sync_slave_with_master;
+
+ connection master;
+ let $diff_table_1= master:test.bug48321_v1;
+ let $diff_table_2= slave:test.bug48321_v1;
+ source include/diff_tables.inc;
+ --echo
+
+ --echo # Delete all bug48321% users
+ connection master;
+ DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+ DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+ FLUSH PRIVILEGES;
+
+ inc $count;
+}
+DROP VIEW test.bug48321_v1;
diff --git a/mysql-test/extra/rpl_tests/rpl_set_null.test b/mysql-test/extra/rpl_tests/rpl_set_null.test
new file mode 100644
index 00000000000..f2aba089279
--- /dev/null
+++ b/mysql-test/extra/rpl_tests/rpl_set_null.test
@@ -0,0 +1,86 @@
+# Both of the following tests check that comparison of binlog BI
+# against SE record will not fail due to remains from previous values
+# in the SE record (before a given field was set to null).
+#
+# In MIXED mode:
+# - Insert and update are executed as statements
+# - Delete is executed as a row event
+# - Assertion: checks that comparison will not fail because the update
+# statement will clear the record contents for the nulled
+# field. If data was not cleared, some engines may keep
+# the value and return it later as garbage - despite the
+# fact that field is null. This may cause slave to
+# falsely fail in the comparison (memcmp would fail
+# because of "garbage" in record data).
+#
+# In ROW mode:
+# - Insert, update and delete are executed as row events.
+# - Assertion: checks that comparison will not fail because the update
+# rows event will clear the record contents before
+# feeding the new value to the SE. This protects against
+# SEs that do not clear record contents when storing
+# nulled fields. If the engine did not clear the data it
+# would cause slave to falsely fail in the comparison
+# (memcmp would fail because of "garbage" in record
+# data). This scenario is pretty much the same described
+# above in MIXED mode, but checks different execution
+# path in the slave.
+
+# BUG#49481: RBR: MyISAM and bit fields may cause slave to stop on
+# delete cant find record
+
+-- source include/master-slave-reset.inc
+
+-- connection master
+-- eval CREATE TABLE t1 (c1 BIT, c2 INT) Engine=$engine
+INSERT INTO `t1` VALUES ( 1, 1 );
+UPDATE t1 SET c1=NULL where c2=1;
+-- sync_slave_with_master
+
+-- let $diff_table_1=master:test.t1
+-- let $diff_table_2=slave:test.t1
+-- source include/diff_tables.inc
+
+-- connection master
+# triggers switch to row mode when on mixed
+DELETE FROM t1 WHERE c2=1 LIMIT 1;
+-- sync_slave_with_master
+
+-- let $diff_table_1=master:test.t1
+-- let $diff_table_2=slave:test.t1
+-- source include/diff_tables.inc
+
+-- connection master
+DROP TABLE t1;
+-- sync_slave_with_master
+
+-- source include/master-slave-reset.inc
+
+-- connection master
+
+# BUG#49482: RBR: Replication may break on deletes when MyISAM tables
+# + char field are used
+
+-- eval CREATE TABLE t1 (c1 CHAR) Engine=$engine
+
+INSERT INTO t1 ( c1 ) VALUES ( 'w' ) ;
+SELECT * FROM t1;
+UPDATE t1 SET c1=NULL WHERE c1='w';
+-- sync_slave_with_master
+
+-- let $diff_table_1=master:test.t1
+-- let $diff_table_2=slave:test.t1
+-- source include/diff_tables.inc
+
+-- connection master
+# triggers switch to row mode when on mixed
+DELETE FROM t1 LIMIT 2;
+-- sync_slave_with_master
+
+-- let $diff_table_1=master:test.t1
+-- let $diff_table_2=slave:test.t1
+-- source include/diff_tables.inc
+
+-- connection master
+DROP TABLE t1;
+-- sync_slave_with_master
diff --git a/mysql-test/lib/v1/mysql-test-run.pl b/mysql-test/lib/v1/mysql-test-run.pl
index 86ad5c485c1..caece1d355d 100755
--- a/mysql-test/lib/v1/mysql-test-run.pl
+++ b/mysql-test/lib/v1/mysql-test-run.pl
@@ -1102,14 +1102,16 @@ sub command_line_setup () {
if ( ! $opt_testcase_timeout )
{
- $opt_testcase_timeout= $default_testcase_timeout;
+ $opt_testcase_timeout=
+ $ENV{MTR_TESTCASE_TIMEOUT} || $default_testcase_timeout;
$opt_testcase_timeout*= 10 if $opt_valgrind;
$opt_testcase_timeout*= 10 if ($opt_debug and $glob_win32);
}
if ( ! $opt_suite_timeout )
{
- $opt_suite_timeout= $default_suite_timeout;
+ $opt_suite_timeout=
+ $ENV{MTR_SUITE_TIMEOUT} || $default_suite_timeout;
$opt_suite_timeout*= 6 if $opt_valgrind;
$opt_suite_timeout*= 6 if ($opt_debug and $glob_win32);
}
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index f6a1d0fa6a5..7845fe75833 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -198,10 +198,10 @@ my $opt_mark_progress;
my $opt_sleep;
-my $opt_testcase_timeout= 15; # minutes
-my $opt_suite_timeout = 300; # minutes
-my $opt_shutdown_timeout= 10; # seconds
-my $opt_start_timeout = 180; # seconds
+my $opt_testcase_timeout= $ENV{MTR_TESTCASE_TIMEOUT} || 15; # minutes
+my $opt_suite_timeout = $ENV{MTR_SUITE_TIMEOUT} || 300; # minutes
+my $opt_shutdown_timeout= $ENV{MTR_SHUTDOWN_TIMEOUT} || 10; # seconds
+my $opt_start_timeout = $ENV{MTR_START_TIMEOUT} || 180; # seconds
sub testcase_timeout { return $opt_testcase_timeout * 60; };
sub suite_timeout { return $opt_suite_timeout * 60; };
diff --git a/mysql-test/r/delete.result b/mysql-test/r/delete.result
index 1df19a75854..58278492985 100644
--- a/mysql-test/r/delete.result
+++ b/mysql-test/r/delete.result
@@ -337,3 +337,16 @@ END |
DELETE IGNORE FROM t1;
ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
DROP TABLE t1;
+#
+# Bug #49552 : sql_buffer_result cause crash + not found records
+# in multitable delete/subquery
+#
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES (1),(2),(3);
+SET SESSION SQL_BUFFER_RESULT=1;
+DELETE t1 FROM (SELECT SUM(a) a FROM t1) x,t1;
+SET SESSION SQL_BUFFER_RESULT=DEFAULT;
+SELECT * FROM t1;
+a
+DROP TABLE t1;
+End of 5.1 tests
diff --git a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result
index f5c40202101..b7aa981f834 100644
--- a/mysql-test/r/mysqlbinlog.result
+++ b/mysql-test/r/mysqlbinlog.result
@@ -93,7 +93,7 @@ ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
--- --position --
-Warning: The option '--position' is deprecated and will be removed in MySQL 5.6. Please use --start-position instead.
+Warning: The option '--position' is deprecated and will be removed in a future release. Please use --start-position instead.
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
@@ -194,7 +194,7 @@ ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
--- --position --
-Warning: The option '--position' is deprecated and will be removed in MySQL 5.6. Please use --start-position instead.
+Warning: The option '--position' is deprecated and will be removed in a future release. Please use --start-position instead.
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
@@ -235,7 +235,7 @@ DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
-Warning: The option '--position' is deprecated and will be removed in MySQL 5.6. Please use --start-position instead.
+Warning: The option '--position' is deprecated and will be removed in a future release. Please use --start-position instead.
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
diff --git a/mysql-test/r/openssl_1.result b/mysql-test/r/openssl_1.result
index b0dd3acd662..6389438c993 100644
--- a/mysql-test/r/openssl_1.result
+++ b/mysql-test/r/openssl_1.result
@@ -3,8 +3,8 @@ create table t1(f1 int);
insert into t1 values (5);
grant select on test.* to ssl_user1@localhost require SSL;
grant select on test.* to ssl_user2@localhost require cipher "DHE-RSA-AES256-SHA";
-grant select on test.* to ssl_user3@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB/emailAddress=abstract.mysql.developer@mysql.com";
-grant select on test.* to ssl_user4@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB/emailAddress=abstract.mysql.developer@mysql.com" ISSUER "/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB";
+grant select on test.* to ssl_user3@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB";
+grant select on test.* to ssl_user4@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB" ISSUER "/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB";
grant select on test.* to ssl_user5@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "xxx";
flush privileges;
connect(localhost,ssl_user5,,test,MASTER_PORT,MASTER_SOCKET);
diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index 695d45deba9..a65360d83bb 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -4526,6 +4526,69 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
Warnings:
Note 1003 select '2001-01-01 00:00:00' AS `a`,'2001-01-01 00:00:00' AS `a`,'2001-01-01 00:00:00' AS `a` from dual where 1
DROP TABLE t1;
+#
+# Bug #49897: crash in ptr_compare when char(0) NOT NULL
+# column is used for ORDER BY
+#
+SET @old_sort_buffer_size= @@session.sort_buffer_size;
+SET @@sort_buffer_size= 40000;
+CREATE TABLE t1(a CHAR(0) NOT NULL);
+INSERT INTO t1 VALUES (0), (0), (0);
+INSERT INTO t1 SELECT t11.a FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a FROM t1 t11, t1 t12;
+EXPLAIN SELECT a FROM t1 ORDER BY a;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 24492
+SELECT a FROM t1 ORDER BY a;
+DROP TABLE t1;
+CREATE TABLE t1(a CHAR(0) NOT NULL, b CHAR(0) NOT NULL, c int);
+INSERT INTO t1 VALUES (0, 0, 0), (0, 0, 2), (0, 0, 1);
+INSERT INTO t1 SELECT t11.a, t11.b, t11.c FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a, t11.b, t11.c FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a, t11.b, t11.c FROM t1 t11, t1 t12;
+EXPLAIN SELECT a FROM t1 ORDER BY a LIMIT 5;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 24492
+SELECT a FROM t1 ORDER BY a LIMIT 5;
+a
+
+
+
+
+
+EXPLAIN SELECT * FROM t1 ORDER BY a, b LIMIT 5;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 24492
+SELECT * FROM t1 ORDER BY a, b LIMIT 5;
+a b c
+ 0
+ 2
+ 1
+ 0
+ 2
+EXPLAIN SELECT * FROM t1 ORDER BY a, b, c LIMIT 5;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 24492 Using filesort
+SELECT * FROM t1 ORDER BY a, b, c LIMIT 5;
+a b c
+ 0
+ 0
+ 0
+ 0
+ 0
+EXPLAIN SELECT * FROM t1 ORDER BY c, a LIMIT 5;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 24492 Using filesort
+SELECT * FROM t1 ORDER BY c, a LIMIT 5;
+a b c
+ 0
+ 0
+ 0
+ 0
+ 0
+SET @@sort_buffer_size= @old_sort_buffer_size;
+DROP TABLE t1;
End of 5.0 tests
create table t1(a INT, KEY (a));
INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
diff --git a/mysql-test/std_data/bug47142_master-bin.000001 b/mysql-test/std_data/bug47142_master-bin.000001
new file mode 100644
index 00000000000..d1a089a784a
--- /dev/null
+++ b/mysql-test/std_data/bug47142_master-bin.000001
Binary files differ
diff --git a/mysql-test/std_data/cacert.pem b/mysql-test/std_data/cacert.pem
index 5473e4b153e..e44341384e4 100644
--- a/mysql-test/std_data/cacert.pem
+++ b/mysql-test/std_data/cacert.pem
@@ -1,17 +1,17 @@
-----BEGIN CERTIFICATE-----
-MIICrTCCAhagAwIBAgIJAJXpePU0UOTVMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV
+MIICrTCCAhagAwIBAgIJAMI7xZKjhrDbMA0GCSqGSIb3DQEBBAUAMEQxCzAJBgNV
BAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBzYWxhMREwDwYD
-VQQKEwhNeVNRTCBBQjAeFw0wOTAxMjgxMDQ5NDZaFw0xNDAxMjcxMDQ5NDZaMEQx
+VQQKEwhNeVNRTCBBQjAeFw0xMDAxMjkxMTQ3MTBaFw0xNTAxMjgxMTQ3MTBaMEQx
CzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBzYWxh
MREwDwYDVQQKEwhNeVNRTCBBQjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
-4XQHAe5R1+TXC8noZtWf+d5E0v1C59FWpn9SWEUCBjE5UiIwuJvi4Y+7xWGOXLAI
-/JzJx5gNXLBiTsE/zh0uX9fKlajLhxB0GN+QU0ZlpQ1BeYipEcNXeI/7cT499f6v
-XWabnTflivdCgHSWUOQ20/Lzs6kP6/e6OoZd/DPSjPECAwEAAaOBpjCBozAdBgNV
-HQ4EFgQU8uLqVWWkmuKsnZf1RWz294wRrd8wdAYDVR0jBG0wa4AU8uLqVWWkmuKs
-nZf1RWz294wRrd+hSKRGMEQxCzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxh
-MRAwDgYDVQQHEwdVcHBzYWxhMREwDwYDVQQKEwhNeVNRTCBBQoIJAJXpePU0UOTV
-MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAMMTE5sDN+Z0ZlV7KvH3g
-6+aKvql8dTpRT3hYukeQlWua0nq74WPGVw0c4e/M/vbiMwmJcCYpB9pd4+dHqzSw
-aPyoenjY6UF8n7B4quWy3SIUk2LSHeJLW+kzJn2afN9gvipFhdVh/uU2TIyLGOur
-Z/vmJX2W7hF1uqPnbfa8Lrw=
+wQYsOEfrN4ESP3FjsI8cghE+tZVuyK2gck61lwieVxjgFMtBd65mI5a1y9pmlOI1
+yM4SB2Ppqcuw7/e1CdV1y7lvHrGNt5yqEHbN4QX1gvsN8TQauP/2WILturk4R4Hq
+rKg0ZySu7f1Xhl0ed9a48LpaEHD17IcxWEGMMJwAxF0CAwEAAaOBpjCBozAMBgNV
+HRMEBTADAQH/MB0GA1UdDgQWBBSvktYQ0ahLnyxyVKqty+WpBbBrDTB0BgNVHSME
+bTBrgBSvktYQ0ahLnyxyVKqty+WpBbBrDaFIpEYwRDELMAkGA1UEBhMCU0UxEDAO
+BgNVBAgTB1VwcHNhbGExEDAOBgNVBAcTB1VwcHNhbGExETAPBgNVBAoTCE15U1FM
+IEFCggkAwjvFkqOGsNswDQYJKoZIhvcNAQEEBQADgYEAdKN1PjwMHAKG2Ww1145g
+JQGBnKxSFOUaoSvkBi/4ntTM+ysnViWh7WvxyWjR9zU9arfr7aqsDeQxm0XDOqzj
+AQ/cQIla2/Li8tXyfc06bisH/IHRaSc2zWqioTKbEwMdVOdrvq4a8V8ic3xYyIWn
+7F4WeS07J8LKardSvM0+hOA=
-----END CERTIFICATE-----
diff --git a/mysql-test/std_data/client-cert.pem b/mysql-test/std_data/client-cert.pem
index 9300520793e..ee7f2ab281e 100644
--- a/mysql-test/std_data/client-cert.pem
+++ b/mysql-test/std_data/client-cert.pem
@@ -1,55 +1,46 @@
Certificate:
Data:
- Version: 3 (0x2)
- Serial Number: 3 (0x3)
- Signature Algorithm: sha1WithRSAEncryption
+ Version: 1 (0x0)
+ Serial Number: 1048577 (0x100001)
+ Signature Algorithm: md5WithRSAEncryption
Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB
Validity
- Not Before: Jan 28 11:04:39 2009 GMT
- Not After : Jan 28 11:04:39 2010 GMT
- Subject: C=SE, ST=Uppsala, O=MySQL AB/emailAddress=abstract.mysql.developer@mysql.com
+ Not Before: Jan 29 11:50:22 2010 GMT
+ Not After : Jan 28 11:50:22 2015 GMT
+ Subject: C=SE, ST=Uppsala, O=MySQL AB
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- RSA Public Key: (512 bit)
- Modulus (512 bit):
- 00:e1:52:30:2c:d9:be:64:28:91:5d:7a:fd:d9:e9:
- 14:35:7a:d2:94:4e:91:46:e0:db:9f:6b:79:f4:4c:
- ac:6e:07:61:34:86:74:62:a7:a8:44:af:fa:87:87:
- a8:7d:42:61:ff:ab:50:d4:7b:bf:75:fa:d5:d5:b3:
- 74:fb:56:1e:37
+ Public-Key: (1024 bit)
+ Modulus:
+ 00:cc:9a:37:49:13:66:dc:cf:e3:0b:13:a1:23:ed:
+ 78:db:4e:bd:11:f6:8c:0d:76:f9:a3:32:56:9a:f8:
+ a1:21:6a:55:4e:4d:3f:e6:67:9d:26:99:b2:cd:a4:
+ 9a:d2:2b:59:5c:d7:8a:d3:60:68:f8:18:bd:c5:be:
+ 15:e1:2a:3c:a3:d4:61:cb:f5:11:94:17:81:81:f7:
+ 87:8c:f6:6a:d2:ee:d8:e6:77:f6:62:66:4d:2e:16:
+ 8d:08:81:4a:c9:c6:4b:31:e5:b9:c7:8a:84:96:48:
+ a7:47:8c:0d:26:90:56:4e:e6:a5:6e:8c:b3:f2:9f:
+ fc:3d:78:9b:49:6e:86:83:77
Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints:
- CA:FALSE
- X509v3 Subject Key Identifier:
- 58:30:B5:9B:2C:05:94:06:BA:3D:3C:F0:B2:CD:1D:67:65:E3:7F:85
- X509v3 Authority Key Identifier:
- keyid:F2:E2:EA:55:65:A4:9A:E2:AC:9D:97:F5:45:6C:F6:F7:8C:11:AD:DF
- DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB
- serial:95:E9:78:F5:34:50:E4:D5
-
- Signature Algorithm: sha1WithRSAEncryption
- 05:19:e3:13:14:fc:c5:28:bf:69:f8:00:b3:25:cb:bd:ca:9f:
- 2f:4c:b3:a8:04:11:f0:74:27:bd:82:2c:b4:49:9b:a7:59:f0:
- f7:87:d1:e0:ba:99:a2:fe:4b:1d:10:6f:e4:a2:b3:cd:7f:8b:
- 68:31:46:ee:cd:9e:e2:47:e1:4c:fa:74:d1:e2:8b:cc:a0:4b:
- a8:24:d1:a4:c3:6b:2a:c6:28:cd:41:e0:06:48:e6:cf:f2:3c:
- ca:37:95:d7:29:64:6b:91:91:83:e7:ac:c8:0b:87:bc:da:a6:
- aa:f1:44:43:c8:74:7b:15:26:91:2e:03:c4:71:50:6c:f8:68:
- dc:8c
+ Signature Algorithm: md5WithRSAEncryption
+ 5e:1f:a3:53:5f:24:13:1c:f8:28:32:b0:7f:69:69:f3:0e:c0:
+ 34:87:10:03:7d:da:15:8b:bd:19:b8:1a:56:31:e7:85:49:81:
+ c9:7f:45:20:74:3e:89:c0:e0:26:84:51:cc:04:16:ce:69:99:
+ 01:e1:26:99:b3:e3:f5:bd:ec:5f:a0:84:e4:38:da:75:78:7b:
+ 89:9c:d2:cd:60:95:20:ba:8e:e3:7c:e6:df:76:3a:7c:89:77:
+ 02:94:86:11:3a:c4:61:7d:6f:71:83:21:8a:17:fb:17:e2:ee:
+ 02:6b:61:c1:b4:52:63:d7:d8:46:b2:c5:9c:6f:38:91:8a:35:
+ 32:0b
-----BEGIN CERTIFICATE-----
-MIICfzCCAeigAwIBAgIBAzANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ
-MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT
-UUwgQUIwHhcNMDkwMTI4MTEwNDM5WhcNMTAwMTI4MTEwNDM5WjBlMQswCQYDVQQG
-EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxMTAvBgkq
-hkiG9w0BCQEWImFic3RyYWN0Lm15c3FsLmRldmVsb3BlckBteXNxbC5jb20wXDAN
-BgkqhkiG9w0BAQEFAANLADBIAkEA4VIwLNm+ZCiRXXr92ekUNXrSlE6RRuDbn2t5
-9EysbgdhNIZ0YqeoRK/6h4eofUJh/6tQ1Hu/dfrV1bN0+1YeNwIDAQABo4GjMIGg
-MAkGA1UdEwQCMAAwHQYDVR0OBBYEFFgwtZssBZQGuj088LLNHWdl43+FMHQGA1Ud
-IwRtMGuAFPLi6lVlpJrirJ2X9UVs9veMEa3foUikRjBEMQswCQYDVQQGEwJTRTEQ
-MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT
-UUwgQUKCCQCV6Xj1NFDk1TANBgkqhkiG9w0BAQUFAAOBgQAFGeMTFPzFKL9p+ACz
-Jcu9yp8vTLOoBBHwdCe9giy0SZunWfD3h9Hgupmi/ksdEG/korPNf4toMUbuzZ7i
-R+FM+nTR4ovMoEuoJNGkw2sqxijNQeAGSObP8jzKN5XXKWRrkZGD56zIC4e82qaq
-8URDyHR7FSaRLgPEcVBs+GjcjA==
+MIIB5zCCAVACAxAAATANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJTRTEQMA4G
+A1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwg
+QUIwHhcNMTAwMTI5MTE1MDIyWhcNMTUwMTI4MTE1MDIyWjAyMQswCQYDVQQGEwJT
+RTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIwgZ8wDQYJKoZI
+hvcNAQEBBQADgY0AMIGJAoGBAMyaN0kTZtzP4wsToSPteNtOvRH2jA12+aMyVpr4
+oSFqVU5NP+ZnnSaZss2kmtIrWVzXitNgaPgYvcW+FeEqPKPUYcv1EZQXgYH3h4z2
+atLu2OZ39mJmTS4WjQiBSsnGSzHluceKhJZIp0eMDSaQVk7mpW6Ms/Kf/D14m0lu
+hoN3AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAXh+jU18kExz4KDKwf2lp8w7ANIcQ
+A33aFYu9GbgaVjHnhUmByX9FIHQ+icDgJoRRzAQWzmmZAeEmmbPj9b3sX6CE5Dja
+dXh7iZzSzWCVILqO43zm33Y6fIl3ApSGETrEYX1vcYMhihf7F+LuAmthwbRSY9fY
+RrLFnG84kYo1Mgs=
-----END CERTIFICATE-----
diff --git a/mysql-test/std_data/client-key.pem b/mysql-test/std_data/client-key.pem
index 9ef464d0875..205b5f31cb9 100644
--- a/mysql-test/std_data/client-key.pem
+++ b/mysql-test/std_data/client-key.pem
@@ -1,9 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
-MIIBOQIBAAJBAOFSMCzZvmQokV16/dnpFDV60pROkUbg259refRMrG4HYTSGdGKn
-qESv+oeHqH1CYf+rUNR7v3X61dWzdPtWHjcCAwEAAQJAXYooM8ZlcuEgj+VKU1ee
-qyEFIMqJJxqcMk+E/nWCM96WxCP3zHNSrqNfSpI3ld7QzMwhdRz+gFLxT2gGNpIw
-MQIhAPxzM/lDihe67X3ADYtDl9ZjA8Pm430x9sXlcxI17tCZAiEA5H1SyFl4mUee
-9VnfSC2XGW7lwz72ZygfVX+b7tLWF08CIEh40gzW5MfXM+KLxdea+fXjyursV5ZT
-R6KcMiKiNQLRAiAcmHqlzFzFgisotai2Fc6VRkXHG7gmzOSvBJt1VjmpDQIge6jf
-2N7whTdvC4ferB+zUlgWQdyvx1c3T4gnt6PYdaY=
+MIICXQIBAAKBgQDMmjdJE2bcz+MLE6Ej7XjbTr0R9owNdvmjMlaa+KEhalVOTT/m
+Z50mmbLNpJrSK1lc14rTYGj4GL3FvhXhKjyj1GHL9RGUF4GB94eM9mrS7tjmd/Zi
+Zk0uFo0IgUrJxksx5bnHioSWSKdHjA0mkFZO5qVujLPyn/w9eJtJboaDdwIDAQAB
+AoGASqk/4We2En+93y3jkIO4pXafIe3w/3zZ7caRue1ehx4RUQh5d+95djuB9u7J
+HEZ7TpjM7QNyao5EueL6gvbxt0LXFvqAMni7yM9tt/HUYtHHPqYiRtUny9bKYFTm
+l8szCCMal/wD9GZU9ByHDNHm7tHUMyMhARNTYSgx+SERFmECQQD/6jJocC4SXf6f
+T3LqimWR02lbJ7qCoDgRglsUXh0zjrG+IIiAyE+QOCCx1GMe3Uw6bsIuYwdHT6as
+WcdPs04xAkEAzKulvEvLVvN5zfa/DTYRTV7jh6aDleOxjsD5oN/oJXoACnPzVuUL
+qQQMNtuAXm6Q1QItrRxpQsSKbY0UQka6JwJBAOSgoNoG5lIIYTKIMvzwGV+XBLeo
+HYsXgh+6Wo4uql3mLErUG78ZtWL9kc/tE4R+ZdyKGLaCR/1gXmH5bwN4B/ECQEBb
+uUH8k3REG4kojesZlVc+/00ojzgS4UKCa/yqa9VdB6ZBz8MDQydinnShkTwgiGpy
+xOoqhO753o2UT0qH8wECQQC99IEJWUnwvExVMkLaZH5NjAFJkb22sjkmuT11tAgU
+RQgOMoDOm6driojnOnDWOkx1r1Gy9NgMLooduja4v6cx
-----END RSA PRIVATE KEY-----
diff --git a/mysql-test/std_data/server-cert.pem b/mysql-test/std_data/server-cert.pem
index cab54db8b23..5922fe7ded7 100644
--- a/mysql-test/std_data/server-cert.pem
+++ b/mysql-test/std_data/server-cert.pem
@@ -1,55 +1,41 @@
Certificate:
Data:
- Version: 3 (0x2)
- Serial Number: 1 (0x1)
- Signature Algorithm: sha1WithRSAEncryption
+ Version: 1 (0x0)
+ Serial Number: 1048578 (0x100002)
+ Signature Algorithm: md5WithRSAEncryption
Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB
Validity
- Not Before: Jan 28 10:55:13 2009 GMT
- Not After : Jan 28 10:55:13 2010 GMT
- Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=localhost/emailAddress=abstract.mysql.developer@mysql.com
+ Not Before: Jan 29 11:56:49 2010 GMT
+ Not After : Jan 28 11:56:49 2015 GMT
+ Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=localhost
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- RSA Public Key: (512 bit)
- Modulus (512 bit):
- 00:b6:8f:e5:b7:b4:86:83:13:8a:f9:bf:63:cb:64:
- 2d:b9:51:d1:de:ab:7b:45:1f:aa:b5:66:73:13:f9:
- a6:07:d5:ba:7c:fa:92:bd:37:e2:ad:87:db:3e:b6:
- 6a:12:64:f8:ee:17:e3:15:06:2f:a8:82:68:bf:57:
- 8d:c3:04:98:27
+ Public-Key: (512 bit)
+ Modulus:
+ 00:cd:e4:87:51:9d:72:11:a0:d1:fa:f3:92:8b:13:
+ 1c:eb:f7:e2:9a:2f:72:a8:d6:65:48:d1:69:af:1b:
+ c0:4c:13:e5:60:60:51:41:e9:ab:a6:bc:13:bb:0c:
+ 5e:32:7c:d9:6c:9e:cd:05:24:84:78:db:80:91:2e:
+ d8:88:2b:c2:ed
Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints:
- CA:FALSE
- X509v3 Subject Key Identifier:
- D9:9A:B8:5F:22:EA:04:10:C8:25:7D:82:57:E6:2E:FD:19:29:E7:DA
- X509v3 Authority Key Identifier:
- keyid:F2:E2:EA:55:65:A4:9A:E2:AC:9D:97:F5:45:6C:F6:F7:8C:11:AD:DF
- DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB
- serial:95:E9:78:F5:34:50:E4:D5
-
- Signature Algorithm: sha1WithRSAEncryption
- 54:07:2d:21:0b:a5:af:3b:58:23:32:5e:56:7f:ab:58:63:48:
- 91:aa:38:90:89:16:f9:cc:bf:a4:0e:78:2b:9f:c5:1b:58:a6:
- e6:08:8f:2e:ae:97:03:21:9b:f1:cd:c0:26:8f:1d:d7:28:27:
- a0:8e:81:09:1b:1c:0f:c9:a5:41:3a:2d:44:3f:9c:fa:87:ff:
- c8:4c:2b:44:f7:1b:c1:3e:4f:01:7f:e9:26:cc:9f:1c:06:b5:
- 0b:27:d1:10:90:be:93:0c:9c:e7:b0:d1:ea:27:99:4e:06:14:
- 0c:7a:e9:c1:52:c5:33:68:bc:61:0d:db:81:3b:57:48:57:bf:
- 42:9a
+ Signature Algorithm: md5WithRSAEncryption
+ 73:ce:9c:6e:39:46:b4:14:be:da:3f:f3:1b:ba:90:bc:23:43:
+ d7:82:2a:70:4e:a6:d9:5a:65:5c:b7:df:71:df:75:77:c5:80:
+ a4:af:fa:d2:59:e2:fd:c9:9c:f0:98:95:8e:69:a9:8c:7c:d8:
+ 6f:48:d2:e3:36:e0:cd:ff:3f:d1:a5:e6:ab:75:09:c4:50:10:
+ c4:96:dd:bf:3b:de:32:46:da:ca:4a:f1:d6:52:8a:33:2f:ab:
+ f5:2e:70:3f:d4:9c:be:00:c8:03:f9:39:8a:df:5b:70:3c:40:
+ ef:03:be:7c:3d:1d:32:32:f3:51:81:e2:83:30:6e:3d:38:9b:
+ fb:3c
-----BEGIN CERTIFICATE-----
-MIICkzCCAfygAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ
-MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT
-UUwgQUIwHhcNMDkwMTI4MTA1NTEzWhcNMTAwMTI4MTA1NTEzWjB5MQswCQYDVQQG
-EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxEjAQBgNV
-BAMTCWxvY2FsaG9zdDExMC8GCSqGSIb3DQEJARYiYWJzdHJhY3QubXlzcWwuZGV2
-ZWxvcGVyQG15c3FsLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQC2j+W3tIaD
-E4r5v2PLZC25UdHeq3tFH6q1ZnMT+aYH1bp8+pK9N+Kth9s+tmoSZPjuF+MVBi+o
-gmi/V43DBJgnAgMBAAGjgaMwgaAwCQYDVR0TBAIwADAdBgNVHQ4EFgQU2Zq4XyLq
-BBDIJX2CV+Yu/Rkp59owdAYDVR0jBG0wa4AU8uLqVWWkmuKsnZf1RWz294wRrd+h
-SKRGMEQxCzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdV
-cHBzYWxhMREwDwYDVQQKEwhNeVNRTCBBQoIJAJXpePU0UOTVMA0GCSqGSIb3DQEB
-BQUAA4GBAFQHLSELpa87WCMyXlZ/q1hjSJGqOJCJFvnMv6QOeCufxRtYpuYIjy6u
-lwMhm/HNwCaPHdcoJ6COgQkbHA/JpUE6LUQ/nPqH/8hMK0T3G8E+TwF/6SbMnxwG
-tQsn0RCQvpMMnOew0eonmU4GFAx66cFSxTNovGEN24E7V0hXv0Ka
+MIIBtzCCASACAxAAAjANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJTRTEQMA4G
+A1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwg
+QUIwHhcNMTAwMTI5MTE1NjQ5WhcNMTUwMTI4MTE1NjQ5WjBGMQswCQYDVQQGEwJT
+RTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxEjAQBgNVBAMT
+CWxvY2FsaG9zdDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDN5IdRnXIRoNH685KL
+Exzr9+KaL3Ko1mVI0WmvG8BME+VgYFFB6aumvBO7DF4yfNlsns0FJIR424CRLtiI
+K8LtAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAc86cbjlGtBS+2j/zG7qQvCND14Iq
+cE6m2VplXLffcd91d8WApK/60lni/cmc8JiVjmmpjHzYb0jS4zbgzf8/0aXmq3UJ
+xFAQxJbdvzveMkbaykrx1lKKMy+r9S5wP9ScvgDIA/k5it9bcDxA7wO+fD0dMjLz
+UYHigzBuPTib+zw=
-----END CERTIFICATE-----
diff --git a/mysql-test/std_data/server-key.pem b/mysql-test/std_data/server-key.pem
index 0d8274b77f6..1083495cb96 100644
--- a/mysql-test/std_data/server-key.pem
+++ b/mysql-test/std_data/server-key.pem
@@ -1,9 +1,9 @@
-----BEGIN RSA PRIVATE KEY-----
-MIIBOQIBAAJBALaP5be0hoMTivm/Y8tkLblR0d6re0UfqrVmcxP5pgfVunz6kr03
-4q2H2z62ahJk+O4X4xUGL6iCaL9XjcMEmCcCAwEAAQJASA5VwgNb0CKHiPm0ntOk
-hG+54SRX3DmafEy6gRjZIl/bZ/asSLhXUZ+CeohyrQh7BZgYWvykd8pRISL9eKsU
-GQIhAOXkUrOtP/EtjyqNluEqZdG+RZi/7p61JS3Ce13Myu+LAiEAy0uMlV34AJpM
-b40FPKqlHxw8DD/Dt1iKhNVAg8+LDVUCIFjv7fbJDbW2VG63/Cj8CAwOukoP5rbL
-iaicVrHBKrllAiB9+MiaXeopZXNrxDS0jQFYr8Q9yt1aJVFgUkxx4Q9HKQIgZPs0
-KlF3NNNWw78INaAEkyf0IEssnLMsuoCWw0DIOak=
+MIIBOwIBAAJBAM3kh1GdchGg0frzkosTHOv34povcqjWZUjRaa8bwEwT5WBgUUHp
+q6a8E7sMXjJ82WyezQUkhHjbgJEu2Igrwu0CAwEAAQJBAJuwhFbF3NzRpBbEmnqJ
+4GPa1UJMQMLFJF+04tqj/HxJcAIVhOJhGmmtYNw1yjz/ZsPnfJCMz4eFOtdjvGtf
+peECIQDmFFg2WLvYo+2m9w9V7z4ZIkg7ixYkI/ObUUctfZkPOQIhAOUWnrvjFrAX
+bIvYT/YR50+3ZDLEc51XxNgJnWqWYl1VAiEAnTOFWgyivFC1DgF8PvDp8u5TgCt2
+A1d1GMgd490O+TECIC/WMl0/hTxOF9930vKqOGf//o9PUGkZq8QE9fcM4gtlAiAE
+iOcFpnLjtWj57jrhuw214ucnB5rklkQQe+AtcARNkg==
-----END RSA PRIVATE KEY-----
diff --git a/mysql-test/std_data/server8k-cert.pem b/mysql-test/std_data/server8k-cert.pem
index 3b86effd699..06e118cf034 100644
--- a/mysql-test/std_data/server8k-cert.pem
+++ b/mysql-test/std_data/server8k-cert.pem
@@ -1,138 +1,125 @@
Certificate:
Data:
- Version: 3 (0x2)
- Serial Number: 4 (0x4)
- Signature Algorithm: sha1WithRSAEncryption
+ Version: 1 (0x0)
+ Serial Number: 1048579 (0x100003)
+ Signature Algorithm: md5WithRSAEncryption
Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB
Validity
- Not Before: Jan 28 11:12:27 2009 GMT
- Not After : Jan 28 11:12:27 2010 GMT
+ Not Before: Jan 29 12:01:53 2010 GMT
+ Not After : Jan 28 12:01:53 2015 GMT
Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=server
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- RSA Public Key: (8192 bit)
- Modulus (8192 bit):
- 00:c0:8f:22:03:24:59:67:46:14:d6:8f:60:09:58:
- 06:07:45:f1:78:71:55:f1:ea:b9:30:8a:cd:c3:3c:
- b9:bf:65:6e:18:ed:a0:b8:c9:19:56:6f:c4:90:19:
- c8:65:09:db:ff:bf:82:a1:08:ad:01:4f:5a:a3:d4:
- 3d:78:7e:4b:4a:01:a4:7d:e8:7b:05:3e:7d:d8:b9:
- 55:58:60:d6:1c:ce:e8:32:62:2c:19:60:f3:ed:05:
- 99:6d:c9:77:07:2e:11:6d:0b:9a:c7:68:38:46:e8:
- fa:31:80:df:e8:79:f0:f1:fd:a9:94:c3:fa:0d:f5:
- 78:ac:49:7e:d5:17:fd:e1:ee:44:f3:c7:0e:30:32:
- 5d:a9:19:25:e4:bb:21:1d:fe:3c:84:48:40:f5:58:
- f4:bf:13:8c:85:68:bb:ec:f5:dd:c6:38:d1:b0:77:
- 1f:a6:8e:4f:8d:e2:6f:49:74:f5:3f:90:65:8e:99:
- 1e:59:9c:1c:b5:26:24:c4:b1:de:1e:fb:96:65:c4:
- 31:14:1a:53:b8:5e:62:8a:c7:04:f7:b4:36:a4:af:
- 07:c8:27:06:ed:dd:e6:f4:8c:62:f1:65:40:d0:9f:
- 9f:a9:14:c8:8e:8b:74:d6:67:5a:d0:c9:4d:35:a1:
- d5:7b:39:3a:42:9f:e4:d0:f4:c6:0f:2e:42:30:4b:
- 56:b2:3d:6d:8e:2d:58:c5:69:99:35:49:95:95:99:
- b6:87:29:2b:32:d1:50:08:cd:25:14:48:6d:10:99:
- 85:61:3c:41:26:21:55:cc:1f:cf:ad:b0:2f:b9:89:
- d8:4e:a0:18:ff:75:1d:b6:97:7c:c5:fa:8b:dc:93:
- 17:86:0a:64:d4:09:35:d5:83:34:6d:5c:6d:c6:8c:
- cd:b9:ec:c2:93:c6:c1:b7:cc:04:6f:22:e0:07:bf:
- e0:d9:9b:2f:d5:a0:50:cc:f9:f0:95:83:8f:f4:30:
- 83:72:94:d7:b5:4b:da:cc:9f:54:3b:8d:78:77:0b:
- 24:6c:0f:c2:96:61:96:2f:b8:5f:b5:7a:ab:7a:5b:
- 97:7a:a9:ad:40:8b:f2:d6:c6:8d:81:d9:94:61:8f:
- 9d:03:c5:b9:10:03:68:83:bf:04:81:cc:ac:bd:34:
- 89:e8:d4:8d:43:20:e2:b6:a4:11:3d:15:2a:82:0c:
- d6:3a:6a:8c:62:d4:93:bc:c3:80:bf:1b:b4:2b:0a:
- 7a:34:f0:cd:1e:82:3f:25:0f:d1:04:a8:0a:05:19:
- b0:d6:16:83:39:af:0b:45:7d:cb:14:7e:4d:aa:aa:
- c2:39:a8:46:38:ab:bd:ab:2a:bd:34:43:7f:da:25:
- de:2b:fb:69:3b:fe:3b:87:fd:98:94:76:4a:bf:04:
- a3:31:e3:3a:ff:6f:04:fa:fa:24:e4:2a:89:e9:0e:
- bf:44:4c:72:85:82:3c:89:4a:03:63:01:41:92:53:
- d0:82:60:6e:d8:ff:8c:a2:b4:1a:3b:20:6d:ae:74:
- 92:30:4e:48:e3:51:a6:cb:73:97:06:13:03:32:23:
- 9b:7d:a2:c7:3a:a9:af:97:8c:51:ed:fe:fa:b4:b4:
- 1a:a3:87:fc:cf:8c:8e:e6:80:15:03:fd:fe:7d:bd:
- b1:76:f1:5f:b3:09:2b:4c:4d:a7:7c:b5:72:b1:d6:
- db:38:c0:67:a4:54:bc:87:09:a5:39:ba:1a:7e:3f:
- 74:60:ad:3d:4b:be:94:53:f3:64:16:c7:33:35:ec:
- 41:00:95:b6:de:99:62:a2:7a:28:9a:45:4d:fa:cd:
- a6:77:f6:de:58:72:50:c8:7d:69:38:db:07:04:84:
- d8:4d:39:f7:50:13:43:ae:2d:af:45:a4:2a:39:56:
- 3c:b8:b7:d8:26:a4:36:c9:23:aa:aa:b8:49:0b:21:
- ba:9e:7a:2b:7f:4d:29:9f:0e:00:1e:b4:5e:a6:fa:
- 49:fe:8d:e5:74:57:d8:ba:d9:92:2c:d2:ac:84:1d:
- f2:a6:a4:44:1c:bf:88:41:32:7e:d1:c3:2f:6e:bc:
- 0f:5d:19:a6:8f:74:2b:67:ba:dd:a9:db:68:b5:ce:
- 9d:25:48:df:54:08:d0:1d:4f:2e:5b:24:bc:05:0f:
- fb:58:46:fa:02:ca:53:93:29:cf:10:27:c2:a0:18:
- d0:f5:d4:b9:3c:5e:df:8e:6c:f5:7c:b9:b4:54:cc:
- 39:16:5d:3c:da:96:b3:c3:6c:d4:70:5d:d3:30:a7:
- a6:bd:6f:dd:41:bc:a8:de:42:60:59:9a:85:25:0d:
- 2a:45:c3:05:b4:6e:7a:4a:4d:ca:8c:0a:e5:6c:34:
- bc:20:9b:6d:4a:ca:ca:b6:a6:3a:a0:db:c3:0e:20:
- 1a:12:1b:77:dd:cb:1d:7f:c3:0d:0d:e7:c1:fd:96:
- d2:c7:68:80:99:a0:d9:8a:33:21:a3:8b:a2:5a:a7:
- 7e:27:06:02:7f:ed:60:11:37:34:54:17:7f:4d:90:
- 14:1e:69:37:0d:ba:f0:2b:f0:a3:2d:62:79:c8:76:
- a8:ea:c8:e7:3b:1f:c6:4f:c2:0c:d7:ac:f0:77:53:
- 5d:f0:50:b4:df:9b:03:ca:4d:41:e1:18:b2:25:30:
- 86:1d:63:e5:67:b1:53:cd:6b:4e:83:1a:b9:5e:2d:
- 05:15:6b:d4:8e:b1:97:fc:31:03:57:cb:bf:27:7f:
- cd:5f:27:7e:66:e7:3c:17:09:b6:11:2a:4f:33:cd:
- eb:1a:d3:6f:d5:15:8b:8b:ce:68:6b:7e:9a:95:e5:
- 74:7f:17:57:d9
+ Public-Key: (8192 bit)
+ Modulus:
+ 00:ca:aa:1d:c4:11:ec:91:f0:c7:ff:5f:90:92:fc:
+ 40:0c:5e:b7:3d:00:c5:20:d5:0f:89:31:07:d7:41:
+ 4c:8b:60:80:aa:38:14:de:93:6b:9c:74:88:41:68:
+ b5:02:41:01:2d:86:a2:7a:95:53:5e:7b:67:2f:6c:
+ 1e:29:51:f9:44:fd:4a:80:be:b2:23:a1:3e:1b:38:
+ cf:88:c4:71:ee:f8:6b:41:c5:2d:c0:c3:52:ac:59:
+ 7d:81:34:19:95:32:b8:9a:51:b6:41:36:d4:c4:a1:
+ ae:84:e6:38:b9:e8:bf:96:be:19:7a:6b:77:4d:e0:
+ de:e6:b3:b6:6b:bc:3d:dd:68:bc:4b:c4:eb:f5:36:
+ 93:ed:56:a2:15:50:8a:10:e8:d6:22:ed:6c:b1:cd:
+ c3:18:c9:f6:0a:e1:de:61:65:62:d6:14:41:8c:b5:
+ fb:14:68:c1:cf:12:5d:41:21:9d:57:11:43:7d:bb:
+ 43:2c:21:bb:c3:44:7d:a8:cf:1f:c3:71:75:b5:47:
+ c2:7d:ce:38:3c:73:64:9e:15:d8:a7:27:cf:bd:40:
+ c8:45:08:e3:c8:39:a8:0b:8e:c2:5b:7b:f1:47:91:
+ 12:91:cc:e1:00:e0:94:5b:bd:32:e4:0c:8d:c3:be:
+ cc:76:32:52:12:69:b0:18:e0:b0:c2:76:34:5a:5f:
+ 79:d9:f6:81:9d:02:0a:61:69:1c:33:ce:49:fa:76:
+ 03:1e:07:5b:27:0b:bf:34:9e:34:96:b8:03:9b:50:
+ 3a:6a:2f:17:7a:14:cf:65:63:00:37:52:a8:73:ce:
+ 4b:14:40:f4:d2:9a:56:54:33:b8:77:2e:42:5b:8f:
+ ec:1f:18:f4:ad:ab:8a:4a:8d:6d:70:25:f3:58:e7:
+ cb:66:51:14:7d:16:f4:eb:6d:56:76:76:51:6e:d6:
+ 1d:da:d3:8d:c0:64:5a:67:4e:af:e2:bf:33:d1:b8:
+ f6:2a:fc:57:87:a7:35:5e:80:c9:ac:fc:87:c9:71:
+ 17:91:bf:b7:4d:a3:ed:3c:1b:27:f4:66:a0:f9:46:
+ 03:27:cc:ea:80:f6:4b:40:f6:41:94:cd:bd:0a:b3:
+ ef:26:be:de:6f:69:ae:0f:3f:1c:55:63:33:90:9b:
+ ed:ca:5a:12:4d:de:4b:06:c2:a2:92:b0:42:3d:31:
+ af:a4:15:12:15:f8:8a:e9:88:8d:cf:fd:85:66:50:
+ 6f:11:f1:9f:48:f3:b5:ba:9d:86:68:24:a2:5d:a8:
+ 7c:54:42:fa:d8:b5:c5:f2:dd:0e:0f:d0:68:e4:54:
+ 7e:c5:b9:a0:9b:65:2d:77:f4:8f:b9:30:0a:d5:86:
+ 5c:ed:c9:7c:d1:da:9d:0d:63:50:ee:e5:1e:92:63:
+ cc:a2:0c:e8:4a:96:02:4d:dc:8f:df:7c:8f:08:18:
+ a8:30:88:d7:af:89:ad:fc:57:4b:10:f9:f1:cb:48:
+ e8:b6:3b:c8:3f:fc:c2:d3:d1:4a:10:3c:1b:6b:64:
+ dc:e5:65:1e:5b:b2:da:b1:e2:24:97:8f:ee:c0:4b:
+ 8e:18:83:7c:17:a6:3c:45:b3:60:06:23:f2:2f:18:
+ 13:9e:17:8a:c6:72:79:8c:4d:04:f3:9d:ea:e0:25:
+ d3:33:8c:1e:11:47:63:1f:a5:45:3f:bd:85:b3:fe:
+ a5:68:ee:48:b7:0c:a4:c9:7f:72:d0:75:66:9b:6a:
+ f9:a0:50:f3:a8:59:6d:a3:dd:38:4f:70:2b:bb:ff:
+ 92:2e:71:ab:ef:e9:00:ed:0d:d1:b4:6f:f0:8e:b2:
+ 09:fb:4d:61:0d:d9:10:d5:54:11:cd:03:94:84:fd:
+ a8:68:e4:45:6e:1e:6a:1e:2f:85:a1:6d:f5:b6:c0:
+ f1:ee:f7:36:e9:fe:c2:f7:ad:cc:13:46:5b:88:42:
+ f0:2d:1f:b5:0e:7e:b5:2b:e4:8d:ab:b9:87:30:6a:
+ 3d:12:f4:ad:f3:1c:ac:cc:1a:48:29:2a:96:7b:80:
+ 00:0b:6e:59:87:bf:a3:ca:70:99:1b:1c:fd:72:3d:
+ b2:d3:94:4a:cf:55:75:be:1f:40:ec:55:35:48:2d:
+ 55:f0:00:da:3c:b0:60:ba:11:32:66:54:0b:be:06:
+ a4:5e:b7:c9:59:bb:4d:f4:92:06:26:48:6e:c2:12:
+ d4:7c:f0:20:b8:a2:e1:bc:6a:b6:19:0e:37:47:55:
+ c9:f2:49:0d:96:75:a2:84:64:bf:34:fc:be:b2:41:
+ e4:f5:88:eb:e1:b7:26:a5:e5:41:c2:20:0c:f6:e2:
+ a8:a5:e7:76:54:a5:fb:4b:80:05:7d:18:85:7a:ba:
+ bc:b7:ad:c0:2f:60:85:cc:15:12:1c:2f:0a:9e:f3:
+ 7c:40:cf:f4:3e:23:d2:95:ca:d0:06:58:52:f0:84:
+ d8:0f:3d:eb:ff:12:68:94:79:8f:be:40:29:5f:98:
+ c8:90:6c:05:2f:99:8c:2a:63:78:1f:23:b1:29:c5:
+ e7:49:c9:b2:92:0f:53:0b:d5:71:28:17:c2:19:bf:
+ 60:bf:7c:87:a8:ab:c1:f4:0a:c1:b8:d2:68:ee:c1:
+ ce:a7:13:13:17:6d:24:5d:a2:37:a6:d7:7d:48:8b:
+ 2b:74:2d:40:2e:ca:19:d5:b6:3e:6c:42:71:fa:cf:
+ 85:87:f9:de:80:73:8b:89:f4:70:f0:d8:d7:ff:40:
+ 41:9c:c7:15:6d:9b:6e:4c:b5:52:02:99:79:32:73:
+ ca:26:a0:ac:31:6f:c4:b0:f5:da:bb:c2:1f:e0:9f:
+ 44:ba:25:f7:9f
Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints:
- CA:FALSE
- X509v3 Subject Key Identifier:
- 58:12:24:59:A7:3C:29:15:89:5A:C2:12:DB:E7:A5:42:10:21:B7:BA
- X509v3 Authority Key Identifier:
- keyid:F2:E2:EA:55:65:A4:9A:E2:AC:9D:97:F5:45:6C:F6:F7:8C:11:AD:DF
- DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB
- serial:95:E9:78:F5:34:50:E4:D5
-
- Signature Algorithm: sha1WithRSAEncryption
- cd:cb:5c:83:35:ea:cb:cb:c3:a8:c3:95:e2:e6:6f:4d:d8:e4:
- ee:41:dd:3f:35:82:ac:2f:fd:63:89:4f:3a:19:d7:81:75:b3:
- a3:fc:36:b2:12:d5:c6:56:bc:13:60:37:33:6e:a0:d8:ae:7c:
- 88:f9:4b:ee:7b:1f:c8:f0:56:19:07:4d:bb:45:52:1c:78:81:
- 07:7c:13:86:b8:86:70:85:e4:71:25:58:78:d1:be:de:22:82:
- 6d:1a:4b:06:ac:f0:e8:50:87:c7:69:64:c2:61:43:cd:96:06:
- a6:7e:09:a9:02:01:2a:a2:40:f3:cd:10:80:48:d0:34:55:40:
- b9:ce
+ Signature Algorithm: md5WithRSAEncryption
+ 08:75:dc:b9:3f:aa:b6:7e:81:7a:39:d1:ee:ed:44:b6:ce:1b:
+ 37:c4:4c:19:d0:66:e6:eb:b5:4f:2a:ef:95:58:64:21:55:01:
+ 12:30:ac:8a:95:d1:06:de:29:46:a4:f1:7d:7f:b0:1e:d2:4e:
+ fb:f6:fa:9a:74:be:85:62:db:0b:82:90:58:62:c5:5f:f1:80:
+ 02:9f:c5:fb:f3:6b:b0:b4:3b:04:b1:e5:53:c2:d0:00:a1:1a:
+ 9d:65:60:6f:73:98:67:e0:9c:c8:12:94:79:59:bf:43:7b:f5:
+ 77:c8:8f:df:b1:cd:11:1c:01:19:99:c2:22:42:f7:41:ae:b4:
+ b8:1a
-----BEGIN CERTIFICATE-----
-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
+MIIFfDCCBOUCAxAAAzANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJTRTEQMA4G
+A1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwg
+QUIwHhcNMTAwMTI5MTIwMTUzWhcNMTUwMTI4MTIwMTUzWjBDMQswCQYDVQQGEwJT
+RTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxDzANBgNVBAMT
+BnNlcnZlcjCCBCIwDQYJKoZIhvcNAQEBBQADggQPADCCBAoCggQBAMqqHcQR7JHw
+x/9fkJL8QAxetz0AxSDVD4kxB9dBTItggKo4FN6Ta5x0iEFotQJBAS2GonqVU157
+Zy9sHilR+UT9SoC+siOhPhs4z4jEce74a0HFLcDDUqxZfYE0GZUyuJpRtkE21MSh
+roTmOLnov5a+GXprd03g3uaztmu8Pd1ovEvE6/U2k+1WohVQihDo1iLtbLHNwxjJ
+9grh3mFlYtYUQYy1+xRowc8SXUEhnVcRQ327Qywhu8NEfajPH8NxdbVHwn3OODxz
+ZJ4V2Kcnz71AyEUI48g5qAuOwlt78UeREpHM4QDglFu9MuQMjcO+zHYyUhJpsBjg
+sMJ2NFpfedn2gZ0CCmFpHDPOSfp2Ax4HWycLvzSeNJa4A5tQOmovF3oUz2VjADdS
+qHPOSxRA9NKaVlQzuHcuQluP7B8Y9K2rikqNbXAl81jny2ZRFH0W9OttVnZ2UW7W
+HdrTjcBkWmdOr+K/M9G49ir8V4enNV6Ayaz8h8lxF5G/t02j7TwbJ/RmoPlGAyfM
+6oD2S0D2QZTNvQqz7ya+3m9prg8/HFVjM5Cb7cpaEk3eSwbCopKwQj0xr6QVEhX4
+iumIjc/9hWZQbxHxn0jztbqdhmgkol2ofFRC+ti1xfLdDg/QaORUfsW5oJtlLXf0
+j7kwCtWGXO3JfNHanQ1jUO7lHpJjzKIM6EqWAk3cj998jwgYqDCI16+JrfxXSxD5
+8ctI6LY7yD/8wtPRShA8G2tk3OVlHluy2rHiJJeP7sBLjhiDfBemPEWzYAYj8i8Y
+E54XisZyeYxNBPOd6uAl0zOMHhFHYx+lRT+9hbP+pWjuSLcMpMl/ctB1Zptq+aBQ
+86hZbaPdOE9wK7v/ki5xq+/pAO0N0bRv8I6yCftNYQ3ZENVUEc0DlIT9qGjkRW4e
+ah4vhaFt9bbA8e73Nun+wvetzBNGW4hC8C0ftQ5+tSvkjau5hzBqPRL0rfMcrMwa
+SCkqlnuAAAtuWYe/o8pwmRsc/XI9stOUSs9Vdb4fQOxVNUgtVfAA2jywYLoRMmZU
+C74GpF63yVm7TfSSBiZIbsIS1HzwILii4bxqthkON0dVyfJJDZZ1ooRkvzT8vrJB
+5PWI6+G3JqXlQcIgDPbiqKXndlSl+0uABX0YhXq6vLetwC9ghcwVEhwvCp7zfEDP
+9D4j0pXK0AZYUvCE2A896/8SaJR5j75AKV+YyJBsBS+ZjCpjeB8jsSnF50nJspIP
+UwvVcSgXwhm/YL98h6irwfQKwbjSaO7BzqcTExdtJF2iN6bXfUiLK3QtQC7KGdW2
+PmxCcfrPhYf53oBzi4n0cPDY1/9AQZzHFW2bbky1UgKZeTJzyiagrDFvxLD12rvC
+H+CfRLol958CAwEAATANBgkqhkiG9w0BAQQFAAOBgQAIddy5P6q2foF6OdHu7US2
+zhs3xEwZ0Gbm67VPKu+VWGQhVQESMKyKldEG3ilGpPF9f7Ae0k779vqadL6FYtsL
+gpBYYsVf8YACn8X782uwtDsEseVTwtAAoRqdZWBvc5hn4JzIEpR5Wb9De/V3yI/f
+sc0RHAEZmcIiQvdBrrS4Gg==
-----END CERTIFICATE-----
diff --git a/mysql-test/std_data/server8k-key.pem b/mysql-test/std_data/server8k-key.pem
index 493ad2350c8..faf4b43fa56 100644
--- a/mysql-test/std_data/server8k-key.pem
+++ b/mysql-test/std_data/server8k-key.pem
@@ -1,99 +1,99 @@
-----BEGIN RSA PRIVATE KEY-----
-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
+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
-----END RSA PRIVATE KEY-----
diff --git a/mysql-test/suite/rpl/r/rpl_binlog_grant.result b/mysql-test/suite/rpl/r/rpl_binlog_grant.result
index 2a7e4401500..adf2175f3bb 100644
--- a/mysql-test/suite/rpl/r/rpl_binlog_grant.result
+++ b/mysql-test/suite/rpl/r/rpl_binlog_grant.result
@@ -25,7 +25,7 @@ master-bin.000001 # Query # # use `d1`; create table t (s1 int) engine=innodb
master-bin.000001 # Query # # BEGIN
master-bin.000001 # Query # # use `d1`; insert into t values (1)
master-bin.000001 # Xid # # COMMIT /* XID */
-master-bin.000001 # Query # # use `d1`; grant select on t to x@y
+master-bin.000001 # Query # # use `d1`; grant select on t to 'x'@'y'
start transaction;
insert into t values (2);
revoke select on t from x@y;
@@ -45,10 +45,10 @@ master-bin.000001 # Query # # use `d1`; create table t (s1 int) engine=innodb
master-bin.000001 # Query # # BEGIN
master-bin.000001 # Query # # use `d1`; insert into t values (1)
master-bin.000001 # Xid # # COMMIT /* XID */
-master-bin.000001 # Query # # use `d1`; grant select on t to x@y
+master-bin.000001 # Query # # use `d1`; grant select on t to 'x'@'y'
master-bin.000001 # Query # # BEGIN
master-bin.000001 # Query # # use `d1`; insert into t values (2)
master-bin.000001 # Xid # # COMMIT /* XID */
-master-bin.000001 # Query # # use `d1`; revoke select on t from x@y
+master-bin.000001 # Query # # use `d1`; revoke select on t from 'x'@'y'
drop user x@y;
drop database d1;
diff --git a/mysql-test/suite/rpl/r/rpl_events.result b/mysql-test/suite/rpl/r/rpl_events.result
index b3fd85d7e28..206ec52718c 100644
--- a/mysql-test/suite/rpl/r/rpl_events.result
+++ b/mysql-test/suite/rpl/r/rpl_events.result
@@ -251,3 +251,45 @@ DROP EVENT event44331_1;
DROP EVENT event44331_2;
DROP EVENT event44331_3;
DROP EVENT event44331_4;
+DROP VIEW IF EXISTS events_view;
+DROP EVENT IF EXISTS event48321_1;
+DROP EVENT IF EXISTS event48321_2;
+DROP EVENT IF EXISTS event48321_3;
+DROP EVENT IF EXISTS event48321_4;
+CREATE VIEW events_view AS
+SELECT EVENT_SCHEMA, EVENT_NAME, DEFINER FROM INFORMATION_SCHEMA.EVENTS
+WHERE EVENT_NAME LIKE 'event48321%';
+CREATE DEFINER=CURRENT_USER() /*!50000 EVENT event48321_1 */
+ON SCHEDULE AT CURRENT_TIMESTAMP
+ON COMPLETION PRESERVE DISABLE
+DO SELECT 48321 as BUG;
+CREATE DEFINER=CURRENT_USER() EVENT event48321_2
+ON SCHEDULE AT CURRENT_TIMESTAMP
+ON COMPLETION PRESERVE DISABLE
+DO SELECT 48321 as BUG;
+CREATE /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
+ON SCHEDULE AT CURRENT_TIMESTAMP
+ON COMPLETION PRESERVE DISABLE
+DO SELECT 48321 as BUG;
+Comparing tables master:test.events_view and slave:test.events_view
+ALTER DEFINER=CURRENT_USER() EVENT event48321_1 RENAME TO event48321_4;
+ALTER DEFINER=CURRENT_USER() EVENT event48321_2
+ON SCHEDULE AT CURRENT_TIMESTAMP
+ON COMPLETION PRESERVE DISABLE
+DO SELECT 48321 as BUG;
+ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
+ON SCHEDULE AT CURRENT_TIMESTAMP
+ON COMPLETION PRESERVE DISABLE
+DO SELECT 48321 as BUG;
+Comparing tables master:test.events_view and slave:test.events_view
+ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
+ON SCHEDULE AT CURRENT_TIMESTAMP
+ON COMPLETION PRESERVE DISABLE
+DO SELECT 48321 as BUG; ALTER EVENT event48321_2 ENABLE |
+Comparing tables master:test.events_view and slave:test.events_view
+ALTER EVENT event48321_3 ENABLE;
+Comparing tables master:test.events_view and slave:test.events_view
+DROP EVENT event48321_4;
+DROP EVENT event48321_2;
+DROP EVENT event48321_3;
+DROP VIEW events_view;
diff --git a/mysql-test/suite/rpl/r/rpl_get_master_version_and_clock.result b/mysql-test/suite/rpl/r/rpl_get_master_version_and_clock.result
index 5f2a55b5e35..d054cb573d3 100644
--- a/mysql-test/suite/rpl/r/rpl_get_master_version_and_clock.result
+++ b/mysql-test/suite/rpl/r/rpl_get_master_version_and_clock.result
@@ -4,10 +4,9 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-call mtr.add_suppression("Get master clock failed with error: ");
-call mtr.add_suppression("Get master SERVER_ID failed with error: ");
-call mtr.add_suppression("Slave I/O: Master command COM_REGISTER_SLAVE failed: failed registering on master, reconnecting to try again");
+call mtr.add_suppression("Slave I/O: Master command COM_REGISTER_SLAVE failed: .*");
call mtr.add_suppression("Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; .*");
+call mtr.add_suppression("Slave I/O thread .* register on master");
SELECT IS_FREE_LOCK("debug_lock.before_get_UNIX_TIMESTAMP");
IS_FREE_LOCK("debug_lock.before_get_UNIX_TIMESTAMP")
1
diff --git a/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result b/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
index fbfebbaa590..74ebb3be948 100644
--- a/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
+++ b/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
@@ -750,7 +750,7 @@ test_rpl e2 root@localhost SYSTEM RECURRING NULL 1 # # NULL ENABLED 1 latin1 lat
USE test_rpl;
SHOW EVENTS;
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
-test_rpl e2 @ SYSTEM RECURRING NULL 1 # # NULL SLAVESIDE_DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
+test_rpl e2 root@localhost SYSTEM RECURRING NULL 1 # # NULL SLAVESIDE_DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
==========MASTER==========
SELECT COUNT(*) FROM t1;
COUNT(*)
@@ -1079,7 +1079,7 @@ master-bin.000001 # Query 1 # BEGIN
master-bin.000001 # Query 1 # use `test_rpl`; INSERT INTO t1 VALUES(1, 'test1')
master-bin.000001 # Xid 1 # #
master-bin.000001 # Query 1 # use `test_rpl`; CREATE DEFINER=`root`@`localhost` EVENT e1 ON SCHEDULE EVERY '1' SECOND COMMENT 'e_second_comment' DO DELETE FROM t1
-master-bin.000001 # Query 1 # use `test_rpl`; ALTER EVENT e1 RENAME TO e2
+master-bin.000001 # Query 1 # use `test_rpl`; ALTER DEFINER=`root`@`localhost` EVENT e1 RENAME TO e2
master-bin.000001 # Query 1 # use `test_rpl`; DROP EVENT e2
master-bin.000001 # Query 1 # BEGIN
master-bin.000001 # Query 1 # use `test_rpl`; DELETE FROM t1
diff --git a/mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result b/mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result
index 449407742de..538764da738 100644
--- a/mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result
+++ b/mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result
@@ -152,7 +152,7 @@ c1 c3 c4 c5
5 2006-02-22 00:00:00 Tested in Texas 11
--- Test 2 position test --
-Warning: The option '--position' is deprecated and will be removed in MySQL 5.6. Please use --start-position instead.
+Warning: The option '--position' is deprecated and will be removed in a future release. Please use --start-position instead.
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
@@ -315,7 +315,7 @@ ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
--- Test 7 reading stdin w/position --
-Warning: The option '--position' is deprecated and will be removed in MySQL 5.6. Please use --start-position instead.
+Warning: The option '--position' is deprecated and will be removed in a future release. Please use --start-position instead.
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
diff --git a/mysql-test/suite/rpl/r/rpl_set_null_innodb.result b/mysql-test/suite/rpl/r/rpl_set_null_innodb.result
new file mode 100644
index 00000000000..41600a5fe1b
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_set_null_innodb.result
@@ -0,0 +1,35 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t1 (c1 BIT, c2 INT) Engine=InnoDB;
+INSERT INTO `t1` VALUES ( 1, 1 );
+UPDATE t1 SET c1=NULL where c2=1;
+Comparing tables master:test.t1 and slave:test.t1
+DELETE FROM t1 WHERE c2=1 LIMIT 1;
+Comparing tables master:test.t1 and slave:test.t1
+DROP TABLE t1;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t1 (c1 CHAR) Engine=InnoDB;
+INSERT INTO t1 ( c1 ) VALUES ( 'w' ) ;
+SELECT * FROM t1;
+c1
+w
+UPDATE t1 SET c1=NULL WHERE c1='w';
+Comparing tables master:test.t1 and slave:test.t1
+DELETE FROM t1 LIMIT 2;
+Comparing tables master:test.t1 and slave:test.t1
+DROP TABLE t1;
diff --git a/mysql-test/suite/rpl/r/rpl_set_null_myisam.result b/mysql-test/suite/rpl/r/rpl_set_null_myisam.result
new file mode 100644
index 00000000000..cbd7010664a
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_set_null_myisam.result
@@ -0,0 +1,35 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t1 (c1 BIT, c2 INT) Engine=MyISAM;
+INSERT INTO `t1` VALUES ( 1, 1 );
+UPDATE t1 SET c1=NULL where c2=1;
+Comparing tables master:test.t1 and slave:test.t1
+DELETE FROM t1 WHERE c2=1 LIMIT 1;
+Comparing tables master:test.t1 and slave:test.t1
+DROP TABLE t1;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t1 (c1 CHAR) Engine=MyISAM;
+INSERT INTO t1 ( c1 ) VALUES ( 'w' ) ;
+SELECT * FROM t1;
+c1
+w
+UPDATE t1 SET c1=NULL WHERE c1='w';
+Comparing tables master:test.t1 and slave:test.t1
+DELETE FROM t1 LIMIT 2;
+Comparing tables master:test.t1 and slave:test.t1
+DROP TABLE t1;
diff --git a/mysql-test/suite/rpl/r/rpl_sp.result b/mysql-test/suite/rpl/r/rpl_sp.result
index c96fe389fec..215016b6002 100644
--- a/mysql-test/suite/rpl/r/rpl_sp.result
+++ b/mysql-test/suite/rpl/r/rpl_sp.result
@@ -433,9 +433,9 @@ master-bin.000001 # Query # # use `mysqltest1`; create table t2 like t1
master-bin.000001 # Query # # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `foo3`()
DETERMINISTIC
insert into t1 values (15)
-master-bin.000001 # Query # # use `mysqltest1`; grant CREATE ROUTINE, EXECUTE on mysqltest1.* to "zedjzlcsjhd"@127.0.0.1
-master-bin.000001 # Query # # use `mysqltest1`; grant SELECT on mysqltest1.t1 to "zedjzlcsjhd"@127.0.0.1
-master-bin.000001 # Query # # use `mysqltest1`; grant SELECT, INSERT on mysqltest1.t2 to "zedjzlcsjhd"@127.0.0.1
+master-bin.000001 # Query # # use `mysqltest1`; grant CREATE ROUTINE, EXECUTE on mysqltest1.* to 'zedjzlcsjhd'@'127.0.0.1'
+master-bin.000001 # Query # # use `mysqltest1`; grant SELECT on mysqltest1.t1 to 'zedjzlcsjhd'@'127.0.0.1'
+master-bin.000001 # Query # # use `mysqltest1`; grant SELECT, INSERT on mysqltest1.t2 to 'zedjzlcsjhd'@'127.0.0.1'
master-bin.000001 # Query # # use `mysqltest1`; CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` PROCEDURE `foo4`()
DETERMINISTIC
begin
@@ -510,7 +510,7 @@ select * from t1
master-bin.000001 # Query # # use `mysqltest1`; drop procedure foo
master-bin.000001 # Query # # use `mysqltest1`; drop function fn1
master-bin.000001 # Query # # drop database mysqltest1
-master-bin.000001 # Query # # drop user "zedjzlcsjhd"@127.0.0.1
+master-bin.000001 # Query # # DROP USER 'zedjzlcsjhd'@'127.0.0.1'
master-bin.000001 # Query # # use `test`; drop function if exists f1
master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS int(11)
READS SQL DATA
@@ -675,13 +675,13 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `foo3`()
insert into t1 values (15)
/*!*/;
SET TIMESTAMP=t/*!*/;
-grant CREATE ROUTINE, EXECUTE on mysqltest1.* to "zedjzlcsjhd"@127.0.0.1
+grant CREATE ROUTINE, EXECUTE on mysqltest1.* to 'zedjzlcsjhd'@'127.0.0.1'
/*!*/;
SET TIMESTAMP=t/*!*/;
-grant SELECT on mysqltest1.t1 to "zedjzlcsjhd"@127.0.0.1
+grant SELECT on mysqltest1.t1 to 'zedjzlcsjhd'@'127.0.0.1'
/*!*/;
SET TIMESTAMP=t/*!*/;
-grant SELECT, INSERT on mysqltest1.t2 to "zedjzlcsjhd"@127.0.0.1
+grant SELECT, INSERT on mysqltest1.t2 to 'zedjzlcsjhd'@'127.0.0.1'
/*!*/;
SET TIMESTAMP=t/*!*/;
CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` PROCEDURE `foo4`()
@@ -842,7 +842,7 @@ SET TIMESTAMP=t/*!*/;
drop database mysqltest1
/*!*/;
SET TIMESTAMP=t/*!*/;
-drop user "zedjzlcsjhd"@127.0.0.1
+DROP USER 'zedjzlcsjhd'@'127.0.0.1'
/*!*/;
use test/*!*/;
SET TIMESTAMP=t/*!*/;
diff --git a/mysql-test/suite/rpl/r/rpl_stm_until.result b/mysql-test/suite/rpl/r/rpl_stm_until.result
index 49667394fc2..ecc3df54a85 100644
--- a/mysql-test/suite/rpl/r/rpl_stm_until.result
+++ b/mysql-test/suite/rpl/r/rpl_stm_until.result
@@ -248,3 +248,23 @@ one
1
drop table t1;
start slave;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+drop table if exists t1;
+Warnings:
+Note 1051 Unknown table 't1'
+flush logs;
+stop slave;
+reset slave;
+start slave until master_log_file='master-bin.000001', master_log_pos=294 /* to stop right before DROP */;
+show tables /* t1 must exist */;
+Tables_in_test
+t1
+drop table t1;
+stop slave;
+reset slave;
+reset master;
diff --git a/mysql-test/suite/rpl/r/rpl_user.result b/mysql-test/suite/rpl/r/rpl_user.result
index a98e7e9ca55..b1f1d73cf86 100644
--- a/mysql-test/suite/rpl/r/rpl_user.result
+++ b/mysql-test/suite/rpl/r/rpl_user.result
@@ -39,7 +39,1754 @@ show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query # # use `test`; create user 'foo'@'fakehost'
master-bin.000001 # Query # # use `test`; create user 'foo'@'fakehost', 'bar'@'fakehost'
-master-bin.000001 # Query # # use `test`; rename user 'foo'@'fakehost' to 'foofoo'@'fakehost'
-master-bin.000001 # Query # # use `test`; rename user 'not_exist_user1'@'fakehost' to 'foobar'@'fakehost', 'bar'@'fakehost' to 'barbar'@'fakehost'
-master-bin.000001 # Query # # use `test`; drop user 'foofoo'@'fakehost'
-master-bin.000001 # Query # # use `test`; drop user 'not_exist_user1'@'fakehost', 'barbar'@'fakehost'
+master-bin.000001 # Query # # use `test`; RENAME USER 'foo'@'fakehost' TO 'foofoo'@'fakehost'
+master-bin.000001 # Query # # use `test`; RENAME USER 'not_exist_user1'@'fakehost' TO 'foobar'@'fakehost', 'bar'@'fakehost' TO 'barbar'@'fakehost'
+master-bin.000001 # Query # # use `test`; DROP USER 'foofoo'@'fakehost'
+master-bin.000001 # Query # # use `test`; DROP USER 'not_exist_user1'@'fakehost', 'barbar'@'fakehost'
+
+
+
+TEST STATEMENT: 'RENAME USER $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user FROM mysql.user
+WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'RENAME USER $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER() TO 'bug48321_4'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+RENAME USER CURRENT_USER() TO 'bug48321_4'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'RENAME USER $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER() TO 'bug48321_4'@'localhost', 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+RENAME USER CURRENT_USER() TO 'bug48321_4'@'localhost', 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'RENAME USER $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost', CURRENT_USER() TO 'bug48321_4'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+RENAME USER 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost', CURRENT_USER() TO 'bug48321_4'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'RENAME USER $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost', CURRENT_USER() TO 'bug48321_4'@'localhost', 'bug48321_3'@'localhost' TO 'bug48321_6'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+RENAME USER 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost', CURRENT_USER() TO 'bug48321_4'@'localhost', 'bug48321_3'@'localhost' TO 'bug48321_6'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'RENAME USER $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost', 'bug48321_3'@'localhost' TO 'bug48321_6'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+RENAME USER 'bug48321_2'@'localhost' TO 'bug48321_5'@'localhost', 'bug48321_3'@'localhost' TO 'bug48321_6'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'DROP USER $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user FROM mysql.user
+WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'DROP USER $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+DROP USER CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'DROP USER $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER(), 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+DROP USER CURRENT_USER(), 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'DROP USER $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+DROP USER 'bug48321_2'@'localhost', CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'DROP USER $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+DROP USER 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'DROP USER $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+DROP USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+DROP PROCEDURE IF EXISTS f1;
+CREATE PROCEDURE p1() SELECT 1;
+
+
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER(), 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM CURRENT_USER(), 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bug48321_2'@'localhost', CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list /*With comment*/'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list /*With comment*/'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM CURRENT_USER() /*With comment*/;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list /*With comment*/'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER(), 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM CURRENT_USER(), 'bug48321_2'@'localhost' /*With comment*/;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list /*With comment*/'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bug48321_2'@'localhost', CURRENT_USER() /*With comment*/;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list /*With comment*/'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost' /*With comment*/;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM $users_list /*With comment*/'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' /*With comment*/;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER(), 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ CURRENT_USER(), 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ 'bug48321_2'@'localhost', CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ 'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Select_priv, Update_priv, Create_priv, Drop_priv
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER(), 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM CURRENT_USER(), 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM 'bug48321_2'@'localhost', CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM 'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'REVOKE CREATE ROUTINE ON *.* FROM $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Create_routine_priv
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'REVOKE CREATE ROUTINE ON *.* FROM $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE CREATE ROUTINE ON *.* FROM CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE CREATE ROUTINE ON *.* FROM $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER(), 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE CREATE ROUTINE ON *.* FROM CURRENT_USER(), 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE CREATE ROUTINE ON *.* FROM $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE CREATE ROUTINE ON *.* FROM 'bug48321_2'@'localhost', CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE CREATE ROUTINE ON *.* FROM $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE CREATE ROUTINE ON *.* FROM 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE CREATE ROUTINE ON *.* FROM $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE CREATE ROUTINE ON *.* FROM 'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Routine_name, Proc_priv
+FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER(), 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM CURRENT_USER(), 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER()
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM 'bug48321_2'@'localhost', CURRENT_USER();
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM 'bug48321_2'@'localhost', CURRENT_USER(), 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+# Grant some privileges to users at first when testing
+# 'REVOKE ...' statement.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost',
+'bug48321_3'@'localhost' WITH GRANT OPTION;
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_1'@'localhost',
+'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM 'bug48321_2'@'localhost', 'bug48321_3'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list WITH GRANT OPTION'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv, Password
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list WITH GRANT OPTION'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO CURRENT_USER() IDENTIFIED BY 'user1' WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list WITH GRANT OPTION'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost' WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list WITH GRANT OPTION'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1' WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list WITH GRANT OPTION'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY '' WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list WITH GRANT OPTION'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY '' WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list /* With Comment */ WITH GRANT OPTION'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv, Password
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list /* With Comment */ WITH GRANT OPTION'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO CURRENT_USER() IDENTIFIED BY 'user1' /* With Comment */ WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list /* With Comment */ WITH GRANT OPTION'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost' /* With Comment */ WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list /* With Comment */ WITH GRANT OPTION'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1' /* With Comment */ WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list /* With Comment */ WITH GRANT OPTION'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY '' /* With Comment */ WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALL PRIVILEGES ON *.* TO $users_list /* With Comment */ WITH GRANT OPTION'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY '' /* With Comment */ WITH GRANT OPTION;
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Select_priv, Update_priv, Create_priv, Drop_priv, Password
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO CURRENT_USER() IDENTIFIED BY 'user1';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY '';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY '';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+
+
+
+TEST STATEMENT: 'GRANT CREATE ROUTINE ON *.* TO $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Create_routine_priv
+FROM mysql.user WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'GRANT CREATE ROUTINE ON *.* TO $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT CREATE ROUTINE ON *.* TO CURRENT_USER() IDENTIFIED BY 'user1';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT CREATE ROUTINE ON *.* TO $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT CREATE ROUTINE ON *.* TO CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT CREATE ROUTINE ON *.* TO $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT CREATE ROUTINE ON *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT CREATE ROUTINE ON *.* TO $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT CREATE ROUTINE ON *.* TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY '';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT CREATE ROUTINE ON *.* TO $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT CREATE ROUTINE ON *.* TO 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY '';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
+DROP PROCEDURE p1;
+
+
+
+TEST STATEMENT: 'GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO $users_list'
+--------------------------------------------------------------------------
+CREATE VIEW test.bug48321_v1 AS SELECT user, Routine_name, Proc_priv
+FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+
+TEST STATEMENT: 'GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO $users_list'
+CASE 1:
+-------
+# Only CURRENT_USER() in the user list of the test statement.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO CURRENT_USER() IDENTIFIED BY 'user1';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO $users_list'
+CASE 2:
+-------
+# Two users are in the test statement, CURRENT_USER is the first one.
+users_list= CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_2'@'localhost';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO $users_list'
+CASE 3:
+-------
+# Two users are in the test statement, CURRENT_USER is the last one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1'
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO $users_list'
+CASE 4:
+-------
+# Three users are in the test statement, CURRENT_USER is the second one.
+users_list= 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_2'@'localhost', CURRENT_USER() IDENTIFIED BY 'user1', 'bug48321_3'@'localhost' IDENTIFIED BY '';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+
+TEST STATEMENT: 'GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO $users_list'
+CASE 5:
+-------
+# CURRENT_USER is not in the test statement.
+users_list= 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY ''
+
+# Connect to master with user1, so user1 always is the current user,
+# when test statement is runing.
+GRANT ALL PRIVILEGES ON *.* TO 'bug48321_1'@'localhost'
+ WITH GRANT OPTION;
+CREATE USER 'bug48321_2'@'localhost', 'bug48321_3'@'localhost'
+ IDENTIFIED BY 'user3';
+
+GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO 'bug48321_2'@'localhost', 'bug48321_3'@'localhost' IDENTIFIED BY '';
+
+Comparing tables master:test.bug48321_v1 and slave:test.bug48321_v1
+
+# Delete all bug48321% users
+DELETE FROM mysql.user WHERE user LIKE 'bug48321%';
+DELETE FROM mysql.procs_priv WHERE user LIKE 'bug48321%';
+FLUSH PRIVILEGES;
+DROP VIEW test.bug48321_v1;
diff --git a/mysql-test/suite/rpl/t/rpl_binlog_grant.test b/mysql-test/suite/rpl/t/rpl_binlog_grant.test
index da14b45d5c3..64f4e8b2eeb 100644
--- a/mysql-test/suite/rpl/t/rpl_binlog_grant.test
+++ b/mysql-test/suite/rpl/t/rpl_binlog_grant.test
@@ -25,7 +25,7 @@ grant select on t to x@y;
#
rollback;
show grants for x@y;
-source include/show_binlog_events.inc;
+--source include/show_binlog_events.inc
start transaction;
insert into t values (2);
revoke select on t from x@y;
@@ -35,7 +35,7 @@ revoke select on t from x@y;
commit;
select * from t;
show grants for x@y;
-source include/show_binlog_events.inc;
+--source include/show_binlog_events.inc
drop user x@y;
drop database d1;
--sync_slave_with_master
diff --git a/mysql-test/suite/rpl/t/rpl_events.test b/mysql-test/suite/rpl/t/rpl_events.test
index 7720ad6658c..25976f779e3 100644
--- a/mysql-test/suite/rpl/t/rpl_events.test
+++ b/mysql-test/suite/rpl/t/rpl_events.test
@@ -105,3 +105,85 @@ DROP EVENT event44331_2;
DROP EVENT event44331_3;
DROP EVENT event44331_4;
sync_slave_with_master;
+
+#
+# BUG#48321
+# This test verifies if the definer is consistent between master and slave,
+# when the event is created or altered with the DEFINER clause that the
+# DEFINER is set to CURRENT_USER()
+#
+connection master;
+--disable_warnings
+DROP VIEW IF EXISTS events_view;
+DROP EVENT IF EXISTS event48321_1;
+DROP EVENT IF EXISTS event48321_2;
+DROP EVENT IF EXISTS event48321_3;
+DROP EVENT IF EXISTS event48321_4;
+--enable_warnings
+
+CREATE VIEW events_view AS
+ SELECT EVENT_SCHEMA, EVENT_NAME, DEFINER FROM INFORMATION_SCHEMA.EVENTS
+ WHERE EVENT_NAME LIKE 'event48321%';
+let $diff_table_1= master:test.events_view;
+let $diff_table_2= slave:test.events_view;
+
+CREATE DEFINER=CURRENT_USER() /*!50000 EVENT event48321_1 */
+ ON SCHEDULE AT CURRENT_TIMESTAMP
+ ON COMPLETION PRESERVE DISABLE
+ DO SELECT 48321 as BUG;
+
+CREATE DEFINER=CURRENT_USER() EVENT event48321_2
+ ON SCHEDULE AT CURRENT_TIMESTAMP
+ ON COMPLETION PRESERVE DISABLE
+ DO SELECT 48321 as BUG;
+
+CREATE /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
+ ON SCHEDULE AT CURRENT_TIMESTAMP
+ ON COMPLETION PRESERVE DISABLE
+ DO SELECT 48321 as BUG;
+sync_slave_with_master;
+
+--source include/diff_tables.inc
+
+connection master;
+ALTER DEFINER=CURRENT_USER() EVENT event48321_1 RENAME TO event48321_4;
+
+ALTER DEFINER=CURRENT_USER() EVENT event48321_2
+ ON SCHEDULE AT CURRENT_TIMESTAMP
+ ON COMPLETION PRESERVE DISABLE
+ DO SELECT 48321 as BUG;
+
+ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
+ ON SCHEDULE AT CURRENT_TIMESTAMP
+ ON COMPLETION PRESERVE DISABLE
+ DO SELECT 48321 as BUG;
+sync_slave_with_master;
+
+--source include/diff_tables.inc
+
+# Two statements in on query
+connection master;
+DELIMITER |;
+ALTER /*!50000 DEFINER=CURRENT_USER() */ EVENT event48321_3
+ ON SCHEDULE AT CURRENT_TIMESTAMP
+ ON COMPLETION PRESERVE DISABLE
+ DO SELECT 48321 as BUG; ALTER EVENT event48321_2 ENABLE |
+DELIMITER ;|
+sync_slave_with_master;
+
+--source include/diff_tables.inc
+
+#No Event boday
+connection master;
+ALTER EVENT event48321_3 ENABLE;
+sync_slave_with_master;
+
+--source include/diff_tables.inc
+
+connection master;
+DROP EVENT event48321_4;
+DROP EVENT event48321_2;
+DROP EVENT event48321_3;
+DROP VIEW events_view;
+--source include/master-slave-end.inc
+
diff --git a/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test b/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test
index a290e539e32..eb9a8d1362d 100644
--- a/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test
+++ b/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test
@@ -17,14 +17,13 @@
source include/master-slave.inc;
source include/have_debug.inc;
+connection slave;
call mtr.add_suppression("Slave I/O: .* failed with error: Lost connection to MySQL server at 'reading initial communication packet'");
-call mtr.add_suppression("Slave I/O: Master command COM_REGISTER_SLAVE failed: failed registering on master, reconnecting to try again");
-call mtr.add_suppression("Get master clock failed with error: ");
-call mtr.add_suppression("Get master SERVER_ID failed with error: ");
+call mtr.add_suppression("Slave I/O: Master command COM_REGISTER_SLAVE failed: .*");
call mtr.add_suppression("Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; .*");
+call mtr.add_suppression("Slave I/O thread .* register on master");
#Test case 1: Try to get the value of the UNIX_TIMESTAMP from master under network disconnection
-connection slave;
let $debug_saved= `select @@global.debug`;
let $debug_lock= "debug_lock.before_get_UNIX_TIMESTAMP";
diff --git a/mysql-test/suite/rpl/t/rpl_set_null_innodb.test b/mysql-test/suite/rpl/t/rpl_set_null_innodb.test
new file mode 100644
index 00000000000..dba79b78fa1
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_set_null_innodb.test
@@ -0,0 +1,6 @@
+-- source include/have_binlog_format_mixed_or_row.inc
+-- source include/master-slave.inc
+-- source include/have_innodb.inc
+
+-- let $engine= InnoDB
+-- source extra/rpl_tests/rpl_set_null.test
diff --git a/mysql-test/suite/rpl/t/rpl_set_null_myisam.test b/mysql-test/suite/rpl/t/rpl_set_null_myisam.test
new file mode 100644
index 00000000000..7b433071553
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_set_null_myisam.test
@@ -0,0 +1,5 @@
+-- source include/have_binlog_format_mixed_or_row.inc
+-- source include/master-slave.inc
+
+-- let $engine= MyISAM
+-- source extra/rpl_tests/rpl_set_null.test
diff --git a/mysql-test/suite/rpl/t/rpl_stm_until.test b/mysql-test/suite/rpl/t/rpl_stm_until.test
index d78f8380961..ae03ebe8b76 100644
--- a/mysql-test/suite/rpl/t/rpl_stm_until.test
+++ b/mysql-test/suite/rpl/t/rpl_stm_until.test
@@ -161,4 +161,39 @@ connection slave;
start slave;
sync_with_master;
+ # Bug #47142 "slave start until" stops 1 event too late in 4.1 to 5.0 replication
+#
+# testing fixes that refine the start position of prior-5.0 master's event
+# and by that provide correct execution of
+# START SLAVE UNTIL ... master_log_pos= x;
+# Keep the test at the end of the file because it manipulates with binlog files
+# to substitute the genuine one with a prepared on 4.1 server.
+#
+
+--source include/master-slave-reset.inc
+
+connection master;
+drop table if exists t1; # there is create table t1 in bug47142_master-bin.000001
+flush logs;
+let $MYSQLD_DATADIR= `select @@datadir`;
+--remove_file $MYSQLD_DATADIR/master-bin.000001
+--copy_file $MYSQL_TEST_DIR/std_data/bug47142_master-bin.000001 $MYSQLD_DATADIR/master-bin.000001
+
+connection slave;
+stop slave;
+reset slave;
+start slave until master_log_file='master-bin.000001', master_log_pos=294 /* to stop right before DROP */;
+--source include/wait_for_slave_sql_to_stop.inc
+
+show tables /* t1 must exist */;
+
+# clean-up of Bug #47142 testing
+
+drop table t1; # drop on slave only, master does not have t1.
+stop slave;
+reset slave;
+
+connection master;
+reset master;
+
# End of tests
diff --git a/mysql-test/suite/rpl/t/rpl_user.test b/mysql-test/suite/rpl/t/rpl_user.test
index b8fe41d03c4..2adb822839a 100644
--- a/mysql-test/suite/rpl/t/rpl_user.test
+++ b/mysql-test/suite/rpl/t/rpl_user.test
@@ -54,8 +54,85 @@ drop user 'not_exist_user1'@'fakehost', 'not_exist_user2'@'fakehost';
sync_slave_with_master;
select Host,User from mysql.user where Host='fakehost';
-#
-# show the binlog events on the master
-#
connection master;
source include/show_binlog_events.inc;
+
+#
+# BUG#48321
+#
+let $action= RENAME;
+let $statement= RENAME USER \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+let $action= DROP;
+let $statement= DROP USER \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+--disable_warnings
+DROP PROCEDURE IF EXISTS f1;
+--enable_warnings
+CREATE PROCEDURE p1() SELECT 1;
+#REVOKE ALL PRIVILEGES
+let $action= REVOKE;
+let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv;
+let $statement= REVOKE ALL PRIVILEGES, GRANT OPTION FROM \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+#REVOKE ALL PRIVILEGES with comment
+let $action= REVOKE;
+let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv;
+let $statement= REVOKE ALL PRIVILEGES, GRANT OPTION FROM \$users_list /*With comment*/;
+source extra/rpl_tests/rpl_current_user.test;
+
+#REVOKE ALL PRIVILEGES with comment
+let $action= REVOKE;
+let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv;
+let $statement= REVOKE ALL PRIVILEGES, GRANT OPTION FROM /*With comment*/ \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv;
+#REVOKE ON TABLE
+let $statement= REVOKE SELECT, UPDATE, CREATE, DROP ON TABLE *.* FROM \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+#REVOKE ON CREATE ROUTINE
+let $diff_columns= Create_routine_priv;
+let $statement= REVOKE CREATE ROUTINE ON *.* FROM \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+#REVOKE ON ROUTINE
+let $diff_table= mysql.procs_priv;
+let $diff_columns= Routine_name, Proc_priv;
+let $statement= REVOKE ALTER ROUTINE, EXECUTE ON PROCEDURE p1 FROM \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+let $diff_table= mysql.user;
+#GRANT ALL PRIVILEGES
+let $action= GRANT;
+let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv, Password;
+let $statement= GRANT ALL PRIVILEGES ON *.* TO \$users_list WITH GRANT OPTION;
+source extra/rpl_tests/rpl_current_user.test;
+
+#GRANT ALL PRIVILEGES with comment
+let $action= GRANT;
+let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Grant_priv, Password;
+let $statement= GRANT ALL PRIVILEGES ON *.* TO \$users_list /* With Comment */ WITH GRANT OPTION;
+source extra/rpl_tests/rpl_current_user.test;
+
+#GRANT ON TABLE
+let $diff_columns= Select_priv, Update_priv, Create_priv, Drop_priv, Password;
+let $statement= GRANT SELECT, UPDATE, CREATE, DROP ON TABLE *.* TO \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+#GRANT ON CREATE ROUTINE
+let $diff_columns= Create_routine_priv;
+let $statement= GRANT CREATE ROUTINE ON *.* TO \$users_list;
+source extra/rpl_tests/rpl_current_user.test;
+
+#GRANT ON ROUTINE
+let $diff_table= mysql.procs_priv;
+let $diff_columns= Routine_name, Proc_priv;
+let $statement= GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE p1 TO \$users_list;
+
+DROP PROCEDURE p1;
+source extra/rpl_tests/rpl_current_user.test;
diff --git a/mysql-test/suite/rpl_ndb/r/rpl_ndb_set_null.result b/mysql-test/suite/rpl_ndb/r/rpl_ndb_set_null.result
new file mode 100644
index 00000000000..473cd63169c
--- /dev/null
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_set_null.result
@@ -0,0 +1,35 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t1 (c1 BIT, c2 INT) Engine=NDB;
+INSERT INTO `t1` VALUES ( 1, 1 );
+UPDATE t1 SET c1=NULL where c2=1;
+Comparing tables master:test.t1 and slave:test.t1
+DELETE FROM t1 WHERE c2=1 LIMIT 1;
+Comparing tables master:test.t1 and slave:test.t1
+DROP TABLE t1;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t1 (c1 CHAR) Engine=NDB;
+INSERT INTO t1 ( c1 ) VALUES ( 'w' ) ;
+SELECT * FROM t1;
+c1
+w
+UPDATE t1 SET c1=NULL WHERE c1='w';
+Comparing tables master:test.t1 and slave:test.t1
+DELETE FROM t1 LIMIT 2;
+Comparing tables master:test.t1 and slave:test.t1
+DROP TABLE t1;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_set_null.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_set_null.test
new file mode 100644
index 00000000000..454807d9591
--- /dev/null
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_set_null.test
@@ -0,0 +1,6 @@
+-- source include/have_ndb.inc
+-- source include/have_binlog_format_mixed_or_row.inc
+-- source include/ndb_master-slave.inc
+
+-- let $engine= NDB
+-- source extra/rpl_tests/rpl_set_null.test
diff --git a/mysql-test/t/delete.test b/mysql-test/t/delete.test
index a5dff38c078..2f51fafd6a6 100644
--- a/mysql-test/t/delete.test
+++ b/mysql-test/t/delete.test
@@ -357,4 +357,21 @@ END |
--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
DELETE IGNORE FROM t1;
-DROP TABLE t1; \ No newline at end of file
+DROP TABLE t1;
+
+
+--echo #
+--echo # Bug #49552 : sql_buffer_result cause crash + not found records
+--echo # in multitable delete/subquery
+--echo #
+
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES (1),(2),(3);
+SET SESSION SQL_BUFFER_RESULT=1;
+DELETE t1 FROM (SELECT SUM(a) a FROM t1) x,t1;
+
+SET SESSION SQL_BUFFER_RESULT=DEFAULT;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+--echo End of 5.1 tests
diff --git a/mysql-test/t/openssl_1.test b/mysql-test/t/openssl_1.test
index baa1603faab..8ca70258bc0 100644
--- a/mysql-test/t/openssl_1.test
+++ b/mysql-test/t/openssl_1.test
@@ -15,8 +15,8 @@ insert into t1 values (5);
grant select on test.* to ssl_user1@localhost require SSL;
grant select on test.* to ssl_user2@localhost require cipher "DHE-RSA-AES256-SHA";
-grant select on test.* to ssl_user3@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB/emailAddress=abstract.mysql.developer@mysql.com";
-grant select on test.* to ssl_user4@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB/emailAddress=abstract.mysql.developer@mysql.com" ISSUER "/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB";
+grant select on test.* to ssl_user3@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB";
+grant select on test.* to ssl_user4@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/ST=Uppsala/O=MySQL AB" ISSUER "/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB";
grant select on test.* to ssl_user5@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "xxx";
flush privileges;
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index e58cea1eef3..f61db538fb4 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -3836,6 +3836,46 @@ EXPLAIN EXTENDED SELECT x.a, y.a, z.a FROM t1 x
DROP TABLE t1;
+--echo #
+--echo # Bug #49897: crash in ptr_compare when char(0) NOT NULL
+--echo # column is used for ORDER BY
+--echo #
+SET @old_sort_buffer_size= @@session.sort_buffer_size;
+SET @@sort_buffer_size= 40000;
+
+CREATE TABLE t1(a CHAR(0) NOT NULL);
+--disable_warnings
+INSERT INTO t1 VALUES (0), (0), (0);
+--enable_warnings
+INSERT INTO t1 SELECT t11.a FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a FROM t1 t11, t1 t12;
+EXPLAIN SELECT a FROM t1 ORDER BY a;
+--disable_result_log
+SELECT a FROM t1 ORDER BY a;
+--enable_result_log
+DROP TABLE t1;
+
+CREATE TABLE t1(a CHAR(0) NOT NULL, b CHAR(0) NOT NULL, c int);
+--disable_warnings
+INSERT INTO t1 VALUES (0, 0, 0), (0, 0, 2), (0, 0, 1);
+--enable_warnings
+INSERT INTO t1 SELECT t11.a, t11.b, t11.c FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a, t11.b, t11.c FROM t1 t11, t1 t12;
+INSERT INTO t1 SELECT t11.a, t11.b, t11.c FROM t1 t11, t1 t12;
+EXPLAIN SELECT a FROM t1 ORDER BY a LIMIT 5;
+SELECT a FROM t1 ORDER BY a LIMIT 5;
+EXPLAIN SELECT * FROM t1 ORDER BY a, b LIMIT 5;
+SELECT * FROM t1 ORDER BY a, b LIMIT 5;
+EXPLAIN SELECT * FROM t1 ORDER BY a, b, c LIMIT 5;
+SELECT * FROM t1 ORDER BY a, b, c LIMIT 5;
+EXPLAIN SELECT * FROM t1 ORDER BY c, a LIMIT 5;
+SELECT * FROM t1 ORDER BY c, a LIMIT 5;
+
+SET @@sort_buffer_size= @old_sort_buffer_size;
+DROP TABLE t1;
+
+
--echo End of 5.0 tests
#
diff --git a/sql/events.cc b/sql/events.cc
index f6c4ea6d54f..a8f9a108161 100644
--- a/sql/events.cc
+++ b/sql/events.cc
@@ -341,31 +341,48 @@ common_1_lev_code:
}
-/**
- Create a new query string for removing executable comments
- for avoiding leak and keeping consistency of the execution
- on master and slave.
-
+/*
+ Binlog '{CREATE|ALTER} EVENT' statements.
+ Definer part is always rewritten, for definer can be CURRENT_USER() function.
+
@param[in] thd Thread handler
- @param[in] buf Query string
+ @param[in] create CREATE or ALTER statement
@return
- 0 ok
- 1 error
+ FASE ok
+ TRUE error
*/
-static int
-create_query_string(THD *thd, String *buf)
+static bool event_write_bin_log(THD *thd, bool create)
{
- /* Append the "CREATE" part of the query */
- if (buf->append(STRING_WITH_LEN("CREATE ")))
- return 1;
- /* Append definer */
- append_definer(thd, buf, &(thd->lex->definer->user), &(thd->lex->definer->host));
+ String log_query;
+ if (create)
+ {
+ /* Append the "CREATE" part of the query */
+ if (log_query.append(STRING_WITH_LEN("CREATE ")))
+ return TRUE;
+ }
+ else
+ {
+ /* Append the "ALETR " part of the query */
+ if (log_query.append(STRING_WITH_LEN("ALTER ")))
+ return TRUE;
+ }
+
+ /* Append definer
+ If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER
+ will be written into the binary log as the definer for the SQL thread.
+ */
+ append_definer(thd, &log_query, &(thd->lex->definer->user),
+ &(thd->lex->definer->host));
+
/* Append the left part of thd->query after "DEFINER" part */
- if (buf->append(thd->lex->stmt_definition_begin))
- return 1;
-
- return 0;
+ if (log_query.append(thd->lex->stmt_definition_begin,
+ thd->lex->stmt_definition_end -
+ thd->lex->stmt_definition_begin))
+ return TRUE;
+
+ return write_bin_log(thd, TRUE, log_query.c_ptr_safe(), log_query.length())
+ != 0;
}
/**
@@ -380,8 +397,7 @@ create_query_string(THD *thd, String *buf)
@sa Events::drop_event for the notes about locking, pre-locking
and Events DDL.
- @retval FALSE OK
- @retval TRUE Error (reported)
+ @retval FALSE OK @retval TRUE Error (reported)
*/
bool
@@ -465,22 +481,7 @@ Events::create_event(THD *thd, Event_parse_data *parse_data,
binlog the create event unless it's been successfully dropped
*/
if (!dropped)
- {
- /* Binlog the create event. */
- DBUG_ASSERT(thd->query() && thd->query_length());
- String log_query;
- if (create_query_string(thd, &log_query))
- {
- sql_print_error("Event Error: An error occurred while creating query string, "
- "before writing it into binary log.");
- /* Restore the state of binlog format */
- thd->current_stmt_binlog_row_based= save_binlog_row_based;
- DBUG_RETURN(TRUE);
- }
- /* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER
- will be written into the binary log as the definer for the SQL thread. */
- ret= write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length());
- }
+ ret= event_write_bin_log(thd, TRUE);
}
pthread_mutex_unlock(&LOCK_event_metadata);
/* Restore the state of binlog format */
@@ -602,9 +603,7 @@ Events::update_event(THD *thd, Event_parse_data *parse_data,
if (event_queue)
event_queue->update_event(thd, parse_data->dbname, parse_data->name,
new_element);
- /* Binlog the alter event. */
- DBUG_ASSERT(thd->query() && thd->query_length());
- ret= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
+ ret= event_write_bin_log(thd, FALSE);
}
}
pthread_mutex_unlock(&LOCK_event_metadata);
diff --git a/sql/field.h b/sql/field.h
index 159e4bf707c..8cfed9647f7 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -1929,7 +1929,12 @@ public:
uint32 max_display_length() { return field_length; }
uint size_of() const { return sizeof(*this); }
Item_result result_type () const { return INT_RESULT; }
- int reset(void) { bzero(ptr, bytes_in_rec); return 0; }
+ int reset(void) {
+ bzero(ptr, bytes_in_rec);
+ if (bit_ptr && (bit_len > 0)) // reset odd bits among null bits
+ clr_rec_bits(bit_ptr, bit_ofs, bit_len);
+ return 0;
+ }
int store(const char *to, uint length, CHARSET_INFO *charset);
int store(double nr);
int store(longlong nr, bool unsigned_val);
diff --git a/sql/filesort.cc b/sql/filesort.cc
index 8f18471b378..9528d10dba7 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -145,6 +145,8 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
error= 1;
bzero((char*) &param,sizeof(param));
param.sort_length= sortlength(thd, sortorder, s_length, &multi_byte_charset);
+ /* filesort cannot handle zero-length records. */
+ DBUG_ASSERT(param.sort_length);
param.ref_length= table->file->ref_length;
param.addon_field= 0;
param.addon_length= 0;
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 3cb978381ef..990f2ef951e 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -42,6 +42,20 @@ C_MODE_END
String my_empty_string("",default_charset_info);
+/*
+ Convert an array of bytes to a hexadecimal representation.
+
+ Used to generate a hexadecimal representation of a message digest.
+*/
+static void array_to_hex(char *to, const char *str, uint len)
+{
+ const char *str_end= str + len;
+ for (; str != str_end; ++str)
+ {
+ *to++= _dig_vec_lower[((uchar) *str) >> 4];
+ *to++= _dig_vec_lower[((uchar) *str) & 0x0F];
+ }
+}
bool Item_str_func::fix_fields(THD *thd, Item **ref)
@@ -114,12 +128,7 @@ String *Item_func_md5::val_str(String *str)
null_value=1;
return 0;
}
- sprintf((char *) str->ptr(),
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[0], digest[1], digest[2], digest[3],
- digest[4], digest[5], digest[6], digest[7],
- digest[8], digest[9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
+ array_to_hex((char *) str->ptr(), (const char*) digest, 16);
str->length((uint) 32);
return str;
}
@@ -160,15 +169,7 @@ String *Item_func_sha::val_str(String *str)
if (!( str->alloc(SHA1_HASH_SIZE*2) ||
(mysql_sha1_result(&context,digest))))
{
- sprintf((char *) str->ptr(),
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\
-%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[0], digest[1], digest[2], digest[3],
- digest[4], digest[5], digest[6], digest[7],
- digest[8], digest[9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15],
- digest[16], digest[17], digest[18], digest[19]);
-
+ array_to_hex((char *) str->ptr(), (const char*) digest, SHA1_HASH_SIZE);
str->length((uint) SHA1_HASH_SIZE*2);
null_value=0;
return str;
@@ -1764,19 +1765,19 @@ String *Item_func_encode::val_str(String *str)
null_value= 0;
res= copy_if_not_alloced(str, res, res->length());
- transform(res);
+ crypto_transform(res);
sql_crypt.reinit();
return res;
}
-void Item_func_encode::transform(String *res)
+void Item_func_encode::crypto_transform(String *res)
{
sql_crypt.encode((char*) res->ptr(),res->length());
res->set_charset(&my_charset_bin);
}
-void Item_func_decode::transform(String *res)
+void Item_func_decode::crypto_transform(String *res)
{
sql_crypt.decode((char*) res->ptr(),res->length());
}
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index ced164554e4..09a7da021c0 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -366,7 +366,7 @@ public:
void fix_length_and_dec();
const char *func_name() const { return "encode"; }
protected:
- virtual void transform(String *);
+ virtual void crypto_transform(String *);
private:
/** Provide a seed for the PRNG sequence. */
bool seed();
@@ -379,7 +379,7 @@ public:
Item_func_decode(Item *a, Item *seed): Item_func_encode(a, seed) {}
const char *func_name() const { return "decode"; }
protected:
- void transform(String *);
+ void crypto_transform(String *);
};
diff --git a/sql/log_event.cc b/sql/log_event.cc
index 3fc331e0683..b6c84dd95f4 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -2296,10 +2296,22 @@ bool Query_log_event::write(IO_CACHE* file)
int8store(start, table_map_for_update);
start+= 8;
}
+ if (master_data_written != 0)
+ {
+ /*
+ Q_MASTER_DATA_WRITTEN_CODE only exists in relay logs where the master
+ has binlog_version<4 and the slave has binlog_version=4. See comment
+ for master_data_written in log_event.h for details.
+ */
+ *start++= Q_MASTER_DATA_WRITTEN_CODE;
+ int4store(start, master_data_written);
+ start+= 4;
+ }
+
/*
NOTE: When adding new status vars, please don't forget to update
- the MAX_SIZE_LOG_EVENT_STATUS in log_event.h and update function
- code_name in this file.
+ the MAX_SIZE_LOG_EVENT_STATUS in log_event.h and update the function
+ code_name() in this file.
Here there could be code like
if (command-line-option-which-says-"log_this_variable" && inited)
@@ -2375,7 +2387,8 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
auto_increment_offset(thd_arg->variables.auto_increment_offset),
lc_time_names_number(thd_arg->variables.lc_time_names->number),
charset_database_number(0),
- table_map_for_update((ulonglong)thd_arg->table_map_for_update)
+ table_map_for_update((ulonglong)thd_arg->table_map_for_update),
+ master_data_written(0)
{
time_t end_time;
@@ -2515,6 +2528,7 @@ code_name(int code)
case Q_LC_TIME_NAMES_CODE: return "Q_LC_TIME_NAMES_CODE";
case Q_CHARSET_DATABASE_CODE: return "Q_CHARSET_DATABASE_CODE";
case Q_TABLE_MAP_FOR_UPDATE_CODE: return "Q_TABLE_MAP_FOR_UPDATE_CODE";
+ case Q_MASTER_DATA_WRITTEN_CODE: return "Q_MASTER_DATA_WRITTEN_CODE";
}
sprintf(buf, "CODE#%d", code);
return buf;
@@ -2552,7 +2566,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
flags2_inited(0), sql_mode_inited(0), charset_inited(0),
auto_increment_increment(1), auto_increment_offset(1),
time_zone_len(0), lc_time_names_number(0), charset_database_number(0),
- table_map_for_update(0)
+ table_map_for_update(0), master_data_written(0)
{
ulong data_len;
uint32 tmp;
@@ -2608,6 +2622,18 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
DBUG_PRINT("info", ("Query_log_event has status_vars_len: %u",
(uint) status_vars_len));
tmp-= 2;
+ }
+ else
+ {
+ /*
+ server version < 5.0 / binlog_version < 4 master's event is
+ relay-logged with storing the original size of the event in
+ Q_MASTER_DATA_WRITTEN_CODE status variable.
+ The size is to be restored at reading Q_MASTER_DATA_WRITTEN_CODE-marked
+ event from the relay log.
+ */
+ DBUG_ASSERT(description_event->binlog_version < 4);
+ master_data_written= data_written;
}
/*
We have parsed everything we know in the post header for QUERY_EVENT,
@@ -2699,6 +2725,11 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
table_map_for_update= uint8korr(pos);
pos+= 8;
break;
+ case Q_MASTER_DATA_WRITTEN_CODE:
+ CHECK_SPACE(pos, end, 4);
+ data_written= master_data_written= uint4korr(pos);
+ pos+= 4;
+ break;
default:
/* That's why you must write status vars in growing order of code */
DBUG_PRINT("info",("Query_log_event has unknown status vars (first has\
diff --git a/sql/log_event.h b/sql/log_event.h
index 1fdd7a05968..0dcc5ebc71f 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -264,7 +264,8 @@ struct sql_ex_info
1 + 1 + 255 /* type, length, time_zone */ + \
1 + 2 /* type, lc_time_names_number */ + \
1 + 2 /* type, charset_database_number */ + \
- 1 + 8 /* type, table_map_for_update */)
+ 1 + 8 /* type, table_map_for_update */ + \
+ 1 + 4 /* type, master_data_written */)
#define MAX_LOG_EVENT_HEADER ( /* in order of Query_log_event::write */ \
LOG_EVENT_HEADER_LEN + /* write_header */ \
QUERY_HEADER_LEN + /* write_data */ \
@@ -331,6 +332,10 @@ struct sql_ex_info
#define Q_TABLE_MAP_FOR_UPDATE_CODE 9
+#define Q_MASTER_DATA_WRITTEN_CODE 10
+
+/* Intvar event post-header */
+
/* Intvar event data */
#define I_TYPE_OFFSET 0
#define I_VAL_OFFSET 1
@@ -1641,6 +1646,16 @@ public:
statement, for other query statements, this will be zero.
*/
ulonglong table_map_for_update;
+ /*
+ Holds the original length of a Query_log_event that comes from a
+ master of version < 5.0 (i.e., binlog_version < 4). When the IO
+ thread writes the relay log, it augments the Query_log_event with a
+ Q_MASTER_DATA_WRITTEN_CODE status_var that holds the original event
+ length. This field is initialized to non-zero in the SQL thread when
+ it reads this augmented event. SQL thread does not write
+ Q_MASTER_DATA_WRITTEN_CODE to the slave's server binlog.
+ */
+ uint32 master_data_written;
#ifndef MYSQL_CLIENT
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 30eaf17d7a4..5714db92af0 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -134,7 +134,7 @@ char* query_table_status(THD *thd,const char *db,const char *table_name);
(Old), (Ver), (New)); \
else \
sql_print_warning("The syntax '%s' is deprecated and will be removed " \
- "in MySQL %s. Please use %s instead.", (Old), (Ver), (New)); \
+ "in a future release. Please use %s instead.", (Old), (New)); \
} while(0)
extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *system_charset_info;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index aad06cd5445..57a00a3f4d0 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1978,10 +1978,10 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache)
/* It's safe to broadcast outside a lock (COND... is not deleted here) */
DBUG_PRINT("signal", ("Broadcasting COND_thread_count"));
+ DBUG_LEAVE; // Must match DBUG_ENTER()
my_thread_end();
(void) pthread_cond_broadcast(&COND_thread_count);
- DBUG_LEAVE; // Must match DBUG_ENTER()
pthread_exit(0);
return 0; // Avoid compiler warnings
}
@@ -5744,6 +5744,9 @@ enum options_mysqld
OPT_TABLE_LOCK_WAIT_TIMEOUT,
OPT_PLUGIN_LOAD,
OPT_PLUGIN_DIR,
+ OPT_SYMBOLIC_LINKS,
+ OPT_WARNINGS,
+ OPT_RECORD_BUFFER_OLD,
OPT_LOG_OUTPUT,
OPT_PORT_OPEN_TIMEOUT,
OPT_PROFILING,
@@ -6577,7 +6580,7 @@ log and this option does nothing anymore.",
{"transaction-isolation", OPT_TX_ISOLATION,
"Default transaction isolation level.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0,
0, 0, 0, 0, 0},
- {"use-symbolic-links", 's', "Enable symbolic link support. Deprecated option; use --symbolic-links instead.",
+ {"use-symbolic-links", OPT_SYMBOLIC_LINKS, "Enable symbolic link support. Deprecated option; use --symbolic-links instead.",
(uchar**) &my_use_symdir, (uchar**) &my_use_symdir, 0, GET_BOOL, NO_ARG,
IF_PURIFY(0,1), 0, 0, 0, 0, 0},
{"user", 'u', "Run mysqld daemon as user.", 0, 0, 0, GET_STR, REQUIRED_ARG,
@@ -6587,7 +6590,7 @@ log and this option does nothing anymore.",
0, 0},
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
NO_ARG, 0, 0, 0, 0, 0, 0},
- {"warnings", 'W', "Deprecated; use --log-warnings instead.",
+ {"warnings", OPT_WARNINGS, "Deprecated; use --log-warnings instead.",
(uchar**) &global_system_variables.log_warnings,
(uchar**) &max_system_variables.log_warnings, 0, GET_ULONG, OPT_ARG,
1, 0, ULONG_MAX, 0, 0, 0},
@@ -6840,7 +6843,8 @@ The minimum value for this variable is 4096.",
(uchar**) &myisam_data_pointer_size, 0, GET_ULONG, REQUIRED_ARG,
6, 2, 7, 0, 1, 0},
{"myisam_max_extra_sort_file_size", OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE,
- "Deprecated option",
+ "This is a deprecated option that does nothing anymore. It will be removed in MySQL "
+ VER_CELOSIA,
(uchar**) &global_system_variables.myisam_max_extra_sort_file_size,
(uchar**) &max_system_variables.myisam_max_extra_sort_file_size,
0, GET_ULL, REQUIRED_ARG, (ulonglong) MI_MAX_TEMP_LENGTH,
@@ -6997,8 +7001,8 @@ The minimum value for this variable is 4096.",
(uchar**) &max_system_variables.read_rnd_buff_size, 0,
GET_ULONG, REQUIRED_ARG, 256*1024L, IO_SIZE*2+MALLOC_OVERHEAD,
INT_MAX32, MALLOC_OVERHEAD, IO_SIZE, 0},
- {"record_buffer", OPT_RECORD_BUFFER,
- "Alias for read_buffer_size",
+ {"record_buffer", OPT_RECORD_BUFFER_OLD,
+ "Alias for read_buffer_size. This variable is deprecated and will be removed in a future release.",
(uchar**) &global_system_variables.read_buff_size,
(uchar**) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, INT_MAX32, MALLOC_OVERHEAD, IO_SIZE, 0},
@@ -8067,6 +8071,9 @@ mysqld_get_one_option(int optid,
print_version();
exit(0);
#endif /*EMBEDDED_LIBRARY*/
+ case OPT_WARNINGS:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "--warnings", "--log-warnings");
+ /* Note: fall-through to 'W' */
case 'W':
if (!argument)
global_system_variables.log_warnings++;
@@ -8088,6 +8095,9 @@ mysqld_get_one_option(int optid,
case (int) OPT_LOG_BIN_TRUST_FUNCTION_CREATORS_OLD:
WARN_DEPRECATED(NULL, VER_CELOSIA, "--log-bin-trust-routine-creators", "--log-bin-trust-function-creators");
break;
+ case (int) OPT_ENABLE_LOCK:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "--enable-locking", "--external-locking");
+ break;
case (int) OPT_BIG_TABLES:
thd_startup_options|=OPTION_BIG_TABLES;
break;
@@ -8098,6 +8108,7 @@ mysqld_get_one_option(int optid,
opt_myisam_log=1;
break;
case (int) OPT_UPDATE_LOG:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "--log-update", "--log-bin");
opt_update_log=1;
break;
case (int) OPT_BIN_LOG:
@@ -8266,8 +8277,18 @@ mysqld_get_one_option(int optid,
"give threads different priorities.");
break;
case (int) OPT_SKIP_LOCK:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "--skip-locking", "--skip-external-locking");
opt_external_locking=0;
break;
+ case (int) OPT_SQL_BIN_UPDATE_SAME:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "--sql-bin-update-same", "the binary log");
+ break;
+ case (int) OPT_RECORD_BUFFER_OLD:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "record_buffer", "read_buffer_size");
+ break;
+ case (int) OPT_SYMBOLIC_LINKS:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "--use-symbolic-links", "--symbolic-links");
+ break;
case (int) OPT_SKIP_HOST_CACHE:
opt_specialflag|= SPECIAL_NO_HOST_CACHE;
break;
@@ -8293,6 +8314,7 @@ mysqld_get_one_option(int optid,
test_flags|=TEST_NO_STACKTRACE;
break;
case (int) OPT_SKIP_SYMLINKS:
+ WARN_DEPRECATED(NULL, VER_CELOSIA, "--skip-symlink", "--skip-symbolic-links");
my_use_symdir=0;
break;
case (int) OPT_BIND_ADDRESS:
@@ -8368,6 +8390,9 @@ mysqld_get_one_option(int optid,
server_id_supplied = 1;
break;
case OPT_DELAY_KEY_WRITE_ALL:
+ WARN_DEPRECATED(NULL, VER_CELOSIA,
+ "--delay-key-write-for-all-tables",
+ "--delay-key-write=ALL");
if (argument != disabled_my_option)
argument= (char*) "ALL";
/* Fall through */
@@ -8383,6 +8408,11 @@ mysqld_get_one_option(int optid,
delay_key_write_options= (uint) type-1;
}
break;
+ case OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE:
+ sql_print_warning("--myisam_max_extra_sort_file_size is deprecated and "
+ "does nothing in this version. It will be removed in "
+ "a future release.");
+ break;
case OPT_CHARSETS_DIR:
strmake(mysql_charsets_dir, argument, sizeof(mysql_charsets_dir)-1);
charsets_dir = mysql_charsets_dir;
diff --git a/sql/rpl_injector.cc b/sql/rpl_injector.cc
index 666622dbac4..43f4e7d849d 100644
--- a/sql/rpl_injector.cc
+++ b/sql/rpl_injector.cc
@@ -114,8 +114,8 @@ int injector::transaction::write_row (server_id_type sid, table tbl,
{
DBUG_ENTER("injector::transaction::write_row(...)");
- int error= 0;
- if (error= check_state(ROW_STATE))
+ int error= check_state(ROW_STATE);
+ if (error)
DBUG_RETURN(error);
server_id_type save_id= m_thd->server_id;
@@ -133,8 +133,8 @@ int injector::transaction::delete_row(server_id_type sid, table tbl,
{
DBUG_ENTER("injector::transaction::delete_row(...)");
- int error= 0;
- if (error= check_state(ROW_STATE))
+ int error= check_state(ROW_STATE);
+ if (error)
DBUG_RETURN(error);
server_id_type save_id= m_thd->server_id;
@@ -152,8 +152,8 @@ int injector::transaction::update_row(server_id_type sid, table tbl,
{
DBUG_ENTER("injector::transaction::update_row(...)");
- int error= 0;
- if (error= check_state(ROW_STATE))
+ int error= check_state(ROW_STATE);
+ if (error)
DBUG_RETURN(error);
server_id_type save_id= m_thd->server_id;
diff --git a/sql/rpl_record.cc b/sql/rpl_record.cc
index 8e80620dd2c..3a46bbcd6ee 100644
--- a/sql/rpl_record.cc
+++ b/sql/rpl_record.cc
@@ -231,6 +231,22 @@ unpack_row(Relay_log_info const *rli,
{
DBUG_PRINT("debug", ("Was NULL; null mask: 0x%x; null bits: 0x%x",
null_mask, null_bits));
+ /**
+ Calling reset just in case one is unpacking on top a
+ record with data.
+
+ This could probably go into set_null() but doing so,
+ (i) triggers assertion in other parts of the code at
+ the moment; (ii) it would make us reset the field,
+ always when setting null, which right now doesn't seem
+ needed anywhere else except here.
+
+ TODO: maybe in the future we should consider moving
+ the reset to make it part of set_null. But then
+ the assertions triggered need to be
+ addressed/revisited.
+ */
+ f->reset();
f->set_null();
}
else
@@ -366,7 +382,6 @@ int prepare_record(TABLE *const table,
*/
for (Field **field_ptr= table->field+skip; *field_ptr; ++field_ptr)
{
- uint32 const mask= NOT_NULL_FLAG | NO_DEFAULT_VALUE_FLAG;
Field *const f= *field_ptr;
if ((f->flags & NO_DEFAULT_VALUE_FLAG) &&
(f->real_type() != MYSQL_TYPE_ENUM))
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index ea781080a38..2787f3d297d 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -194,6 +194,7 @@ static bool compare_hostname(const acl_host_and_ip *host,const char *hostname,
const char *ip);
static my_bool acl_load(THD *thd, TABLE_LIST *tables);
static my_bool grant_load(THD *thd, TABLE_LIST *tables);
+static bool acl_write_bin_log(THD *thd, List <LEX_USER> &list, bool clear_error);
/*
Convert scrambled password to binary form, according to scramble type,
@@ -3228,7 +3229,8 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
if (!result) /* success */
{
- result= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
+ if (acl_write_bin_log(thd, user_list, TRUE))
+ result= -1;
}
rw_unlock(&LOCK_grant);
@@ -3404,8 +3406,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
if (write_to_binlog)
{
- if (write_bin_log(thd, FALSE, thd->query(), thd->query_length()))
- result= TRUE;
+ result|= acl_write_bin_log(thd, user_list, FALSE);
}
rw_unlock(&LOCK_grant);
@@ -3534,7 +3535,7 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
if (!result)
{
- result= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
+ result= acl_write_bin_log(thd, list, TRUE);
}
rw_unlock(&LOCK_grant);
@@ -5776,9 +5777,9 @@ static int handle_grant_data(TABLE_LIST *tables, bool drop,
}
-static void append_user(String *str, LEX_USER *user)
+static void append_user(String *str, LEX_USER *user, bool comma= TRUE)
{
- if (str->length())
+ if (comma && str->length())
str->append(',');
str->append('\'');
str->append(user->user.str);
@@ -5787,6 +5788,65 @@ static void append_user(String *str, LEX_USER *user)
str->append('\'');
}
+/*
+ The operations(DROP, RENAME, REVOKE, GRANT) will cause inconsistency between
+ master and slave, when CURRENT_USER() is used. To solve this problem, we
+ construct a new binlog statement in which CURRENT_USER() is replaced by
+ the real user name and host name.
+ */
+static bool acl_write_bin_log(THD *thd, List <LEX_USER> &list, bool clear_error)
+{
+ String log_query;
+ LEX *lex= thd->lex;
+ List_iterator <LEX_USER> user_list(list);
+ LEX_USER *user, *tmp_user;
+
+ if (!mysql_bin_log.is_open())
+ return FALSE;
+
+ if (log_query.append(lex->stmt_begin, lex->stmt_user_begin - lex->stmt_begin))
+ return TRUE;
+ while ((tmp_user= user_list++))
+ {
+ if (!(user= get_current_user(thd, tmp_user)))
+ continue;
+
+ /*
+ No User, but a password?
+ They did GRANT ... TO CURRENT_USER() IDENTIFIED BY ... !
+ Get the current user, and shallow-copy the new password to them!
+ */
+ if (!tmp_user->user.str && tmp_user->password.str)
+ user->password= tmp_user->password;
+
+ if (log_query.append(" ", 1))
+ return TRUE;
+ append_user(&log_query, user, FALSE);
+ /* Only 'GRANT' have password */
+ if (user->password.str)
+ {
+ if (log_query.append(STRING_WITH_LEN(" IDENTIFIED BY ")) ||
+ log_query.append(STRING_WITH_LEN("PASSWORD ")) ||
+ log_query.append("'", 1) ||
+ log_query.append(user->password.str,
+ user->password.length) ||
+ log_query.append("'", 1))
+ return TRUE;
+ }
+ if (log_query.append(",", 1))
+ return TRUE;
+ }
+ /* It is binlogged only when at least one user is in the query */
+ if (log_query.c_ptr()[log_query.length()-1] == ',')
+ {
+ log_query.length(log_query.length()-1);
+ if (log_query.append(lex->stmt_user_end, lex->stmt_end - lex->stmt_user_end))
+ return TRUE;
+ return write_bin_log(thd, clear_error, log_query.c_ptr_safe(),
+ log_query.length()) != 0;
+ }
+ return FALSE;
+}
/*
Create a list of users.
@@ -5893,6 +5953,7 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
{
int result;
String wrong_users;
+ String log_query;
LEX_USER *user_name, *tmp_user_name;
List_iterator <LEX_USER> user_list(list);
TABLE_LIST tables[GRANT_TABLES];
@@ -5922,6 +5983,7 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
rw_wrlock(&LOCK_grant);
VOID(pthread_mutex_lock(&acl_cache->lock));
+ log_query.append(STRING_WITH_LEN("DROP USER"));
while ((tmp_user_name= user_list++))
{
if (!(user_name= get_current_user(thd, tmp_user_name)))
@@ -5929,6 +5991,17 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
result= TRUE;
continue;
}
+
+ /*
+ The operation will cause inconsistency between master and slave, when
+ CURRENT_USER() is used. To solve this problem, we construct a new
+ binlog statement in which CURRENT_USER() is replaced by the real user
+ name and host name.
+ */
+ log_query.append(STRING_WITH_LEN(" "));
+ append_user(&log_query, user_name, FALSE);
+ log_query.append(STRING_WITH_LEN(","));
+
if (handle_grant_data(tables, 1, user_name, NULL) <= 0)
{
append_user(&wrong_users, user_name);
@@ -5947,7 +6020,13 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
my_error(ER_CANNOT_USER, MYF(0), "DROP USER", wrong_users.c_ptr_safe());
if (some_users_deleted)
- result |= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
+ {
+ if (log_query.c_ptr()[log_query.length()-1] == ',')
+ {
+ log_query.length(log_query.length()-1);
+ result|= write_bin_log(thd, FALSE, log_query.c_ptr_safe(), log_query.length());
+ }
+ }
rw_unlock(&LOCK_grant);
close_thread_tables(thd);
@@ -5975,6 +6054,7 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
{
int result;
String wrong_users;
+ String log_query;
LEX_USER *user_from, *tmp_user_from;
LEX_USER *user_to, *tmp_user_to;
List_iterator <LEX_USER> user_list(list);
@@ -6002,6 +6082,7 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
rw_wrlock(&LOCK_grant);
VOID(pthread_mutex_lock(&acl_cache->lock));
+ log_query.append(STRING_WITH_LEN("RENAME USER"));
while ((tmp_user_from= user_list++))
{
if (!(user_from= get_current_user(thd, tmp_user_from)))
@@ -6018,6 +6099,18 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
DBUG_ASSERT(user_to != 0); /* Syntax enforces pairs of users. */
/*
+ The operation will cause inconsistency between master and slave, when
+ CURRENT_USER() is used. To solve this problem, we construct a new
+ binlog statement in which CURRENT_USER() is replaced by the real user
+ name and host name.
+ */
+ log_query.append(STRING_WITH_LEN(" "));
+ append_user(&log_query, user_from, FALSE);
+ log_query.append(STRING_WITH_LEN(" TO "));
+ append_user(&log_query, user_to, FALSE);
+ log_query.append(STRING_WITH_LEN(","));
+
+ /*
Search all in-memory structures and grant tables
for a mention of the new user name.
*/
@@ -6038,9 +6131,15 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
if (result)
my_error(ER_CANNOT_USER, MYF(0), "RENAME USER", wrong_users.c_ptr_safe());
-
- if (some_users_renamed && mysql_bin_log.is_open())
- result |= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
+
+ if (some_users_renamed)
+ {
+ if (log_query.c_ptr()[log_query.length()-1] == ',')
+ {
+ log_query.length(log_query.length()-1);
+ result|= write_bin_log(thd, FALSE, log_query.c_ptr_safe(), log_query.length());
+ }
+ }
rw_unlock(&LOCK_grant);
close_thread_tables(thd);
@@ -6230,8 +6329,9 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
VOID(pthread_mutex_unlock(&acl_cache->lock));
- int binlog_error=
- write_bin_log(thd, FALSE, thd->query(), thd->query_length());
+ int binlog_error= 0;
+ if (acl_write_bin_log(thd, list, FALSE))
+ binlog_error= 1;
rw_unlock(&LOCK_grant);
close_thread_tables(thd);
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index cac22c0a053..71054c923ca 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -829,7 +829,7 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info)
qinfo.db_len = strlen(db);
/* These DDL methods and logging protected with LOCK_mysql_create_db */
- if (error= mysql_bin_log.write(&qinfo))
+ if ((error= mysql_bin_log.write(&qinfo)))
goto exit;
}
my_ok(thd, result);
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 4bf8cd41aee..13a289eac1d 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -1799,6 +1799,8 @@ struct LEX: public Query_tables_list
- CREATE TRIGGER (points to "TRIGGER");
- CREATE PROCEDURE (points to "PROCEDURE");
- CREATE FUNCTION (points to "FUNCTION" or "AGGREGATE");
+ - CREATE VIEW(points to "VIEW");
+ - CREATE EVENT(points to "EVENT");
This pointer is required to add possibly omitted DEFINER-clause to the
DDL-statement before dumping it to the binlog.
@@ -1807,6 +1809,29 @@ struct LEX: public Query_tables_list
const char *stmt_definition_end;
+ /*
+ stmt_begin is intended to point to the begin of every statement.
+ It is now used in the following statements:
+ - GRANT ALL PRIVELEGES ON *.* (points to "GRANT");
+ - REVOKE ALL PRIVELEGES ON *.* (points to "REVOKE");
+ */
+ const char *stmt_begin;
+ const char *stmt_end;
+
+ /*
+ stmt_user_begin is intended to point to the begin of the user list in
+ the following statements:
+ - GRANT ALL PRIVELEGES ON *.* TO 'username'@'hostname'
+ (points to "'username'");
+ - REVOKE ALL PRIVELEGES ON *.* FROM 'username'@'hostname'
+ (points to "'username'");
+
+ these pointers are required to replace the CURRENT_USER()
+ function by the real user before dumping it to the binlog.
+ */
+ const char *stmt_user_begin;
+ const char *stmt_user_end;
+
/**
During name resolution search only in the table list given by
Name_resolution_context::first_name_resolution_table and
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 6bb01f0b50c..96e4fb05988 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -3490,9 +3490,9 @@ end_with_restore_list:
select_lex->where,
0, (ORDER *)NULL, (ORDER *)NULL, (Item *)NULL,
(ORDER *)NULL,
- select_lex->options | thd->options |
+ (select_lex->options | thd->options |
SELECT_NO_JOIN_CACHE | SELECT_NO_UNLOCK |
- OPTION_SETUP_TABLES_DONE,
+ OPTION_SETUP_TABLES_DONE) & ~OPTION_BUFFER_RESULT,
del_result, unit, select_lex);
res|= thd->is_error();
MYSQL_MULTI_DELETE_DONE(res, del_result->num_deleted());
@@ -4127,7 +4127,7 @@ end_with_restore_list:
*/
if (!lex->no_write_to_binlog && write_to_binlog)
{
- if (res= write_bin_log(thd, FALSE, thd->query(), thd->query_length()))
+ if ((res= write_bin_log(thd, FALSE, thd->query(), thd->query_length())))
break;
}
my_ok(thd);
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index cb4a9b5943a..f8ebc0492a6 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -543,13 +543,26 @@ JOIN::prepare(Item ***rref_pointer_array,
if (order)
{
+ bool real_order= FALSE;
ORDER *ord;
for (ord= order; ord; ord= ord->next)
{
Item *item= *ord->item;
+ /*
+ Disregard sort order if there's only "{VAR}CHAR(0) NOT NULL" fields
+ there. Such fields don't contain any data to sort.
+ */
+ if (!real_order &&
+ (item->type() != Item::Item::FIELD_ITEM ||
+ ((Item_field *) item)->field->maybe_null() ||
+ ((Item_field *) item)->field->sort_length()))
+ real_order= TRUE;
+
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
item->split_sum_func(thd, ref_pointer_array, all_fields);
}
+ if (!real_order)
+ order= NULL;
}
if (having && having->with_sum_func)
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 42b63108e1f..b17edbdd234 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -6608,7 +6608,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
thd->clear_error();
Query_log_event qinfo(thd, thd->query(), thd->query_length(),
0, FALSE, 0);
- if (error= mysql_bin_log.write(&qinfo))
+ if ((error= mysql_bin_log.write(&qinfo)))
goto view_err_unlock;
}
my_ok(thd);
diff --git a/sql/sql_test.cc b/sql/sql_test.cc
index 6c0cb08cc79..845a6792801 100644
--- a/sql/sql_test.cc
+++ b/sql/sql_test.cc
@@ -168,6 +168,21 @@ TEST_join(JOIN *join)
uint i,ref;
DBUG_ENTER("TEST_join");
+ /*
+ Assemble results of all the calls to full_name() first,
+ in order not to garble the tabular output below.
+ */
+ String ref_key_parts[MAX_TABLES];
+ for (i= 0; i < join->tables; i++)
+ {
+ JOIN_TAB *tab= join->join_tab + i;
+ for (ref= 0; ref < tab->ref.key_parts; ref++)
+ {
+ ref_key_parts[i].append(tab->ref.items[ref]->full_name());
+ ref_key_parts[i].append(" ");
+ }
+ }
+
DBUG_LOCK_FILE;
VOID(fputs("\nInfo about JOIN\n",DBUG_FILE));
for (i=0 ; i < join->tables ; i++)
@@ -199,13 +214,8 @@ TEST_join(JOIN *join)
}
if (tab->ref.key_parts)
{
- VOID(fputs(" refs: ",DBUG_FILE));
- for (ref=0 ; ref < tab->ref.key_parts ; ref++)
- {
- Item *item=tab->ref.items[ref];
- fprintf(DBUG_FILE,"%s ", item->full_name());
- }
- VOID(fputc('\n',DBUG_FILE));
+ fprintf(DBUG_FILE,
+ " refs: %s\n", ref_key_parts[i].ptr());
}
}
DBUG_UNLOCK_FILE;
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 36a910b7a99..9b34c05f3ae 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1590,7 +1590,11 @@ opt_end_of_input:
;
verb_clause:
- statement
+ remember_name statement remember_end
+ {
+ Lex->stmt_begin= $1;
+ Lex->stmt_end= $3;
+ }
| begin
;
@@ -6061,7 +6065,7 @@ alter:
}
view_tail
{}
- | ALTER definer_opt EVENT_SYM sp_name
+ | ALTER definer_opt remember_name EVENT_SYM sp_name
{
/*
It is safe to use Lex->spname because
@@ -6073,7 +6077,8 @@ alter:
if (!(Lex->event_parse_data= Event_parse_data::new_instance(YYTHD)))
MYSQL_YYABORT;
- Lex->event_parse_data->identifier= $4;
+ Lex->event_parse_data->identifier= $5;
+ Lex->stmt_definition_begin= $3;
Lex->sql_command= SQLCOM_ALTER_EVENT;
}
@@ -6083,7 +6088,7 @@ alter:
opt_ev_comment
opt_ev_sql_stmt
{
- if (!($6 || $7 || $8 || $9 || $10))
+ if (!($7 || $8 || $9 || $10 || $11))
{
my_parse_error(ER(ER_SYNTAX_ERROR));
MYSQL_YYABORT;
@@ -6144,7 +6149,16 @@ opt_ev_rename_to:
;
opt_ev_sql_stmt:
- /* empty*/ { $$= 0;}
+ /* empty*/
+ {
+ $$= 0;
+ /*
+ Lex->sp_head is not initialized when event body is empty.
+ So we can not use Lex->sp_head->set_stmt_end() to set
+ stmt_definition_end.
+ */
+ Lex->stmt_definition_end= (char*) YYLIP->get_cpp_tok_end();
+ }
| DO_SYM ev_sql_stmt { $$= 1; }
;
@@ -11894,6 +11908,7 @@ user:
$$->user = $1;
$$->host.str= (char *) "%";
$$->host.length= 1;
+ Lex->stmt_user_end= YYLIP->get_cpp_ptr();
if (check_string_char_length(&$$->user, ER(ER_USERNAME),
USERNAME_CHAR_LENGTH,
@@ -11906,6 +11921,7 @@ user:
if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user))))
MYSQL_YYABORT;
$$->user = $1; $$->host=$3;
+ Lex->stmt_user_end= YYLIP->get_cpp_ptr();
if (check_string_char_length(&$$->user, ER(ER_USERNAME),
USERNAME_CHAR_LENGTH,
@@ -11915,6 +11931,7 @@ user:
}
| CURRENT_USER optional_braces
{
+ Lex->stmt_user_end= YYLIP->get_cpp_ptr();
if (!($$=(LEX_USER*) YYTHD->alloc(sizeof(st_lex_user))))
MYSQL_YYABORT;
/*
@@ -13119,9 +13136,10 @@ user_list:
;
grant_list:
+ { Lex->stmt_user_begin= YYLIP->get_cpp_ptr(); }
grant_user
{
- if (Lex->users_list.push_back($1))
+ if (Lex->users_list.push_back($2))
MYSQL_YYABORT;
}
| grant_list ',' grant_user
@@ -13134,6 +13152,7 @@ grant_list:
grant_user:
user IDENTIFIED_SYM BY TEXT_STRING
{
+ Lex->stmt_user_end= YYLIP->get_cpp_ptr();
$$=$1; $1->password=$4;
if ($4.length)
{
@@ -13160,7 +13179,10 @@ grant_user:
}
}
| user IDENTIFIED_SYM BY PASSWORD TEXT_STRING
- { $$= $1; $1->password= $5; }
+ {
+ Lex->stmt_user_end= YYLIP->get_cpp_ptr();
+ $$= $1; $1->password= $5;
+ }
| user
{ $$= $1; $1->password= null_lex_str; }
;