-- is_valid_variant
SELECT is_valid_variant(parse_json('null'));
+----------------------------------+
|is_valid_variant(parse_json(null))|
+----------------------------------+
|                              true|
+----------------------------------+

SELECT is_valid_variant(parse_json('[{"b":true,"a":0}]'));
+------------------------------------------------+
|is_valid_variant(parse_json([{"b":true,"a":0}]))|
+------------------------------------------------+
|                                            true|
+------------------------------------------------+

-- is_variant_null
SELECT is_variant_null(parse_json('null'));
+---------------------------------+
|is_variant_null(parse_json(null))|
+---------------------------------+
|                             true|
+---------------------------------+

SELECT is_variant_null(parse_json('"null"'));
+-----------------------------------+
|is_variant_null(parse_json("null"))|
+-----------------------------------+
|                              false|
+-----------------------------------+

SELECT is_variant_null(parse_json('13'));
+-------------------------------+
|is_variant_null(parse_json(13))|
+-------------------------------+
|                          false|
+-------------------------------+

SELECT is_variant_null(parse_json(null));
+---------------------------------+
|is_variant_null(parse_json(NULL))|
+---------------------------------+
|                            false|
+---------------------------------+

SELECT is_variant_null(variant_get(parse_json('{"a":null, "b":"spark"}'), "$.c"));
+----------------------------------------------------------------------+
|is_variant_null(variant_get(parse_json({"a":null, "b":"spark"}), $.c))|
+----------------------------------------------------------------------+
|                                                                 false|
+----------------------------------------------------------------------+

SELECT is_variant_null(variant_get(parse_json('{"a":null, "b":"spark"}'), "$.a"));
+----------------------------------------------------------------------+
|is_variant_null(variant_get(parse_json({"a":null, "b":"spark"}), $.a))|
+----------------------------------------------------------------------+
|                                                                  true|
+----------------------------------------------------------------------+

-- parse_json
SELECT parse_json('{"a":1,"b":0.8}');
+---------------------------+
|parse_json({"a":1,"b":0.8})|
+---------------------------+
|            {"a":1,"b":0.8}|
+---------------------------+

-- schema_of_variant
SELECT schema_of_variant(parse_json('null'));
+-----------------------------------+
|schema_of_variant(parse_json(null))|
+-----------------------------------+
|                               VOID|
+-----------------------------------+

SELECT schema_of_variant(parse_json('[{"b":true,"a":0}]'));
+-------------------------------------------------+
|schema_of_variant(parse_json([{"b":true,"a":0}]))|
+-------------------------------------------------+
|                             ARRAY<OBJECT<a: B...|
+-------------------------------------------------+

-- schema_of_variant_agg
SELECT schema_of_variant_agg(parse_json(j)) FROM VALUES ('1'), ('2'), ('3') AS tab(j);
+------------------------------------+
|schema_of_variant_agg(parse_json(j))|
+------------------------------------+
|                              BIGINT|
+------------------------------------+

SELECT schema_of_variant_agg(parse_json(j)) FROM VALUES ('{"a": 1}'), ('{"b": true}'), ('{"c": 1.23}') AS tab(j);
+------------------------------------+
|schema_of_variant_agg(parse_json(j))|
+------------------------------------+
|                OBJECT<a: BIGINT,...|
+------------------------------------+

-- to_variant_object
SELECT to_variant_object(named_struct('a', 1, 'b', 2));
+-------------------------------------------+
|to_variant_object(named_struct(a, 1, b, 2))|
+-------------------------------------------+
|                              {"a":1,"b":2}|
+-------------------------------------------+

SELECT to_variant_object(array(1, 2, 3));
+---------------------------------+
|to_variant_object(array(1, 2, 3))|
+---------------------------------+
|                          [1,2,3]|
+---------------------------------+

SELECT to_variant_object(array(named_struct('a', 1)));
+--------------------------------------------+
|to_variant_object(array(named_struct(a, 1)))|
+--------------------------------------------+
|                                   [{"a":1}]|
+--------------------------------------------+

