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();