Loading mysql-test/r/select.result +57 −0 Original line number Diff line number Diff line Loading @@ -2965,6 +2965,63 @@ NULL SELECT IFNULL(NULL, NULL); IFNULL(NULL, NULL) NULL SET @OLD_SQL_MODE12595=@@SQL_MODE, @@SQL_MODE=''; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; Variable_name Value sql_mode CREATE TABLE BUG_12595(a varchar(100)); INSERT INTO BUG_12595 VALUES ('hakan%'), ('hakank'), ("ha%an"); SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; a hakan% SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; a hakan% SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; a hakan% hakank SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE ''; a SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha%%an' ESCAPE '%'; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE '\\'; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; a ha%an SET @@SQL_MODE='NO_BACKSLASH_ESCAPES'; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; Variable_name Value sql_mode NO_BACKSLASH_ESCAPES SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; a SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; a hakan% SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '\\'; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\n%' ESCAPE '\n'; ERROR HY000: Incorrect arguments to ESCAPE SET @@SQL_MODE=@OLD_SQL_MODE12595; DROP TABLE BUG_12595; create table t1 (a char(1)); create table t2 (a char(1)); insert into t1 values ('a'),('b'),('c'); Loading mysql-test/t/select.test +39 −0 Original line number Diff line number Diff line Loading @@ -2517,6 +2517,45 @@ SELECT CAST(IFNULL(NULL, NULL) AS DECIMAL); SELECT ABS(IFNULL(NULL, NULL)); SELECT IFNULL(NULL, NULL); # # BUG #12595 (ESCAPE must be exactly one) # SET @OLD_SQL_MODE12595=@@SQL_MODE, @@SQL_MODE=''; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; CREATE TABLE BUG_12595(a varchar(100)); INSERT INTO BUG_12595 VALUES ('hakan%'), ('hakank'), ("ha%an"); SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; # this should work when sql_mode is not NO_BACKSLASH_ESCAPES SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE ''; SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; SELECT * FROM BUG_12595 WHERE a LIKE 'ha%%an' ESCAPE '%'; SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE '\\'; SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; SET @@SQL_MODE='NO_BACKSLASH_ESCAPES'; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '\\'; #this gives an error when NO_BACKSLASH_ESCAPES is set -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\n%' ESCAPE '\n'; SET @@SQL_MODE=@OLD_SQL_MODE12595; DROP TABLE BUG_12595; # # Bug #6495 Illogical requirement for column qualification in NATURAL join # Loading sql/item_cmpfunc.cc +9 −0 Original line number Diff line number Diff line Loading @@ -2958,6 +2958,15 @@ bool Item_func_like::fix_fields(THD *thd, Item **ref) String *escape_str= escape_item->val_str(&tmp_value1); if (escape_str) { if (escape_used_in_parsing && ( (((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) && escape_str->numchars() != 1) || escape_str->numchars() > 1))) { my_error(ER_WRONG_ARGUMENTS,MYF(0),"ESCAPE"); return TRUE; } if (use_mb(cmp.cmp_collation.collation)) { CHARSET_INFO *cs= escape_str->charset(); Loading sql/item_cmpfunc.h +5 −2 Original line number Diff line number Diff line Loading @@ -986,12 +986,15 @@ class Item_func_like :public Item_bool_func2 Item *escape_item; bool escape_used_in_parsing; public: int escape; Item_func_like(Item *a,Item *b, Item *escape_arg) Item_func_like(Item *a,Item *b, Item *escape_arg, bool escape_used) :Item_bool_func2(a,b), canDoTurboBM(FALSE), pattern(0), pattern_len(0), bmGs(0), bmBc(0), escape_item(escape_arg) {} bmGs(0), bmBc(0), escape_item(escape_arg), escape_used_in_parsing(escape_used) {} longlong val_int(); enum Functype functype() const { return LIKE_FUNC; } optimize_type select_optimize() const; Loading sql/sql_help.cc +2 −1 Original line number Diff line number Diff line Loading @@ -599,7 +599,8 @@ SQL_SELECT *prepare_select_for_name(THD *thd, const char *mask, uint mlen, { Item *cond= new Item_func_like(new Item_field(pfname), new Item_string(mask,mlen,pfname->charset()), new Item_string("\\",1,&my_charset_latin1)); new Item_string("\\",1,&my_charset_latin1), FALSE); if (thd->is_fatal_error) return 0; // OOM return prepare_simple_select(thd, cond, table, error); Loading Loading
mysql-test/r/select.result +57 −0 Original line number Diff line number Diff line Loading @@ -2965,6 +2965,63 @@ NULL SELECT IFNULL(NULL, NULL); IFNULL(NULL, NULL) NULL SET @OLD_SQL_MODE12595=@@SQL_MODE, @@SQL_MODE=''; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; Variable_name Value sql_mode CREATE TABLE BUG_12595(a varchar(100)); INSERT INTO BUG_12595 VALUES ('hakan%'), ('hakank'), ("ha%an"); SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; a hakan% SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; a hakan% SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; a hakan% hakank SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE ''; a SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha%%an' ESCAPE '%'; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE '\\'; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; a ha%an SET @@SQL_MODE='NO_BACKSLASH_ESCAPES'; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; Variable_name Value sql_mode NO_BACKSLASH_ESCAPES SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; a SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; a hakan% SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '\\'; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; ERROR HY000: Incorrect arguments to ESCAPE SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; a ha%an SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\n%' ESCAPE '\n'; ERROR HY000: Incorrect arguments to ESCAPE SET @@SQL_MODE=@OLD_SQL_MODE12595; DROP TABLE BUG_12595; create table t1 (a char(1)); create table t2 (a char(1)); insert into t1 values ('a'),('b'),('c'); Loading
mysql-test/t/select.test +39 −0 Original line number Diff line number Diff line Loading @@ -2517,6 +2517,45 @@ SELECT CAST(IFNULL(NULL, NULL) AS DECIMAL); SELECT ABS(IFNULL(NULL, NULL)); SELECT IFNULL(NULL, NULL); # # BUG #12595 (ESCAPE must be exactly one) # SET @OLD_SQL_MODE12595=@@SQL_MODE, @@SQL_MODE=''; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; CREATE TABLE BUG_12595(a varchar(100)); INSERT INTO BUG_12595 VALUES ('hakan%'), ('hakank'), ("ha%an"); SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; # this should work when sql_mode is not NO_BACKSLASH_ESCAPES SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE ''; SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; SELECT * FROM BUG_12595 WHERE a LIKE 'ha%%an' ESCAPE '%'; SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE '\\'; SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; SET @@SQL_MODE='NO_BACKSLASH_ESCAPES'; SHOW LOCAL VARIABLES LIKE 'SQL_MODE'; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%'; SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '\\'; #this gives an error when NO_BACKSLASH_ESCAPES is set -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE ''; SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c; SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|'; -- error 1210 SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\n%' ESCAPE '\n'; SET @@SQL_MODE=@OLD_SQL_MODE12595; DROP TABLE BUG_12595; # # Bug #6495 Illogical requirement for column qualification in NATURAL join # Loading
sql/item_cmpfunc.cc +9 −0 Original line number Diff line number Diff line Loading @@ -2958,6 +2958,15 @@ bool Item_func_like::fix_fields(THD *thd, Item **ref) String *escape_str= escape_item->val_str(&tmp_value1); if (escape_str) { if (escape_used_in_parsing && ( (((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) && escape_str->numchars() != 1) || escape_str->numchars() > 1))) { my_error(ER_WRONG_ARGUMENTS,MYF(0),"ESCAPE"); return TRUE; } if (use_mb(cmp.cmp_collation.collation)) { CHARSET_INFO *cs= escape_str->charset(); Loading
sql/item_cmpfunc.h +5 −2 Original line number Diff line number Diff line Loading @@ -986,12 +986,15 @@ class Item_func_like :public Item_bool_func2 Item *escape_item; bool escape_used_in_parsing; public: int escape; Item_func_like(Item *a,Item *b, Item *escape_arg) Item_func_like(Item *a,Item *b, Item *escape_arg, bool escape_used) :Item_bool_func2(a,b), canDoTurboBM(FALSE), pattern(0), pattern_len(0), bmGs(0), bmBc(0), escape_item(escape_arg) {} bmGs(0), bmBc(0), escape_item(escape_arg), escape_used_in_parsing(escape_used) {} longlong val_int(); enum Functype functype() const { return LIKE_FUNC; } optimize_type select_optimize() const; Loading
sql/sql_help.cc +2 −1 Original line number Diff line number Diff line Loading @@ -599,7 +599,8 @@ SQL_SELECT *prepare_select_for_name(THD *thd, const char *mask, uint mlen, { Item *cond= new Item_func_like(new Item_field(pfname), new Item_string(mask,mlen,pfname->charset()), new Item_string("\\",1,&my_charset_latin1)); new Item_string("\\",1,&my_charset_latin1), FALSE); if (thd->is_fatal_error) return 0; // OOM return prepare_simple_select(thd, cond, table, error); Loading