Hi everyone,

thanks Ramin for updating the FLIP. It took us quite some iterations to get it into a consistent and high quality shape.

For context, these are items we put into consideration:
- Look at other vendors: BigQuery, Snowflake, Spark, DuckDB
- Look at existing Flink SQL built-in functions e.g. JSON_*, IS_* and collection functions
- Look at use cases and find usability gaps
- Provide a reasonable set of building blocks
- What is required to make VARIANT in Flink a large success?

The FLIP covers a lot of function at once. Some are not described in every detail, but we will cover this as part of PR discussions and writing docs.

Overall, I hope we can make many users happy.

Thanks,
Timo


On 23.10.26 13:32, Ramin Gharib wrote:
Hi everyone,

After a long discussion with Timo Walther, I updated the FLIP to
change how the functions handle SQL NULL.

The functions now handle SQL NULL and variant null consistently. A
SQL NULL argument gives a SQL NULL result.

To write a variant null on purpose, the FLIP adds two functions:

- VARIANT_NULL() returns a variant null, the same as
   PARSE_JSON('null').
- TO_VARIANT(x) is the same as CAST(x AS VARIANT), except for SQL
   NULL. CAST(NULL AS VARIANT) returns NULL, so TO_VARIANT gives a
   variant null instead.

For example, with discount = NULL:

   VARIANT_SET(payload, '$.discount', discount)
   -- NULL
   VARIANT_SET(payload, '$.discount', TO_VARIANT(discount))
   -- {"discount":null,"order_id":8,"user":"bob"}

Other changes:

- VARIANT_OBJECT, VARIANT_ARRAY and VARIANT_MERGE return NULL for a
   SQL NULL argument. A NULL key in VARIANT_OBJECT is still an error.
- VARIANT_OBJECT_AGG skips rows with a SQL NULL value.
- VARIANT_DELETE and VARIANT_PICK still skip a NULL path.
- The prior-art table has a new column that names the proposed
   function for each row.

One point is still open. IS_VARIANT_NULL now returns NULL for SQL
NULL. Returning FALSE instead would keep its result NOT NULL. The
wiki has an example under Open Questions. I'm happy to hear your
opinion on it.

Wiki:
https://cwiki.apache.org/confluence/display/FLINK/FLIP-618%3A+Edit%2C+Inspect+and+Build+VARIANT+Values

Cheers,
Ramin Gharib

On Thu, Oct 22, 2026 at 5:36 PM Ramin Gharib <[email protected]> wrote:

Hi everyone,

I'd like to start a discussion on FLIP-618: Edit, Inspect and Build
VARIANT Values.

Wiki:
https://cwiki.apache.org/confluence/spaces/FLINK/pages/461570450/FLIP-618+Edit+Inspect+and+Build+VARIANT+Values

Flink can store and read VARIANT values since 2.1. SQL users still
cannot inspect or change one field and keep the rest, ask what a value
contains,
or build an object from columns without going through JSON text.
Today each of these needs a UDF that rebuilds the whole value.

The FLIP proposes built-in functions to edit (VARIANT_SET,
VARIANT_DELETE, VARIANT_MERGE, ...), inspect (IS_VARIANT_NULL,
VARIANT_KEYS, SCHEMA_OF_VARIANT, ...) and build (VARIANT_OBJECT,
VARIANT_OBJECT_AGG) VARIANT values, plus a Java API to edit a value
inside a UDF.

Looking forward to your feedback.

Best,
Ramin Gharib



Reply via email to