mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	Followup to Bug#42546 Backup: RESTORE fails, thinking it finds an existing table This patch updates lowercase_table2.test with the changed error message CREATE TABLE produces if it fails because it finds an matching TABLE_SHARE in the TDC even if the .FRM/.MYD has been removed from disk. With the changes introduced in Bug#42546, CREATE TABLE uses open_tables() which will find the TDC entry and fail in open_table_from_share() with ER_FILE_NOT_FOUND. Before, CREATE TABLE would not use open_tables() and fail with ER_TABLE_EXISTS_ERROR upon finding the TDC entry in mysql_create_table_no_lock().
		
			
				
	
	
		
			250 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			250 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
DROP TABLE IF EXISTS t1,t2,t3,t2aA,t1Aa;
 | 
						|
DROP DATABASE IF EXISTS `TEST_$1`;
 | 
						|
DROP DATABASE IF EXISTS `test_$1`;
 | 
						|
DROP DATABASE IF EXISTS mysqltest_LC2;
 | 
						|
CREATE TABLE T1 (a int);
 | 
						|
INSERT INTO T1 VALUES (1);
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
SHOW TABLES LIKE "t1";
 | 
						|
Tables_in_test (t1)
 | 
						|
T1
 | 
						|
SHOW CREATE TABLE T1;
 | 
						|
Table	Create Table
 | 
						|
