You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by jn...@apache.org on 2015/06/22 20:00:56 UTC

[2/3] drill git commit: DRILL-3316: Ensure different Sql handlers go through same planning phases.

DRILL-3316: Ensure different Sql handlers go through same planning phases.


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

Branch: refs/heads/master
Commit: ffae1691c0cd526ed1095fbabbc0855d016790d7
Parents: 4c44466
Author: Jinfeng Ni <jn...@apache.org>
Authored: Mon Jun 15 11:57:49 2015 -0700
Committer: Jinfeng Ni <jn...@apache.org>
Committed: Sat Jun 20 15:42:47 2015 -0700

----------------------------------------------------------------------
 .../sql/handlers/CreateTableHandler.java        |  30 +--
 .../planner/sql/handlers/DefaultSqlHandler.java | 266 ++++++++++---------
 .../planner/sql/handlers/ExplainHandler.java    |  17 +-
 .../planner/sql/handlers/SqlHandlerUtil.java    |  22 +-
 .../exec/planner/sql/handlers/ViewHandler.java  |  27 +-
 .../exec/planner/sql/parser/SqlCreateView.java  |   2 +-
 .../exec/planner/sql/parser/SqlDropView.java    |   2 +-
 7 files changed, 188 insertions(+), 178 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/ffae1691/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/CreateTableHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/CreateTableHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/CreateTableHandler.java
index b867549..920b284 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/CreateTableHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/CreateTableHandler.java
@@ -18,8 +18,6 @@
 package org.apache.drill.exec.planner.sql.handlers;
 
 import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -27,7 +25,6 @@ import java.util.List;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeField;
@@ -39,16 +36,11 @@ import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.tools.RelConversionException;
 import org.apache.calcite.tools.ValidationException;
 
-import org.apache.calcite.util.Pair;
 import org.apache.drill.common.exceptions.UserException;
-import org.apache.drill.common.expression.SchemaPath;
-import org.apache.drill.common.types.TypeProtos;
-import org.apache.drill.exec.expr.TypeHelper;
 import org.apache.drill.exec.physical.PhysicalPlan;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.planner.logical.DrillRel;
 import org.apache.drill.exec.planner.logical.DrillScreenRel;
-import org.apache.drill.exec.planner.logical.DrillStoreRel;
 import org.apache.drill.exec.planner.logical.DrillWriterRel;
 import org.apache.drill.exec.planner.physical.Prel;
 import org.apache.drill.exec.planner.physical.ProjectAllowDupPrel;
@@ -56,7 +48,6 @@ import org.apache.drill.exec.planner.physical.ProjectPrel;
 import org.apache.drill.exec.planner.physical.WriterPrel;
 import org.apache.drill.exec.planner.physical.visitor.BasePrelVisitor;
 import org.apache.drill.exec.planner.sql.DrillSqlOperator;
-import org.apache.drill.exec.planner.sql.DrillSqlWorker;
 import org.apache.drill.exec.planner.sql.SchemaUtilites;
 import org.apache.drill.exec.planner.sql.parser.SqlCreateTable;
 import org.apache.drill.exec.store.AbstractSchema;
