IMPALA-7818: Standardize use of Expr predicates

The Expr node provide two kinds of queries about node categories:
predicates and isMumble() functions. This change standardizes two
existing methods to use predicates instead.

First, the existing isLiteral() method is replaced by a new
IS_LITERAL predicate.

The key purpose is to clean up the confusing use of the existing
isNullLiteral() method, which actually is a check for either a null
literal or a cast of a null. To make this clearer, replaced this
method with a new IS_NULL_VALUE() predicate.

Added a new IS_NULL_LITERAL predicate for the case when a node must be
exactly the NULL literal, not a cast to NULL. Replaced instances of
foo instanceof NullLiteral with a use of the new IS_NULL_LITERAL
predicate. (This revealed bugs which will be addressed separately.)

Added an IS_NON_NULL_LITERAL to replace the two-method idiom used in
several places.

Tests: No functional change. Reran all tests to ensure nothing changed.

Change-Id: I09a089c0f2484246e5c6444b78990fa9260c036a
Reviewed-on: http://gerrit.cloudera.org:8080/11887
Reviewed-by: Impala Public Jenkins <impala-public-jenk...@cloudera.com>
Tested-by: Impala Public Jenkins <impala-public-jenk...@cloudera.com>


Project: http://git-wip-us.apache.org/repos/asf/impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/impala/commit/8dfbe3c8
Tree: http://git-wip-us.apache.org/repos/asf/impala/tree/8dfbe3c8
Diff: http://git-wip-us.apache.org/repos/asf/impala/diff/8dfbe3c8

Branch: refs/heads/branch-3.1.0
Commit: 8dfbe3c82d4acfae60d58636af041ac13708ef1e
Parents: ccabc49
Author: Paul Rogers <prog...@cloudera.com>
Authored: Tue Nov 6 10:34:30 2018 -0800
Committer: Zoltan Borok-Nagy <borokna...@cloudera.com>
Committed: Tue Nov 13 12:51:49 2018 +0100

----------------------------------------------------------------------
 fe/src/main/cup/sql-parser.cup                  |  2 +-
 .../org/apache/impala/analysis/Analyzer.java    |  2 +-
 .../org/apache/impala/analysis/CaseExpr.java    |  7 +-
 .../org/apache/impala/analysis/CastExpr.java    |  2 +-
 .../org/apache/impala/analysis/ColumnDef.java   |  2 +-
 .../java/org/apache/impala/analysis/Expr.java   | 90 ++++++++++++++------
 .../impala/analysis/FunctionCallExpr.java       |  2 +-
 .../apache/impala/analysis/LikePredicate.java   |  4 +-
 .../org/apache/impala/analysis/LiteralExpr.java |  6 +-
 .../impala/analysis/PartitionKeyValue.java      |  5 +-
 .../apache/impala/analysis/PartitionSet.java    |  2 +-
 .../apache/impala/analysis/PartitionSpec.java   |  2 +-
 .../apache/impala/analysis/RangePartition.java  |  2 +-
 .../org/apache/impala/analysis/SelectStmt.java  |  2 +-
 .../impala/analysis/TupleIsNullPredicate.java   |  2 +-
 .../apache/impala/catalog/FeCatalogUtils.java   |  2 +-
 .../org/apache/impala/catalog/FeFsTable.java    |  3 +-
 .../org/apache/impala/catalog/HdfsTable.java    |  5 +-
 .../impala/catalog/local/LocalFsTable.java      |  4 +-
 .../impala/planner/HdfsPartitionPruner.java     | 14 +--
 .../org/apache/impala/planner/HdfsScanNode.java |  6 +-
 .../org/apache/impala/planner/KuduScanNode.java |  6 +-
 .../impala/rewrite/FoldConstantsRule.java       |  6 +-
 .../impala/rewrite/NormalizeCountStarRule.java  |  4 +-
 .../rewrite/RemoveRedundantStringCast.java      |  4 +-
 .../rewrite/SimplifyConditionalsRule.java       | 37 ++++----
 .../org/apache/impala/service/FeSupport.java    |  2 +-
 .../impala/analysis/ExprRewriterTest.java       |  4 +-
 .../impala/catalog/local/LocalCatalogTest.java  |  3 +-
 29 files changed, 138 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/cup/sql-parser.cup
----------------------------------------------------------------------
diff --git a/fe/src/main/cup/sql-parser.cup b/fe/src/main/cup/sql-parser.cup
index ebe653a..50418d0 100644
--- a/fe/src/main/cup/sql-parser.cup
+++ b/fe/src/main/cup/sql-parser.cup
@@ -2916,7 +2916,7 @@ sign_chain_expr ::=
     // integrate signs into literals
     // integer literals require analysis to set their type, so the instance 
check below
     // is not equivalent to e.getType().isNumericType()
