Skip to content

Commit 454659a

Browse files
[SPARK-52147][SQL][TESTS] Block temporary object references in persistent SQL UDFs
### What changes were proposed in this pull request? This PR adds test cases to block temporary object references in persistent SQL UDFs. ### Why are the changes needed? To improve test coverage for a SQL UDF feature. ### Does this PR introduce _any_ user-facing change? No ### How was this patch tested? Test only. ### Was this patch authored or co-authored using generative AI tooling? No Closes #51625 from allisonwang-db/spark-52147-block-temp-obj. Authored-by: Allison Wang <allison.wang@databricks.com> Signed-off-by: Allison Wang <allison.wang@databricks.com> (cherry picked from commit 634362c) Signed-off-by: Allison Wang <allison.wang@databricks.com>
1 parent 75b081b commit 454659a

File tree

3 files changed

+283
-0
lines changed

3 files changed

+283
-0
lines changed

sql/core/src/test/resources/sql-tests/analyzer-results/sql-udf.sql.out

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3713,6 +3713,96 @@ RESET spark.sql.ansi.enabled
37133713
ResetCommand spark.sql.ansi.enabled
37143714

37153715

3716+
-- !query
3717+
CREATE TEMPORARY VIEW t AS VALUES (0) t(a)
3718+
-- !query analysis
3719+
CreateViewCommand `t`, VALUES (0) t(a), false, false, LocalTempView, UNSUPPORTED, true
3720+
+- SubqueryAlias t
3721+
+- LocalRelation [a#x]
3722+
3723+
3724+
-- !query
3725+
CREATE TEMPORARY FUNCTION foo3_5a(x INT) RETURNS INT RETURN x
3726+
-- !query analysis
3727+
CreateSQLFunctionCommand foo3_5a, x INT, INT, x, false, true, false, false
3728+
3729+
3730+
-- !query
3731+
CREATE TEMPORARY FUNCTION foo3_5b(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3732+
-- !query analysis
3733+
CreateSQLFunctionCommand foo3_5b, x INT, INT, (SELECT SUM(a) FROM t), false, true, false, false
3734+
3735+
3736+
-- !query
3737+
CREATE TEMPORARY FUNCTION foo3_5c(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3738+
-- !query analysis
3739+
CreateSQLFunctionCommand foo3_5c, x INT, a INT, SELECT a FROM t, true, true, false, false
3740+
3741+
3742+
-- !query
3743+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN foo3_5a(x)
3744+
-- !query analysis
3745+
org.apache.spark.sql.AnalysisException
3746+
{
3747+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3748+
"sqlState" : "42K0F",
3749+
"messageParameters" : {
3750+
"obj" : "FUNCTION",
3751+
"objName" : "`default`.`foo3_5d`",
3752+
"tempObj" : "FUNCTION",
3753+
"tempObjName" : "`foo3_5a`"
3754+
}
3755+
}
3756+
3757+
3758+
-- !query
3759+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT foo3_5a(x)
3760+
-- !query analysis
3761+
org.apache.spark.sql.AnalysisException
3762+
{
3763+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3764+
"sqlState" : "42K0F",
3765+
"messageParameters" : {
3766+
"obj" : "FUNCTION",
3767+
"objName" : "`default`.`foo3_5d`",
3768+
"tempObj" : "FUNCTION",
3769+
"tempObjName" : "`foo3_5a`"
3770+
}
3771+
}
3772+
3773+
3774+
-- !query
3775+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3776+
-- !query analysis
3777+
org.apache.spark.sql.AnalysisException
3778+
{
3779+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3780+
"sqlState" : "42K0F",
3781+
"messageParameters" : {
3782+
"obj" : "FUNCTION",
3783+
"objName" : "`default`.`foo3_5d`",
3784+
"tempObj" : "VIEW",
3785+
"tempObjName" : "`t`"
3786+
}
3787+
}
3788+
3789+
3790+
-- !query
3791+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3792+
-- !query analysis
3793+
org.apache.spark.sql.AnalysisException
3794+
{
3795+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3796+
"sqlState" : "42K0F",
3797+
"messageParameters" : {
3798+
"obj" : "FUNCTION",
3799+
"objName" : "`default`.`foo3_5d`",
3800+
"tempObj" : "VIEW",
3801+
"tempObjName" : "`t`"
3802+
}
3803+
}
3804+
3805+
37163806
-- !query
37173807
CREATE FUNCTION foo3_14a() RETURNS INT RETURN 1
37183808
-- !query analysis
@@ -4794,3 +4884,33 @@ DropFunctionCommand spark_catalog.default.foo4_2, true, false
47944884
DROP FUNCTION IF EXISTS foo4_3
47954885
-- !query analysis
47964886
DropFunctionCommand spark_catalog.default.foo4_3, true, false
4887+
4888+
4889+
-- !query
4890+
DROP TEMPORARY FUNCTION IF EXISTS foo1d3
4891+
-- !query analysis
4892+
DropFunctionCommand foo1d3, true, true
4893+
4894+
4895+
-- !query
4896+
DROP TEMPORARY FUNCTION IF EXISTS foo3_3b
4897+
-- !query analysis
4898+
DropFunctionCommand foo3_3b, true, true
4899+
4900+
4901+
-- !query
4902+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5a
4903+
-- !query analysis
4904+
DropFunctionCommand foo3_5a, true, true
4905+
4906+
4907+
-- !query
4908+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5b
4909+
-- !query analysis
4910+
DropFunctionCommand foo3_5b, true, true
4911+
4912+
4913+
-- !query
4914+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5c
4915+
-- !query analysis
4916+
DropFunctionCommand foo3_5c, true, true

sql/core/src/test/resources/sql-tests/inputs/sql-udf.sql

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,18 @@ SELECT * FROM foo3_3ct();
782782
SELECT * FROM foo3_3dt();
783783
RESET spark.sql.ansi.enabled;
784784

785+
-- 3.5 Permanent functions with temp objects are not allowed
786+
CREATE TEMPORARY VIEW t AS VALUES (0) t(a);
787+
CREATE TEMPORARY FUNCTION foo3_5a(x INT) RETURNS INT RETURN x;
788+
CREATE TEMPORARY FUNCTION foo3_5b(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t);
789+
CREATE TEMPORARY FUNCTION foo3_5c(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t;
790+
-- Expect error: permanent function cannot reference temporary function
791+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN foo3_5a(x);
792+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT foo3_5a(x);
793+
-- Expect error: permanent function cannot reference temporary view
794+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t);
795+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t;
796+
785797
-- 3.14 Invalid usage of SQL scalar/table functions in query clauses.
786798
CREATE FUNCTION foo3_14a() RETURNS INT RETURN 1;
787799
CREATE FUNCTION foo3_14b() RETURNS TABLE (a INT) RETURN SELECT 1;
@@ -943,3 +955,10 @@ DROP FUNCTION IF EXISTS foo4_0;
943955
DROP FUNCTION IF EXISTS foo4_1;
944956
DROP FUNCTION IF EXISTS foo4_2;
945957
DROP FUNCTION IF EXISTS foo4_3;
958+
959+
-- Drop temporary functions
960+
DROP TEMPORARY FUNCTION IF EXISTS foo1d3;
961+
DROP TEMPORARY FUNCTION IF EXISTS foo3_3b;
962+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5a;
963+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5b;
964+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5c;

sql/core/src/test/resources/sql-tests/results/sql-udf.sql.out

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3849,6 +3849,110 @@ struct<>
38493849

38503850

38513851

3852+
-- !query
3853+
CREATE TEMPORARY VIEW t AS VALUES (0) t(a)
3854+
-- !query schema
3855+
struct<>
3856+
-- !query output
3857+
3858+
3859+
3860+
-- !query
3861+
CREATE TEMPORARY FUNCTION foo3_5a(x INT) RETURNS INT RETURN x
3862+
-- !query schema
3863+
struct<>
3864+
-- !query output
3865+
3866+
3867+
3868+
-- !query
3869+
CREATE TEMPORARY FUNCTION foo3_5b(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3870+
-- !query schema
3871+
struct<>
3872+
-- !query output
3873+
3874+
3875+
3876+
-- !query
3877+
CREATE TEMPORARY FUNCTION foo3_5c(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3878+
-- !query schema
3879+
struct<>
3880+
-- !query output
3881+
3882+
3883+
3884+
-- !query
3885+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN foo3_5a(x)
3886+
-- !query schema
3887+
struct<>
3888+
-- !query output
3889+
org.apache.spark.sql.AnalysisException
3890+
{
3891+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3892+
"sqlState" : "42K0F",
3893+
"messageParameters" : {
3894+
"obj" : "FUNCTION",
3895+
"objName" : "`default`.`foo3_5d`",
3896+
"tempObj" : "FUNCTION",
3897+
"tempObjName" : "`foo3_5a`"
3898+
}
3899+
}
3900+
3901+
3902+
-- !query
3903+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT foo3_5a(x)
3904+
-- !query schema
3905+
struct<>
3906+
-- !query output
3907+
org.apache.spark.sql.AnalysisException
3908+
{
3909+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3910+
"sqlState" : "42K0F",
3911+
"messageParameters" : {
3912+
"obj" : "FUNCTION",
3913+
"objName" : "`default`.`foo3_5d`",
3914+
"tempObj" : "FUNCTION",
3915+
"tempObjName" : "`foo3_5a`"
3916+
}
3917+
}
3918+
3919+
3920+
-- !query
3921+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3922+
-- !query schema
3923+
struct<>
3924+
-- !query output
3925+
org.apache.spark.sql.AnalysisException
3926+
{
3927+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3928+
"sqlState" : "42K0F",
3929+
"messageParameters" : {
3930+
"obj" : "FUNCTION",
3931+
"objName" : "`default`.`foo3_5d`",
3932+
"tempObj" : "VIEW",
3933+
"tempObjName" : "`t`"
3934+
}
3935+
}
3936+
3937+
3938+
-- !query
3939+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3940+
-- !query schema
3941+
struct<>
3942+
-- !query output
3943+
org.apache.spark.sql.AnalysisException
3944+
{
3945+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3946+
"sqlState" : "42K0F",
3947+
"messageParameters" : {
3948+
"obj" : "FUNCTION",
3949+
"objName" : "`default`.`foo3_5d`",
3950+
"tempObj" : "VIEW",
3951+
"tempObjName" : "`t`"
3952+
}
3953+
}
3954+
3955+
38523956
-- !query
38533957
CREATE FUNCTION foo3_14a() RETURNS INT RETURN 1
38543958
-- !query schema
@@ -5057,3 +5161,43 @@ DROP FUNCTION IF EXISTS foo4_3
50575161
struct<>
50585162
-- !query output
50595163

5164+
5165+
5166+
-- !query
5167+
DROP TEMPORARY FUNCTION IF EXISTS foo1d3
5168+
-- !query schema
5169+
struct<>
5170+
-- !query output
5171+
5172+
5173+
5174+
-- !query
5175+
DROP TEMPORARY FUNCTION IF EXISTS foo3_3b
5176+
-- !query schema
5177+
struct<>
5178+
-- !query output
5179+
5180+
5181+
5182+
-- !query
5183+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5a
5184+
-- !query schema
5185+
struct<>
5186+
-- !query output
5187+
5188+
5189+
5190+
-- !query
5191+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5b
5192+
-- !query schema
5193+
struct<>
5194+
-- !query output
5195+
5196+
5197+
5198+
-- !query
5199+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5c
5200+
-- !query schema
5201+
struct<>
5202+
-- !query output
5203+

0 commit comments

Comments
 (0)