Ganesha S created SPARK-58685:
---------------------------------

             Summary: Support the ANSI SQL/JSON JSON_VALUE scalar function
                 Key: SPARK-58685
                 URL: https://issues.apache.org/jira/browse/SPARK-58685
             Project: Spark
          Issue Type: Improvement
          Components: SQL
    Affects Versions: 4.3.0
            Reporter: Ganesha S


h2. What

Add the ANSI SQL:2016 JSON_VALUE scalar function (feature T821), which extracts 
a single scalar value located by a SQL/JSON path from a JSON string:

  JSON_VALUE(jsonExpr, path
             [ RETURNING <type> ]
             [ (NULL | ERROR | DEFAULT expr) ON EMPTY ]
             [ (NULL | ERROR | DEFAULT expr) ON ERROR ])

 

Semantics:
* Returns the scalar at \{{path}}, cast to the RETURNING type (default STRING).
* A missing path fires ON EMPTY; a structural error (malformed JSON, a 
non-scalar
  object/array match, or a failed cast to the RETURNING type) fires ON ERROR.
* Both clauses default to NULL ON EMPTY / NULL ON ERROR, per the standard.
* A path matching an explicit JSON null returns SQL NULL; a SQL NULL input
  propagates to SQL NULL (not ON EMPTY / ON ERROR).

Examples:
  JSON_VALUE('\{"id":7}', '$.id' RETURNING INT)                 -- 7
  JSON_VALUE('\{"a":{}}', '$.a')                                -- NULL 
(non-scalar -> NULL ON ERROR)
  JSON_VALUE('\{"id":7}', '$.missing' DEFAULT '?' ON EMPTY)     -- '?'
  JSON_VALUE('\{"n":"x"}', '$.n' RETURNING INT ERROR ON ERROR)  -- raises 
(failed cast)

 

h2. Why

Spark implements none of the ANSI SQL:2016 scalar JSON functions. JSON_VALUE is 
near-universal across Oracle, SQL Server, PostgreSQL, MySQL, Trino, Flink, 
BigQuery, and DuckDB, so its absence forces every migrated query to be 
rewritten to CAST(get_json_object(...)), which always returns STRING, cannot 
express RETURNING, and silently returns NULL on both "missing" and "error" -- 
losing the null/error handling the source query intended. JSON_VALUE lets 
migrated workloads run unchanged with their intended semantics.

h2. How

* Grammar: add non-reserved keywords JSON_VALUE, RETURNING, EMPTY and a 
dedicated JSON_VALUE production (RETURNING / ON EMPTY / ON ERROR / DEFAULT), 
mirroring how JSON_TABLE (SPARK-58366) added a non-standard production. 
Keywords are non-reserved in both ANSI and default modes, so existing 
identifiers named json_value/returning/empty keep working.
* Evaluation: reuse the token-aware path evaluator from JSON_TABLE 
(SPARK-58366) via a new JsonTableEvaluator.lookup entry point that preserves 
the missing / JSON-null / found distinction; the new JsonValue Catalyst 
expression applies the RETURNING cast and ON EMPTY / ON ERROR behavior.
* The extracted-scalar cast is always an ANSI (throwing) cast so the ON ERROR 
clause governs a failed conversion regardless of the session's 
spark.sql.ansi.enabled setting.

h2. Scope

v1 supports STRING JSON input and scalar (string / numeric / boolean / 
datetime) RETURNING types, per ANSI 9075-2 6.28. VARIANT RETURNING and PASSING 
arguments
are deferred as follow-ups.



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to