Thread

  1. SQL/PGQ: Support multi-pattern path matching in GRAPH_TABLE

    Henson Choi <assam258@gmail.com> — 2026-04-24T04:44:26Z

    Hi hackers,
    
    Now that the SQL/PGQ core has been committed, I'd like to propose
    extending GRAPH_TABLE to accept multiple path patterns in the MATCH
    clause, i.e. the comma-separated form:
    
        SELECT ... FROM GRAPH_TABLE (g
            MATCH <path_pattern_1>, <path_pattern_2>, ...
            COLUMNS (...)
        );
    
    This shape is not supported today — the parser rejects it with
    
        multiple path patterns in one GRAPH_TABLE clause not supported
    
    and the rewriter asserts that the path_pattern_list has exactly one
    entry. Among the features that are not yet covered, I think this one
    has the highest practical need: many realistic graph queries express
    joins and star-shaped traversals most naturally as multiple
    comma-separated patterns, and without it those queries have to be
    rewritten into more awkward forms. The attached patch lifts the
    restriction and wires the existing path-rewriting pipeline through
    the list of path patterns.
    
    What the patch does
    -------------------
    
    Parser side: the error that rejected multi-pattern MATCH is
    removed, so such queries now reach the rewriter.
    
    Rewriter side: each path pattern is processed as its own chain,
    so adjacency linking never crosses a path boundary.  Element
    variables that share a name across paths are still merged into
    the same element — shared variables produce joins, disconnected
    paths produce cross products.
    
    An earlier version flattened all element patterns into a single
    list, but that treated elements from adjacent paths as adjacent
    within one path and broke on vertex-vertex boundaries.  The
    per-path approach is the minimal fix; a more principled cross-path
    join construction is left for this thread to settle.
    
    Examples
    --------
    
    Shared variable (join):
    
        MATCH (a IS vl1)-[e1 IS el1]->(b IS vl2),
              (b)-[e2 IS el2]->(c IS vl3)
    
        -- b is shared -> the two patterns are joined on b.
    
    Star/hub:
    
        MATCH (a IS vl1)-[]->(b IS vl2),
              (a)-[]->(c IS vl3),
              (d IS vl2)-[]->(a)
    
        -- three patterns meeting at a.
    
    Disconnected patterns (cross product):
    
        MATCH (a IS vl1), (b IS vl3)
    
    Partial connection mixed with a disconnected piece:
    
        MATCH (a)-[]->(b), (b)-[]->(c), (d IS vl1)
    
    Status
    ------
    
    I would appreciate feedback along these axes:
    
      * standard conformance — whether the shape and the handling of
        multi-pattern MATCH are aligned with SQL/PGQ (ISO/IEC 9075-16);
      * semantics — whether the behavior on shared variables,
        disconnected patterns, and their combinations is the right one;
      * functionality — coverage gaps, cases the patch does not yet
        handle, or constructs that should be rejected but currently are
        not (and vice versa);
      * robustness — correctness under edge cases, error handling, and
        anything that could destabilize the existing GRAPH_TABLE path;
      * code shape — whether generate_queries_for_path_pattern() has
        grown large enough that the per-path body should be factored
        out into a helper.  I kept the function intact in this round,
        but would gladly split it if reviewers prefer that.
    
    Review comments, objections, and alternative approaches are all
    welcome — please don't hesitate to push back on anything that looks
    off.
    
    Thanks,
    Henson
    
    Reference to the SQL/PGQ main thread:
    
    https://postgr.es/m/CAAAe_zAEEAb=piH4n-mZUhqcL=oKbDv4v-_7C_7KyXroem=HUg@mail.gmail.com