| From: | Junwang Zhao <zhjwpku(at)gmail(dot)com> |
|---|---|
| To: | assam258(at)gmail(dot)com |
| Cc: | Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>, Peter Eisentraut <peter(at)eisentraut(dot)org>, zengman <zengman(at)halodbtech(dot)com>, Amit Langote <amitlangote09(at)gmail(dot)com>, Vik Fearing <vik(at)postgresfriends(dot)org>, Ajay Pal <ajay(dot)pal(dot)k(at)gmail(dot)com>, Imran Zaheer <imran(dot)zhir(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
| Subject: | Re: SQL Property Graph Queries (SQL/PGQ) |
| Date: | 2026-03-28 14:23:18 |
| Message-ID: | CAEG8a3+_9z9cdrhEUjAbuk6+ku0w8pQA2n6-j8W8toixah76sA@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi Henson,
On Sat, Mar 28, 2026 at 9:03 PM Henson Choi <assam258(at)gmail(dot)com> wrote:
>
> Hi Ashutosh and Junwang,
>
>> > patch 0002 in the attached patchset implements it this way. It
>> > collects all the element variables before transforming the path
>> > pattern. Later it uses this list to detect non-local variable
>> > references and throws error.
>
>
> I applied both patches (0001 and 0002) and ran some extended testing
> beyond the included regression tests. All non-local cross-references
> are properly rejected across every combination I tried:
>
> vertex <-> edge cross-references:
> - vertex WHERE referencing a later edge (forward) -> ERROR
> - vertex WHERE referencing an earlier edge (backward) -> ERROR
> - edge WHERE referencing a later vertex (forward) -> ERROR
> - edge WHERE referencing an earlier vertex (backward) -> ERROR
>
> longer patterns ()-[]->()-[]->():
> - 3rd vertex -> 1st vertex (long backward) -> ERROR
> - 1st edge -> 3rd vertex (long forward) -> ERROR
> - 2nd vertex -> 1st vertex (adjacent backward) -> ERROR
> - 2nd vertex -> 3rd vertex (adjacent forward) -> ERROR
> - 1st vertex -> 3rd vertex (long forward) -> ERROR
> - all references local -> OK
>
> All combinations -- vertex-vertex, vertex-edge, edge-vertex, adjacent
> and long-distance -- are blocked as expected. Looks good.
>
>> Seeing the comment above transformGraphTablePropertyRef:
>>
>> *
>> * A property reference is parsed as a ColumnRef of the form:
>> * <variable>.<property>. If <variable> is one of the variables bound to an
>> * element pattern in the graph pattern and <property> can be resolved as a
>> * property of the property graph, then we return a GraphPropertyRef node
>>
>> it seems to imply that G041 is supported. Should we update this comment
>> to better reflect the current behavior?
>
>
> Agreed, it would be nice to update the comment to reflect that
> non-local element variable references are now rejected.
>
>>
>> I have a question about this. Why do we allow a ColumnRef to reference a
>> lateral table outside the graph pattern?
>>
>> For example, in the following query:
>>
>> SELECT x1.a, g.*
>> FROM x1,
>> GRAPH_TABLE (
>> myshop
>> MATCH (x1 IS customers WHERE address = 'US')
>> -[IS customer_orders]->(o IS orders)
>> COLUMNS (x1.name AS customer_name,
>> x1.customer_id AS cid,
>> o.order_id)
>> ) g;
>>
>> It’s easy for users to get confused and assume that `address` is a column
>> of customers rather than the outside x1.
>
>
>
>
> GRAPH_TABLE has implicit LATERAL semantics per the SQL standard
> (ISO/IEC 9075-16, Syntax Rule 5 of Subclause 7.6: <graph table derived
> table> is added to the list of <table primary>s that support lateral
> join), so referencing outer FROM items is expected behavior.
Okay, thanks for sharing this. My copy of SQL/PGQ seems
incomplete, it only includes subclauses 7.1 and 7.2 ;(
>
> When the FROM table name doesn't conflict with an element variable,
> lateral references work as expected:
>
> SELECT x2.a, g.*
> FROM x2,
> GRAPH_TABLE (myshop
> MATCH (c IS customers WHERE c.address = 'US'
> AND c.customer_id = x2.a)
> -[IS customer_orders]->(o IS orders)
> COLUMNS (c.name AS customer_name,
> c.customer_id AS cid, o.order_id)) g;
> -- OK: x2.a resolves to lateral table x2
>
> But when the same name is used for both (as in your example with x1),
> qualified references are always captured by the element variable:
>
> SELECT x1.a, g.*
> FROM x1,
> GRAPH_TABLE (myshop
> MATCH (x1 IS customers WHERE x1.address = 'US')
> -[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: non-local element variable reference is not supported
> -- x1.a is recognized as element variable x1, not lateral table x1
>
> I agree this can be a bit confusing for users, but given that PGQ is
> still in its early stage, prioritizing stability seems reasonable
> for now. This should be resolved once G041 support is added in the
> future.
Agreed, thanks.
>
> Best Regards,
> Henson
--
Regards
Junwang Zhao
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Andrew Dunstan | 2026-03-28 14:27:30 | astreamer fixes |
| Previous Message | Joe Conway | 2026-03-28 14:14:04 | Re: RFC: pg_stat_logmsg |