summaryrefslogtreecommitdiff
path: root/sql/opt_split.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/opt_split.cc')
-rw-r--r--sql/opt_split.cc16
1 files changed, 12 insertions, 4 deletions
diff --git a/sql/opt_split.cc b/sql/opt_split.cc
index 6467706bc0b..37853bdbbe9 100644
--- a/sql/opt_split.cc
+++ b/sql/opt_split.cc
@@ -352,8 +352,9 @@ bool JOIN::check_for_splittable_materialized()
Field *ord_field= ((Item_field *) (ord_item->real_item()))->field;
- JOIN_TAB *tab= ord_field->table->reginfo.join_tab;
- if (tab->is_inner_table_of_outer_join())
+ /* Ignore fields from of inner tables of outer joins */
+ TABLE_LIST *tbl= ord_field->table->pos_in_table_list;
+ if (tbl->is_inner_table_of_outer_join())
continue;
List_iterator<Item> li(fields_list);
@@ -543,7 +544,14 @@ void TABLE::add_splitting_info_for_key_field(KEY_FIELD *key_field)
added_key_field->level= 0;
added_key_field->optimize= KEY_OPTIMIZE_EQ;
added_key_field->eq_func= true;
- added_key_field->null_rejecting= true;
+
+ Item *real= key_field->val->real_item();
+ if ((real->type() == Item::FIELD_ITEM) &&
+ ((Item_field*)real)->field->maybe_null())
+ added_key_field->null_rejecting= true;
+ else
+ added_key_field->null_rejecting= false;
+
added_key_field->cond_guard= NULL;
added_key_field->sj_pred_no= UINT_MAX;
return;
@@ -862,7 +870,7 @@ SplM_plan_info * JOIN_TAB::choose_best_splitting(double record_count,
table_map tables_usable_for_splitting=
spl_opt_info->tables_usable_for_splitting;
KEYUSE_EXT *keyuse_ext= &join->ext_keyuses_for_splitting->at(0);
- KEYUSE_EXT *best_key_keyuse_ext_start;
+ KEYUSE_EXT *UNINIT_VAR(best_key_keyuse_ext_start);
TABLE *best_table= 0;
double best_rec_per_key= DBL_MAX;
SplM_plan_info *spl_plan= 0;