Commit 02023859 authored by bar@mysql.com's avatar bar@mysql.com

Bug#17142 Crash if create with encoded name

upgrade.result, upgrade.test:
  Adding test case.
table.cc:
  Don't try to open a table with old-formatted name,
  if the table name contains "@" character.
  This is to avoid mixing two different names to each other.
  Thanks Monty for suggesting this fix.
parent 7d7da887
...@@ -41,3 +41,19 @@ t1 ...@@ -41,3 +41,19 @@ t1
t-1 t-1
drop database `mysqltest1`; drop database `mysqltest1`;
drop database `mysqltest-1`; drop database `mysqltest-1`;
drop table if exists `txu@0023P@0023p1`;
drop table if exists `txu#P#p1`;
create table `txu#P#p1` (s1 int);
insert into `txu#P#p1` values (1);
select * from `txu@0023P@0023p1`;
ERROR 42S02: Table 'test.txu@0023P@0023p1' doesn't exist
create table `txu@0023P@0023p1` (s1 int);
insert into `txu@0023P@0023p1` values (2);
select * from `txu@0023P@0023p1`;
s1
2
select * from `txu#P#p1`;
s1
1
drop table `txu@0023P@0023p1`;
drop table `txu#P#p1`;
...@@ -29,3 +29,21 @@ show tables in `mysqltest1`; ...@@ -29,3 +29,21 @@ show tables in `mysqltest1`;
show tables in `mysqltest-1`; show tables in `mysqltest-1`;
drop database `mysqltest1`; drop database `mysqltest1`;
drop database `mysqltest-1`; drop database `mysqltest-1`;
#
# Bug#17142: Crash if create with encoded name
#
--disable_warnings
drop table if exists `txu@0023P@0023p1`;
drop table if exists `txu#P#p1`;
--enable_warnings
create table `txu#P#p1` (s1 int);
insert into `txu#P#p1` values (1);
--error 1146
select * from `txu@0023P@0023p1`;
create table `txu@0023P@0023p1` (s1 int);
insert into `txu@0023P@0023p1` values (2);
select * from `txu@0023P@0023p1`;
select * from `txu#P#p1`;
drop table `txu@0023P@0023p1`;
drop table `txu#P#p1`;
...@@ -298,6 +298,9 @@ int open_table_def(THD *thd, TABLE_SHARE *share, uint db_flags) ...@@ -298,6 +298,9 @@ int open_table_def(THD *thd, TABLE_SHARE *share, uint db_flags)
strxmov(path, share->normalized_path.str, reg_ext, NullS); strxmov(path, share->normalized_path.str, reg_ext, NullS);
if ((file= my_open(path, O_RDONLY | O_SHARE, MYF(0))) < 0) if ((file= my_open(path, O_RDONLY | O_SHARE, MYF(0))) < 0)
{ {
if (strchr(share->table_name.str, '@'))
goto err_not_open;
/* Try unecoded 5.0 name */ /* Try unecoded 5.0 name */
uint length; uint length;
strxnmov(path, sizeof(path)-1, strxnmov(path, sizeof(path)-1,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment