diff --git a/mysql-test/suite/galera/r/grant.result b/mysql-test/suite/galera/r/grant.result new file mode 100644 index 00000000000..8d257e7e8e2 --- /dev/null +++ b/mysql-test/suite/galera/r/grant.result @@ -0,0 +1,17 @@ +# +# MDEV#6266: Changing password fails on galera cluster +# + +# On node_1 +GRANT SELECT ON *.* TO 'user_6266'@'localhost' IDENTIFIED BY 'pass'; + +# Now, try changing password for 'user_6266'. This command should also +# execute successfully on the other node. +SET PASSWORD FOR 'user_6266'@'localhost' = PASSWORD('newpass'); + +# On node_2 +SELECT user FROM mysql.user WHERE user='user_6266'; +user +user_6266 +DROP USER 'user_6266'@'localhost'; +# End of test diff --git a/mysql-test/suite/galera/t/grant.test b/mysql-test/suite/galera/t/grant.test new file mode 100644 index 00000000000..de1c202cfbb --- /dev/null +++ b/mysql-test/suite/galera/t/grant.test @@ -0,0 +1,25 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV#6266: Changing password fails on galera cluster +--echo # + +--echo +--echo # On node_1 +--connection node_1 +GRANT SELECT ON *.* TO 'user_6266'@'localhost' IDENTIFIED BY 'pass'; +--echo +--echo # Now, try changing password for 'user_6266'. This command should also +--echo # execute successfully on the other node. +SET PASSWORD FOR 'user_6266'@'localhost' = PASSWORD('newpass'); + +--echo +--echo # On node_2 +--connection node_2 +SELECT user FROM mysql.user WHERE user='user_6266'; +# cleanup +DROP USER 'user_6266'@'localhost'; + +--source include/galera_end.inc +--echo # End of test diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index a0917c18aa3..4ea0692fa0e 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2512,7 +2512,13 @@ int check_change_password(THD *thd, const char *host, const char *user, my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--skip-grant-tables"); return(1); } - if (!thd->slave_thread && !thd->security_ctx->priv_user[0]) + +#ifdef WITH_WSREP + if ((!WSREP(thd) || !thd->wsrep_applier) && + !thd->slave_thread && !thd->security_ctx->user[0]) +#else + if (!thd->slave_thread && !thd->security_ctx->user[0]) +#endif /* WITH_WSREP */ { my_message(ER_PASSWORD_ANONYMOUS_USER, ER(ER_PASSWORD_ANONYMOUS_USER), MYF(0)); @@ -2523,6 +2529,7 @@ int check_change_password(THD *thd, const char *host, const char *user, my_error(ER_PASSWORD_NO_MATCH, MYF(0)); return 1; } + if (!thd->slave_thread && #ifdef WITH_WSREP (!WSREP(thd) || !thd->wsrep_applier) &&