From 2ad681e8483e51897ba052a391537ab6bdc40f9c Mon Sep 17 00:00:00 2001 From: Richard Guo Date: Wed, 3 Jan 2024 18:52:20 +0800 Subject: [PATCH v2] memoize singlerow --- src/backend/optimizer/path/joinpath.c | 2 +- src/test/regress/expected/memoize.out | 27 +++++++++++++++++++++++++++ src/test/regress/sql/memoize.sql | 16 ++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index b2916ad690..c961146526 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -635,7 +635,7 @@ get_memoize_path(PlannerInfo *root, RelOptInfo *innerrel, */ if (extra->inner_unique && (inner_path->param_info == NULL || - list_length(inner_path->param_info->ppi_clauses) < + bms_num_members(inner_path->param_info->ppi_serials) < list_length(extra->restrictlist))) return NULL; diff --git a/src/test/regress/expected/memoize.out b/src/test/regress/expected/memoize.out index f5202430f8..08df8941f8 100644 --- a/src/test/regress/expected/memoize.out +++ b/src/test/regress/expected/memoize.out @@ -348,3 +348,30 @@ RESET max_parallel_workers_per_gather; RESET parallel_tuple_cost; RESET parallel_setup_cost; RESET min_parallel_table_scan_size; +-- Test unique joins when not the entire join condition is parameterized +CREATE TABLE tbl_singlerow(a int primary key, b int); +INSERT INTO tbl_singlerow SELECT i, i FROM generate_series(1,10)i; +ANALYZE tbl_singlerow; +-- Ensure we do not get a Memoize plan +EXPLAIN (COSTS OFF) +SELECT * FROM tbl_singlerow t1 + LEFT JOIN tbl_singlerow t2 ON TRUE + LEFT JOIN tbl_singlerow t3 ON TRUE + LEFT JOIN + LATERAL (SELECT t3.a AS t3a, * FROM tbl_singlerow t4) t4 + ON t4.a = t3.b AND t4.b = t2.b; + QUERY PLAN +------------------------------------------------------ + Nested Loop Left Join + Join Filter: ((t4.a = t3.b) AND (t4.b = t2.b)) + -> Nested Loop Left Join + -> Nested Loop Left Join + -> Seq Scan on tbl_singlerow t1 + -> Materialize + -> Seq Scan on tbl_singlerow t2 + -> Materialize + -> Seq Scan on tbl_singlerow t3 + -> Seq Scan on tbl_singlerow t4 +(10 rows) + +DROP TABLE tbl_singlerow; diff --git a/src/test/regress/sql/memoize.sql b/src/test/regress/sql/memoize.sql index 29ab1ea62d..44b52e730e 100644 --- a/src/test/regress/sql/memoize.sql +++ b/src/test/regress/sql/memoize.sql @@ -181,3 +181,19 @@ RESET max_parallel_workers_per_gather; RESET parallel_tuple_cost; RESET parallel_setup_cost; RESET min_parallel_table_scan_size; + +-- Test unique joins when not the entire join condition is parameterized +CREATE TABLE tbl_singlerow(a int primary key, b int); +INSERT INTO tbl_singlerow SELECT i, i FROM generate_series(1,10)i; +ANALYZE tbl_singlerow; + +-- Ensure we do not get a Memoize plan +EXPLAIN (COSTS OFF) +SELECT * FROM tbl_singlerow t1 + LEFT JOIN tbl_singlerow t2 ON TRUE + LEFT JOIN tbl_singlerow t3 ON TRUE + LEFT JOIN + LATERAL (SELECT t3.a AS t3a, * FROM tbl_singlerow t4) t4 + ON t4.a = t3.b AND t4.b = t2.b; + +DROP TABLE tbl_singlerow; -- 2.31.0