mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
Merge gkodinov@bk-internal.mysql.com:/home/bk/mysql-5.0-opt
into rakia.(none):/home/kgeorge/mysql/autopush/B21019-5.0-opt sql/sql_select.cc: Auto merged
This commit is contained in:
commit
667c73be65
6 changed files with 46 additions and 10 deletions
|
@ -132,3 +132,15 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
5 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 34 func 1 Using index; Using where
|
5 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 34 func 1 Using index; Using where
|
||||||
6 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 34 func 1 Using index; Using where
|
6 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 34 func 1 Using index; Using where
|
||||||
drop table t1, t2, t3, t4;
|
drop table t1, t2, t3, t4;
|
||||||
|
CREATE TABLE t1 (a int(10) , PRIMARY KEY (a)) Engine=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
CREATE TABLE t2 (a int(10), PRIMARY KEY (a)) Engine=InnoDB;
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
CREATE TABLE t3 (a int(10), b int(10), c int(10),
|
||||||
|
PRIMARY KEY (a)) Engine=InnoDB;
|
||||||
|
INSERT INTO t3 VALUES (1,2,1);
|
||||||
|
SELECT t1.* FROM t1 WHERE (SELECT COUNT(*) FROM t3,t2 WHERE t3.c=t2.a
|
||||||
|
and t2.a='1' AND t1.a=t3.b) > 0;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
|
|
@ -150,3 +150,21 @@ EXPLAIN SELECT t2.*, t4.DOCTYPENAME, t1.CONTENTSIZE,t1.MIMETYPE FROM t2 INNER JO
|
||||||
|
|
||||||
drop table t1, t2, t3, t4;
|
drop table t1, t2, t3, t4;
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #20792: Incorrect results from aggregate subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a int(10) , PRIMARY KEY (a)) Engine=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (a int(10), PRIMARY KEY (a)) Engine=InnoDB;
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
|
||||||
|
CREATE TABLE t3 (a int(10), b int(10), c int(10),
|
||||||
|
PRIMARY KEY (a)) Engine=InnoDB;
|
||||||
|
INSERT INTO t3 VALUES (1,2,1);
|
||||||
|
|
||||||
|
SELECT t1.* FROM t1 WHERE (SELECT COUNT(*) FROM t3,t2 WHERE t3.c=t2.a
|
||||||
|
and t2.a='1' AND t1.a=t3.b) > 0;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
|
|
@ -752,7 +752,7 @@ public:
|
||||||
virtual bool find_item_in_field_list_processor(byte *arg) { return 0; }
|
virtual bool find_item_in_field_list_processor(byte *arg) { return 0; }
|
||||||
virtual bool change_context_processor(byte *context) { return 0; }
|
virtual bool change_context_processor(byte *context) { return 0; }
|
||||||
virtual bool reset_query_id_processor(byte *query_id) { return 0; }
|
virtual bool reset_query_id_processor(byte *query_id) { return 0; }
|
||||||
virtual bool func_type_checker_processor(byte *arg) { return 0; }
|
virtual bool is_expensive_processor(byte *arg) { return 0; }
|
||||||
|
|
||||||
virtual Item *equal_fields_propagator(byte * arg) { return this; }
|
virtual Item *equal_fields_propagator(byte * arg) { return this; }
|
||||||
virtual Item *set_no_const_sub(byte *arg) { return this; }
|
virtual Item *set_no_const_sub(byte *arg) { return this; }
|
||||||
|
|
|
@ -399,9 +399,9 @@ Field *Item_func::tmp_table_field(TABLE *t_arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Item_func::func_type_checker_processor(byte *arg)
|
bool Item_func::is_expensive_processor(byte *arg)
|
||||||
{
|
{
|
||||||
return *((Functype*)arg) == functype();
|
return is_expensive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,8 @@ public:
|
||||||
Item *transform(Item_transformer transformer, byte *arg);
|
Item *transform(Item_transformer transformer, byte *arg);
|
||||||
void traverse_cond(Cond_traverser traverser,
|
void traverse_cond(Cond_traverser traverser,
|
||||||
void * arg, traverse_order order);
|
void * arg, traverse_order order);
|
||||||
bool func_type_checker_processor(byte *arg);
|
bool is_expensive_processor(byte *arg);
|
||||||
|
virtual bool is_expensive() { return 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -947,6 +948,7 @@ public:
|
||||||
void cleanup();
|
void cleanup();
|
||||||
Item_result result_type () const { return udf.result_type(); }
|
Item_result result_type () const { return udf.result_type(); }
|
||||||
table_map not_null_tables() const { return 0; }
|
table_map not_null_tables() const { return 0; }
|
||||||
|
bool is_expensive() { return 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1475,6 +1477,7 @@ public:
|
||||||
virtual enum Functype functype() const { return FUNC_SP; }
|
virtual enum Functype functype() const { return FUNC_SP; }
|
||||||
|
|
||||||
bool fix_fields(THD *thd, Item **ref);
|
bool fix_fields(THD *thd, Item **ref);
|
||||||
|
bool is_expensive() { return 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1073,10 +1073,7 @@ JOIN::optimize()
|
||||||
for (ORDER *tmp_order= order; tmp_order ; tmp_order=tmp_order->next)
|
for (ORDER *tmp_order= order; tmp_order ; tmp_order=tmp_order->next)
|
||||||
{
|
{
|
||||||
Item *item= *tmp_order->item;
|
Item *item= *tmp_order->item;
|
||||||
Item_func::Functype type=Item_func::FUNC_SP;
|
if (item->walk(&Item::is_expensive_processor,(byte*)0))
|
||||||
Item_func::Functype type1=Item_func::UDF_FUNC;
|
|
||||||
if (item->walk(&Item::func_type_checker_processor,(byte*)&type) ||
|
|
||||||
item->walk(&Item::func_type_checker_processor,(byte*)&type1))
|
|
||||||
{
|
{
|
||||||
/* Force tmp table without sort */
|
/* Force tmp table without sort */
|
||||||
need_tmp=1; simple_order=simple_group=0;
|
need_tmp=1; simple_order=simple_group=0;
|
||||||
|
@ -6197,10 +6194,16 @@ return_zero_rows(JOIN *join, select_result *result,TABLE_LIST *tables,
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
used only in JOIN::clear
|
||||||
|
*/
|
||||||
static void clear_tables(JOIN *join)
|
static void clear_tables(JOIN *join)
|
||||||
{
|
{
|
||||||
for (uint i=0 ; i < join->tables ; i++)
|
/*
|
||||||
|
must clear only the non-const tables, as const tables
|
||||||
|
are not re-calculated.
|
||||||
|
*/
|
||||||
|
for (uint i=join->const_tables ; i < join->tables ; i++)
|
||||||
mark_as_null_row(join->table[i]); // All fields are NULL
|
mark_as_null_row(join->table[i]); // All fields are NULL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue