MuhammadTahaNaveed opened a new pull request, #2406:
URL: https://github.com/apache/age/pull/2406

   Two related defects in how AGE handled cypher null inside list-iterating 
constructs.
   
   age_unnest packaged every iterated element as a non-SQL-NULL agtype datum, 
even AGTV_NULL scalars. SQL `IS NULL` / `IS NOT NULL` then couldn't see those 
nulls, so `[x IN [null, 1] WHERE x IS NULL]` dropped the null it was meant to 
keep, and `WHERE x IS NOT NULL` kept the null it was meant to drop. The same 
mismatch surfaced in UNWIND. AGE already treats SQL NULL as the row-level 
representation of cypher null elsewhere (`RETURN null AS v` yields SQL NULL, 
strict operators short-circuit on it); age_unnest now does the same by emitting 
the row with `nulls[0] = true` when the element is AGTV_NULL.
   
   single() previously transformed to `SELECT count(*) FROM unnest(list) AS x 
WHERE pred IS TRUE`, with the grammar wrapping the result as `(subquery) = 1`. 
With the unnest fix, `[null, 5] WHERE x > 0` left one definite true after the 
WHERE filter -> count = 1 -> true. Neo4j returns null because the unknown 
predicate could itself be a second match. Rewritten to a CASE built on 
`count(*) FILTER (WHERE pred IS TRUE)` and `bool_or(pred IS NULL)`:
   
     CASE WHEN count(*) FILTER (WHERE pred IS TRUE) >= 2 THEN false
          WHEN bool_or(pred IS NULL)                     THEN NULL
          WHEN count(*) FILTER (WHERE pred IS TRUE) =  1 THEN true
          ELSE false END
   
   The >=2 arm runs first so two definite trues dominate any unknowns. Fits 
inside the existing make_predicate_case_expr helper alongside all/any/none, 
removes the special-case transform branch and the grammar `= 1` wrap. A small 
`make_count_star_filter_agg` helper mirrors the existing `make_bool_or_agg`. 
Verified against Neo4j for the new edge cases (one-true-plus-null, 
two-trues-plus-null, all-nulls, mixed-true-false-null).
   
   The predicate_functions regression also picks up the corrected behavior of 
any/all/none over null elements: `null > 0` now yields SQL NULL instead of 
being silently treated as true, so the three-valued combinators in those 
functions produce the openCypher results the comments previously documented as 
buggy.


-- 
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