summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-06-13 17:05:31 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2022-06-13 17:05:31 +0300
commit1f3f4571934140fd81f54aa366cc4656544c89f9 (patch)
tree589c086cd11d3bbffc1779e69a486f02cd0a689e
parent65dd31088a62b87d38899453720e667e4f1bf982 (diff)
downloadmariadb-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.result16
-rw-r--r--mysql-test/suite/innodb/t/dropdb_cs.test17
-rw-r--r--storage/innobase/handler/ha_innodb.cc3
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"