diff options
-rw-r--r-- | mysql-test/r/sql_mode.result | 16 | ||||
-rw-r--r-- | mysql-test/t/sql_mode.test | 9 | ||||
-rw-r--r-- | sql/set_var.cc | 7 |
3 files changed, 31 insertions, 1 deletions
diff --git a/mysql-test/r/sql_mode.result b/mysql-test/r/sql_mode.result index 7d9d7fb333c..66df424919b 100644 --- a/mysql-test/r/sql_mode.result +++ b/mysql-test/r/sql_mode.result @@ -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; diff --git a/mysql-test/t/sql_mode.test b/mysql-test/t/sql_mode.test index 8ae9ced6c68..b67f1a73db6 100644 --- a/mysql-test/t/sql_mode.test +++ b/mysql-test/t/sql_mode.test @@ -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; diff --git a/sql/set_var.cc b/sql/set_var.cc index 02216fb2113..7be79ab59f0 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -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; |