Commit 854d7c4d authored by unknown's avatar unknown

Bug#8706

  "temporary table with data directory option fails"
  myisam should not use user-specified table name when creating
  temporary tables and use generated connection specific real name.
  Test included.


myisam/mi_create.c:
  Bug#8706
    When creating a temporary table with directory override, ensure that
    the real filename is using the hidden temporary name otherwise
    multiple clients cannot have same named temporary tables without
    conflict.
mysql-test/r/myisam.result:
  Bug#8706
    Test for bug
mysql-test/t/myisam.test:
  Bug#8706
    Test for bug
parent 8fdac9c7
...@@ -519,9 +519,20 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, ...@@ -519,9 +519,20 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
if (ci->index_file_name) if (ci->index_file_name)
{ {
fn_format(filename, ci->index_file_name,"",MI_NAME_IEXT,4); if (options & HA_OPTION_TMP_TABLE)
fn_format(linkname,name, "",MI_NAME_IEXT,4); {
linkname_ptr=linkname; char *path;
/* chop off the table name, tempory tables use generated name */
if ((path= strrchr(ci->index_file_name, FN_LIBCHAR)))
*path= '\0';
fn_format(filename, name, ci->index_file_name, MI_NAME_IEXT,
MY_REPLACE_DIR | MY_UNPACK_FILENAME);
}
else
fn_format(filename, ci->index_file_name, "",
MI_NAME_IEXT, MY_UNPACK_FILENAME);
fn_format(linkname, name, "", MI_NAME_IEXT, MY_UNPACK_FILENAME);
linkname_ptr= linkname;
/* /*
Don't create the table if the link or file exists to ensure that one Don't create the table if the link or file exists to ensure that one
doesn't accidently destroy another table. doesn't accidently destroy another table.
...@@ -575,10 +586,21 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, ...@@ -575,10 +586,21 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
{ {
if (ci->data_file_name) if (ci->data_file_name)
{ {
fn_format(filename, ci->data_file_name,"",MI_NAME_DEXT,4); if (options & HA_OPTION_TMP_TABLE)
fn_format(linkname, name, "",MI_NAME_DEXT,4); {
linkname_ptr=linkname; char *path;
create_flag=0; /* chop off the table name, tempory tables use generated name */
if ((path= strrchr(ci->data_file_name, FN_LIBCHAR)))
*path= '\0';
fn_format(filename, name, ci->data_file_name, MI_NAME_DEXT,
MY_REPLACE_DIR | MY_UNPACK_FILENAME);
}
else
fn_format(filename, ci->data_file_name, "",
MI_NAME_DEXT, MY_UNPACK_FILENAME);
fn_format(linkname, name, "", MI_NAME_DEXT, MY_UNPACK_FILENAME);
linkname_ptr= linkname;
create_flag= 0;
} }
else else
{ {
......
...@@ -769,3 +769,24 @@ a b ...@@ -769,3 +769,24 @@ a b
xxxxxxxxx bbbbbb xxxxxxxxx bbbbbb
xxxxxxxxx bbbbbb xxxxxxxxx bbbbbb
DROP TABLE t1; DROP TABLE t1;
show create table t1;
Table Create Table
t1 CREATE TEMPORARY TABLE `t1` (
`a` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
show create table t1;
Table Create Table
t1 CREATE TEMPORARY TABLE `t1` (
`a` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
create table t1 (a int) engine=myisam select 42 a;
select * from t1;
a
9
select * from t1;
a
99
select * from t1;
a
42
drop table t1;
...@@ -726,4 +726,35 @@ UPDATE t1 AS ta1,t1 AS ta2 SET ta1.b='aaaaaa',ta2.b='bbbbbb'; ...@@ -726,4 +726,35 @@ UPDATE t1 AS ta1,t1 AS ta2 SET ta1.b='aaaaaa',ta2.b='bbbbbb';
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug#8706 - temporary table with data directory option fails
#
connect (session1,localhost,root,,);
connect (session2,localhost,root,,);
connection session1;
disable_query_log;
eval create temporary table t1 (a int) engine=myisam data directory="$MYSQL_TEST_DIR/var/tmp" select 9 a;
enable_query_log;
show create table t1;
connection session2;
disable_query_log;
eval create temporary table t1 (a int) engine=myisam data directory="$MYSQL_TEST_DIR/var/tmp" select 99 a;
enable_query_log;
show create table t1;
connection default;
create table t1 (a int) engine=myisam select 42 a;
connection session1;
select * from t1;
disconnect session1;
connection session2;
select * from t1;
disconnect session2;
connection default;
select * from t1;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
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