-    if (e.isLiteral() && e instanceof NumericLiteral) {
+    if (e instanceof NumericLiteral) {
       ((LiteralExpr)e).swapSign();
       RESULT = e;
     } else {

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/Analyzer.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/Analyzer.java 
b/fe/src/main/java/org/apache/impala/analysis/Analyzer.java
index 0672cfb..ca5ac72 100644
--- a/fe/src/main/java/org/apache/impala/analysis/Analyzer.java
+++ b/fe/src/main/java/org/apache/impala/analysis/Analyzer.java
@@ -1165,7 +1165,7 @@ public class Analyzer {
   public void createAuxEqPredicate(Expr lhs, Expr rhs) {
     // Check the expr type as well as the class because  NullLiteral could 
have been
     // implicitly cast to a type different than NULL.
-    if (lhs instanceof NullLiteral || rhs instanceof NullLiteral ||
+    if (Expr.IS_NULL_LITERAL.apply(lhs) || Expr.IS_NULL_LITERAL.apply(rhs) ||
         lhs.getType().isNull() || rhs.getType().isNull()) {
       return;
     }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java 
b/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
index 196c5cd..7158f8d 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
@@ -32,7 +32,6 @@ import org.apache.impala.thrift.TExprNode;
 import org.apache.impala.thrift.TExprNodeType;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Predicates;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
@@ -127,8 +126,8 @@ public class CaseExpr extends Expr {
     // Add the key_expr/val_expr pairs
     while (childIdx + 2 <= decodeExpr.getChildren().size()) {
       Expr candidate = decodeExpr.getChild(childIdx++);
-      if (candidate.isLiteral()) {
-        if (candidate.isNullLiteral()) {
+      if (IS_LITERAL.apply(candidate)) {
+        if (IS_NULL_VALUE.apply(candidate)) {
           // An example case is DECODE(foo, NULL, bar), since NULLs are 
considered
           // equal, this becomes CASE WHEN foo IS NULL THEN bar END.
           children_.add(encodedIsNull.clone());
@@ -402,7 +401,7 @@ public class CaseExpr extends Expr {
       Expr outputExpr = children_.get(i);
 
       if (outputExpr.isConstant()) {
-        if (outputExpr.isLiteral()) {
+        if (IS_LITERAL.apply(outputExpr)) {
           LiteralExpr outputLiteral = (LiteralExpr) outputExpr;
           if (constLiteralSet.add(outputLiteral)) ++numOutputConstants;
         } else {

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CastExpr.java 
b/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
index a674f4a..e76a558 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
@@ -248,7 +248,7 @@ public class CastExpr extends Expr {
 
     // Ensure child has non-null type (even if it's a null literal). This is 
required
     // for the UDF interface.
-    if (children_.get(0) instanceof NullLiteral) {
+    if (Expr.IS_NULL_LITERAL.apply(children_.get(0))) {
       NullLiteral nullChild = (NullLiteral)(children_.get(0));
       nullChild.uncheckedCastTo(type_);
     }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/ColumnDef.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ColumnDef.java 
b/fe/src/main/java/org/apache/impala/analysis/ColumnDef.java
index 24f6029..fa158e3 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ColumnDef.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ColumnDef.java
@@ -269,7 +269,7 @@ public class ColumnDef {
         e.analyze(analyzer);
         defaultValLiteral = LiteralExpr.create(e, analyzer.getQueryCtx());
         Preconditions.checkNotNull(defaultValLiteral);
-        if (defaultValLiteral.isNullLiteral()) {
+        if (Expr.IS_NULL_VALUE.apply(defaultValLiteral)) {
           throw new AnalysisException(String.format("String %s cannot be cast 
" +
               "to a TIMESTAMP literal.", defaultValue_.toSql()));
         }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/Expr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/Expr.java 
b/fe/src/main/java/org/apache/impala/analysis/Expr.java
index fdf639e..ac5c394 100644
--- a/fe/src/main/java/org/apache/impala/analysis/Expr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/Expr.java
@@ -208,7 +208,7 @@ abstract public class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
     public boolean apply(Expr arg) {
       return arg instanceof BinaryPredicate
           && ((BinaryPredicate) arg).getOp() == Operator.EQ
-          && (((BinaryPredicate) arg).getChild(1).isLiteral());
+          && IS_LITERAL.apply(((BinaryPredicate) arg).getChild(1));
     }
   };
 
@@ -231,6 +231,65 @@ abstract public class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
         }
       };
 
+  /**
+   * @return true if the expression is a literal.
+   */
+  public final static com.google.common.base.Predicate<Expr> IS_LITERAL =
+    new com.google.common.base.Predicate<Expr>() {
+      @Override
+      public boolean apply(Expr arg) {
+        return arg instanceof LiteralExpr;
+      }
+    };
+
+  /**
+   * @return true if the expression is a null literal.
+   */
+  public final static com.google.common.base.Predicate<Expr> IS_NULL_LITERAL =
+    new com.google.common.base.Predicate<Expr>() {
+      @Override
+      public boolean apply(Expr arg) {
+        return arg instanceof NullLiteral;
+      }
+    };
+
+  /**
+   * @return true if the expression is a literal value other than NULL.
+   */
+  public final static com.google.common.base.Predicate<Expr> 
IS_NON_NULL_LITERAL =
+    new com.google.common.base.Predicate<Expr>() {
+      @Override
+      public boolean apply(Expr arg) {
+        return IS_LITERAL.apply(arg) && !IS_NULL_LITERAL.apply(arg);
+      }
+    };
+
+  /**
+   * @return true if the expression is a null literal, or a
+   * cast of a null (as created by the ConstantFoldingRule.)
+   */
+  public final static com.google.common.base.Predicate<Expr> IS_NULL_VALUE =
+    new com.google.common.base.Predicate<Expr>() {
+      @Override
+      public boolean apply(Expr arg) {
+        if (arg instanceof NullLiteral) return true;
+        if (! (arg instanceof CastExpr)) return false;
+        return IS_NULL_VALUE.apply(((CastExpr) arg).getChild(0));
+      }
+    };
+
+  /**
+   * @return true if the expression is a  literal, or a
+   * cast of a null (as created by the ConstantFoldingRule.)
+   */
+  public final static com.google.common.base.Predicate<Expr> IS_LITERAL_VALUE =
+    new com.google.common.base.Predicate<Expr>() {
+      @Override
+      public boolean apply(Expr arg) {
+        return IS_LITERAL.apply(arg) || IS_NULL_VALUE.apply(arg);
+      }
+    };
+
   // id that's unique across the entire query statement and is assigned by
   // Analyzer.registerConjuncts(); only assigned for the top-level terms of a
   // conjunction, and therefore null for most Exprs
@@ -638,7 +697,8 @@ abstract public class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
       // Hack to ensure BE never sees TYPE_NULL. If an expr makes it this far 
without
       // being cast to a non-NULL type, the type doesn't matter and we can 
cast it
       // arbitrarily.
-      Preconditions.checkState(this instanceof NullLiteral || this instanceof 
SlotRef);
+      Preconditions.checkState(IS_NULL_LITERAL.apply(this) ||
+          this instanceof SlotRef);
       return NullLiteral.create(ScalarType.BOOLEAN).treeToThrift();
     }
     TExpr result = new TExpr();
@@ -1106,13 +1166,13 @@ abstract public class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
           // Remove constant boolean literal expressions.  N.B. - we may have
           // expressions determined to be constant which can not yet be 
discarded
           // because they can't be evaluated if expr rewriting is turned off.
-          if (rewritten instanceof NullLiteral ||
-              Expr.IS_FALSE_LITERAL.apply(rewritten)) {
+          if (IS_NULL_LITERAL.apply(rewritten) ||
+              IS_FALSE_LITERAL.apply(rewritten)) {
             conjuncts.clear();
             conjuncts.add(rewritten);
             return false;
           }
-          if (Expr.IS_TRUE_LITERAL.apply(rewritten)) {
+          if (IS_TRUE_LITERAL.apply(rewritten)) {
             pruned++;
             conjuncts.remove(index);
           }
@@ -1183,13 +1243,6 @@ abstract public class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
   }
 
   /**
-   * @return true if this is an instance of LiteralExpr
-   */
-  public boolean isLiteral() {
-    return this instanceof LiteralExpr;
-  }
-
-  /**
    * Returns true if this expression should be treated as constant. I.e. if 
the frontend
    * and backend should assume that two evaluations of the expression within a 
query will
    * return the same value. Examples of constant expressions include:
@@ -1220,17 +1273,6 @@ abstract public class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
   }
 
   /**
-   * @return true if this expr is either a null literal or a cast from
-   * a null literal.
-   */
-  public boolean isNullLiteral() {
-    if (this instanceof NullLiteral) return true;
-    if (!(this instanceof CastExpr)) return false;
-    Preconditions.checkState(children_.size() == 1);
-    return children_.get(0).isNullLiteral();
-  }
-
-  /**
    * Return true if this expr is a scalar subquery.
    */
   public boolean isScalarSubquery() {
@@ -1404,7 +1446,7 @@ abstract public class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
    */
   public static Expr pushNegationToOperands(Expr root) {
     Preconditions.checkNotNull(root);
-    if (Expr.IS_NOT_PREDICATE.apply(root)) {
+    if (IS_NOT_PREDICATE.apply(root)) {
       try {
         // Make sure we call function 'negate' only on classes that support it,
         // otherwise we may recurse infinitely.

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java 
b/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
index 2716199..6fd3e97 100644
--- a/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
@@ -429,7 +429,7 @@ public class FunctionCallExpr extends Expr {
         // The second argument to these functions is the desired scale, 
otherwise
         // the default is 0.
         Preconditions.checkState(children_.size() == 2);
-        if (children_.get(1).isNullLiteral()) {
+        if (IS_NULL_VALUE.apply(children_.get(1))) {
           throw new AnalysisException(fnName_.getFunction() +
               "() cannot be called with a NULL second argument.");
         }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/LikePredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/LikePredicate.java 
b/fe/src/main/java/org/apache/impala/analysis/LikePredicate.java
index 3830c95..181c7f7 100644
--- a/fe/src/main/java/org/apache/impala/analysis/LikePredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/LikePredicate.java
@@ -129,7 +129,7 @@ public class LikePredicate extends Predicate {
     Preconditions.checkState(fn_ != null);
     Preconditions.checkState(fn_.getReturnType().isBoolean());
 
-    if (getChild(1).isLiteral() && !getChild(1).isNullLiteral()
+    if (Expr.IS_NON_NULL_LITERAL.apply(getChild(1))
         && (op_ == Operator.RLIKE || op_ == Operator.REGEXP || op_ == 
Operator.IREGEXP)) {
       // let's make sure the pattern works
       // TODO: this checks that it's a Java-supported regex, but the syntax 
supported
@@ -147,7 +147,7 @@ public class LikePredicate extends Predicate {
   @Override
   protected float computeEvalCost() {
     if (!hasChildCosts()) return UNKNOWN_COST;
-    if (getChild(1).isLiteral() && !getChild(1).isNullLiteral() &&
+    if (Expr.IS_NON_NULL_LITERAL.apply(getChild(1)) &&
       Pattern.matches("[%_]*[^%_]*[%_]*",
           ((StringLiteral) getChild(1)).getValueWithOriginalEscapes())) {
       // This pattern only has wildcards as leading or trailing character,

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/LiteralExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/LiteralExpr.java 
b/fe/src/main/java/org/apache/impala/analysis/LiteralExpr.java
index 2a5e502..cde3db3 100644
--- a/fe/src/main/java/org/apache/impala/analysis/LiteralExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/LiteralExpr.java
@@ -275,9 +275,9 @@ public abstract class LiteralExpr extends Expr implements 
Comparable<LiteralExpr
   // Order NullLiterals based on the SQL ORDER BY default behavior: NULLS LAST.
   @Override
   public int compareTo(LiteralExpr other) {
-    if (this instanceof NullLiteral && other instanceof NullLiteral) return 0;
-    if (this instanceof NullLiteral) return -1;
-    if (other instanceof NullLiteral) return 1;
+    if (Expr.IS_NULL_LITERAL.apply(this) && Expr.IS_NULL_LITERAL.apply(other)) 
return 0;
+    if (Expr.IS_NULL_LITERAL.apply(this)) return -1;
+    if (Expr.IS_NULL_LITERAL.apply(other)) return 1;
     if (getClass() != other.getClass()) return -1;
     return 0;
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/PartitionKeyValue.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/PartitionKeyValue.java 
b/fe/src/main/java/org/apache/impala/analysis/PartitionKeyValue.java
index b35a567..8b3b556 100644
--- a/fe/src/main/java/org/apache/impala/analysis/PartitionKeyValue.java
+++ b/fe/src/main/java/org/apache/impala/analysis/PartitionKeyValue.java
@@ -69,7 +69,7 @@ public class PartitionKeyValue {
    */
   public String toPredicateSql() {
     String ident = ToSqlUtils.getIdentSql(colName_);
-    if (literalValue_ instanceof NullLiteral ||
+    if (Expr.IS_NULL_LITERAL.apply(literalValue_) ||
         literalValue_.getStringValue().isEmpty()) {
       return ident + " IS NULL";
     }
@@ -84,7 +84,8 @@ public class PartitionKeyValue {
   public static String getPartitionKeyValueString(LiteralExpr literalValue,
       String nullPartitionKeyValue) {
     Preconditions.checkNotNull(literalValue);
-    if (literalValue instanceof NullLiteral || 
literalValue.getStringValue().isEmpty()) {
+    if (Expr.IS_NULL_LITERAL.apply(literalValue) ||
+        literalValue.getStringValue().isEmpty()) {
       return nullPartitionKeyValue;
     }
     return literalValue.getStringValue();

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java 
b/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java
index 46a5d7b..1aa30ac 100644
--- a/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java
+++ b/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java
@@ -152,7 +152,7 @@ public class PartitionSet extends PartitionSpecBase {
         if (bp.getOp() == Operator.EQ) {
           SlotRef leftChild =
               bp.getChild(0) instanceof SlotRef ? ((SlotRef) bp.getChild(0)) : 
null;
-          NullLiteral nullChild = bp.getChild(1) instanceof NullLiteral ?
+          NullLiteral nullChild = Expr.IS_NULL_LITERAL.apply(bp.getChild(1)) ?
               ((NullLiteral) bp.getChild(1)) : null;
           StringLiteral stringChild = bp.getChild(1) instanceof StringLiteral ?
               ((StringLiteral) bp.getChild(1)) : null;

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/PartitionSpec.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/PartitionSpec.java 
b/fe/src/main/java/org/apache/impala/analysis/PartitionSpec.java
index 1a82dca..ac0551d 100644
--- a/fe/src/main/java/org/apache/impala/analysis/PartitionSpec.java
+++ b/fe/src/main/java/org/apache/impala/analysis/PartitionSpec.java
@@ -88,7 +88,7 @@ public class PartitionSpec extends PartitionSpecBase {
         throw new AnalysisException(String.format(
             "Column '%s' is not a partition column in table: %s",
              pk.getColName(), tableName_));
-      } else if (pk.getValue() instanceof NullLiteral) {
+      } else if (Expr.IS_NULL_LITERAL.apply(pk.getValue())) {
         // No need for further analysis checks of this partition key value.
         continue;
       }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/RangePartition.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/RangePartition.java 
b/fe/src/main/java/org/apache/impala/analysis/RangePartition.java
index e0441f8..515bf24 100644
--- a/fe/src/main/java/org/apache/impala/analysis/RangePartition.java
+++ b/fe/src/main/java/org/apache/impala/analysis/RangePartition.java
@@ -182,7 +182,7 @@ public class RangePartition implements ParseNode {
       e.analyze(analyzer);
       literal = LiteralExpr.create(e, analyzer.getQueryCtx());
       Preconditions.checkNotNull(literal);
-      if (literal.isNullLiteral()) {
+      if (Expr.IS_NULL_VALUE.apply(literal)) {
         throw new AnalysisException(String.format("Range partition value %s 
cannot be " +
             "cast to target TIMESTAMP partitioning column.", value.toSql()));
       }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java 
b/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java
index ce90cd3..8debd95 100644
--- a/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java
@@ -958,7 +958,7 @@ public class SelectStmt extends QueryStmt {
   private Expr rewriteCheckOrdinalResult(ExprRewriter rewriter, Expr expr)
       throws AnalysisException {
     Expr rewrittenExpr = rewriter.rewrite(expr, analyzer_);
-    if (rewrittenExpr.isLiteral() && rewrittenExpr.getType().isIntegerType()) {
+    if (Expr.IS_LITERAL.apply(rewrittenExpr) && 
rewrittenExpr.getType().isIntegerType()) {
       return expr;
     } else {
       return rewrittenExpr;

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java
----------------------------------------------------------------------
diff --git 
a/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java 
b/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java
index 25d6c51..b77735e 100644
--- a/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java
@@ -173,7 +173,7 @@ public class TupleIsNullPredicate extends Predicate {
       List<Expr> params = fnCallExpr.getParams().exprs();
       if (fnCallExpr.getFnName().getFunction().equals("if") &&
           params.get(0) instanceof TupleIsNullPredicate &&
-          params.get(1) instanceof NullLiteral) {
+          Expr.IS_NULL_LITERAL.apply(params.get(1))) {
         return unwrapExpr(params.get(2));
       }
     }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/catalog/FeCatalogUtils.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/FeCatalogUtils.java 
b/fe/src/main/java/org/apache/impala/catalog/FeCatalogUtils.java
index 8c865fe..c50f406 100644
--- a/fe/src/main/java/org/apache/impala/catalog/FeCatalogUtils.java
+++ b/fe/src/main/java/org/apache/impala/catalog/FeCatalogUtils.java
@@ -292,7 +292,7 @@ public abstract class FeCatalogUtils {
     for (int i = 0; i < partColSql.size(); ++i) {
       LiteralExpr partVal = part.getPartitionValues().get(i);
       String partValSql = partVal.toSql();
-      if (partVal instanceof NullLiteral || partValSql.isEmpty()) {
+      if (Expr.IS_NULL_LITERAL.apply(partVal) || partValSql.isEmpty()) {
         conjuncts.add(partColSql.get(i) + " IS NULL");
       } else {
         conjuncts.add(partColSql.get(i) + "=" + partValSql);

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/catalog/FeFsTable.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/FeFsTable.java 
b/fe/src/main/java/org/apache/impala/catalog/FeFsTable.java
index e9ef929..0c861af 100644
--- a/fe/src/main/java/org/apache/impala/catalog/FeFsTable.java
+++ b/fe/src/main/java/org/apache/impala/catalog/FeFsTable.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import java.util.TreeMap;
 
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.impala.analysis.Expr;
 import org.apache.impala.analysis.LiteralExpr;
 import org.apache.impala.analysis.NullLiteral;
 import org.apache.impala.analysis.PartitionKeyValue;
@@ -409,7 +410,7 @@ public interface FeFsTable extends FeTable {
         boolean matchFound = true;
         for (int i = 0; i < targetValues.size(); ++i) {
           String value;
-          if (partitionValues.get(i) instanceof NullLiteral) {
+          if (Expr.IS_NULL_LITERAL.apply(partitionValues.get(i))) {
             value = table.getNullPartitionKeyValue();
           } else {
             value = partitionValues.get(i).getStringValue();

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java 
b/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java
index 1087e87..768e0bf 100644
--- a/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java
+++ b/fe/src/main/java/org/apache/impala/catalog/HdfsTable.java
@@ -50,6 +50,7 @@ import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.metastore.api.Partition;
 import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
 import org.apache.hadoop.hive.serde.serdeConstants;
+import org.apache.impala.analysis.Expr;
 import org.apache.impala.analysis.LiteralExpr;
 import org.apache.impala.analysis.NullLiteral;
 import org.apache.impala.analysis.NumericLiteral;
@@ -1047,7 +1048,7 @@ public class HdfsTable extends Table implements FeFsTable 
{
       ColumnStats stats = getColumns().get(i).getStats();
       LiteralExpr literal = partition.getPartitionValues().get(i);
       // Store partitions with null partition values separately
-      if (literal instanceof NullLiteral) {
+      if (Expr.IS_NULL_LITERAL.apply(literal)) {
         stats.setNumNulls(stats.getNumNulls() + 1);
         if (nullPartitionIds_.get(i).isEmpty()) {
           stats.setNumDistinctValues(stats.getNumDistinctValues() + 1);
@@ -1105,7 +1106,7 @@ public class HdfsTable extends Table implements FeFsTable 
{
       ColumnStats stats = getColumns().get(i).getStats();
       LiteralExpr literal = partition.getPartitionValues().get(i);
       // Check if this is a null literal.
-      if (literal instanceof NullLiteral) {
+      if (Expr.IS_NULL_LITERAL.apply(literal)) {
         nullPartitionIds_.get(i).remove(partitionId);
         stats.setNumNulls(stats.getNumNulls() - 1);
         if (nullPartitionIds_.get(i).isEmpty()) {

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java 
b/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
index 3ace234..5b16fbe 100644
--- a/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
+++ b/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
@@ -32,8 +32,8 @@ import org.apache.hadoop.hive.metastore.api.Partition;
 import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
 import org.apache.hadoop.hive.metastore.api.Table;
 import org.apache.hadoop.hive.serde.serdeConstants;
+import org.apache.impala.analysis.Expr;
 import org.apache.impala.analysis.LiteralExpr;
-import org.apache.impala.analysis.NullLiteral;
 import org.apache.impala.catalog.CatalogException;
 import org.apache.impala.catalog.CatalogObject.ThriftObjectType;
 import org.apache.impala.catalog.Column;
@@ -442,7 +442,7 @@ public class LocalFsTable extends LocalTable implements 
FeFsTable {
       List<LiteralExpr> vals = partition.getPartitionValues();
       for (int i = 0; i < getNumClusteringCols(); i++) {
         LiteralExpr val = vals.get(i);
-        if (val instanceof NullLiteral) {
+        if (Expr.IS_NULL_LITERAL.apply(val)) {
           nullParts.get(i).add(partition.getId());
           continue;
         }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/planner/HdfsPartitionPruner.java
----------------------------------------------------------------------
diff --git 
a/fe/src/main/java/org/apache/impala/planner/HdfsPartitionPruner.java 
b/fe/src/main/java/org/apache/impala/planner/HdfsPartitionPruner.java
index 1584d44..f2723a6 100644
--- a/fe/src/main/java/org/apache/impala/planner/HdfsPartitionPruner.java
+++ b/fe/src/main/java/org/apache/impala/planner/HdfsPartitionPruner.java
@@ -193,7 +193,7 @@ public class HdfsPartitionPruner {
       SlotRef slot = bp.getBoundSlot();
       if (slot == null) return false;
       Expr bindingExpr = bp.getSlotBinding(slot.getSlotId());
-      if (bindingExpr == null || !bindingExpr.isLiteral()) return false;
+      if (bindingExpr == null || !Expr.IS_LITERAL.apply(bindingExpr)) return 
false;
       return true;
     } else if (expr instanceof CompoundPredicate) {
       boolean res = canEvalUsingPartitionMd(expr.getChild(0), analyzer);
@@ -217,7 +217,7 @@ public class HdfsPartitionPruner {
       SlotRef slot = ((InPredicate)expr).getBoundSlot();
       if (slot == null) return false;
       for (int i = 1; i < expr.getChildren().size(); ++i) {
-        if (!(expr.getChild(i).isLiteral())) return false;
+        if (!Expr.IS_LITERAL.apply(expr.getChild(i))) return false;
       }
       return true;
     }
@@ -233,7 +233,7 @@ public class HdfsPartitionPruner {
     Preconditions.checkNotNull(expr);
     Preconditions.checkState(expr instanceof BinaryPredicate);
     boolean isSlotOnLeft = true;
-    if (expr.getChild(0).isLiteral()) isSlotOnLeft = false;
+    if (Expr.IS_LITERAL.apply(expr.getChild(0))) isSlotOnLeft = false;
 
     // Get the operands
     BinaryPredicate bp = (BinaryPredicate)expr;
@@ -241,10 +241,10 @@ public class HdfsPartitionPruner {
     Preconditions.checkNotNull(slot);
     Expr bindingExpr = bp.getSlotBinding(slot.getSlotId());
     Preconditions.checkNotNull(bindingExpr);
-    Preconditions.checkState(bindingExpr.isLiteral());
+    Preconditions.checkState(Expr.IS_LITERAL.apply(bindingExpr));
     LiteralExpr literal = (LiteralExpr)bindingExpr;
     Operator op = bp.getOp();
-    if ((literal instanceof NullLiteral) && (op != Operator.NOT_DISTINCT)
+    if (Expr.IS_NULL_LITERAL.apply(literal) && (op != Operator.NOT_DISTINCT)
         && (op != Operator.DISTINCT_FROM)) {
       return Sets.newHashSet();
     }
@@ -260,7 +260,7 @@ public class HdfsPartitionPruner {
     // Compute the matching partition ids
     if (op == Operator.NOT_DISTINCT) {
       // Case: SlotRef <=> Literal
-      if (literal instanceof NullLiteral) {
+      if (Expr.IS_NULL_LITERAL.apply(literal)) {
         Set<Long> ids = tbl_.getNullPartitionIds(partitionPos);
         if (ids != null) matchingIds.addAll(ids);
         return matchingIds;
@@ -277,7 +277,7 @@ public class HdfsPartitionPruner {
     if (op == Operator.DISTINCT_FROM) {
       // Case: SlotRef IS DISTINCT FROM Literal
       matchingIds.addAll(tbl_.getPartitionIds());
-      if (literal instanceof NullLiteral) {
+      if (Expr.IS_NULL_LITERAL.apply(literal)) {
         Set<Long> nullIds = tbl_.getNullPartitionIds(partitionPos);
         matchingIds.removeAll(nullIds);
       } else {

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java 
b/fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java
index c1ff092..4338bbc 100644
--- a/fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java
+++ b/fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java
@@ -513,7 +513,7 @@ public class HdfsScanNode extends ScanNode {
     // Only constant exprs can be evaluated against parquet::Statistics. This 
includes
     // LiteralExpr, but can also be an expr like "1 + 2".
     if (!constExpr.isConstant()) return;
-    if (constExpr.isNullLiteral()) return;
+    if (Expr.IS_NULL_VALUE.apply(constExpr)) return;
 
     BinaryPredicate.Operator op = binaryPred.getOp();
     if (op == BinaryPredicate.Operator.LT || op == BinaryPredicate.Operator.LE 
||
@@ -545,10 +545,10 @@ public class HdfsScanNode extends ScanNode {
       Expr child = children.get(i);
 
       // If any child is not a literal, then nothing can be done
-      if (!child.isLiteral()) return;
+      if (!Expr.IS_LITERAL.apply(child)) return;
       LiteralExpr literalChild = (LiteralExpr) child;
       // If any child is NULL, then there is not a valid min/max. Nothing can 
be done.
-      if (literalChild instanceof NullLiteral) return;
+      if (Expr.IS_NULL_LITERAL.apply(literalChild)) return;
 
       if (min == null || literalChild.compareTo(min) < 0) min = literalChild;
       if (max == null || literalChild.compareTo(max) > 0) max = literalChild;

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/planner/KuduScanNode.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/planner/KuduScanNode.java 
b/fe/src/main/java/org/apache/impala/planner/KuduScanNode.java
index fc1f371..348f45f 100644
--- a/fe/src/main/java/org/apache/impala/planner/KuduScanNode.java
+++ b/fe/src/main/java/org/apache/impala/planner/KuduScanNode.java
@@ -378,7 +378,7 @@ public class KuduScanNode extends ScanNode {
     LiteralExpr literal = (LiteralExpr) predicate.getChild(1);
 
     // Cannot push predicates with null literal values (KUDU-1595).
-    if (literal instanceof NullLiteral) return false;
+    if (Expr.IS_NULL_LITERAL.apply(literal)) return false;
 
     String colName = ((KuduColumn) ref.getDesc().getColumn()).getKuduName();
     ColumnSchema column = table.getSchema().getColumn(colName);
@@ -462,11 +462,11 @@ public class KuduScanNode extends ScanNode {
     // KuduPredicate takes a list of values as Objects.
     List<Object> values = Lists.newArrayList();
     for (int i = 1; i < predicate.getChildren().size(); ++i) {
-      if (!(predicate.getChild(i).isLiteral())) return false;
+      if (!Expr.IS_LITERAL.apply(predicate.getChild(i))) return false;
       LiteralExpr literal = (LiteralExpr) predicate.getChild(i);
 
       // Cannot push predicates with null literal values (KUDU-1595).
-      if (literal instanceof NullLiteral) return false;
+      if (Expr.IS_NULL_LITERAL.apply(literal)) return false;
 
       Object value = getKuduInListValue(analyzer, literal);
       if (value == null) return false;

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java 
b/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
index 3437531..dd0052f 100644
--- a/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
+++ b/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
@@ -48,14 +48,14 @@ public class FoldConstantsRule implements ExprRewriteRule {
     // Avoid calling Expr.isConstant() because that would lead to repeated 
traversals
     // of the Expr tree. Assumes the bottom-up application of this rule. 
Constant
     // children should have been folded at this point.
-    for (Expr child: expr.getChildren()) if (!child.isLiteral()) return expr;
-    if (expr.isLiteral() || !expr.isConstant()) return expr;
+    for (Expr child: expr.getChildren()) if (!Expr.IS_LITERAL.apply(child)) 
return expr;
+    if (Expr.IS_LITERAL.apply(expr) || !expr.isConstant()) return expr;
 
     // Do not constant fold cast(null as dataType) because we cannot preserve 
the
     // cast-to-types and that can lead to query failures, e.g., CTAS
     if (expr instanceof CastExpr) {
       CastExpr castExpr = (CastExpr) expr;
-      if (castExpr.getChild(0) instanceof NullLiteral) {
+      if (Expr.IS_NULL_LITERAL.apply(castExpr.getChild(0))) {
         return expr;
       }
     }

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/rewrite/NormalizeCountStarRule.java
----------------------------------------------------------------------
diff --git 
a/fe/src/main/java/org/apache/impala/rewrite/NormalizeCountStarRule.java 
b/fe/src/main/java/org/apache/impala/rewrite/NormalizeCountStarRule.java
index 2128211..f7d5c57 100644
--- a/fe/src/main/java/org/apache/impala/rewrite/NormalizeCountStarRule.java
+++ b/fe/src/main/java/org/apache/impala/rewrite/NormalizeCountStarRule.java
@@ -43,8 +43,8 @@ public class NormalizeCountStarRule implements 
ExprRewriteRule {
     if (origExpr.getParams().isDistinct()) return expr;
     if (origExpr.getParams().exprs().size() != 1) return expr;
     Expr child = origExpr.getChild(0);
-    if (!child.isLiteral()) return expr;
-    if (child.isNullLiteral()) return expr;
+    if (!Expr.IS_LITERAL.apply(child)) return expr;
+    if (Expr.IS_NULL_VALUE.apply(child)) return expr;
     FunctionCallExpr result = new FunctionCallExpr(new FunctionName("count"),
         FunctionParams.createStarParam());
     return result;

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
----------------------------------------------------------------------
diff --git 
a/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java 
b/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
index d305f27..97dcdbb 100644
--- a/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
+++ b/fe/src/main/java/org/apache/impala/rewrite/RemoveRedundantStringCast.java
@@ -67,7 +67,7 @@ public class RemoveRedundantStringCast implements 
ExprRewriteRule {
         (expr.getChild(0).ignoreImplicitCast() instanceof CastExpr) &&
         expr.getChild(0).ignoreImplicitCast().getType().isStringType() &&
         expr.getChild(1).getType().isStringType() &&
-        expr.getChild(1).isLiteral();
+        Expr.IS_LITERAL.apply(expr.getChild(1));
 
     if (!isPotentiallyRedundantCast) return expr;
     // Ignore the implicit casts added during parsing.
@@ -83,7 +83,7 @@ public class RemoveRedundantStringCast implements 
ExprRewriteRule {
     // Need to trim() while comparing char(n) types as conversion might add 
trailing
     // spaces to the 'resultOfReverseCast'.
     if (resultOfReverseCast != null &&
-        !resultOfReverseCast.isNullLiteral() &&
+        !Expr.IS_NULL_VALUE.apply(resultOfReverseCast) &&
         resultOfReverseCast.getStringValue().trim()
             .equals(literalExpr.getStringValue().trim())) {
       return new BinaryPredicate(op, castExprChild,

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/rewrite/SimplifyConditionalsRule.java
----------------------------------------------------------------------
diff --git 
a/fe/src/main/java/org/apache/impala/rewrite/SimplifyConditionalsRule.java 
b/fe/src/main/java/org/apache/impala/rewrite/SimplifyConditionalsRule.java
index 1a887b1..2d0c2d9 100644
--- a/fe/src/main/java/org/apache/impala/rewrite/SimplifyConditionalsRule.java
+++ b/fe/src/main/java/org/apache/impala/rewrite/SimplifyConditionalsRule.java
@@ -92,15 +92,14 @@ public class SimplifyConditionalsRule implements 
ExprRewriteRule {
    */
   private Expr simplifyIfFunctionCallExpr(FunctionCallExpr expr) {
     Preconditions.checkState(expr.getChildren().size() == 3);
-    if (expr.getChild(0) instanceof BoolLiteral) {
-      if (((BoolLiteral) expr.getChild(0)).getValue()) {
-        // IF(TRUE)
-        return expr.getChild(1);
-      } else {
-        // IF(FALSE)
-        return expr.getChild(2);
-      }
-    } else if (expr.getChild(0) instanceof NullLiteral) {
+    Expr head = expr.getChild(0);
+    if (Expr.IS_TRUE_LITERAL.apply(head)) {
+      // IF(TRUE)
+      return expr.getChild(1);
+    } else if (Expr.IS_FALSE_LITERAL.apply(head)) {
+      // IF(FALSE)
+      return expr.getChild(2);
+    } else if (Expr.IS_NULL_LITERAL.apply(head)) {
       // IF(NULL)
       return expr.getChild(2);
     }
@@ -116,8 +115,8 @@ public class SimplifyConditionalsRule implements 
ExprRewriteRule {
   private Expr simplifyIfNullFunctionCallExpr(FunctionCallExpr expr) {
     Preconditions.checkState(expr.getChildren().size() == 2);
     Expr child0 = expr.getChild(0);
-    if (child0 instanceof NullLiteral) return expr.getChild(1);
-    if (child0.isLiteral()) return child0;
+    if (Expr.IS_NULL_LITERAL.apply(child0)) return expr.getChild(1);
+    if (Expr.IS_LITERAL.apply(child0)) return child0;
     return expr;
   }
 
@@ -132,8 +131,8 @@ public class SimplifyConditionalsRule implements 
ExprRewriteRule {
     for (int i = 0; i < numChildren; ++i) {
       Expr childExpr = expr.getChildren().get(i);
       // Skip leading nulls.
-      if (childExpr.isNullLiteral()) continue;
-      if ((i == numChildren - 1) || childExpr.isLiteral()) {
+      if (Expr.IS_NULL_VALUE.apply(childExpr)) continue;
+      if ((i == numChildren - 1) || Expr.IS_LITERAL.apply(childExpr)) {
         result = childExpr;
       } else if (i == 0) {
         result = expr;
@@ -178,7 +177,7 @@ public class SimplifyConditionalsRule implements 
ExprRewriteRule {
     if (!(leftChild instanceof BoolLiteral)) return expr;
 
     if (expr.getOp() == CompoundPredicate.Operator.AND) {
-      if (((BoolLiteral) leftChild).getValue()) {
+      if (Expr.IS_TRUE_LITERAL.apply(leftChild)) {
         // TRUE AND 'expr', so return 'expr'.
         return expr.getChild(1);
       } else {
@@ -186,7 +185,7 @@ public class SimplifyConditionalsRule implements 
ExprRewriteRule {
         return leftChild;
       }
     } else if (expr.getOp() == CompoundPredicate.Operator.OR) {
-      if (((BoolLiteral) leftChild).getValue()) {
+      if (Expr.IS_TRUE_LITERAL.apply(leftChild)) {
         // TRUE OR 'expr', so return TRUE.
         return leftChild;
       } else {
@@ -209,14 +208,14 @@ public class SimplifyConditionalsRule implements 
ExprRewriteRule {
   private Expr simplifyCaseExpr(CaseExpr expr, Analyzer analyzer)
       throws AnalysisException {
     Expr caseExpr = expr.hasCaseExpr() ? expr.getChild(0) : null;
-    if (expr.hasCaseExpr() && !caseExpr.isLiteral()) return expr;
+    if (expr.hasCaseExpr() && !Expr.IS_LITERAL.apply(caseExpr)) return expr;
 
     int numChildren = expr.getChildren().size();
     int loopStart = expr.hasCaseExpr() ? 1 : 0;
     // Check and return early if there's nothing that can be simplified.
     boolean canSimplify = false;
     for (int i = loopStart; i < numChildren - 1; i += 2) {
-      if (expr.getChild(i).isLiteral()) {
+      if (Expr.IS_LITERAL.apply(expr.getChild(i))) {
         canSimplify = true;
         break;
       }
@@ -230,11 +229,11 @@ public class SimplifyConditionalsRule implements 
ExprRewriteRule {
     Expr elseExpr = null;
     for (int i = loopStart; i < numChildren - 1; i += 2) {
       Expr child = expr.getChild(i);
-      if (child instanceof NullLiteral) continue;
+      if (Expr.IS_NULL_LITERAL.apply(child)) continue;
 
       Expr whenExpr;
       if (expr.hasCaseExpr()) {
-        if (child.isLiteral()) {
+        if (Expr.IS_LITERAL.apply(child)) {
           BinaryPredicate pred = new BinaryPredicate(
               BinaryPredicate.Operator.EQ, caseExpr, expr.getChild(i));
           pred.analyze(analyzer);

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/main/java/org/apache/impala/service/FeSupport.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/service/FeSupport.java 
b/fe/src/main/java/org/apache/impala/service/FeSupport.java
index 41cd2d9..e67bf9d 100644
--- a/fe/src/main/java/org/apache/impala/service/FeSupport.java
+++ b/fe/src/main/java/org/apache/impala/service/FeSupport.java
@@ -229,7 +229,7 @@ public class FeSupport {
       throws InternalException {
     // Shortcuts to avoid expensive BE evaluation.
     if (pred instanceof BoolLiteral) return ((BoolLiteral) pred).getValue();
-    if (pred instanceof NullLiteral) return false;
+    if (Expr.IS_NULL_LITERAL.apply(pred)) return false;
     Preconditions.checkState(pred.getType().isBoolean());
     TColumnValue val = EvalExprWithoutRow(pred, queryCtx);
     // Return false if pred evaluated to false or NULL. True otherwise.

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/test/java/org/apache/impala/analysis/ExprRewriterTest.java
----------------------------------------------------------------------
diff --git a/fe/src/test/java/org/apache/impala/analysis/ExprRewriterTest.java 
b/fe/src/test/java/org/apache/impala/analysis/ExprRewriterTest.java
index 20d4fd9..77595e4 100644
--- a/fe/src/test/java/org/apache/impala/analysis/ExprRewriterTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/ExprRewriterTest.java
@@ -45,7 +45,7 @@ public class ExprRewriterTest extends AnalyzerTest {
     @Override
     public Expr apply(Expr expr, Analyzer analyzer) throws AnalysisException {
       if (expr.contains(Subquery.class)) return expr;
-      if (Predicate.IS_TRUE_LITERAL.apply(expr)) return expr;
+      if (Expr.IS_TRUE_LITERAL.apply(expr)) return expr;
       return new BoolLiteral(true);
     }
 
@@ -60,7 +60,7 @@ public class ExprRewriterTest extends AnalyzerTest {
 
     @Override
     public Expr apply(Expr expr, Analyzer analyzer) throws AnalysisException {
-      if (Predicate.IS_TRUE_LITERAL.apply(expr)) return new BoolLiteral(false);
+      if (Expr.IS_TRUE_LITERAL.apply(expr)) return new BoolLiteral(false);
       return expr;
     }
     private TrueToFalseRule() {}

http://git-wip-us.apache.org/repos/asf/impala/blob/8dfbe3c8/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
----------------------------------------------------------------------
diff --git 
a/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java 
b/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
index 859ab74..acef882 100644
--- a/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
+++ b/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.*;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.impala.analysis.Expr;
 import org.apache.impala.analysis.ToSqlUtils;
 import org.apache.impala.catalog.CatalogTest;
 import org.apache.impala.catalog.ColumnStats;
@@ -142,7 +143,7 @@ public class LocalCatalogTest {
     assertEquals(1,  ids.size());
     FeFsPartition partition = FeCatalogUtils.loadPartition(
         t, Iterables.getOnlyElement(ids));
-    assertTrue(partition.getPartitionValue(dayCol).isNullLiteral());
+    assertTrue(Expr.IS_NULL_VALUE.apply(partition.getPartitionValue(dayCol)));
   }
 
   @Test

Reply via email to