[teiid-commits] teiid SVN: r2488 - in branches/7.1.x/engine/src: main/java/org/teiid/query/optimizer/relational/rules and 1 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Aug 24 17:45:14 EDT 2010


Author: shawkins
Date: 2010-08-24 17:45:14 -0400 (Tue, 24 Aug 2010)
New Revision: 2488

Modified:
   branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java
   branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
   branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
Log:
TEIID-1224 fix for uncorrelated subquery evaluation of a stored procedure

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java	2010-08-24 21:31:16 UTC (rev 2487)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java	2010-08-24 21:45:14 UTC (rev 2488)
@@ -309,6 +309,9 @@
     }
     
     public void visit(ScalarSubquery obj) {
+    	if (obj.shouldEvaluate()) {
+    		return;
+    	}
         visitor.createChildNamingContext(false);
         visitNode(obj.getCommand());
         visitor.removeChildNamingContext();

Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java	2010-08-24 21:31:16 UTC (rev 2487)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java	2010-08-24 21:45:14 UTC (rev 2488)
@@ -348,7 +348,7 @@
 	private void replaceCorrelatedReferences(List<SubqueryContainer> containers) {
 		for (SubqueryContainer container : containers) {
 		    RelationalPlan subqueryPlan = (RelationalPlan)container.getCommand().getProcessorPlan();
-		    if (subqueryPlan == null) {
+		    if (subqueryPlan == null || !(subqueryPlan.getRootNode() instanceof AccessNode)) {
 		    	continue;
 		    }
 		    AccessNode child = (AccessNode)subqueryPlan.getRootNode();

Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2010-08-24 21:31:16 UTC (rev 2487)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java	2010-08-24 21:45:14 UTC (rev 2488)
@@ -7512,7 +7512,7 @@
     
     @Test public void testUncorrelatedScalarSubqueryPushdown() throws Exception {
         FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
-        FakeMetadataFacade metadata = example1();
+        FakeMetadataFacade metadata = FakeMetadataFactory.example1Cached();
         
         BasicSourceCapabilities caps = getTypicalCapabilities();
         caps.setCapabilitySupport(Capability.QUERY_SUBQUERIES_SCALAR, false);
@@ -7535,6 +7535,32 @@
 
         helpProcess(plan, hdm, expected);
     }
+    
+    @Test public void testUncorrelatedScalarSubqueryPushdown1() throws Exception {
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+        FakeMetadataFacade metadata = FakeMetadataFactory.example1Cached();
+        
+        BasicSourceCapabilities caps = getTypicalCapabilities();
+        caps.setCapabilitySupport(Capability.QUERY_SUBQUERIES_SCALAR, false);
+        caps.setCapabilitySupport(Capability.QUERY_AGGREGATES, true);
+        caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true);
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+        
+        ProcessorPlan plan = helpPlan("select pm1.g1.e1 from pm1.g1 where e1 < (select e1 from (EXEC pm1.sq1()) x order by e2 limit 1)", metadata,  //$NON-NLS-1$
+                                      null, capFinder,
+            new String[] { "SELECT g_0.e1 FROM pm1.g1 AS g_0 WHERE g_0.e1 < (SELECT e1 FROM (EXEC pm1.sq1()) AS x ORDER BY e2 LIMIT 1)" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+        checkNodeTypes(plan, FULL_PUSHDOWN);
+        
+        HardcodedDataManager hdm = new HardcodedDataManager();
+        hdm.addData("SELECT g_0.e1 FROM pm1.g1 AS g_0 WHERE g_0.e1 < 'z'", new List[] {Arrays.asList("c")});
+        hdm.addData("SELECT g_0.e1, g_0.e2 FROM pm1.g1 AS g_0", new List[] {Arrays.asList("z", 1), Arrays.asList("b", 2)});
+        hdm.setBlockOnce(true);
+        List[] expected = new List[] {
+        		Arrays.asList("c"),
+        };    
+
+        helpProcess(plan, hdm, expected);
+    }
        
     private static final boolean DEBUG = false;
 }



More information about the teiid-commits mailing list