diff --git a/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html b/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html index b2209bf525..ba5bbc4faa 100644 --- a/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html +++ b/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html @@ -315,6 +315,8 @@

from ${project.version}

  • [TEIID-3470] - NPE in ConnectorWorkItem when using source hints
  • +
  • [TEIID-3490] - WITH [TABLENAME] AS clause being sent to source query +
  • from 8.7.3

    diff --git a/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java b/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java index 4165c2f6b2..45486a3d63 100644 --- a/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java +++ b/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java @@ -288,7 +288,7 @@ private static void assignWithClause(RelationalNode node, Map with = new ArrayList(); for (GroupSymbol groupSymbol : groups) { WithQueryCommand clause = pushdownWith.get(groupSymbol.getNonCorrelationName()); diff --git a/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java b/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java index 1daf996738..e609bb4526 100644 --- a/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java +++ b/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java @@ -42,6 +42,7 @@ public class PreOrPostOrderNavigator extends AbstractNavigator { private boolean order; private boolean deep; + private boolean skipEvaluatable; public PreOrPostOrderNavigator(LanguageVisitor visitor, boolean order, boolean deep) { super(visitor); @@ -171,7 +172,7 @@ public void visit(ElementSymbol obj) { } public void visit(ExistsCriteria obj) { preVisitVisitor(obj); - if (deep) { + if (deep && (!obj.shouldEvaluate() || !skipEvaluatable)) { visitNode(obj.getCommand()); } postVisitVisitor(obj); @@ -322,7 +323,7 @@ public void visit(Reference obj) { } public void visit(ScalarSubquery obj) { preVisitVisitor(obj); - if (deep) { + if (deep && (!obj.shouldEvaluate() || !skipEvaluatable)) { visitNode(obj.getCommand()); } postVisitVisitor(obj); @@ -668,5 +669,9 @@ public static void doVisit(LanguageObject object, LanguageVisitor visitor, boole PreOrPostOrderNavigator nav = new PreOrPostOrderNavigator(visitor, order, deep); object.acceptVisitor(nav); } + + public void setSkipEvaluatable(boolean skipEvaluatable) { + this.skipEvaluatable = skipEvaluatable; + } } diff --git a/engine/src/main/java/org/teiid/query/sql/visitor/GroupCollectorVisitor.java b/engine/src/main/java/org/teiid/query/sql/visitor/GroupCollectorVisitor.java index 0fdd5d5639..751566e387 100644 --- a/engine/src/main/java/org/teiid/query/sql/visitor/GroupCollectorVisitor.java +++ b/engine/src/main/java/org/teiid/query/sql/visitor/GroupCollectorVisitor.java @@ -33,6 +33,7 @@ import org.teiid.query.sql.lang.StoredProcedure; import org.teiid.query.sql.lang.SubqueryFromClause; import org.teiid.query.sql.navigator.DeepPreOrderNavigator; +import org.teiid.query.sql.navigator.PreOrPostOrderNavigator; import org.teiid.query.sql.navigator.PreOrderNavigator; import org.teiid.query.sql.symbol.GroupSymbol; @@ -162,10 +163,12 @@ public static Collection getGroups(LanguageObject obj, boolean remo * @param obj Language object * @param elements Collection to collect groups in */ - public static void getGroupsIgnoreInlineViews(LanguageObject obj, Collection groups) { + public static void getGroupsIgnoreInlineViewsAndEvaluatableSubqueries(LanguageObject obj, Collection groups) { GroupCollectorVisitor visitor = new GroupCollectorVisitor(groups); visitor.setIgnoreInlineViewGroups(true); - DeepPreOrderNavigator.doVisit(obj, visitor); + PreOrPostOrderNavigator nav = new PreOrPostOrderNavigator(visitor, PreOrPostOrderNavigator.PRE_ORDER, true); + nav.setSkipEvaluatable(true); + obj.acceptVisitor(nav); if(visitor.getInlineViewGroups() != null) { groups.removeAll(visitor.getInlineViewGroups()); diff --git a/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java b/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java index 79db126c52..9dbd8a4d80 100644 --- a/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java +++ b/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java @@ -16,6 +16,7 @@ import org.teiid.query.optimizer.TestOptimizer; import org.teiid.query.optimizer.TestOptimizer.ComparisonMode; import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities; +import org.teiid.query.optimizer.capabilities.CapabilitiesFinder; import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder; import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder; import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability; @@ -348,4 +349,13 @@ public TupleSource registerRequest(CommandContext context, helpProcess(plan, cc, dataManager, expected); } + @Test public void testWithAndUncorrelatedSubquery() throws TeiidComponentException, TeiidProcessingException { + String sql = "WITH t(n) AS ( select e1 from pm2.g1 ) SELECT n FROM t as t1, pm1.g1 where e1 = (select n from t)"; //$NON-NLS-1$ + + BasicSourceCapabilities bsc = TestOptimizer.getTypicalCapabilities(); + bsc.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true); + CapabilitiesFinder capFinder = new DefaultCapabilitiesFinder(bsc); + TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(), new String[] {"SELECT 1 FROM pm1.g1 AS g_0 WHERE g_0.e1 = (WITH t (n) AS (SELECT g_0.e1 FROM pm2.g1 AS g_0) SELECT g_0.n FROM t AS g_0)", "WITH t (n) AS (SELECT g_0.e1 FROM pm2.g1 AS g_0) SELECT g_0.n FROM t AS g_0"}, capFinder, ComparisonMode.EXACT_COMMAND_STRING); + } + }