Browse Source

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.
10.6-MDEV-28968-galera
Marko Mäkelä 4 years ago
parent
commit
1f3f457193
  1. 16
      mysql-test/suite/innodb/r/dropdb_cs.result
  2. 17
      mysql-test/suite/innodb/t/dropdb_cs.test
  3. 3
      storage/innobase/handler/ha_innodb.cc

16
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;

17
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;

3
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"

Loading…
Cancel
Save