Commit 854d7c4d authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+29 −7
Original line number Diff line number Diff line
@@ -519,8 +519,19 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,

  if (ci->index_file_name)
  {
    fn_format(filename, ci->index_file_name,"",MI_NAME_IEXT,4);
    fn_format(linkname,name, "",MI_NAME_IEXT,4);
    if (options & HA_OPTION_TMP_TABLE)
    {
      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
@@ -575,8 +586,19 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
    {
      if (ci->data_file_name)
      {
	fn_format(filename, ci->data_file_name,"",MI_NAME_DEXT,4);
	fn_format(linkname, name, "",MI_NAME_DEXT,4);
        if (options & HA_OPTION_TMP_TABLE)
        {
          char *path;
          /* 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;
      }
+21 −0
Original line number Diff line number Diff line
@@ -769,3 +769,24 @@ a b
xxxxxxxxx	bbbbbb
xxxxxxxxx	bbbbbb
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;
+31 −0
Original line number Diff line number Diff line
@@ -726,4 +726,35 @@ UPDATE t1 AS ta1,t1 AS ta2 SET ta1.b='aaaaaa',ta2.b='bbbbbb';
SELECT * FROM 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