Ganesha S created SPARK-60805:
---------------------------------

             Summary: CREATE FUNCTION rejects function bodies that call system- 
or catalog-qualified functions
                 Key: SPARK-60805
                 URL: https://issues.apache.org/jira/browse/SPARK-60805
             Project: Spark
          Issue Type: Bug
          Components: SQL
    Affects Versions: 4.4.0
            Reporter: Ganesha S


CREATE FUNCTION rejects a function body that calls a system- or 
catalog-qualified function, although the same call works in a query. Before 
analysing the body, the cyclic-reference check looks up every called name as a 
persistent function: builtin. and session. are treated as schema names in 
spark_catalog, and names with more than two parts are rejected. The 
temporary-function scan has the same problem.

*Steps to reproduce (default settings; verified on master):*
{code:java}
-- The same calls work in a query:
SELECT builtin.abs(-1), system.builtin.abs(-1);                          -- 1, 1
CREATE FUNCTION g() RETURNS INT RETURN 5;
SELECT spark_catalog.default.g();                                        -- 5
-- ...but fail in a function body:
CREATE FUNCTION f1() RETURNS INT RETURN builtin.abs(-1);                 -- 
SCHEMA_NOT_FOUND
CREATE FUNCTION f2() RETURNS INT RETURN system.builtin.abs(-1);          -- 
IDENTIFIER_TOO_MANY_NAME_PARTS
CREATE FUNCTION f5() RETURNS INT RETURN spark_catalog.default.g();       -- 
IDENTIFIER_TOO_MANY_NAME_PARTS
-- A session-qualified temporary function gets the wrong error:
CREATE TEMPORARY FUNCTION temp_fn() RETURNS INT RETURN 1;
CREATE FUNCTION f3() RETURNS INT RETURN session.temp_fn();               -- 
SCHEMA_NOT_FOUND
CREATE FUNCTION f4() RETURNS INT RETURN system.session.temp_fn();        -- 
IDENTIFIER_TOO_MANY_NAME_PARTS
-- Even a temporary function cannot call one this way:
CREATE TEMPORARY FUNCTION t2() RETURNS INT RETURN system.session.temp_fn();  -- 
IDENTIFIER_TOO_MANY_NAME_PARTS
Expected behavior:
- f1, f2 and f5 are created and return the same results as the query.
- f3 and f4 fail with INVALID_TEMP_OBJ_REFERENCE, because a permanent function 
cannot
  reference a temporary function.
- t2 is created.
- Cycles through qualified names are still detected (e.g. CREATE OR REPLACE 
TEMPORARY FUNCTION
  temp_fn() RETURNS INT RETURN session.temp_fn() fails with 
CYCLIC_FUNCTION_REFERENCE).
{code}
 

*Proposed fix:* in CREATE FUNCTION's cyclic-reference check and 
temporary-function scan, resolve builtin. and session. names (optionally 
system.-prefixed) the way function resolution does, including the legacy 
spark.sql.legacy.persistentCatalogFirst behavior. Look up three-part 
spark_catalog names directly. Leave functions from other catalogs to analysis.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

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

Reply via email to