@@ -91,9 +91,11 @@ object ColumnPruning extends Rule[LogicalPlan] {
91
91
*/
92
92
object ConstantFolding extends Rule [LogicalPlan ] {
93
93
def apply (plan : LogicalPlan ): LogicalPlan = plan transform {
94
- case q : LogicalPlan => q transformExpressionsDown {
94
+ case q : LogicalPlan => q transformExpressionsUp {
95
95
// Skip redundant folding of literals.
96
96
case l : Literal => l
97
+ // if it's foldable
98
+ case e if e.foldable => Literal (e.eval(null ), e.dataType)
97
99
case e @ Count (Literal (null , _)) => Literal (null , e.dataType)
98
100
case e @ Sum (Literal (null , _)) => Literal (null , e.dataType)
99
101
case e @ Average (Literal (null , _)) => Literal (null , e.dataType)
@@ -124,15 +126,18 @@ object ConstantFolding extends Rule[LogicalPlan] {
124
126
case Literal (candidate, _) if (candidate == v) => true
125
127
case _ => false
126
128
})) => 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.
128
132
case e : UnaryExpression => e.child match {
129
133
case Literal (null , _) => Literal (null , e.dataType)
134
+ case _ => e
130
135
}
131
136
case e : BinaryExpression => e.children match {
132
137
case Literal (null , _) :: right :: Nil => Literal (null , e.dataType)
133
138
case left :: Literal (null , _) :: Nil => Literal (null , e.dataType)
139
+ case _ => e
134
140
}
135
- case e if e.foldable => Literal (e.eval(null ), e.dataType)
136
141
}
137
142
}
138
143
}
0 commit comments