SELECT to_variant_object(array(map("a", 2)));
+-----------------------------------+
|to_variant_object(array(map(a, 2)))|
+-----------------------------------+
|                          [{"a":2}]|
+-----------------------------------+

-- try_parse_json
SELECT try_parse_json('{"a":1,"b":0.8}');
+-------------------------------+
|try_parse_json({"a":1,"b":0.8})|
+-------------------------------+
|                {"a":1,"b":0.8}|
+-------------------------------+

SELECT try_parse_json('{"a":1,');
+-----------------------+
|try_parse_json({"a":1,)|
+-----------------------+
|                   NULL|
+-----------------------+

-- try_variant_array_append
SELECT try_variant_array_append(parse_json('[1, 2, 3]'), '$', 4);
+-----------------------------------------------------+
|try_variant_array_append(parse_json([1, 2, 3]), $, 4)|
+-----------------------------------------------------+
|                                            [1,2,3,4]|
+-----------------------------------------------------+

SELECT try_variant_array_append(parse_json('{"a": [1, 2]}'), '$.a', 3);
+-----------------------------------------------------------+
|try_variant_array_append(parse_json({"a": [1, 2]}), $.a, 3)|
+-----------------------------------------------------------+
|                                              {"a":[1,2,3]}|
+-----------------------------------------------------------+

SELECT try_variant_array_append(parse_json('[1]'), '$', parse_json('[2, 3]'));
+----------------------------------------------------------------+
|try_variant_array_append(parse_json([1]), $, parse_json([2, 3]))|
+----------------------------------------------------------------+
|                                                       [1,[2,3]]|
+----------------------------------------------------------------+

SELECT try_variant_array_append(parse_json('{"a": 1}'), '$.missing', 2);
+------------------------------------------------------------+
|try_variant_array_append(parse_json({"a": 1}), $.missing, 2)|
+------------------------------------------------------------+
|                                                     {"a":1}|
+------------------------------------------------------------+

SELECT try_variant_array_append(parse_json('{"a": 1}'), '$.a', 2);
+------------------------------------------------------+
|try_variant_array_append(parse_json({"a": 1}), $.a, 2)|
+------------------------------------------------------+
|                                                  NULL|
+------------------------------------------------------+

SELECT try_variant_array_append(parse_json('[1, 2]'), '$', null);
+-----------------------------------------------------+
|try_variant_array_append(parse_json([1, 2]), $, NULL)|
+-----------------------------------------------------+
|                                                 NULL|
+-----------------------------------------------------+

-- try_variant_get
SELECT try_variant_get(parse_json('{"a": 1}'), '$.a', 'int');
+------------------------------------------+
|try_variant_get(parse_json({"a": 1}), $.a)|
+------------------------------------------+
|                                         1|
+------------------------------------------+

SELECT try_variant_get(parse_json('{"a": 1}'), '$.b', 'int');
+------------------------------------------+
|try_variant_get(parse_json({"a": 1}), $.b)|
+------------------------------------------+
|                                      NULL|
+------------------------------------------+

SELECT try_variant_get(parse_json('[1, "2"]'), '$[1]', 'string');
+-------------------------------------------+
|try_variant_get(parse_json([1, "2"]), $[1])|
+-------------------------------------------+
|                                          2|
+-------------------------------------------+

SELECT try_variant_get(parse_json('[1, "2"]'), '$[2]', 'string');
+-------------------------------------------+
|try_variant_get(parse_json([1, "2"]), $[2])|
+-------------------------------------------+
|                                       NULL|
+-------------------------------------------+

SELECT try_variant_get(parse_json('[1, "hello"]'), '$[1]');
+-----------------------------------------------+
|try_variant_get(parse_json([1, "hello"]), $[1])|
+-----------------------------------------------+
|                                        "hello"|
+-----------------------------------------------+

SELECT try_variant_get(parse_json('[1, "hello"]'), '$[1]', 'int');
+-----------------------------------------------+
|try_variant_get(parse_json([1, "hello"]), $[1])|
+-----------------------------------------------+
|                                           NULL|
+-----------------------------------------------+

-- try_variant_insert
SELECT try_variant_insert(parse_json('{"a": 1}'), '$.b', 2);
+------------------------------------------------+
|try_variant_insert(parse_json({"a": 1}), $.b, 2)|
+------------------------------------------------+
|                                   {"a":1,"b":2}|
+------------------------------------------------+

SELECT try_variant_insert(parse_json('{}'), '$.a.b', 1);
+--------------------------------------------+
|try_variant_insert(parse_json({}), $.a.b, 1)|
+--------------------------------------------+
|                               {"a":{"b":1}}|
+--------------------------------------------+

SELECT try_variant_insert(parse_json('["a","b","c"]'), '$[1]', 'z');
+------------------------------------------------------+
|try_variant_insert(parse_json(["a","b","c"]), $[1], z)|
+------------------------------------------------------+
|                                     ["a","z","b","c"]|
+------------------------------------------------------+

SELECT try_variant_insert(parse_json('["a","b"]'), '$[5]', 'z');
+--------------------------------------------------+
|try_variant_insert(parse_json(["a","b"]), $[5], z)|
+--------------------------------------------------+
|                              ["a","b",null,nul...|
+--------------------------------------------------+

SELECT try_variant_insert(parse_json('{"a": 1}'), '$.a', 2);
+------------------------------------------------+
|try_variant_insert(parse_json({"a": 1}), $.a, 2)|
+------------------------------------------------+
|                                            NULL|
+------------------------------------------------+

SELECT try_variant_insert(parse_json('{"a": 1}'), '$.a.b', 2);
+--------------------------------------------------+
|try_variant_insert(parse_json({"a": 1}), $.a.b, 2)|
+--------------------------------------------------+
|                                              NULL|
+--------------------------------------------------+

SELECT try_variant_insert(parse_json('{}'), '$.a', null);
+---------------------------------------------+
|try_variant_insert(parse_json({}), $.a, NULL)|
+---------------------------------------------+
|                                         NULL|
+---------------------------------------------+

-- try_variant_set
SELECT try_variant_set(parse_json('{"a": 1}'), '$.a', 2);
+---------------------------------------------------+
|try_variant_set(parse_json({"a": 1}), $.a, 2, true)|
+---------------------------------------------------+
|                                            {"a":2}|
+---------------------------------------------------+

SELECT try_variant_set(parse_json('{"a": 1}'), '$.b', 3);
+---------------------------------------------------+
|try_variant_set(parse_json({"a": 1}), $.b, 3, true)|
+---------------------------------------------------+
|                                      {"a":1,"b":3}|
+---------------------------------------------------+

SELECT try_variant_set(parse_json('{"a": {"b": 1}}'), '$.a.c.d', 2);
+--------------------------------------------------------------+
|try_variant_set(parse_json({"a": {"b": 1}}), $.a.c.d, 2, true)|
+--------------------------------------------------------------+
|                                          {"a":{"b":1,"c":{...|
+--------------------------------------------------------------+

SELECT try_variant_set(parse_json('["a","b","c"]'), '$[1]', 'z');
+---------------------------------------------------------+
|try_variant_set(parse_json(["a","b","c"]), $[1], z, true)|
+---------------------------------------------------------+
|                                            ["a","z","c"]|
+---------------------------------------------------------+

SELECT try_variant_set(parse_json('["a","b","c"]'), '$[5]', 'z');
+---------------------------------------------------------+
|try_variant_set(parse_json(["a","b","c"]), $[5], z, true)|
+---------------------------------------------------------+
|                                     ["a","b","c",null...|
+---------------------------------------------------------+

SELECT try_variant_set(parse_json('{"a": 1}'), '$.b', 2, false);
+----------------------------------------------------+
|try_variant_set(parse_json({"a": 1}), $.b, 2, false)|
+----------------------------------------------------+
|                                             {"a":1}|
+----------------------------------------------------+

SELECT try_variant_set(parse_json('{"a": 1}'), '$.a.b', 2);
+-----------------------------------------------------+
|try_variant_set(parse_json({"a": 1}), $.a.b, 2, true)|
+-----------------------------------------------------+
|                                                 NULL|
+-----------------------------------------------------+

SELECT try_variant_set(parse_json('{"a": 1}'), '$.a', null);
+------------------------------------------------------+
|try_variant_set(parse_json({"a": 1}), $.a, NULL, true)|
+------------------------------------------------------+
|                                                  NULL|
+------------------------------------------------------+

-- variant_array_append
SELECT variant_array_append(parse_json('[1, 2, 3]'), '$', 4);
+-------------------------------------------------+
|variant_array_append(parse_json([1, 2, 3]), $, 4)|
+-------------------------------------------------+
|                                        [1,2,3,4]|
+-------------------------------------------------+

SELECT variant_array_append(parse_json('{"a": [1, 2]}'), '$.a', 3);
+-------------------------------------------------------+
|variant_array_append(parse_json({"a": [1, 2]}), $.a, 3)|
+-------------------------------------------------------+
|                                          {"a":[1,2,3]}|
+-------------------------------------------------------+

SELECT variant_array_append(parse_json('[1]'), '$', parse_json('[2, 3]'));
+------------------------------------------------------------+
|variant_array_append(parse_json([1]), $, parse_json([2, 3]))|
+------------------------------------------------------------+
|                                                   [1,[2,3]]|
+------------------------------------------------------------+

SELECT variant_array_append(parse_json('{"a": 1}'), '$.missing', 2);
+--------------------------------------------------------+
|variant_array_append(parse_json({"a": 1}), $.missing, 2)|
+--------------------------------------------------------+
|                                                 {"a":1}|
+--------------------------------------------------------+

SELECT variant_array_append(parse_json('[1, 2]'), '$', parse_json('null'));
+-------------------------------------------------------------+
|variant_array_append(parse_json([1, 2]), $, parse_json(null))|
+-------------------------------------------------------------+
|                                                   [1,2,null]|
+-------------------------------------------------------------+

SELECT variant_array_append(parse_json('[1, 2]'), '$', null);
+-------------------------------------------------+
|variant_array_append(parse_json([1, 2]), $, NULL)|
+-------------------------------------------------+
|                                             NULL|
+-------------------------------------------------+

-- variant_delete
SELECT variant_delete(parse_json('{"a": 1, "b": 2, "c": 3, "items": [1, 2, 3]}'), NULL, '$.a', '$.c');
+----------------------------------------------------------------------------------------+
|variant_delete(parse_json({"a": 1, "b": 2, "c": 3, "items": [1, 2, 3]}), NULL, $.a, $.c)|
+----------------------------------------------------------------------------------------+
|                                                                    {"b":2,"items":[1...|
+----------------------------------------------------------------------------------------+

SELECT variant_delete(parse_json('{"a": 1, "b": 2, "c": 3, "items": [1, 2, 3]}'), '$.missing');
+-----------------------------------------------------------------------------------+
|variant_delete(parse_json({"a": 1, "b": 2, "c": 3, "items": [1, 2, 3]}), $.missing)|
+-----------------------------------------------------------------------------------+
|                                                               {"a":1,"b":2,"c":...|
+-----------------------------------------------------------------------------------+

SELECT variant_delete(parse_json('{"a": 1, "b": 2, "c": 3, "items": [1, 2, 3]}'), '$.items[0]', '$.items[0]');
+------------------------------------------------------------------------------------------------+
|variant_delete(parse_json({"a": 1, "b": 2, "c": 3, "items": [1, 2, 3]}), $.items[0], $.items[0])|
+------------------------------------------------------------------------------------------------+
|                                                                            {"a":1,"b":2,"c":...|
+------------------------------------------------------------------------------------------------+

SELECT variant_delete(NULL, '$.a');
+-------------------------+
|variant_delete(NULL, $.a)|
+-------------------------+
|                     NULL|
+-------------------------+

-- variant_explode
SELECT * from variant_explode(parse_json('["hello", "world"]'));
+---+----+-------+
|pos| key|  value|
+---+----+-------+
|  0|NULL|"hello"|
|  1|NULL|"world"|
+---+----+-------+

SELECT * from variant_explode(input => parse_json('{"a": true, "b": 3.14}'));
+---+---+-----+
|pos|key|value|
+---+---+-----+
|  0|  a| true|
|  1|  b| 3.14|
+---+---+-----+

-- variant_explode_outer
SELECT * from variant_explode_outer(parse_json('["hello", "world"]'));
+---+----+-------+
|pos| key|  value|
+---+----+-------+
|  0|NULL|"hello"|
|  1|NULL|"world"|
+---+----+-------+

SELECT * from variant_explode_outer(input => parse_json('{"a": true, "b": 3.14}'));
+---+---+-----+
|pos|key|value|
+---+---+-----+
|  0|  a| true|
|  1|  b| 3.14|
+---+---+-----+

-- variant_get
SELECT variant_get(parse_json('{"a": 1}'), '$.a', 'int');
+--------------------------------------+
|variant_get(parse_json({"a": 1}), $.a)|
+--------------------------------------+
|                                     1|
+--------------------------------------+

SELECT variant_get(parse_json('{"a": 1}'), '$.b', 'int');
+--------------------------------------+
|variant_get(parse_json({"a": 1}), $.b)|
+--------------------------------------+
|                                  NULL|
+--------------------------------------+

SELECT variant_get(parse_json('[1, "2"]'), '$[1]', 'string');
+---------------------------------------+
|variant_get(parse_json([1, "2"]), $[1])|
+---------------------------------------+
|                                      2|
+---------------------------------------+

SELECT variant_get(parse_json('[1, "2"]'), '$[2]', 'string');
+---------------------------------------+
|variant_get(parse_json([1, "2"]), $[2])|
+---------------------------------------+
|                                   NULL|
+---------------------------------------+

SELECT variant_get(parse_json('[1, "hello"]'), '$[1]');
+-------------------------------------------+
|variant_get(parse_json([1, "hello"]), $[1])|
+-------------------------------------------+
|                                    "hello"|
+-------------------------------------------+

-- variant_insert
SELECT variant_insert(parse_json('{"a": 1}'), '$.b', 2);
+--------------------------------------------+
|variant_insert(parse_json({"a": 1}), $.b, 2)|
+--------------------------------------------+
|                               {"a":1,"b":2}|
+--------------------------------------------+

SELECT variant_insert(parse_json('{}'), '$.a.b', 1);
+----------------------------------------+
|variant_insert(parse_json({}), $.a.b, 1)|
+----------------------------------------+
|                           {"a":{"b":1}}|
+----------------------------------------+

SELECT variant_insert(parse_json('["a","b","c"]'), '$[1]', 'z');
+--------------------------------------------------+
|variant_insert(parse_json(["a","b","c"]), $[1], z)|
+--------------------------------------------------+
|                                 ["a","z","b","c"]|
+--------------------------------------------------+

SELECT variant_insert(parse_json('["a","b"]'), '$[5]', 'z');
+----------------------------------------------+
|variant_insert(parse_json(["a","b"]), $[5], z)|
+----------------------------------------------+
|                          ["a","b",null,nul...|
+----------------------------------------------+

SELECT variant_insert(parse_json('{}'), '$.a', parse_json('{"x":1}'));
+--------------------------------------------------------+
|variant_insert(parse_json({}), $.a, parse_json({"x":1}))|
+--------------------------------------------------------+
|                                           {"a":{"x":1}}|
+--------------------------------------------------------+

SELECT variant_insert(parse_json('{}'), '$.a', parse_json('null'));
+-----------------------------------------------------+
|variant_insert(parse_json({}), $.a, parse_json(null))|
+-----------------------------------------------------+
|                                           {"a":null}|
+-----------------------------------------------------+

SELECT variant_insert(parse_json('{}'), '$.a', null);
+-----------------------------------------+
|variant_insert(parse_json({}), $.a, NULL)|
+-----------------------------------------+
|                                     NULL|
+-----------------------------------------+

-- variant_set
SELECT variant_set(parse_json('{"a": 1}'), '$.a', 2);
+-----------------------------------------------+
|variant_set(parse_json({"a": 1}), $.a, 2, true)|
+-----------------------------------------------+
|                                        {"a":2}|
+-----------------------------------------------+

SELECT variant_set(parse_json('{"a": 1}'), '$.b', 3);
+-----------------------------------------------+
|variant_set(parse_json({"a": 1}), $.b, 3, true)|
+-----------------------------------------------+
|                                  {"a":1,"b":3}|
+-----------------------------------------------+

SELECT variant_set(parse_json('{"a": {"b": 1}}'), '$.a.c.d', 2);
+----------------------------------------------------------+
|variant_set(parse_json({"a": {"b": 1}}), $.a.c.d, 2, true)|
+----------------------------------------------------------+
|                                      {"a":{"b":1,"c":{...|
+----------------------------------------------------------+

SELECT variant_set(parse_json('["a","b","c"]'), '$[1]', 'z');
+-----------------------------------------------------+
|variant_set(parse_json(["a","b","c"]), $[1], z, true)|
+-----------------------------------------------------+
|                                        ["a","z","c"]|
+-----------------------------------------------------+

SELECT variant_set(parse_json('["a","b","c"]'), '$[5]', 'z');
+-----------------------------------------------------+
|variant_set(parse_json(["a","b","c"]), $[5], z, true)|
+-----------------------------------------------------+
|                                 ["a","b","c",null...|
+-----------------------------------------------------+

SELECT variant_set(parse_json('{"a": 1}'), '$.b', 2, false);
+------------------------------------------------+
|variant_set(parse_json({"a": 1}), $.b, 2, false)|
+------------------------------------------------+
|                                         {"a":1}|
+------------------------------------------------+

SELECT variant_set(parse_json('{"a": 1}'), '$.a', parse_json('null'));
+--------------------------------------------------------------+
|variant_set(parse_json({"a": 1}), $.a, parse_json(null), true)|
+--------------------------------------------------------------+
|                                                    {"a":null}|
+--------------------------------------------------------------+

SELECT variant_set(parse_json('{"a": 1}'), '$.a', null);
+--------------------------------------------------+
|variant_set(parse_json({"a": 1}), $.a, NULL, true)|
+--------------------------------------------------+
|                                              NULL|
+--------------------------------------------------+

-- variant_strip_nulls
SELECT variant_strip_nulls(parse_json('{"a": 1, "b": null, "c": 3}'));
+------------------------------------------------------------------+
|variant_strip_nulls(parse_json({"a": 1, "b": null, "c": 3}), true)|
+------------------------------------------------------------------+
|                                                     {"a":1,"c":3}|
+------------------------------------------------------------------+

SELECT variant_strip_nulls(parse_json('[1, null, 3]'));
+---------------------------------------------------+
|variant_strip_nulls(parse_json([1, null, 3]), true)|
+---------------------------------------------------+
|                                              [1,3]|
+---------------------------------------------------+

SELECT variant_strip_nulls(parse_json('{"a": {"b": null, "c": [1, null]}}'));
+-------------------------------------------------------------------------+
|variant_strip_nulls(parse_json({"a": {"b": null, "c": [1, null]}}), true)|
+-------------------------------------------------------------------------+
|                                                          {"a":{"c":[1]}}|
+-------------------------------------------------------------------------+

SELECT variant_strip_nulls(parse_json('{"a": [1, null], "b": null}'), false);
+-------------------------------------------------------------------+
|variant_strip_nulls(parse_json({"a": [1, null], "b": null}), false)|
+-------------------------------------------------------------------+
|                                                     {"a":[1,null]}|
+-------------------------------------------------------------------+

SELECT variant_strip_nulls(parse_json('{"a": null}'));
+--------------------------------------------------+
|variant_strip_nulls(parse_json({"a": null}), true)|
+--------------------------------------------------+
|                                                {}|
+--------------------------------------------------+

SELECT variant_strip_nulls(parse_json('null'));
+-------------------------------------------+
|variant_strip_nulls(parse_json(null), true)|
+-------------------------------------------+
|                                       null|
+-------------------------------------------+

SELECT variant_strip_nulls(NULL);
+-------------------------------+
|variant_strip_nulls(NULL, true)|
+-------------------------------+
|                           NULL|
+-------------------------------+