[
https://issues.apache.org/jira/browse/CALCITE-7927?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Atharv Rastogi reassigned CALCITE-7927:
---------------------------------------
Assignee: Atharv Rastogi
> RexSimplify removes required casts around nested dynamic parameters
> -------------------------------------------------------------------
>
> Key: CALCITE-7927
> URL: https://issues.apache.org/jira/browse/CALCITE-7927
> Project: Calcite
> Issue Type: Bug
> Reporter: Atharv Rastogi
> Assignee: Atharv Rastogi
> Priority: Minor
>
> RexSimplify protects a direct CAST around a dynamic parameter from
> elimination, following CALCITE-6346. However, that protection does not cover
> the two nested-cast simplification branches: removing both casts, or removing
> only the inner cast.
> These branches use the parameter’s declared type and precision to determine
> whether a cast is lossless. Removing a cast can change results when the
> simplified expression is pushed down through the JDBC adapter.
> Reproduction:
>
> {code:java}
> SELECT CAST(CAST(? AS VARCHAR(1)) AS CHAR(1))
> FROM T{code}
>
> T contains one row. Bind the parameter using setString(1, "longer-value").
> With HSQLDB:
> * Direct execution of the original SQL returns "l".
> * Execution through Calcite’s JDBC adapter returns "longer-value".
> Calcite simplifies the expression to:
>
> {code:java}
> CAST(? AS CHAR(1)){code}
>
> Preserving the original nested casts restores the result to "l".
> The related rewrite below also occurs when the parameter has a declared
> CHAR(1) or VARCHAR(1) type:
>
> {code:java}
> CAST(CAST(? AS VARCHAR(1)) AS VARCHAR)
> → CAST(? AS VARCHAR){code}
>
> CALCITE-7118 makes Calcite’s Java executor enforce parameter
> padding/truncation, but JDBC pushdown does not use that execution path.
> Therefore, that fix does not prevent this JDBC failure.
> Suggested fix:
> Extend the existing dynamic-parameter protection to both nested-cast
> elimination branches in RexSimplify.simplifyCast. Do not remove these casts
> based solely on a RexDynamicParam’s declared type.
> Validation:
> Reproduced against current upstream main at f8963be2. Applying this
> protection in an isolated probe preserves the nested casts and makes the JDBC
> result match direct database execution. Add focused simplifier tests for both
> branches and a JDBC result-comparison regression test.
> Related issues:
> CALCITE-6346 — JdbcAdapter: Cast for dynamic filter arguments is lost
> CALCITE-7118 — Rex-to-Lix Translation fails to correctly truncate/pad
> RexDynamicParam values
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)