Commit a90d2bd9 authored by igor@rurik.mysql.com's avatar igor@rurik.mysql.com

join_outer.result, join_outer.test:

  Added a test case for bug #9017.
item_cmpfunc.h:
  A wrong not_null_tables method for Item_cond_xor
  caused a conversion of a left join into an inner join
  that was not valid.
parent d1140661
...@@ -836,3 +836,25 @@ id text_id text_data ...@@ -836,3 +836,25 @@ id text_id text_data
1 0 0-SV 1 0 0-SV
2 10 10-SV 2 10 10-SV
DROP TABLE invoice, text_table; DROP TABLE invoice, text_table;
CREATE TABLE t1 (a int PRIMARY KEY, b int);
CREATE TABLE t2 (a int PRIMARY KEY, b int);
INSERT INTO t1 VALUES (1,1), (2,1), (3,1), (4,2);
INSERT INTO t2 VALUES (1,2), (2,2);
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a;
a b a b
1 1 1 2
2 1 2 2
3 1 NULL NULL
4 2 NULL NULL
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a WHERE t1.b=1;
a b a b
1 1 1 2
2 1 2 2
3 1 NULL NULL
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a
WHERE t1.b=1 XOR (NOT ISNULL(t2.a) AND t2.b=1);
a b a b
1 1 1 2
2 1 2 2
3 1 NULL NULL
DROP TABLE t1,t2;
...@@ -595,3 +595,22 @@ SELECT invoice.id, invoice.text_id, text_table.text_data ...@@ -595,3 +595,22 @@ SELECT invoice.id, invoice.text_id, text_table.text_data
WHERE (invoice.id LIKE '%' OR text_table.text_data LIKE '%'); WHERE (invoice.id LIKE '%' OR text_table.text_data LIKE '%');
DROP TABLE invoice, text_table; DROP TABLE invoice, text_table;
#
# Test for bug #9017: left join mistakingly converted to inner join
#
CREATE TABLE t1 (a int PRIMARY KEY, b int);
CREATE TABLE t2 (a int PRIMARY KEY, b int);
INSERT INTO t1 VALUES (1,1), (2,1), (3,1), (4,2);
INSERT INTO t2 VALUES (1,2), (2,2);
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a;
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a WHERE t1.b=1;
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a
WHERE t1.b=1 XOR (NOT ISNULL(t2.a) AND t2.b=1);
DROP TABLE t1,t2;
...@@ -1013,6 +1013,7 @@ class Item_cond_xor :public Item_cond ...@@ -1013,6 +1013,7 @@ class Item_cond_xor :public Item_cond
enum Type type() const { return FUNC_ITEM; } enum Type type() const { return FUNC_ITEM; }
longlong val_int(); longlong val_int();
const char *func_name() const { return "xor"; } const char *func_name() const { return "xor"; }
table_map not_null_tables() const { return and_tables_cache; }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment