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

ASF GitHub Bot updated FLINK-40826:
-----------------------------------
    Labels: pull-request-available  (was: )

>  Support casting constructed types to VARIANT
> ---------------------------------------------
>
>                 Key: FLINK-40826
>                 URL: https://issues.apache.org/jira/browse/FLINK-40826
>             Project: Flink
>          Issue Type: Sub-task
>          Components: Table SQL / API
>            Reporter: Ramin Gharib
>            Assignee: Ramin Gharib
>            Priority: Major
>              Labels: pull-request-available
>
> Adds {{CAST}} from primitive types to VARIANT. This ticket adds ARRAY, MAP, 
> ROW, and STRUCTURED sources.
> h3. Rule
> A constructed type casts to VARIANT only if every leaf type does. Each level 
> maps to its VARIANT shape, and each leaf is cast by the primitive rule. A 
> leaf without a VARIANT kind rejects the whole cast at validation time.
> ||Source type||Stored VARIANT shape||
> |ARRAY<T>|array, each element cast from T|
> |MAP<K, V>|object, K must be a character string, each value cast from V|
> |ROW, STRUCTURED|object keyed by field name|
> {code:sql}
> CAST(ARRAY[1, 2, 3] AS VARIANT)                  -- [1,2,3]
> CAST(ARRAY[1, NULL] AS VARIANT)                  -- [1,null], a NULL element 
> becomes a variant null
> CAST(MAP['a', 1, 'b', 2] AS VARIANT)             -- \{"a":1,"b":2}
> CAST(r AS VARIANT)                               -- \{"id":7,"name":"ada"} 
> for r ROW<id INT, name STRING>
> CAST(r AS VARIANT)                               -- \{"id":1,"tags":[1,2]} 
> for r ROW<id INT, tags VARIANT>
> CAST(MAP[1, 'a'] AS VARIANT)                     -- fails at validation, keys 
> are not stringified
> CAST(ARRAY[INTERVAL '1' DAY] AS VARIANT)         -- fails at validation, the 
> leaf has no VARIANT kind
> CAST(MULTISET[1, 1] AS VARIANT)                  -- fails at validation
> {code}
>  * A NULL element, map value, or field becomes a variant null, so the array 
> length and the object shape are kept. A NULL top-level value stays SQL NULL.
>  * A nested VARIANT is embedded as is.
>  * Field order is not kept, since a variant object is ordered by key.
>  * An empty array, map, or row becomes an empty array or object.
> This can be delivered in three PRs, ARRAY, then MAP, then ROW and STRUCTURED, 
> like the opposite direction in FLINK-37926.
> h3. Open question
> Which keys should an unnamed row get? The SQL row constructor {{ROW(7, 
> 'ada')}} carries planner-generated field names that are not user-facing.



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

Reply via email to