Repository: drill Updated Branches: refs/heads/master 6503cfbff -> da17f2867
DRILL-3377: Fix naming resolution error for partitioning columns when columns are explicitly specified in CTAS column list. Project: http://git-wip-us.apache.org/repos/asf/drill/repo Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/80270d1b Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/80270d1b Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/80270d1b Branch: refs/heads/master Commit: 80270d1b687ec4cbff69fd13f1364ec77473588f Parents: 6503cfb Author: Jinfeng Ni <[email protected]> Authored: Thu Jun 25 17:25:22 2015 -0700 Committer: Jinfeng Ni <[email protected]> Committed: Thu Jun 25 22:58:05 2015 -0700 ---------------------------------------------------------------------- .../sql/handlers/CreateTableHandler.java | 10 ++-- .../planner/sql/handlers/DefaultSqlHandler.java | 2 +- .../org/apache/drill/exec/sql/TestCTAS.java | 56 ++++++++++++++++++++ 3 files changed, 64 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/drill/blob/80270d1b/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 6910785..5a0e40e 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 @@ -107,11 +107,15 @@ public class CreateTableHandler extends DefaultSqlHandler { private DrillRel convertToDrel(RelNode relNode, AbstractSchema schema, String tableName, List<String> partitionColumns, RelDataType queryRowType) throws RelConversionException, SqlUnsupportedException { - final DrillRel convertedRelNode = convertToDrel(relNode); - DrillWriterRel writerRel = new DrillWriterRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(), - convertedRelNode, schema.createNewTable(tableName, partitionColumns)); + // Put a non-trivial topProject to ensure the final output field name is preserved, when necessary. + // Only insert project when the field count from the child is same as that of the queryRowType. + final DrillRel topPreservedNameProj = queryRowType.getFieldCount() == convertedRelNode.getRowType().getFieldCount() ? + addRenamedProject(convertedRelNode, queryRowType) : convertedRelNode; + + final DrillWriterRel writerRel = new DrillWriterRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(), + topPreservedNameProj, schema.createNewTable(tableName, partitionColumns)); return new DrillScreenRel(writerRel.getCluster(), writerRel.getTraitSet(), writerRel); } http://git-wip-us.apache.org/repos/asf/drill/blob/80270d1b/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 376fed1..e4b6643 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 @@ -473,7 +473,7 @@ public class DefaultSqlHandler extends AbstractSqlHandler { return rel; } - private DrillRel addRenamedProject(DrillRel rel, RelDataType validatedRowType) { + protected DrillRel addRenamedProject(DrillRel rel, RelDataType validatedRowType) { RelDataType t = rel.getRowType(); RexBuilder b = rel.getCluster().getRexBuilder(); http://git-wip-us.apache.org/repos/asf/drill/blob/80270d1b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTAS.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTAS.java b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTAS.java index 74bf0de..aec2237 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTAS.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTAS.java @@ -132,6 +132,62 @@ public class TestCTAS extends BaseTestQuery { } } + @Test // DRILL-3377 + public void partitionByCtasColList() throws Exception { + final String newTblName = "partitionByCtasColList"; + + try { + final String ctasQuery = String.format("CREATE TABLE %s.%s (cnt, rkey) PARTITION BY (cnt) " + + "AS SELECT count(*), n_regionkey from cp.`tpch/nation.parquet` group by n_regionkey", + TEMP_SCHEMA, newTblName); + + test(ctasQuery); + + final String selectFromCreatedTable = String.format(" select cnt, rkey from %s.%s", TEMP_SCHEMA, newTblName); + final String baselineQuery = "select count(*) as cnt, n_regionkey as rkey from cp.`tpch/nation.parquet` group by n_regionkey"; + testBuilder() + .sqlQuery(selectFromCreatedTable) + .unOrdered() + .sqlBaselineQuery(baselineQuery) + .build() + .run(); + } finally { + FileUtils.deleteQuietly(new File(getDfsTestTmpSchemaLocation(), newTblName)); + } + } + + @Test // DRILL-3374 + public void partitionByCtasFromView() throws Exception { + final String newTblName = "partitionByCtasColList"; + final String newView = "partitionByCtasColListView"; + try { + final String viewCreate = String.format("create or replace view %s.%s (col_int, col_varchar) " + + "AS select cast(n_nationkey as int), cast(n_name as varchar(30)) from cp.`tpch/nation.parquet`", + TEMP_SCHEMA, newView); + + final String ctasQuery = String.format("CREATE TABLE %s.%s PARTITION BY (col_int) AS SELECT * from %s.%s", + TEMP_SCHEMA, newTblName, TEMP_SCHEMA, newView); + + test(viewCreate); + test(ctasQuery); + + final String baselineQuery = "select cast(n_nationkey as int) as col_int, cast(n_name as varchar(30)) as col_varchar " + + "from cp.`tpch/nation.parquet`"; + final String selectFromCreatedTable = String.format("select col_int, col_varchar from %s.%s", TEMP_SCHEMA, newTblName); + testBuilder() + .sqlQuery(selectFromCreatedTable) + .unOrdered() + .sqlBaselineQuery(baselineQuery) + .build() + .run(); + + final String viewDrop = String.format("DROP VIEW %s.%s", TEMP_SCHEMA, newView); + test(viewDrop); + } finally { + FileUtils.deleteQuietly(new File(getDfsTestTmpSchemaLocation(), newTblName)); + } + } + private static void ctasErrorTestHelper(final String ctasSql, final String expErrorMsg) throws Exception { final String createTableSql = String.format(ctasSql, TEMP_SCHEMA, "testTableName"); errorMsgTestHelper(createTableSql, expErrorMsg);