T1	CREATE TABLE `T1` (
 | 
						|
  `a` int(11) DEFAULT NULL
 | 
						|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
 | 
						|
RENAME TABLE T1 TO T2;
 | 
						|
SHOW TABLES LIKE "T2";
 | 
						|
Tables_in_test (T2)
 | 
						|
T2
 | 
						|
SELECT * FROM t2;
 | 
						|
a
 | 
						|
1
 | 
						|
RENAME TABLE T2 TO t3;
 | 
						|
SHOW TABLES LIKE "T3";
 | 
						|
Tables_in_test (T3)
 | 
						|
t3
 | 
						|
RENAME TABLE T3 TO T1;
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
ALTER TABLE T1 add b int;
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
ALTER TABLE T1 RENAME T2;
 | 
						|
SHOW TABLES LIKE "T2";
 | 
						|
Tables_in_test (T2)
 | 
						|
T2
 | 
						|
LOCK TABLE T2 WRITE;
 | 
						|
ALTER TABLE T2 drop b;
 | 
						|
SHOW TABLES LIKE "T2";
 | 
						|
Tables_in_test (T2)
 | 
						|
T2
 | 
						|
UNLOCK TABLES;
 | 
						|
RENAME TABLE T2 TO T1;
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
SELECT * from T1;
 | 
						|
a
 | 
						|
1
 | 
						|
DROP TABLE T1;
 | 
						|
CREATE DATABASE `TEST_$1`;
 | 
						|
SHOW DATABASES LIKE "TEST%";
 | 
						|
Database (TEST%)
 | 
						|
TEST_$1
 | 
						|
DROP DATABASE `test_$1`;
 | 
						|
CREATE TABLE T1 (a int) engine=innodb;
 | 
						|
INSERT INTO T1 VALUES (1);
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
SHOW TABLES LIKE "t1";
 | 
						|
Tables_in_test (t1)
 | 
						|
T1
 | 
						|
SHOW CREATE TABLE T1;
 | 
						|
Table	Create Table
 | 
						|
T1	CREATE TABLE `T1` (
 | 
						|
  `a` int(11) DEFAULT NULL
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
 | 
						|
RENAME TABLE T1 TO T2;
 | 
						|
SHOW TABLES LIKE "T2";
 | 
						|
Tables_in_test (T2)
 | 
						|
T2
 | 
						|
SELECT * FROM t2;
 | 
						|
a
 | 
						|
1
 | 
						|
RENAME TABLE T2 TO t3;
 | 
						|
SHOW TABLES LIKE "T3";
 | 
						|
Tables_in_test (T3)
 | 
						|
t3
 | 
						|
RENAME TABLE T3 TO T1;
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
ALTER TABLE T1 add b int;
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
ALTER TABLE T1 RENAME T2;
 | 
						|
SHOW TABLES LIKE "T2";
 | 
						|
Tables_in_test (T2)
 | 
						|
T2
 | 
						|
LOCK TABLE T2 WRITE;
 | 
						|
ALTER TABLE T2 drop b;
 | 
						|
SHOW TABLES LIKE "T2";
 | 
						|
Tables_in_test (T2)
 | 
						|
T2
 | 
						|
UNLOCK TABLES;
 | 
						|
RENAME TABLE T2 TO T1;
 | 
						|
SHOW TABLES LIKE "T1";
 | 
						|
Tables_in_test (T1)
 | 
						|
T1
 | 
						|
SELECT * from T1;
 | 
						|
a
 | 
						|
1
 | 
						|
DROP TABLE T1;
 | 
						|
create table T1 (EVENT_ID int auto_increment primary key,  LOCATION char(20));
 | 
						|
insert into T1 values (NULL,"Mic-4"),(NULL,"Mic-5"),(NULL,"Mic-6");
 | 
						|
SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL  SELECT LOCATION FROM T1 WHERE EVENT_ID=3;
 | 
						|
LOCATION
 | 
						|
Mic-5
 | 
						|
Mic-6
 | 
						|
SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL  SELECT LOCATION FROM T1 WHERE EVENT_ID=3;
 | 
						|
LOCATION
 | 
						|
Mic-5
 | 
						|
Mic-6
 | 
						|
SELECT LOCATION FROM T1 WHERE EVENT_ID=2 UNION ALL  SELECT LOCATION FROM T1 WHERE EVENT_ID=3;
 | 
						|
LOCATION
 | 
						|
Mic-5
 | 
						|
Mic-6
 | 
						|
drop table T1;
 | 
						|
create table T1 (A int);
 | 
						|
alter table T1 add index (A);
 | 
						|
show tables like 'T1%';
 | 
						|
Tables_in_test (T1%)
 | 
						|
T1
 | 
						|
alter table t1 add index (A);
 | 
						|
show tables like 't1%';
 | 
						|
Tables_in_test (t1%)
 | 
						|
t1
 | 
						|
drop table t1;
 | 
						|
create temporary table T1(a int(11), b varchar(8));
 | 
						|
insert into T1 values (1, 'abc');
 | 
						|
select * from T1;
 | 
						|
a	b
 | 
						|
1	abc
 | 
						|
alter table T1 add index (a);
 | 
						|
select * from T1;
 | 
						|
a	b
 | 
						|
1	abc
 | 
						|
drop table T1;
 | 
						|
create database mysqltest_LC2;
 | 
						|
use mysqltest_LC2;
 | 
						|
create table myUC (i int);
 | 
						|
insert into myUC values (1),(2),(3);
 | 
						|
select * from myUC;
 | 
						|
i
 | 
						|
1
 | 
						|
2
 | 
						|
3
 | 
						|
use test;
 | 
						|
drop database mysqltest_LC2;
 | 
						|
create database mysqltest_LC2;
 | 
						|
use mysqltest_LC2;
 | 
						|
create table myUC (i int);
 | 
						|
select * from myUC;
 | 
						|
i
 | 
						|
use test;
 | 
						|
drop database mysqltest_LC2;
 | 
						|
create table t2aA (col1 int);
 | 
						|
create table t1Aa (col1 int);
 | 
						|
select t1Aa.col1 from t1aA,t2Aa where t1Aa.col1 = t2aA.col1;
 | 
						|
col1
 | 
						|
drop table t2aA, t1Aa;
 | 
						|
create database mysqltest_LC2;
 | 
						|
use mysqltest_LC2;
 | 
						|
create table myUC (i int);
 | 
						|
select TABLE_SCHEMA,TABLE_NAME FROM information_schema.TABLES
 | 
						|
where TABLE_SCHEMA ='mysqltest_LC2';
 | 
						|
TABLE_SCHEMA	TABLE_NAME
 | 
						|
mysqltest_LC2	myUC
 | 
						|
use test;
 | 
						|
drop database mysqltest_LC2;
 | 
						|
# End of 5.1 tests
 | 
						|
#
 | 
						|
# Test for bug #44738 "fill_schema_table_from_frm() opens tables without
 | 
						|
# lowercasing table name". Due to not properly normalizing table names
 | 
						|
# in lower_case_table_names modes in this function queries to I_S which
 | 
						|
# were executed through it left entries with incorrect key in table
 | 
						|
# definition cache. As result further queries to I_S that used this
 | 
						|
# function produced stale results in cases when table definition was
 | 
						|
# changed by a DDL statement. Also combination of this issue and a
 | 
						|
# similar problem in CREATE TABLE (it also has peeked into table
 | 
						|
# definition cache using non-normalized key) led to spurious
 | 
						|
# ER_TABLE_EXISTS_ERROR errors when one tried to create table with the
 | 
						|
# same name as a previously existing but dropped table.
 | 
						|
#
 | 
						|
drop database if exists mysqltest_UPPERCASE;
 | 
						|
drop table if exists t_bug44738_UPPERCASE;
 | 
						|
create database mysqltest_UPPERCASE;
 | 
						|
use mysqltest_UPPERCASE;
 | 
						|
create table t_bug44738_UPPERCASE (i int) comment='Old comment';
 | 
						|
create table t_bug44738_lowercase (i int) comment='Old comment';
 | 
						|
select table_schema, table_name, table_comment from information_schema.tables
 | 
						|
where table_schema like 'mysqltest_%' and table_name like 't_bug44738_%'
 | 
						|
  order by table_name;
 | 
						|
table_schema	table_name	table_comment
 | 
						|
mysqltest_UPPERCASE	t_bug44738_lowercase	Old comment
 | 
						|
mysqltest_UPPERCASE	t_bug44738_UPPERCASE	Old comment
 | 
						|
alter table t_bug44738_UPPERCASE comment='New comment';
 | 
						|
alter table t_bug44738_lowercase comment='New comment';
 | 
						|
# There should be no stale entries in TDC for our tables after the
 | 
						|
# above ALTER TABLE statements so new version of comments should be
 | 
						|
# returned by the below query to I_S.
 | 
						|
select table_schema, table_name, table_comment from information_schema.tables
 | 
						|
where table_schema like 'mysqltest_%' and table_name like 't_bug44738_%'
 | 
						|
  order by table_name;
 | 
						|
table_schema	table_name	table_comment
 | 
						|
mysqltest_UPPERCASE	t_bug44738_lowercase	New comment
 | 
						|
mysqltest_UPPERCASE	t_bug44738_UPPERCASE	New comment
 | 
						|
drop database mysqltest_UPPERCASE;
 | 
						|
use test;
 | 
						|
# Let us check that the original test case which led to discovery
 | 
						|
# of this problem also works.
 | 
						|
create table t_bug44738_UPPERCASE (i int);
 | 
						|
select table_schema, table_name, table_comment from information_schema.tables
 | 
						|
where table_schema = 'test' and table_name like 't_bug44738_%';
 | 
						|
table_schema	table_name	table_comment
 | 
						|
test	t_bug44738_UPPERCASE	
 | 
						|
drop table t_bug44738_UPPERCASE;
 | 
						|
# After the above DROP TABLE there are no entries in TDC which correspond
 | 
						|
# to our table and therefore the below statement should succeed.
 | 
						|
create table t_bug44738_UPPERCASE (i int);
 | 
						|
drop table t_bug44738_UPPERCASE;
 | 
						|
# Finally, let us check that another issue which was exposed by
 | 
						|
# the original test case is solved. I.e. that the table is not 
 | 
						|
# created if there is an entry for it in TDC even though it was 
 | 
						|
# removed from disk.
 | 
						|
create table t_bug44738_UPPERCASE (i int) engine = myisam;
 | 
						|
# Load table definition in TDC.
 | 
						|
select table_schema, table_name, table_comment from information_schema.tables
 | 
						|
where table_schema = 'test' and table_name like 't_bug44738_%';
 | 
						|
table_schema	table_name	table_comment
 | 
						|
test	t_bug44738_UPPERCASE	
 | 
						|
# Simulate manual removal of the table.
 | 
						|
# Check that still there is an entry for table in TDC.
 | 
						|
show open tables like 't_bug44738_%';
 | 
						|
Database	Table	In_use	Name_locked
 | 
						|
test	t_bug44738_uppercase	0	0
 | 
						|
# So attempt to create table with the same name should fail.
 | 
						|
create table t_bug44738_UPPERCASE (i int);
 | 
						|
ERROR HY000: Can't find file: 't_bug44738_uppercase' (errno: 2)
 | 
						|
# And should succeed after FLUSH TABLES.
 | 
						|
flush tables;
 | 
						|
create table t_bug44738_UPPERCASE (i int);
 | 
						|
drop table t_bug44738_UPPERCASE;
 |