Fix for BUG#13897 "failure to do SET SQL_MODE=N where N is a number > 31" (the original bug's title isn't the simplest
symptom). sys_var::check_set() was wrong. mysqlbinlog makes use of such SET SQL_MODE=N (where N is interpreted like if SQL_MODE was a field of type SET), so this bug affected recovery from binlogs if the server was running with certain SQL_MODE values, for example the default values on Windows (STRICT_TRANS_TABLES); to work around this bug people had to edit mysqlbinlog's output.
This commit is contained in:
parent
56bed24c92
commit
37c1744a03
@ -478,4 +478,20 @@ v1 CREATE ALGORITHM=UNDEFINED DEFINER="root"@"localhost" SQL SECURITY DEFINER VI
|
||||
create view v2 as select a from t2 where a in (select a from v1);
|
||||
drop view v2, v1;
|
||||
drop table t1, t2;
|
||||
select @@sql_mode;
|
||||
@@sql_mode
|
||||
ANSI_QUOTES
|
||||
set sql_mode=2097152;
|
||||
select @@sql_mode;
|
||||
@@sql_mode
|
||||
STRICT_TRANS_TABLES
|
||||
set sql_mode=16384+(65536*4);
|
||||
select @@sql_mode;
|
||||
@@sql_mode
|
||||
REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_TABLE_OPTIONS,ANSI
|
||||
set sql_mode=2147483648;
|
||||
ERROR 42000: Variable 'sql_mode' can't be set to the value of '2147483648'
|
||||
select @@sql_mode;
|
||||
@@sql_mode
|
||||
REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_TABLE_OPTIONS,ANSI
|
||||
SET @@SQL_MODE=@OLD_SQL_MODE;
|
||||
|
@ -255,4 +255,13 @@ create view v2 as select a from t2 where a in (select a from v1);
|
||||
drop view v2, v1;
|
||||
drop table t1, t2;
|
||||
|
||||
select @@sql_mode;
|
||||
set sql_mode=2097152;
|
||||
select @@sql_mode;
|
||||
set sql_mode=16384+(65536*4);
|
||||
select @@sql_mode;
|
||||
--error 1231
|
||||
set sql_mode=2147483648; # that mode does not exist
|
||||
select @@sql_mode;
|
||||
|
||||
SET @@SQL_MODE=@OLD_SQL_MODE;
|
||||
|
@ -1659,7 +1659,12 @@ bool sys_var::check_set(THD *thd, set_var *var, TYPELIB *enum_names)
|
||||
else
|
||||
{
|
||||
ulonglong tmp= var->value->val_int();
|
||||
if (tmp >= enum_names->count)
|
||||
/*
|
||||
For when the enum is made to contain 64 elements, as 1ULL<<64 is
|
||||
undefined, we guard with a "count<64" test.
|
||||
*/
|
||||
if (unlikely((tmp >= ((ULL(1)) << enum_names->count)) &&
|
||||
(enum_names->count < 64)))
|
||||
{
|
||||
llstr(tmp, buff);
|
||||
goto err;
|
||||
|
Loading…
x
Reference in New Issue
Block a user