Thread

  1. [Bug]Assertion failure in LATERAL GRAPH_TABLE with multi-label pattern

    SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com> — 2026-05-07T04:13:20Z

    Hi hackers,
    
    A LATERAL GRAPH_TABLE whose pattern matches more than one path query
    fails with the assert
    
    TRAP: failed Assert("!bms_is_member(rti, lateral_relids)"), File:
    "initsplan.c", Line: 1428, PID: 3586144
    postgres: postgres postgres [local]
    SELECT(ExceptionalCondition+0x70)[0x63488e3cc070]
    postgres: postgres postgres [local]
    SELECT(create_lateral_join_info+0x468)[0x63488e14ac28]
    postgres: postgres postgres [local]
    SELECT(query_planner+0x13a)[0x63488e14dfca]
    
    Repro:
    SELECT v1.vname, gt.aname
      FROM v1, LATERAL (SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1 | vl2
    WHERE a.vprop1 = v1.vprop1) COLUMNS (a.vname AS aname)) g) gt
      ORDER BY 1, 2;
    
    Single-label GRAPH_TABLE with the same outer reference works fine.
    rewriteGraphTable() turns the GRAPH_TABLE RTE into a subquery RTE and
    bumps outer Vars by one sublevel.  When the pattern produces multiple
    path queries, generate_setop_from_pathqueries() wraps each one in
    another subquery RTE for the UNION ALL but does not bump again, so the
    lateral reference collapses onto GRAPH_TABLE's own RTE.
    
    Tried fixing this by bumping each lquery's sublevels by 1 before the
    addRangeTableEntry
    ForSubquery() wrap.  Single-pathquery queries skip this path entirely.
    
    Attached a patch with the tests.
    
    
    Thanks,
    Satya