summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorunknown <igor@rurik.mysql.com>2004-10-04 22:26:36 -0700
committerunknown <igor@rurik.mysql.com>2004-10-04 22:26:36 -0700
commitdc25de58e58bf64c82e290b5c625fb68caa82953 (patch)
treec47a3c7624dcde60e441e64b81dc6251c6491495 /sql/sql_select.cc
parent2f9c7c0b09fd652b1e3523c46973371743782380 (diff)
downloadmariadb-git-dc25de58e58bf64c82e290b5c625fb68caa82953.tar.gz
join_outer.result, join_outer.test:
Added a test case for bug #5896. sql_select.cc: Fixed the problem of ignoring on expressions depending only on outer table when outer table either contains 1 row or is guaranteed to return only 1 row (bug #5896). sql/sql_select.cc: Fixed the problem of ignoring on expressions depending only on outer tables when outer tables either contained 1 row or is guaranteed to return not more than 1 row. (bug #5896). mysql-test/t/join_outer.test: Added a test case for bug #5896. mysql-test/r/join_outer.result: Added a test case for bug #5896.
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 5d5cb0794f0..e104ac1ca38 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4895,6 +4895,28 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
COND *const_cond=
make_cond_for_table(cond,join->const_table_map,(table_map) 0);
DBUG_EXECUTE("where",print_where(const_cond,"constants"););
+ for (JOIN_TAB *tab= join->join_tab+join->const_tables;
+ tab < join->join_tab+join->tables ; tab++)
+ {
+ if (tab->on_expr)
+ {
+ JOIN_TAB *cond_tab= tab->first_inner;
+ COND *tmp= make_cond_for_table(tab->on_expr,
+ join->const_table_map,
+ (table_map) 0);
+ if (!tmp)
+ continue;
+ tmp= new Item_func_trig_cond(tmp, &cond_tab->not_null_compl);
+ if (!tmp)
+ DBUG_RETURN(1);
+ tmp->quick_fix_field();
+ cond_tab->select_cond= !cond_tab->select_cond ? tmp :
+ new Item_cond_and(cond_tab->select_cond,tmp);
+ if (!cond_tab->select_cond)
+ DBUG_RETURN(1);
+ cond_tab->select_cond->quick_fix_field();
+ }
+ }
if (const_cond && !const_cond->val_int())
{
DBUG_PRINT("info",("Found impossible WHERE condition"));