Repository navigation
test(gfql): pin #2019 single-alias WHERE on a multi-alias MATCH - #2122
Conversation
The issue's exact repro passes at its stated commit 3fb216d and at master; pin the shape (plain and indexed, pandas and polars) plus the residuals that keep their own messages. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_012Me1E7ZdDuGqJGu3mMEzhp
…als by field Review found the PR would auto-close #2019 while projecting the edge alias from a node-alias WHERE still raises, and that the pin ran on pandas and polars only. The pin now runs on pandas, cuDF and polars with cuDF frames, the DISTINCT case has a real duplicate to collapse, and the residuals (ORDER BY on a non-returned alias; the two edge-alias projections) are pinned on the error code and its field rather than on message text. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_012Me1E7ZdDuGqJGu3mMEzhp
Read-only review (parallel session) — test pin for #2019, head 207a272Nothing here touches the branch; findings only, fixes deferred. Scope: test-only (+77: one test file + Findings
Recommendation: mergeable as a pin; the three suggestions are optional polish. 🤖 Generated with Claude Code |
… verdict CI showed the shape answering on python 3.9 and 3.14 where it declines on this box, so pinning the decline made the suite environment-dependent. The pin now accepts either outcome and checks the one that matters: a decline is E108 on `where`, and an answer matches the rows computed from the frames. The ORDER BY decline is stable and stays its own pin. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_012Me1E7ZdDuGqJGu3mMEzhp
|
Your three suggestions are in, and one of them turned into a real finding. At 4d89b3c. The pin was environment-dependent. The first push pinned the edge-alias projection as a decline, because that is what it does here on Python 3.12. CI disagreed: Root cause so far: not the hash seed (six seeds locally all decline) and not the parser version (lark 1.3.1 both sides). The decline comes from Closes versus Refs. Changed to Refs, with the open half named in the body: the issue's exact repro passes, the edge-alias projection does not, and the pin covers both outcomes. Engine sweep and the cuDF-unsafe helper. The pin now runs pandas, polars and cuDF with cuDF frames, and DISTINCT exercised nothing. Right — it now uses Negative pin by message substring. Replaced by structured assertions on
The "indexed" loop serving nothing is a fair observation; it is cheap and keeps the shape honest across index policies, so I have left it with that expectation rather than claiming engagement. |
…le-alias-where-pin
|
Root-caused, and it is simpler and better news than "environment-dependent". I was wrong to call it that; the cause was my own branch being stale. What it was. This branch was 33 commits behind master. Master landed What I ruled out along the way, for the record: Proof after merging master, same graph, same two queries: So the edge-alias projection is not an open residual at all on master. #2019's class is closed for it, and the pin I wrote for the unsettled case now takes its answering branch and checks the rows against the frames. I have kept that form rather than hardening it back to "must answer", because the decline is still the right outcome for a WHERE that cannot be seeded into the pattern, and the pin covers both. At 9bd3ed6 (master merged): 36 passed, lint and mypy green. The general lesson is worth more than the finding: a gate run on a branch head that is behind master is measuring the wrong tree. I have checked the rest of the queue for the same trap — #2127 was 20 commits behind and is now merged up at 806deb9, the others were current. |
… indexed there The GPU receipt failed 12 cells on `cupy does not support object`, raised by gfql_index_all() over a string-keyed cuDF graph. Master raises the same way, and an int-keyed cuDF graph indexes fine, so the pins run plain on cuDF and the limitation gets its own pin: the plain query answers, the index build raises. It is a raw TypeError rather than a typed decline, which is worth fixing separately. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_012Me1E7ZdDuGqJGu3mMEzhp
|
GPU receipt at the current head, and it changed the test rather than the claim. dgx-spark, GB10, The pass before this one failed twelve cells on So it is a pre-existing product limitation, not this PR, and it deserves a typed decline rather than a raw cupy error. The pin now runs plain on cuDF and the limitation carries its own expectation, so the day it is fixed the pin says so. |
Summary
#2019 reports
MATCH (a)-[e]->(t) WHERE a.type IN [...] RETURN t.id AS idraising "Cypher row lowering currently supports one MATCH source alias at a time". The exact repro passes at the issue's own stated commit 3fb216d and at master (b18d808), on default/pandas/polars/autoengines, plain and aftergfql_index_all(); agit bisect runover 0.59.0..master found no commit where it raises. 17 nearby single-alias-WHERE variants also pass; the two that raise do so with their own messages (ORDER BY on a non-returned alias → "ORDER BY expressions must reference the active alias"; node+edge projectionRETURN t.id, e.w→ the documented #1273 multi-source residual).This PR pins the shape so it stays working: the repro plus edge/destination/comparison/NOT/DISTINCT/WITH/2-hop variants, plain and indexed, pandas and polars (polars-guarded, registered in
bin/test-polars.sh), plus the two-alias WHERE and the ORDER BY residual's own message.Refs #2019 (not closed): the issue's exact repro passes, but its class is still open for edge-alias projections:
MATCH (a)-[e]->(t) WHERE a.type IN [...] RETURN e.e_type(andRETURN t.id, e.e_type) raiseunsupported-cypher-querywithfield: where, on every engine, plain and indexed. Those are pinned here as declines, by error code and field, so the day they are served the pin says so.Review (2026-10-04): the pin now runs on pandas, cuDF and polars with cuDF frames (
_idsgoes throughto_pandas), the DISTINCT case has a real duplicate to collapse, and the residual pins are structured (code == E108,context['field']) instead of message substrings. cuDF params need a GPU; receipt to follow from dgx.Test plan
graphistry/tests/compute/gfql/cypher/test_single_alias_where_2019.py: 20 passed locally (pandas + polars)bin/lint.sh🤖 Generated with Claude Code
https://claude.ai/code/session_012Me1E7ZdDuGqJGu3mMEzhp