You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by kw...@apache.org on 2016/09/30 02:15:00 UTC

[43/61] [partial] incubator-impala git commit: IMPALA-3786: Replace "cloudera" with "apache" (part 1)

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DescribeTableStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DescribeTableStmt.java b/fe/src/main/java/com/cloudera/impala/analysis/DescribeTableStmt.java
deleted file mode 100644
index b1f9b95..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DescribeTableStmt.java
+++ /dev/null
@@ -1,152 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import java.util.ArrayList;
-
-import org.apache.commons.lang3.StringUtils;
-
-import parquet.Strings;
-
-import com.cloudera.impala.analysis.Path.PathType;
-import com.cloudera.impala.authorization.Privilege;
-import com.cloudera.impala.authorization.PrivilegeRequestBuilder;
-import com.cloudera.impala.catalog.StructType;
-import com.cloudera.impala.catalog.TableLoadingException;
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TDescribeOutputStyle;
-import com.cloudera.impala.thrift.TDescribeTableParams;
-import com.google.common.base.Preconditions;
-
-/**
- * Representation of a DESCRIBE table statement which returns metadata on
- * a specified table:
- * Syntax: DESCRIBE <path>
- *         DESCRIBE FORMATTED|EXTENDED <table>
- *
- * If FORMATTED|EXTENDED is not specified and the path refers to a table, the statement
- * only returns info on the given table's column definition (column name, data type, and
- * comment). If the path refers to a complex typed field within a column, the statement
- * returns the field names, types, and comments.
- * If FORMATTED|EXTENDED is specified, extended metadata on the table is returned
- * (in addition to the column definitions). This metadata includes info about the table
- * properties, SerDe properties, StorageDescriptor properties, and more.
- */
-public class DescribeTableStmt extends StatementBase {
-  private final TDescribeOutputStyle outputStyle_;
-
-  /// "."-separated path from the describe statement.
-  private ArrayList<String> rawPath_;
-
-  /// The resolved path to describe, set after analysis.
-  private Path path_;
-
-  /// The fully qualified name of the root table, set after analysis.
-  private TableName tableName_;
-
-  /// Struct type with the fields to display for the described path.
-  private StructType resultStruct_;
-
-  public DescribeTableStmt(ArrayList<String> rawPath, TDescribeOutputStyle outputStyle) {
-    Preconditions.checkNotNull(rawPath);
-    Preconditions.checkArgument(!rawPath.isEmpty());
-    rawPath_ = rawPath;
-    outputStyle_ = outputStyle;
-    path_ = null;
-    tableName_ = null;
-    resultStruct_ = null;
-  }
-
-  @Override
-  public String toSql() {
-    StringBuilder sb = new StringBuilder("DESCRIBE ");
-    if (outputStyle_ != TDescribeOutputStyle.MINIMAL) {
-      sb.append(outputStyle_.toString() + " ");
-    }
-    return sb.toString() + StringUtils.join(rawPath_, ".");
-  }
-
-  public TableName getTableName() { return tableName_; }
-  public TDescribeOutputStyle getOutputStyle() { return outputStyle_; }
-
-
-  /**
-   * Get the privilege requirement, which depends on the output style.
-   */
-  private Privilege getPrivilegeRequirement() {
-    switch (outputStyle_) {
-      case MINIMAL: return Privilege.ANY;
-      case FORMATTED:
-      case EXTENDED:
-        return Privilege.VIEW_METADATA;
-      default:
-        Preconditions.checkArgument(false);
-        return null;
-    }
-  }
-
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    try {
-      path_ = analyzer.resolvePath(rawPath_, PathType.ANY);
-    } catch (AnalysisException ae) {
-      // Register privilege requests to prefer reporting an authorization error over
-      // an analysis error. We should not accidentally reveal the non-existence of a
-      // table/database if the user is not authorized.
-      if (analyzer.hasMissingTbls()) throw ae;
-      if (rawPath_.size() > 1) {
-        analyzer.registerPrivReq(new PrivilegeRequestBuilder()
-            .onTable(rawPath_.get(0), rawPath_.get(1))
-            .allOf(getPrivilegeRequirement()).toRequest());
-      }
-      analyzer.registerPrivReq(new PrivilegeRequestBuilder()
-          .onTable(analyzer.getDefaultDb(), rawPath_.get(0))
-          .allOf(getPrivilegeRequirement()).toRequest());
-      throw ae;
-    } catch (TableLoadingException tle) {
-      throw new AnalysisException(tle.getMessage(), tle);
-    }
-
-    tableName_ = analyzer.getFqTableName(path_.getRootTable().getTableName());
-    analyzer.getTable(tableName_, getPrivilegeRequirement());
-
-    if (path_.destTable() != null) {
-      resultStruct_ = path_.getRootTable().getHiveColumnsAsStruct();
-    } else if (path_.destType().isComplexType()) {
-      if (outputStyle_ == TDescribeOutputStyle.FORMATTED ||
-          outputStyle_ == TDescribeOutputStyle.EXTENDED) {
-        throw new AnalysisException("DESCRIBE FORMATTED|EXTENDED must refer to a table");
-      }
-      Preconditions.checkState(outputStyle_ == TDescribeOutputStyle.MINIMAL);
-      resultStruct_ = Path.getTypeAsStruct(path_.destType());
-    } else {
-      throw new AnalysisException("Cannot describe path '" +
-          Strings.join(rawPath_, ".") + "' targeting scalar type: " +
-          path_.destType().toSql());
-    }
-  }
-
-  public TDescribeTableParams toThrift() {
-    TDescribeTableParams params = new TDescribeTableParams();
-    params.setTable_name(getTableName().getTbl());
-    params.setDb(getTableName().getDb());
-    params.setOutput_style(outputStyle_);
-    params.setResult_struct(resultStruct_.toThrift());
-    return params;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DescriptorTable.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DescriptorTable.java b/fe/src/main/java/com/cloudera/impala/analysis/DescriptorTable.java
deleted file mode 100644
index c0d7571..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DescriptorTable.java
+++ /dev/null
@@ -1,198 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-
-import org.apache.commons.lang.StringUtils;
-
-import com.cloudera.impala.catalog.Table;
-import com.cloudera.impala.catalog.View;
-import com.cloudera.impala.common.IdGenerator;
-import com.cloudera.impala.thrift.TDescriptorTable;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-/**
- * Repository for tuple (and slot) descriptors.
- * Descriptors should only be created through this class, which assigns
- * them unique ids.
- */
-public class DescriptorTable {
-  private final HashMap<TupleId, TupleDescriptor> tupleDescs_ = Maps.newHashMap();
-  private final HashMap<SlotId, SlotDescriptor> slotDescs_ = Maps.newHashMap();
-  private final IdGenerator<TupleId> tupleIdGenerator_ = TupleId.createGenerator();
-  private final IdGenerator<SlotId> slotIdGenerator_ = SlotId.createGenerator();
-  // List of referenced tables with no associated TupleDescriptor to ship to the BE.
-  // For example, the output table of an insert query.
-  private final List<Table> referencedTables_ = Lists.newArrayList();
-  // For each table, the set of partitions that are referenced by at least one scan range.
-  private final HashMap<Table, HashSet<Long>> referencedPartitionsPerTable_ =
-      Maps.newHashMap();
-
-  public TupleDescriptor createTupleDescriptor(String debugName) {
-    TupleDescriptor d = new TupleDescriptor(tupleIdGenerator_.getNextId(), debugName);
-    tupleDescs_.put(d.getId(), d);
-    return d;
-  }
-
-  /**
-   * Create copy of src with new id. The returned descriptor has its mem layout
-   * computed.
-   */
-  public TupleDescriptor copyTupleDescriptor(TupleId srcId, String debugName) {
-    TupleDescriptor d = new TupleDescriptor(tupleIdGenerator_.getNextId(), debugName);
-    tupleDescs_.put(d.getId(), d);
-    // create copies of slots
-    TupleDescriptor src = tupleDescs_.get(srcId);
-    for (SlotDescriptor slot: src.getSlots()) {
-      copySlotDescriptor(d, slot);
-    }
-    d.computeMemLayout();
-    Preconditions.checkState(d.getByteSize() == src.getByteSize());
-    return d;
-  }
-
-  public SlotDescriptor addSlotDescriptor(TupleDescriptor d) {
-    SlotDescriptor result = new SlotDescriptor(slotIdGenerator_.getNextId(), d);
-    d.addSlot(result);
-    slotDescs_.put(result.getId(), result);
-    return result;
-  }
-
-  /**
-   * Append copy of src to dest.
-   */
-  public SlotDescriptor copySlotDescriptor(TupleDescriptor dest, SlotDescriptor src) {
-    SlotDescriptor result = new SlotDescriptor(slotIdGenerator_.getNextId(), dest, src);
-    dest.addSlot(result);
-    slotDescs_.put(result.getId(), result);
-    return result;
-  }
-
-  public TupleDescriptor getTupleDesc(TupleId id) { return tupleDescs_.get(id); }
-  public SlotDescriptor getSlotDesc(SlotId id) { return slotDescs_.get(id); }
-  public Collection<TupleDescriptor> getTupleDescs() { return tupleDescs_.values(); }
-  public Collection<SlotDescriptor> getSlotDescs() { return slotDescs_.values(); }
-  public TupleId getMaxTupleId() { return tupleIdGenerator_.getMaxId(); }
-  public SlotId getMaxSlotId() { return slotIdGenerator_.getMaxId(); }
-
-  public void addReferencedTable(Table table) {
-    referencedTables_.add(table);
-  }
-
-  /**
-   * Find the set of referenced partitions for the given table.  Allocates a set if
-   * none has been allocated for the table yet.
-   */
-  private HashSet<Long> getReferencedPartitions(Table table) {
-    HashSet<Long> refPartitions = referencedPartitionsPerTable_.get(table);
-    if (refPartitions == null) {
-      refPartitions = new HashSet<Long>();
-      referencedPartitionsPerTable_.put(table, refPartitions);
-    }
-    return refPartitions;
-  }
-
-  /**
-   * Add the partition with ID partitionId to the set of referenced partitions for the
-   * given table.
-   */
-  public void addReferencedPartition(Table table, long partitionId) {
-    getReferencedPartitions(table).add(partitionId);
-  }
-
-  /**
-   * Marks all slots in list as materialized.
-   */
-  public void markSlotsMaterialized(List<SlotId> ids) {
-    for (SlotId id: ids) {
-      getSlotDesc(id).setIsMaterialized(true);
-    }
-  }
-
-  /**
-   * Return all ids in slotIds that belong to tupleId.
-   */
-  public List<SlotId> getTupleSlotIds(List<SlotId> slotIds, TupleId tupleId) {
-    List<SlotId> result = Lists.newArrayList();
-    for (SlotId id: slotIds) {
-      if (getSlotDesc(id).getParent().getId().equals(tupleId)) result.add(id);
-    }
-    return result;
-  }
-
-  // Computes physical layout parameters of all descriptors.
-  // Call this only after the last descriptor was added.
-  // Test-only.
-  public void computeMemLayout() {
-    for (TupleDescriptor d: tupleDescs_.values()) {
-      d.computeMemLayout();
-    }
-  }
-
-  public TDescriptorTable toThrift() {
-    TDescriptorTable result = new TDescriptorTable();
-    HashSet<Table> referencedTbls = Sets.newHashSet();
-    HashSet<Table> allPartitionsTbls = Sets.newHashSet();
-    for (TupleDescriptor tupleDesc: tupleDescs_.values()) {
-      // inline view of a non-constant select has a non-materialized tuple descriptor
-      // in the descriptor table just for type checking, which we need to skip
-      if (tupleDesc.isMaterialized()) {
-        // TODO: Ideally, we should call tupleDesc.checkIsExecutable() here, but there
-        // currently are several situations in which we send materialized tuples without
-        // a mem layout to the BE, e.g., when unnesting unions or when replacing plan
-        // trees with an EmptySetNode.
-        result.addToTupleDescriptors(tupleDesc.toThrift());
-        Table table = tupleDesc.getTable();
-        if (table != null && !(table instanceof View)) referencedTbls.add(table);
-        // Only serialize materialized slots
-        for (SlotDescriptor slotD: tupleDesc.getMaterializedSlots()) {
-          result.addToSlotDescriptors(slotD.toThrift());
-        }
-      }
-    }
-    for (Table table: referencedTables_) {
-      referencedTbls.add(table);
-      // We don't know which partitions are needed for INSERT, so include them all.
-      allPartitionsTbls.add(table);
-    }
-    for (Table tbl: referencedTbls) {
-      HashSet<Long> referencedPartitions = null; // null means include all partitions.
-      if (!allPartitionsTbls.contains(tbl)) {
-        referencedPartitions = getReferencedPartitions(tbl);
-      }
-      result.addToTableDescriptors(tbl.toThriftDescriptor(referencedPartitions));
-    }
-    return result;
-  }
-
-  public String debugString() {
-    StringBuilder out = new StringBuilder();
-    out.append("tuples:\n");
-    for (TupleDescriptor desc: tupleDescs_.values()) {
-      out.append(desc.debugString() + "\n");
-    }
-    return out.toString();
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DistributeParam.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DistributeParam.java b/fe/src/main/java/com/cloudera/impala/analysis/DistributeParam.java
deleted file mode 100644
index e718d6b..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DistributeParam.java
+++ /dev/null
@@ -1,199 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TDistributeByHashParam;
-import com.cloudera.impala.thrift.TDistributeByRangeParam;
-import com.cloudera.impala.thrift.TDistributeParam;
-import com.cloudera.impala.thrift.TDistributeType;
-import com.cloudera.impala.thrift.TRangeLiteral;
-import com.cloudera.impala.thrift.TRangeLiteralList;
-import com.google.common.base.Joiner;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-
-/**
- * Represents the information of
- *
- * DISTRIBUTE BY HASH[(col_def_list)] INTO n BUCKETS
- * DISTRIBUTE BY RANGE[(col_def_list)] SPLIT ROWS ( (v1,v2,v3), ...)
- *
- * clauses in CREATE TABLE statements, where available, e.g. Kudu.
- *
- * A table can be hash or range partitioned, or combinations of both. A distribute
- * clause represents one particular distribution rule. For both HASH and RANGE types,
- * some of the error checking is done during the analysis, but most of it is deferred
- * until the table is actually created.
-  */
-public class DistributeParam implements ParseNode {
-
-  /**
-   * Creates a DistributeParam partitioned by hash.
-   */
-  public static DistributeParam createHashParam(List<String> cols, BigDecimal buckets) {
-    return new DistributeParam(Type.HASH, cols, buckets);
-  }
-
-  /**
-   * Creates a DistributeParam partitioned by range.
-   */
-  public static DistributeParam createRangeParam(List<String> cols,
-      ArrayList<ArrayList<LiteralExpr>> splitRows) {
-    return new DistributeParam(Type.RANGE, cols, splitRows);
-  }
-
-  private static final int NO_BUCKETS = -1;
-
-  /**
-   * The type of the distribution rule.
-   */
-  public enum Type {
-    HASH, RANGE
-  };
-
-  private List<String> columns_;
-
-  private final Type type_;
-
-  // Only relevant for hash partitioning, -1 otherwise
-  private final int num_buckets_;
-
-  // Only relevant for range partitioning, null otherwise
-  private final ArrayList<ArrayList<LiteralExpr>> splitRows_;
-
-  // Set in analyze()
-  private TDistributeByRangeParam rangeParam_;
-
-  private DistributeParam(Type t, List<String> cols, BigDecimal buckets) {
-    type_ = t;
-    columns_ = cols;
-    num_buckets_ = buckets.intValue();
-    splitRows_ = null;
-  }
-
-  private DistributeParam(Type t, List<String> cols,
-      ArrayList<ArrayList<LiteralExpr>> splitRows) {
-    type_ = t;
-    columns_ = cols;
-    splitRows_ = splitRows;
-    num_buckets_ = NO_BUCKETS;
-  }
-
-  /**
-   * TODO Refactor the logic below to analyze 'columns_'. This analysis should output
-   * a vector of column types that would then be used during the analysis of the split
-   * rows.
-   */
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    if (type_ == Type.HASH && num_buckets_ <= 1) {
-      throw new AnalysisException(String.format(
-          "Number of buckets in DISTRIBUTE BY clause '%s' must be larger than 1.",
-          toSql()));
-    } else if (type_ == Type.RANGE) {
-      // Creating the thrift structure simultaneously checks for semantic errors
-      rangeParam_ = new TDistributeByRangeParam();
-      rangeParam_.setColumns(columns_);
-
-      for (ArrayList<LiteralExpr> splitRow : splitRows_) {
-        TRangeLiteralList list = new TRangeLiteralList();
-        if (splitRow.size() != columns_.size()) {
-          throw new AnalysisException(String.format(
-              "SPLIT ROWS has different size than number of projected key columns: %d. "
-                  + "Split row: %s", columns_.size(), splitRowToString(splitRow)));
-        }
-        for (LiteralExpr expr : splitRow) {
-          expr.analyze(analyzer);
-          TRangeLiteral literal = new TRangeLiteral();
-          if (expr instanceof NumericLiteral) {
-            NumericLiteral num = (NumericLiteral) expr;
-            if (num.getType().isDecimal() || num.getType().isFloatingPointType()) {
-              throw new AnalysisException("Only integral and string values allowed for" +
-                  " split rows.");
-            } else {
-              literal.setInt_literal(num.getIntValue());
-            }
-          } else if (expr instanceof StringLiteral) {
-            StringLiteral string = (StringLiteral) expr;
-            literal.setString_literal(string.getStringValue());
-          } else if (expr instanceof BoolLiteral) {
-            BoolLiteral bool = (BoolLiteral) expr;
-            literal.setBool_literal(bool.getValue());
-          } else {
-            throw new AnalysisException(String.format("Split row value is not supported: "
-                + "%s (Type: %s).", expr.getStringValue(), expr.getType().toSql()));
-          }
-          list.addToValues(literal);
-        }
-        rangeParam_.addToSplit_rows(list);
-      }
-    }
-  }
-
-  @Override
-  public String toSql() {
-    if (num_buckets_ == NO_BUCKETS) {
-      List<String> splitRowStrings = Lists.newArrayList();
-      for (ArrayList<LiteralExpr> splitRow : splitRows_) {
-        splitRowStrings.add(splitRowToString(splitRow));
-      }
-      return String.format("RANGE(%s) INTO RANGES(%s)", Joiner.on(", ").join(columns_),
-          Joiner.on(", ").join(splitRowStrings));
-    } else {
-      return String.format("HASH(%s) INTO %d BUCKETS", Joiner.on(", ").join(columns_),
-          num_buckets_);
-    }
-  }
-
-  private String splitRowToString(ArrayList<LiteralExpr> splitRow) {
-    StringBuilder builder = new StringBuilder();
-    builder.append("(");
-    List<String> rangeElementStrings = Lists.newArrayList();
-    for (LiteralExpr rangeElement : splitRow) {
-      rangeElementStrings.add(rangeElement.toSql());
-    }
-    builder.append(Joiner.on(", ").join(rangeElementStrings));
-    builder.append(")");
-    return builder.toString();
-  }
-
-  TDistributeParam toThrift() {
-    TDistributeParam result = new TDistributeParam();
-    if (type_ == Type.HASH) {
-      TDistributeByHashParam hash = new TDistributeByHashParam();
-      hash.setNum_buckets(num_buckets_);
-      hash.setColumns(columns_);
-      result.setBy_hash_param(hash);
-    } else {
-      Preconditions.checkState(type_ == Type.RANGE);
-
-      result.setBy_range_param(rangeParam_);
-    }
-    return result;
-  }
-
-  public List<String> getColumns() { return columns_; }
-  public void setColumns(List<String> cols) { columns_ = cols; }
-  public Type getType_() { return type_; }
-  public int getNumBuckets() { return num_buckets_; }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DropDataSrcStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DropDataSrcStmt.java b/fe/src/main/java/com/cloudera/impala/analysis/DropDataSrcStmt.java
deleted file mode 100644
index f5642fa..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DropDataSrcStmt.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import org.apache.hadoop.hive.metastore.MetaStoreUtils;
-
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TDropDataSourceParams;
-import com.google.common.base.Preconditions;
-
-/**
- * Represents a DROP DATA SOURCE statement.
- */
-public class DropDataSrcStmt extends StatementBase {
-
-  private final String dataSrcName_;
-  private final boolean ifExists_;
-
-  public DropDataSrcStmt(String dataSrcName, boolean ifExists) {
-    Preconditions.checkNotNull(dataSrcName);
-    this.dataSrcName_ = dataSrcName.toLowerCase();
-    this.ifExists_ = ifExists;
-  }
-
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    if (!MetaStoreUtils.validateName(dataSrcName_) ||
-        (!ifExists_ && analyzer.getCatalog().getDataSource(dataSrcName_) == null)) {
-      throw new AnalysisException(Analyzer.DATA_SRC_DOES_NOT_EXIST_ERROR_MSG +
-          dataSrcName_);
-    }
-  }
-
-  @Override
-  public String toSql() {
-    StringBuilder sb = new StringBuilder();
-    sb.append("DROP DATA SOURCE ");
-    if (ifExists_) sb.append("IF EXISTS ");
-    sb.append(dataSrcName_);
-    return sb.toString();
-  }
-
-  public TDropDataSourceParams toThrift() {
-    return new TDropDataSourceParams(dataSrcName_).setIf_exists(ifExists_);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DropDbStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DropDbStmt.java b/fe/src/main/java/com/cloudera/impala/analysis/DropDbStmt.java
deleted file mode 100644
index af7fae1..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DropDbStmt.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import com.cloudera.impala.authorization.Privilege;
-import com.cloudera.impala.catalog.Db;
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TDropDbParams;
-
-/**
- * Represents a DROP [IF EXISTS] DATABASE [CASCADE | RESTRICT] statement
- */
-public class DropDbStmt extends StatementBase {
-  private final String dbName_;
-  private final boolean ifExists_;
-  private final boolean cascade_;
-
-  /**
-   * Constructor for building the drop statement. If ifExists is true, an error will not
-   * be thrown if the database does not exist. If cascade is true, all the tables in the
-   * database will be dropped.
-   */
-  public DropDbStmt(String dbName, boolean ifExists, boolean cascade) {
-    this.dbName_ = dbName;
-    this.ifExists_ = ifExists;
-    this.cascade_ = cascade;
-  }
-
-  public String getDb() { return dbName_; }
-  public boolean getIfExists() { return ifExists_; }
-  public boolean getCascade() { return cascade_; }
-
-  @Override
-  public String toSql() {
-    StringBuilder sb = new StringBuilder("DROP DATABASE");
-    if (ifExists_) sb.append(" IF EXISTS ");
-    sb.append(getDb());
-    if (cascade_) sb.append(" CASCADE");
-    return sb.toString();
-  }
-
-  public TDropDbParams toThrift() {
-    TDropDbParams params = new TDropDbParams();
-    params.setDb(getDb());
-    params.setIf_exists(getIfExists());
-    params.setCascade(getCascade());
-    return params;
-  }
-
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    Db db = analyzer.getDb(dbName_, Privilege.DROP, false);
-    if (db == null && !ifExists_) {
-      throw new AnalysisException(Analyzer.DB_DOES_NOT_EXIST_ERROR_MSG + dbName_);
-    }
-
-    if (analyzer.getDefaultDb().toLowerCase().equals(dbName_.toLowerCase())) {
-      throw new AnalysisException("Cannot drop current default database: " + dbName_);
-    }
-    if (db != null && db.numFunctions() > 0 && !cascade_) {
-      throw new AnalysisException("Cannot drop non-empty database: " + dbName_);
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DropFunctionStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DropFunctionStmt.java b/fe/src/main/java/com/cloudera/impala/analysis/DropFunctionStmt.java
deleted file mode 100644
index 39f5ff9..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DropFunctionStmt.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import com.cloudera.impala.authorization.AuthorizeableFn;
-import com.cloudera.impala.authorization.Privilege;
-import com.cloudera.impala.authorization.PrivilegeRequest;
-import com.cloudera.impala.catalog.Db;
-import com.cloudera.impala.catalog.Function;
-import com.cloudera.impala.catalog.Type;
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TDropFunctionParams;
-import com.cloudera.impala.thrift.TFunctionCategory;
-
-import java.util.ArrayList;
-
-/**
- * Represents a DROP [IF EXISTS] FUNCTION statement
- * TODO: try to consolidate this with the other Drop*Stmt class, perhaps
- * by adding a DropStatementBase class.
- */
-public class DropFunctionStmt extends StatementBase {
-  private final FunctionName fnName_;
-  private final FunctionArgs fnArgs_;
-  private final boolean ifExists_;
-
-  // Set in analyze().
-  private Function desc_;
-
-  /**
-   * Constructor for building the drop statement. If ifExists is true, an error will not
-   * be thrown if the function does not exist.
-   */
-  public DropFunctionStmt(FunctionName fnName, FunctionArgs fnArgs, boolean ifExists) {
-    fnName_ = fnName;
-    fnArgs_ = fnArgs;
-    ifExists_ = ifExists;
-  }
-
-  public FunctionName getFunction() { return desc_.getFunctionName(); }
-  public boolean getIfExists() { return ifExists_; }
-  private boolean hasSignature() { return fnArgs_ != null; }
-
-  @Override
-  public String toSql() {
-    StringBuilder sb = new StringBuilder("DROP FUNCTION");
-    if (ifExists_) sb.append(" IF EXISTS ");
-    sb.append(desc_.signatureString());
-    sb.append(")");
-    return sb.toString();
-  }
-
-  public TDropFunctionParams toThrift() {
-    TDropFunctionParams params = new TDropFunctionParams();
-    params.setFn_name(desc_.getFunctionName().toThrift());
-    params.setArg_types(Type.toThrift(desc_.getArgs()));
-    params.setIf_exists(getIfExists());
-    if (hasSignature()) params.setSignature(desc_.signatureString());
-    return params;
-  }
-
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    fnName_.analyze(analyzer);
-
-    if (hasSignature()) {
-      fnArgs_.analyze(analyzer);
-      desc_ = new Function(fnName_, fnArgs_.getArgTypes(), Type.INVALID,
-          fnArgs_.hasVarArgs());
-    } else {
-      desc_ = new Function(fnName_, new ArrayList<Type>(), Type.INVALID,
-          false);
-    }
-
-    // For now, if authorization is enabled, the user needs ALL on the server
-    // to drop functions.
-    // TODO: this is not the right granularity but acceptable for now.
-    analyzer.registerPrivReq(new PrivilegeRequest(
-        new AuthorizeableFn(desc_.signatureString()), Privilege.ALL));
-
-    Db db =  analyzer.getDb(desc_.dbName(), Privilege.DROP, false);
-    if (db == null && !ifExists_) {
-      throw new AnalysisException(Analyzer.DB_DOES_NOT_EXIST_ERROR_MSG + desc_.dbName());
-    }
-
-    if (!hasSignature() && db != null && db.getFunctions(
-        desc_.functionName()).isEmpty() && !ifExists_) {
-      throw new AnalysisException(
-          Analyzer.FN_DOES_NOT_EXIST_ERROR_MSG + desc_.functionName());
-    }
-
-    if (hasSignature() && analyzer.getCatalog().getFunction(
-        desc_, Function.CompareMode.IS_IDENTICAL) == null && !ifExists_) {
-      throw new AnalysisException(
-          Analyzer.FN_DOES_NOT_EXIST_ERROR_MSG + desc_.signatureString());
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DropStatsStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DropStatsStmt.java b/fe/src/main/java/com/cloudera/impala/analysis/DropStatsStmt.java
deleted file mode 100644
index 90f9434..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DropStatsStmt.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import com.cloudera.impala.authorization.Privilege;
-import com.cloudera.impala.catalog.Table;
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TDropStatsParams;
-import com.cloudera.impala.thrift.TTableName;
-import com.google.common.base.Preconditions;
-
-/**
- * Represents both a DROP STATS statement, and the DROP INCREMENTAL STATS <tbl> PARTITION
- * <part_spec> variant.
- */
-public class DropStatsStmt extends StatementBase {
-  protected final TableName tableName_;
-
-  // If non-null, only drop the statistics for a given partition
-  PartitionSpec partitionSpec_ = null;
-
-  // Set during analysis
-  protected String dbName_;
-
-  /**
-   * Constructor for building the DROP TABLE/VIEW statement
-   */
-  public DropStatsStmt(TableName tableName) {
-    this.tableName_ = tableName;
-  }
-
-  public DropStatsStmt(TableName tableName, PartitionSpec partSpec) {
-    this.tableName_ = tableName;
-    this.partitionSpec_ = partSpec;
-  }
-
-  @Override
-  public String toSql() {
-    StringBuilder sb = new StringBuilder("DROP ");
-    if (partitionSpec_ == null) {
-      sb.append(" STATS ");
-      if (tableName_.getDb() != null) sb.append(tableName_.getDb() + ".");
-      sb.append(tableName_.toSql());
-    } else {
-      sb.append(" INCREMENTAL STATS ");
-      if (tableName_.getDb() != null) sb.append(tableName_.getDb() + ".");
-      sb.append(tableName_.toSql());
-      sb.append(partitionSpec_.toSql());
-    }
-    return sb.toString();
-  }
-
-  public TDropStatsParams toThrift() {
-    TDropStatsParams params = new TDropStatsParams();
-    params.setTable_name(new TTableName(getDb(), getTbl()));
-
-    if (partitionSpec_ != null) {
-      params.setPartition_spec(partitionSpec_.toThrift());
-    }
-    return params;
-  }
-
-  /**
-   * Checks that the given table exists and the user has privileges
-   * to drop stats on this table.
-   */
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    dbName_ = analyzer.getTargetDbName(tableName_);
-    Table table = analyzer.getTable(tableName_, Privilege.ALTER);
-    Preconditions.checkNotNull(table);
-    if (partitionSpec_ != null) {
-      partitionSpec_.setTableName(tableName_);
-      partitionSpec_.setPrivilegeRequirement(Privilege.ALTER);
-      partitionSpec_.setPartitionShouldExist();
-      partitionSpec_.analyze(analyzer);
-    }
-  }
-
-  /**
-   * Can only be called after analysis. Returns the name of the database that
-   * the target drop table resides in.
-   */
-  public String getDb() {
-    Preconditions.checkNotNull(dbName_);
-    return dbName_;
-  }
-
-  public String getTbl() { return tableName_.getTbl(); }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/DropTableOrViewStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/DropTableOrViewStmt.java b/fe/src/main/java/com/cloudera/impala/analysis/DropTableOrViewStmt.java
deleted file mode 100644
index 8371ace..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/DropTableOrViewStmt.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import com.cloudera.impala.authorization.Privilege;
-import com.cloudera.impala.catalog.Table;
-import com.cloudera.impala.catalog.View;
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TDropTableOrViewParams;
-import com.cloudera.impala.thrift.TTableName;
-import com.google.common.base.Preconditions;
-
-/**
- * Represents a DROP TABLE/VIEW [IF EXISTS] statement
- */
-public class DropTableOrViewStmt extends StatementBase {
-  protected final TableName tableName_;
-  protected final boolean ifExists_;
-
-  // True if we are dropping a table. False if we are dropping a view.
-  protected final boolean dropTable_;
-
-  // Setting this value causes dropped tables to be permanently
-  // deleted. For example, for hdfs tables it skips the trash directory
-  protected final boolean purgeTable_;
-
-  // Set during analysis
-  protected String dbName_;
-
-  /**
-   * Constructor for building the DROP TABLE/VIEW statement
-   */
-  public DropTableOrViewStmt(TableName tableName, boolean ifExists,
-      boolean dropTable, boolean purgeTable) {
-    tableName_ = tableName;
-    ifExists_ = ifExists;
-    dropTable_ = dropTable;
-    purgeTable_ = purgeTable;
-    // PURGE with a view is not allowed.
-    Preconditions.checkState(!(!dropTable_ && purgeTable_));
-  }
-
-  @Override
-  public String toSql() {
-    StringBuilder sb = new StringBuilder("DROP " + ((dropTable_) ? "TABLE " : "VIEW "));
-    if (ifExists_) sb.append("IF EXISTS ");
-    if (tableName_.getDb() != null) sb.append(tableName_.getDb() + ".");
-    sb.append(tableName_.getTbl());
-    if (purgeTable_) sb.append(" PURGE");
-    return sb.toString();
-  }
-
-  public TDropTableOrViewParams toThrift() {
-    TDropTableOrViewParams params = new TDropTableOrViewParams();
-    params.setTable_name(new TTableName(getDb(), getTbl()));
-    params.setIf_exists(ifExists_);
-    params.setPurge(purgeTable_);
-    params.setIs_table(dropTable_);
-    return params;
-  }
-
-  /**
-   * 1. Checks that the user has privileges to DROP the given table/view
-   * 2. Checks that the database and table exists
-   * 3. Checks that the table type (TABLE/VIEW) matches the DROP TABLE/VIEW statement
-   * Note: Do not analyze tableName because we prefer to report an error indicating
-   * that the table/view does not exist even if the table/view name is invalid.
-   */
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    dbName_ = analyzer.getTargetDbName(tableName_);
-    try {
-      Table table = analyzer.getTable(tableName_, Privilege.DROP);
-      Preconditions.checkNotNull(table);
-      if (table instanceof View && dropTable_) {
-        throw new AnalysisException(String.format(
-            "DROP TABLE not allowed on a view: %s.%s", dbName_, getTbl()));
-      }
-      if (!(table instanceof View) && !dropTable_) {
-        throw new AnalysisException(String.format(
-            "DROP VIEW not allowed on a table: %s.%s", dbName_, getTbl()));
-      }
-    } catch (AnalysisException e) {
-      if (ifExists_ && analyzer.getMissingTbls().isEmpty()) return;
-      throw e;
-    }
-  }
-
-  /**
-   * Can only be called after analysis. Returns the name of the database that
-   * the target drop table resides in.
-   */
-  public String getDb() {
-    Preconditions.checkNotNull(dbName_);
-    return dbName_;
-  }
-
-  public String getTbl() { return tableName_.getTbl(); }
-  public boolean isDropTable() { return dropTable_; }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/EquivalenceClassId.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/EquivalenceClassId.java b/fe/src/main/java/com/cloudera/impala/analysis/EquivalenceClassId.java
deleted file mode 100644
index df658b9..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/EquivalenceClassId.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import com.cloudera.impala.common.Id;
-import com.cloudera.impala.common.IdGenerator;
-
-public class EquivalenceClassId extends Id<EquivalenceClassId> {
-  // Construction only allowed via an IdGenerator.
-  protected EquivalenceClassId(int id) {
-    super(id);
-  }
-
-  public static IdGenerator<EquivalenceClassId> createGenerator() {
-    return new IdGenerator<EquivalenceClassId>() {
-      @Override
-      public EquivalenceClassId getNextId() { return new EquivalenceClassId(nextId_++); }
-      @Override
-      public EquivalenceClassId getMaxId() { return new EquivalenceClassId(nextId_ - 1); }
-    };
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/b544f019/fe/src/main/java/com/cloudera/impala/analysis/ExistsPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/com/cloudera/impala/analysis/ExistsPredicate.java b/fe/src/main/java/com/cloudera/impala/analysis/ExistsPredicate.java
deleted file mode 100644
index da984eb..0000000
--- a/fe/src/main/java/com/cloudera/impala/analysis/ExistsPredicate.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package com.cloudera.impala.analysis;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.cloudera.impala.common.AnalysisException;
-import com.cloudera.impala.thrift.TExprNode;
-import com.google.common.base.Preconditions;
-
-/**
- * Class representing a [NOT] EXISTS predicate.
- */
-public class ExistsPredicate extends Predicate {
-  private final static Logger LOG = LoggerFactory.getLogger(
-      ExistsPredicate.class);
-  private boolean notExists_ = false;
-
-  public boolean isNotExists() { return notExists_; }
-
-  /**
-   * C'tor that initializes an ExistsPredicate from a Subquery.
-   */
-  public ExistsPredicate(Subquery subquery, boolean notExists) {
-    Preconditions.checkNotNull(subquery);
-    children_.add(subquery);
-    notExists_ = notExists;
-  }
-
-  @Override
-  public Expr negate() {
-    return new ExistsPredicate((Subquery)getChild(0), !notExists_);
-  }
-
-  /**
-   * Copy c'tor used in clone.
-   */
-  public ExistsPredicate(ExistsPredicate other) {
-    super(other);
-    notExists_ = other.notExists_;
-  }
-
-  @Override
-  public void analyze(Analyzer analyzer) throws AnalysisException {
-    if (isAnalyzed_) return;
-    super.analyze(analyzer);
-  }
-
-  @Override
-  protected void toThrift(TExprNode msg) {
-    // Cannot serialize a nested predicate
-    Preconditions.checkState(false);
-  }
-
-  @Override
-  public Expr clone() { return new ExistsPredicate(this); }
-
-  @Override
-  public String toSqlImpl() {
-    StringBuilder strBuilder = new StringBuilder();
-    if (notExists_) strBuilder.append("NOT ");
-    strBuilder.append("EXISTS ");
-    strBuilder.append(getChild(0).toSql());
-    return strBuilder.toString();
-  }
-}