diff options
author | Vitalii Diravka <vitalii.diravka@gmail.com> | 2018-10-05 16:21:55 +0300 |
---|---|---|
committer | Volodymyr Vysotskyi <vvovyk@gmail.com> | 2018-10-08 12:56:42 +0300 |
commit | d5bafeccfc4d8dc19b7f22cfae807fa56b62340a (patch) | |
tree | 7c95ed43b19e370ffa94430a153304e1d0f5ea63 /exec | |
parent | 778e043f284921792403f6dc595050793a47ee02 (diff) |
DRILL-6773: The renamed schema with aliases is not shown for queries on empty directories
closes #1492
Diffstat (limited to 'exec')
14 files changed, 84 insertions, 32 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/SchemalessScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/SchemalessScan.java index 1db83f579..d227b04aa 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/SchemalessScan.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/SchemalessScan.java @@ -92,6 +92,12 @@ public class SchemalessScan extends AbstractFileGroupScan implements SubScan { return ScanStats.ZERO_RECORD_TABLE; } + + @Override + public boolean canPushdownProjects(List<SchemaPath> columns) { + return false; + } + @Override public boolean supportsPartitionFilterPushdown() { return false; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java index 8ea15d3cb..a051d9941 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java @@ -876,7 +876,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> { */ @Override protected IterOutcome handleNullInput() { - if (! popConfig.isOutputProj()) { + if (!popConfig.isOutputProj()) { return super.handleNullInput(); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ConvertCountToDirectScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ConvertCountToDirectScan.java index 5ef97b99c..f8cda8c55 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ConvertCountToDirectScan.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ConvertCountToDirectScan.java @@ -128,7 +128,7 @@ public class ConvertCountToDirectScan extends Prule { final ScanStats scanStats = new ScanStats(ScanStats.GroupScanProperty.EXACT_ROW_COUNT, 1, 1, scanRowType.getFieldCount()); final GroupScan directScan = new MetadataDirectGroupScan(reader, oldGrpScan.getFiles(), scanStats); - final ScanPrel newScan = ScanPrel.create(scan, + final ScanPrel newScan = new ScanPrel(scan, scan.getTraitSet().plus(Prel.DRILL_PHYSICAL).plus(DrillDistributionTrait.SINGLETON), directScan, scanRowType); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectAllowDupPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectAllowDupPrel.java index 55e6eaadc..07936f3b4 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectAllowDupPrel.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectAllowDupPrel.java @@ -39,13 +39,18 @@ import org.apache.drill.shaded.guava.com.google.common.collect.Lists; public class ProjectAllowDupPrel extends ProjectPrel { public ProjectAllowDupPrel(RelOptCluster cluster, RelTraitSet traits, RelNode child, List<RexNode> exps, - RelDataType rowType) { - super(cluster, traits, child, exps, rowType); + RelDataType rowType) { + this(cluster, traits, child, exps, rowType, false); + } + + public ProjectAllowDupPrel(RelOptCluster cluster, RelTraitSet traits, RelNode child, List<RexNode> exps, + RelDataType rowType, boolean outputProj) { + super(cluster, traits, child, exps, rowType, outputProj); } @Override public ProjectAllowDupPrel copy(RelTraitSet traitSet, RelNode input, List<RexNode> exps, RelDataType rowType) { - return new ProjectAllowDupPrel(getCluster(), traitSet, input, exps, rowType); + return new ProjectAllowDupPrel(getCluster(), traitSet, input, exps, rowType, outputProj); } @Override @@ -54,7 +59,8 @@ public class ProjectAllowDupPrel extends ProjectPrel { PhysicalOperator childPOP = child.getPhysicalOperator(creator); - Project p = new Project(this.getProjectExpressions(new DrillParseContext(PrelUtil.getSettings(getCluster()))), childPOP); + Project p = new Project(this.getProjectExpressions(new DrillParseContext(PrelUtil.getSettings(getCluster()))), + childPOP, outputProj); return creator.addMetadata(this, p); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrel.java index 4f06b647c..395e77836 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrel.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrel.java @@ -48,7 +48,7 @@ import org.apache.calcite.sql.SqlKind; public class ProjectPrel extends DrillProjectRelBase implements Prel{ static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ProjectPrel.class); - private final boolean outputProj; + protected final boolean outputProj; public ProjectPrel(RelOptCluster cluster, RelTraitSet traits, RelNode child, List<RexNode> exps, RelDataType rowType) { diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java index a2655b36e..ff901c9ba 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java @@ -48,8 +48,11 @@ public class ScanPrel extends AbstractRelNode implements DrillScanPrel { protected final GroupScan groupScan; private final RelDataType rowType; - public ScanPrel(RelOptCluster cluster, RelTraitSet traits, - GroupScan groupScan, RelDataType rowType) { + public ScanPrel(RelNode old, RelTraitSet traitSets, GroupScan scan, RelDataType rowType) { + this(old.getCluster(), traitSets, scan, rowType); + } + + public ScanPrel(RelOptCluster cluster, RelTraitSet traits, GroupScan groupScan, RelDataType rowType) { super(cluster, traits); this.groupScan = getCopy(groupScan); this.rowType = rowType; @@ -86,11 +89,6 @@ public class ScanPrel extends AbstractRelNode implements DrillScanPrel { return groupScan; } - public static ScanPrel create(RelNode old, RelTraitSet traitSets, - GroupScan scan, RelDataType rowType) { - return new ScanPrel(old.getCluster(), traitSets, getCopy(scan), rowType); - } - @Override public RelWriter explainTerms(RelWriter pw) { return super.explainTerms(pw).item("groupscan", groupScan.getDigest()); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrule.java index 4f66e90aa..57c4517aa 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrule.java @@ -44,7 +44,7 @@ public class ScanPrule extends Prule{ final RelTraitSet traits = scan.getTraitSet().plus(Prel.DRILL_PHYSICAL).plus(partition); - final DrillScanPrel newScan = ScanPrel.create(scan, traits, groupScan, scan.getRowType()); + final DrillScanPrel newScan = new ScanPrel(scan, traits, groupScan, scan.getRowType()); call.transformTo(newScan); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/StarColumnConverter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/StarColumnConverter.java index ac5ec822b..91eeffee6 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/StarColumnConverter.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/StarColumnConverter.java @@ -76,12 +76,12 @@ public class StarColumnConverter extends BasePrelVisitor<Prel, Void, RuntimeExce Prel child = ((Prel) prel.getInput(0)).accept(this, null); if (prefixedForStar) { - if (!prefixedForWriter) { + if (prefixedForWriter) { + // Prefix is added under CTAS Writer. We need create a new Screen with the converted child. + return prel.copy(prel.getTraitSet(), Collections.singletonList(child)); + } else { // Prefix is added for SELECT only, not for CTAS writer. return insertProjUnderScreenOrWriter(prel, prel.getInput().getRowType(), child); - } else { - // Prefix is added under CTAS Writer. We need create a new Screen with the converted child. - return prel.copy(prel.getTraitSet(), Collections.<RelNode>singletonList(child)); } } else { // No prefix is @@ -118,13 +118,23 @@ public class StarColumnConverter extends BasePrelVisitor<Prel, Void, RuntimeExce RelDataType newRowType = RexUtil.createStructType(child.getCluster().getTypeFactory(), exprs, origRowType.getFieldNames(), null); - int fieldCount = prel.getRowType().isStruct()? prel.getRowType().getFieldCount():1; + int fieldCount = prel.getRowType().isStruct() ? prel.getRowType().getFieldCount() : 1; // Insert PUS/PUW : remove the prefix and keep the original field name. - if (fieldCount > 1) { // // no point in allowing duplicates if we only have one column - proj = new ProjectAllowDupPrel(child.getCluster(), child.getTraitSet(), child, exprs, newRowType); + if (fieldCount > 1) { // no point in allowing duplicates if we only have one column + proj = new ProjectAllowDupPrel(child.getCluster(), + child.getTraitSet(), + child, + exprs, + newRowType, + true); //outputProj = true : will allow to build the schema for PUS Project, see ProjectRecordBatch#handleNullInput() } else { - proj = new ProjectPrel(child.getCluster(), child.getTraitSet(), child, exprs, newRowType); + proj = new ProjectPrel(child.getCluster(), + child.getTraitSet(), + child, + exprs, + newRowType, + true); //outputProj = true : will allow to build the schema for PUS Project, see ProjectRecordBatch#handleNullInput() } children.add(proj); 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 bad161756..c75311f4f 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 @@ -506,6 +506,7 @@ public class DefaultSqlHandler extends AbstractSqlHandler { * The rest of projects will remove the duplicate column when we generate POP in json format. */ phyRelNode = StarColumnConverter.insertRenameProject(phyRelNode); + log("Physical RelNode after Top and Rename Project inserting: ", phyRelNode, logger, null); /* * 2.) diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaPushFilterIntoRecordGenerator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaPushFilterIntoRecordGenerator.java index 3b62daeaa..dae5c2846 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaPushFilterIntoRecordGenerator.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaPushFilterIntoRecordGenerator.java @@ -99,7 +99,7 @@ public abstract class InfoSchemaPushFilterIntoRecordGenerator extends StoragePlu final InfoSchemaGroupScan newGroupsScan = new InfoSchemaGroupScan(groupScan.getTable(), infoSchemaFilter); newGroupsScan.setFilterPushedDown(true); - RelNode input = ScanPrel.create(scan, filter.getTraitSet(), newGroupsScan, scan.getRowType()); + RelNode input = new ScanPrel(scan, filter.getTraitSet(), newGroupsScan, scan.getRowType()); if (project != null) { input = project.copy(project.getTraitSet(), input, project.getProjects(), filter.getRowType()); } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetPushDownFilter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetPushDownFilter.java index 2057ac562..e58d306cd 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetPushDownFilter.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetPushDownFilter.java @@ -167,7 +167,7 @@ public abstract class ParquetPushDownFilter extends StoragePluginOptimizerRule { return; } - RelNode newScan = ScanPrel.create(scan, scan.getTraitSet(), newGroupScan, scan.getRowType()); + RelNode newScan = new ScanPrel(scan, scan.getTraitSet(), newGroupScan, scan.getRowType()); if (project != null) { newScan = project.copy(project.getTraitSet(), ImmutableList.of(newScan)); diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java b/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java index d1d5654a0..918593972 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java +++ b/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java @@ -1248,7 +1248,9 @@ public class TestUnionAll extends BaseTestQuery { @Test public void testUnionAllBothEmptyDirs() throws Exception { - final BatchSchema expectedSchema = new SchemaBuilder().build(); + final BatchSchema expectedSchema = new SchemaBuilder() + .addNullable("key", TypeProtos.MinorType.INT) + .build(); testBuilder() .sqlQuery("SELECT key FROM dfs.tmp.`%1$s` UNION ALL SELECT key FROM dfs.tmp.`%1$s`", EMPTY_DIR_NAME) diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java b/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java index db4351275..59108179c 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java +++ b/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java @@ -826,7 +826,9 @@ public class TestUnionDistinct extends BaseTestQuery { @Test public void testUnionBothEmptyDirs() throws Exception { - final BatchSchema expectedSchema = new SchemaBuilder().build(); + final BatchSchema expectedSchema = new SchemaBuilder() + .addNullable("key", TypeProtos.MinorType.INT) + .build(); testBuilder() .sqlQuery("SELECT key FROM dfs.tmp.`%1$s` UNION SELECT key FROM dfs.tmp.`%1$s`", EMPTY_DIR_NAME) diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/TestEmptyInputSql.java b/exec/java-exec/src/test/java/org/apache/drill/exec/TestEmptyInputSql.java index 1512059a5..2b0eb42f2 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/TestEmptyInputSql.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/TestEmptyInputSql.java @@ -222,12 +222,9 @@ public class TestEmptyInputSql extends BaseTestQuery { @Test public void testEmptyDirectoryAndFieldInQuery() throws Exception { - final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList(); - final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder() - .setMinorType(TypeProtos.MinorType.INT) // field "key" is absent in schemaless table - .setMode(TypeProtos.DataMode.OPTIONAL) + final BatchSchema expectedSchema = new SchemaBuilder() + .addNullable("key", TypeProtos.MinorType.INT) .build(); - expectedSchema.add(Pair.of(SchemaPath.getSimplePath("key"), majorType)); testBuilder() .sqlQuery("select key from dfs.tmp.`%s`", EMPTY_DIR_NAME) @@ -237,6 +234,36 @@ public class TestEmptyInputSql extends BaseTestQuery { } @Test + public void testRenameProjectEmptyDirectory() throws Exception { + final BatchSchema expectedSchema = new SchemaBuilder() + .addNullable("WeekId", TypeProtos.MinorType.INT) + .addNullable("ProductName", TypeProtos.MinorType.INT) + .build(); + + testBuilder() + .sqlQuery("select WeekId, Product as ProductName from (select CAST(`dir0` as INT) AS WeekId, " + + "Product from dfs.tmp.`%s`)", EMPTY_DIR_NAME) + .schemaBaseLine(expectedSchema) + .build() + .run(); + } + + @Test + public void testRenameProjectEmptyJson() throws Exception { + final BatchSchema expectedSchema = new SchemaBuilder() + .addNullable("WeekId", TypeProtos.MinorType.INT) + .addNullable("ProductName", TypeProtos.MinorType.INT) + .build(); + + testBuilder() + .sqlQuery("select WeekId, Product as ProductName from (select CAST(`dir0` as INT) AS WeekId, " + + "Product from cp.`%s`)", SINGLE_EMPTY_JSON) + .schemaBaseLine(expectedSchema) + .build() + .run(); + } + + @Test public void testEmptyDirectoryPlanSerDe() throws Exception { String query = String.format("select * from dfs.tmp.`%s`", EMPTY_DIR_NAME); PlanTestBase.testPhysicalPlanExecutionBasedOnQuery(query); |