@@ -39,6 +39,8 @@ import org.apache.spark.sql.catalyst.analysis.FunctionRegistry.FunctionBuilder
3939import org .apache .spark .sql .catalyst .analysis .TableFunctionRegistry .TableFunctionBuilder
4040import org .apache .spark .sql .catalyst .catalog .SQLFunction .parseDefault
4141import org .apache .spark .sql .catalyst .expressions .{Alias , Attribute , AttributeReference , Cast , Expression , ExpressionInfo , LateralSubquery , NamedArgumentExpression , NamedExpression , OuterReference , ScalarSubquery , UpCast }
42+ import org .apache .spark .sql .catalyst .expressions .NamedLambdaVariable
43+ import org .apache .spark .sql .catalyst .expressions .UnresolvedNamedLambdaVariable
4244import org .apache .spark .sql .catalyst .parser .{CatalystSqlParser , ParserInterface }
4345import org .apache .spark .sql .catalyst .plans .Inner
4446import org .apache .spark .sql .catalyst .plans .logical .{FunctionSignature , InputParameter , LateralJoin , LogicalPlan , NamedParametersSupport , OneRowRelation , Project , SubqueryAlias , View }
@@ -1633,6 +1635,25 @@ class SessionCatalog(
16331635 throw UserDefinedFunctionErrors .notAScalarFunction(function.name.nameParts)
16341636 }
16351637 (input : Seq [Expression ]) => {
1638+ // Check if any input contains a lambda variable
1639+ val hasLambdaVar = input.exists { expr =>
1640+ expr.find {
1641+ case _ : NamedLambdaVariable => true
1642+ case _ : UnresolvedNamedLambdaVariable => true
1643+ case _ => false
1644+ }.isDefined
1645+ }
1646+ if (hasLambdaVar) {
1647+ val formattedInputs = input.map {
1648+ case v : NamedLambdaVariable => " lambda " + v.name
1649+ case v : UnresolvedNamedLambdaVariable => " lambda " + v.name
1650+ case e => e.sql
1651+ }.mkString(" , " )
1652+ throw new AnalysisException (
1653+ errorClass = " UNSUPPORTED_FEATURE.LAMBDA_FUNCTION_WITH_SQL_UDF" ,
1654+ messageParameters = Map (
1655+ " funcName" -> (" \" " + function.name.unquotedString + " (" + formattedInputs + " )\" " )))
1656+ }
16361657 val args = rearrangeArguments(function.inputParam, input, function.name.toString)
16371658 val returnType = function.getScalarFuncReturnType
16381659 SQLFunctionExpression (
@@ -1712,6 +1733,26 @@ class SessionCatalog(
17121733 name, paramSize.toString, input.size)
17131734 }
17141735
1736+ // Check if any input contains a lambda variable
1737+ val hasLambdaVar = input.exists { expr =>
1738+ expr.find {
1739+ case _ : NamedLambdaVariable => true
1740+ case _ : UnresolvedNamedLambdaVariable => true
1741+ case _ => false
1742+ }.isDefined
1743+ }
1744+ if (hasLambdaVar) {
1745+ val formattedInputs = input.map {
1746+ case v : NamedLambdaVariable => " lambda " + v.name
1747+ case v : UnresolvedNamedLambdaVariable => " lambda " + v.name
1748+ case e => e.sql
1749+ }.mkString(" , " )
1750+ throw new AnalysisException (
1751+ errorClass = " UNSUPPORTED_FEATURE.LAMBDA_FUNCTION_WITH_SQL_UDF" ,
1752+ messageParameters = Map (
1753+ " funcName" -> (" \" " + function.name.unquotedString + " (" + formattedInputs + " )\" " )))
1754+ }
1755+
17151756 val inputs = inputParam.map { param =>
17161757 // Attributes referencing the input parameters inside the function can use the
17171758 // function name as a qualifier. E.G.:
0 commit comments