Hi, *Issue:* The `get_graph_pattern_def()` function omits a leading space before the WHERE keyword when a GRAPH_TABLE graph pattern includes a WHERE clause. This produces incorrectly formatted SQL during reverse-parsing. e.g.
... (o IS orders)WHERE (c.address = 'US'::text) COLUMNS ... Notice the missing space between ) and WHERE. *Root Cause:* The pattern-level WHERE deparse doesn't add a leading space, while the element-level WHERE deparse already does. This inconsistency creates malformed output. *Solution:* The patch changes the pattern-level branch to emit " WHERE " (with leading space) instead of "WHERE ", matching the element-level behavior. Although the SQL still re-parses correctly (making this cosmetic), the formatted output is now correct. Also adds a regression test for whole-pattern WHERE clauses. make check is green. Patch is against master. Thanks, Dhruv Chauhan
From 6a0152a350ae9643d3ff14b79c1b25a60c9c06ae Mon Sep 17 00:00:00 2001 From: Dhruv Chauhan <[email protected]> Date: Sat, 25 Jul 2026 14:28:48 +0530 Subject: [PATCH v1] Fix missing space before WHERE in GRAPH_TABLE deparse `get_graph_pattern_def()` emitted the pattern-level WHERE keyword as "WHERE " with no leading space, so reverse-parsing produced output like "(o IS orders)WHERE (...)". The element-level WHERE deparse in get_path_pattern_expr_def() already prepends a separating space; the pattern-level branch was inconsistent with it. The output still re-parses to the same tree, so this is cosmetic, but the deparsed text is wrong. Emit " WHERE " to match. Add a regression test with a whole-pattern WHERE clause reverse-parsed via `pg_get_viewdef()`. --- src/backend/utils/adt/ruleutils.c | 2 +- src/test/regress/expected/graph_table.out | 13 +++++++++++++ src/test/regress/sql/graph_table.sql | 8 ++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 1b44b7a78d..e697fb66da 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8134,7 +8134,7 @@ get_graph_pattern_def(GraphPattern *graph_pattern, deparse_context *context) if (graph_pattern->whereClause) { - appendStringInfoString(buf, "WHERE "); + appendStringInfoString(buf, " WHERE "); get_rule_expr(graph_pattern->whereClause, context, false); } } diff --git a/src/test/regress/expected/graph_table.out b/src/test/regress/expected/graph_table.out index 46566b2e32..3854a5069d 100644 --- a/src/test/regress/expected/graph_table.out +++ b/src/test/regress/expected/graph_table.out @@ -1004,6 +1004,19 @@ SELECT pg_get_viewdef('customers_us'::regclass); ORDER BY g.customer_name, g.product_name; (1 row) +-- Reverse-parse a WHERE clause on the whole graph pattern. +CREATE VIEW customers_us_where AS +SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders) + WHERE c.address = 'US' + COLUMNS (c.name AS customer_name)); +SELECT pg_get_viewdef('customers_us_where'::regclass); + pg_get_viewdef +------------------------------------------------------------------------------------------------------------------------------------------------------------------- + SELECT customer_name + + FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders) WHERE ((c.address)::text = 'US'::text) COLUMNS (c.name AS customer_name)); +(1 row) + +DROP VIEW customers_us_where; -- test view/graph nesting CREATE VIEW customers_view AS SELECT customer_id, 'redacted' || customer_id AS name_redacted, address FROM customers; SELECT * FROM customers; diff --git a/src/test/regress/sql/graph_table.sql b/src/test/regress/sql/graph_table.sql index 3fb0e50ddb..4b8b8a38e6 100644 --- a/src/test/regress/sql/graph_table.sql +++ b/src/test/regress/sql/graph_table.sql @@ -559,6 +559,14 @@ ALTER PROPERTY GRAPH myshop ALTER VERTEX TABLE products -- ruleutils reverse parsing SELECT pg_get_viewdef('customers_us'::regclass); +-- Reverse-parse a WHERE clause on the whole graph pattern. +CREATE VIEW customers_us_where AS +SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders) + WHERE c.address = 'US' + COLUMNS (c.name AS customer_name)); +SELECT pg_get_viewdef('customers_us_where'::regclass); +DROP VIEW customers_us_where; + -- test view/graph nesting CREATE VIEW customers_view AS SELECT customer_id, 'redacted' || customer_id AS name_redacted, address FROM customers; -- 2.34.1
