aboutsummaryrefslogtreecommitdiff
path: root/exec
diff options
context:
space:
mode:
authorVitalii Diravka <vitalii.diravka@gmail.com>2018-10-05 16:21:55 +0300
committerVolodymyr Vysotskyi <vvovyk@gmail.com>2018-10-08 12:56:42 +0300
commitd5bafeccfc4d8dc19b7f22cfae807fa56b62340a (patch)
tree7c95ed43b19e370ffa94430a153304e1d0f5ea63 /exec
parent778e043f284921792403f6dc595050793a47ee02 (diff)
DRILL-6773: The renamed schema with aliases is not shown for queries on empty directories
closes #1492
Diffstat (limited to 'exec')
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/SchemalessScan.java6
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java2
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ConvertCountToDirectScan.java2
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectAllowDupPrel.java14
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrel.java2
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrel.java12
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ScanPrule.java2
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/StarColumnConverter.java26
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java1
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaPushFilterIntoRecordGenerator.java2
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetPushDownFilter.java2
-rw-r--r--exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java4
-rw-r--r--exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java4
-rw-r--r--exec/java-exec/src/test/java/org/apache/drill/exec/TestEmptyInputSql.java37
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);