Skip to content

Commit 536c005

Browse files
Add Exceptional case for constant folding
1 parent 3c045c7 commit 536c005

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypes.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ case class GetItem(child: Expression, ordinal: Expression) extends Expression {
2828
val children = child :: ordinal :: Nil
2929
/** `Null` is returned for invalid ordinals. */
3030
override def nullable = true
31+
override def foldable = child.foldable && ordinal.foldable
3132
override def references = children.flatMap(_.references).toSet
3233
def dataType = child.dataType match {
3334
case ArrayType(dt) => dt
@@ -69,7 +70,8 @@ case class GetField(child: Expression, fieldName: String) extends UnaryExpressio
6970
type EvaluatedType = Any
7071

7172
def dataType = field.dataType
72-
def nullable = field.nullable
73+
override def nullable = field.nullable
74+
override def foldable = child.foldable
7375

7476
protected def structType = child.dataType match {
7577
case s: StructType => s

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ object ColumnPruning extends Rule[LogicalPlan] {
9191
*/
9292
object ConstantFolding extends Rule[LogicalPlan] {
9393
def apply(plan: LogicalPlan): LogicalPlan = plan transform {
94-
case q: LogicalPlan => q transformExpressionsDown {
94+
case q: LogicalPlan => q transformExpressionsUp {
9595
// Skip redundant folding of literals.
9696
case l: Literal => l
97+
// if it's foldable
98+
case e if e.foldable => Literal(e.eval(null), e.dataType)
9799
case e @ Count(Literal(null, _)) => Literal(null, e.dataType)
98100
case e @ Sum(Literal(null, _)) => Literal(null, e.dataType)
99101
case e @ Average(Literal(null, _)) => Literal(null, e.dataType)
@@ -124,15 +126,18 @@ object ConstantFolding extends Rule[LogicalPlan] {
124126
case Literal(candidate, _) if(candidate == v) => true
125127
case _ => false
126128
})) => Literal(true, BooleanType)
127-
// TODO put exceptional cases(Unary & Binary Expression) before here.
129+
130+
case e @ SortOrder(_, _) => e
131+
// put exceptional cases(Unary & Binary Expression) before here.
128132
case e: UnaryExpression => e.child match {
129133
case Literal(null, _) => Literal(null, e.dataType)
134+
case _ => e
130135
}
131136
case e: BinaryExpression => e.children match {
132137
case Literal(null, _) :: right :: Nil => Literal(null, e.dataType)
133138
case left :: Literal(null, _) :: Nil => Literal(null, e.dataType)
139+
case _ => e
134140
}
135-
case e if e.foldable => Literal(e.eval(null), e.dataType)
136141
}
137142
}
138143
}

0 commit comments

Comments
 (0)