diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-13 17:05:31 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-13 17:05:31 +0300 |
commit | 1f3f4571934140fd81f54aa366cc4656544c89f9 (patch) | |
tree | 589c086cd11d3bbffc1779e69a486f02cd0a689e | |
parent | 65dd31088a62b87d38899453720e667e4f1bf982 (diff) | |
download | mariadb-git-1f3f4571934140fd81f54aa366cc4656544c89f9.tar.gz |
MDEV-28802 DROP DATABASE in InnoDB still is case-insensitive
innodb_drop_database(): Use explicit TO_BINARY casts on
SYS_TABLES.NAME, which for historical reasons uses the wrong collation
latin1_swedish_ci instead of BINARY.
-rw-r--r-- | mysql-test/suite/innodb/r/dropdb_cs.result | 16 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/dropdb_cs.test | 17 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 3 |
3 files changed, 35 insertions, 1 deletions
diff --git a/mysql-test/suite/innodb/r/dropdb_cs.result b/mysql-test/suite/innodb/r/dropdb_cs.result new file mode 100644 index 00000000000..59f02c74a04 --- /dev/null +++ b/mysql-test/suite/innodb/r/dropdb_cs.result @@ -0,0 +1,16 @@ +# +# MDEV-28802 DROP DATABASE in InnoDB still is case-insensitive +# +SET @save_fpt=@@GLOBAL.innodb_file_per_table; +SET GLOBAL innodb_file_per_table=0; +CREATE DATABASE Db; +CREATE TABLE Db.t1 (c1 INT KEY) ENGINE=InnoDB; +CREATE DATABASE DB; +DROP DATABASE DB; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'D%'; +NAME +Db/t1 +DROP DATABASE Db; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'D%'; +TABLE_ID NAME FLAG N_COLS SPACE ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE +SET GLOBAL innodb_file_per_table=@save_fpt; diff --git a/mysql-test/suite/innodb/t/dropdb_cs.test b/mysql-test/suite/innodb/t/dropdb_cs.test new file mode 100644 index 00000000000..0053ca732be --- /dev/null +++ b/mysql-test/suite/innodb/t/dropdb_cs.test @@ -0,0 +1,17 @@ +--source include/have_innodb.inc +--source include/have_case_sensitive_file_system.inc + +--echo # +--echo # MDEV-28802 DROP DATABASE in InnoDB still is case-insensitive +--echo # + +SET @save_fpt=@@GLOBAL.innodb_file_per_table; +SET GLOBAL innodb_file_per_table=0; +CREATE DATABASE Db; +CREATE TABLE Db.t1 (c1 INT KEY) ENGINE=InnoDB; +CREATE DATABASE DB; +DROP DATABASE DB; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'D%'; +DROP DATABASE Db; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'D%'; +SET GLOBAL innodb_file_per_table=@save_fpt; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 300a1cd83ae..b676f83b8a3 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -1476,7 +1476,8 @@ static void innodb_drop_database(handlerton*, char *path) "WHILE 1 = 1 LOOP\n" " FETCH tab INTO tid,name;\n" " IF (SQL % NOTFOUND) THEN EXIT; END IF;\n" - " IF SUBSTR(name, 0, LENGTH(:db)) <> :db THEN EXIT; END IF;\n" + " IF TO_BINARY(SUBSTR(name, 0, LENGTH(:db))) <> TO_BINARY(:db)" + " THEN EXIT; END IF;\n" " DELETE FROM SYS_COLUMNS WHERE TABLE_ID=tid;\n" " DELETE FROM SYS_TABLES WHERE ID=tid;\n" " OPEN idx;\n" |