@@ -20,13 +20,12 @@ package org.apache.spark.sql.catalyst.expressions
2020import org .apache .spark .sql .catalyst .InternalRow
2121import org .apache .spark .sql .catalyst .expressions .codegen .{CodegenContext , CodeGenerator , ExprCode }
2222import org .apache .spark .sql .catalyst .expressions .codegen .Block ._
23- import org .apache .spark .sql .types .{AbstractDataType , DataType }
24-
25- private [catalyst] abstract class TryEval extends Expression with NullIntolerant {
26- protected def internalExpression : Expression
23+ import org .apache .spark .sql .types .DataType
2724
25+ private [catalyst] case class TryEval (child : Expression )
26+ extends UnaryExpression with NullIntolerant {
2827 override def doGenCode (ctx : CodegenContext , ev : ExprCode ): ExprCode = {
29- val childGen = internalExpression .genCode(ctx)
28+ val childGen = child .genCode(ctx)
3029 ev.copy(code = code """
3130 boolean ${ev.isNull} = true;
3231 ${CodeGenerator .javaType(dataType)} ${ev.value} = ${CodeGenerator .defaultValue(dataType)};
@@ -41,17 +40,18 @@ private[catalyst] abstract class TryEval extends Expression with NullIntolerant
4140
4241 override def eval (input : InternalRow ): Any =
4342 try {
44- internalExpression .eval(input)
43+ child .eval(input)
4544 } catch {
4645 case _ : Exception =>
4746 null
4847 }
4948
50- override def dataType : DataType = internalExpression .dataType
49+ override def dataType : DataType = child .dataType
5150
5251 override def nullable : Boolean = true
5352
54- override def children : Seq [Expression ] = internalExpression.children
53+ override protected def withNewChildInternal (newChild : Expression ): Expression =
54+ copy(child = newChild)
5555}
5656
5757@ ExpressionDescription (
@@ -63,21 +63,21 @@ private[catalyst] abstract class TryEval extends Expression with NullIntolerant
6363 """ ,
6464 since = " 3.2.0" ,
6565 group = " math_funcs" )
66- case class TryAdd (left : Expression , right : Expression ) extends TryEval with ImplicitCastInputTypes {
66+ case class TryAdd (left : Expression , right : Expression , child : Expression )
67+ extends RuntimeReplaceable {
68+ def this (left : Expression , right : Expression ) =
69+ this (left, right, TryEval (Add (left, right, failOnError = true )))
6770
68- protected override def internalExpression : Expression =
69- Add (left : Expression , right : Expression , failOnError = true )
71+ override def flatArguments : Iterator [Any ] = Iterator (left, right)
7072
71- override def prettyName : String = " try_add "
73+ override def exprsReplaced : Seq [ Expression ] = Seq (left, right)
7274
73- override def inputTypes : Seq [AbstractDataType ] =
74- internalExpression.asInstanceOf [ExpectsInputTypes ].inputTypes
75+ override def prettyName : String = " try_add"
7576
76- override protected def withNewChildrenInternal ( newChildren : IndexedSeq [ Expression ] ): Expression =
77- copy(left = newChildren( 0 ), right = newChildren( 1 ) )
77+ override protected def withNewChildInternal ( newChild : Expression ): Expression =
78+ this . copy(child = newChild )
7879}
7980
80-
8181// scalastyle:off line.size.limit
8282@ ExpressionDescription (
8383 usage = " _FUNC_(expr1, expr2) - Returns `expr1`/`expr2`. It always performs floating point division. Its result is always null if `expr2` is 0." ,
@@ -91,17 +91,17 @@ case class TryAdd(left: Expression, right: Expression) extends TryEval with Impl
9191 since = " 3.2.0" ,
9292 group = " math_funcs" )
9393// scalastyle:on line.size.limit
94- case class TryDivide (left : Expression , right : Expression )
95- extends TryEval with ImplicitCastInputTypes {
94+ case class TryDivide (left : Expression , right : Expression , child : Expression )
95+ extends RuntimeReplaceable {
96+ def this (left : Expression , right : Expression ) =
97+ this (left, right, TryEval (Divide (left, right, failOnError = true )))
9698
97- protected override def internalExpression : Expression =
98- Divide (left, right, failOnError = true )
99+ override def flatArguments : Iterator [Any ] = Iterator (left, right)
99100
100- override def prettyName : String = " try_divide "
101+ override def exprsReplaced : Seq [ Expression ] = Seq (left, right)
101102
102- override protected def withNewChildrenInternal (newChildren : IndexedSeq [Expression ]): Expression =
103- copy(left = newChildren(0 ), right = newChildren(1 ))
103+ override def prettyName : String = " try_divide"
104104
105- override def inputTypes : Seq [ AbstractDataType ] =
106- internalExpression. asInstanceOf [ ExpectsInputTypes ].inputTypes
105+ override protected def withNewChildInternal ( newChild : Expression ) : Expression =
106+ this .copy(child = newChild)
107107}
0 commit comments