[
https://issues.apache.org/jira/browse/FLINK-40410?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated FLINK-40410:
-----------------------------------
Labels: pull-request-available (was: )
> ClassCastException when constant-folding a VARIANT expression before another
> constant expression
> ------------------------------------------------------------------------------------------------
>
> Key: FLINK-40410
> URL: https://issues.apache.org/jira/browse/FLINK-40410
> Project: Flink
> Issue Type: Bug
> Components: Table SQL / Planner
> Affects Versions: 2.4.0
> Reporter: Moritz Manner
> Assignee: Moritz Manner
> Priority: Minor
> Labels: pull-request-available
>
> When running the query:
> {code:java}
> SELECT JSON_STRING(PARSE_JSON('{}')), PARSE_JSON('{}');{code}
> the output is correct with a single row containing _*{}*_ and _*{}*_ (first
> of type VARCHAR, second of type VARIANT).
> However, by just switching the order of the values to
> {code:java}
> SELECT PARSE_JSON('{}'), JSON_STRING(PARSE_JSON('{}'));{code}
> a ClassCastException is thrown:
> {code:java}
> [ERROR] Could not execute SQL statement. Reason:
> java.lang.ClassCastException: class
> org.apache.flink.types.variant.BinaryVariant cannot be cast to class
> org.apache.flink.table.data.binary.BinaryStringData
> (org.apache.flink.types.variant.BinaryVariant and
> org.apache.flink.table.data.binary.BinaryStringData are in unnamed module of
> loader 'app') {code}
> *Root cause*
> The ExpressionReducer.scala in *_flink-table-planner_* evaluates constant
> sub-expressions, so they get computed during compile-time and not during
> query run-time.
> It runs in two passes that must agree on which types get a slot in the
> intermediate (compile-time) result:
> * Phase 1 excludes unsupported "object literal" types
> (ROW/ARRAY/MAP/MULTISET/...) from compile-time evaluation. VARIANT is missing
> from this list and is therefore evaluated at compile-time and added to the
> intermediate result list.
> * Phase 2 has an specific case for VARIANT and treats VARIANT as excluded
> from compile-time evaluation. So a VARIANT constant gets evaluated and
> occupies a real slot in phase 1, but phase 2 doesn't know that and never
> advances its slot index. Then the next reduced expression reads the stale
> slot containing the VARIANT data and crashes on the bad cast.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)