Commit a5fa2d30 authored by unknown's avatar unknown

Bug #17210 Create temp table call to ha_ndbcluster::create_handler_files caused core

  - do not try to create ndb temp tables even if default storage is ndb


mysql-test/r/ndb_temporary.result:
  New BitKeeper file ``mysql-test/r/ndb_temporary.result''
mysql-test/t/ndb_temporary.test:
  New BitKeeper file ``mysql-test/t/ndb_temporary.test''
parent a660fd11
DROP TABLE IF EXISTS t1;
create temporary table t1 (a int key) engine=ndb;
ERROR HY000: Table storage engine 'ndbcluster' does not support the create option 'TEMPORARY'
create temporary table t1 (a int key) engine=myisam;
alter table t1 engine=ndb;
ERROR HY000: Table storage engine 'ndbcluster' does not support the create option 'TEMPORARY'
drop table t1;
SET SESSION storage_engine=NDBCLUSTER;
create table t1 (a int key);
select engine from information_schema.tables where table_name = 't1';
engine
NDBCLUSTER
drop table t1;
create temporary table t1 (a int key);
show create table t1;
Table Create Table
t1 CREATE TEMPORARY TABLE `t1` (
`a` int(11) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
-- source include/have_ndb.inc
-- source include/not_embedded.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
#
# creating a temporary table with engine=ndb should give an error
#
--error ER_ILLEGAL_HA_CREATE_OPTION
create temporary table t1 (a int key) engine=ndb;
#
# alter temporary table to engine=ndb should give an error
#
create temporary table t1 (a int key) engine=myisam;
--error ER_ILLEGAL_HA_CREATE_OPTION
alter table t1 engine=ndb;
drop table t1;
#
# if default storage engine=ndb, temporary tables
# without explicit engine= should be created as myisam
#
SET SESSION storage_engine=NDBCLUSTER;
create table t1 (a int key);
# verify that we have a ndb table
select engine from information_schema.tables where table_name = 't1';
drop table t1;
# verify that we have a myisam table
create temporary table t1 (a int key);
show create table t1;
drop table t1;
...@@ -5848,7 +5848,7 @@ static bool ndbcluster_init() ...@@ -5848,7 +5848,7 @@ static bool ndbcluster_init()
#ifdef HAVE_NDB_BINLOG #ifdef HAVE_NDB_BINLOG
ndbcluster_binlog_init_handlerton(); ndbcluster_binlog_init_handlerton();
#endif #endif
h.flags= HTON_NO_FLAGS; h.flags= HTON_TEMPORARY_NOT_SUPPORTED;
} }
// Set connectstring if specified // Set connectstring if specified
......
...@@ -604,6 +604,7 @@ struct show_table_alias_st { ...@@ -604,6 +604,7 @@ struct show_table_alias_st {
#define HTON_HIDDEN (1 << 3) //Engine does not appear in lists #define HTON_HIDDEN (1 << 3) //Engine does not appear in lists
#define HTON_FLUSH_AFTER_RENAME (1 << 4) #define HTON_FLUSH_AFTER_RENAME (1 << 4)
#define HTON_NOT_USER_SELECTABLE (1 << 5) #define HTON_NOT_USER_SELECTABLE (1 << 5)
#define HTON_TEMPORARY_NOT_SUPPORTED (1 << 6) //Having temporary tables not supported
typedef struct st_thd_trans typedef struct st_thd_trans
{ {
......
...@@ -5806,3 +5806,5 @@ ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE ...@@ -5806,3 +5806,5 @@ ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE
eng "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use scripts/mysql_fix_privilege_tables" eng "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use scripts/mysql_fix_privilege_tables"
ER_TABLE_NEEDS_UPGRADE ER_TABLE_NEEDS_UPGRADE
eng "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\" to fix it!" eng "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\" to fix it!"
ER_ILLEGAL_HA_CREATE_OPTION
eng "Table storage engine '%-.64s' does not support the create option '%.64s'"
...@@ -42,7 +42,7 @@ static int copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -42,7 +42,7 @@ static int copy_data_between_tables(TABLE *from,TABLE *to,
ha_rows *copied,ha_rows *deleted); ha_rows *copied,ha_rows *deleted);
static bool prepare_blob_field(THD *thd, create_field *sql_field); static bool prepare_blob_field(THD *thd, create_field *sql_field);
static bool check_engine(THD *thd, const char *table_name, static bool check_engine(THD *thd, const char *table_name,
handlerton **new_engine); HA_CREATE_INFO *create_info);
static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
List<create_field> *fields, List<create_field> *fields,
List<Key> *keys, bool tmp_table, List<Key> *keys, bool tmp_table,
...@@ -2021,7 +2021,7 @@ bool mysql_create_table_internal(THD *thd, ...@@ -2021,7 +2021,7 @@ bool mysql_create_table_internal(THD *thd,
MYF(0)); MYF(0));
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (check_engine(thd, table_name, &create_info->db_type)) if (check_engine(thd, table_name, create_info))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
db_options= create_info->table_options; db_options= create_info->table_options;
if (create_info->row_type == ROW_TYPE_DYNAMIC) if (create_info->row_type == ROW_TYPE_DYNAMIC)
...@@ -2148,22 +2148,6 @@ bool mysql_create_table_internal(THD *thd, ...@@ -2148,22 +2148,6 @@ bool mysql_create_table_internal(THD *thd,
} }
#endif #endif
#ifdef NOT_USED
/*
if there is a technical reason for a handler not to have support
for temp. tables this code can be re-enabled.
Otherwise, if a handler author has a wish to prohibit usage of
temporary tables for his handler he should implement a check in
::create() method
*/
if ((create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
(file->table_flags() & HA_NO_TEMP_TABLES))
{
my_error(ER_ILLEGAL_HA, MYF(0), table_name);
goto err;
}
#endif
set_table_default_charset(thd, create_info, (char*) db); set_table_default_charset(thd, create_info, (char*) db);
if (mysql_prepare_table(thd, create_info, &fields, if (mysql_prepare_table(thd, create_info, &fields,
...@@ -4010,7 +3994,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -4010,7 +3994,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
#endif #endif
if (check_engine(thd, new_name, &create_info->db_type)) if (check_engine(thd, new_name, create_info))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
new_db_type= create_info->db_type; new_db_type= create_info->db_type;
if (create_info->row_type == ROW_TYPE_NOT_USED) if (create_info->row_type == ROW_TYPE_NOT_USED)
...@@ -5435,8 +5419,9 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables, HA_CHECK_OPT *check_opt) ...@@ -5435,8 +5419,9 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables, HA_CHECK_OPT *check_opt)
} }
static bool check_engine(THD *thd, const char *table_name, static bool check_engine(THD *thd, const char *table_name,
handlerton **new_engine) HA_CREATE_INFO *create_info)
{ {
handlerton **new_engine= &create_info->db_type;
handlerton *req_engine= *new_engine; handlerton *req_engine= *new_engine;
bool no_substitution= bool no_substitution=
test(thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION); test(thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION);
...@@ -5452,5 +5437,16 @@ static bool check_engine(THD *thd, const char *table_name, ...@@ -5452,5 +5437,16 @@ static bool check_engine(THD *thd, const char *table_name,
ha_resolve_storage_engine_name(*new_engine), ha_resolve_storage_engine_name(*new_engine),
table_name); table_name);
} }
if (create_info->options & HA_LEX_CREATE_TMP_TABLE &&
ha_check_storage_engine_flag(*new_engine, HTON_TEMPORARY_NOT_SUPPORTED))
{
if (create_info->used_fields & HA_CREATE_USED_ENGINE)
{
my_error(ER_ILLEGAL_HA_CREATE_OPTION, MYF(0), (*new_engine)->name, "TEMPORARY");
*new_engine= 0;
return TRUE;
}
*new_engine= &myisam_hton;
}
return FALSE; return FALSE;
} }
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