mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 21:12:26 +01:00
BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT.
Added a check to recover from IGNORE_SPACE in this situation: <ident-character(s)><space><dot><ident-character(s)> The ignored space led to the false identification of the dot as an ident separator (like "db.table").
This commit is contained in:
parent
ad12db7678
commit
ce8db2bfb7
3 changed files with 48 additions and 2 deletions
|
@ -85,3 +85,26 @@ t1 CREATE TABLE "t1" (
|
|||
UNIQUE KEY "email" ("email")
|
||||
)
|
||||
drop table t1;
|
||||
set session sql_mode = '';
|
||||
create table t1 ( min_num dec(6,6) default .000001);
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`min_num` decimal(7,6) default '0.000001'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1 ;
|
||||
set session sql_mode = 'IGNORE_SPACE';
|
||||
create table t1 ( min_num dec(6,6) default 0.000001);
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`min_num` decimal(7,6) default '0.000001'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1 ;
|
||||
create table t1 ( min_num dec(6,6) default .000001);
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`min_num` decimal(7,6) default '0.000001'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1 ;
|
||||
|
|
|
@ -28,3 +28,24 @@ set sql_mode="postgresql,oracle,mssql,db2,maxdb";
|
|||
select @@sql_mode;
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT
|
||||
#
|
||||
# Force the usage of the default
|
||||
set session sql_mode = '';
|
||||
# statement for comparison, value starts with '.'
|
||||
create table t1 ( min_num dec(6,6) default .000001);
|
||||
show create table t1;
|
||||
drop table t1 ;
|
||||
#
|
||||
set session sql_mode = 'IGNORE_SPACE';
|
||||
# statement for comparison, value starts with '0'
|
||||
create table t1 ( min_num dec(6,6) default 0.000001);
|
||||
show create table t1;
|
||||
drop table t1 ;
|
||||
# This statement fails, value starts with '.'
|
||||
create table t1 ( min_num dec(6,6) default .000001);
|
||||
show create table t1;
|
||||
drop table t1 ;
|
||||
|
||||
|
|
|
@ -454,6 +454,7 @@ inline static uint int_token(const char *str,uint length)
|
|||
int yylex(void *arg, void *yythd)
|
||||
{
|
||||
reg1 uchar c;
|
||||
bool space_ignored;
|
||||
int tokval, result_state;
|
||||
uint length;
|
||||
enum my_lex_states state;
|
||||
|
@ -572,11 +573,12 @@ int yylex(void *arg, void *yythd)
|
|||
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
|
||||
}
|
||||
length= (uint) (lex->ptr - lex->tok_start)-1;
|
||||
space_ignored= FALSE;
|
||||
if (lex->ignore_space)
|
||||
{
|
||||
for (; state_map[c] == MY_LEX_SKIP ; c= yyGet());
|
||||
for (; state_map[c] == MY_LEX_SKIP ; space_ignored= TRUE, c= yyGet());
|
||||
}
|
||||
if (c == '.' && ident_map[yyPeek()])
|
||||
if (! space_ignored && c == '.' && ident_map[yyPeek()])
|
||||
lex->next_state=MY_LEX_IDENT_SEP;
|
||||
else
|
||||
{ // '(' must follow directly if function
|
||||
|
|
Loading…
Reference in a new issue