@@ -91,9 +91,11 @@ object ColumnPruning extends Rule[LogicalPlan] {
9191 */
9292object 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