diff options
Diffstat (limited to 'sql/item_subselect.h')
-rw-r--r-- | sql/item_subselect.h | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 6007812fa7d..57f413f1ccd 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -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> ¶meters); 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; + + /* + 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; - bool is_jtbm_merged; + + /* + (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); + }; |