summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2003-09-05 11:42:21 +0200
committerunknown <serg@serg.mylan>2003-09-05 11:42:21 +0200
commit6a96751bf0a3ad3d70d1d91fcbd4ea92575b13b0 (patch)
tree0a0e1a4031ff7a056f6ee0cf12509ef2238f9205
parentb59f6efb8d9da700843cee3729f8966705791544 (diff)
downloadmariadb-git-6a96751bf0a3ad3d70d1d91fcbd4ea92575b13b0.tar.gz
bug#926 fix undone - it caused suboptimal execution plan for "range ON, no WHERE" query
Another fix applied
-rw-r--r--sql/sql_select.cc21
1 files changed, 19 insertions, 2 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 153b083b3ef..6f6d21f1f8b 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -146,7 +146,7 @@ static void copy_sum_funcs(Item_sum **func_ptr);
static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab);
static void init_sum_functions(Item_sum **func);
static bool update_sum_func(Item_sum **func);
-static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
+static void select_describe(JOIN *join, bool need_tmp_table,bool need_order,
bool distinct, const char *message=NullS);
static void describe_info(JOIN *join, const char *info);
@@ -2663,13 +2663,30 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
join->thd->select_limit < join->best_positions[i].records_read &&
!(join->select_options & OPTION_FOUND_ROWS)))
{
+ /* Join with outer join condition */
+ COND *orig_cond=sel->cond;
+ sel->cond=and_conds(sel->cond,tab->on_expr);
if (sel->test_quick_select(tab->keys,
used_tables & ~ current_map,
(join->select_options &
OPTION_FOUND_ROWS ?
HA_POS_ERROR :
join->thd->select_limit)) < 0)
- DBUG_RETURN(1); // Impossible range
+ { /* before reporting "Impossible WHERE" for the whole query
+ we have to check isn't it only "impossible ON" instead */
+ sel->cond=orig_cond;
+ if (!tab->on_expr ||
+ sel->test_quick_select(tab->keys,
+ used_tables & ~ current_map,
+ (join->select_options &
+ OPTION_FOUND_ROWS ?
+ HA_POS_ERROR :
+ join->thd->select_limit)) < 0)
+ DBUG_RETURN(1); // Impossible WHERE
+ }
+ else
+ sel->cond=orig_cond;
+
/* Fix for EXPLAIN */
if (sel->quick)
join->best_positions[i].records_read= sel->quick->records;