From: Peter Eisentraut Date: Mon, 3 Aug 2026 08:14:30 +0000 (+0200) Subject: Fix missing space before WHERE in GRAPH_TABLE deparse X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=780fa49746d57403b871f4ef4c92499b324df32c;p=thirdparty%2Fpostgresql.git 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. Emit " WHERE " to match. The output still re-parses to the same tree, so this is cosmetic. For test coverage, add a whole-pattern WHERE clause to the existing customers_us view, which is already reverse-parsed with pg_get_viewdef(). Author: Dhruv Chauhan Reviewed-by: Ashutosh Bapat Discussion: https://www.postgresql.org/message-id/flat/CANWwWcpHb0h7tg6otRnL-FV83jwQpAiyw1bhvv8T78kpwZ-0ow%40mail.gmail.com --- diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 908134594cb..1d41c06201b 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -8135,7 +8135,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 46566b2e32f..b7a6182457d 100644 --- a/src/test/regress/expected/graph_table.out +++ b/src/test/regress/expected/graph_table.out @@ -965,13 +965,14 @@ SELECT * FROM GRAPH_TABLE (g4 MATCH (s WHERE s.id = 3)-[e]-(d) COLUMNS (s.val, e -- GRAPH_TABLE in views -- The query in the view definition is intentionally complex to test one view with many --- features like label disjunction, lateral references, WHERE clauses in graph --- patterns. +-- features like label disjunction, lateral references, WHERE clauses on graph +-- pattern elements as well as on the whole graph pattern. CREATE VIEW customers_us AS SELECT g.* FROM x1, GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US' AND c.customer_id = x1.a) -[IS customer_orders | customer_wishlists ]-> (l IS orders | wishlists)-[ IS list_items]->(p IS products) + WHERE p.price > 0 COLUMNS (c.name AS customer_name, p.name AS product_name, p.price, x1.a AS a)) g ORDER BY customer_name, product_name; -- Dropping properties or labels used by a view is not allowed @@ -993,14 +994,14 @@ DETAIL: view customers_us depends on property price of property graph myshop HINT: Use DROP ... CASCADE to drop the dependent objects too. -- ruleutils reverse parsing SELECT pg_get_viewdef('customers_us'::regclass); - pg_get_viewdef ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - SELECT g.customer_name, + - g.product_name, + - g.price, + - g.a + - FROM x1, + - GRAPH_TABLE (myshop MATCH (c IS customers WHERE (((c.address)::text = 'US'::text) AND (c.customer_id = x1.a)))-[IS customer_orders|customer_wishlists]->(l IS orders|wishlists)-[IS list_items]->(p IS products) COLUMNS (c.name AS customer_name, p.name AS product_name, p.price AS price, x1.a AS a)) g+ + pg_get_viewdef +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + SELECT g.customer_name, + + g.product_name, + + g.price, + + g.a + + FROM x1, + + GRAPH_TABLE (myshop MATCH (c IS customers WHERE (((c.address)::text = 'US'::text) AND (c.customer_id = x1.a)))-[IS customer_orders|customer_wishlists]->(l IS orders|wishlists)-[IS list_items]->(p IS products) WHERE (p.price > (0)::numeric) COLUMNS (c.name AS customer_name, p.name AS product_name, p.price AS price, x1.a AS a)) g+ ORDER BY g.customer_name, g.product_name; (1 row) diff --git a/src/test/regress/sql/graph_table.sql b/src/test/regress/sql/graph_table.sql index 3fb0e50ddb2..85298f93964 100644 --- a/src/test/regress/sql/graph_table.sql +++ b/src/test/regress/sql/graph_table.sql @@ -539,13 +539,14 @@ SELECT * FROM GRAPH_TABLE (g4 MATCH (s WHERE s.id = 3)-[e]-(d) COLUMNS (s.val, e -- GRAPH_TABLE in views -- The query in the view definition is intentionally complex to test one view with many --- features like label disjunction, lateral references, WHERE clauses in graph --- patterns. +-- features like label disjunction, lateral references, WHERE clauses on graph +-- pattern elements as well as on the whole graph pattern. CREATE VIEW customers_us AS SELECT g.* FROM x1, GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US' AND c.customer_id = x1.a) -[IS customer_orders | customer_wishlists ]-> (l IS orders | wishlists)-[ IS list_items]->(p IS products) + WHERE p.price > 0 COLUMNS (c.name AS customer_name, p.name AS product_name, p.price, x1.a AS a)) g ORDER BY customer_name, product_name; -- Dropping properties or labels used by a view is not allowed