diff --git a/include/config-win.h b/include/config-win.h index fb7aeb82e83..a7bce21b3a1 100644 --- a/include/config-win.h +++ b/include/config-win.h @@ -429,8 +429,8 @@ inline double ulonglong2double(ulonglong value) #define HAVE_RTREE_KEYS 1 #define HAVE_ROW_BASED_REPLICATION 1 -/* #undef HAVE_OPENSSL */ -/* #undef HAVE_YASSL */ +#define HAVE_OPENSSL 1 +#define HAVE_YASSL 1 /* Define charsets you want */ /* #undef HAVE_CHARSET_armscii8 */ diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 7def4cdcf9d..34f5e529260 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -3156,3 +3156,10 @@ id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 9 Using where 2 DEPENDENT SUBQUERY t1 index NULL a 8 NULL 9 Using filesort DROP TABLE t1; +create table t1( f1 int,f2 int); +insert into t1 values (1,1),(2,2); +select tt.t from (select 'crash1' as t, f2 from t1) as tt left join t1 on tt.t = 'crash2' and tt.f2 = t1.f2 where tt.t = 'crash1'; +t +crash1 +crash1 +drop table t1; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 733403f482e..368020dd721 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -2067,3 +2067,10 @@ SELECT * FROM t1 WHERE (a,b) = ANY (SELECT a, max(b) FROM t1 GROUP BY a); DROP TABLE t1; +# +# Bug#17366: Unchecked Item_int results in server crash +# +create table t1( f1 int,f2 int); +insert into t1 values (1,1),(2,2); +select tt.t from (select 'crash1' as t, f2 from t1) as tt left join t1 on tt.t = 'crash2' and tt.f2 = t1.f2 where tt.t = 'crash1'; +drop table t1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7695001cd67..59c7436d85c 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7114,7 +7114,10 @@ static Item *eliminate_item_equal(COND *cond, COND_EQUAL *upper_levels, if (!cond) cond= new Item_cond_and(eq_list); else + { + DBUG_ASSERT(cond->type() == Item::COND_ITEM); ((Item_cond *) cond)->add_at_head(&eq_list); + } cond->quick_fix_field(); cond->update_used_tables(); @@ -7199,6 +7202,11 @@ static COND* substitute_for_best_equal_field(COND *cond, while ((item_equal= it++)) { cond= eliminate_item_equal(cond, cond_equal->upper_levels, item_equal); + // This occurs when eliminate_item_equal() founds that cond is + // always false and substitues it with Item_int 0. + // Due to this, value of item_equal will be 0, so just return it. + if (cond->type() != Item::COND_ITEM) + break; } } }