Maryann Xue created CALCITE-891:
-----------------------------------
Summary: TableScan without Project cannot be substituted by any
projected materialization
Key: CALCITE-891
URL: https://issues.apache.org/jira/browse/CALCITE-891
Project: Calcite
Issue Type: Bug
Reporter: Maryann Xue
Assignee: Julian Hyde
Priority: Minor
A TableScan that does not have a Project as its parent cannot be matched by any
UnifyRules and thus cannot be substituted by a projected materialization; while
the same TableScan with an identity projection could.
{code}
@Test public void testJoinMaterialization2() {
String q = "select *\n"
+ "from \"emps\"\n"
+ "join \"depts\" using (\"deptno\")";
checkMaterialize("select \"deptno\", \"empid\", \"name\", \"salary\",
\"commission\" from \"emps\"", q);
}
{code}
In the above test case, the initial Rel was like:
{code}
LogicalProject(...)
LogicalJoin(...)
TableScan(table=[[hr, emps]])
TableScan(table=[[hr, depts]])
{code}
And the queryDescendent {{TableScan(table=\[\[hr, emps\]\])}} cannot be matched
by any UnifyRules that could have matched
{{LogicalProject(<identity_project_list>, TableScan(table=\[\[hr, emps\]\]))}}.
The following changes would make this test case pass. Not sure if this would be
the best fix, but it is at least a good illustration of the problem.
{code}
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
index 7762bf7..ccece75 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
@@ -2861,9 +2861,6 @@ public static RelNode permute(
public static RelNode createProject(final RelFactories.ProjectFactory
factory,
final RelNode child, final List<Integer> posList) {
RelDataType rowType = child.getRowType();
- if (Mappings.isIdentity(posList, rowType.getFieldCount())) {
- return child;
- }
final List<String> fieldNames = rowType.getFieldNames();
final RexBuilder rexBuilder = child.getCluster().getRexBuilder();
return factory.createProject(child,
diff --git
a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 50f22c1..b0a519a 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -2240,6 +2240,8 @@ protected RelNode createJoin(
}
}
+ leftRel = leftRel instanceof Project ? leftRel :
RelOptUtil.createProject(leftRel,
ImmutableIntList.identity(leftRel.getRowType().getFieldCount()));
+ rightRel = rightRel instanceof Project ? rightRel :
RelOptUtil.createProject(rightRel,
ImmutableIntList.identity(rightRel.getRowType().getFieldCount()));
final Join originalJoin =
(Join) RelFactories.DEFAULT_JOIN_FACTORY.createJoin(leftRel, rightRel,
joinCond, joinType, ImmutableSet.<String>of(), false);
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)