Commit b4e557fd authored by unknown's avatar unknown

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").


mysql-test/r/sql_mode.result:
  BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT.
  Added the test results.
mysql-test/t/sql_mode.test:
  BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT.
  Added new tests for the bug.
sql/sql_lex.cc:
  BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT.
  Added code to recover from skipped spaces in mode IGNORE_SPACES,
  when testing for an ident separator (which happens to be a dot).
parent 3ffc4832
...@@ -85,3 +85,26 @@ t1 CREATE TABLE "t1" ( ...@@ -85,3 +85,26 @@ t1 CREATE TABLE "t1" (
UNIQUE KEY "email" ("email") UNIQUE KEY "email" ("email")
) )
drop table t1; 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"; ...@@ -28,3 +28,24 @@ set sql_mode="postgresql,oracle,mssql,db2,maxdb";
select @@sql_mode; select @@sql_mode;
show create table t1; show create table t1;
drop 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) ...@@ -454,6 +454,7 @@ inline static uint int_token(const char *str,uint length)
int yylex(void *arg, void *yythd) int yylex(void *arg, void *yythd)
{ {
reg1 uchar c; reg1 uchar c;
bool space_ignored;
int tokval, result_state; int tokval, result_state;
uint length; uint length;
enum my_lex_states state; enum my_lex_states state;
...@@ -572,11 +573,12 @@ int yylex(void *arg, void *yythd) ...@@ -572,11 +573,12 @@ int yylex(void *arg, void *yythd)
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT; result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
} }
length= (uint) (lex->ptr - lex->tok_start)-1; length= (uint) (lex->ptr - lex->tok_start)-1;
space_ignored= FALSE;
if (lex->ignore_space) 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; lex->next_state=MY_LEX_IDENT_SEP;
else else
{ // '(' must follow directly if function { // '(' must follow directly if function
......
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