[
https://issues.apache.org/jira/browse/FLINK-41279?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated FLINK-41279:
-----------------------------------
Labels: pull-request-available (was: )
> Support the :: infix cast operator
> ----------------------------------
>
> Key: FLINK-41279
> URL: https://issues.apache.org/jira/browse/FLINK-41279
> Project: Flink
> Issue Type: New Feature
> Components: Table SQL / API
> Reporter: Ramin Gharib
> Assignee: Ramin Gharib
> Priority: Major
> Labels: pull-request-available
>
> Flink SQL only supports {{CAST(x AS type)}}. PostgreSQL, DuckDB and Snowflake
> also accept the shorter infix form {{x::type}}, and Calcite supports it in
> its Babel parser. These statements fail to parse in Flink today:
> {code:sql}
> SELECT '42'::INT + 1; -- CAST('42' AS INT) + 1
> SELECT payload::VARIANT FROM t; -- CAST(payload AS VARIANT)
> SELECT m['k']::INT FROM t; -- CAST(m['k'] AS INT)
> SELECT s::INT::STRING FROM t; -- CAST(CAST(s AS INT) AS STRING)
> {code}
> h3. Proposal
> Treat {{::}} as pure syntax for {{CAST}}. The parser turns {{x::type}} into a
> plain {{CAST(x AS type)}} call, so validation, planning, code generation and
> compiled plans stay unchanged.
> * Add the {{::}} token and an {{InfixCast}} production through the existing
> {{binaryOperatorsTokens}} and {{extraBinaryExpressions}} hooks in
> {{Parser.tdd}} and {{parserImpls.ftl}}. {{Parser.jj}} stays untouched.
> * The production emits a Flink-side binary operator whose {{createCall}}
> returns a {{CAST}} call. It keeps Calcite's precedence for {{::}}: tighter
> than arithmetic, looser than {{[]}} and {{.}}.
> * The type after {{::}} goes through Flink's {{DataType()}} production, so
> types like {{ARRAY<INT>}}, {{ROW<...>}} and {{VARIANT}} work.
> h3. Why not reuse Calcite's SqlLibraryOperators.INFIX_CAST
> Calcite's operator stays in the validated tree and unparses as {{a :: INT}}.
> That text ends up in persisted catalog state, such as view expanded queries,
> computed columns and materialized table definition queries, and older Flink
> versions can't parse it. The unparse format also belongs to Calcite:
> CALCITE-7475 changed it in Calcite 1.42. Desugaring in the parser keeps all
> stored text as {{CAST(a AS INT)}} and leaves no new operator for later
> Calcite upgrades to track.
> h3. Out of scope
> * Table API. {{BaseExpressions#cast}} already covers it.
> * A {{TRY_CAST}} counterpart. PostgreSQL has none.
> * Postfix access directly after the type, like {{x::ARRAY<INT>[1]}}, which
> Calcite Babel added in CALCITE-7475.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)