[teiid-commits] teiid SVN: r4554 - in branches/7.7.x: connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver and 4 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Feb 27 12:16:03 EST 2013


Author: jolee
Date: 2013-02-27 12:16:02 -0500 (Wed, 27 Feb 2013)
New Revision: 4554

Modified:
   branches/7.7.x/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
   branches/7.7.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver/TestSqlServerConversionVisitor.java
   branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
   branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   branches/7.7.x/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
   branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java
Log:
TEIID-2392: Pushdown common table query invalid

Modified: branches/7.7.x/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
===================================================================
--- branches/7.7.x/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java	2013-02-27 16:33:26 UTC (rev 4553)
+++ branches/7.7.x/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java	2013-02-27 17:16:02 UTC (rev 4554)
@@ -98,6 +98,7 @@
     
     protected StringBuilder buffer = new StringBuilder();
     private boolean appendedSourceComment;
+    private boolean shortNameOnly = false;
                 
     /**
      * Gets the name of a group or element from the RuntimeMetadata
@@ -276,7 +277,7 @@
     }
     
     public void visit(ColumnReference obj) {
-        buffer.append(getElementName(obj, true));
+    	buffer.append(getElementName(obj, !shortNameOnly));
     }
 
 	private String getElementName(ColumnReference obj, boolean qualify) {
@@ -520,14 +521,9 @@
 		append(obj.getTable());
 		buffer.append(Tokens.SPACE).append(Tokens.LPAREN);
 
-		int elementCount = obj.getColumns().size();
-		for (int i = 0; i < elementCount; i++) {
-			buffer.append(getElementName(obj.getColumns().get(i), false));
-			if (i < elementCount - 1) {
-				buffer.append(Tokens.COMMA);
-				buffer.append(Tokens.SPACE);
-			}
-		}
+		this.shortNameOnly = true;
+		append(obj.getColumns());
+		this.shortNameOnly = false;
 
 		buffer.append(Tokens.RPAREN);
         buffer.append(Tokens.SPACE);
@@ -953,7 +949,9 @@
     	buffer.append(Tokens.SPACE);
     	if (obj.getColumns() != null) {
     		buffer.append(Tokens.LPAREN);
+    		shortNameOnly = true;
     		append(obj.getColumns());
+    		shortNameOnly = false;
     		buffer.append(Tokens.RPAREN);
     		buffer.append(Tokens.SPACE);
     	}

Modified: branches/7.7.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver/TestSqlServerConversionVisitor.java
===================================================================
--- branches/7.7.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver/TestSqlServerConversionVisitor.java	2013-02-27 16:33:26 UTC (rev 4553)
+++ branches/7.7.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver/TestSqlServerConversionVisitor.java	2013-02-27 17:16:02 UTC (rev 4554)
@@ -203,7 +203,7 @@
     
     @Test public void testWith() throws Exception {
         String input = "with x as (select intkey from bqt1.smalla) select intkey from x limit 100"; //$NON-NLS-1$
-        String output = "WITH x AS (SELECT SmallA.IntKey FROM SmallA) SELECT TOP 100 g_0.intkey AS c_0 FROM x g_0"; //$NON-NLS-1$
+        String output = "WITH x (IntKey) AS (SELECT SmallA.IntKey FROM SmallA) SELECT TOP 100 g_0.intkey AS c_0 FROM x g_0"; //$NON-NLS-1$
                
 		CommandBuilder commandBuilder = new CommandBuilder(RealMetadataFactory.exampleBQTCached());
         Command obj = commandBuilder.getCommand(input, true, true);

Modified: branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java	2013-02-27 16:33:26 UTC (rev 4553)
+++ branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java	2013-02-27 17:16:02 UTC (rev 4554)
@@ -36,13 +36,13 @@
 import org.teiid.core.TeiidException;
 import org.teiid.core.TeiidRuntimeException;
 import org.teiid.language.*;
-import org.teiid.language.DerivedColumn;
-import org.teiid.language.Select;
-import org.teiid.language.WindowSpecification;
 import org.teiid.language.Argument.Direction;
 import org.teiid.language.Comparison.Operator;
 import org.teiid.language.SortSpecification.Ordering;
 import org.teiid.language.SubqueryComparison.Quantifier;
+import org.teiid.language.DerivedColumn;
+import org.teiid.language.Select;
+import org.teiid.language.WindowSpecification;
 import org.teiid.metadata.Procedure;
 import org.teiid.metadata.ProcedureParameter;
 import org.teiid.metadata.FunctionMethod.PushDown;
@@ -176,6 +176,7 @@
 		        for (ElementSymbol es: withQueryCommand.getColumns()) {
 		            translatedElements.add(translate(es));
 		        }
+		        item.setColumns(translatedElements);
 			}
 			item.setSubquery(translate(withQueryCommand.getCommand()));
 			items.add(item);

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2013-02-27 16:33:26 UTC (rev 4553)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2013-02-27 17:16:02 UTC (rev 4554)
@@ -206,6 +206,7 @@
 				if (queryCommand == null || CriteriaCapabilityValidatorVisitor.validateCommandPushdown(modelID, metadata, capFinder, aNode) == null) {
 					supportsWithPushdown = false;
 				} else {
+					//TODO: do this prior to alias generation, or rerun alias generation here
 					queryCommand.setWith(pushDownWith);
 				}
         	} else {

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2013-02-27 16:33:26 UTC (rev 4553)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java	2013-02-27 17:16:02 UTC (rev 4554)
@@ -64,6 +64,7 @@
     private static final String END_HINT = "*/"; //$NON-NLS-1$
     private static final char ID_ESCAPE_CHAR = '\"';
 	protected StringBuilder parts = new StringBuilder();
