5.3 merge

This commit is contained in:
Sergei Golubchik 2012-01-13 15:50:02 +01:00
commit 4f435bddfd
750 changed files with 17312 additions and 7063 deletions

View file

@ -1,7 +1,7 @@
#ifndef ITEM_SUBSELECT_INCLUDED
#define ITEM_SUBSELECT_INCLUDED
/* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
/* Copyright (c) 2002, 2011, Oracle and/or its affiliates.
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
@ -241,6 +241,10 @@ public:
virtual bool expr_cache_is_needed(THD *);
virtual void get_cache_parameters(List<Item> &parameters);
virtual bool is_subquery_processor (uchar *opt_arg) { return 1; }
bool limit_index_condition_pushdown_processor(uchar *opt_arg)
{
return TRUE;
}
friend class select_result_interceptor;
friend class Item_in_optimizer;
@ -460,10 +464,44 @@ public:
Same as above, but they also allow to scan the materialized table.
*/
bool sjm_scan_allowed;
double jtbm_read_time;
double jtbm_record_count;
bool is_jtbm_merged;
/*
JoinTaB Materialization (JTBM) members
*/
/*
TRUE <=> This subselect has been converted into non-mergeable semi-join
table.
*/
bool is_jtbm_merged;
/* (Applicable if is_jtbm_merged==TRUE) Time required to run the materialized join */
double jtbm_read_time;
/* (Applicable if is_jtbm_merged==TRUE) Number of output rows in materialized join */
double jtbm_record_count;
/*
(Applicable if is_jtbm_merged==TRUE) TRUE <=> The materialized subselect is
a degenerate subselect which produces 0 or 1 rows, which we know at
optimization phase.
Examples:
1. subquery has "Impossible WHERE":
SELECT * FROM ot WHERE ot.column IN (SELECT it.col FROM it WHERE 2 > 3)
2. Subquery produces one row which opt_sum.cc is able to get with one lookup:
SELECT * FROM ot WHERE ot.column IN (SELECT MAX(it.key_col) FROM it)
*/
bool is_jtbm_const_tab;
/*
(Applicable if is_jtbm_const_tab==TRUE) Whether the subquery has produced
the row (or not)
*/
bool jtbm_const_row_found;
/*
TRUE<=>this is a flattenable semi-join, false overwise.
*/
@ -504,7 +542,7 @@ public:
:Item_exists_subselect(), left_expr_cache(0), first_execution(TRUE),
abort_on_null(0), in_strategy(SUBS_NOT_TRANSFORMED), optimizer(0),
pushed_cond_guards(NULL), func(NULL), emb_on_expr_nest(NULL),
is_jtbm_merged(FALSE),
is_jtbm_merged(FALSE), is_jtbm_const_tab(FALSE),
upper_item(0)
{}
void cleanup();
@ -725,9 +763,9 @@ protected:
class subselect_single_select_engine: public subselect_engine
{
bool prepared; /* simple subselect is prepared */
bool executed; /* simple subselect is executed */
bool optimize_error; ///< simple subselect optimization failed
bool prepared; /* simple subselect is prepared */
bool executed; /* simple subselect is executed */
bool optimize_error; /* simple subselect optimization failed */
st_select_lex *select_lex; /* corresponding select_lex */
JOIN * join; /* corresponding JOIN structure */
public:
@ -755,6 +793,9 @@ public:
friend class subselect_hash_sj_engine;
friend class Item_in_subselect;
friend bool setup_jtbm_semi_joins(JOIN *join, List<TABLE_LIST> *join_list,
Item **join_where);
};