mirror of
https://github.com/postgres/postgres.git
synced 2026-05-27 03:42:28 -04:00
pg_get_viewdef() and lateral references in COLUMNS of GRAPH_TABLE
Expressions in GRAPH_TABLE COLUMNS list may have lateral references. get_rule_expr() requires lateral namespaces to deparse such references. get_from_clause_item() does not pass them when processing the expressions in COLUMNS list causing ERROR "bogus varlevelsup: 0 offset 0". Fix get_from_clause_item() to pass input deparse_context containing lateral namespaces to get_rule_expr() instead of the dummy context. Author: Satyanarayana Narlapuram <satyanarlapuram@gmail.com> Reviewed-by: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/CAHg%2BQDcLVa2iBnggkHxY4itZbXtDMfsYHEjnCUYe9hNbnxDi-w%40mail.gmail.com
This commit is contained in:
parent
ac3bcc041c
commit
9d2979dd68
3 changed files with 30 additions and 18 deletions
|
|
@ -13091,22 +13091,16 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
|
|||
get_graph_pattern_def(rte->graph_pattern, context);
|
||||
appendStringInfoString(buf, " COLUMNS (");
|
||||
{
|
||||
ListCell *lc;
|
||||
bool first = true;
|
||||
|
||||
foreach(lc, rte->graph_table_columns)
|
||||
foreach_node(TargetEntry, te, rte->graph_table_columns)
|
||||
{
|
||||
TargetEntry *te = lfirst_node(TargetEntry, lc);
|
||||
deparse_context context = {0};
|
||||
|
||||
if (!first)
|
||||
appendStringInfoString(buf, ", ");
|
||||
else
|
||||
first = false;
|
||||
|
||||
context.buf = buf;
|
||||
|
||||
get_rule_expr((Node *) te->expr, &context, false);
|
||||
get_rule_expr((Node *) te->expr, context, false);
|
||||
appendStringInfoString(buf, " AS ");
|
||||
appendStringInfoString(buf, quote_identifier(te->resname));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -264,7 +264,6 @@ SELECT x1.a, g.* FROM x1, GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.addr
|
|||
ERROR: non-local element variable reference is not supported
|
||||
LINE 1: ...tomers WHERE c.address = 'US' AND c.customer_id = x1.a)-[IS ...
|
||||
^
|
||||
DROP TABLE x1;
|
||||
CREATE TABLE v1 (
|
||||
id int PRIMARY KEY,
|
||||
vname varchar(10),
|
||||
|
|
@ -922,14 +921,25 @@ SELECT * FROM GRAPH_TABLE (g4 MATCH (s WHERE s.id = 3)-[e]-(d) COLUMNS (s.val, e
|
|||
(2 rows)
|
||||
|
||||
-- ruleutils reverse parsing
|
||||
CREATE VIEW customers_us AS SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')-[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)) ORDER BY customer_name, product_name;
|
||||
-- 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.
|
||||
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)
|
||||
COLUMNS (c.name AS customer_name, p.name AS product_name, x1.a AS a)) g
|
||||
ORDER BY customer_name, product_name;
|
||||
SELECT pg_get_viewdef('customers_us'::regclass);
|
||||
pg_get_viewdef
|
||||
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
SELECT customer_name, +
|
||||
product_name +
|
||||
FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE ((c.address)::text = 'US'::text))-[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))+
|
||||
ORDER BY customer_name, product_name;
|
||||
pg_get_viewdef
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
SELECT g.customer_name, +
|
||||
g.product_name, +
|
||||
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, x1.a AS a)) g+
|
||||
ORDER BY g.customer_name, g.product_name;
|
||||
(1 row)
|
||||
|
||||
-- test view/graph nesting
|
||||
|
|
|
|||
|
|
@ -162,7 +162,6 @@ SELECT x1.a, g.* FROM x1, GRAPH_TABLE (myshop MATCH (x1 IS customers WHERE x1.ad
|
|||
-- reference is available
|
||||
SELECT x1.a, g.* FROM x1, GRAPH_TABLE (myshop MATCH (x1 IS customers)-[IS customer_orders]->(o IS orders WHERE o.order_id = x1.a) COLUMNS (x1.name AS customer_name, x1.customer_id AS cid, o.order_id)) g; -- error
|
||||
SELECT x1.a, g.* FROM x1, GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US' AND c.customer_id = x1.a)-[IS customer_orders]->(x1 IS orders) COLUMNS (c.name AS customer_name, c.customer_id AS cid, x1.order_id)) g; -- error
|
||||
DROP TABLE x1;
|
||||
|
||||
CREATE TABLE v1 (
|
||||
id int PRIMARY KEY,
|
||||
|
|
@ -525,7 +524,16 @@ SELECT * FROM GRAPH_TABLE (g4 MATCH (s)-[e]-(d) WHERE s.id = 3 COLUMNS (s.val, e
|
|||
SELECT * FROM GRAPH_TABLE (g4 MATCH (s WHERE s.id = 3)-[e]-(d) COLUMNS (s.val, e.val, d.val)) ORDER BY 1, 2, 3;
|
||||
|
||||
-- ruleutils reverse parsing
|
||||
CREATE VIEW customers_us AS SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')-[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)) ORDER BY customer_name, product_name;
|
||||
-- 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.
|
||||
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)
|
||||
COLUMNS (c.name AS customer_name, p.name AS product_name, x1.a AS a)) g
|
||||
ORDER BY customer_name, product_name;
|
||||
SELECT pg_get_viewdef('customers_us'::regclass);
|
||||
|
||||
-- test view/graph nesting
|
||||
|
|
|
|||
Loading…
Reference in a new issue