diff options
author | Aman Sinha <asinha@maprtech.com> | 2015-01-12 10:58:50 -0800 |
---|---|---|
committer | Aman Sinha <asinha@maprtech.com> | 2015-01-12 14:44:30 -0800 |
commit | 5b012bf288738c2c76ef75692e4db467a5844574 (patch) | |
tree | aa944c45379dc54aa3917fb433767b2b9f1cf9c9 | |
parent | 487d98e58380b888fb11f168459e65a0def9d77f (diff) |
DRILL-1500: Partial fix: Don't overwrite top level ProjectPrel that allows duplicates (this was happening during flatten planning phase).
4 files changed, 16 insertions, 7 deletions
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 57dfdb489..26bb9f60d 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 @@ -28,6 +28,7 @@ import org.apache.drill.exec.physical.base.PhysicalOperator; import org.apache.drill.exec.physical.config.Project; import org.apache.drill.exec.planner.logical.DrillOptiq; import org.apache.drill.exec.planner.logical.DrillParseContext; +import org.eigenbase.rel.ProjectRelBase; import org.eigenbase.rel.RelNode; import org.eigenbase.relopt.RelOptCluster; import org.eigenbase.relopt.RelTraitSet; @@ -45,6 +46,11 @@ public class ProjectAllowDupPrel extends ProjectPrel { } @Override + public ProjectAllowDupPrel copy(RelTraitSet traitSet, RelNode input, List<RexNode> exps, RelDataType rowType) { + return new ProjectAllowDupPrel(getCluster(), traitSet, input, exps, rowType); + } + + @Override public PhysicalOperator getPhysicalOperator(PhysicalPlanCreator creator) throws IOException { Prel child = (Prel) this.getChild(); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RewriteProjectToFlatten.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RewriteProjectToFlatten.java index 10554112e..bedc7bc94 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RewriteProjectToFlatten.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/RewriteProjectToFlatten.java @@ -108,7 +108,7 @@ public class RewriteProjectToFlatten extends BasePrelVisitor<Prel, Object, RelCo } Prel child = ((Prel)project.getChild()).accept(this, null); - return new ProjectPrel(node.getCluster(), project.getTraitSet(), child, exprList, new RelRecordType(relDataTypes)); + return (Prel) project.copy(project.getTraitSet(), child, exprList, new RelRecordType(relDataTypes)); } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/SplitUpComplexExpressions.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/SplitUpComplexExpressions.java index 3e685a3aa..11b6c4339 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/SplitUpComplexExpressions.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/SplitUpComplexExpressions.java @@ -136,6 +136,6 @@ public class SplitUpComplexExpressions extends BasePrelVisitor<Prel, Object, Rel allExprs.add(builder.makeInputRef( new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index)); relDataTypes.add(new RelDataTypeFieldImpl("EXPR$" + index, allExprs.size(), factory.createSqlType(SqlTypeName.ANY) )); } - return new ProjectPrel(project.getCluster(), project.getTraitSet(), originalInput, exprList, new RelRecordType(origRelDataTypes)); + return (Prel) project.copy(project.getTraitSet(), originalInput, exprList, new RelRecordType(origRelDataTypes)); } } 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 bacee0842..83d2d0bf6 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 @@ -196,13 +196,16 @@ public class DefaultSqlHandler extends AbstractSqlHandler { */ phyRelNode = JoinPrelRenameVisitor.insertRenameProject(phyRelNode); - // TODO - re-enable once execution issues are resolved. This rule allows for several flatten operations to appear - // within a single query, it also breaks up all expressions with complex outputs into their own project operations. - // It currently appears to be producing good plans, but for the flatten case it is revealing execution errors in the - // project operator. + /* + * 1.1) Break up all expressions with complex outputs into their own project operations + */ phyRelNode = ((Prel) phyRelNode).accept(new SplitUpComplexExpressions(planner.getTypeFactory(), context.getDrillOperatorTable(), context.getPlannerSettings().functionImplementationRegistry), null); + + /* + * 1.2) Projections that contain reference to flatten are rewritten as Flatten operators followed by Project + */ phyRelNode = ((Prel) phyRelNode).accept(new RewriteProjectToFlatten(planner.getTypeFactory(), context.getDrillOperatorTable()), null); - // Definitely before this one + /* * 2.) * Since our operators work via names rather than indices, we have to make to reorder any |