summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2013-10-17 09:45:31 +0400
committerSergey Petrunya <psergey@askmonty.org>2013-10-17 09:45:31 +0400
commitdd6bd8bfbdbca81d356fcc30230cce0dedc3da84 (patch)
treeb618293f545ca1f2eb2dd11b73addb8f8ee2b6d5
parentb88bf50ec138fbe3844a5859d884347c413dbf0d (diff)
downloadmariadb-git-dd6bd8bfbdbca81d356fcc30230cce0dedc3da84.tar.gz
Fix valgrind failure in subselect3.test, "Conditional jump or move
depends on uninitialised value(s) in JOIN::save_explain_data_intern" - Make find_best() /* the old join optimizer code */ also use table condition selectivity.
-rw-r--r--sql/sql_select.cc27
1 files changed, 20 insertions, 7 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index be736fe0ef8..23f504f602c 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -108,7 +108,7 @@ C_MODE_END
tested and approved.
*/
static bool find_best(JOIN *join,table_map rest_tables,uint index,
- double record_count,double read_time);
+ double record_count,double read_time, uint use_cond_selectivity);
static uint cache_record_length(JOIN *join,uint index);
bool get_best_combination(JOIN *join);
static store_key *get_store_key(THD *thd,
@@ -6376,8 +6376,11 @@ choose_plan(JOIN *join, table_map join_tables)
the greedy version. Will be removed when greedy_search is approved.
*/
join->best_read= DBL_MAX;
- if (find_best(join, join_tables, join->const_tables, 1.0, 0.0))
+ if (find_best(join, join_tables, join->const_tables, 1.0, 0.0,
+ use_cond_selectivity))
+ {
DBUG_RETURN(TRUE);
+ }
}
else
{
@@ -7576,7 +7579,7 @@ best_extension_by_limited_search(JOIN *join,
*/
static bool
find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
- double read_time)
+ double read_time, uint use_cond_selectivity)
{
DBUG_ENTER("find_best");
THD *thd= join->thd;
@@ -7627,20 +7630,30 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
advance_sj_state(join, rest_tables, idx, &current_record_count,
&current_read_time, &loose_scan_pos);
- if (best_record_count > current_record_count ||
+ double pushdown_cond_selectivity= 1.0;
+ if (use_cond_selectivity > 1)
+ pushdown_cond_selectivity= table_cond_selectivity(join, idx, s,
+ rest_tables &
+ ~real_table_bit);
+ join->positions[idx].cond_selectivity= pushdown_cond_selectivity;
+ double partial_join_cardinality= current_record_count *
+ pushdown_cond_selectivity;
+
+ if (best_record_count > partial_join_cardinality ||
best_read_time > current_read_time ||
(idx == join->const_tables && s->table == join->sort_by_table))
{
- if (best_record_count >= current_record_count &&
+ if (best_record_count >= partial_join_cardinality &&
best_read_time >= current_read_time &&
(!(s->key_dependent & rest_tables) || records < 2.0))
{
- best_record_count=current_record_count;
+ best_record_count= partial_join_cardinality;
best_read_time=current_read_time;
}
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
if (find_best(join,rest_tables & ~real_table_bit,idx+1,
- current_record_count,current_read_time))
+ partial_join_cardinality,current_read_time,
+ use_cond_selectivity))
DBUG_RETURN(TRUE);
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
}