summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <ingo@mysql.com>2004-09-14 13:49:08 +0200
committerunknown <ingo@mysql.com>2004-09-14 13:49:08 +0200
commitb4e557fdd6e3918e417b16000bfa22d5b943cf25 (patch)
tree86a33cde82dfc9f51099cdf06db8f3121e81da25
parent3ffc483275d6b8e733ddd98d534263f6f533cc9d (diff)
downloadmariadb-git-b4e557fdd6e3918e417b16000bfa22d5b943cf25.tar.gz
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).
-rw-r--r--mysql-test/r/sql_mode.result23
-rw-r--r--mysql-test/t/sql_mode.test21
-rw-r--r--sql/sql_lex.cc6
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