Skip to content

Commit

Permalink
TEIID-4280 fixing deeply nested planning
Browse files Browse the repository at this point in the history
Conflicts:
	engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java
  • Loading branch information
shawkins committed Jun 22, 2016
1 parent c0187ad commit a702545
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
Expand Up @@ -423,11 +423,19 @@ private void processWith(final QueryCommand command, List<WithQueryCommand> with
with.setGroupSymbol(gs);
with.setColumns(new ArrayList(replacementSymbols.values()));
//we use equality checks here because there may be a similarly named at lower scopes
ExpressionMappingVisitor emv = new ExpressionMappingVisitor(replacementSymbols) {
ExpressionMappingVisitor emv = new ExpressionMappingVisitor(null) {
@Override
public void visit(UnaryFromClause obj) {
if (old.getMetadataID() == obj.getGroup().getMetadataID()) {
obj.setGroup(gs);
String def = obj.getGroup().getDefinition();
if (def != null) {
String name = obj.getGroup().getName();
obj.setGroup(gs.clone());
obj.getGroup().setDefinition(gs.getName());
obj.getGroup().setName(name);
} else {
obj.setGroup(gs);
}
}
}

Expand All @@ -436,7 +444,15 @@ public Expression replaceExpression(Expression element) {
if (element instanceof ElementSymbol) {
ElementSymbol es = (ElementSymbol)element;
if (es.getGroupSymbol().getMetadataID() == old.getMetadataID()) {
return super.replaceExpression(element);
String def = es.getGroupSymbol().getDefinition();
if (def != null) {
String name = es.getGroupSymbol().getName();
es.setGroupSymbol(gs.clone());
es.getGroupSymbol().setDefinition(gs.getName());
es.getGroupSymbol().setName(name);
} else {
es.setGroupSymbol(gs);
}
}
}
return element;
Expand Down Expand Up @@ -490,6 +506,16 @@ public int compare(WithQueryCommand o1,
return order.get(o1.getGroupSymbol()).compareTo(order.get(o2.getGroupSymbol()));
}
});
//pull up the with from the subqueries
for (int i = 0; i < with.size(); i++) {
WithQueryCommand wqc = with.get(i);
List<WithQueryCommand> with2 = wqc.getCommand().getWith();
if (with2 != null) {
with.addAll(i, with2);
i += with2.size();
wqc.getCommand().setWith(null);
}
}
QueryCommand query = (QueryCommand)command;
List<SubqueryContainer<?>> subqueries = ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(query);
pullupWith(with, subqueries);
Expand Down
Expand Up @@ -791,5 +791,24 @@ public TupleSource registerRequest(CommandContext context,
TestProcessor.helpProcess(plan, dataManager, new List<?>[] {Arrays.asList("ba", 1)});
}

@Test public void testViewPlanningDeeplyNested() throws Exception {
CommandContext cc = TestProcessor.createCommandContext();
BasicSourceCapabilities bsc = TestOptimizer.getTypicalCapabilities();
bsc.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true);

TransformationMetadata metadata = RealMetadataFactory.fromDDL("create foreign table test_a (a varchar); "
+ "create view tv1 as WITH alias as /*+ no_inline */ (SELECT a from test_a) "
+ ",alias2 as /*+ no_inline */ (select t2.a as a1, t1.a from alias t1 join (SELECT a from test_a) t2 on t1.a=t2.a) "
+ ",alias3 as /*+ no_inline */ (select t2.a as a1, t1.a from alias t1 join alias2 t2 on t1.a=t2.a) "
+ "SELECT alias.a as a1 FROM alias;", "x", "y");

String sql = "with CTE1 as /*+ no_inline */ ( select a1 from tv1), CTE2 as /*+ no_inline */ ( select a1 from tv1) select * from CTE1 as T1 join CTE1 as T2 on T1.a1=T2.a1";
ProcessorPlan plan = helpGetPlan(helpParse(sql), metadata, new DefaultCapabilitiesFinder(bsc), cc);
HardcodedDataManager hdm = new HardcodedDataManager(metadata);
hdm.addData("WITH alias (a) AS (SELECT g_0.a FROM test_a AS g_0), CTE1 (a1) AS (SELECT g_0.a FROM alias AS g_0) SELECT g_0.a1 AS c_0 FROM CTE1 AS g_0 ORDER BY c_0", Arrays.asList("a"));

TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList("a", "a")});
}

}

0 comments on commit a702545

Please sign in to comment.