RyanLin5967 opened a new issue, #25136:
URL: https://github.com/apache/datafusion/issues/25136

   ### Describe the bug
   
   Currently, `CASE` is rewritten into a conjunction, so a `THEN` branch that 
can fail runs on rows the `WHEN` excluded.
   
   
   ### To Reproduce
   
   
   ```sql
   CREATE VIEW t AS SELECT * FROM (VALUES ('1'), ('abc'), ('2')) s(s);
   CREATE VIEW u AS SELECT * FROM (VALUES ('1'), ('2')) s(s);
   
   EXPLAIN SELECT s FROM t WHERE CASE WHEN s ~ '^[0-9]+$' THEN CAST(s AS INT) > 
0 ELSE false END;
   -- FilterExec predicate: CAST(column1 AS Int32) > 0 AND column1 ~ ^[0-9]+$
   
   SELECT s FROM t WHERE s = 'zzz' AND CAST(s AS INT) > 0;
   -- no rows, no error, so an all-false left operand does skip the cast
   
   SELECT s FROM u WHERE CASE WHEN s ~ '^[0-9]+$' THEN CAST(s AS INT) > 0 ELSE 
false END;
   -- 1 and 2, so it only bites once a row would fail the THEN branch
   
   SELECT s FROM t WHERE CASE WHEN s ~ '^[0-9]+$' THEN CAST(s AS INT) > 0 ELSE 
false END;
   -- Cast error: Cannot cast string 'abc' to value of Int32 type
   ```
   
   
   ### Expected behavior
   
   
   `1` and `2`. `CAST(s AS INT)` runs only on rows where the `WHEN` held.
   
   
   
   ### Additional context
   
   The 54.0.0 upgrade guide prescribes this exact `CASE`, "which has 
standardized short-circuit semantics".
   
   With `ELSE false` the rewrite folds to `X AND A`.
   
   datafusion-cli 55.0.0


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


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to