mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Merge msvensson@bk-internal.mysql.com:/home/bk/mysql-5.0
into devsrv-b.mysql.com:/users/msvensson/mysql-5.0
This commit is contained in:
@@ -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
|
|||||||
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;
|
|||||||
# 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
|
|||||||
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 &&
|
||||||
|
15
sql/item.h
15
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
|
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,
|
|||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
@@ -991,16 +991,14 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||||||
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,
|
||||||
|
new Item_ref_null_helper(&select_lex->context, this,
|
||||||
|
select_lex->ref_pointer_array,
|
||||||
(char *)"<no matter>",
|
(char *)"<no matter>",
|
||||||
(char *)"<result>"));
|
(char *)"<result>"));
|
||||||
#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_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
|
||||||
|
Reference in New Issue
Block a user