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

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

> Make VARIANT toString() and result printing never fail
> ------------------------------------------------------
>
>                 Key: FLINK-40828
>                 URL: https://issues.apache.org/jira/browse/FLINK-40828
>             Project: Flink
>          Issue Type: Improvement
>          Components: API / Core, Table SQL / Planner, Table SQL / Runtime
>            Reporter: Ramin Gharib
>            Assignee: Ramin Gharib
>            Priority: Major
>              Labels: pull-request-available
>
> h3. Problem
> {\{Variant#toString()}} delegates to \{{toJson()}}, which throws for values 
> JSON cannot represent. A VARIANT can hold such values, for example NaN from 
> Avro data or a UDF. It can also hold a type id written by a newer version. 
> Such a VARIANT breaks logs, test failure messages, and printed query results.
> ||Case||Current behavior||
> |\{{toString()}} of \{{[1, NaN]}}|throws \{{Non-finite value NaN cannot be 
> serialized to JSON.}}|
> |Print a VARIANT column holding \{{[1, NaN]}}|throws \{{Error when casting 
> VARIANT to STRING.}}|
> |Print a VARIANT column holding a JSON \{{null}}|prints an empty cell|
> |\{{toString()}} or print a VARIANT with an unknown type id|throws 
> \{{UNKNOWN_PRIMITIVE_TYPE_IN_VARIANT}}, the whole value is lost|
> h3. Proposal
> * Add an internal \{{VariantFormatter}} interface: \{{String 
> format(Variant)}}.
> * Move the JSON rendering out of \{{BinaryVariant}} into 
> \{{JsonVariantFormatter}}:
> ** \{{STRICT}} backs \{{toJson()}}. Output is unchanged, and it still fails 
> on NaN, infinity, and undecodable data, so \{{toJson()}} always returns valid 
> JSON.
> ** \{{LENIENT}} backs \{{toString()}}. It never fails and is meant for 
> debugging. NaN becomes \{{"NaN"}}. An unknown type id becomes 
> \{{"<UNKNOWN>"}}, other undecodable data \{{"<INVALID>"}}. The rest of the 
> value still renders.
> * Print VARIANT results through \{{SqlStringVariantFormatter}}. It renders 
> like \{{CAST(v AS STRING)}}, the same way MAP and ARRAY print, and never 
> fails.
> ||Stored||Printed today||Printed after||
> |\{{{"a":1,"b":["x",null]}}}|\{{{"a":1,"b":["x",null]}}}|\{{{a=1, b=[x, 
> NULL]}}}|
> |\{{[1, NaN]}}|fails|\{{[1, NaN]}}|
> |JSON \{{null}}|empty cell|\{{NULL}}|
> |bytes \{{0xC328}}|\{{"wyg="}}|\{{x'c328'}}|
> |\{{[1, <type id 31>]}}|fails|\{{[1, <UNKNOWN>]}}|
> h3. Compatibility
> * No public API change. The new classes are \{{@Internal}}. The javadoc of 
> \{{Variant#toJson()}} documents the contract.
> * \{{toJson()}}, \{{JSON_STRING}}, the json and raw formats, and \{{CAST(v AS 
> STRING)}} are unchanged.
> * Printed VARIANT output changes from JSON to the CAST form, so strings are 
> no longer quoted.
> * No state or serialization change.



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

Reply via email to