mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
Merge vvagin@bk-internal.mysql.com:/home/bk/mysql-4.0
into eagle.mysql.r18.ru:/home/vva/work/BUG_2985/mysql-4.0
This commit is contained in:
commit
158770e356
5 changed files with 47 additions and 13 deletions
|
@ -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 '
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
|
28
sql/table.cc
28
sql/table.cc
|
@ -1140,7 +1140,8 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr)
|
|||
|
||||
bool check_db_name(char *name)
|
||||
{
|
||||
char *start=name;
|
||||
char *start=name;
|
||||
bool last_char_is_space= FALSE;
|
||||
|
||||
if (lower_case_table_names)
|
||||
casedn_str(name);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
*/
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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…
Reference in a new issue