+	private boolean shortNameOnly = false;
 
     /**
      * Helper to quickly get the parser string for an object using the visitor.
@@ -680,7 +681,9 @@
     	append(SPACE);
     	if (obj.getColumns() != null && !obj.getColumns().isEmpty()) {
     		append(Tokens.LPAREN);
+    		shortNameOnly = true;
     		registerNodes(obj.getColumns(), 0);
+    		shortNameOnly = false;
     		append(Tokens.RPAREN);
     		append(SPACE);
     	}
@@ -1179,7 +1182,7 @@
     }
 
     public void visit( ElementSymbol obj ) {
-        if (obj.getDisplayMode().equals(ElementSymbol.DisplayMode.SHORT_OUTPUT_NAME)) {
+    	if (obj.getDisplayMode().equals(ElementSymbol.DisplayMode.SHORT_OUTPUT_NAME) || shortNameOnly) {
             outputShortName(obj);
             return;
         }

Modified: branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java
===================================================================
--- branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java	2013-02-27 16:33:26 UTC (rev 4553)
+++ branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java	2013-02-27 17:16:02 UTC (rev 4554)
@@ -76,6 +76,28 @@
 	    helpProcess(plan, dataManager, expected);
 	}
 	
+	@Test public void testWithPushdown1() throws TeiidException {
+		FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+		BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+		caps.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true);
+		caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_SELFJOIN, true);
+		caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, true);
+		capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+		
+		String sql = "with a as (select x, y, z from (select e1 as x, e2 as y, e3 as z from pm1.g1) v) SELECT count(a.x) from a, a z"; //$NON-NLS-1$
+		
+		HardcodedDataManager dataManager = new HardcodedDataManager(RealMetadataFactory.example1Cached());
+		List<?>[] expected = new List[] { 
+				Arrays.asList("a", 1, Boolean.FALSE),
+		};    
+				
+		dataManager.addData("WITH a (x, y, z) AS (SELECT g_0.e1, g_0.e2, g_0.e3 FROM g1 AS g_0) SELECT COUNT(g_0.x) FROM a AS g_0, a AS g_1", expected);
+		
+		ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(), null, capFinder, new String[] {"WITH a (x, y, z) AS (SELECT g_0.e1, g_0.e2, g_0.e3 FROM pm1.g1 AS g_0) SELECT COUNT(g_0.x) FROM a AS g_0, a AS g_1"}, ComparisonMode.EXACT_COMMAND_STRING);
+		
+		helpProcess(plan, dataManager, expected);
+	}
+	
 	@Test public void testWithPushdownWithConstants() throws TeiidException {
 		 FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
         BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();



More information about the teiid-commits mailing list