@@ -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