[ 
https://issues.apache.org/jira/browse/SPARK-60418?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated SPARK-60418:
-----------------------------------
    Labels: pull-request-available  (was: )

> Subexpression elimination evaluates a short-circuited IN list element
> ---------------------------------------------------------------------
>
>                 Key: SPARK-60418
>                 URL: https://issues.apache.org/jira/browse/SPARK-60418
>             Project: Spark
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 4.4.0
>            Reporter: sepuri sai krishna
>            Priority: Minor
>              Labels: pull-request-available
>
> {{In}} stops at the first list element that matches, in both {{eval}} and
> generated code, but a later element is still evaluated ahead of the comparison
> when it is a common subexpression. A query that should return rows then fails.
> ANSI mode, default configuration:
> {code:sql}
> CREATE OR REPLACE TEMP VIEW t AS
>   SELECT cast(id as int) AS b, cast(2147483647 - id as int) AS y FROM 
> range(1);
> SELECT b IN (b, y + 1), b IN (b, y + 1, 7) FROM t;
> -- b matches the first element of both lists, so y + 1 is never needed
> -- expected: true, true
> -- actual:   [ARITHMETIC_OVERFLOW] overflow
> {code}
> Either {{IN}} on its own returns {{true}}, and so does the query with
> {{spark.sql.subexpressionElimination.enabled}} set to {{false}}, so the error
> comes from the elimination rather than from the query. It fails with 
> whole-stage
> codegen both on and off. A list of literals is not affected.
> {{spark.sql.subexpressionElimination.skipForShortcutExpr}}, which exists to 
> stop
> elimination from evaluating short-circuited operands, does not help here: 
> with it
> set to {{true}} the same shape over {{AND}} stops failing, while the {{IN}} 
> query
> above still fails. {{In}} short-circuits the same way, and is already listed
> alongside {{And}} and {{Or}} as conditionally evaluated in
> {{OptimizeCsvJsonExprs}}.
> Verified on master at 8d5b30a06f6.
> ---
> ## Why only one
> The try_* candidate does not hold up. {{try_subtract(cast(s as date), cast(s 
> as
> date))}} does raise with elimination on and return NULL with it off, but NULL 
> is
> not what try_* promises:
> - the numeric path, {{try_subtract(cast(s as int), 1)}}, raises the operand's
>   CAST_INVALID_INPUT in every mode, so try_* does not swallow operand errors 
> by
>   design;
> - what the docs promise is NULL on the operation's own overflow, and
>   {{try_add(date '2020-01-01', make_ym_interval(178956970, 0))}} returns NULL 
> in
>   every mode, elimination on or off;
> - the non-numeric path swallows operand errors only incidentally, because
>   {{TryEval}} wraps the whole subtree, and the code carries a
>   "TODO: support TRY eval mode on datetime arithmetic expressions" there.
> So with elimination on, the non-numeric path becomes consistent with the 
> numeric
> one. Filing it as "try_* raises instead of returning NULL" would be arguing 
> for
> the anomalous behaviour.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to