Skip to content

Small questions on corner cases of SJ detection #15

@danolivo

Description

@danolivo
explain (COSTS OFF)
SELECT * FROM pg_am am WHERE am.amname IN (
  SELECT c1.relname AS relname
  FROM pg_class c1
    JOIN pg_class c2
    ON c1.oid=c2.oid AND c1.oid < 10
	JOIN pg_class c3 ON (c3.oid = c2.oid)
);

Result is OK:

 Hash Semi Join
   Hash Cond: (am.amname = c3.relname)
   ->  Seq Scan on pg_am am
   ->  Hash
         ->  Index Scan using pg_class_oid_index on pg_class c3
               Index Cond: ((oid < '10'::oid) AND (oid IS NOT NULL))

Query N0.2:

explain (COSTS OFF)
SELECT * FROM pg_am am WHERE am.amname IN (
  SELECT c1.relname AS relname
  FROM pg_class c1
    JOIN pg_class c2
    ON c1.oid=c2.oid AND c1.oid < 10
	JOIN pg_class c3 ON (c1.oid = 1 AND c3.oid = 1)
);

No one JOIN was deleted:

 Nested Loop Semi Join
   Join Filter: (am.amname = c1.relname)
   ->  Seq Scan on pg_am am
   ->  Materialize
         ->  Nested Loop
               ->  Nested Loop
                     ->  Index Scan using pg_class_oid_index on pg_class c1
                           Index Cond: ((oid < '10'::oid) AND (oid = '1'::oid))
                     ->  Index Only Scan using pg_class_oid_index on pg_class c2
                           Index Cond: (oid = '1'::oid)
               ->  Index Only Scan using pg_class_oid_index on pg_class c3
                     Index Cond: (oid = '1'::oid)

Query N0.3:

SELECT * FROM pg_am am WHERE am.amname IN (
  SELECT c1.relname AS relname
  FROM pg_class c1
    JOIN pg_class c2
    ON c1.oid=c2.oid AND c1.oid < 10
      JOIN pg_class c3 ON (c3.oid = 1 AND c1.oid = 1)
);

Only one JOIN was deleted:

  Nested Loop Semi Join
    Join Filter: (am.amname = c2.relname)
    ->  Seq Scan on pg_am am
    ->  Materialize
          ->  Nested Loop
                ->  Index Scan using pg_class_oid_index on pg_class c2
                      Index Cond: ((oid < '10'::oid) AND (oid IS NOT NULL))
                ->  Index Only Scan using pg_class_oid_index on pg_class c3
                      Index Cond: (oid = '1'::oid)

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingenhancementNew feature or request

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions