From ce8db2bfb79acb058fd94261138cf66aeeb9b50d Mon Sep 17 00:00:00 2001 From: "ingo@mysql.com" <> Date: Tue, 14 Sep 2004 13:49:08 +0200 Subject: [PATCH] BUG#5318 - failure: 'IGNORE_SPACE' affects numeric values after DEFAULT. Added a check to recover from IGNORE_SPACE in this situation: The ignored space led to the false identification of the dot as an ident separator (like "db.table"). --- mysql-test/r/sql_mode.result | 23 +++++++++++++++++++++++ mysql-test/t/sql_mode.test | 21 +++++++++++++++++++++ sql/sql_lex.cc | 6 ++++-- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/sql_mode.result b/mysql-test/r/sql_mode.result index 77fe5d06bb0..e54dd217f8c 100644 --- a/mysql-test/r/sql_mode.result +++ b/mysql-test/r/sql_mode.result @@ -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 ; diff --git a/mysql-test/t/sql_mode.test b/mysql-test/t/sql_mode.test index 95e83b4b9e2..63a5d6d3671 100644 --- a/mysql-test/t/sql_mode.test +++ b/mysql-test/t/sql_mode.test @@ -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 ; + diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index fab047002ad..2fa169ce999 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -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