@@ -72,10 +63,15 @@ public class CreateTableHandler extends DefaultSqlHandler {
   @Override
   public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConversionException, IOException, ForemanSetupException {
     SqlCreateTable sqlCreateTable = unwrap(sqlNode, SqlCreateTable.class);
-
     final String newTblName = sqlCreateTable.getName();
+
+    final ConvertedRelNode convertedRelNode = validateAndConvert(sqlCreateTable.getQuery());
+    final RelDataType validatedRowType = convertedRelNode.getValidatedRowType();
+    final RelNode queryRelNode = convertedRelNode.getConvertedNode();
+
+
     final RelNode newTblRelNode =
-        SqlHandlerUtil.resolveNewTableRel(false, planner, sqlCreateTable.getFieldNames(), sqlCreateTable.getQuery());
+        SqlHandlerUtil.resolveNewTableRel(false, sqlCreateTable.getFieldNames(), validatedRowType, queryRelNode);
 
 
     final AbstractSchema drillSchema =
@@ -93,7 +89,7 @@ public class CreateTableHandler extends DefaultSqlHandler {
     log("Optiq Logical", newTblRelNodeWithPCol);
 
     // Convert the query to Drill Logical plan and insert a writer operator on top.
-    DrillRel drel = convertToDrel(newTblRelNodeWithPCol, drillSchema, newTblName, sqlCreateTable.getPartitionColumns());
+    DrillRel drel = convertToDrel(newTblRelNodeWithPCol, drillSchema, newTblName, sqlCreateTable.getPartitionColumns(), newTblRelNode.getRowType());
     log("Drill Logical", drel);
     Prel prel = convertToPrel(drel, newTblRelNode.getRowType(), sqlCreateTable.getPartitionColumns());
     log("Drill Physical", prel);
@@ -104,14 +100,10 @@ public class CreateTableHandler extends DefaultSqlHandler {
     return plan;
   }
 
-  private DrillRel convertToDrel(RelNode relNode, AbstractSchema schema, String tableName, List<String> partitionColumns)
-      throws RelConversionException {
-    RelNode convertedRelNode = planner.transform(DrillSqlWorker.LOGICAL_RULES,
-        relNode.getTraitSet().plus(DrillRel.DRILL_LOGICAL), relNode);
+  private DrillRel convertToDrel(RelNode relNode, AbstractSchema schema, String tableName, List<String> partitionColumns, RelDataType queryRowType)
+      throws RelConversionException, SqlUnsupportedException {
 
-    if (convertedRelNode instanceof DrillStoreRel) {
-      throw new UnsupportedOperationException();
-    }
+    final DrillRel convertedRelNode = convertToDrel(relNode);
 
     DrillWriterRel writerRel = new DrillWriterRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(),
         convertedRelNode, schema.createNewTable(tableName, partitionColumns));

http://git-wip-us.apache.org/repos/asf/drill/blob/ffae1691/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
index 5e685c8..a2858b8 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
@@ -27,38 +27,21 @@ import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.plan.hep.HepPlanner;
 import org.apache.calcite.rel.RelNode;
-import com.google.common.collect.ImmutableList;
-import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.hep.HepMatchOrder;
 import org.apache.calcite.plan.hep.HepProgram;
 import org.apache.calcite.plan.hep.HepProgramBuilder;
 import org.apache.calcite.rel.RelShuttleImpl;
-import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
-import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.TableFunctionScan;
 import org.apache.calcite.rel.core.TableScan;
-import org.apache.calcite.rel.logical.LogicalJoin;
-import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.logical.LogicalValues;
 import org.apache.calcite.rel.metadata.CachingRelMetadataProvider;
 import org.apache.calcite.rel.metadata.ChainedRelMetadataProvider;
-import org.apache.calcite.rel.metadata.DefaultRelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMetadataProvider;
-import org.apache.calcite.rel.rules.FilterAggregateTransposeRule;
-import org.apache.calcite.rel.rules.FilterJoinRule;
-import org.apache.calcite.rel.rules.FilterMergeRule;
-import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
-import org.apache.calcite.rel.rules.JoinPushThroughJoinRule;
-import org.apache.calcite.rel.rules.JoinPushTransitivePredicatesRule;
 import org.apache.calcite.rel.rules.JoinToMultiJoinRule;
 import org.apache.calcite.rel.rules.LoptOptimizeJoinRule;
-import org.apache.calcite.rel.rules.ProjectMergeRule;
 import org.apache.calcite.rel.rules.ProjectRemoveRule;
-import org.apache.calcite.rel.rules.SemiJoinFilterTransposeRule;
-import org.apache.calcite.rel.rules.SemiJoinJoinTransposeRule;
-import org.apache.calcite.rel.rules.SemiJoinProjectTransposeRule;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexNode;
@@ -67,7 +50,6 @@ import org.apache.calcite.sql.SqlExplainLevel;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.TypedSqlNode;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import org.apache.calcite.sql2rel.RelFieldTrimmer;
 import org.apache.calcite.tools.Planner;
 import org.apache.calcite.tools.RelConversionException;
 import org.apache.calcite.tools.ValidationException;
@@ -83,12 +65,8 @@ import org.apache.drill.exec.physical.base.AbstractPhysicalVisitor;
 import org.apache.drill.exec.physical.base.PhysicalOperator;
 import org.apache.drill.exec.physical.impl.join.JoinUtils;
 import org.apache.drill.exec.planner.cost.DrillDefaultRelMetadataProvider;
-import org.apache.drill.exec.planner.logical.DrillFilterJoinRules;
 import org.apache.drill.exec.planner.logical.DrillJoinRel;
-import org.apache.drill.exec.planner.logical.DrillMergeProjectRule;
 import org.apache.drill.exec.planner.logical.DrillProjectRel;
-import org.apache.drill.exec.planner.logical.DrillPushFilterPastProjectRule;
-import org.apache.drill.exec.planner.logical.DrillPushProjectPastFilterRule;
 import org.apache.drill.exec.planner.logical.DrillRel;
 import org.apache.drill.exec.planner.logical.DrillRelFactories;
 import org.apache.drill.exec.planner.logical.DrillScreenRel;
@@ -172,19 +150,15 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
     }
   }
 
+
   @Override
   public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConversionException, IOException, ForemanSetupException {
-    SqlNode rewrittenSqlNode = rewrite(sqlNode);
-    TypedSqlNode validatedTypedSqlNode = validateNode(rewrittenSqlNode);
-    SqlNode validated = validatedTypedSqlNode.getSqlNode();
-    RelDataType validatedRowType = validatedTypedSqlNode.getType();
-
-    RelNode rel = convertToRel(validated);
-    rel = preprocessNode(rel);
-
+    final ConvertedRelNode convertedRelNode = validateAndConvert(sqlNode);
+    final RelDataType validatedRowType = convertedRelNode.getValidatedRowType();
+    final RelNode queryRelNode = convertedRelNode.getConvertedNode();
 
-    log("Optiq Logical", rel);
-    DrillRel drel = convertToDrel(rel, validatedRowType);
+    log("Optiq Logical", queryRelNode);
+    DrillRel drel = convertToDrel(queryRelNode, validatedRowType);
 
     log("Drill Logical", drel);
     Prel prel = convertToPrel(drel);
@@ -195,90 +169,45 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
     return plan;
   }
 
-  protected DrillRel addRenamedProject(DrillRel rel, RelDataType validatedRowType) {
-    RelDataType t = rel.getRowType();
-
-    RexBuilder b = rel.getCluster().getRexBuilder();
-    List<RexNode> projections = Lists.newArrayList();
-    int projectCount = t.getFieldList().size();
-
-    for (int i =0; i < projectCount; i++) {
-      projections.add(b.makeInputRef(rel, i));
-    }
-
-    final List<String> fieldNames2 = SqlValidatorUtil.uniquify(validatedRowType.getFieldNames(), SqlValidatorUtil.F_SUGGESTER2);
-
-    RelDataType newRowType = RexUtil.createStructType(rel.getCluster().getTypeFactory(), projections, fieldNames2);
-
-    DrillProjectRel topProj = DrillProjectRel.create(rel.getCluster(), rel.getTraitSet(), rel, projections, newRowType);
-
-    if (ProjectRemoveRule.isTrivial(topProj, true)) {
-      return rel;
-    } else{
-      return topProj;
-    }
-    //return RelOptUtil.createProject(rel, projections, fieldNames2);
-
-  }
-
-
-  protected TypedSqlNode validateNode(SqlNode sqlNode) throws ValidationException, RelConversionException, ForemanSetupException {
-    TypedSqlNode typedSqlNode = planner.validateAndGetType(sqlNode);
-
-    SqlNode sqlNodeValidated = typedSqlNode.getSqlNode();
-
-    // Check if the unsupported functionality is used
-    UnsupportedOperatorsVisitor visitor = UnsupportedOperatorsVisitor.createVisitor(context);
-    try {
-      sqlNodeValidated.accept(visitor);
-    } catch (UnsupportedOperationException ex) {
-      // If the exception due to the unsupported functionalities
-      visitor.convertException();
-
-      // If it is not, let this exception move forward to higher logic
-      throw ex;
-    }
-
-    return typedSqlNode;
-  }
-
-  protected RelNode convertToRel(SqlNode node) throws RelConversionException {
-    RelNode convertedNode = planner.convert(node);
-    hepPlanner.setRoot(convertedNode);
-    RelNode rel = hepPlanner.findBestExp();
 
-    return rel;
+  /**
+   * Rewrite the parse tree. Used before validating the parse tree. Useful if a particular statement needs to converted
+   * into another statement.
+   *
+   * @param node
+   * @return Rewritten sql parse tree
+   * @throws RelConversionException
+   */
+  protected SqlNode rewrite(SqlNode node) throws RelConversionException, ForemanSetupException {
+    return node;
   }
 
-  protected RelNode preprocessNode(RelNode rel) throws SqlUnsupportedException {
-    /*
-     * Traverse the tree to do the following pre-processing tasks: 1. replace the convert_from, convert_to function to
-     * actual implementations Eg: convert_from(EXPR, 'JSON') be converted to convert_fromjson(EXPR); TODO: Ideally all
-     * function rewrites would move here instead of DrillOptiq.
-     *
-     * 2. see where the tree contains unsupported functions; throw SqlUnsupportedException if there is any.
-     */
+  protected ConvertedRelNode validateAndConvert(SqlNode sqlNode) throws ForemanSetupException, RelConversionException, ValidationException {
+    final SqlNode rewrittenSqlNode = rewrite(sqlNode);
+    final TypedSqlNode validatedTypedSqlNode = validateNode(rewrittenSqlNode);
+    final SqlNode validated = validatedTypedSqlNode.getSqlNode();
 
-    PreProcessLogicalRel visitor = PreProcessLogicalRel.createVisitor(planner.getTypeFactory(),
-        context.getDrillOperatorTable());
-    try {
-      rel = rel.accept(visitor);
-    } catch (UnsupportedOperationException ex) {
-      visitor.convertException();
-      throw ex;
-    }
+    RelNode rel = convertToRel(validated);
+    rel = preprocessNode(rel);
 
-    return rel;
+    return new ConvertedRelNode(rel, validatedTypedSqlNode.getType());
   }
 
-  protected DrillRel convertToDrel(RelNode relNode, RelDataType validatedRowType) throws RelConversionException, SqlUnsupportedException {
+  /**
+   *  Given a relNode tree for SELECT statement, convert to Drill Logical RelNode tree.
+   * @param relNode
+   * @return
+   * @throws SqlUnsupportedException
+   * @throws RelConversionException
+   */
+  protected DrillRel convertToDrel(RelNode relNode) throws SqlUnsupportedException, RelConversionException {
     try {
-      RelNode convertedRelNode;
+      final DrillRel convertedRelNode;
 
       if (! context.getPlannerSettings().isHepJoinOptEnabled()) {
-        convertedRelNode = logicalPlanningVolcano(relNode);
+        convertedRelNode = (DrillRel) logicalPlanningVolcano(relNode);
       } else {
-        convertedRelNode = logicalPlanningVolcanoAndLopt(relNode);
+        convertedRelNode = (DrillRel) logicalPlanningVolcanoAndLopt(relNode);
       }
 
       if (convertedRelNode instanceof DrillStoreRel) {
@@ -290,10 +219,7 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
           context.getPlannerSettings().forceSingleMode();
         }
 
-        // Put a non-trivial topProject to ensure the final output field name is preserved, when necessary.
-        DrillRel topPreservedNameProj = addRenamedProject((DrillRel) convertedRelNode, validatedRowType);
-        return new DrillScreenRel(topPreservedNameProj.getCluster(), topPreservedNameProj.getTraitSet(),
-            topPreservedNameProj);
+        return convertedRelNode;
       }
     } catch (RelOptPlanner.CannotPlanException ex) {
       logger.error(ex.getMessage());
@@ -306,6 +232,24 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
     }
   }
 
+  /**
+   * Return Drill Logical RelNode tree for a SELECT statement, when it is executed / explained directly.
+   *
+   * @param relNode : root RelNode corresponds to Calcite Logical RelNode.
+   * @param validatedRowType : the rowType for the final field names. A rename project may be placed on top of the root.
+   * @return
+   * @throws RelConversionException
+   * @throws SqlUnsupportedException
+   */
+  protected DrillRel convertToDrel(RelNode relNode, RelDataType validatedRowType) throws RelConversionException, SqlUnsupportedException {
+    final DrillRel convertedRelNode = convertToDrel(relNode);
+
+    // Put a non-trivial topProject to ensure the final output field name is preserved, when necessary.
+    DrillRel topPreservedNameProj = addRenamedProject((DrillRel) convertedRelNode, validatedRowType);
+    return new DrillScreenRel(topPreservedNameProj.getCluster(), topPreservedNameProj.getTraitSet(),
+        topPreservedNameProj);
+  }
+
 
   protected Prel convertToPrel(RelNode drel) throws RelConversionException, SqlUnsupportedException {
     Preconditions.checkArgument(drel.getConvention() == DrillRel.DRILL_LOGICAL);
@@ -479,18 +423,80 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
 
   }
 
-  /**
-   * Rewrite the parse tree. Used before validating the parse tree. Useful if a particular statement needs to converted
-   * into another statement.
-   *
-   * @param node
-   * @return Rewritten sql parse tree
-   * @throws RelConversionException
-   */
-  public SqlNode rewrite(SqlNode node) throws RelConversionException, ForemanSetupException {
-    return node;
+  private TypedSqlNode validateNode(SqlNode sqlNode) throws ValidationException, RelConversionException, ForemanSetupException {
+    TypedSqlNode typedSqlNode = planner.validateAndGetType(sqlNode);
+
+    SqlNode sqlNodeValidated = typedSqlNode.getSqlNode();
+
+    // Check if the unsupported functionality is used
+    UnsupportedOperatorsVisitor visitor = UnsupportedOperatorsVisitor.createVisitor(context);
+    try {
+      sqlNodeValidated.accept(visitor);
+    } catch (UnsupportedOperationException ex) {
+      // If the exception due to the unsupported functionalities
+      visitor.convertException();
+
+      // If it is not, let this exception move forward to higher logic
+      throw ex;
+    }
+
+    return typedSqlNode;
+  }
+
+  private RelNode convertToRel(SqlNode node) throws RelConversionException {
+    RelNode convertedNode = planner.convert(node);
+    hepPlanner.setRoot(convertedNode);
+    RelNode rel = hepPlanner.findBestExp();
+
+    return rel;
+  }
+
+  private RelNode preprocessNode(RelNode rel) throws SqlUnsupportedException {
+    /*
+     * Traverse the tree to do the following pre-processing tasks: 1. replace the convert_from, convert_to function to
+     * actual implementations Eg: convert_from(EXPR, 'JSON') be converted to convert_fromjson(EXPR); TODO: Ideally all
+     * function rewrites would move here instead of DrillOptiq.
+     *
+     * 2. see where the tree contains unsupported functions; throw SqlUnsupportedException if there is any.
+     */
+
+    PreProcessLogicalRel visitor = PreProcessLogicalRel.createVisitor(planner.getTypeFactory(),
+        context.getDrillOperatorTable());
+    try {
+      rel = rel.accept(visitor);
+    } catch (UnsupportedOperationException ex) {
+      visitor.convertException();
+      throw ex;
+    }
+
+    return rel;
+  }
+
+  private DrillRel addRenamedProject(DrillRel rel, RelDataType validatedRowType) {
+    RelDataType t = rel.getRowType();
+
+    RexBuilder b = rel.getCluster().getRexBuilder();
+    List<RexNode> projections = Lists.newArrayList();
+    int projectCount = t.getFieldList().size();
+
+    for (int i =0; i < projectCount; i++) {
+      projections.add(b.makeInputRef(rel, i));
+    }
+
+    final List<String> fieldNames2 = SqlValidatorUtil.uniquify(validatedRowType.getFieldNames(), SqlValidatorUtil.F_SUGGESTER2);
+
+    RelDataType newRowType = RexUtil.createStructType(rel.getCluster().getTypeFactory(), projections, fieldNames2);
+
+    DrillProjectRel topProj = DrillProjectRel.create(rel.getCluster(), rel.getTraitSet(), rel, projections, newRowType);
+
+    if (ProjectRemoveRule.isTrivial(topProj, true)) {
+      return rel;
+    } else{
+      return topProj;
+    }
   }
 
+
   private RelNode logicalPlanningVolcano(RelNode relNode) throws RelConversionException, SqlUnsupportedException {
     return planner.transform(DrillSqlWorker.LOGICAL_RULES, relNode.getTraitSet().plus(DrillRel.DRILL_LOGICAL), relNode);
   }
@@ -523,7 +529,7 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
   /**
    * Appy Join Order Optimizations using Hep Planner.
    */
-  public RelNode getLoptJoinOrderTree(RelNode root,
+  private RelNode getLoptJoinOrderTree(RelNode root,
                                       Class<? extends Join> joinClass,
                                              RelFactories.JoinFactory joinFactory,
                                              RelFactories.FilterFactory filterFactory,
@@ -589,4 +595,24 @@ public class DefaultSqlHandler extends AbstractSqlHandler {
       return parent;
     }
   }
+
+  protected class ConvertedRelNode {
+    private final RelNode relNode;
+    private final RelDataType validatedRowType;
+
+    public ConvertedRelNode(RelNode relNode, RelDataType validatedRowType) {
+      this.relNode = relNode;
+      this.validatedRowType = validatedRowType;
+    }
+
+    public RelNode getConvertedNode() {
+      return this.relNode;
+    }
+
+    public RelDataType getValidatedRowType() {
+      return this.validatedRowType;
+    }
+  }
+
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ffae1691/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ExplainHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ExplainHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ExplainHandler.java
index 5924c7e..efc4b36 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ExplainHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ExplainHandler.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.planner.sql.handlers;
 import java.io.IOException;
 
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.sql.TypedSqlNode;
 import org.apache.calcite.tools.RelConversionException;
 import org.apache.calcite.tools.ValidationException;
 
@@ -53,17 +52,13 @@ public class ExplainHandler extends DefaultSqlHandler {
   }
 
   @Override
-  public PhysicalPlan getPlan(SqlNode node) throws ValidationException, RelConversionException, IOException, ForemanSetupException {
-    SqlNode sqlNode = rewrite(node);
-    TypedSqlNode validatedTypedSqlNode = validateNode(sqlNode);
-    SqlNode validated = validatedTypedSqlNode.getSqlNode();
-    RelDataType validatedRowType = validatedTypedSqlNode.getType();
+  public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConversionException, IOException, ForemanSetupException {
+    final ConvertedRelNode convertedRelNode = validateAndConvert(sqlNode);
+    final RelDataType validatedRowType = convertedRelNode.getValidatedRowType();
+    final RelNode queryRelNode = convertedRelNode.getConvertedNode();
 
-    RelNode rel = convertToRel(validated);
-    rel = preprocessNode(rel);
-
-    log("Optiq Logical", rel);
-    DrillRel drel = convertToDrel(rel, validatedRowType);
+    log("Optiq Logical", queryRelNode);
+    DrillRel drel = convertToDrel(queryRelNode, validatedRowType);
     log("Drill Logical", drel);
 
     if (mode == ResultMode.LOGICAL) {

http://git-wip-us.apache.org/repos/asf/drill/blob/ffae1691/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SqlHandlerUtil.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SqlHandlerUtil.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SqlHandlerUtil.java
index 60287dc..9e7be7f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SqlHandlerUtil.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/SqlHandlerUtil.java
@@ -58,21 +58,18 @@ public class SqlHandlerUtil {
    *
    * @param isNewTableView Is the new table created a view? This doesn't affect the functionality, but it helps format
    *                       better error messages.
-   * @param planner Planner instance.
    * @param tableFieldNames List of fields specified in new table/view field list. These are the fields given just after
    *                        new table name.
    *                        Ex. CREATE TABLE newTblName(col1, medianOfCol2, avgOfCol3) AS
    *                        SELECT col1, median(col2), avg(col3) FROM sourcetbl GROUP BY col1;
-   * @param newTableQueryDef  Sql tree of definition of the new table or view (query after the AS keyword). This tree is
-   *                          modified, so it is responsibility of caller's to make a copy if needed.
    * @throws ValidationException If table's fields list and field list specified in table definition are not valid.
    * @throws RelConversionException If failed to convert the table definition into a RelNode.
    */
-  public static RelNode resolveNewTableRel(boolean isNewTableView, Planner planner, List<String> tableFieldNames,
-      SqlNode newTableQueryDef) throws ValidationException, RelConversionException {
+  public static RelNode resolveNewTableRel(boolean isNewTableView, List<String> tableFieldNames,
+      RelDataType validatedRowtype, RelNode queryRelNode) throws ValidationException, RelConversionException {
 
 
-    TypedSqlNode validatedSqlNodeWithType = planner.validateAndGetType(newTableQueryDef);
+//    TypedSqlNode validatedSqlNodeWithType = planner.validateAndGetType(newTableQueryDef);
 
     // Get the row type of view definition query.
     // Reason for getting the row type from validated SqlNode than RelNode is because SqlNode -> RelNode involves
@@ -84,12 +81,11 @@ public class SqlHandlerUtil {
     //  | 0          | 0          |
     //  +------------+------------+
     // which is not desired when creating new views or tables.
-    final RelDataType queryRowType = validatedSqlNodeWithType.getType();
-    final RelNode validatedQueryRelNode = planner.convert(validatedSqlNodeWithType.getSqlNode());
+//    final RelDataType queryRowType = validatedRowtype;
 
     if (tableFieldNames.size() > 0) {
       // Field count should match.
-      if (tableFieldNames.size() != queryRowType.getFieldCount()) {
+      if (tableFieldNames.size() != validatedRowtype.getFieldCount()) {
         final String tblType = isNewTableView ? "view" : "table";
         throw UserException.validationError()
             .message("%s's field list and the %s's query field list have different counts.", tblType, tblType)
@@ -97,7 +93,7 @@ public class SqlHandlerUtil {
       }
 
       // CTAS's query field list shouldn't have "*" when table's field list is specified.
-      for (String field : queryRowType.getFieldNames()) {
+      for (String field : validatedRowtype.getFieldNames()) {
         if (field.equals("*")) {
           final String tblType = isNewTableView ? "view" : "table";
           throw UserException.validationError()
@@ -115,13 +111,13 @@ public class SqlHandlerUtil {
       //        SELECT col1, median(col2), avg(col3) FROM sourcetbl GROUP BY col1 ;
       // Similary for CREATE VIEW.
 
-      return DrillRelOptUtil.createRename(validatedQueryRelNode, tableFieldNames);
+      return DrillRelOptUtil.createRename(queryRelNode, tableFieldNames);
     }
 
     // As the column names of the view are derived from SELECT query, make sure the query has no duplicate column names
-    ensureNoDuplicateColumnNames(queryRowType.getFieldNames());
+    ensureNoDuplicateColumnNames(validatedRowtype.getFieldNames());
 
-    return validatedQueryRelNode;
+    return queryRelNode;
   }
 
   private static void ensureNoDuplicateColumnNames(List<String> fieldNames) throws ValidationException {

http://git-wip-us.apache.org/repos/asf/drill/blob/ffae1691/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
index 0a3393e..36287a4 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
@@ -19,11 +19,10 @@ package org.apache.drill.exec.planner.sql.handlers;
 
 import java.io.IOException;
 
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.schema.Schema;
-import org.apache.calcite.schema.Schema.TableType;
 import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.schema.Table;
-import org.apache.calcite.tools.Planner;
 import org.apache.calcite.tools.RelConversionException;
 import org.apache.calcite.tools.ValidationException;
 
@@ -40,22 +39,21 @@ import org.apache.drill.exec.work.foreman.ForemanSetupException;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.sql.SqlNode;
 
-public abstract class ViewHandler extends AbstractSqlHandler {
+public abstract class ViewHandler extends DefaultSqlHandler {
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ViewHandler.class);
 
-  protected Planner planner;
   protected QueryContext context;
 
-  public ViewHandler(Planner planner, QueryContext context) {
-    this.planner = planner;
-    this.context = context;
+  public ViewHandler(SqlHandlerConfig config) {
+    super(config);
+    this.context = config.getContext();
   }
 
   /** Handler for Create View DDL command */
   public static class CreateView extends ViewHandler {
 
-    public CreateView(Planner planner, QueryContext context) {
-      super(planner, context);
+    public CreateView(SqlHandlerConfig config) {
+      super(config);
     }
 
     @Override
@@ -67,8 +65,11 @@ public abstract class ViewHandler extends AbstractSqlHandler {
       // Store the viewSql as view def SqlNode is modified as part of the resolving the new table definition below.
       final String viewSql = createView.getQuery().toString();
 
-      final RelNode newViewRelNode =
-          SqlHandlerUtil.resolveNewTableRel(true, planner, createView.getFieldNames(), createView.getQuery());
+      final ConvertedRelNode convertedRelNode = validateAndConvert(createView.getQuery());
+      final RelDataType validatedRowType = convertedRelNode.getValidatedRowType();
+      final RelNode queryRelNode = convertedRelNode.getConvertedNode();
+
+      final RelNode newViewRelNode = SqlHandlerUtil.resolveNewTableRel(true, createView.getFieldNames(), validatedRowType, queryRelNode);
 
       final SchemaPlus defaultSchema = context.getNewDefaultSchema();
       final AbstractSchema drillSchema = SchemaUtilites.resolveToMutableDrillSchema(defaultSchema, createView.getSchemaPath());
@@ -107,8 +108,8 @@ public abstract class ViewHandler extends AbstractSqlHandler {
 
   /** Handler for Drop View DDL command. */
   public static class DropView extends ViewHandler {
-    public DropView(QueryContext context) {
-      super(null, context);
+    public DropView(SqlHandlerConfig config) {
+      super(config);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/drill/blob/ffae1691/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlCreateView.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlCreateView.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlCreateView.java
index a140829..cc6118a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlCreateView.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlCreateView.java
@@ -96,7 +96,7 @@ public class SqlCreateView extends DrillSqlCall {
 
   @Override
   public AbstractSqlHandler getSqlHandler(SqlHandlerConfig config) {
-    return new ViewHandler.CreateView(config.getPlanner(), config.getContext());
+    return new ViewHandler.CreateView(config);
   }
 
   public List<String> getSchemaPath() {

http://git-wip-us.apache.org/repos/asf/drill/blob/ffae1691/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
index 473dbcb..0e775b8 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
@@ -73,7 +73,7 @@ public class SqlDropView extends DrillSqlCall {
 
   @Override
   public AbstractSqlHandler getSqlHandler(SqlHandlerConfig config) {
-    return new DropView(config.getContext());
+    return new DropView(config);
   }
 
   public List<String> getSchemaPath() {