Commit ef7ec424 authored by unknown's avatar unknown

Merge lsmy3.wdf.sap.corp:/data/users/gkodinov/mysql-4.1-B18492

into  lsmy3.wdf.sap.corp:/data/users/gkodinov/mysql-5.0-B18492


mysql-test/r/subselect.result:
  merged
sql/item.cc:
  merged
sql/item.h:
  merged
sql/item_subselect.cc:
  merged
parents 1a257975 3a0d0b4c
...@@ -116,3 +116,17 @@ execute st_1676 using @arg0, @arg1, @arg2; ...@@ -116,3 +116,17 @@ execute st_1676 using @arg0, @arg1, @arg2;
cola colb cold cola colb cold
aaaa yyyy R aaaa yyyy R
drop table t1, t2; 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 <union2,3> 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;
...@@ -744,7 +744,7 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -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 3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
Warnings: Warnings:
Note 1003 select `test`.`t2`.`id` AS `id` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`id`,<exists>(select 1 AS `Not_used` having (<cache>(`test`.`t2`.`id`) = <null_helper>(1)) union select 1 AS `Not_used` having (<cache>(`test`.`t2`.`id`) = <null_helper>(3)))) Note 1003 select `test`.`t2`.`id` AS `id` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`id`,<exists>(select 1 AS `1` having (<cache>(`test`.`t2`.`id`) = <ref_null_helper>(1)) union select 3 AS `3` having (<cache>(`test`.`t2`.`id`) = <ref_null_helper>(3))))
SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 3); SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 3);
id id
SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 2); SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 2);
......
...@@ -130,3 +130,17 @@ drop table t1, t2; ...@@ -130,3 +130,17 @@ drop table t1, t2;
# end of bug#1676 # end of bug#1676
# End of 4.1 tests # 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;
...@@ -5151,14 +5151,6 @@ bool Item_direct_view_ref::eq(const Item *item, bool binary_cmp) const ...@@ -5151,14 +5151,6 @@ bool Item_direct_view_ref::eq(const Item *item, bool binary_cmp) const
return FALSE; return FALSE;
} }
void Item_null_helper::print(String *str)
{
str->append(STRING_WITH_LEN("<null_helper>("));
store->print(str);
str->append(')');
}
bool Item_default_value::eq(const Item *item, bool binary_cmp) const bool Item_default_value::eq(const Item *item, bool binary_cmp) const
{ {
return item->type() == DEFAULT_VALUE_ITEM && return item->type() == DEFAULT_VALUE_ITEM &&
......
...@@ -1849,21 +1849,6 @@ class Item_ref_null_helper: public Item_ref ...@@ -1849,21 +1849,6 @@ class Item_ref_null_helper: public Item_ref
} }
}; };
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 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 We need to save the original item ('ref') to be able to call
......
...@@ -928,14 +928,14 @@ Item_in_subselect::single_value_transformer(JOIN *join, ...@@ -928,14 +928,14 @@ Item_in_subselect::single_value_transformer(JOIN *join,
{ {
Item *item= (Item*) select_lex->item_list.head(); 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) if (select_lex->table_list.elements)
{ {
bool tmp; bool tmp;
Item *having= item, *orig_item= item; 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); item= func->create(expr, item);
if (!abort_on_null && orig_item->maybe_null) if (!abort_on_null && orig_item->maybe_null)
{ {
...@@ -990,17 +990,15 @@ Item_in_subselect::single_value_transformer(JOIN *join, ...@@ -990,17 +990,15 @@ Item_in_subselect::single_value_transformer(JOIN *join,
comparison functions can't be changed during fix_fields() comparison functions can't be changed during fix_fields()
we can assign select_lex->having here, and pass 0 as last we can assign select_lex->having here, and pass 0 as last
argument (reference) to fix_fields() argument (reference) to fix_fields()
*/ */
item= func->create(expr, select_lex->having=
new Item_null_helper(&select_lex->context, join->having=
this, item, func->create(expr,
(char *)"<no matter>", new Item_ref_null_helper(&select_lex->context, this,
(char *)"<result>")); select_lex->ref_pointer_array,
#ifdef CORRECT_BUT_TOO_SLOW_TO_BE_USABLE (char *)"<no matter>",
if (!abort_on_null && left_expr->maybe_null) (char *)"<result>"));
item= new Item_cond_or(new Item_func_isnull(left_expr), item);
#endif
select_lex->having= join->having= item;
select_lex->having_fix_field= 1; select_lex->having_fix_field= 1;
/* /*
we do not check join->having->fixed, because comparison function we do not check join->having->fixed, because comparison function
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment