Loading mysql-test/r/create.result +6 −0 Original line number Diff line number Diff line Loading @@ -216,3 +216,9 @@ a b 0 2 3 4 drop table t1; create table `t1 `(a int); Incorrect table name 't1 ' create database `db1 `; Incorrect database name 'db1 ' create table t1(`a ` int); Incorrect column name 'a ' mysql-test/t/create.test +12 −0 Original line number Diff line number Diff line Loading @@ -179,3 +179,15 @@ create table if not exists t1 select 3 as 'a',4 as 'b'; create table if not exists t1 select 3 as 'a',3 as 'b'; select * from t1; drop table t1; # # Test for Bug #2985 # "Table truncated when creating another table name with Spaces" # --error 1103 create table `t1 `(a int); --error 1102 create database `db1 `; --error 1166; create table t1(`a ` int); sql/sql_db.cc +1 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,7 @@ bool mysql_change_db(THD *thd,const char *name) ulong db_access; DBUG_ENTER("mysql_change_db"); if (!dbname || !(db_length=strip_sp(dbname))) if (!dbname || !(db_length= strlength(dbname))) { x_free(dbname); /* purecov: inspected */ send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ Loading sql/sql_parse.cc +4 −8 Original line number Diff line number Diff line Loading @@ -1133,8 +1133,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, statistic_increment(com_stat[SQLCOM_CREATE_DB],&LOCK_status); // null test to handle EOM if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || check_db_name(db)) if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) { net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); break; Loading @@ -1150,8 +1149,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, statistic_increment(com_stat[SQLCOM_DROP_DB],&LOCK_status); char *db=thd->strdup(packet), *alias; // null test to handle EOM if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || check_db_name(db)) if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) { net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); break; Loading Loading @@ -2332,8 +2330,7 @@ mysql_execute_command(void) case SQLCOM_CREATE_DB: { char *alias; if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) { net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; Loading Loading @@ -2362,8 +2359,7 @@ mysql_execute_command(void) case SQLCOM_DROP_DB: { char *alias; if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) { net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; Loading sql/table.cc +24 −4 Original line number Diff line number Diff line Loading @@ -1141,6 +1141,7 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr) bool check_db_name(char *name) { char *start=name; bool last_char_is_space= FALSE; if (lower_case_table_names) casedn_str(name); Loading @@ -1148,6 +1149,7 @@ bool check_db_name(char *name) while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); Loading @@ -1157,19 +1159,22 @@ bool check_db_name(char *name) continue; } } #else last_char_is_space= *name==' '; #endif if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR || *name == FN_EXTCHAR) return 1; name++; } return (uint) (name - start) > NAME_LEN; return last_char_is_space || (uint) (name - start) > NAME_LEN; } /* Allow anything as a table name, as long as it doesn't contain an a '/', or a '.' character or ' ' at the end returns 1 on error */ Loading @@ -1179,10 +1184,17 @@ bool check_table_name(const char *name, uint length) const char *end= name+length; if (!length || length > NAME_LEN) return 1; #if defined(USE_MB) && defined(USE_MB_IDENT) bool last_char_is_space= FALSE; #else if (name[length-1]==' ') return 1; #endif while (name != end) { #if defined(USE_MB) && defined(USE_MB_IDENT) last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, end); Loading @@ -1197,16 +1209,22 @@ bool check_table_name(const char *name, uint length) return 1; name++; } #if defined(USE_MB) && defined(USE_MB_IDENT) return last_char_is_space; #else return 0; #endif } bool check_column_name(const char *name) { const char *start= name; bool last_char_is_space= false; while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); Loading @@ -1216,13 +1234,15 @@ bool check_column_name(const char *name) continue; } } #else last_char_is_space= *name==' '; #endif if (*name == NAMES_SEP_CHAR) return 1; name++; } /* Error if empty or too long column name */ return (name == start || (uint) (name - start) > NAME_LEN); return last_char_is_space || (name == start || (uint) (name - start) > NAME_LEN); } /* Loading Loading
mysql-test/r/create.result +6 −0 Original line number Diff line number Diff line Loading @@ -216,3 +216,9 @@ a b 0 2 3 4 drop table t1; create table `t1 `(a int); Incorrect table name 't1 ' create database `db1 `; Incorrect database name 'db1 ' create table t1(`a ` int); Incorrect column name 'a '
mysql-test/t/create.test +12 −0 Original line number Diff line number Diff line Loading @@ -179,3 +179,15 @@ create table if not exists t1 select 3 as 'a',4 as 'b'; create table if not exists t1 select 3 as 'a',3 as 'b'; select * from t1; drop table t1; # # Test for Bug #2985 # "Table truncated when creating another table name with Spaces" # --error 1103 create table `t1 `(a int); --error 1102 create database `db1 `; --error 1166; create table t1(`a ` int);
sql/sql_db.cc +1 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,7 @@ bool mysql_change_db(THD *thd,const char *name) ulong db_access; DBUG_ENTER("mysql_change_db"); if (!dbname || !(db_length=strip_sp(dbname))) if (!dbname || !(db_length= strlength(dbname))) { x_free(dbname); /* purecov: inspected */ send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ Loading
sql/sql_parse.cc +4 −8 Original line number Diff line number Diff line Loading @@ -1133,8 +1133,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, statistic_increment(com_stat[SQLCOM_CREATE_DB],&LOCK_status); // null test to handle EOM if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || check_db_name(db)) if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) { net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); break; Loading @@ -1150,8 +1149,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, statistic_increment(com_stat[SQLCOM_DROP_DB],&LOCK_status); char *db=thd->strdup(packet), *alias; // null test to handle EOM if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || check_db_name(db)) if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) { net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); break; Loading Loading @@ -2332,8 +2330,7 @@ mysql_execute_command(void) case SQLCOM_CREATE_DB: { char *alias; if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) { net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; Loading Loading @@ -2362,8 +2359,7 @@ mysql_execute_command(void) case SQLCOM_DROP_DB: { char *alias; if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name)) { net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; Loading
sql/table.cc +24 −4 Original line number Diff line number Diff line Loading @@ -1141,6 +1141,7 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr) bool check_db_name(char *name) { char *start=name; bool last_char_is_space= FALSE; if (lower_case_table_names) casedn_str(name); Loading @@ -1148,6 +1149,7 @@ bool check_db_name(char *name) while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); Loading @@ -1157,19 +1159,22 @@ bool check_db_name(char *name) continue; } } #else last_char_is_space= *name==' '; #endif if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR || *name == FN_EXTCHAR) return 1; name++; } return (uint) (name - start) > NAME_LEN; return last_char_is_space || (uint) (name - start) > NAME_LEN; } /* Allow anything as a table name, as long as it doesn't contain an a '/', or a '.' character or ' ' at the end returns 1 on error */ Loading @@ -1179,10 +1184,17 @@ bool check_table_name(const char *name, uint length) const char *end= name+length; if (!length || length > NAME_LEN) return 1; #if defined(USE_MB) && defined(USE_MB_IDENT) bool last_char_is_space= FALSE; #else if (name[length-1]==' ') return 1; #endif while (name != end) { #if defined(USE_MB) && defined(USE_MB_IDENT) last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, end); Loading @@ -1197,16 +1209,22 @@ bool check_table_name(const char *name, uint length) return 1; name++; } #if defined(USE_MB) && defined(USE_MB_IDENT) return last_char_is_space; #else return 0; #endif } bool check_column_name(const char *name) { const char *start= name; bool last_char_is_space= false; while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) last_char_is_space= my_isspace(default_charset_info, *name); if (use_mb(default_charset_info)) { int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); Loading @@ -1216,13 +1234,15 @@ bool check_column_name(const char *name) continue; } } #else last_char_is_space= *name==' '; #endif if (*name == NAMES_SEP_CHAR) return 1; name++; } /* Error if empty or too long column name */ return (name == start || (uint) (name - start) > NAME_LEN); return last_char_is_space || (name == start || (uint) (name - start) > NAME_LEN); } /* Loading