2002-05-12 22:46:42 +02:00
|
|
|
/* Copyright (C) 2000 MySQL AB
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2006-12-23 20:17:15 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2002-05-12 22:46:42 +02:00
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
|
|
|
|
/* subselect Item */
|
|
|
|
|
2005-05-04 15:05:56 +02:00
|
|
|
#ifdef USE_PRAGMA_INTERFACE
|
2002-05-12 22:46:42 +02:00
|
|
|
#pragma interface /* gcc class implementation */
|
|
|
|
#endif
|
|
|
|
|
2002-09-03 08:50:36 +02:00
|
|
|
class st_select_lex;
|
|
|
|
class st_select_lex_unit;
|
2002-05-12 22:46:42 +02:00
|
|
|
class JOIN;
|
|
|
|
class select_subselect;
|
2002-09-03 08:50:36 +02:00
|
|
|
class subselect_engine;
|
2002-11-07 22:45:19 +01:00
|
|
|
class Item_bool_func2;
|
|
|
|
|
2002-06-19 16:52:44 +02:00
|
|
|
/* base class for subselects */
|
2002-05-12 22:46:42 +02:00
|
|
|
|
2002-11-13 00:14:39 +01:00
|
|
|
class Item_subselect :public Item_result_field
|
2002-05-12 22:46:42 +02:00
|
|
|
{
|
2002-09-03 08:50:36 +02:00
|
|
|
my_bool value_assigned; /* value already assigned to subselect */
|
2002-05-12 22:46:42 +02:00
|
|
|
protected:
|
2003-05-28 15:52:56 +02:00
|
|
|
/* thread handler, will be assigned in fix_fields only */
|
|
|
|
THD *thd;
|
2002-11-28 18:29:26 +01:00
|
|
|
/* substitution instead of subselect in case of optimization */
|
|
|
|
Item *substitution;
|
2004-02-08 19:14:13 +01:00
|
|
|
/* unit of subquery */
|
|
|
|
st_select_lex_unit *unit;
|
2002-09-03 08:50:36 +02:00
|
|
|
/* engine that perform execution of subselect (single select or union) */
|
2003-10-16 23:36:01 +02:00
|
|
|
subselect_engine *engine;
|
2004-02-08 19:14:13 +01:00
|
|
|
/* old engine if engine was changed */
|
|
|
|
subselect_engine *old_engine;
|
2003-10-16 23:36:01 +02:00
|
|
|
/* cache of used external tables */
|
2004-07-04 07:46:28 +02:00
|
|
|
table_map used_tables_cache;
|
2002-09-03 08:50:36 +02:00
|
|
|
/* allowed number of columns (1 for single value subqueries) */
|
2002-06-19 16:52:44 +02:00
|
|
|
uint max_columns;
|
2004-08-13 09:01:30 +02:00
|
|
|
/* where subquery is placed */
|
|
|
|
enum_parsing_place parsing_place;
|
2002-12-06 20:55:53 +01:00
|
|
|
/* work with 'substitution' */
|
|
|
|
bool have_to_be_excluded;
|
2004-02-08 19:14:13 +01:00
|
|
|
/* cache of constant state */
|
2003-10-16 23:36:01 +02:00
|
|
|
bool const_item_cache;
|
2002-05-12 22:46:42 +02:00
|
|
|
|
|
|
|
public:
|
2003-07-07 17:40:19 +02:00
|
|
|
/* changed engine indicator */
|
|
|
|
bool engine_changed;
|
2004-02-08 19:14:13 +01:00
|
|
|
/* subquery is transformed */
|
|
|
|
bool changed;
|
2003-07-07 17:40:19 +02:00
|
|
|
|
2006-10-31 18:51:09 +01:00
|
|
|
/* TRUE <=> The underlying SELECT is correlated w.r.t some ancestor select */
|
|
|
|
bool is_correlated;
|
|
|
|
|
2003-08-28 12:21:30 +02:00
|
|
|
enum trans_res {RES_OK, RES_REDUCE, RES_ERROR};
|
2003-07-07 17:40:19 +02:00
|
|
|
enum subs_type {UNKNOWN_SUBS, SINGLEROW_SUBS,
|
2003-07-24 14:26:21 +02:00
|
|
|
EXISTS_SUBS, IN_SUBS, ALL_SUBS, ANY_SUBS};
|
2003-05-14 20:51:33 +02:00
|
|
|
|
2002-10-08 22:49:59 +02:00
|
|
|
Item_subselect();
|
|
|
|
|
2003-07-07 17:40:19 +02:00
|
|
|
virtual subs_type substype() { return UNKNOWN_SUBS; }
|
|
|
|
|
2004-07-04 07:46:28 +02:00
|
|
|
/*
|
2002-10-08 22:49:59 +02:00
|
|
|
We need this method, because some compilers do not allow 'this'
|
|
|
|
pointer in constructor initialization list, but we need pass pointer
|
|
|
|
to subselect Item class to select_subselect classes constructor.
|
|
|
|
*/
|
2004-07-04 07:46:28 +02:00
|
|
|
virtual void init (st_select_lex *select_lex,
|
2002-11-07 22:45:19 +01:00
|
|
|
select_subselect *result);
|
2002-10-08 22:49:59 +02:00
|
|
|
|
2002-09-03 08:50:36 +02:00
|
|
|
~Item_subselect();
|
2003-12-30 11:08:19 +01:00
|
|
|
void cleanup();
|
2004-07-04 07:46:28 +02:00
|
|
|
virtual void reset()
|
2002-09-03 08:50:36 +02:00
|
|
|
{
|
|
|
|
null_value= 1;
|
|
|
|
}
|
2003-07-02 00:45:22 +02:00
|
|
|
virtual trans_res select_transformer(JOIN *join);
|
2002-09-03 08:50:36 +02:00
|
|
|
bool assigned() { return value_assigned; }
|
|
|
|
void assigned(bool a) { value_assigned= a; }
|
2002-05-12 22:46:42 +02:00
|
|
|
enum Type type() const;
|
2002-12-15 10:14:53 +01:00
|
|
|
bool is_null()
|
|
|
|
{
|
2006-11-28 14:44:11 +01:00
|
|
|
update_null_value();
|
2002-12-15 10:14:53 +01:00
|
|
|
return null_value;
|
|
|
|
}
|
2005-07-01 06:05:42 +02:00
|
|
|
bool fix_fields(THD *thd, Item **ref);
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
virtual bool exec();
|
2002-09-28 17:34:56 +02:00
|
|
|
virtual void fix_length_and_dec();
|
2002-06-19 16:52:44 +02:00
|
|
|
table_map used_tables() const;
|
2005-04-16 07:08:34 +02:00
|
|
|
table_map not_null_tables() const { return 0; }
|
2003-10-16 23:36:01 +02:00
|
|
|
bool const_item() const;
|
2003-10-27 00:01:27 +01:00
|
|
|
inline table_map get_used_tables_cache() { return used_tables_cache; }
|
|
|
|
inline bool get_const_item_cache() { return const_item_cache; }
|
2003-12-06 20:37:24 +01:00
|
|
|
Item *get_tmp_table_item(THD *thd);
|
2003-10-16 23:36:01 +02:00
|
|
|
void update_used_tables();
|
2003-10-16 14:54:47 +02:00
|
|
|
void print(String *str);
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
virtual bool have_guarded_conds() { return FALSE; }
|
2003-07-07 17:40:19 +02:00
|
|
|
bool change_engine(subselect_engine *eng)
|
|
|
|
{
|
2004-02-08 19:14:13 +01:00
|
|
|
old_engine= engine;
|
2003-07-07 17:40:19 +02:00
|
|
|
engine= eng;
|
|
|
|
engine_changed= 1;
|
|
|
|
return eng == 0;
|
|
|
|
}
|
2005-10-13 09:53:00 +02:00
|
|
|
/*
|
|
|
|
True if this subquery has been already evaluated. Implemented only for
|
|
|
|
single select and union subqueries only.
|
|
|
|
*/
|
|
|
|
bool is_evaluated() const;
|
2006-11-01 02:31:56 +01:00
|
|
|
bool is_uncacheable() const;
|
2005-10-13 09:53:00 +02:00
|
|
|
|
2004-11-18 17:10:07 +01:00
|
|
|
/*
|
|
|
|
Used by max/min subquery to initialize value presence registration
|
|
|
|
mechanism. Engine call this method before rexecution query.
|
|
|
|
*/
|
|
|
|
virtual void reset_value_registration() {}
|
2004-10-07 21:54:31 +02:00
|
|
|
enum_parsing_place place() { return parsing_place; }
|
2002-05-12 22:46:42 +02:00
|
|
|
|
Bug#21904 (parser problem when using IN with a double "(())")
Before this fix, a IN predicate of the form: "IN (( subselect ))", with two
parenthesis, would be evaluated as a single row subselect: if the subselect
returns more that 1 row, the statement would fail.
The SQL:2003 standard defines a special exception in the specification,
and mandates that this particular form of IN predicate shall be equivalent
to "IN ( subselect )", which involves a table subquery and works with more
than 1 row.
This fix implements "IN (( subselect ))", "IN ((( subselect )))" etc
as per the SQL:2003 requirement.
All the details related to the implementation of this change have been
commented in the code, and the relevant sections of the SQL:2003 spec
are given for reference, so they are not repeated here.
Having access to the spec is a requirement to review in depth this patch.
mysql-test/r/subselect.result:
Implement IN predicate special exceptions with subselects.
mysql-test/t/subselect.test:
Implement IN predicate special exceptions with subselects.
sql/item_subselect.cc:
Implement IN predicate special exceptions with subselects.
sql/item_subselect.h:
Implement IN predicate special exceptions with subselects.
sql/sql_yacc.yy:
Implement IN predicate special exceptions with subselects, cleanup.
2007-01-30 01:32:52 +01:00
|
|
|
/**
|
|
|
|
Get the SELECT_LEX structure associated with this Item.
|
|
|
|
@return the SELECT_LEX structure associated with this Item
|
|
|
|
*/
|
|
|
|
st_select_lex* get_select_lex();
|
|
|
|
|
2002-05-12 22:46:42 +02:00
|
|
|
friend class select_subselect;
|
2002-12-19 20:15:09 +01:00
|
|
|
friend class Item_in_optimizer;
|
2005-07-01 06:05:42 +02:00
|
|
|
friend bool Item_field::fix_fields(THD *, Item **);
|
2006-02-15 17:45:06 +01:00
|
|
|
friend int Item_field::fix_outer_field(THD *, Field **, Item **);
|
2005-07-01 06:05:42 +02:00
|
|
|
friend bool Item_ref::fix_fields(THD *, Item **);
|
2005-04-29 01:43:56 +02:00
|
|
|
friend void mark_select_range_as_dependent(THD*,
|
|
|
|
st_select_lex*, st_select_lex*,
|
|
|
|
Field*, Item*, Item_ident*);
|
2002-05-12 22:46:42 +02:00
|
|
|
};
|
|
|
|
|
2002-06-19 16:52:44 +02:00
|
|
|
/* single value subselect */
|
|
|
|
|
2002-12-19 06:38:32 +01:00
|
|
|
class Item_cache;
|
2002-12-19 20:15:09 +01:00
|
|
|
class Item_singlerow_subselect :public Item_subselect
|
2002-06-19 16:52:44 +02:00
|
|
|
{
|
|
|
|
protected:
|
2002-12-19 06:38:33 +01:00
|
|
|
Item_cache *value, **row;
|
2002-06-19 16:52:44 +02:00
|
|
|
public:
|
2003-10-02 21:19:41 +02:00
|
|
|
Item_singlerow_subselect(st_select_lex *select_lex);
|
2003-08-12 11:38:03 +02:00
|
|
|
Item_singlerow_subselect() :Item_subselect(), value(0), row (0) {}
|
2003-07-07 17:40:19 +02:00
|
|
|
|
2004-02-08 19:14:13 +01:00
|
|
|
void cleanup();
|
2003-07-07 17:40:19 +02:00
|
|
|
subs_type substype() { return SINGLEROW_SUBS; }
|
|
|
|
|
2002-12-19 06:38:32 +01:00
|
|
|
void reset();
|
2003-07-02 00:45:22 +02:00
|
|
|
trans_res select_transformer(JOIN *join);
|
2002-12-19 06:38:33 +01:00
|
|
|
void store(uint i, Item* item);
|
2004-11-11 19:39:35 +01:00
|
|
|
double val_real();
|
2002-06-19 16:52:44 +02:00
|
|
|
longlong val_int ();
|
|
|
|
String *val_str (String *);
|
2005-02-08 23:50:45 +01:00
|
|
|
my_decimal *val_decimal(my_decimal *);
|
|
|
|
bool val_bool();
|
2002-12-19 06:38:32 +01:00
|
|
|
enum Item_result result_type() const;
|
2006-11-07 17:16:17 +01:00
|
|
|
enum_field_types field_type() const;
|
2002-09-28 17:34:56 +02:00
|
|
|
void fix_length_and_dec();
|
2002-11-13 00:14:39 +01:00
|
|
|
|
2002-12-19 06:38:33 +01:00
|
|
|
uint cols();
|
2006-12-14 23:51:37 +01:00
|
|
|
Item* element_index(uint i) { return my_reinterpret_cast(Item*)(row[i]); }
|
2002-12-19 06:38:33 +01:00
|
|
|
Item** addr(uint i) { return (Item**)row + i; }
|
|
|
|
bool check_cols(uint c);
|
|
|
|
bool null_inside();
|
|
|
|
void bring_value();
|
|
|
|
|
Bug#21904 (parser problem when using IN with a double "(())")
Before this fix, a IN predicate of the form: "IN (( subselect ))", with two
parenthesis, would be evaluated as a single row subselect: if the subselect
returns more that 1 row, the statement would fail.
The SQL:2003 standard defines a special exception in the specification,
and mandates that this particular form of IN predicate shall be equivalent
to "IN ( subselect )", which involves a table subquery and works with more
than 1 row.
This fix implements "IN (( subselect ))", "IN ((( subselect )))" etc
as per the SQL:2003 requirement.
All the details related to the implementation of this change have been
commented in the code, and the relevant sections of the SQL:2003 spec
are given for reference, so they are not repeated here.
Having access to the spec is a requirement to review in depth this patch.
mysql-test/r/subselect.result:
Implement IN predicate special exceptions with subselects.
mysql-test/t/subselect.test:
Implement IN predicate special exceptions with subselects.
sql/item_subselect.cc:
Implement IN predicate special exceptions with subselects.
sql/item_subselect.h:
Implement IN predicate special exceptions with subselects.
sql/sql_yacc.yy:
Implement IN predicate special exceptions with subselects, cleanup.
2007-01-30 01:32:52 +01:00
|
|
|
/**
|
|
|
|
This method is used to implement a special case of semantic tree
|
|
|
|
rewriting, mandated by a SQL:2003 exception in the specification.
|
|
|
|
The only caller of this method is handle_sql2003_note184_exception(),
|
|
|
|
see the code there for more details.
|
2007-02-01 17:36:17 +01:00
|
|
|
Note that this method breaks the object internal integrity, by
|
|
|
|
removing it's association with the corresponding SELECT_LEX,
|
|
|
|
making this object orphan from the parse tree.
|
|
|
|
No other method, beside the destructor, should be called on this
|
|
|
|
object, as it is now invalid.
|
Bug#21904 (parser problem when using IN with a double "(())")
Before this fix, a IN predicate of the form: "IN (( subselect ))", with two
parenthesis, would be evaluated as a single row subselect: if the subselect
returns more that 1 row, the statement would fail.
The SQL:2003 standard defines a special exception in the specification,
and mandates that this particular form of IN predicate shall be equivalent
to "IN ( subselect )", which involves a table subquery and works with more
than 1 row.
This fix implements "IN (( subselect ))", "IN ((( subselect )))" etc
as per the SQL:2003 requirement.
All the details related to the implementation of this change have been
commented in the code, and the relevant sections of the SQL:2003 spec
are given for reference, so they are not repeated here.
Having access to the spec is a requirement to review in depth this patch.
mysql-test/r/subselect.result:
Implement IN predicate special exceptions with subselects.
mysql-test/t/subselect.test:
Implement IN predicate special exceptions with subselects.
sql/item_subselect.cc:
Implement IN predicate special exceptions with subselects.
sql/item_subselect.h:
Implement IN predicate special exceptions with subselects.
sql/sql_yacc.yy:
Implement IN predicate special exceptions with subselects, cleanup.
2007-01-30 01:32:52 +01:00
|
|
|
@return the SELECT_LEX structure that was given in the constructor.
|
|
|
|
*/
|
|
|
|
st_select_lex* invalidate_and_restore_select_lex();
|
|
|
|
|
2002-12-19 20:15:09 +01:00
|
|
|
friend class select_singlerow_subselect;
|
2002-06-19 16:52:44 +02:00
|
|
|
};
|
|
|
|
|
2005-02-08 23:50:45 +01:00
|
|
|
/* used in static ALL/ANY optimization */
|
2004-11-18 17:10:07 +01:00
|
|
|
class select_max_min_finder_subselect;
|
2003-10-27 00:01:27 +01:00
|
|
|
class Item_maxmin_subselect :public Item_singlerow_subselect
|
2003-08-12 11:38:03 +02:00
|
|
|
{
|
2004-11-18 17:10:07 +01:00
|
|
|
protected:
|
2003-10-16 14:54:47 +02:00
|
|
|
bool max;
|
2004-12-07 20:18:15 +01:00
|
|
|
bool was_values; // Set if we have found at least one row
|
2003-08-12 11:38:03 +02:00
|
|
|
public:
|
2004-09-10 12:09:27 +02:00
|
|
|
Item_maxmin_subselect(THD *thd, Item_subselect *parent,
|
2003-10-27 00:01:27 +01:00
|
|
|
st_select_lex *select_lex, bool max);
|
2003-10-16 14:54:47 +02:00
|
|
|
void print(String *str);
|
2004-11-18 17:10:07 +01:00
|
|
|
void cleanup();
|
|
|
|
bool any_value() { return was_values; }
|
|
|
|
void register_value() { was_values= TRUE; }
|
|
|
|
void reset_value_registration() { was_values= FALSE; }
|
2003-08-12 11:38:03 +02:00
|
|
|
};
|
|
|
|
|
2002-06-19 16:52:44 +02:00
|
|
|
/* exists subselect */
|
|
|
|
|
|
|
|
class Item_exists_subselect :public Item_subselect
|
|
|
|
{
|
|
|
|
protected:
|
2005-04-01 01:14:30 +02:00
|
|
|
bool value; /* value of this item (boolean: exists/not-exists) */
|
2002-06-19 16:52:44 +02:00
|
|
|
|
|
|
|
public:
|
2003-10-02 21:19:41 +02:00
|
|
|
Item_exists_subselect(st_select_lex *select_lex);
|
2002-10-27 22:27:00 +01:00
|
|
|
Item_exists_subselect(): Item_subselect() {}
|
|
|
|
|
2003-07-07 17:40:19 +02:00
|
|
|
subs_type substype() { return EXISTS_SUBS; }
|
2002-12-19 06:38:32 +01:00
|
|
|
void reset()
|
2002-09-03 08:50:36 +02:00
|
|
|
{
|
|
|
|
value= 0;
|
|
|
|
}
|
|
|
|
|
2002-06-19 16:52:44 +02:00
|
|
|
enum Item_result result_type() const { return INT_RESULT;}
|
|
|
|
longlong val_int();
|
2004-11-11 19:39:35 +01:00
|
|
|
double val_real();
|
2002-06-19 16:52:44 +02:00
|
|
|
String *val_str(String*);
|
2005-02-08 23:50:45 +01:00
|
|
|
my_decimal *val_decimal(my_decimal *);
|
|
|
|
bool val_bool();
|
2002-09-28 17:34:56 +02:00
|
|
|
void fix_length_and_dec();
|
2003-10-16 14:54:47 +02:00
|
|
|
void print(String *str);
|
2002-12-06 20:55:53 +01:00
|
|
|
|
2002-06-19 16:52:44 +02:00
|
|
|
friend class select_exists_subselect;
|
2003-09-14 08:40:57 +02:00
|
|
|
friend class subselect_uniquesubquery_engine;
|
|
|
|
friend class subselect_indexsubquery_engine;
|
2002-06-19 16:52:44 +02:00
|
|
|
};
|
2002-09-03 08:50:36 +02:00
|
|
|
|
2006-10-31 18:51:09 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
IN subselect: this represents "left_exr IN (SELECT ...)"
|
|
|
|
|
|
|
|
This class has:
|
|
|
|
- (as a descendant of Item_subselect) a "subquery execution engine" which
|
|
|
|
allows it to evaluate subqueries. (and this class participates in
|
|
|
|
execution by having was_null variable where part of execution result
|
|
|
|
is stored.
|
|
|
|
- Transformation methods (todo: more on this).
|
|
|
|
|
|
|
|
This class is not used directly, it is "wrapped" into Item_in_optimizer
|
|
|
|
which provides some small bits of subquery evaluation.
|
|
|
|
*/
|
2002-10-27 22:27:00 +01:00
|
|
|
|
|
|
|
class Item_in_subselect :public Item_exists_subselect
|
|
|
|
{
|
2002-11-07 22:45:19 +01:00
|
|
|
protected:
|
2003-08-07 10:16:02 +02:00
|
|
|
Item *left_expr;
|
2003-05-14 20:51:33 +02:00
|
|
|
/*
|
2003-07-02 00:45:22 +02:00
|
|
|
expr & optimizer used in subselect rewriting to store Item for
|
2003-05-14 20:51:33 +02:00
|
|
|
all JOIN in UNION
|
|
|
|
*/
|
|
|
|
Item *expr;
|
|
|
|
Item_in_optimizer *optimizer;
|
2002-12-06 20:55:53 +01:00
|
|
|
bool was_null;
|
2003-05-14 20:51:33 +02:00
|
|
|
bool abort_on_null;
|
2003-10-16 14:54:47 +02:00
|
|
|
bool transformed;
|
2002-10-27 22:27:00 +01:00
|
|
|
public:
|
2006-10-31 18:51:09 +01:00
|
|
|
/* Used to trigger on/off conditions that were pushed down to subselect */
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
bool *pushed_cond_guards;
|
|
|
|
|
|
|
|
bool *get_cond_guard(int i)
|
|
|
|
{
|
|
|
|
return pushed_cond_guards ? pushed_cond_guards + i : NULL;
|
|
|
|
}
|
|
|
|
void set_cond_guard_var(int i, bool v) { pushed_cond_guards[i]= v; }
|
|
|
|
bool have_guarded_conds() { return test(pushed_cond_guards); }
|
|
|
|
|
2004-11-18 17:10:07 +01:00
|
|
|
Item_func_not_all *upper_item; // point on NOT/NOP before ALL/SOME subquery
|
2003-07-24 14:26:21 +02:00
|
|
|
|
2003-10-02 21:19:41 +02:00
|
|
|
Item_in_subselect(Item * left_expr, st_select_lex *select_lex);
|
2003-08-23 12:29:38 +02:00
|
|
|
Item_in_subselect()
|
2005-03-10 13:01:22 +01:00
|
|
|
:Item_exists_subselect(), optimizer(0), abort_on_null(0), transformed(0),
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
pushed_cond_guards(NULL), upper_item(0)
|
2003-10-16 14:54:47 +02:00
|
|
|
{}
|
2003-07-07 17:40:19 +02:00
|
|
|
|
|
|
|
subs_type substype() { return IN_SUBS; }
|
2002-12-06 20:55:53 +01:00
|
|
|
void reset()
|
|
|
|
{
|
|
|
|
value= 0;
|
|
|
|
null_value= 0;
|
|
|
|
was_null= 0;
|
|
|
|
}
|
2003-07-02 00:45:22 +02:00
|
|
|
trans_res select_transformer(JOIN *join);
|
2005-03-10 13:01:22 +01:00
|
|
|
trans_res select_in_like_transformer(JOIN *join, Comp_creator *func);
|
|
|
|
trans_res single_value_transformer(JOIN *join, Comp_creator *func);
|
2003-11-02 16:27:35 +01:00
|
|
|
trans_res row_value_transformer(JOIN * join);
|
2002-12-06 20:55:53 +01:00
|
|
|
longlong val_int();
|
2004-11-11 19:39:35 +01:00
|
|
|
double val_real();
|
2002-12-06 20:55:53 +01:00
|
|
|
String *val_str(String*);
|
2005-04-01 01:14:30 +02:00
|
|
|
my_decimal *val_decimal(my_decimal *);
|
|
|
|
bool val_bool();
|
2003-05-14 20:51:33 +02:00
|
|
|
void top_level_item() { abort_on_null=1; }
|
2006-10-31 18:51:09 +01:00
|
|
|
inline bool is_top_level_item() { return abort_on_null; }
|
2003-05-14 20:51:33 +02:00
|
|
|
bool test_limit(st_select_lex_unit *unit);
|
2003-10-16 14:54:47 +02:00
|
|
|
void print(String *str);
|
2006-05-11 14:30:54 +02:00
|
|
|
bool fix_fields(THD *thd, Item **ref);
|
2002-12-06 20:55:53 +01:00
|
|
|
|
|
|
|
friend class Item_ref_null_helper;
|
2003-04-22 23:01:19 +02:00
|
|
|
friend class Item_is_not_null_test;
|
2003-09-14 08:40:57 +02:00
|
|
|
friend class subselect_indexsubquery_engine;
|
2002-11-07 22:45:19 +01:00
|
|
|
};
|
|
|
|
|
2003-09-29 11:39:38 +02:00
|
|
|
|
2002-11-07 22:45:19 +01:00
|
|
|
/* ALL/ANY/SOME subselect */
|
|
|
|
class Item_allany_subselect :public Item_in_subselect
|
|
|
|
{
|
|
|
|
public:
|
2006-07-21 01:04:04 +02:00
|
|
|
chooser_compare_func_creator func_creator;
|
|
|
|
Comp_creator *func;
|
2003-10-16 14:54:47 +02:00
|
|
|
bool all;
|
|
|
|
|
2006-07-21 01:04:04 +02:00
|
|
|
Item_allany_subselect(Item * left_expr, chooser_compare_func_creator fc,
|
|
|
|
st_select_lex *select_lex, bool all);
|
2003-09-20 17:31:56 +02:00
|
|
|
|
2003-07-24 14:26:21 +02:00
|
|
|
// only ALL subquery has upper not
|
2004-11-18 17:10:07 +01:00
|
|
|
subs_type substype() { return all?ALL_SUBS:ANY_SUBS; }
|
2003-07-02 00:45:22 +02:00
|
|
|
trans_res select_transformer(JOIN *join);
|
2003-10-16 14:54:47 +02:00
|
|
|
void print(String *str);
|
2002-10-27 22:27:00 +01:00
|
|
|
};
|
|
|
|
|
2003-09-29 11:39:38 +02:00
|
|
|
|
2002-12-27 20:19:25 +01:00
|
|
|
class subselect_engine: public Sql_alloc
|
2002-09-03 08:50:36 +02:00
|
|
|
{
|
|
|
|
protected:
|
|
|
|
select_subselect *result; /* results storage class */
|
|
|
|
THD *thd; /* pointer to current THD */
|
|
|
|
Item_subselect *item; /* item, that use this engine */
|
2002-09-28 17:34:56 +02:00
|
|
|
enum Item_result res_type; /* type of results */
|
2006-11-07 17:16:17 +01:00
|
|
|
enum_field_types res_field_type; /* column type of the results */
|
2002-12-27 20:19:25 +01:00
|
|
|
bool maybe_null; /* may be null (first item in select) */
|
2002-09-03 08:50:36 +02:00
|
|
|
public:
|
|
|
|
|
2003-10-02 21:19:41 +02:00
|
|
|
subselect_engine(Item_subselect *si, select_subselect *res)
|
|
|
|
:thd(0)
|
2002-09-03 08:50:36 +02:00
|
|
|
{
|
|
|
|
result= res;
|
|
|
|
item= si;
|
2002-09-28 17:34:56 +02:00
|
|
|
res_type= STRING_RESULT;
|
2006-11-07 17:16:17 +01:00
|
|
|
res_field_type= FIELD_TYPE_VAR_STRING;
|
2002-12-27 20:19:25 +01:00
|
|
|
maybe_null= 0;
|
2002-09-03 08:50:36 +02:00
|
|
|
}
|
2002-12-27 20:19:25 +01:00
|
|
|
virtual ~subselect_engine() {}; // to satisfy compiler
|
2004-02-08 19:14:13 +01:00
|
|
|
virtual void cleanup()= 0;
|
2004-07-04 07:46:28 +02:00
|
|
|
|
2005-08-09 22:23:56 +02:00
|
|
|
/*
|
|
|
|
Also sets "thd" for subselect_engine::result.
|
|
|
|
Should be called before prepare().
|
|
|
|
*/
|
|
|
|
void set_thd(THD *thd_arg);
|
2003-10-02 21:19:41 +02:00
|
|
|
THD * get_thd() { return thd; }
|
2002-09-03 08:50:36 +02:00
|
|
|
virtual int prepare()= 0;
|
2002-12-19 06:38:33 +01:00
|
|
|
virtual void fix_length_and_dec(Item_cache** row)= 0;
|
2006-10-31 18:51:09 +01:00
|
|
|
/*
|
|
|
|
Execute the engine
|
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
exec()
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
|
2006-10-31 18:51:09 +01:00
|
|
|
DESCRIPTION
|
|
|
|
Execute the engine. The result of execution is subquery value that is
|
|
|
|
either captured by previously set up select_result-based 'sink' or
|
|
|
|
stored somewhere by the exec() method itself.
|
|
|
|
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
A required side effect: If at least one pushed-down predicate is
|
|
|
|
disabled, subselect_engine->no_rows() must return correct result after
|
|
|
|
the exec() call.
|
2006-10-31 18:51:09 +01:00
|
|
|
|
|
|
|
RETURN
|
|
|
|
0 - OK
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
1 - Either an execution error, or the engine was "changed", and the
|
2006-10-31 18:51:09 +01:00
|
|
|
caller should call exec() again for the new engine.
|
|
|
|
*/
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
virtual int exec()= 0;
|
2005-02-08 23:50:45 +01:00
|
|
|
virtual uint cols()= 0; /* return number of columns in select */
|
2003-11-17 19:53:40 +01:00
|
|
|
virtual uint8 uncacheable()= 0; /* query is uncacheable */
|
2002-09-28 17:34:56 +02:00
|
|
|
enum Item_result type() { return res_type; }
|
2006-11-07 17:16:17 +01:00
|
|
|
enum_field_types field_type() { return res_field_type; }
|
2002-11-28 18:29:26 +01:00
|
|
|
virtual void exclude()= 0;
|
2006-12-12 03:57:23 +01:00
|
|
|
virtual bool may_be_null() { return maybe_null; };
|
2003-10-16 23:36:01 +02:00
|
|
|
virtual table_map upper_select_const_tables()= 0;
|
|
|
|
static table_map calc_const_tables(TABLE_LIST *);
|
2003-10-16 14:54:47 +02:00
|
|
|
virtual void print(String *str)= 0;
|
2004-10-20 03:04:37 +02:00
|
|
|
virtual bool change_result(Item_subselect *si, select_subselect *result)= 0;
|
2004-10-27 20:11:06 +02:00
|
|
|
virtual bool no_tables()= 0;
|
2005-10-13 09:53:00 +02:00
|
|
|
virtual bool is_executed() const { return FALSE; }
|
2006-10-31 18:51:09 +01:00
|
|
|
/* Check if subquery produced any rows during last query execution */
|
|
|
|
virtual bool no_rows() = 0;
|
2006-11-07 17:16:17 +01:00
|
|
|
|
|
|
|
protected:
|
|
|
|
void set_row(List<Item> &item_list, Item_cache **row);
|
2002-09-03 08:50:36 +02:00
|
|
|
};
|
|
|
|
|
2003-09-29 11:39:38 +02:00
|
|
|
|
2002-09-03 08:50:36 +02:00
|
|
|
class subselect_single_select_engine: public subselect_engine
|
|
|
|
{
|
2002-10-13 13:25:16 +02:00
|
|
|
my_bool prepared; /* simple subselect is prepared */
|
2002-09-03 08:50:36 +02:00
|
|
|
my_bool optimized; /* simple subselect is optimized */
|
2002-10-13 13:25:16 +02:00
|
|
|
my_bool executed; /* simple subselect is executed */
|
2002-09-03 08:50:36 +02:00
|
|
|
st_select_lex *select_lex; /* corresponding select_lex */
|
|
|
|
JOIN * join; /* corresponding JOIN structure */
|
|
|
|
public:
|
2003-10-02 21:19:41 +02:00
|
|
|
subselect_single_select_engine(st_select_lex *select,
|
2002-09-03 08:50:36 +02:00
|
|
|
select_subselect *result,
|
|
|
|
Item_subselect *item);
|
2003-12-30 11:08:19 +01:00
|
|
|
void cleanup();
|
2002-11-13 23:26:18 +01:00
|
|
|
int prepare();
|
2002-12-19 06:38:33 +01:00
|
|
|
void fix_length_and_dec(Item_cache** row);
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
int exec();
|
2002-11-13 23:26:18 +01:00
|
|
|
uint cols();
|
2003-11-17 19:53:40 +01:00
|
|
|
uint8 uncacheable();
|
2002-11-28 18:29:26 +01:00
|
|
|
void exclude();
|
2003-10-16 23:36:01 +02:00
|
|
|
table_map upper_select_const_tables();
|
2003-10-16 14:54:47 +02:00
|
|
|
void print (String *str);
|
2004-10-20 03:04:37 +02:00
|
|
|
bool change_result(Item_subselect *si, select_subselect *result);
|
2004-10-27 20:11:06 +02:00
|
|
|
bool no_tables();
|
2006-12-12 03:57:23 +01:00
|
|
|
bool may_be_null();
|
2005-10-13 09:53:00 +02:00
|
|
|
bool is_executed() const { return executed; }
|
2006-10-31 18:51:09 +01:00
|
|
|
bool no_rows();
|
2002-09-03 08:50:36 +02:00
|
|
|
};
|
|
|
|
|
2003-09-29 11:39:38 +02:00
|
|
|
|
2002-09-03 08:50:36 +02:00
|
|
|
class subselect_union_engine: public subselect_engine
|
|
|
|
{
|
|
|
|
st_select_lex_unit *unit; /* corresponding unit structure */
|
|
|
|
public:
|
2003-10-02 21:19:41 +02:00
|
|
|
subselect_union_engine(st_select_lex_unit *u,
|
2002-09-03 08:50:36 +02:00
|
|
|
select_subselect *result,
|
|
|
|
Item_subselect *item);
|
2004-02-08 19:14:13 +01:00
|
|
|
void cleanup();
|
2002-11-13 23:26:18 +01:00
|
|
|
int prepare();
|
2002-12-19 06:38:33 +01:00
|
|
|
void fix_length_and_dec(Item_cache** row);
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
int exec();
|
2002-11-13 23:26:18 +01:00
|
|
|
uint cols();
|
2003-11-17 19:53:40 +01:00
|
|
|
uint8 uncacheable();
|
2002-11-28 18:29:26 +01:00
|
|
|
void exclude();
|
2003-10-16 23:36:01 +02:00
|
|
|
table_map upper_select_const_tables();
|
2003-10-16 14:54:47 +02:00
|
|
|
void print (String *str);
|
2004-10-20 03:04:37 +02:00
|
|
|
bool change_result(Item_subselect *si, select_subselect *result);
|
2004-10-27 20:11:06 +02:00
|
|
|
bool no_tables();
|
2005-10-13 09:53:00 +02:00
|
|
|
bool is_executed() const;
|
2006-10-31 18:51:09 +01:00
|
|
|
bool no_rows();
|
2002-09-03 08:50:36 +02:00
|
|
|
};
|
2003-07-07 17:40:19 +02:00
|
|
|
|
2003-09-29 11:39:38 +02:00
|
|
|
|
2003-07-07 17:40:19 +02:00
|
|
|
struct st_join_table;
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
A subquery execution engine that evaluates the subquery by doing one index
|
|
|
|
lookup in a unique index.
|
|
|
|
|
|
|
|
This engine is used to resolve subqueries in forms
|
|
|
|
|
|
|
|
outer_expr IN (SELECT tbl.unique_key FROM tbl WHERE subq_where)
|
|
|
|
|
|
|
|
or, tuple-based:
|
|
|
|
|
|
|
|
(oe1, .. oeN) IN (SELECT uniq_key_part1, ... uniq_key_partK
|
|
|
|
FROM tbl WHERE subqwhere)
|
|
|
|
|
|
|
|
i.e. the subquery is a single table SELECT without GROUP BY, aggregate
|
|
|
|
functions, etc.
|
|
|
|
*/
|
|
|
|
|
2003-09-14 08:40:57 +02:00
|
|
|
class subselect_uniquesubquery_engine: public subselect_engine
|
2003-07-07 17:40:19 +02:00
|
|
|
{
|
2003-07-07 23:08:00 +02:00
|
|
|
protected:
|
2003-07-07 17:40:19 +02:00
|
|
|
st_join_table *tab;
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
Item *cond; /* The WHERE condition of subselect */
|
2006-10-31 18:51:09 +01:00
|
|
|
/*
|
|
|
|
TRUE<=> last execution produced empty set. Valid only when left
|
|
|
|
expression is NULL.
|
|
|
|
*/
|
|
|
|
bool empty_result_set;
|
|
|
|
bool null_keypart; /* TRUE <=> constructed search tuple has a NULL */
|
2003-07-07 17:40:19 +02:00
|
|
|
public:
|
|
|
|
|
2003-10-02 21:19:41 +02:00
|
|
|
// constructor can assign THD because it will be called after JOIN::prepare
|
2003-11-28 11:18:13 +01:00
|
|
|
subselect_uniquesubquery_engine(THD *thd_arg, st_join_table *tab_arg,
|
2003-09-14 08:40:57 +02:00
|
|
|
Item_subselect *subs, Item *where)
|
2003-10-02 21:19:41 +02:00
|
|
|
:subselect_engine(subs, 0), tab(tab_arg), cond(where)
|
|
|
|
{
|
2003-11-28 11:18:13 +01:00
|
|
|
set_thd(thd_arg);
|
2003-10-02 21:19:41 +02:00
|
|
|
}
|
2003-09-29 11:39:38 +02:00
|
|
|
~subselect_uniquesubquery_engine();
|
2004-02-08 19:14:13 +01:00
|
|
|
void cleanup();
|
2003-07-07 17:40:19 +02:00
|
|
|
int prepare();
|
|
|
|
void fix_length_and_dec(Item_cache** row);
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
int exec();
|
2003-07-07 17:40:19 +02:00
|
|
|
uint cols() { return 1; }
|
2003-11-17 19:53:40 +01:00
|
|
|
uint8 uncacheable() { return UNCACHEABLE_DEPENDENT; }
|
2003-09-29 11:39:38 +02:00
|
|
|
void exclude();
|
2003-10-16 23:36:01 +02:00
|
|
|
table_map upper_select_const_tables() { return 0; }
|
2003-10-16 14:54:47 +02:00
|
|
|
void print (String *str);
|
2004-10-20 03:04:37 +02:00
|
|
|
bool change_result(Item_subselect *si, select_subselect *result);
|
2004-10-27 20:11:06 +02:00
|
|
|
bool no_tables();
|
2006-10-31 18:51:09 +01:00
|
|
|
int scan_table();
|
|
|
|
bool copy_ref_key();
|
|
|
|
bool no_rows() { return empty_result_set; }
|
2003-07-07 23:08:00 +02:00
|
|
|
};
|
|
|
|
|
2003-09-29 11:39:38 +02:00
|
|
|
|
2003-09-14 08:40:57 +02:00
|
|
|
class subselect_indexsubquery_engine: public subselect_uniquesubquery_engine
|
2003-07-07 23:08:00 +02:00
|
|
|
{
|
2006-10-31 18:51:09 +01:00
|
|
|
/* FALSE for 'ref', TRUE for 'ref-or-null'. */
|
2003-07-17 18:39:31 +02:00
|
|
|
bool check_null;
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
/*
|
|
|
|
The "having" clause. This clause (further reffered to as "artificial
|
|
|
|
having") was inserted by subquery transformation code. It contains
|
|
|
|
Item(s) that have a side-effect: they record whether the subquery has
|
|
|
|
produced a row with NULL certain components. We need to use it for cases
|
|
|
|
like
|
|
|
|
(oe1, oe2) IN (SELECT t.key, t.no_key FROM t1)
|
|
|
|
where we do index lookup on t.key=oe1 but need also to check if there
|
|
|
|
was a row such that t.no_key IS NULL.
|
|
|
|
|
|
|
|
NOTE: This is currently here and not in the uniquesubquery_engine. Ideally
|
|
|
|
it should have been in uniquesubquery_engine in order to allow execution of
|
|
|
|
subqueries like
|
|
|
|
|
|
|
|
(oe1, oe2) IN (SELECT primary_key, non_key_maybe_null_field FROM tbl)
|
|
|
|
|
|
|
|
We could use uniquesubquery_engine for the first component and let
|
|
|
|
Item_is_not_null_test( non_key_maybe_null_field) to handle the second.
|
|
|
|
|
|
|
|
However, subqueries like the above are currently not handled by index
|
|
|
|
lookup-based subquery engines, the engine applicability check misses
|
|
|
|
them: it doesn't switch the engine for case of artificial having and
|
|
|
|
[eq_]ref access (only for artifical having + ref_or_null or no having).
|
|
|
|
The above example subquery is handled as a full-blown SELECT with eq_ref
|
|
|
|
access to one table.
|
|
|
|
|
|
|
|
Due to this limitation, the "artificial having" currently needs to be
|
|
|
|
checked by only in indexsubquery_engine.
|
|
|
|
*/
|
|
|
|
Item *having;
|
2003-07-07 23:08:00 +02:00
|
|
|
public:
|
2003-10-02 21:19:41 +02:00
|
|
|
|
|
|
|
// constructor can assign THD because it will be called after JOIN::prepare
|
2006-12-14 23:51:37 +01:00
|
|
|
subselect_indexsubquery_engine(THD *thd_arg, st_join_table *tab_arg,
|
2003-09-14 08:40:57 +02:00
|
|
|
Item_subselect *subs, Item *where,
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
Item *having_arg, bool chk_null)
|
2006-12-14 23:51:37 +01:00
|
|
|
:subselect_uniquesubquery_engine(thd_arg, tab_arg, subs, where),
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
check_null(chk_null),
|
|
|
|
having(having_arg)
|
2003-07-07 23:08:00 +02:00
|
|
|
{}
|
BUG#24127: (a,b) IN (SELECT c,d ...) can produce wrong results if a and/or b are NULLs:
- Make the code produce correct result: use an array of triggers to turn on/off equalities for each
compared column. Also turn on/off optimizations based on those equalities.
- Make EXPLAIN output show "Full scan on NULL key" for tables for which we switch between
ref/unique_subquery/index_subquery and ALL access.
- index_subquery engine now has HAVING clause when it is needed, and it is
displayed in EXPLAIN EXTENDED
- Fix incorrect presense of "Using index" for index/unique-based subqueries (BUG#22930)
// bk trigger note: this commit refers to BUG#24127
mysql-test/r/ndb_subquery.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect2.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Updated test results (checked)
mysql-test/r/subselect3.result:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
mysql-test/t/subselect3.test:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Testcases
sql/item_cmpfunc.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- For row-based IN subqueries, use one flag per each column. Set the flags appropriately before
running the subquery.
sql/item_cmpfunc.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added Item_func_trig_cond::get_triv_var()
sql/item_subselect.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/item_subselect.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Item_subselect::exec() and subselect_*_engine::exec() don't have parameter
anymore - now Item_subselect owns the pushed down predicates guard flags.
- A correct set of conditional predicates is now pushed into row-based IN
subquery.
- select_indexsubquery_engine now has "HAVING clause" (needed for correct query
results), and it is shown in EXPLAIN EXTENDED
sql/mysql_priv.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/mysqld.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Added "in_having_cond" special Item name
sql/sql_lex.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
sql/sql_select.cc:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix subquery optimization code to match the changes in what kinds of
conditions are pushed down into subqueries
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
sql/sql_select.h:
BUG#24127: wrong result for (null,not-null) IN (SELECT a,b ...)
- Make "ref" analyzer be able to work with conditional equalities
- Fix wrong EXPLAIN output in some queries with subquery (BUG#22390)
2007-01-12 21:22:41 +01:00
|
|
|
int exec();
|
2003-10-16 14:54:47 +02:00
|
|
|
void print (String *str);
|
2003-07-07 17:40:19 +02:00
|
|
|
};
|
2005-10-13 09:53:00 +02:00
|
|
|
|
|
|
|
|
|
|
|
inline bool Item_subselect::is_evaluated() const
|
|
|
|
{
|
|
|
|
return engine->is_executed();
|
|
|
|
}
|
|
|
|
|
2006-11-01 02:31:56 +01:00
|
|
|
inline bool Item_subselect::is_uncacheable() const
|
|
|
|
{
|
|
|
|
return engine->uncacheable();
|
|
|
|
}
|
|
|
|
|
|
|
|
|