Commit 41984105 authored by unknown's avatar unknown

Fix error message generated when trying to create a table in a

non-existent database. (Bug #10407)


mysql-test/r/create.result:
  Update results
mysql-test/t/create.test:
  Update error numbers
sql/mysql_priv.h:
  Adjust some other function signature so table and db information
  is passed down into create_frm().
sql/sql_table.cc:
  Check for database not existing after hitting an error when
  copying the .frm file for 'CREATE TABLE ... LIKE ...', and
  pass table and db name into rea_create_table().
sql/table.cc:
  Generate specific error message when .frm creation fails because
  the database does not exist.
sql/unireg.cc:
  Pass database and table name down into create_frm().
parent 31ebc6ef
...@@ -37,7 +37,7 @@ Note 1051 Unknown table 't1' ...@@ -37,7 +37,7 @@ Note 1051 Unknown table 't1'
create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) engine=heap; create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) engine=heap;
ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key
create table not_existing_database.test (a int); create table not_existing_database.test (a int);
Got one of the listed errors ERROR 42000: Unknown database 'not_existing_database'
create table `a/a` (a int); create table `a/a` (a int);
ERROR 42000: Incorrect table name 'a/a' ERROR 42000: Incorrect table name 'a/a'
create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int); create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int);
...@@ -342,7 +342,7 @@ create table t3 like t1; ...@@ -342,7 +342,7 @@ create table t3 like t1;
create table t3 like mysqltest.t3; create table t3 like mysqltest.t3;
ERROR 42S01: Table 't3' already exists ERROR 42S01: Table 't3' already exists
create table non_existing_database.t1 like t1; create table non_existing_database.t1 like t1;
Got one of the listed errors ERROR 42000: Unknown database 'non_existing_database'
create table t3 like non_existing_table; create table t3 like non_existing_table;
ERROR 42S02: Unknown table 'non_existing_table' ERROR 42S02: Unknown table 'non_existing_table'
create temporary table t3 like t1; create temporary table t3 like t1;
......
...@@ -39,7 +39,7 @@ drop table if exists t1; ...@@ -39,7 +39,7 @@ drop table if exists t1;
--error 1075 --error 1075
create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) engine=heap; create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) engine=heap;
-- error 1044,1 -- error 1049
create table not_existing_database.test (a int); create table not_existing_database.test (a int);
--error 1103 --error 1103
create table `a/a` (a int); create table `a/a` (a int);
...@@ -294,7 +294,7 @@ select * from t2; ...@@ -294,7 +294,7 @@ select * from t2;
create table t3 like t1; create table t3 like t1;
--error 1050 --error 1050
create table t3 like mysqltest.t3; create table t3 like mysqltest.t3;
--error 1044,1 --error 1049
create table non_existing_database.t1 like t1; create table non_existing_database.t1 like t1;
--error 1051 --error 1051
create table t3 like non_existing_table; create table t3 like non_existing_table;
......
...@@ -1029,10 +1029,13 @@ void unlock_table_names(THD *thd, TABLE_LIST *table_list, ...@@ -1029,10 +1029,13 @@ void unlock_table_names(THD *thd, TABLE_LIST *table_list,
void unireg_init(ulong options); void unireg_init(ulong options);
void unireg_end(void); void unireg_end(void);
bool mysql_create_frm(THD *thd, my_string file_name, bool mysql_create_frm(THD *thd, my_string file_name,
const char *table, const char* db,
HA_CREATE_INFO *create_info, HA_CREATE_INFO *create_info,
List<create_field> &create_field, List<create_field> &create_field,
uint key_count,KEY *key_info,handler *db_type); uint key_count,KEY *key_info,handler *db_type);
int rea_create_table(THD *thd, my_string file_name,HA_CREATE_INFO *create_info, int rea_create_table(THD *thd, my_string file_name,
const char *table, const char* db,
HA_CREATE_INFO *create_info,
List<create_field> &create_field, List<create_field> &create_field,
uint key_count,KEY *key_info); uint key_count,KEY *key_info);
int format_number(uint inputflag,uint max_length,my_string pos,uint length, int format_number(uint inputflag,uint max_length,my_string pos,uint length,
...@@ -1104,7 +1107,8 @@ ulong make_new_entry(File file,uchar *fileinfo,TYPELIB *formnames, ...@@ -1104,7 +1107,8 @@ ulong make_new_entry(File file,uchar *fileinfo,TYPELIB *formnames,
const char *newname); const char *newname);
ulong next_io_size(ulong pos); ulong next_io_size(ulong pos);
void append_unescaped(String *res, const char *pos, uint length); void append_unescaped(String *res, const char *pos, uint length);
int create_frm(char *name,uint reclength,uchar *fileinfo, int create_frm(char *name, const char *table, const char *db,
uint reclength,uchar *fileinfo,
HA_CREATE_INFO *create_info, uint keys); HA_CREATE_INFO *create_info, uint keys);
void update_create_info_from_table(HA_CREATE_INFO *info, TABLE *form); void update_create_info_from_table(HA_CREATE_INFO *info, TABLE *form);
int rename_file_ext(const char * from,const char * to,const char * ext); int rename_file_ext(const char * from,const char * to,const char * ext);
......
...@@ -1418,12 +1418,10 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, ...@@ -1418,12 +1418,10 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
create_info->data_file_name= create_info->index_file_name= 0; create_info->data_file_name= create_info->index_file_name= 0;
create_info->table_options=db_options; create_info->table_options=db_options;
if (rea_create_table(thd, path, create_info, fields, key_count, if (rea_create_table(thd, path, table_name, db,
create_info, fields, key_count,
key_info_buffer)) key_info_buffer))
{
/* my_error(ER_CANT_CREATE_TABLE,MYF(0),table_name,my_errno); */
goto end; goto end;
}
if (create_info->options & HA_LEX_CREATE_TMP_TABLE) if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
{ {
/* Open table and put in temporary table list */ /* Open table and put in temporary table list */
...@@ -2366,8 +2364,14 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table, ...@@ -2366,8 +2364,14 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
/* /*
Create a new table by copying from source table Create a new table by copying from source table
*/ */
if (my_copy(src_path, dst_path, MYF(MY_WME|MY_DONT_OVERWRITE_FILE))) if (my_copy(src_path, dst_path, MYF(MY_DONT_OVERWRITE_FILE)))
{
if (my_errno == ENOENT)
my_error(ER_BAD_DB_ERROR,MYF(0),db);
else
my_error(ER_CANT_CREATE_FILE,MYF(0),dst_path,my_errno);
goto err; goto err;
}
/* /*
As mysql_truncate don't work on a new table at this stage of As mysql_truncate don't work on a new table at this stage of
......
...@@ -1238,7 +1238,8 @@ void append_unescaped(String *res, const char *pos, uint length) ...@@ -1238,7 +1238,8 @@ void append_unescaped(String *res, const char *pos, uint length)
/* Create a .frm file */ /* Create a .frm file */
File create_frm(register my_string name, uint reclength, uchar *fileinfo, File create_frm(register my_string name, const char *table, const char *db,
uint reclength, uchar *fileinfo,
HA_CREATE_INFO *create_info, uint keys) HA_CREATE_INFO *create_info, uint keys)
{ {
register File file; register File file;
...@@ -1263,7 +1264,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo, ...@@ -1263,7 +1264,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo,
*/ */
set_if_smaller(create_info->raid_chunks, 255); set_if_smaller(create_info->raid_chunks, 255);
if ((file= my_create(name, CREATE_MODE, create_flags, MYF(MY_WME))) >= 0) if ((file= my_create(name, CREATE_MODE, create_flags, MYF(0))) >= 0)
{ {
bzero((char*) fileinfo,64); bzero((char*) fileinfo,64);
fileinfo[0]=(uchar) 254; fileinfo[1]= 1; fileinfo[2]= FRM_VER+3; // Header fileinfo[0]=(uchar) 254; fileinfo[1]= 1; fileinfo[2]= FRM_VER+3; // Header
...@@ -1300,6 +1301,13 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo, ...@@ -1300,6 +1301,13 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo,
} }
} }
} }
else
{
if (my_errno == ENOENT)
my_error(ER_BAD_DB_ERROR,MYF(0),db);
else
my_error(ER_CANT_CREATE_TABLE,MYF(0),table,my_errno);
}
return (file); return (file);
} /* create_frm */ } /* create_frm */
......
...@@ -56,6 +56,8 @@ static bool make_empty_rec(int file, enum db_type table_type, ...@@ -56,6 +56,8 @@ static bool make_empty_rec(int file, enum db_type table_type,
mysql_create_frm() mysql_create_frm()
thd Thread handler thd Thread handler
file_name Name of file (including database and .frm) file_name Name of file (including database and .frm)
table Name of table
db Name of database
create_info create info parameters create_info create info parameters
create_fields Fields to create create_fields Fields to create
keys number of keys to create keys number of keys to create
...@@ -68,6 +70,7 @@ static bool make_empty_rec(int file, enum db_type table_type, ...@@ -68,6 +70,7 @@ static bool make_empty_rec(int file, enum db_type table_type,
*/ */
bool mysql_create_frm(THD *thd, my_string file_name, bool mysql_create_frm(THD *thd, my_string file_name,
const char *table, const char *db,
HA_CREATE_INFO *create_info, HA_CREATE_INFO *create_info,
List<create_field> &create_fields, List<create_field> &create_fields,
uint keys, KEY *key_info, uint keys, KEY *key_info,
...@@ -114,7 +117,7 @@ bool mysql_create_frm(THD *thd, my_string file_name, ...@@ -114,7 +117,7 @@ bool mysql_create_frm(THD *thd, my_string file_name,
reclength=uint2korr(forminfo+266); reclength=uint2korr(forminfo+266);
null_fields=uint2korr(forminfo+282); null_fields=uint2korr(forminfo+282);
if ((file=create_frm(file_name, reclength, fileinfo, if ((file=create_frm(file_name, table, db, reclength, fileinfo,
create_info, keys)) < 0) create_info, keys)) < 0)
{ {
my_free((gptr) screen_buff,MYF(0)); my_free((gptr) screen_buff,MYF(0));
...@@ -213,9 +216,11 @@ bool mysql_create_frm(THD *thd, my_string file_name, ...@@ -213,9 +216,11 @@ bool mysql_create_frm(THD *thd, my_string file_name,
Create a frm (table definition) file and the tables Create a frm (table definition) file and the tables
SYNOPSIS SYNOPSIS
mysql_create_frm() rea_create_table()
thd Thread handler thd Thread handler
file_name Name of file (including database and .frm) file_name Name of file (including database and .frm)
table Name of table
db Name of database
create_info create info parameters create_info create info parameters
create_fields Fields to create create_fields Fields to create
keys number of keys to create keys number of keys to create
...@@ -228,13 +233,14 @@ bool mysql_create_frm(THD *thd, my_string file_name, ...@@ -228,13 +233,14 @@ bool mysql_create_frm(THD *thd, my_string file_name,
*/ */
int rea_create_table(THD *thd, my_string file_name, int rea_create_table(THD *thd, my_string file_name,
const char *table, const char *db,
HA_CREATE_INFO *create_info, HA_CREATE_INFO *create_info,
List<create_field> &create_fields, List<create_field> &create_fields,
uint keys, KEY *key_info) uint keys, KEY *key_info)
{ {
DBUG_ENTER("rea_create_table"); DBUG_ENTER("rea_create_table");
if (mysql_create_frm(thd, file_name, create_info, if (mysql_create_frm(thd, file_name, table, db, create_info,
create_fields, keys, key_info, NULL)) create_fields, keys, key_info, NULL))
DBUG_RETURN(1); DBUG_RETURN(1);
if (ha_create_table(file_name,create_info,0)) if (ha_create_table(file_name,create_info,0))
......
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