mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug#45100: Incomplete DROP USER in case of SQL_MODE = 'PAD_CHAR_TO_FULL_LENGTH'
The SQL-mode PAD_CHAR_TO_FULL_LENGTH could prevent a DROP USER statement from privileges associated with the user being dropped. What ocurred was that reading from the User and Host fields of the tables tables_priv or columns_priv would yield values padded with spaces, causing a failure to match a specified user or host ('user' != 'user '); The solution is to disregard the PAD_CHAR_TO_FULL_LENGTH mode when iterating over and matching values in the privileges tables for a DROP USER statement. mysql-test/r/sql_mode.result: Add test case result for Bug#45100. mysql-test/t/sql_mode.test: Add test case for Bug#45100. sql/sql_acl.cc: Clear MODE_PAD_CHAR_TO_FULL_LENGTH before dropping privileges.
This commit is contained in:
@ -308,3 +308,39 @@ flush privileges;
|
||||
|
||||
--connection default
|
||||
drop user mysqltest_32753@localhost;
|
||||
|
||||
#
|
||||
# Bug#45100: Incomplete DROP USER in case of SQL_MODE = 'PAD_CHAR_TO_FULL_LENGTH'
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
--enable_warnings
|
||||
|
||||
# Generate some prerequisites
|
||||
CREATE USER 'user_PCTFL'@'localhost' identified by 'PWD';
|
||||
CREATE USER 'user_no_PCTFL'@'localhost' identified by 'PWD';
|
||||
|
||||
CREATE TABLE t1 (f1 BIGINT);
|
||||
CREATE TABLE t2 (f1 CHAR(3) NOT NULL, f2 CHAR(20));
|
||||
|
||||
# Grant privilege on a TABLE
|
||||
GRANT ALL ON t1 TO 'user_PCTFL'@'localhost','user_no_PCTFL'@'localhost';
|
||||
# Grant privilege on some COLUMN of a table
|
||||
GRANT SELECT(f1) ON t2 TO 'user_PCTFL'@'localhost','user_no_PCTFL'@'localhost';
|
||||
|
||||
SET @OLD_SQL_MODE = @@SESSION.SQL_MODE;
|
||||
SET SESSION SQL_MODE = 'PAD_CHAR_TO_FULL_LENGTH';
|
||||
DROP USER 'user_PCTFL'@'localhost';
|
||||
SET SESSION SQL_MODE = @OLD_SQL_MODE;
|
||||
DROP USER 'user_no_PCTFL'@'localhost';
|
||||
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
SELECT * FROM mysql.db WHERE Host = 'localhost' AND User LIKE 'user_%PCTFL';
|
||||
SELECT * FROM mysql.tables_priv WHERE Host = 'localhost' AND User LIKE 'user_%PCTFL';
|
||||
SELECT * FROM mysql.columns_priv WHERE Host = 'localhost' AND User LIKE 'user_%PCTFL';
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
Reference in New Issue
Block a user