0001-Fix-assertion-failure-in-LATERAL-GRAPH_TABLE-with-mu.patch

application/octet-stream

Filename: 0001-Fix-assertion-failure-in-LATERAL-GRAPH_TABLE-with-mu.patch
Type: application/octet-stream
Part: 0
Message: [Bug]Assertion failure in LATERAL GRAPH_TABLE with multi-label pattern
From ad6c9007ba5d092ee530b3a6e964b05c7ff2c7e7 Mon Sep 17 00:00:00 2001
From: Satya Narlapuram <satyanarlapuram@gmail.com>
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