You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2018/11/17 02:08:43 UTC

[5/7] impala git commit: IMPALA-5821: Add query with implicit casts to extended explain output.

IMPALA-5821: Add query with implicit casts to extended explain output.

If explain_level is at 'extended' level or higher, then enhance the
output from the explain command. (1) Show the analyzed sql in the
explain header, this is the rewritten sql, which includes implicit
casts, and literals are printed with a cast so that their type is
visible. (2) When predicates are shown in the plan these are shown in
the same format.

The toSql() method can be called on a ParseNode tree to return
the sql corresponding ot the tree. In the past toSQl() has been
enhanced to print rewritten sql by partially overloading toSql() [with
toSql(boolean)]. This current change requires changing toSQl() in
many places as NumericLiteral can appear at different points in ia
parse tree. To avoid many new fragile overloads of toSql() I added
toSql(ToSqlOptions), where ToSqlOptions is an enum which controls the
form of the Sql that is returned. This changes many files but is safer
and means that any future options to toSql() can be added painlessly.

If SHOW_IMPLICIT_CASTS is passed to toSql() then
- in CastExpr print the implicit cast
- in NumericLiteral print the literal with a cast to show the type

Add a PlannerTestOption directive that will force the query text showing
implicit casts to be included in the PLAN section of a .test file.

The analyzed query text is wrapped at 80 characters. Note that the
analyzed query cannot always be executed as queries rewritten to use
LEFT SEMI JOIN are not legal sql. In addition some space characters may
be removed from the query for prettier display.

Documentation of this change will be done as IMPALA-7718

EXAMPLE OUTPUT:

[localhost:21000] default> set explain_level=2;
EXPLAIN_LEVEL set to 2
[localhost:21000] default> explain select * from functional_kudu.alltypestiny where bigint_col < 1000 / 100;
Query: explain select * from functional_kudu.alltypestiny where bigint_col < 1000 / 100
Max Per-Host Resource Reservation: Memory=0B Threads=2
Per-Host Resource Estimates: Memory=10MB
Codegen disabled by planner
Analyzed query: SELECT * FROM functional_kudu.alltypestiny WHERE CAST(bigint_col
AS DOUBLE) < CAST(10 AS DOUBLE)
""
F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
|  Per-Host Resources: mem-estimate=4.88MB mem-reservation=0B thread-reservation=2
PLAN-ROOT SINK
|  mem-estimate=0B mem-reservation=0B thread-reservation=0
|
00:SCAN KUDU [functional_kudu.alltypestiny]
   predicates: CAST(bigint_col AS DOUBLE) < CAST(10 AS DOUBLE)
   mem-estimate=4.88MB mem-reservation=0B thread-reservation=1
   tuple-ids=0 row-size=97B cardinality=1
   in pipelines: 00(GETNEXT)
Fetched 16 row(s) in 0.03s

TESTING:

All end-to-end tests pass.
Added a new test in ExprRewriterTest which prints sql with implict casts
for some interesting queries.
Add a unit test for the code which wraps text at 60 characters.
The output of some Planner Tests in .test files has been updated to
include the Analyzed sql that is printed when explain_level is
at at least 'extended' level.

Change-Id: I55c3bdacc295137f66b2316a912fc347da30d6b0
Reviewed-on: http://gerrit.cloudera.org:8080/11719
Tested-by: Impala Public Jenkins <im...@cloudera.com>
Reviewed-by: Thomas Marshall <th...@cmu.edu>


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

Branch: refs/heads/master
Commit: d3948d9a0114b7702da684e14919d369e74fe596
Parents: 3dea93e
Author: Andrew Sherman <as...@cloudera.com>
Authored: Fri Oct 12 13:57:20 2018 -0700
Committer: Thomas Marshall <th...@cmu.edu>
Committed: Thu Nov 15 21:32:07 2018 +0000

----------------------------------------------------------------------
 .../org/apache/impala/analysis/AdminFnStmt.java |   4 +-
 .../AlterTableAddDropRangePartitionStmt.java    |   4 +-
 .../analysis/AlterTableAddPartitionStmt.java    |   8 +-
 .../analysis/AlterTableDropPartitionStmt.java   |   4 +-
 .../apache/impala/analysis/AlterViewStmt.java   |   4 +-
 .../apache/impala/analysis/AnalysisContext.java |   6 +-
 .../apache/impala/analysis/AnalyticExpr.java    |  10 +-
 .../apache/impala/analysis/AnalyticWindow.java  |  17 +-
 .../apache/impala/analysis/ArithmeticExpr.java  |   9 +-
 .../apache/impala/analysis/BaseTableRef.java    |   4 +-
 .../impala/analysis/BetweenPredicate.java       |   7 +-
 .../apache/impala/analysis/BinaryPredicate.java |   7 +-
 .../org/apache/impala/analysis/BoolLiteral.java |   2 +-
 .../org/apache/impala/analysis/CaseExpr.java    |  20 +-
 .../org/apache/impala/analysis/CastExpr.java    |  14 +-
 .../impala/analysis/CompoundPredicate.java      |   8 +-
 .../impala/analysis/ComputeStatsStmt.java       |  10 +-
 .../impala/analysis/CreateDataSrcStmt.java      |   2 +-
 .../apache/impala/analysis/CreateDbStmt.java    |   2 +-
 .../impala/analysis/CreateDropRoleStmt.java     |   2 +-
 .../analysis/CreateOrAlterViewStmtBase.java     |   1 -
 .../analysis/CreateTableAsSelectStmt.java       |   4 +-
 .../analysis/CreateTableLikeFileStmt.java       |   6 +-
 .../impala/analysis/CreateTableLikeStmt.java    |   2 +-
 .../apache/impala/analysis/CreateTableStmt.java |   4 +-
 .../apache/impala/analysis/CreateViewStmt.java  |   4 +-
 .../org/apache/impala/analysis/DeleteStmt.java  |  10 +-
 .../apache/impala/analysis/DescribeDbStmt.java  |   2 +-
 .../impala/analysis/DescribeTableStmt.java      |   2 +-
 .../apache/impala/analysis/DropDataSrcStmt.java |   2 +-
 .../org/apache/impala/analysis/DropDbStmt.java  |   2 +-
 .../impala/analysis/DropFunctionStmt.java       |   2 +-
 .../apache/impala/analysis/DropStatsStmt.java   |   4 +-
 .../impala/analysis/DropTableOrViewStmt.java    |   2 +-
 .../apache/impala/analysis/ExistsPredicate.java |   6 +-
 .../java/org/apache/impala/analysis/Expr.java   |  27 +-
 .../apache/impala/analysis/ExtractFromExpr.java |   4 +-
 .../org/apache/impala/analysis/FromClause.java  |  10 +-
 .../apache/impala/analysis/FunctionArgs.java    |  11 +-
 .../impala/analysis/FunctionCallExpr.java       |   4 +-
 .../impala/analysis/GrantRevokePrivStmt.java    |   5 +-
 .../impala/analysis/GrantRevokeRoleStmt.java    |   2 +-
 .../apache/impala/analysis/HdfsCachingOp.java   |   9 +-
 .../org/apache/impala/analysis/InPredicate.java |   6 +-
 .../apache/impala/analysis/InlineViewRef.java   |  15 +-
 .../org/apache/impala/analysis/InsertStmt.java  |  10 +-
 .../impala/analysis/IsNotEmptyPredicate.java    |   4 +-
 .../apache/impala/analysis/IsNullPredicate.java |   4 +-
 .../impala/analysis/KuduPartitionExpr.java      |   4 +-
 .../impala/analysis/KuduPartitionParam.java     |  15 +-
 .../apache/impala/analysis/LikePredicate.java   |   5 +-
 .../apache/impala/analysis/LimitElement.java    |  10 +-
 .../apache/impala/analysis/LoadDataStmt.java    |   4 +-
 .../org/apache/impala/analysis/ModifyStmt.java  |   2 +-
 .../org/apache/impala/analysis/NullLiteral.java |   4 +-
 .../apache/impala/analysis/NumericLiteral.java  |   7 +-
 .../apache/impala/analysis/OrderByElement.java  |   7 +-
 .../org/apache/impala/analysis/ParseNode.java   |  13 +-
 .../apache/impala/analysis/PartitionDef.java    |  13 +-
 .../apache/impala/analysis/PartitionSet.java    |   4 +-
 .../apache/impala/analysis/PartitionSpec.java   |   4 +-
 .../impala/analysis/PartitionSpecBase.java      |   9 +-
 .../apache/impala/analysis/PrivilegeSpec.java   |   9 +-
 .../apache/impala/analysis/RangePartition.java  |  16 +-
 .../impala/analysis/ResetMetadataStmt.java      |   4 +-
 .../apache/impala/analysis/SelectListItem.java  |   8 +-
 .../org/apache/impala/analysis/SelectStmt.java  |  20 +-
 .../org/apache/impala/analysis/SetStmt.java     |   2 +-
 .../impala/analysis/ShowCreateFunctionStmt.java |   2 +-
 .../impala/analysis/ShowCreateTableStmt.java    |   2 +-
 .../impala/analysis/ShowDataSrcsStmt.java       |   2 +-
 .../org/apache/impala/analysis/ShowDbsStmt.java |   2 +-
 .../apache/impala/analysis/ShowFilesStmt.java   |   4 +-
 .../impala/analysis/ShowFunctionsStmt.java      |   2 +-
 .../impala/analysis/ShowGrantPrincipalStmt.java |   5 +-
 .../apache/impala/analysis/ShowRolesStmt.java   |   2 +-
 .../apache/impala/analysis/ShowStatsStmt.java   |   2 +-
 .../apache/impala/analysis/ShowTablesStmt.java  |   2 +-
 .../org/apache/impala/analysis/SlotRef.java     |   2 +-
 .../apache/impala/analysis/StatementBase.java   |  18 +-
 .../apache/impala/analysis/StmtRewriter.java    |  11 +-
 .../apache/impala/analysis/StringLiteral.java   |   4 +-
 .../org/apache/impala/analysis/Subquery.java    |   7 +-
 .../org/apache/impala/analysis/TableRef.java    |  23 +-
 .../impala/analysis/TableSampleClause.java      |  11 +-
 .../analysis/TimestampArithmeticExpr.java       |  14 +-
 .../impala/analysis/TimestampLiteral.java       |   2 +-
 .../apache/impala/analysis/ToSqlOptions.java    |  61 ++++
 .../org/apache/impala/analysis/ToSqlUtils.java  |   6 +-
 .../apache/impala/analysis/TruncateStmt.java    |   2 +-
 .../impala/analysis/TupleIsNullPredicate.java   |   4 +-
 .../org/apache/impala/analysis/TypeDef.java     |  11 +-
 .../org/apache/impala/analysis/UnionStmt.java   |  18 +-
 .../org/apache/impala/analysis/UpdateStmt.java  |  16 +-
 .../org/apache/impala/analysis/UseStmt.java     |   2 +-
 .../impala/analysis/ValidTupleIdExpr.java       |   4 +-
 .../org/apache/impala/analysis/ValuesStmt.java  |  16 +-
 .../org/apache/impala/analysis/WithClause.java  |  11 +-
 .../org/apache/impala/common/PrintUtils.java    |  19 +-
 .../apache/impala/planner/AggregationNode.java  |  15 +-
 .../apache/impala/planner/AnalyticEvalNode.java |   4 +-
 .../impala/planner/DataSourceScanNode.java      |   7 +-
 .../apache/impala/planner/HBaseScanNode.java    |   4 +-
 .../org/apache/impala/planner/HashJoinNode.java |   4 +-
 .../org/apache/impala/planner/HdfsScanNode.java |  26 +-
 .../apache/impala/planner/JoinBuildSink.java    |   5 +-
 .../org/apache/impala/planner/KuduScanNode.java |   8 +-
 .../impala/planner/NestedLoopJoinNode.java      |   4 +-
 .../org/apache/impala/planner/PlanNode.java     |  10 +-
 .../java/org/apache/impala/planner/Planner.java |  15 +
 .../org/apache/impala/planner/SelectNode.java   |   4 +-
 .../org/apache/impala/planner/SubplanNode.java  |   4 +-
 .../org/apache/impala/planner/UnionNode.java    |   3 +-
 .../org/apache/impala/planner/UnnestNode.java   |   4 +-
 .../impala/analysis/ExprRewriterTest.java       | 147 ++++++++-
 .../apache/impala/common/FrontendTestBase.java  |   8 +-
 .../org/apache/impala/planner/PlannerTest.java  |   3 +-
 .../apache/impala/planner/PlannerTestBase.java  |  21 +-
 .../org/apache/impala/util/PrintUtilsTest.java  |  79 +++++
 .../queries/PlannerTest/constant-folding.test   |  94 ++++--
 .../PlannerTest/fk-pk-join-detection.test       |   4 +-
 .../queries/PlannerTest/kudu-selectivity.test   |   6 +-
 .../queries/PlannerTest/max-row-size.test       |  24 +-
 .../queries/PlannerTest/mt-dop-validation.test  |  74 ++---
 .../PlannerTest/parquet-filtering-disabled.test |  16 +-
 .../queries/PlannerTest/parquet-filtering.test  |  60 ++--
 .../PlannerTest/resource-requirements.test      | 307 ++++++++++++++++++-
 .../PlannerTest/spillable-buffer-sizing.test    |  68 +++-
 .../queries/PlannerTest/tablesample.test        |   2 +-
 .../queries/QueryTest/explain-level2.test       |   2 +
 .../queries/QueryTest/explain-level3.test       |   2 +
 .../queries/QueryTest/parquet-stats.test        |   4 +-
 .../queries/QueryTest/stats-extrapolation.test  |   8 +
 133 files changed, 1341 insertions(+), 460 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AdminFnStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AdminFnStmt.java b/fe/src/main/java/org/apache/impala/analysis/AdminFnStmt.java
