From f93b0bbebb4a533bfdd1983017c4d0c4a25110e4 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Fri, 18 Feb 2011 14:17:28 +0300 Subject: [PATCH] MWL#90: subquery optimizations - Remove redundant changes againist 5.3-main --- sql/item_subselect.cc | 8 ++++---- sql/sql_base.cc | 1 + sql/sql_class.cc | 3 ++- sql/sql_join_cache.cc | 33 +-------------------------------- sql/sql_select.cc | 12 +++++------- sql/sql_select.h | 5 ++--- sql/table.h | 2 +- 7 files changed, 16 insertions(+), 48 deletions(-) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 356d2e9d797..c0651857101 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -3587,7 +3587,7 @@ subselect_hash_sj_engine::get_strategy_using_schema() bitmap_set_bit(&partial_match_key_parts, i); ++count_partial_match_columns; } - }; + } } /* If no column contains NULLs use regular hash index lookups. */ @@ -3787,7 +3787,8 @@ bitmap_init_memroot(MY_BITMAP *map, uint n_bits, MEM_ROOT *mem_root) reexecution. @param tmp_columns the items that produce the data for the temp table - @param subquery_id subquery's identifier (for temptable name) + @param subquery_id subquery's identifier (to make "" name for + EXPLAIN) @details - Create a temporary table to store the result of the IN subquery. The @@ -3803,7 +3804,7 @@ bitmap_init_memroot(MY_BITMAP *map, uint n_bits, MEM_ROOT *mem_root) @retval FALSE otherwise */ -bool subselect_hash_sj_engine::init_permanent(List *tmp_columns, +bool subselect_hash_sj_engine::init_permanent(List *tmp_columns, uint subquery_id) { /* Options to create_tmp_table. */ @@ -3998,7 +3999,6 @@ subselect_hash_sj_engine::make_unique_engine() tab->table= tmp_table; tab->ref.tmp_table_index_lookup_init(thd, tmp_key, it, FALSE); - DBUG_RETURN(new subselect_uniquesubquery_engine(thd, tab, item, semi_join_conds)); } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index e6331f065f0..43af95ae53d 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -7788,6 +7788,7 @@ bool setup_tables(THD *thd, Name_resolution_context *context, } DBUG_ASSERT(item == table_list->jtbm_subselect); table_list->jtbm_subselect->setup_engine(FALSE); + //psergey-merge: ^ todo: error checking! } } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 23bf26ce6b1..084e2c8d78c 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3033,7 +3033,8 @@ bool select_dumpvar::send_eof() } -bool select_materialize_with_stats:: +bool +select_materialize_with_stats:: create_result_table(THD *thd_arg, List *column_types, bool is_union_distinct, ulonglong options, const char *table_alias, bool bit_fields_as_long) diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index 68cb0c86adb..134af78d43b 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -1061,7 +1061,6 @@ int JOIN_CACHE::realloc_buffer() */ int JOIN_CACHE::init() -//psergey-merge:wtf is this here: for (tab= start_tab; tab != join_tab; tab= next_linear_tab(join, tab, TRUE)) { DBUG_ENTER("JOIN_CACHE::init"); @@ -3260,23 +3259,7 @@ uint JOIN_CACHE_HASHED::get_next_key(uchar ** key) int JOIN_TAB_SCAN::open() { - //psergey-merge: todo: check the below: - //JOIN_TAB *bound= join_tab-cache->tables; - -#if 0 - JOIN_TAB *bound= cache->start_tab; - - // psergey-todo-merge: can we really iterate backwards? - // Q: is there really a need to iterate backwards? - - for (JOIN_TAB *tab= join_tab-1; tab != bound && !tab->cache; tab--) - { - tab->status= tab->table->status; - tab->table->status= 0; - } -#endif save_or_restore_used_tabs(join_tab, FALSE); - is_first_record= TRUE; return join_init_read_record(join_tab); } @@ -3381,12 +3364,7 @@ void save_or_restore_used_tabs(JOIN_TAB *join_tab, bool save) void JOIN_TAB_SCAN::close() { -#if 0 - JOIN_TAB *bound= join_tab - cache->tables; - for (JOIN_TAB *tab= join_tab-1; tab != bound && !tab->cache; tab--) - tab->table->status= tab->status; -#endif - save_or_restore_used_tabs(join_tab, TRUE); + save_or_restore_used_tabs(join_tab, TRUE); } @@ -3786,15 +3764,6 @@ int JOIN_TAB_SCAN_MRR::open() /* Dynamic range access is never used with BKA */ DBUG_ASSERT(join_tab->use_quick != 2); -/* -psergey-merge: done? - JOIN_TAB *bound= join_tab - cache->tables; - for (JOIN_TAB *tab= join_tab-1; tab != bound && !tab->cache; tab--) - { - tab->status= tab->table->status; - tab->table->status= 0; - } -*/ save_or_restore_used_tabs(join_tab, FALSE); init_mrr_buff(); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c79ab1a7501..b8cd4713dc7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2827,7 +2827,7 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables_arg, COND *conds, SARGABLE_PARAM *sargables= 0; JOIN_TAB *stat_vector[MAX_TABLES+1]; DBUG_ENTER("make_join_statistics"); - + LINT_INIT(table); /* inited in all loops */ table_count=join->tables; @@ -2842,7 +2842,7 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables_arg, COND *conds, stat_end=stat+table_count; found_const_table_map= all_table_map=0; const_count=0; - + for (s= stat, i= 0; tables; s++, tables= tables->next_leaf, i++) @@ -2876,7 +2876,7 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables_arg, COND *conds, if (tables->schema_table) table->file->stats.records= 2; table->quick_condition_rows= table->file->stats.records; - + s->on_expr_ref= &tables->on_expr; if (*s->on_expr_ref) { @@ -2931,7 +2931,6 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables_arg, COND *conds, no_rows_const_tables |= table->map; } } - stat_vector[i]=0; join->outer_join=outer_join; @@ -6498,7 +6497,7 @@ static Item * const null_ptr= NULL; fix_semijoin_strategies_for_picked_join_order) - create join->join_tab array and put there the JOIN_TABs in the join order - create data structures describing ref access methods. - + NOTE In this function we switch from pre-join-optimization JOIN_TABs to post-join-optimization JOIN_TABs. This is achieved by copying the entire @@ -6530,7 +6529,7 @@ get_best_combination(JOIN *join) used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read fix_semijoin_strategies_for_picked_join_order(join); - + JOIN_TAB_RANGE *root_range= new JOIN_TAB_RANGE; root_range->start= join->join_tab; /* root_range->end will be set later */ @@ -7057,7 +7056,6 @@ inline void add_cond_and_fix(Item **e1, Item *e2) } - /** Add to join_tab->select_cond[i] "table.field IS NOT NULL" conditions we've inferred from ref/eq_ref access performed. diff --git a/sql/sql_select.h b/sql/sql_select.h index 881f1c3136d..e1e558fceff 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -162,7 +162,7 @@ typedef enum_nested_loop_state RETURN 0 - OK -1 - Record not found - Other - Error + Other - A fatal error */ typedef int (*Read_record_func)(struct st_join_table *tab); @@ -356,7 +356,7 @@ typedef struct st_join_table { fix_semijoin_strategies_for_picked_join_order. */ uint sj_strategy; - + //psergey-merge: todo: stop using this: struct st_join_table *first_sjm_sibling; @@ -446,7 +446,6 @@ typedef struct st_join_table { } void calc_used_field_length(bool max_fl); ulong get_used_fieldlength() - { if (!used_fieldlength) calc_used_field_length(FALSE); diff --git a/sql/table.h b/sql/table.h index b5d55ea7e50..4d72e94ee30 100644 --- a/sql/table.h +++ b/sql/table.h @@ -966,7 +966,7 @@ struct st_table { key_read= 1; file->extra(HA_EXTRA_KEYREAD); DBUG_VOID_RETURN; - } + } /* If TRUE, the table is filled at execution phase (and so, the optimizer should not do things like range analysis or constant table detection on