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);
+ }
+
}