Skip to content

Commit 634362c

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>
1 parent 97f0461 commit 634362c

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
@@ -3747,6 +3747,96 @@ RESET spark.sql.ansi.enabled
37473747
ResetCommand spark.sql.ansi.enabled
37483748

37493749

3750+
-- !query
3751+
CREATE TEMPORARY VIEW t AS VALUES (0) t(a)
3752+
-- !query analysis
3753+
CreateViewCommand `t`, VALUES (0) t(a), false, false, LocalTempView, UNSUPPORTED, true
3754+
+- SubqueryAlias t
3755+
+- LocalRelation [a#x]
3756+
3757+
3758+
-- !query
3759+
CREATE TEMPORARY FUNCTION foo3_5a(x INT) RETURNS INT RETURN x
3760+
-- !query analysis
3761+
CreateSQLFunctionCommand foo3_5a, x INT, INT, x, false, true, false, false
3762+
3763+
3764+
-- !query
3765+
CREATE TEMPORARY FUNCTION foo3_5b(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3766+
-- !query analysis
3767+
CreateSQLFunctionCommand foo3_5b, x INT, INT, (SELECT SUM(a) FROM t), false, true, false, false
3768+
3769+
3770+
-- !query
3771+
CREATE TEMPORARY FUNCTION foo3_5c(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3772+
-- !query analysis
3773+
CreateSQLFunctionCommand foo3_5c, x INT, a INT, SELECT a FROM t, true, true, false, false
3774+
3775+
3776+
-- !query
3777+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN foo3_5a(x)
3778+
-- !query analysis
3779+
org.apache.spark.sql.AnalysisException
3780+
{
3781+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3782+
"sqlState" : "42K0F",
3783+
"messageParameters" : {
3784+
"obj" : "FUNCTION",
3785+
"objName" : "`default`.`foo3_5d`",
3786+
"tempObj" : "FUNCTION",
3787+
"tempObjName" : "`foo3_5a`"
3788+
}
3789+
}
3790+
3791+
3792+
-- !query
3793+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT foo3_5a(x)
3794+
-- !query analysis
3795+
org.apache.spark.sql.AnalysisException
3796+
{
3797+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3798+
"sqlState" : "42K0F",
3799+
"messageParameters" : {
3800+
"obj" : "FUNCTION",
3801+
"objName" : "`default`.`foo3_5d`",
3802+
"tempObj" : "FUNCTION",
3803+
"tempObjName" : "`foo3_5a`"
3804+
}
3805+
}
3806+
3807+
3808+
-- !query
3809+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3810+
-- !query analysis
3811+
org.apache.spark.sql.AnalysisException
3812+
{
3813+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3814+
"sqlState" : "42K0F",
3815+
"messageParameters" : {
3816+
"obj" : "FUNCTION",
3817+
"objName" : "`default`.`foo3_5d`",
3818+
"tempObj" : "VIEW",
3819+
"tempObjName" : "`t`"
3820+
}
3821+
}
3822+
3823+
3824+
-- !query
3825+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3826+
-- !query analysis
3827+
org.apache.spark.sql.AnalysisException
3828+
{
3829+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3830+
"sqlState" : "42K0F",
3831+
"messageParameters" : {
3832+
"obj" : "FUNCTION",
3833+
"objName" : "`default`.`foo3_5d`",
3834+
"tempObj" : "VIEW",
3835+
"tempObjName" : "`t`"
3836+
}
3837+
}
3838+
3839+
37503840
-- !query
37513841
CREATE FUNCTION foo3_14a() RETURNS INT RETURN 1
37523842
-- !query analysis
@@ -4828,3 +4918,33 @@ DropFunctionCommand spark_catalog.default.foo4_2, true, false
48284918
DROP FUNCTION IF EXISTS foo4_3
48294919
-- !query analysis
48304920
DropFunctionCommand spark_catalog.default.foo4_3, true, false
4921+
4922+
4923+
-- !query
4924+
DROP TEMPORARY FUNCTION IF EXISTS foo1d3
4925+
-- !query analysis
4926+
DropFunctionCommand foo1d3, true, true
4927+
4928+
4929+
-- !query
4930+
DROP TEMPORARY FUNCTION IF EXISTS foo3_3b
4931+
-- !query analysis
4932+
DropFunctionCommand foo3_3b, true, true
4933+
4934+
4935+
-- !query
4936+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5a
4937+
-- !query analysis
4938+
DropFunctionCommand foo3_5a, true, true
4939+
4940+
4941+
-- !query
4942+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5b
4943+
-- !query analysis
4944+
DropFunctionCommand foo3_5b, true, true
4945+
4946+
4947+
-- !query
4948+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5c
4949+
-- !query analysis
4950+
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
@@ -787,6 +787,18 @@ SELECT * FROM foo3_3ct();
787787
SELECT * FROM foo3_3dt();
788788
RESET spark.sql.ansi.enabled;
789789

790+
-- 3.5 Permanent functions with temp objects are not allowed
791+
CREATE TEMPORARY VIEW t AS VALUES (0) t(a);
792+
CREATE TEMPORARY FUNCTION foo3_5a(x INT) RETURNS INT RETURN x;
793+
CREATE TEMPORARY FUNCTION foo3_5b(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t);
794+
CREATE TEMPORARY FUNCTION foo3_5c(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t;
795+
-- Expect error: permanent function cannot reference temporary function
796+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN foo3_5a(x);
797+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT foo3_5a(x);
798+
-- Expect error: permanent function cannot reference temporary view
799+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t);
800+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t;
801+
790802
-- 3.14 Invalid usage of SQL scalar/table functions in query clauses.
791803
CREATE FUNCTION foo3_14a() RETURNS INT RETURN 1;
792804
CREATE FUNCTION foo3_14b() RETURNS TABLE (a INT) RETURN SELECT 1;
@@ -948,3 +960,10 @@ DROP FUNCTION IF EXISTS foo4_0;
948960
DROP FUNCTION IF EXISTS foo4_1;
949961
DROP FUNCTION IF EXISTS foo4_2;
950962
DROP FUNCTION IF EXISTS foo4_3;
963+
964+
-- Drop temporary functions
965+
DROP TEMPORARY FUNCTION IF EXISTS foo1d3;
966+
DROP TEMPORARY FUNCTION IF EXISTS foo3_3b;
967+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5a;
968+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5b;
969+
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
@@ -3887,6 +3887,110 @@ struct<>
38873887

38883888

38893889

3890+
-- !query
3891+
CREATE TEMPORARY VIEW t AS VALUES (0) t(a)
3892+
-- !query schema
3893+
struct<>
3894+
-- !query output
3895+
3896+
3897+
3898+
-- !query
3899+
CREATE TEMPORARY FUNCTION foo3_5a(x INT) RETURNS INT RETURN x
3900+
-- !query schema
3901+
struct<>
3902+
-- !query output
3903+
3904+
3905+
3906+
-- !query
3907+
CREATE TEMPORARY FUNCTION foo3_5b(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3908+
-- !query schema
3909+
struct<>
3910+
-- !query output
3911+
3912+
3913+
3914+
-- !query
3915+
CREATE TEMPORARY FUNCTION foo3_5c(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3916+
-- !query schema
3917+
struct<>
3918+
-- !query output
3919+
3920+
3921+
3922+
-- !query
3923+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN foo3_5a(x)
3924+
-- !query schema
3925+
struct<>
3926+
-- !query output
3927+
org.apache.spark.sql.AnalysisException
3928+
{
3929+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3930+
"sqlState" : "42K0F",
3931+
"messageParameters" : {
3932+
"obj" : "FUNCTION",
3933+
"objName" : "`default`.`foo3_5d`",
3934+
"tempObj" : "FUNCTION",
3935+
"tempObjName" : "`foo3_5a`"
3936+
}
3937+
}
3938+
3939+
3940+
-- !query
3941+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT foo3_5a(x)
3942+
-- !query schema
3943+
struct<>
3944+
-- !query output
3945+
org.apache.spark.sql.AnalysisException
3946+
{
3947+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3948+
"sqlState" : "42K0F",
3949+
"messageParameters" : {
3950+
"obj" : "FUNCTION",
3951+
"objName" : "`default`.`foo3_5d`",
3952+
"tempObj" : "FUNCTION",
3953+
"tempObjName" : "`foo3_5a`"
3954+
}
3955+
}
3956+
3957+
3958+
-- !query
3959+
CREATE FUNCTION foo3_5d(x INT) RETURNS INT RETURN (SELECT SUM(a) FROM t)
3960+
-- !query schema
3961+
struct<>
3962+
-- !query output
3963+
org.apache.spark.sql.AnalysisException
3964+
{
3965+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3966+
"sqlState" : "42K0F",
3967+
"messageParameters" : {
3968+
"obj" : "FUNCTION",
3969+
"objName" : "`default`.`foo3_5d`",
3970+
"tempObj" : "VIEW",
3971+
"tempObjName" : "`t`"
3972+
}
3973+
}
3974+
3975+
3976+
-- !query
3977+
CREATE FUNCTION foo3_5d(x INT) RETURNS TABLE (a INT) RETURN SELECT a FROM t
3978+
-- !query schema
3979+
struct<>
3980+
-- !query output
3981+
org.apache.spark.sql.AnalysisException
3982+
{
3983+
"errorClass" : "INVALID_TEMP_OBJ_REFERENCE",
3984+
"sqlState" : "42K0F",
3985+
"messageParameters" : {
3986+
"obj" : "FUNCTION",
3987+
"objName" : "`default`.`foo3_5d`",
3988+
"tempObj" : "VIEW",
3989+
"tempObjName" : "`t`"
3990+
}
3991+
}
3992+
3993+
38903994
-- !query
38913995
CREATE FUNCTION foo3_14a() RETURNS INT RETURN 1
38923996
-- !query schema
@@ -5095,3 +5199,43 @@ DROP FUNCTION IF EXISTS foo4_3
50955199
struct<>
50965200
-- !query output
50975201

5202+
5203+
5204+
-- !query
5205+
DROP TEMPORARY FUNCTION IF EXISTS foo1d3
5206+
-- !query schema
5207+
struct<>
5208+
-- !query output
5209+
5210+
5211+
5212+
-- !query
5213+
DROP TEMPORARY FUNCTION IF EXISTS foo3_3b
5214+
-- !query schema
5215+
struct<>
5216+
-- !query output
5217+
5218+
5219+
5220+
-- !query
5221+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5a
5222+
-- !query schema
5223+
struct<>
5224+
-- !query output
5225+
5226+
5227+
5228+
-- !query
5229+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5b
5230+
-- !query schema
5231+
struct<>
5232+
-- !query output
5233+
5234+
5235+
5236+
-- !query
5237+
DROP TEMPORARY FUNCTION IF EXISTS foo3_5c
5238+
-- !query schema
5239+
struct<>
5240+
-- !query output
5241+

0 commit comments

Comments
 (0)