From ad6c9007ba5d092ee530b3a6e964b05c7ff2c7e7 Mon Sep 17 00:00:00 2001 From: Satya Narlapuram Date: Thu, 7 May 2026 04:08:44 +0000 Subject: [PATCH] Fix assertion failure in LATERAL GRAPH_TABLE with multi-label pattern Bump each lquery's sublevels by 1 before the addRangeTableEntryForSubquery() wrap. --- src/backend/rewrite/rewriteGraphTable.c | 4 ++++ src/test/regress/expected/graph_table.out | 21 +++++++++++++++++++++ src/test/regress/sql/graph_table.sql | 8 ++++++++ 3 files changed, 33 insertions(+) diff --git a/src/backend/rewrite/rewriteGraphTable.c b/src/backend/rewrite/rewriteGraphTable.c index 33d4e866d7..810c4a05d8 100644 --- a/src/backend/rewrite/rewriteGraphTable.c +++ b/src/backend/rewrite/rewriteGraphTable.c @@ -714,6 +714,10 @@ generate_setop_from_pathqueries(List *pathqueries, List **rtable, List **targetl lquery = linitial_node(Query, pathqueries); + /* Wrapping lquery in a subquery RTE adds one query level, so bump + * outer-level Vars accordingly. */ + IncrementVarSublevelsUp((Node *) lquery, 1, 1); + pni = addRangeTableEntryForSubquery(make_parsestate(NULL), lquery, NULL, false, false); *rtable = lappend(*rtable, pni->p_rte); diff --git a/src/test/regress/expected/graph_table.out b/src/test/regress/expected/graph_table.out index cc6d80afd8..067190a690 100644 --- a/src/test/regress/expected/graph_table.out +++ b/src/test/regress/expected/graph_table.out @@ -1044,4 +1044,25 @@ SELECT src.vname, count(*) FROM v1 AS src v13 | 1 (3 rows) +-- Lateral GRAPH_TABLE with multi-label pattern (UNION ALL rewrite) +SELECT v1.vname, gt.aname + FROM v1, LATERAL (SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1 | vl2 WHERE a.vprop1 = v1.vprop1) COLUMNS (a.vname AS aname)) g) gt + ORDER BY 1, 2; + vname | aname +-------+------- + v11 | v11 + v12 | v12 + v13 | v13 +(3 rows) + +SELECT v1.vname, gt.aname + FROM v1, GRAPH_TABLE (g1 MATCH (a WHERE a.vprop1 = v1.vprop1) COLUMNS (a.vname AS aname)) gt + ORDER BY 1, 2; + vname | aname +-------+------- + v11 | v11 + v12 | v12 + v13 | v13 +(3 rows) + -- leave the objects behind for pg_upgrade/pg_dump tests diff --git a/src/test/regress/sql/graph_table.sql b/src/test/regress/sql/graph_table.sql index 0e381ec72b..7655b904c9 100644 --- a/src/test/regress/sql/graph_table.sql +++ b/src/test/regress/sql/graph_table.sql @@ -596,4 +596,12 @@ SELECT src.vname, count(*) FROM v1 AS src HAVING count(*) >= (SELECT count(*) FROM GRAPH_TABLE (g1 MATCH (a IS vl1 | vl2) COLUMNS (a.vname AS n)) WHERE n = src.vname) ORDER BY vname; +-- Lateral GRAPH_TABLE with multi-label pattern (UNION ALL rewrite) +SELECT v1.vname, gt.aname + FROM v1, LATERAL (SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1 | vl2 WHERE a.vprop1 = v1.vprop1) COLUMNS (a.vname AS aname)) g) gt + ORDER BY 1, 2; +SELECT v1.vname, gt.aname + FROM v1, GRAPH_TABLE (g1 MATCH (a WHERE a.vprop1 = v1.vprop1) COLUMNS (a.vname AS aname)) gt + ORDER BY 1, 2; + -- leave the objects behind for pg_upgrade/pg_dump tests -- 2.43.0