index 1e1f022..f2492d3 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AdminFnStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AdminFnStmt.java
@@ -60,11 +60,11 @@ public class AdminFnStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder();
     sb.append(":").append(fnName_).append("(");
     List<String> paramsSql = Lists.newArrayList();
-    for (Expr param: params_) paramsSql.add(param.toSql());
+    for (Expr param : params_) paramsSql.add(param.toSql(options));
     sb.append(Joiner.on(", ").join(paramsSql));
     sb.append(")");
     return sb.toString();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AlterTableAddDropRangePartitionStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AlterTableAddDropRangePartitionStmt.java b/fe/src/main/java/org/apache/impala/analysis/AlterTableAddDropRangePartitionStmt.java
index 44c7091..dd03902 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AlterTableAddDropRangePartitionStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AlterTableAddDropRangePartitionStmt.java
@@ -63,11 +63,11 @@ public class AlterTableAddDropRangePartitionStmt extends AlterTableStmt {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("ALTER TABLE " + getTbl());
     sb.append(" " + operation_.name());
     if (ignoreErrors_) sb.append(" " + operation_.option());
-    sb.append(" " + rangePartitionSpec_.toSql());
+    sb.append(" " + rangePartitionSpec_.toSql(options));
     return sb.toString();
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AlterTableAddPartitionStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AlterTableAddPartitionStmt.java b/fe/src/main/java/org/apache/impala/analysis/AlterTableAddPartitionStmt.java
index 4b2356a..9f2bfbd 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AlterTableAddPartitionStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AlterTableAddPartitionStmt.java
@@ -23,9 +23,7 @@ import com.google.common.collect.Sets;
 
 import org.apache.impala.catalog.FeKuduTable;
 import org.apache.impala.catalog.FeTable;
-import org.apache.impala.catalog.KuduTable;
 import org.apache.impala.common.AnalysisException;
-import org.apache.impala.service.CatalogOpExecutor;
 import org.apache.impala.thrift.TAlterTableAddPartitionParams;
 import org.apache.impala.thrift.TAlterTableParams;
 import org.apache.impala.thrift.TAlterTableType;
@@ -33,8 +31,6 @@ import org.apache.impala.thrift.TAlterTableType;
 import java.util.List;
 import java.util.Set;
 
-import com.google.common.base.Preconditions;
-
 /**
  * Represents an ALTER TABLE ADD PARTITION statement.
  */
@@ -61,12 +57,12 @@ public class AlterTableAddPartitionStmt extends AlterTableStmt {
   public boolean getIfNotExists() { return ifNotExists_; }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("ALTER TABLE ");
     if (getDb() != null) sb.append(getDb() + ".");
     sb.append(getTbl()).append(" ADD");
     if (ifNotExists_) sb.append(" IF NOT EXISTS");
-    for (PartitionDef p: partitions_) sb.append(" " + p.toSql());
+    for (PartitionDef p : partitions_) sb.append(" " + p.toSql(options));
     return sb.toString();
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AlterTableDropPartitionStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AlterTableDropPartitionStmt.java b/fe/src/main/java/org/apache/impala/analysis/AlterTableDropPartitionStmt.java
index 707f3de..3cb9ac9 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AlterTableDropPartitionStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AlterTableDropPartitionStmt.java
@@ -50,11 +50,11 @@ public class AlterTableDropPartitionStmt extends AlterTableStmt {
   public boolean getIfNotExists() { return ifExists_; }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("ALTER TABLE " + getTbl());
     sb.append(" DROP ");
     if (ifExists_) sb.append("IF EXISTS ");
-    sb.append(partitionSet_.toSql());
+    sb.append(partitionSet_.toSql(options));
     if (purgePartition_) sb.append(" PURGE");
     return sb.toString();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AlterViewStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AlterViewStmt.java b/fe/src/main/java/org/apache/impala/analysis/AlterViewStmt.java
index 8e21ca1..ae74e1a 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AlterViewStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AlterViewStmt.java
@@ -79,7 +79,7 @@ public class AlterViewStmt extends CreateOrAlterViewStmtBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder();
     sb.append("ALTER VIEW ");
     if (tableName_.getDb() != null) {
@@ -87,7 +87,7 @@ public class AlterViewStmt extends CreateOrAlterViewStmtBase {
     }
     sb.append(tableName_.getTbl());
     if (columnDefs_ != null) sb.append("(" + getColumnNames() + ")");
-    sb.append(" AS " + viewDefStmt_.toSql());
+    sb.append(" AS " + viewDefStmt_.toSql(options));
     return sb.toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AnalysisContext.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AnalysisContext.java b/fe/src/main/java/org/apache/impala/analysis/AnalysisContext.java
index 729a84a..e866225 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AnalysisContext.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AnalysisContext.java
@@ -53,6 +53,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.ImmutableList;
 
+import static org.apache.impala.analysis.ToSqlOptions.REWRITTEN;
+
 /**
  * Wrapper class for parsing, analyzing and rewriting a SQL stmt.
  */
@@ -486,7 +488,7 @@ public class AnalysisContext {
     } catch (AnalysisException e) {
       LOG.error(String.format("Error analyzing the rewritten query.\n" +
           "Original SQL: %s\nRewritten SQL: %s", analysisResult_.stmt_.toSql(),
-          analysisResult_.stmt_.toSql(true)));
+          analysisResult_.stmt_.toSql(REWRITTEN)));
       throw e;
     }
 
@@ -494,7 +496,7 @@ public class AnalysisContext {
     analysisResult_.stmt_.castResultExprs(origResultTypes);
     analysisResult_.stmt_.setColLabels(origColLabels);
     if (LOG.isTraceEnabled()) {
-      LOG.trace("Rewritten SQL: " + analysisResult_.stmt_.toSql(true));
+      LOG.trace("Rewritten SQL: " + analysisResult_.stmt_.toSql(REWRITTEN));
     }
 
     // Restore privilege requests found during the first pass

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AnalyticExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AnalyticExpr.java b/fe/src/main/java/org/apache/impala/analysis/AnalyticExpr.java
index 76fc81f..c8a5199 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AnalyticExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AnalyticExpr.java
@@ -147,19 +147,19 @@ public class AnalyticExpr extends Expr {
   public Expr clone() { return new AnalyticExpr(this); }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     if (sqlString_ != null) return sqlString_;
     StringBuilder sb = new StringBuilder();
-    sb.append(fnCall_.toSql()).append(" OVER (");
+    sb.append(fnCall_.toSql(options)).append(" OVER (");
     boolean needsSpace = false;
     if (!partitionExprs_.isEmpty()) {
-      sb.append("PARTITION BY ").append(Expr.toSql(partitionExprs_));
+      sb.append("PARTITION BY ").append(Expr.toSql(partitionExprs_, options));
       needsSpace = true;
     }
     if (!orderByElements_.isEmpty()) {
       List<String> orderByStrings = Lists.newArrayList();
       for (OrderByElement e: orderByElements_) {
-        orderByStrings.add(e.toSql());
+        orderByStrings.add(e.toSql(options));
       }
       if (needsSpace) sb.append(" ");
       sb.append("ORDER BY ").append(Joiner.on(", ").join(orderByStrings));
@@ -167,7 +167,7 @@ public class AnalyticExpr extends Expr {
     }
     if (window_ != null) {
       if (needsSpace) sb.append(" ");
-      sb.append(window_.toSql());
+      sb.append(window_.toSql(options));
     }
     sb.append(")");
     return sb.toString();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/AnalyticWindow.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/AnalyticWindow.java b/fe/src/main/java/org/apache/impala/analysis/AnalyticWindow.java
index 42b94a2..8c03e56 100644
--- a/fe/src/main/java/org/apache/impala/analysis/AnalyticWindow.java
+++ b/fe/src/main/java/org/apache/impala/analysis/AnalyticWindow.java
@@ -30,6 +30,7 @@ import org.apache.impala.thrift.TColumnValue;
 import org.apache.impala.util.TColumnValueUtil;
 import com.google.common.base.Preconditions;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
 
 /**
  * Windowing clause of an analytic expr
@@ -140,9 +141,11 @@ public class AnalyticWindow {
       offsetValue_ = offsetValue;
     }
 
-    public String toSql() {
+    public final String toSql() { return toSql(DEFAULT); }
+
+    public String toSql(ToSqlOptions options) {
       StringBuilder sb = new StringBuilder();
-      if (expr_ != null) sb.append(expr_.toSql()).append(" ");
+      if (expr_ != null) sb.append(expr_.toSql(options)).append(" ");
       sb.append(type_.toString());
       return sb.toString();
     }
@@ -232,15 +235,17 @@ public class AnalyticWindow {
     return new AnalyticWindow(type_, newLeftBoundary, newRightBoundary);
   }
 
-  public String toSql() {
+  public final String toSql() { return toSql(DEFAULT); }
+
+  public String toSql(ToSqlOptions options) {
     if (toSqlString_ != null) return toSqlString_;
     StringBuilder sb = new StringBuilder();
     sb.append(type_.toString()).append(" ");
     if (rightBoundary_ == null) {
-      sb.append(leftBoundary_.toSql());
+      sb.append(leftBoundary_.toSql(options));
     } else {
-      sb.append("BETWEEN ").append(leftBoundary_.toSql()).append(" AND ");
-      sb.append(rightBoundary_.toSql());
+      sb.append("BETWEEN ").append(leftBoundary_.toSql(options)).append(" AND ");
+      sb.append(rightBoundary_.toSql(options));
     }
     return sb.toString();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/ArithmeticExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ArithmeticExpr.java b/fe/src/main/java/org/apache/impala/analysis/ArithmeticExpr.java
index e58f787..9f25469 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ArithmeticExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ArithmeticExpr.java
@@ -133,17 +133,18 @@ public class ArithmeticExpr extends Expr {
   }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     if (children_.size() == 1) {
       if (op_.getPos() == OperatorPosition.UNARY_PREFIX) {
-        return op_.toString() + getChild(0).toSql();
+        return op_.toString() + getChild(0).toSql(options);
       } else {
         assert(op_.getPos() == OperatorPosition.UNARY_POSTFIX);
-        return getChild(0).toSql() + op_.toString();
+        return getChild(0).toSql(options) + op_.toString();
       }
     } else {
       Preconditions.checkState(children_.size() == 2);
-      return getChild(0).toSql() + " " + op_.toString() + " " + getChild(1).toSql();
+      return getChild(0).toSql(options) + " " + op_.toString() + " "
+          + getChild(1).toSql(options);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java b/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java
index f6ecdb8..7644329 100644
--- a/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java
+++ b/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java
@@ -71,14 +71,14 @@ public class BaseTableRef extends TableRef {
   }
 
   @Override
-  protected String tableRefToSql() {
+  protected String tableRefToSql(ToSqlOptions options) {
     // Enclose the alias in quotes if Hive cannot parse it without quotes.
     // This is needed for view compatibility between Impala and Hive.
     String aliasSql = "";
     String alias = getExplicitAlias();
     if (alias != null) aliasSql = " " + ToSqlUtils.getIdentSql(alias);
     String tableSampleSql = "";
-    if (sampleParams_ != null) tableSampleSql = " " + sampleParams_.toSql();
+    if (sampleParams_ != null) tableSampleSql = " " + sampleParams_.toSql(options);
     String tableHintsSql = ToSqlUtils.getPlanHintsSql(tableHints_);
     return getTable().getTableName().toSql() + aliasSql + tableSampleSql + tableHintsSql;
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/BetweenPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/BetweenPredicate.java b/fe/src/main/java/org/apache/impala/analysis/BetweenPredicate.java
index f51aef3..d8ad93b 100644
--- a/fe/src/main/java/org/apache/impala/analysis/BetweenPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/BetweenPredicate.java
@@ -18,7 +18,6 @@
 package org.apache.impala.analysis;
 
 import org.apache.impala.catalog.ScalarType;
-import org.apache.impala.catalog.Type;
 import org.apache.impala.common.AnalysisException;
 import org.apache.impala.thrift.TExprNode;
 
@@ -98,10 +97,10 @@ public class BetweenPredicate extends Predicate {
   }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     String notStr = (isNotBetween_) ? "NOT " : "";
-    return children_.get(0).toSql() + " " + notStr + "BETWEEN " +
-        children_.get(1).toSql() + " AND " + children_.get(2).toSql();
+    return children_.get(0).toSql(options) + " " + notStr + "BETWEEN "
+        + children_.get(1).toSql(options) + " AND " + children_.get(2).toSql(options);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/BinaryPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/BinaryPredicate.java b/fe/src/main/java/org/apache/impala/analysis/BinaryPredicate.java
index cc82624..368884f 100644
--- a/fe/src/main/java/org/apache/impala/analysis/BinaryPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/BinaryPredicate.java
@@ -36,8 +36,6 @@ import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Most predicates with two operands.
@@ -138,8 +136,9 @@ public class BinaryPredicate extends Predicate {
   public void setIsInferred() { isInferred_ = true; }
 
   @Override
-  public String toSqlImpl() {
-    return getChild(0).toSql() + " " + op_.toString() + " " + getChild(1).toSql();
+  public String toSqlImpl(ToSqlOptions options) {
+    return getChild(0).toSql(options) + " " + op_.toString() + " "
+        + getChild(1).toSql(options);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/BoolLiteral.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/BoolLiteral.java b/fe/src/main/java/org/apache/impala/analysis/BoolLiteral.java
index cec702c..ba65c8e 100644
--- a/fe/src/main/java/org/apache/impala/analysis/BoolLiteral.java
+++ b/fe/src/main/java/org/apache/impala/analysis/BoolLiteral.java
@@ -70,7 +70,7 @@ public class BoolLiteral extends LiteralExpr {
   public boolean getValue() { return value_; }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     return getStringValue();
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/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 7158f8d..8de3524 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
@@ -35,6 +35,8 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * CASE and DECODE are represented using this class. The backend implementation is
  * always the "case" function. CASE always returns the THEN corresponding to the leftmost
@@ -196,23 +198,27 @@ public class CaseExpr extends Expr {
   }
 
   @Override
-  public String toSqlImpl() {
-    return (decodeExpr_ == null) ? toCaseSql() : decodeExpr_.toSqlImpl();
+  public String toSqlImpl(ToSqlOptions options) {
+    return (decodeExpr_ == null) ? toCaseSql(options) : decodeExpr_.toSqlImpl(options);
   }
 
   @VisibleForTesting
-  String toCaseSql() {
+  final String toCaseSql() {
+    return toCaseSql(DEFAULT);
+  }
+
+  String toCaseSql(ToSqlOptions options) {
     StringBuilder output = new StringBuilder("CASE");
     int childIdx = 0;
     if (hasCaseExpr_) {
-      output.append(" " + children_.get(childIdx++).toSql());
+      output.append(" " + children_.get(childIdx++).toSql(options));
     }
     while (childIdx + 2 <= children_.size()) {
-      output.append(" WHEN " + children_.get(childIdx++).toSql());
-      output.append(" THEN " + children_.get(childIdx++).toSql());
+      output.append(" WHEN " + children_.get(childIdx++).toSql(options));
+      output.append(" THEN " + children_.get(childIdx++).toSql(options));
     }
     if (hasElseExpr_) {
-      output.append(" ELSE " + children_.get(children_.size() - 1).toSql());
+      output.append(" ELSE " + children_.get(children_.size() - 1).toSql(options));
     }
     output.append(" END");
     return output.toString();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/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 e76a558..cd8bd36 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
@@ -171,9 +171,17 @@ public class CastExpr extends Expr {
   }
 
   @Override
-  public String toSqlImpl() {
-    if (isImplicit_) return getChild(0).toSql();
-    return "CAST(" + getChild(0).toSql() + " AS " + targetTypeDef_.toString() + ")";
+  public String toSqlImpl(ToSqlOptions options) {
+    if (isImplicit_) {
+      if (options.showImplictCasts()) {
+        // for implicit casts, targetTypeDef_ is null
+        return "CAST(" + getChild(0).toSql(options) + " AS " + type_.toSql() + ")";
+      } else {
+        return getChild(0).toSql(options);
+      }
+    }
+    return "CAST(" + getChild(0).toSql(options) + " AS " + targetTypeDef_.toString()
+        + ")";
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CompoundPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CompoundPredicate.java b/fe/src/main/java/org/apache/impala/analysis/CompoundPredicate.java
index 579fc79..085cd65 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CompoundPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CompoundPredicate.java
@@ -17,7 +17,6 @@
 
 package org.apache.impala.analysis;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.impala.catalog.Db;
@@ -102,12 +101,13 @@ public class CompoundPredicate extends Predicate {
   }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     if (children_.size() == 1) {
       Preconditions.checkState(op_ == Operator.NOT);
-      return "NOT " + getChild(0).toSql();
+      return "NOT " + getChild(0).toSql(options);
     } else {
-      return getChild(0).toSql() + " " + op_.toString() + " " + getChild(1).toSql();
+      return getChild(0).toSql(options) + " " + op_.toString() + " "
+          + getChild(1).toSql(options);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/ComputeStatsStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ComputeStatsStmt.java b/fe/src/main/java/org/apache/impala/analysis/ComputeStatsStmt.java
index a85a946..24e9d27 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ComputeStatsStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ComputeStatsStmt.java
@@ -27,7 +27,6 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.common.FileUtils;
 import org.apache.impala.authorization.Privilege;
 import org.apache.impala.catalog.Column;
 import org.apache.impala.catalog.FeCatalogUtils;
@@ -39,7 +38,6 @@ import org.apache.impala.catalog.HdfsFileFormat;
 import org.apache.impala.catalog.HdfsPartition.FileDescriptor;
 import org.apache.impala.catalog.HdfsTable;
 import org.apache.impala.catalog.PartitionStatsUtil;
-import org.apache.impala.catalog.PrunablePartition;
 import org.apache.impala.catalog.Type;
 import org.apache.impala.common.AnalysisException;
 import org.apache.impala.common.PrintUtils;
@@ -919,7 +917,7 @@ public class ComputeStatsStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     if (!isIncremental_) {
       StringBuilder columnList = new StringBuilder();
       if (columnWhitelist_ != null) {
@@ -928,11 +926,11 @@ public class ComputeStatsStmt extends StatementBase {
         columnList.append(")");
       }
       String tblsmpl = "";
-      if (sampleParams_ != null) tblsmpl = " " + sampleParams_.toSql();
+      if (sampleParams_ != null) tblsmpl = " " + sampleParams_.toSql(options);
       return "COMPUTE STATS " + tableName_.toSql() + columnList.toString() + tblsmpl;
     } else {
-      return "COMPUTE INCREMENTAL STATS " + tableName_.toSql() +
-          (partitionSet_ == null ? "" : partitionSet_.toSql());
+      return "COMPUTE INCREMENTAL STATS " + tableName_.toSql()
+          + (partitionSet_ == null ? "" : partitionSet_.toSql(options));
     }
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateDataSrcStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateDataSrcStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateDataSrcStmt.java
index 8ef0737..b2523f6 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateDataSrcStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateDataSrcStmt.java
@@ -74,7 +74,7 @@ public class CreateDataSrcStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder();
     sb.append("CREATE DATA SOURCE ");
     if (ifNotExists_) sb.append("IF NOT EXISTS ");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateDbStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateDbStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateDbStmt.java
index 37ace13..2b52278 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateDbStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateDbStmt.java
@@ -65,7 +65,7 @@ public class CreateDbStmt extends StatementBase {
   public boolean getIfNotExists() { return ifNotExists_; }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("CREATE DATABASE");
     if (ifNotExists_) sb.append(" IF NOT EXISTS");
     sb.append(dbName_);

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateDropRoleStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateDropRoleStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateDropRoleStmt.java
index 2007509..f316fa4 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateDropRoleStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateDropRoleStmt.java
@@ -37,7 +37,7 @@ public class CreateDropRoleStmt extends AuthorizationStmt {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     return String.format("%s ROLE %s", roleName_, isDropRole_ ? "DROP" : "CREATE");
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java b/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java
index ea7a6f4..dbefeba 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java
@@ -17,7 +17,6 @@
 
 package org.apache.impala.analysis;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java
index 9bfd6d2..ca311c6 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java
@@ -109,8 +109,8 @@ public class CreateTableAsSelectStmt extends StatementBase {
   public InsertStmt getInsertStmt() { return insertStmt_; }
   public CreateTableStmt getCreateStmt() { return createStmt_; }
   @Override
-  public String toSql(boolean rewritten) {
-    return ToSqlUtils.getCreateTableSql(this, rewritten);
+  public String toSql(ToSqlOptions options) {
+    return ToSqlUtils.getCreateTableSql(this, options);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeFileStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeFileStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeFileStmt.java
index e92458e..523c8af 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeFileStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeFileStmt.java
@@ -18,12 +18,8 @@
 package org.apache.impala.analysis;
 
 import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import org.apache.hadoop.fs.permission.FsAction;
 
 import org.apache.impala.authorization.Privilege;
@@ -50,7 +46,7 @@ public class CreateTableLikeFileStmt extends CreateTableStmt {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     ArrayList<String> colsSql = Lists.newArrayList();
     ArrayList<String> partitionColsSql = Lists.newArrayList();
     HdfsCompression compression = HdfsCompression.fromFileName(

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeStmt.java
index d7f7e22..e465ee7 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateTableLikeStmt.java
@@ -112,7 +112,7 @@ public class CreateTableLikeStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("CREATE ");
     if (isExternal_) sb.append("EXTERNAL ");
     sb.append("TABLE ");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateTableStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateTableStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateTableStmt.java
index e3fbd74..d42d82f 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateTableStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateTableStmt.java
@@ -148,7 +148,9 @@ public class CreateTableStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() { return ToSqlUtils.getCreateTableSql(this); }
+  public String toSql(ToSqlOptions options) {
+    return ToSqlUtils.getCreateTableSql(this);
+  }
 
   public TCreateTableParams toThrift() {
     TCreateTableParams params = new TCreateTableParams();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/CreateViewStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateViewStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateViewStmt.java
index f009391..6c38da4 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateViewStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateViewStmt.java
@@ -69,7 +69,7 @@ public class CreateViewStmt extends CreateOrAlterViewStmtBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder();
     sb.append("CREATE VIEW ");
     if (ifNotExists_) sb.append("IF NOT EXISTS ");
@@ -77,7 +77,7 @@ public class CreateViewStmt extends CreateOrAlterViewStmtBase {
     sb.append(tableName_.getTbl());
     if (columnDefs_ != null) sb.append("(" + getColumnNames() + ")");
     sb.append(" AS ");
-    sb.append(viewDefStmt_.toSql());
+    sb.append(viewDefStmt_.toSql(options));
     return sb.toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DeleteStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DeleteStmt.java b/fe/src/main/java/org/apache/impala/analysis/DeleteStmt.java
index 3542548..97d2ce2 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DeleteStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DeleteStmt.java
@@ -68,8 +68,8 @@ public class DeleteStmt extends ModifyStmt {
   }
 
   @Override
-  public String toSql(boolean rewritten) {
-    if (!rewritten && sqlString_ != null) return sqlString_;
+  public String toSql(ToSqlOptions options) {
+    if (!options.showRewritten() && sqlString_ != null) return sqlString_;
 
     StringBuilder b = new StringBuilder();
     b.append("DELETE");
@@ -78,13 +78,13 @@ public class DeleteStmt extends ModifyStmt {
       if (targetTableRef_.hasExplicitAlias()) {
         b.append(targetTableRef_.getExplicitAlias());
       } else {
-        b.append(targetTableRef_.toSql(rewritten));
+        b.append(targetTableRef_.toSql(options));
       }
     }
-    b.append(fromClause_.toSql(rewritten));
+    b.append(fromClause_.toSql(options));
     if (wherePredicate_ != null) {
       b.append(" WHERE ");
-      b.append(wherePredicate_.toSql());
+      b.append(wherePredicate_.toSql(options));
     }
     return b.toString();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DescribeDbStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DescribeDbStmt.java b/fe/src/main/java/org/apache/impala/analysis/DescribeDbStmt.java
index e7895b1..af5182a 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DescribeDbStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DescribeDbStmt.java
@@ -47,7 +47,7 @@ public class DescribeDbStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("DESCRIBE DATABASE ");
     if (outputStyle_ != TDescribeOutputStyle.MINIMAL) {
       sb.append(outputStyle_.toString() + " ");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DescribeTableStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DescribeTableStmt.java b/fe/src/main/java/org/apache/impala/analysis/DescribeTableStmt.java
index e731dfc..65d9c75 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DescribeTableStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DescribeTableStmt.java
@@ -76,7 +76,7 @@ public class DescribeTableStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("DESCRIBE ");
     if (outputStyle_ != TDescribeOutputStyle.MINIMAL) {
       sb.append(outputStyle_.toString() + " ");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DropDataSrcStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DropDataSrcStmt.java b/fe/src/main/java/org/apache/impala/analysis/DropDataSrcStmt.java
index 32501c4..c7a1f03 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DropDataSrcStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DropDataSrcStmt.java
@@ -47,7 +47,7 @@ public class DropDataSrcStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder();
     sb.append("DROP DATA SOURCE ");
     if (ifExists_) sb.append("IF EXISTS ");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DropDbStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DropDbStmt.java b/fe/src/main/java/org/apache/impala/analysis/DropDbStmt.java
index 630412d..68aa5ba 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DropDbStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DropDbStmt.java
@@ -49,7 +49,7 @@ public class DropDbStmt extends StatementBase {
   public boolean getCascade() { return cascade_; }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("DROP DATABASE");
     if (ifExists_) sb.append(" IF EXISTS ");
     sb.append(getDb());

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DropFunctionStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DropFunctionStmt.java b/fe/src/main/java/org/apache/impala/analysis/DropFunctionStmt.java
index 23977b2..23ab870 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DropFunctionStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DropFunctionStmt.java
@@ -55,7 +55,7 @@ public class DropFunctionStmt extends StatementBase {
   private boolean hasSignature() { return fnArgs_ != null; }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("DROP FUNCTION");
     if (ifExists_) sb.append(" IF EXISTS ");
     sb.append(desc_.signatureString());

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DropStatsStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DropStatsStmt.java b/fe/src/main/java/org/apache/impala/analysis/DropStatsStmt.java
index 9ac0a11..f495deb 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DropStatsStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DropStatsStmt.java
@@ -53,7 +53,7 @@ public class DropStatsStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("DROP ");
     if (partitionSet_ == null) {
       sb.append(" STATS ");
@@ -63,7 +63,7 @@ public class DropStatsStmt extends StatementBase {
       sb.append(" INCREMENTAL STATS ");
       if (tableName_.getDb() != null) sb.append(tableName_.getDb() + ".");
       sb.append(tableName_.toSql());
-      sb.append(partitionSet_.toSql());
+      sb.append(partitionSet_.toSql(options));
     }
     return sb.toString();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/DropTableOrViewStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/DropTableOrViewStmt.java b/fe/src/main/java/org/apache/impala/analysis/DropTableOrViewStmt.java
index 1da6c68..364444e 100644
--- a/fe/src/main/java/org/apache/impala/analysis/DropTableOrViewStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/DropTableOrViewStmt.java
@@ -65,7 +65,7 @@ public class DropTableOrViewStmt extends StatementBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("DROP " + ((dropTable_) ? "TABLE " : "VIEW "));
     if (ifExists_) sb.append("IF EXISTS ");
     if (tableName_.getDb() != null) sb.append(tableName_.getDb() + ".");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/ExistsPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ExistsPredicate.java b/fe/src/main/java/org/apache/impala/analysis/ExistsPredicate.java
index 8da020f..c55be82 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ExistsPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ExistsPredicate.java
@@ -19,8 +19,6 @@ package org.apache.impala.analysis;
 
 import org.apache.impala.common.AnalysisException;
 import org.apache.impala.thrift.TExprNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 
@@ -78,11 +76,11 @@ public class ExistsPredicate extends Predicate {
   protected float computeEvalCost() { return UNKNOWN_COST; }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     StringBuilder strBuilder = new StringBuilder();
     if (notExists_) strBuilder.append("NOT ");
     strBuilder.append("EXISTS ");
-    strBuilder.append(getChild(0).toSql());
+    strBuilder.append(getChild(0).toSql(options));
     return strBuilder.toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/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 ac5c394..a17877e 100644
--- a/fe/src/main/java/org/apache/impala/analysis/Expr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/Expr.java
@@ -52,6 +52,8 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * Root of the expr node hierarchy.
  *
@@ -681,15 +683,22 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
   }
 
   @Override
-  public String toSql() {
-    return (printSqlInParens_) ? "(" + toSqlImpl() + ")" : toSqlImpl();
+  public final String toSql() {
+    return toSql(DEFAULT);
+  }
+
+  @Override
+  public String toSql(ToSqlOptions options) {
+    return (printSqlInParens_) ? "(" + toSqlImpl(options) + ")" : toSqlImpl(options);
   }
 
   /**
    * Returns a SQL string representing this expr. Subclasses should override this method
    * instead of toSql() to ensure that parenthesis are properly added around the toSql().
    */
-  protected abstract String toSqlImpl();
+  protected abstract String toSqlImpl(ToSqlOptions options);
+
+  protected String toSqlImpl() { return toSqlImpl(DEFAULT); };
 
   // Convert this expr, including all children, to its Thrift representation.
   public TExpr treeToThrift() {
@@ -767,10 +776,10 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
     return isAggregatePredicate_.apply(this);
   }
 
-  public List<String> childrenToSql() {
+  public List<String> childrenToSql(ToSqlOptions options) {
     List<String> result = Lists.newArrayList();
     for (Expr child: children_) {
-      result.add(child.toSql());
+      result.add(child.toSql(options));
     }
     return result;
   }
@@ -788,11 +797,11 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
     return Joiner.on(" ").join(strings);
   }
 
-  public static String toSql(List<? extends Expr> exprs) {
+  public static String toSql(List<? extends Expr> exprs, ToSqlOptions options) {
     if (exprs == null || exprs.isEmpty()) return "";
     List<String> strings = Lists.newArrayList();
     for (Expr expr: exprs) {
-      strings.add(expr.toSql());
+      strings.add(expr.toSql(options));
     }
     return Joiner.on(", ").join(strings);
   }
@@ -1540,12 +1549,12 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
    * Generates a comma-separated string from the toSql() string representations of
    * 'exprs'.
    */
-  public static String listToSql(List<Expr> exprs) {
+  public static String listToSql(List<Expr> exprs, ToSqlOptions options) {
     com.google.common.base.Function<Expr, String> toSql =
         new com.google.common.base.Function<Expr, String>() {
         @Override
         public String apply(Expr arg) {
-          return arg.toSql();
+          return arg.toSql(options);
         }
     };
     return Joiner.on(",").join(Iterables.transform(exprs, toSql));

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java b/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
index 9f46187..d732682 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
@@ -98,13 +98,13 @@ public class ExtractFromExpr extends FunctionCallExpr {
   }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     StringBuilder strBuilder = new StringBuilder();
     strBuilder.append(getFnName().toString().toUpperCase());
     strBuilder.append("(");
     strBuilder.append(((StringLiteral)getChild(1)).getValueWithOriginalEscapes());
     strBuilder.append(" FROM ");
-    strBuilder.append(getChild(0).toSql());
+    strBuilder.append(getChild(0).toSql(options));
     strBuilder.append(")");
     return strBuilder.toString();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/FromClause.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/FromClause.java b/fe/src/main/java/org/apache/impala/analysis/FromClause.java
index 10a021e..725044d 100644
--- a/fe/src/main/java/org/apache/impala/analysis/FromClause.java
+++ b/fe/src/main/java/org/apache/impala/analysis/FromClause.java
@@ -26,6 +26,8 @@ import org.apache.impala.common.AnalysisException;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * Wraps a list of TableRef instances that form a FROM clause, allowing them to be
  * analyzed independently of the statement using them. To increase the flexibility of
@@ -112,16 +114,16 @@ public class FromClause implements ParseNode, Iterable<TableRef> {
   }
 
   @Override
-  public String toSql() {
-    return toSql(false);
+  public final String toSql() {
+    return toSql(DEFAULT);
   }
 
-  public String toSql(boolean rewritten) {
+  public String toSql(ToSqlOptions options) {
     StringBuilder builder = new StringBuilder();
     if (!tableRefs_.isEmpty()) {
       builder.append(" FROM ");
       for (int i = 0; i < tableRefs_.size(); ++i) {
-        builder.append(tableRefs_.get(i).toSql(rewritten));
+        builder.append(tableRefs_.get(i).toSql(options));
       }
     }
     return builder.toString();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/FunctionArgs.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/FunctionArgs.java b/fe/src/main/java/org/apache/impala/analysis/FunctionArgs.java
index ad387dc..2d5a2bd 100644
--- a/fe/src/main/java/org/apache/impala/analysis/FunctionArgs.java
+++ b/fe/src/main/java/org/apache/impala/analysis/FunctionArgs.java
@@ -24,6 +24,8 @@ import org.apache.impala.common.AnalysisException;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 // Wrapper class around argument types and if it has varArgs
 public class FunctionArgs implements ParseNode {
   private final ArrayList<TypeDef> argTypeDefs_;
@@ -63,5 +65,12 @@ public class FunctionArgs implements ParseNode {
   public boolean hasVarArgs() { return hasVarArgs_; }
 
   @Override
-  public String toSql() { return null; }
+  public final String toSql() {
+    return toSql(DEFAULT);
+  }
+
+  @Override
+  public String toSql(ToSqlOptions options) {
+    return null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/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 6fd3e97..8047b29 100644
--- a/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
@@ -207,7 +207,7 @@ public class FunctionCallExpr extends Expr {
   }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     if (label_ != null) return label_;
     // Merge agg fns should have an explicit label.
     Preconditions.checkState(!isMergeAggFn());
@@ -215,7 +215,7 @@ public class FunctionCallExpr extends Expr {
     sb.append(fnName_).append("(");
     if (params_.isStar()) sb.append("*");
     if (params_.isDistinct()) sb.append("DISTINCT ");
-    sb.append(Joiner.on(", ").join(childrenToSql()));
+    sb.append(Joiner.on(", ").join(childrenToSql(options)));
     if (params_.isIgnoreNulls()) sb.append(" IGNORE NULLS");
     sb.append(")");
     return sb.toString();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/GrantRevokePrivStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/GrantRevokePrivStmt.java b/fe/src/main/java/org/apache/impala/analysis/GrantRevokePrivStmt.java
index 752f123..dc559b0 100644
--- a/fe/src/main/java/org/apache/impala/analysis/GrantRevokePrivStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/GrantRevokePrivStmt.java
@@ -19,7 +19,6 @@ package org.apache.impala.analysis;
 
 import java.util.List;
 
-import org.apache.impala.catalog.PrincipalPrivilege;
 import org.apache.impala.catalog.Role;
 import org.apache.impala.common.AnalysisException;
 import org.apache.impala.thrift.TGrantRevokePrivParams;
@@ -71,10 +70,10 @@ public class GrantRevokePrivStmt extends AuthorizationStmt {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder(isGrantPrivStmt_ ? "GRANT " : "REVOKE ");
     if (!isGrantPrivStmt_ && hasGrantOpt_) sb.append("GRANT OPTION FOR ");
-    sb.append(privilegeSpec_.toSql());
+    sb.append(privilegeSpec_.toSql(options));
     sb.append(isGrantPrivStmt_ ? " TO " : " FROM ");
     sb.append(roleName_);
     if (isGrantPrivStmt_ && hasGrantOpt_) sb.append(" WITH GRANT OPTION");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/GrantRevokeRoleStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/GrantRevokeRoleStmt.java b/fe/src/main/java/org/apache/impala/analysis/GrantRevokeRoleStmt.java
index dfcf519..2e8c0a7 100644
--- a/fe/src/main/java/org/apache/impala/analysis/GrantRevokeRoleStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/GrantRevokeRoleStmt.java
@@ -40,7 +40,7 @@ public class GrantRevokeRoleStmt extends AuthorizationStmt {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     if (isGrantStmt_) {
       return String.format("GRANT ROLE %s TO %s", roleName_, groupName_);
     } else {

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/HdfsCachingOp.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/HdfsCachingOp.java b/fe/src/main/java/org/apache/impala/analysis/HdfsCachingOp.java
index 4f10a1b..42b510f 100644
--- a/fe/src/main/java/org/apache/impala/analysis/HdfsCachingOp.java
+++ b/fe/src/main/java/org/apache/impala/analysis/HdfsCachingOp.java
@@ -24,6 +24,8 @@ import org.apache.impala.common.AnalysisException;
 import org.apache.impala.thrift.THdfsCachingOp;
 import com.google.common.base.Preconditions;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * Represents the partial SQL statement of specifying whether a table/partition
  * should or should not be marked as cached.
@@ -78,7 +80,12 @@ public class HdfsCachingOp implements ParseNode {
   }
 
   @Override
-  public String toSql() {
+  public final String toSql() {
+    return toSql(DEFAULT);
+  }
+
+  @Override
+  public String toSql(ToSqlOptions options) {
     if (!shouldCache()) return "UNCACHED";
     StringBuilder sb = new StringBuilder();
     sb.append("CACHED IN '" + getCachePoolName() + "'");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/InPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/InPredicate.java b/fe/src/main/java/org/apache/impala/analysis/InPredicate.java
index a1f545f..8929ef6 100644
--- a/fe/src/main/java/org/apache/impala/analysis/InPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/InPredicate.java
@@ -202,14 +202,14 @@ public class InPredicate extends Predicate {
   }
 
   @Override
-  public String toSqlImpl() {
+  public String toSqlImpl(ToSqlOptions options) {
     StringBuilder strBuilder = new StringBuilder();
     String notStr = (isNotIn_) ? "NOT " : "";
-    strBuilder.append(getChild(0).toSql() + " " + notStr + "IN ");
+    strBuilder.append(getChild(0).toSql(options) + " " + notStr + "IN ");
     boolean hasSubquery = contains(Subquery.class);
     if (!hasSubquery) strBuilder.append("(");
     for (int i = 1; i < children_.size(); ++i) {
-      strBuilder.append(getChild(i).toSql());
+      strBuilder.append(getChild(i).toSql(options));
       strBuilder.append((i+1 != children_.size()) ? ", " : "");
     }
     if (!hasSubquery) strBuilder.append(")");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/InlineViewRef.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/InlineViewRef.java b/fe/src/main/java/org/apache/impala/analysis/InlineViewRef.java
index 494b4af..b5b86f1 100644
--- a/fe/src/main/java/org/apache/impala/analysis/InlineViewRef.java
+++ b/fe/src/main/java/org/apache/impala/analysis/InlineViewRef.java
@@ -323,12 +323,7 @@ public class InlineViewRef extends TableRef {
   }
 
   @Override
-  protected String tableRefToSql() {
-    return tableRefToSql(false);
-  }
-
-  @Override
-  protected String tableRefToSql(boolean rewritten) {
+  protected String tableRefToSql(ToSqlOptions options) {
     // Enclose the alias in quotes if Hive cannot parse it without quotes.
     // This is needed for view compatibility between Impala and Hive.
     String aliasSql = null;
@@ -339,10 +334,10 @@ public class InlineViewRef extends TableRef {
     }
     Preconditions.checkNotNull(aliasSql);
     StringBuilder sql = new StringBuilder()
-        .append("(")
-        .append(queryStmt_.toSql(rewritten))
-        .append(") ")
-        .append(aliasSql);
+                            .append("(")
+                            .append(queryStmt_.toSql(options))
+                            .append(") ")
+                            .append(aliasSql);
     // Add explicit col labels for debugging even though this syntax isn't supported.
     if (explicitColLabels_ != null) {
       sql.append(" (");

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java b/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java
index 368ab2f..be5c3a7 100644
--- a/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java
@@ -923,10 +923,10 @@ public class InsertStmt extends StatementBase {
   }
 
   @Override
-  public String toSql(boolean rewritten) {
+  public String toSql(ToSqlOptions options) {
     StringBuilder strBuilder = new StringBuilder();
 
-    if (withClause_ != null) strBuilder.append(withClause_.toSql(rewritten) + " ");
+    if (withClause_ != null) strBuilder.append(withClause_.toSql(options) + " ");
 
     strBuilder.append(getOpName());
     if (!planHints_.isEmpty() && hintLoc_ == HintLocation.Start) {
@@ -946,8 +946,8 @@ public class InsertStmt extends StatementBase {
     if (partitionKeyValues_ != null) {
       List<String> values = Lists.newArrayList();
       for (PartitionKeyValue pkv: partitionKeyValues_) {
-        values.add(pkv.getColName() +
-            (pkv.getValue() != null ? ("=" + pkv.getValue().toSql()) : ""));
+        values.add(pkv.getColName()
+            + (pkv.getValue() != null ? ("=" + pkv.getValue().toSql(options)) : ""));
       }
       strBuilder.append(" PARTITION (" + Joiner.on(", ").join(values) + ")");
     }
@@ -955,7 +955,7 @@ public class InsertStmt extends StatementBase {
       strBuilder.append(" " + ToSqlUtils.getPlanHintsSql(getPlanHints()));
     }
     if (!needsGeneratedQueryStatement_) {
-      strBuilder.append(" " + queryStmt_.toSql(rewritten));
+      strBuilder.append(" " + queryStmt_.toSql(options));
     }
     return strBuilder.toString();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/IsNotEmptyPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/IsNotEmptyPredicate.java b/fe/src/main/java/org/apache/impala/analysis/IsNotEmptyPredicate.java
index 9ea1122..0185c56 100644
--- a/fe/src/main/java/org/apache/impala/analysis/IsNotEmptyPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/IsNotEmptyPredicate.java
@@ -57,7 +57,9 @@ public class IsNotEmptyPredicate extends Predicate {
   }
 
   @Override
-  public String toSqlImpl() { return "!empty(" + getChild(0).toSql() + ")"; }
+  public String toSqlImpl(ToSqlOptions options) {
+    return "!empty(" + getChild(0).toSql(options) + ")";
+  }
 
   @Override
   protected void toThrift(TExprNode msg) {

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/IsNullPredicate.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/IsNullPredicate.java b/fe/src/main/java/org/apache/impala/analysis/IsNullPredicate.java
index c5bbd91..7af3688 100644
--- a/fe/src/main/java/org/apache/impala/analysis/IsNullPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/IsNullPredicate.java
@@ -83,8 +83,8 @@ public class IsNullPredicate extends Predicate {
   }
 
   @Override
-  public String toSqlImpl() {
-    return getChild(0).toSql() + (isNotNull_ ? " IS NOT NULL" : " IS NULL");
+  public String toSqlImpl(ToSqlOptions options) {
+    return getChild(0).toSql(options) + (isNotNull_ ? " IS NOT NULL" : " IS NULL");
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/KuduPartitionExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/KuduPartitionExpr.java b/fe/src/main/java/org/apache/impala/analysis/KuduPartitionExpr.java
index e888726..fae725a 100644
--- a/fe/src/main/java/org/apache/impala/analysis/KuduPartitionExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/KuduPartitionExpr.java
@@ -79,11 +79,11 @@ public class KuduPartitionExpr extends Expr {
   protected float computeEvalCost() { return UNKNOWN_COST; }
 
   @Override
-  protected String toSqlImpl() {
+  protected String toSqlImpl(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("KuduPartition(");
     for (int i = 0; i < children_.size(); ++i) {
       if (i != 0) sb.append(", ");
-      sb.append(children_.get(i).toSql());
+      sb.append(children_.get(i).toSql(options));
     }
     sb.append(")");
     return sb.toString();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/KuduPartitionParam.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/KuduPartitionParam.java b/fe/src/main/java/org/apache/impala/analysis/KuduPartitionParam.java
index 5cfb2fc..e256d82 100644
--- a/fe/src/main/java/org/apache/impala/analysis/KuduPartitionParam.java
+++ b/fe/src/main/java/org/apache/impala/analysis/KuduPartitionParam.java
@@ -30,6 +30,8 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * Represents the partitioning of a Kudu table as defined in the PARTITION BY
  * clause of a CREATE TABLE statement. The partitioning can be hash-based or
@@ -142,7 +144,12 @@ public class KuduPartitionParam implements ParseNode {
   }
 
   @Override
-  public String toSql() {
+  public final String toSql() {
+    return toSql(DEFAULT);
+  }
+
+  @Override
+  public String toSql(ToSqlOptions options) {
     StringBuilder builder = new StringBuilder(type_.toString());
     if (!colNames_.isEmpty()) {
       builder.append(" (");
@@ -156,7 +163,7 @@ public class KuduPartitionParam implements ParseNode {
       if (rangePartitions_ != null) {
         List<String> partsSql = Lists.newArrayList();
         for (RangePartition rangePartition: rangePartitions_) {
-          partsSql.add(rangePartition.toSql());
+          partsSql.add(rangePartition.toSql(options));
         }
         builder.append(Joiner.on(", ").join(partsSql));
       } else {
@@ -168,7 +175,9 @@ public class KuduPartitionParam implements ParseNode {
   }
 
   @Override
-  public String toString() { return toSql(); }
+  public String toString() {
+    return toSql(DEFAULT);
+  }
 
   public TKuduPartitionParam toThrift() {
     TKuduPartitionParam result = new TKuduPartitionParam();

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/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 181c7f7..c3d256a 100644
--- a/fe/src/main/java/org/apache/impala/analysis/LikePredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/LikePredicate.java
@@ -103,8 +103,9 @@ public class LikePredicate extends Predicate {
   }
 
   @Override
-  public String toSqlImpl() {
-    return getChild(0).toSql() + " " + op_.toString() + " " + getChild(1).toSql();
+  public String toSqlImpl(ToSqlOptions options) {
+    return getChild(0).toSql(options) + " " + op_.toString() + " "
+        + getChild(1).toSql(options);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/LimitElement.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/LimitElement.java b/fe/src/main/java/org/apache/impala/analysis/LimitElement.java
index 73758a2..ad63daa 100644
--- a/fe/src/main/java/org/apache/impala/analysis/LimitElement.java
+++ b/fe/src/main/java/org/apache/impala/analysis/LimitElement.java
@@ -21,6 +21,8 @@ import org.apache.impala.common.AnalysisException;
 
 import com.google.common.base.Preconditions;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * Combination of limit and offset expressions.
  */
@@ -82,17 +84,19 @@ class LimitElement {
     return offset_;
   }
 
-  public String toSql() {
+  public final String toSql() { return toSql(DEFAULT); }
+
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder();
     if (limitExpr_ != null) {
       sb.append(" LIMIT ");
-      sb.append(limitExpr_.toSql());
+      sb.append(limitExpr_.toSql(options));
     }
     // Don't add the offset if it is the default value. However, we do print it if it
     // hasn't been analyzed yet because we need to output the expression used in errors.
     if (offsetExpr_ != null && (offset_ != 0 || !isAnalyzed_)) {
       sb.append(" OFFSET ");
-      sb.append(offsetExpr_.toSql());
+      sb.append(offsetExpr_.toSql(options));
     }
     return sb.toString();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/LoadDataStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/LoadDataStmt.java b/fe/src/main/java/org/apache/impala/analysis/LoadDataStmt.java
index 0608987..85e9557 100644
--- a/fe/src/main/java/org/apache/impala/analysis/LoadDataStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/LoadDataStmt.java
@@ -87,12 +87,12 @@ public class LoadDataStmt extends StatementBase {
    * @see org.apache.impala.parser.ParseNode#toSql()
    */
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     StringBuilder sb = new StringBuilder("LOAD DATA INPATH '");
     sb.append(sourceDataPath_ + "' ");
     if (overwrite_) sb.append("OVERWRITE ");
     sb.append("INTO TABLE " + tableName_.toString());
-    if (partitionSpec_ != null) sb.append(" " + partitionSpec_.toSql());
+    if (partitionSpec_ != null) sb.append(" " + partitionSpec_.toSql(options));
     return sb.toString();
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/ModifyStmt.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ModifyStmt.java b/fe/src/main/java/org/apache/impala/analysis/ModifyStmt.java
index 9aa0964..2784616 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ModifyStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ModifyStmt.java
@@ -316,5 +316,5 @@ public abstract class ModifyStmt extends StatementBase {
   public QueryStmt getQueryStmt() { return sourceStmt_; }
   public abstract DataSink createDataSink();
   @Override
-  public abstract String toSql(boolean rewritten);
+  public abstract String toSql(ToSqlOptions options);
 }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/NullLiteral.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/NullLiteral.java b/fe/src/main/java/org/apache/impala/analysis/NullLiteral.java
index ba35262..e27f28a 100644
--- a/fe/src/main/java/org/apache/impala/analysis/NullLiteral.java
+++ b/fe/src/main/java/org/apache/impala/analysis/NullLiteral.java
@@ -51,7 +51,9 @@ public class NullLiteral extends LiteralExpr {
   public int hashCode() { return 0; }
 
   @Override
-  public String toSqlImpl() { return getStringValue(); }
+  public String toSqlImpl(ToSqlOptions options) {
+    return getStringValue();
+  }
 
   @Override
   public String debugString() {

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/NumericLiteral.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/NumericLiteral.java b/fe/src/main/java/org/apache/impala/analysis/NumericLiteral.java
index 4444755..52f748f 100644
--- a/fe/src/main/java/org/apache/impala/analysis/NumericLiteral.java
+++ b/fe/src/main/java/org/apache/impala/analysis/NumericLiteral.java
@@ -149,7 +149,12 @@ public class NumericLiteral extends LiteralExpr {
   public int hashCode() { return value_.hashCode(); }
 
   @Override
-  public String toSqlImpl() { return getStringValue(); }
+  public String toSqlImpl(ToSqlOptions options) {
+    if (options.showImplictCasts()) {
+      return "CAST(" + getStringValue() + " AS " + type_.toSql() + ")";
+    }
+    return getStringValue();
+  }
 
   @Override
   public String getStringValue() {

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/OrderByElement.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/OrderByElement.java b/fe/src/main/java/org/apache/impala/analysis/OrderByElement.java
index 4dd90c1..61eb6de 100644
--- a/fe/src/main/java/org/apache/impala/analysis/OrderByElement.java
+++ b/fe/src/main/java/org/apache/impala/analysis/OrderByElement.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import com.google.common.collect.Lists;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
 
 /**
  * Combination of expr, ASC/DESC, and nulls ordering.
@@ -64,9 +65,11 @@ public class OrderByElement {
   public Boolean getNullsFirstParam() { return nullsFirstParam_; }
   public boolean nullsFirst() { return nullsFirst(nullsFirstParam_, isAsc_); }
 
-  public String toSql() {
+  public final String toSql() { return toSql(DEFAULT); }
+
+  public String toSql(ToSqlOptions options) {
     StringBuilder strBuilder = new StringBuilder();
-    strBuilder.append(expr_.toSql());
+    strBuilder.append(expr_.toSql(options));
     strBuilder.append(isAsc_ ? " ASC" : " DESC");
     // When ASC and NULLS LAST or DESC and NULLS FIRST, we do not print NULLS FIRST/LAST
     // because it is the default behavior and we want to avoid printing NULLS FIRST/LAST

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/ParseNode.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ParseNode.java b/fe/src/main/java/org/apache/impala/analysis/ParseNode.java
index d4ec21d..1b28dff 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ParseNode.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ParseNode.java
@@ -25,10 +25,17 @@ public interface ParseNode {
    * Perform semantic analysis of node and all of its children.
    * Throws exception if any semantic errors were found.
    */
-  public void analyze(Analyzer analyzer) throws AnalysisException;
+  void analyze(Analyzer analyzer) throws AnalysisException;
 
   /**
-   * Returns the SQL string corresponding to this node.
+   * Returns the SQL string corresponding to this node and its descendants.
    */
-  public String toSql();
+  String toSql(ToSqlOptions options);
+
+  /**
+   * Returns the SQL string corresponding to this node and its descendants.
+   * This should return the same result as calling toSql(ToSqlOptions.DEFAULT).
+   * TODO use an interface default method to implement this when we fully move to Java8.
+   */
+  String toSql();
 }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/PartitionDef.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/PartitionDef.java b/fe/src/main/java/org/apache/impala/analysis/PartitionDef.java
index b66d779..a40b5ea 100644
--- a/fe/src/main/java/org/apache/impala/analysis/PartitionDef.java
+++ b/fe/src/main/java/org/apache/impala/analysis/PartitionDef.java
@@ -28,6 +28,8 @@ import org.apache.impala.common.AnalysisException;
 import org.apache.impala.common.FileSystemUtil;
 import org.apache.impala.thrift.TPartitionDef;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * Represents a partition definition used in ALTER TABLE ADD PARTITION consisting of
  * partition key-value pairs and an optional location and optional caching options.
@@ -57,10 +59,15 @@ public class PartitionDef implements ParseNode {
   public PartitionSpec getPartitionSpec() { return partitionSpec_; }
 
   @Override
-  public String toSql() {
-    StringBuilder sb = new StringBuilder(partitionSpec_.toSql());
+  public final String toSql() {
+    return toSql(DEFAULT);
+  }
+
+  @Override
+  public String toSql(ToSqlOptions options) {
+    StringBuilder sb = new StringBuilder(partitionSpec_.toSql(options));
     if (location_ != null) sb.append(String.format(" LOCATION '%s'", location_));
-    if (cacheOp_ != null) sb.append(" " + cacheOp_.toSql());
+    if (cacheOp_ != null) sb.append(" " + cacheOp_.toSql(options));
     return sb.toString();
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/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 1aa30ac..a591de1 100644
--- a/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java
+++ b/fe/src/main/java/org/apache/impala/analysis/PartitionSet.java
@@ -187,10 +187,10 @@ public class PartitionSet extends PartitionSpecBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     List<String> partitionExprStr = Lists.newArrayList();
     for (Expr e : partitionExprs_) {
-      partitionExprStr.add(e.toSql());
+      partitionExprStr.add(e.toSql(options));
     }
     return String.format("PARTITION (%s)", Joiner.on(", ").join(partitionExprStr));
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/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 ac0551d..5836c40 100644
--- a/fe/src/main/java/org/apache/impala/analysis/PartitionSpec.java
+++ b/fe/src/main/java/org/apache/impala/analysis/PartitionSpec.java
@@ -136,10 +136,10 @@ public class PartitionSpec extends PartitionSpecBase {
   }
 
   @Override
-  public String toSql() {
+  public String toSql(ToSqlOptions options) {
     List<String> partitionSpecStr = Lists.newArrayList();
     for (PartitionKeyValue kv: partitionSpec_) {
-      partitionSpecStr.add(kv.getColName() + "=" + kv.getValue().toSql());
+      partitionSpecStr.add(kv.getColName() + "=" + kv.getValue().toSql(options));
     }
     return String.format("PARTITION (%s)", Joiner.on(", ").join(partitionSpecStr));
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/d3948d9a/fe/src/main/java/org/apache/impala/analysis/PartitionSpecBase.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/PartitionSpecBase.java b/fe/src/main/java/org/apache/impala/analysis/PartitionSpecBase.java
index c4829a2..28ea977 100644
--- a/fe/src/main/java/org/apache/impala/analysis/PartitionSpecBase.java
+++ b/fe/src/main/java/org/apache/impala/analysis/PartitionSpecBase.java
@@ -24,6 +24,8 @@ import org.apache.impala.catalog.FeTable;
 import org.apache.impala.common.AnalysisException;
 import com.google.common.base.Preconditions;
 
+import static org.apache.impala.analysis.ToSqlOptions.DEFAULT;
+
 /**
  * Base class for PartitionSpec and PartitionSet containing the partition
  * specifications of related DDL operations.
@@ -92,5 +94,10 @@ public abstract class PartitionSpecBase implements ParseNode {
   }
 
   @Override
-  public abstract String toSql();
+  public final String toSql() {
+    return toSql(DEFAULT);
+  }
+
+  @Override
+  public abstract String toSql(ToSqlOptions options);
 }