Ganesha S created SPARK-59144:
---------------------------------
Summary: Plain SQL/JSON constructor function calls bypass routine
resolution
Key: SPARK-59144
URL: https://issues.apache.org/jira/browse/SPARK-59144
Project: Spark
Issue Type: Improvement
Components: SQL
Affects Versions: 4.4.0
Reporter: Ganesha S
{\{JSON_VALUE}}, \{{JSON_QUERY}}, \{{JSON_EXISTS}}, and \{{JSON_ARRAY}} each
have a dedicated \{{primaryExpression}} grammar branch placed before
\{{#functionCall}}. A plain call with no constructor clause is syntactically
identical to an ordinary function call, but the parser builds it straight into
the constructor expression, so it never goes through function resolution. This
bypasses the SQL PATH -- a same-named routine cannot shadow it -- and none of
these names are registered in \{{FunctionRegistry}}.
Example:
{code:sql}
SET spark.sql.path.enabled=true;
CREATE TEMPORARY FUNCTION json_value(a STRING, b STRING) RETURNS STRING RETURN
'shadowed';
SET PATH = system.session, system.builtin;
SELECT json_value('\{"a":1}', '$.a');
-- before: 1 (built-in constructor; the temporary routine is ignored)
-- after : shadowed (the routine on the session path shadows the built-in)
{code}
Fix: route the clause-free form through normal function resolution (emit
\{{UnresolvedFunction}}) and register the four names as built-ins that rebuild
the expression with the standard clause defaults when unshadowed.
Clause-bearing and nested-constructor forms stay on the direct-construction
path. Mirrors how \{{EXTRACT}} defers to its registered \{{extract}} built-in.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]