Try to stabilize flappy test result.
authorTom Lane <[email protected]>
Fri, 29 Mar 2024 14:40:31 +0000 (10:40 -0400)
committerTom Lane <[email protected]>
Fri, 29 Mar 2024 14:40:31 +0000 (10:40 -0400)
This recently-added test case checks the plan of an inner join
between two identical tables.  It's just chance which join order
the planner will pick, and in the presence of any variation in
the underlying statistics, the displayed plan might change.
Add a WHERE condition to break the cost symmetry and hopefully
stabilize matters.

(We're still trying to understand exactly why the underlying
statistics aren't as stable as intended, but this seems like
a good change anyway, since this test would surely bite us
again in future.)

While here, clean up assorted comment spelling, grammar, and
whitespace problems.

Discussion: https://postgr.es/m/4168116.1711720146@sss.pgh.pa.us

src/test/regress/expected/subselect.out
src/test/regress/sql/subselect.sql

index 29b11f11aad44c4e878209b5ce00257f684ee365..9eecdc1e9242671879e1ebd081a7e00c16aef99e 100644 (file)
@@ -1977,7 +1977,7 @@ select * from x for update;
    Output: subselect_tbl.f1, subselect_tbl.f2, subselect_tbl.f3
 (2 rows)
 
--- Pull-up the direct-correlated ANY_SUBLINK
+-- Pull up direct-correlated ANY_SUBLINKs
 explain (costs off)
 select * from tenk1 A where hundred in (select hundred from tenk2 B where B.odd = A.odd);
                          QUERY PLAN                         
@@ -2009,7 +2009,7 @@ WHERE c.odd = b.odd));
 (8 rows)
 
 -- we should only try to pull up the sublink into RHS of a left join
--- but a.hundred is not avaiable.
+-- but a.hundred is not available.
 explain (costs off)
 SELECT * FROM tenk1 A LEFT JOIN tenk2 B
 ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
@@ -2026,7 +2026,7 @@ ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
 (8 rows)
 
 -- we should only try to pull up the sublink into RHS of a left join
--- but a.odd is not avaiable for this.
+-- but a.odd is not available for this.
 explain (costs off)
 SELECT * FROM tenk1 A LEFT JOIN tenk2 B
 ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = a.odd);
@@ -2042,7 +2042,7 @@ ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = a.odd);
            Filter: (odd = a.odd)
 (8 rows)
 
--- should be able to pull up since all the references is available
+-- should be able to pull up since all the references are available.
 explain (costs off)
 SELECT * FROM tenk1 A LEFT JOIN tenk2 B
 ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
@@ -2063,7 +2063,8 @@ ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
 -- we can pull up the sublink into the inner JoinExpr.
 explain (costs off)
 SELECT * FROM tenk1 A INNER JOIN tenk2 B
-ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
+ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd)
+WHERE a.thousand < 750;
                    QUERY PLAN                    
 -------------------------------------------------
  Hash Join
@@ -2071,13 +2072,14 @@ ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
    ->  Hash Join
          Hash Cond: (a.hundred = c.hundred)
          ->  Seq Scan on tenk1 a
+               Filter: (thousand < 750)
          ->  Hash
                ->  HashAggregate
                      Group Key: c.odd, c.hundred
                      ->  Seq Scan on tenk2 c
    ->  Hash
          ->  Seq Scan on tenk2 b
-(11 rows)
+(12 rows)
 
 -- we can pull up the aggregate sublink into RHS of a left join.
 explain (costs off)
index 7c42ebc36fcd75002e9a313c1a737b9c524441aa..75a9b718b2f29f522e83d79addc899f4ad5418a8 100644 (file)
@@ -983,7 +983,7 @@ explain (verbose, costs off)
 with x as (select * from subselect_tbl)
 select * from x for update;
 
--- Pull-up the direct-correlated ANY_SUBLINK
+-- Pull up direct-correlated ANY_SUBLINKs
 explain (costs off)
 select * from tenk1 A where hundred in (select hundred from tenk2 B where B.odd = A.odd);
 
@@ -994,18 +994,18 @@ where A.hundred in (select C.hundred FROM tenk2 C
 WHERE c.odd = b.odd));
 
 -- we should only try to pull up the sublink into RHS of a left join
--- but a.hundred is not avaiable.
+-- but a.hundred is not available.
 explain (costs off)
 SELECT * FROM tenk1 A LEFT JOIN tenk2 B
 ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
 
 -- we should only try to pull up the sublink into RHS of a left join
--- but a.odd is not avaiable for this.
+-- but a.odd is not available for this.
 explain (costs off)
 SELECT * FROM tenk1 A LEFT JOIN tenk2 B
 ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = a.odd);
 
--- should be able to pull up since all the references is available
+-- should be able to pull up since all the references are available.
 explain (costs off)
 SELECT * FROM tenk1 A LEFT JOIN tenk2 B
 ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
@@ -1013,9 +1013,10 @@ ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
 -- we can pull up the sublink into the inner JoinExpr.
 explain (costs off)
 SELECT * FROM tenk1 A INNER JOIN tenk2 B
-ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
+ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd)
+WHERE a.thousand < 750;
 
 -- we can pull up the aggregate sublink into RHS of a left join.
 explain (costs off)
 SELECT * FROM tenk1 A LEFT JOIN tenk2 B
-ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd);
\ No newline at end of file
+ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd);