Commit 997f11f2 authored by unknown's avatar unknown

fixed Bug #2985

 "Table truncated when creating another table name with Spaces"
added to check_db_name, check_table_name and check_column_name
test for end space


mysql-test/r/create.result:
  added test for Bug #2985 
   "Table truncated when creating another table name with Spaces"
mysql-test/t/create.test:
  added test for Bug #2985 
   "Table truncated when creating another table name with Spaces"
sql/sql_db.cc:
  cancel strip end spaces for database name
sql/sql_parse.cc:
  cancel strip end spaces for database name
sql/table.cc:
  added to check_db_name, check_table_name and check_column_name 
  test for end space
parent 190a65bf
...@@ -216,3 +216,9 @@ a b ...@@ -216,3 +216,9 @@ a b
0 2 0 2
3 4 3 4
drop table t1; 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 '
...@@ -179,3 +179,15 @@ create table if not exists t1 select 3 as 'a',4 as 'b'; ...@@ -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'; create table if not exists t1 select 3 as 'a',3 as 'b';
select * from t1; select * from t1;
drop table 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);
...@@ -376,7 +376,7 @@ bool mysql_change_db(THD *thd,const char *name) ...@@ -376,7 +376,7 @@ bool mysql_change_db(THD *thd,const char *name)
ulong db_access; ulong db_access;
DBUG_ENTER("mysql_change_db"); DBUG_ENTER("mysql_change_db");
if (!dbname || !(db_length=strip_sp(dbname))) if (!dbname || !(db_length= strlength(dbname)))
{ {
x_free(dbname); /* purecov: inspected */ x_free(dbname); /* purecov: inspected */
send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */
......
...@@ -1123,8 +1123,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1123,8 +1123,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
statistic_increment(com_stat[SQLCOM_CREATE_DB],&LOCK_status); statistic_increment(com_stat[SQLCOM_CREATE_DB],&LOCK_status);
// null test to handle EOM // null test to handle EOM
if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || if (!db || !(alias= thd->strdup(db)) || check_db_name(db))
check_db_name(db))
{ {
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
break; break;
...@@ -1140,8 +1139,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1140,8 +1139,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
statistic_increment(com_stat[SQLCOM_DROP_DB],&LOCK_status); statistic_increment(com_stat[SQLCOM_DROP_DB],&LOCK_status);
char *db=thd->strdup(packet), *alias; char *db=thd->strdup(packet), *alias;
// null test to handle EOM // null test to handle EOM
if (!db || !strip_sp(db) || !(alias= thd->strdup(db)) || if (!db || !(alias= thd->strdup(db)) || check_db_name(db))
check_db_name(db))
{ {
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
break; break;
...@@ -2320,8 +2318,7 @@ mysql_execute_command(void) ...@@ -2320,8 +2318,7 @@ mysql_execute_command(void)
case SQLCOM_CREATE_DB: case SQLCOM_CREATE_DB:
{ {
char *alias; char *alias;
if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name))
check_db_name(lex->name))
{ {
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
break; break;
...@@ -2350,8 +2347,7 @@ mysql_execute_command(void) ...@@ -2350,8 +2347,7 @@ mysql_execute_command(void)
case SQLCOM_DROP_DB: case SQLCOM_DROP_DB:
{ {
char *alias; char *alias;
if (!strip_sp(lex->name) || !(alias=thd->strdup(lex->name)) || if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name))
check_db_name(lex->name))
{ {
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
break; break;
......
...@@ -1140,6 +1140,7 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr) ...@@ -1140,6 +1140,7 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr)
bool check_db_name(char *name) bool check_db_name(char *name)
{ {
char *start=name; char *start=name;
bool space= false;
if (lower_case_table_names) if (lower_case_table_names)
casedn_str(name); casedn_str(name);
...@@ -1147,6 +1148,7 @@ bool check_db_name(char *name) ...@@ -1147,6 +1148,7 @@ bool check_db_name(char *name)
while (*name) while (*name)
{ {
#if defined(USE_MB) && defined(USE_MB_IDENT) #if defined(USE_MB) && defined(USE_MB_IDENT)
space= my_isspace(default_charset_info, *name);
if (use_mb(default_charset_info)) if (use_mb(default_charset_info))
{ {
int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN);
...@@ -1156,19 +1158,24 @@ bool check_db_name(char *name) ...@@ -1156,19 +1158,24 @@ bool check_db_name(char *name)
continue; continue;
} }
} }
#else
space= *name==' ';
#endif #endif
if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR || if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR ||
*name == FN_EXTCHAR) *name == FN_EXTCHAR)
return 1; return 1;
name++; name++;
} }
return (uint) (name - start) > NAME_LEN; if (space)
return 1;
return name[-1]==' ' || (uint) (name - start) > NAME_LEN;
} }
/* /*
Allow anything as a table name, as long as it doesn't contain an Allow anything as a table name, as long as it doesn't contain an
a '/', or a '.' character a '/', or a '.' character
or ' ' at the end
returns 1 on error returns 1 on error
*/ */
...@@ -1178,10 +1185,17 @@ bool check_table_name(const char *name, uint length) ...@@ -1178,10 +1185,17 @@ bool check_table_name(const char *name, uint length)
const char *end= name+length; const char *end= name+length;
if (!length || length > NAME_LEN) if (!length || length > NAME_LEN)
return 1; return 1;
#if defined(USE_MB) && defined(USE_MB_IDENT)
bool space= false;
#else
if (name[length-1]==' ')
return 1;
#endif
while (name != end) while (name != end)
{ {
#if defined(USE_MB) && defined(USE_MB_IDENT) #if defined(USE_MB) && defined(USE_MB_IDENT)
space= my_isspace(default_charset_info, *name);
if (use_mb(default_charset_info)) if (use_mb(default_charset_info))
{ {
int len=my_ismbchar(default_charset_info, name, end); int len=my_ismbchar(default_charset_info, name, end);
...@@ -1196,16 +1210,22 @@ bool check_table_name(const char *name, uint length) ...@@ -1196,16 +1210,22 @@ bool check_table_name(const char *name, uint length)
return 1; return 1;
name++; name++;
} }
#if defined(USE_MB) && defined(USE_MB_IDENT)
if (space)
return 1;
#endif
return 0; return 0;
} }
bool check_column_name(const char *name) bool check_column_name(const char *name)
{ {
const char *start= name; const char *start= name;
bool space= false;
while (*name) while (*name)
{ {
#if defined(USE_MB) && defined(USE_MB_IDENT) #if defined(USE_MB) && defined(USE_MB_IDENT)
space= my_isspace(default_charset_info, *name);
if (use_mb(default_charset_info)) if (use_mb(default_charset_info))
{ {
int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN);
...@@ -1215,11 +1235,15 @@ bool check_column_name(const char *name) ...@@ -1215,11 +1235,15 @@ bool check_column_name(const char *name)
continue; continue;
} }
} }
#else
space= *name==' ';
#endif #endif
if (*name == NAMES_SEP_CHAR) if (*name == NAMES_SEP_CHAR)
return 1; return 1;
name++; name++;
} }
if (space)
return 1;
/* Error if empty or too long column name */ /* Error if empty or too long column name */
return (name == start || (uint) (name - start) > NAME_LEN); return (name == start || (uint) (name - start) > NAME_LEN);
} }
......
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