diff --git a/src/backend/columnar/columnar_customscan.c b/src/backend/columnar/columnar_customscan.c index fdf33915ea6..8d0adb39cf9 100644 --- a/src/backend/columnar/columnar_customscan.c +++ b/src/backend/columnar/columnar_customscan.c @@ -1052,6 +1052,10 @@ FindCandidateRelids(PlannerInfo *root, RelOptInfo *rel, List *joinClauses) candidateRelids = bms_del_members(candidateRelids, rel->relids); candidateRelids = bms_del_members(candidateRelids, rel->lateral_relids); + /* + * For the relevant PG16 commit requiring this addition: + * postgres/postgres@2489d76 + */ #if PG_VERSION_NUM >= PG_VERSION_16 candidateRelids = bms_del_members(candidateRelids, root->outer_join_rels); #endif diff --git a/src/test/regress/expected/columnar_join.out b/src/test/regress/expected/columnar_join.out index 3bc3a27503c..a2c0f1467e6 100644 --- a/src/test/regress/expected/columnar_join.out +++ b/src/test/regress/expected/columnar_join.out @@ -356,6 +356,33 @@ ORDER BY 3,4,1,2; 3 | 30 | 6 | 60 (9 rows) +-- Left Join with Mixed Table Types and columnar in the middle +CREATE TABLE tbl_middle_left_heap1 (id integer); +CREATE TABLE tbl_middle_left_heap2 (id integer); +CREATE TABLE tbl_middle_left_columnar (id integer) USING columnar; +INSERT INTO tbl_middle_left_heap1 VALUES (1), (2), (3), (4); +INSERT INTO tbl_middle_left_heap2 VALUES (2), (3), (5), (6); +INSERT INTO tbl_middle_left_columnar VALUES (3), (5), (7); +EXPLAIN (COSTS OFF) +SELECT h1.*, h2.*, c.* +FROM tbl_middle_left_heap1 h1 +LEFT JOIN tbl_middle_left_columnar c ON h1.id = c.id +LEFT JOIN tbl_middle_left_heap2 h2 ON c.id = h2.id +ORDER BY 1; + QUERY PLAN +--------------------------------------------------------------------- +Sort + Sort Key: h1.id + -> Nested Loop Left Join + Join Filter: (c.id = h2.id) + -> Nested Loop Left Join + Join Filter: (h1.id = c.id) + -> Seq Scan on tbl_middle_left_heap1 h1 + -> Custom Scan (ColumnarScan) on tbl_middle_left_columnar c + Columnar Projected Columns: id + -> Seq Scan on tbl_middle_left_heap2 h2 +(10 rows) + -- End test case SET client_min_messages TO warning; DROP SCHEMA am_columnar_join CASCADE; \ No newline at end of file diff --git a/src/test/regress/sql/columnar_join.sql b/src/test/regress/sql/columnar_join.sql index 7fc00888277..9cbfd617763 100644 --- a/src/test/regress/sql/columnar_join.sql +++ b/src/test/regress/sql/columnar_join.sql @@ -163,6 +163,22 @@ FROM tbl_cross_heap h CROSS JOIN tbl_cross_columnar c ORDER BY 3,4,1,2; +-- Left Join with Mixed Table Types and columnar in the middle +CREATE TABLE tbl_middle_left_heap1 (id integer); +CREATE TABLE tbl_middle_left_heap2 (id integer); +CREATE TABLE tbl_middle_left_columnar (id integer) USING columnar; + +INSERT INTO tbl_middle_left_heap1 VALUES (1), (2), (3), (4); +INSERT INTO tbl_middle_left_heap2 VALUES (2), (3), (5), (6); +INSERT INTO tbl_middle_left_columnar VALUES (3), (5), (7); + +EXPLAIN (COSTS OFF) +SELECT h1.*, h2.*, c.* +FROM tbl_middle_left_heap1 h1 +LEFT JOIN tbl_middle_left_columnar c ON h1.id = c.id +LEFT JOIN tbl_middle_left_heap2 h2 ON c.id = h2.id +ORDER BY 1; + -- End test case SET client_min_messages TO warning; DROP SCHEMA am_columnar_join CASCADE;