gregfelice opened a new issue, #2404:
URL: https://github.com/apache/age/issues/2404

   Follow-up from #2347. While tracing the MERGE ON CREATE/MATCH SET crash, I 
confirmed that `transform_cypher_optional_match_clause` at 
`src/backend/parser/cypher_clause.c:3238` carries the same defect that caused 
#2347:
   
   ```c
   jnsitem = addRangeTableEntryForJoin(pstate,
                                       res_colnames,
                                       NULL,            /* <-- nscolumns */
                                       j->jointype,
                                       ...);
   ```
   
   Passing NULL for nscolumns leaves the join ParseNamespaceItem's 
`p_nscolumns` unset. In #2347 this segfaulted whenever `colNameToVar` → 
`scanNSItemForColumn` tried to resolve a column reference against the nsitem 
(PG's `scanNSItemForColumn` indexes `nsitem->p_nscolumns[attnum-1]` without 
null-checking).
   
   I audited the other two `addRangeTableEntryForJoin` call sites in this file 
(lines 717 and 7564); both pass a real nscolumns array. Line 3238 is the only 
remaining NULL.
   
   ### Why it isn't triggered today
   
   Every current path that would resolve an expression against an OPTIONAL 
MATCH's output first runs through `handle_prev_clause`, which wraps the prior 
as a new `RTE_SUBQUERY` with properly-built `p_nscolumns`. The 
incompletely-populated join nsitem is only in `pstate->p_namespace` during 
`transform_cypher_optional_match_clause` itself — and no in-line expression 
resolution happens there today. The jnsitem is also added with 
`addToRelNameSpace=false` (line 3262), so it's column-visible but not 
relation-visible, keeping it out of `refnameNamespaceItem` lookups.
   
   ### Why it's worth fixing
   
   Any future feature that resolves an in-line expression against the OPTIONAL 
MATCH's output (e.g. OPTIONAL MATCH analogues of ON SET, or a WHERE processed 
before the helper returns) will hit the same segfault. The fix is the same 
three-line change made in #2347's follow-up commit (`f0ed4c95`): populate 
`p_nscolumns` from `res_colvars`, using the join rtindex and 1-based eref 
position (Vars inside opaque metadata are not planner-rewritten; see the commit 
message for context).
   
   ### Reproducer
   
   None that triggers the crash from SQL on current master — this is a 
code-level observation, not a user-visible bug. Recording it so it isn't 
rediscovered the hard way.
   
   ### Proposed fix
   
   Mirror the fix pattern from #2347's `transform_merge_make_lateral_join` 
change to `transform_cypher_optional_match_clause`. No regression test is 
feasible until a feature exercises it, but the change is local and the crash 
mode is well understood.
   
   Happy to submit a PR if maintainers want the defensive fix landed now; 
otherwise leaving this open so the next person in the neighborhood sees it.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to