MySQL 5.6.14 Source Code Document
|
#include <item_subselect.h>
Classes | |
struct | In2exists_info |
Public Member Functions | |
bool | in2exists_added_to_where () const |
bool | originally_dependent () const |
Is reliable only if IN->EXISTS has been done. | |
bool * | get_cond_guard (int i) |
void | set_cond_guard_var (int i, bool v) |
bool | have_guarded_conds () |
Item_in_subselect (Item *left_expr, st_select_lex *select_lex) | |
virtual void | cleanup () |
subs_type | substype () |
virtual void | reset () |
trans_res | select_transformer (JOIN *join) |
trans_res | select_in_like_transformer (JOIN *join, Comp_creator *func) |
trans_res | single_value_transformer (JOIN *join, Comp_creator *func) |
trans_res | row_value_transformer (JOIN *join) |
trans_res | single_value_in_to_exists_transformer (JOIN *join, Comp_creator *func) |
trans_res | row_value_in_to_exists_transformer (JOIN *join) |
bool | walk (Item_processor processor, bool walk_subquery, uchar *arg) |
virtual bool | exec () |
longlong | val_int () |
double | val_real () |
String * | val_str (String *) |
my_decimal * | val_decimal (my_decimal *) |
void | update_null_value () |
bool | val_bool () |
void | top_level_item () |
bool | is_top_level_item () |
bool | test_limit (st_select_lex_unit *unit) |
virtual void | print (String *str, enum_query_type query_type) |
bool | fix_fields (THD *thd, Item **ref) |
void | fix_after_pullout (st_select_lex *parent_select, st_select_lex *removed_select) |
bool | init_left_expr_cache () |
bool | finalize_exists_transform (SELECT_LEX *select_lex) |
bool | finalize_materialization_transform (JOIN *join) |
Public Member Functions inherited from Item_exists_subselect | |
Item_exists_subselect (st_select_lex *select_lex) | |
enum Item_result | result_type () const |
bool | get_date (MYSQL_TIME *ltime, uint fuzzydate) |
bool | get_time (MYSQL_TIME *ltime) |
void | fix_length_and_dec () |
Public Member Functions inherited from Item_subselect | |
const subselect_engine * | get_engine_for_explain () const |
EXPLAIN needs read-only access to the engine. | |
virtual void | init (st_select_lex *select_lex, select_result_interceptor *result) |
bool | assigned () const |
void | assigned (bool a) |
enum Type | type () const |
bool | is_null () |
table_map | used_tables () const |
table_map | not_null_tables () const |
bool | const_item () const |
table_map | get_used_tables_cache () |
bool | get_const_item_cache () |
Item * | get_tmp_table_item (THD *thd) |
void | update_used_tables () |
bool | change_engine (subselect_engine *eng) |
bool | is_evaluated () const |
bool | is_uncacheable () const |
virtual void | reset_value_registration () |
enum_parsing_place | place () |
bool | walk_join_condition (List< TABLE_LIST > *tables, Item_processor processor, bool walk_subquery, uchar *argument) |
bool | walk_body (Item_processor processor, bool walk_subquery, uchar *arg) |
virtual bool | explain_subquery_checker (uchar **arg) |
bool | inform_item_in_cond_of_tab (uchar *join_tab_index) |
virtual bool | clean_up_after_removal (uchar *arg) |
const char * | func_name () const |
Public Member Functions inherited from Item_result_field | |
Item_result_field (THD *thd, Item_result_field *item) | |
Field * | get_tmp_table_field () |
Field * | tmp_table_field (TABLE *t_arg) |
void | set_result_field (Field *field) |
bool | is_result_field () |
void | save_in_result_field (bool no_conversions) |
Public Member Functions inherited from Item | |
Item (THD *thd, Item *item) | |
void | rename (char *new_name) |
void | init_make_field (Send_field *tmp_field, enum enum_field_types type) |
virtual void | make_field (Send_field *field) |
virtual Field * | make_string_field (TABLE *table) |
void | quick_fix_field () |
type_conversion_status | save_in_field_no_warnings (Field *field, bool no_conversions) |
virtual type_conversion_status | save_in_field (Field *field, bool no_conversions) |
virtual void | save_org_in_field (Field *field) |
virtual type_conversion_status | save_safe_in_field (Field *field) |
virtual bool | send (Protocol *protocol, String *str) |
virtual bool | eq (const Item *, bool binary_cmp) const |
virtual enum Item_result | numeric_context_result_type () const |
enum Item_result | temporal_with_date_as_number_result_type () const |
virtual Item_result | cast_to_int_type () const |
virtual enum_field_types | string_field_type () const |
virtual enum_field_types | field_type () const |
virtual enum_monotonicity_info | get_monotonicity_info () const |
virtual longlong | val_int_endpoint (bool left_endp, bool *incl_endp) |
virtual longlong | val_date_temporal () |
virtual longlong | val_time_temporal () |
longlong | val_temporal_by_field_type () |
longlong | val_temporal_with_round (enum_field_types type, uint8 dec) |
ulonglong | val_uint () |
virtual String * | val_str_ascii (String *str) |
virtual String * | val_nodeset (String *) |
type_conversion_status | save_time_in_field (Field *field) |
type_conversion_status | save_date_in_field (Field *field) |
type_conversion_status | save_str_value_in_field (Field *field, String *result) |
virtual const char * | full_name () const |
virtual double | val_result () |
virtual longlong | val_int_result () |
virtual longlong | val_time_temporal_result () |
virtual longlong | val_date_temporal_result () |
virtual String * | str_result (String *tmp) |
virtual my_decimal * | val_decimal_result (my_decimal *val) |
virtual bool | val_bool_result () |
virtual bool | is_null_result () |
virtual table_map | resolved_used_tables () const |
virtual bool | basic_const_item () const |
virtual Item * | clone_item () |
virtual cond_result | eq_cmp_result () const |
uint | float_length (uint decimals_par) const |
virtual uint | decimal_precision () const |
int | decimal_int_part () const |
virtual uint | time_precision () |
virtual uint | datetime_precision () |
virtual bool | const_during_execution () const |
void | print_item_w_name (String *, enum_query_type query_type) |
void | print_for_order (String *str, enum_query_type query_type, bool used_alias) |
virtual void | split_sum_func (THD *thd, Ref_ptr_array ref_pointer_array, List< Item > &fields) |
void | split_sum_func2 (THD *thd, Ref_ptr_array ref_pointer_array, List< Item > &fields, Item **ref, bool skip_registered) |
virtual bool | get_timeval (struct timeval *tm, int *warnings) |
virtual bool | get_date_result (MYSQL_TIME *ltime, uint fuzzydate) |
virtual bool | is_bool_func () |
virtual void | no_rows_in_result () |
virtual Item * | copy_or_same (THD *thd) |
virtual Item * | copy_andor_structure (THD *thd, bool real_items=false) |
virtual Item * | real_item () |
virtual const CHARSET_INFO * | compare_collation () |
virtual const CHARSET_INFO * | charset_for_protocol (void) const |
virtual Item * | transform (Item_transformer transformer, uchar *arg) |
virtual Item * | compile (Item_analyzer analyzer, uchar **arg_p, Item_transformer transformer, uchar *arg_t) |
virtual void | traverse_cond (Cond_traverser traverser, void *arg, traverse_order order) |
virtual bool | intro_version (uchar *int_arg) |
virtual bool | remove_dependence_processor (uchar *arg) |
virtual bool | remove_fixed (uchar *arg) |
virtual bool | cleanup_processor (uchar *arg) |
virtual bool | collect_item_field_processor (uchar *arg) |
virtual bool | add_field_to_set_processor (uchar *arg) |
virtual bool | remove_column_from_bitmap (uchar *arg) |
virtual bool | find_item_in_field_list_processor (uchar *arg) |
virtual bool | change_context_processor (uchar *context) |
virtual bool | reset_query_id_processor (uchar *query_id_arg) |
virtual bool | find_item_processor (uchar *arg) |
virtual bool | register_field_in_read_map (uchar *arg) |
virtual bool | cache_const_expr_analyzer (uchar **arg) |
virtual Item * | cache_const_expr_transformer (uchar *arg) |
virtual bool | item_field_by_name_analyzer (uchar **arg) |
virtual Item * | item_field_by_name_transformer (uchar *arg) |
virtual bool | equality_substitution_analyzer (uchar **arg) |
virtual Item * | equality_substitution_transformer (uchar *arg) |
virtual bool | check_partition_func_processor (uchar *bool_arg) |
virtual bool | subst_argument_checker (uchar **arg) |
virtual Item * | explain_subquery_propagator (uchar *arg) |
virtual Item * | equal_fields_propagator (uchar *arg) |
virtual bool | set_no_const_sub (uchar *arg) |
virtual Item * | replace_equal_field (uchar *arg) |
virtual bool | check_valid_arguments_processor (uchar *bool_arg) |
virtual bool | find_function_processor (uchar *arg) |
virtual Item * | this_item () |
virtual const Item * | this_item () const |
virtual Item ** | this_item_addr (THD *thd, Item **addr_arg) |
virtual uint | cols () |
virtual Item * | element_index (uint i) |
virtual Item ** | addr (uint i) |
virtual bool | check_cols (uint c) |
virtual bool | null_inside () |
virtual void | bring_value () |
Field * | tmp_table_field_from_field_type (TABLE *table, bool fixed_length) |
virtual Item_field * | field_for_view_update () |
virtual Item * | neg_transformer (THD *thd) |
virtual Item * | update_value_transformer (uchar *select_arg) |
virtual Item * | safe_charset_converter (const CHARSET_INFO *tocs) |
void | delete_self () |
virtual bool | is_splocal () |
virtual Settable_routine_parameter * | get_settable_routine_parameter () |
bool | is_temporal_with_date () const |
bool | is_temporal_with_date_and_time () const |
bool | is_temporal_with_time () const |
bool | is_temporal () const |
bool | has_compatible_context (Item *item) const |
virtual Field::geometry_type | get_geometry_type () const |
String * | check_well_formed_result (String *str, bool send_error=0) |
bool | eq_by_collation (Item *item, bool binary_cmp, const CHARSET_INFO *cs) |
virtual bool | is_expensive () |
virtual bool | can_be_evaluated_now () const |
uint32 | max_char_length () const |
void | fix_length_and_charset (uint32 max_char_length_arg, const CHARSET_INFO *cs) |
void | fix_char_length (uint32 max_char_length_arg) |
void | fix_char_length_ulonglong (ulonglong max_char_length_arg) |
void | fix_length_and_charset_datetime (uint32 max_char_length_arg) |
void | fix_length_and_dec_and_charset_datetime (uint32 max_char_length_arg, uint8 dec_arg) |
virtual bool | is_outer_field () const |
bool | is_blob_field () const |
virtual bool | has_subquery () const |
virtual bool | has_stored_program () const |
virtual bool | created_by_in2exists () const |
Whether this Item was created by the IN->EXISTS subquery transformation. |
Public Attributes | |
Item * | left_expr |
bool * | pushed_cond_guards |
Item_func_not_all * | upper_item |
TABLE_LIST * | expr_join_nest |
Public Attributes inherited from Item_exists_subselect | |
enum_exec_method | exec_method |
int | sj_convert_priority |
Priority of this predicate in the convert-to-semi-join-nest process. | |
bool | sj_chosen |
True if this predicate is chosen for semi-join transformation. | |
TABLE_LIST * | embedding_join_nest |
Public Attributes inherited from Item_subselect | |
Item * | substitution |
st_select_lex_unit * | unit |
int | in_cond_of_tab |
bool | engine_changed |
bool | changed |
Public Attributes inherited from Item_result_field | |
Field * | result_field |
Public Attributes inherited from Item | |
uint | rsize |
String | str_value |
Item_name_string | item_name |
Item_name_string | orig_name |
Item * | next |
uint32 | max_length |
int | marker |
uint8 | decimals |
my_bool | maybe_null |
my_bool | null_value |
my_bool | unsigned_flag |
my_bool | with_sum_func |
my_bool | fixed |
DTCollation | collation |
Item_result | cmp_context |
Protected Attributes | |
List< Cached_item > * | left_expr_cache |
bool | left_expr_cache_filled |
Whether left_expr_cache holds a value. | |
bool | need_expr_cache |
Item * | expr |
Item_in_optimizer * | optimizer |
bool | was_null |
bool | abort_on_null |
Protected Attributes inherited from Item_exists_subselect | |
bool | value |
Protected Attributes inherited from Item_subselect | |
subselect_engine * | engine |
subselect_engine * | old_engine |
table_map | used_tables_cache |
uint | max_columns |
enum_parsing_place | parsing_place |
bool | have_to_be_excluded |
bool | const_item_cache |
Friends | |
class | Item_ref_null_helper |
class | Item_is_not_null_test |
class | Item_in_optimizer |
class | subselect_indexsubquery_engine |
class | subselect_hash_sj_engine |
Additional Inherited Members | |
Public Types inherited from Item_exists_subselect | |
enum | enum_exec_method { EXEC_UNSPECIFIED, EXEC_SEMI_JOIN, EXEC_EXISTS, EXEC_EXISTS_OR_MAT, EXEC_MATERIALIZATION } |
Static Public Member Functions inherited from Item | |
static void * | operator new (size_t size) throw () |
static void * | operator new (size_t size, MEM_ROOT *mem_root) throw () |
static void | operator delete (void *ptr, size_t size) |
static void | operator delete (void *ptr, MEM_ROOT *mem_root) |
static const CHARSET_INFO * | default_charset () |
Protected Member Functions inherited from Item | |
String * | val_string_from_real (String *str) |
String * | val_string_from_int (String *str) |
String * | val_string_from_decimal (String *str) |
String * | val_string_from_date (String *str) |
String * | val_string_from_datetime (String *str) |
String * | val_string_from_time (String *str) |
my_decimal * | val_decimal_from_real (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_int (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_string (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_date (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_time (my_decimal *decimal_value) |
longlong | val_int_from_decimal () |
longlong | val_int_from_date () |
longlong | val_int_from_time () |
longlong | val_int_from_datetime () |
double | val_real_from_decimal () |
bool | get_date_from_string (MYSQL_TIME *ltime, uint flags) |
bool | get_date_from_real (MYSQL_TIME *ltime, uint flags) |
bool | get_date_from_decimal (MYSQL_TIME *ltime, uint flags) |
bool | get_date_from_int (MYSQL_TIME *ltime, uint flags) |
bool | get_date_from_time (MYSQL_TIME *ltime) |
bool | get_date_from_numeric (MYSQL_TIME *ltime, uint fuzzydate) |
bool | get_date_from_non_temporal (MYSQL_TIME *ltime, uint fuzzydate) |
bool | get_time_from_string (MYSQL_TIME *ltime) |
bool | get_time_from_real (MYSQL_TIME *ltime) |
bool | get_time_from_decimal (MYSQL_TIME *ltime) |
bool | get_time_from_int (MYSQL_TIME *ltime) |
bool | get_time_from_date (MYSQL_TIME *ltime) |
bool | get_time_from_datetime (MYSQL_TIME *ltime) |
bool | get_time_from_numeric (MYSQL_TIME *ltime) |
bool | get_time_from_non_temporal (MYSQL_TIME *ltime) |
Representation of IN subquery predicates of the form "left_expr IN (SELECT ...)".
This class has:
This class is not used directly, it is "wrapped" into Item_in_optimizer which provides some small bits of subquery evaluation.
Definition at line 363 of file item_subselect.h.
bool Item_in_subselect::finalize_exists_transform | ( | SELECT_LEX * | select_lex | ) |
Once the decision to use IN->EXISTS has been taken, performs some last steps of this transformation.
Definition at line 142 of file item_subselect.cc.
bool Item_in_subselect::finalize_materialization_transform | ( | JOIN * | join | ) |
Once the decision to use materialization has been taken, performs some last steps of this transformation.
Definition at line 241 of file item_subselect.cc.
|
virtual |
Fix used tables information for a subquery after query transformations. Common actions for all predicates involving subqueries. Most actions here involve re-resolving information for conditions and items belonging to the subquery. Notice that the usage information from underlying expressions is not propagated to the subquery predicate, as it belongs to inner layers of the query operator structure. However, when underlying expressions contain outer references into a select_lex on this level, the relevant information must be updated when these expressions are resolved.
Reimplemented from Item_subselect.
Definition at line 2394 of file item_subselect.cc.
bool Item_in_subselect::init_left_expr_cache | ( | ) |
Initialize the cache of the left operand of the IN predicate.
TRUE | if a memory allocation error occurred |
FALSE | if success |
Definition at line 2416 of file item_subselect.cc.
|
virtual |
This method is used for to:
For more information about view definition query, INFORMATION_SCHEMA query and why they should be generated from the Item-tree,
Reimplemented from Item_exists_subselect.
Reimplemented in Item_allany_subselect.
Definition at line 2366 of file item_subselect.cc.
Item_subselect::trans_res Item_in_subselect::row_value_in_to_exists_transformer | ( | JOIN * | join | ) |
Tranform a (possibly non-correlated) IN subquery into a correlated EXISTS.
Definition at line 2010 of file item_subselect.cc.
Item_subselect::trans_res Item_in_subselect::select_in_like_transformer | ( | JOIN * | join, |
Comp_creator * | func | ||
) |
Prepare IN/ALL/ANY/SOME subquery transformation and call appropriate transformation function.
To decide which transformation procedure (scalar or row) applicable here we have to call fix_fields() for left expression to be able to call cols() method on it. Also this method make arena management for underlying transformation methods.
join | JOIN object of transforming subquery |
func | creator of condition function of subquery |
RES_OK | OK |
RES_REDUCE | OK, and current subquery was reduced during transformation |
RES_ERROR | Error |
Definition at line 2273 of file item_subselect.cc.
Item_subselect::trans_res Item_in_subselect::single_value_in_to_exists_transformer | ( | JOIN * | join, |
Comp_creator * | func | ||
) |
Transofrm an IN predicate into EXISTS via predicate injection.
The transformation injects additional predicates into the subquery (and makes the subquery correlated) as follows.
If the subquery has aggregates, GROUP BY, or HAVING, convert to
SELECT ie FROM ... HAVING subq_having AND trigcond(oe $cmp$ ref_or_null_helper<ie>)
the addition is wrapped into trigger only when we want to distinguish between NULL and FALSE results.
Otherwise (no aggregates/GROUP BY/HAVING) convert it to one of the following:
= If we don't need to distinguish between NULL and FALSE subquery:
SELECT 1 FROM ... WHERE (oe $cmp$ ie) AND subq_where
= If we need to distinguish between those:
SELECT 1 FROM ... WHERE subq_where AND trigcond((oe $cmp$ ie) OR (ie IS NULL)) HAVING trigcond(<is_not_null_test>(ie))
At JOIN::optimize() we will compare costs of materialization and EXISTS; if the former is cheaper we will switch to it.
join | Join object of the subquery (i.e. 'child' join). |
func | Subquery comparison creator |
RES_OK | Either subquery was transformed, or appopriate predicates where injected into it. |
RES_REDUCE | The subquery was reduced to non-subquery |
RES_ERROR | Error |
Definition at line 1712 of file item_subselect.cc.
|
virtual |
Reimplemented from Item_exists_subselect.
Definition at line 1396 of file item_subselect.cc.
|
virtual |
Return the result of EXISTS as a decimal value
Converts the true/false result into a decimal value. Note that currently this cannot be NULL, so if the query exection fails it will return 0.
decimal_value[out] | Buffer to hold the resulting decimal value |
Pointer | to the converted decimal. Can't be a NULL pointer, as currently EXISTS cannot return NULL. |
Reimplemented from Item_exists_subselect.
Definition at line 1409 of file item_subselect.cc.
Return the result of EXISTS as a string value
Converts the true/false result into a string value. Note that currently this cannot be NULL, so if the query exection fails it will return 0.
decimal_value[out] | buffer to hold the resulting string value |
Pointer | to the converted string. Can't be a NULL pointer, as currently EXISTS cannot return NULL. |
Reimplemented from Item_exists_subselect.
Definition at line 1373 of file item_subselect.cc.
|
protected |
The need for expr cache may be optimized away,
Definition at line 375 of file item_subselect.h.