diff --git a/mysql-test/r/ps_11bugs.result b/mysql-test/r/ps_11bugs.result index c0d7fe502af..c849c25d646 100644 --- a/mysql-test/r/ps_11bugs.result +++ b/mysql-test/r/ps_11bugs.result @@ -116,3 +116,17 @@ execute st_1676 using @arg0, @arg1, @arg2; cola colb cold aaaa yyyy R drop table t1, t2; +create table t1 (a int primary key); +insert into t1 values (1); +explain select * from t1 where 3 in (select (1+1) union select 1); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +select * from t1 where 3 in (select (1+1) union select 1); +a +prepare st_18492 from 'select * from t1 where 3 in (select (1+1) union select 1)'; +execute st_18492; +a +drop table t1; diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index bd0fa5ae661..f2a892c725f 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -744,7 +744,7 @@ id select_type table type possible_keys key key_len ref rows Extra 3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used NULL UNION RESULT ALL NULL NULL NULL NULL NULL Warnings: -Note 1003 select `test`.`t2`.`id` AS `id` from `test`.`t2` where (`test`.`t2`.`id`,(select 1 AS `Not_used` having ((`test`.`t2`.`id`) = (1)) union select 1 AS `Not_used` having ((`test`.`t2`.`id`) = (3)))) +Note 1003 select `test`.`t2`.`id` AS `id` from `test`.`t2` where (`test`.`t2`.`id`,(select 1 AS `1` having ((`test`.`t2`.`id`) = (1)) union select 3 AS `3` having ((`test`.`t2`.`id`) = (3)))) SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 3); id SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 2); diff --git a/mysql-test/t/ps_11bugs.test b/mysql-test/t/ps_11bugs.test index e214afeaaf3..ff1c87f3bd8 100644 --- a/mysql-test/t/ps_11bugs.test +++ b/mysql-test/t/ps_11bugs.test @@ -130,3 +130,17 @@ drop table t1, t2; # end of bug#1676 # End of 4.1 tests + +# bug#18492: mysqld reports ER_ILLEGAL_REFERENCE in --ps-protocol + +create table t1 (a int primary key); +insert into t1 values (1); + +explain select * from t1 where 3 in (select (1+1) union select 1); + +select * from t1 where 3 in (select (1+1) union select 1); + +prepare st_18492 from 'select * from t1 where 3 in (select (1+1) union select 1)'; +execute st_18492; + +drop table t1; diff --git a/sql/item.cc b/sql/item.cc index 0afac76f3db..31fbef0f053 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -5151,14 +5151,6 @@ bool Item_direct_view_ref::eq(const Item *item, bool binary_cmp) const return FALSE; } -void Item_null_helper::print(String *str) -{ - str->append(STRING_WITH_LEN("(")); - store->print(str); - str->append(')'); -} - - bool Item_default_value::eq(const Item *item, bool binary_cmp) const { return item->type() == DEFAULT_VALUE_ITEM && diff --git a/sql/item.h b/sql/item.h index 8b09bc14221..24aca4a86d1 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1849,21 +1849,6 @@ public: } }; -class Item_null_helper :public Item_ref_null_helper -{ - Item *store; -public: - Item_null_helper(Name_resolution_context *context_arg, - Item_in_subselect* master, Item *item, - const char *table_name_arg, const char *field_name_arg) - :Item_ref_null_helper(context_arg, master, (store= 0, &store), - table_name_arg, field_name_arg), - store(item) - { ref= &store; } - void print(String *str); -}; - - /* The following class is used to optimize comparing of date and bigint columns We need to save the original item ('ref') to be able to call diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 88620634354..d93f6501ebb 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -928,14 +928,14 @@ Item_in_subselect::single_value_transformer(JOIN *join, { Item *item= (Item*) select_lex->item_list.head(); - select_lex->item_list.empty(); - select_lex->item_list.push_back(new Item_int("Not_used", - (longlong) 1, 21)); - select_lex->ref_pointer_array[0]= select_lex->item_list.head(); if (select_lex->table_list.elements) { bool tmp; Item *having= item, *orig_item= item; + select_lex->item_list.empty(); + select_lex->item_list.push_back(new Item_int("Not_used", + (longlong) 1, 21)); + select_lex->ref_pointer_array[0]= select_lex->item_list.head(); item= func->create(expr, item); if (!abort_on_null && orig_item->maybe_null) { @@ -990,17 +990,15 @@ Item_in_subselect::single_value_transformer(JOIN *join, comparison functions can't be changed during fix_fields() we can assign select_lex->having here, and pass 0 as last argument (reference) to fix_fields() - */ - item= func->create(expr, - new Item_null_helper(&select_lex->context, - this, item, - (char *)"", - (char *)"")); -#ifdef CORRECT_BUT_TOO_SLOW_TO_BE_USABLE - if (!abort_on_null && left_expr->maybe_null) - item= new Item_cond_or(new Item_func_isnull(left_expr), item); -#endif - select_lex->having= join->having= item; + */ + select_lex->having= + join->having= + func->create(expr, + new Item_ref_null_helper(&select_lex->context, this, + select_lex->ref_pointer_array, + (char *)"", + (char *)"")); + select_lex->having_fix_field= 1; /* we do not check join->having->fixed, because comparison function