diff options
| author | Tom Lane | 2010-03-28 22:59:34 +0000 |
|---|---|---|
| committer | Tom Lane | 2010-03-28 22:59:34 +0000 |
| commit | b78f6264eba33e2966447572b8261e353df01e59 (patch) | |
| tree | 1b5cfa84c32c6683851d335cfa9cd7dab54ecee5 /src/test | |
| parent | a760893dbda9934e287789d54bbd3c4ca3914ce0 (diff) | |
Rework join-removal logic as per recent discussion. In particular this
fixes things so that it works for cases where nested removals are possible.
The overhead of the optimization should be significantly less, as well.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/join.out | 53 | ||||
| -rw-r--r-- | src/test/regress/sql/join.sql | 31 |
2 files changed, 84 insertions, 0 deletions
diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index ad164e1c02..5fd7d79b45 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -2494,6 +2494,38 @@ select * from int4_tbl a full join int4_tbl b on false; -- -- test join removal -- +begin; +CREATE TEMP TABLE a (id int PRIMARY KEY, b_id int); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a" +CREATE TEMP TABLE b (id int PRIMARY KEY, c_id int); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b" +CREATE TEMP TABLE c (id int PRIMARY KEY); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "c_pkey" for table "c" +INSERT INTO a VALUES (0, 0), (1, NULL); +INSERT INTO b VALUES (0, 0), (1, NULL); +INSERT INTO c VALUES (0), (1); +-- all three cases should be optimizable into a simple seqscan +explain (costs off) SELECT a.* FROM a LEFT JOIN b ON a.b_id = b.id; + QUERY PLAN +--------------- + Seq Scan on a +(1 row) + +explain (costs off) SELECT b.* FROM b LEFT JOIN c ON b.c_id = c.id; + QUERY PLAN +--------------- + Seq Scan on b +(1 row) + +explain (costs off) + SELECT a.* FROM a LEFT JOIN (b left join c on b.c_id = c.id) + ON (a.b_id = b.id); + QUERY PLAN +--------------- + Seq Scan on a +(1 row) + +rollback; create temp table parent (k int primary key, pd int); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "parent_pkey" for table "parent" create temp table child (k int unique, cd int); @@ -2540,3 +2572,24 @@ explain (costs off) -> Seq Scan on child c (5 rows) +-- bug 5255: this is not optimizable by join removal +begin; +CREATE TEMP TABLE a (id int PRIMARY KEY); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a" +CREATE TEMP TABLE b (id int PRIMARY KEY, a_id int); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b" +INSERT INTO a VALUES (0), (1); +INSERT INTO b VALUES (0, 0), (1, NULL); +SELECT * FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); + id | a_id | id +----+------+---- + 1 | | +(1 row) + +SELECT b.* FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); + id | a_id +----+------ + 1 | +(1 row) + +rollback; diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index b0a4ceccf0..d627973a09 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -572,6 +572,24 @@ select * from int4_tbl a full join int4_tbl b on false; -- test join removal -- +begin; + +CREATE TEMP TABLE a (id int PRIMARY KEY, b_id int); +CREATE TEMP TABLE b (id int PRIMARY KEY, c_id int); +CREATE TEMP TABLE c (id int PRIMARY KEY); +INSERT INTO a VALUES (0, 0), (1, NULL); +INSERT INTO b VALUES (0, 0), (1, NULL); +INSERT INTO c VALUES (0), (1); + +-- all three cases should be optimizable into a simple seqscan +explain (costs off) SELECT a.* FROM a LEFT JOIN b ON a.b_id = b.id; +explain (costs off) SELECT b.* FROM b LEFT JOIN c ON b.c_id = c.id; +explain (costs off) + SELECT a.* FROM a LEFT JOIN (b left join c on b.c_id = c.id) + ON (a.b_id = b.id); + +rollback; + create temp table parent (k int primary key, pd int); create temp table child (k int unique, cd int); insert into parent values (1, 10), (2, 20), (3, 30); @@ -590,3 +608,16 @@ explain (costs off) select p.*, linked from parent p left join (select c.*, true as linked from child c) as ss on (p.k = ss.k); + +-- bug 5255: this is not optimizable by join removal +begin; + +CREATE TEMP TABLE a (id int PRIMARY KEY); +CREATE TEMP TABLE b (id int PRIMARY KEY, a_id int); +INSERT INTO a VALUES (0), (1); +INSERT INTO b VALUES (0, 0), (1, NULL); + +SELECT * FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); +SELECT b.* FROM b LEFT JOIN a ON (b.a_id = a.id) WHERE (a.id IS NULL OR a.id > 0); + +rollback; |
