diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala index f31354179674e..dbcc66511af72 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala @@ -2824,6 +2824,10 @@ class Analyzer( j.copy(left = newLeft, right = newRight) } + // Allow scalar SQL UDFs in SQL table function inputs. They will be resolved + // when ResolveSQLTableFunctions expands the table function via executeSameContext. + case f: SQLTableFunction if hasSQLFunctionExpression(f.expressions) => f + case o: LogicalPlan if o.resolved && hasSQLFunctionExpression(o.expressions) => o.transformExpressionsWithPruning(_.containsPattern(SQL_FUNCTION_EXPRESSION)) { case f: SQLFunctionExpression => diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLFunctionSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLFunctionSuite.scala index 9a3af9e1b4324..10a786b3d0e5c 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLFunctionSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/SQLFunctionSuite.scala @@ -226,4 +226,16 @@ class SQLFunctionSuite extends SharedSparkSession { } } } + + test("SPARK-52719: scalar SQL UDF as TVF argument") { + withUserDefinedFunction("scalar_udf" -> false, "table_func" -> false) { + sql("CREATE FUNCTION scalar_udf(x INT) RETURNS INT RETURN x + 1") + sql( + """CREATE FUNCTION table_func(x INT) + |RETURNS TABLE(a INT) + |RETURN SELECT x + |""".stripMargin) + checkAnswer(sql("SELECT * FROM table_func(scalar_udf(1))"), Row(2)) + } + } }