Skip to content

Commit 2d34179

Browse files
committed
TEIID-2392 ensuring consistent column names with a pushdown common table
expression
1 parent 9bfb2b0 commit 2d34179

File tree

6 files changed

+39
-14
lines changed

6 files changed

+39
-14
lines changed

api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java

+7-9
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class SQLStringVisitor extends AbstractLanguageVisitor {
5858

5959
protected StringBuilder buffer = new StringBuilder();
6060
private boolean appendedSourceComment;
61+
private boolean shortNameOnly = false;
6162

6263
/**
6364
* Gets the name of a group or element from the RuntimeMetadata
@@ -238,7 +239,7 @@ protected String replaceElementName(String group, String element) {
238239
}
239240

240241
public void visit(ColumnReference obj) {
241-
buffer.append(getElementName(obj, true));
242+
buffer.append(getElementName(obj, !shortNameOnly));
242243
}
243244

244245
private String getElementName(ColumnReference obj, boolean qualify) {
@@ -482,14 +483,9 @@ public void visit(Insert obj) {
482483
append(obj.getTable());
483484
buffer.append(Tokens.SPACE).append(Tokens.LPAREN);
484485

485-
int elementCount = obj.getColumns().size();
486-
for (int i = 0; i < elementCount; i++) {
487-
buffer.append(getElementName(obj.getColumns().get(i), false));
488-
if (i < elementCount - 1) {
489-
buffer.append(Tokens.COMMA);
490-
buffer.append(Tokens.SPACE);
491-
}
492-
}
486+
this.shortNameOnly = true;
487+
append(obj.getColumns());
488+
this.shortNameOnly = false;
493489

494490
buffer.append(Tokens.RPAREN);
495491
buffer.append(Tokens.SPACE);
@@ -925,7 +921,9 @@ public void visit(WithItem obj) {
925921
buffer.append(Tokens.SPACE);
926922
if (obj.getColumns() != null) {
927923
buffer.append(Tokens.LPAREN);
924+
shortNameOnly = true;
928925
append(obj.getColumns());
926+
shortNameOnly = false;
929927
buffer.append(Tokens.RPAREN);
930928
buffer.append(Tokens.SPACE);
931929
}

connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver/TestSqlServerConversionVisitor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public void testDateFunctions() throws Exception {
203203

204204
@Test public void testWith() throws Exception {
205205
String input = "with x as (select intkey from bqt1.smalla) select intkey from x limit 100"; //$NON-NLS-1$
206-
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$
206+
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$
207207

208208
CommandBuilder commandBuilder = new CommandBuilder(RealMetadataFactory.exampleBQTCached());
209209
Command obj = commandBuilder.getCommand(input, true, true);

engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@
3535
import org.teiid.core.types.ArrayImpl;
3636
import org.teiid.core.types.DataTypeManager;
3737
import org.teiid.language.*;
38-
import org.teiid.language.DerivedColumn;
39-
import org.teiid.language.Select;
40-
import org.teiid.language.WindowSpecification;
4138
import org.teiid.language.Argument.Direction;
4239
import org.teiid.language.Comparison.Operator;
4340
import org.teiid.language.SortSpecification.Ordering;
4441
import org.teiid.language.SubqueryComparison.Quantifier;
42+
import org.teiid.language.DerivedColumn;
43+
import org.teiid.language.Select;
44+
import org.teiid.language.WindowSpecification;
4545
import org.teiid.metadata.Procedure;
4646
import org.teiid.metadata.ProcedureParameter;
4747
import org.teiid.query.QueryPlugin;
@@ -261,6 +261,7 @@ public With translate(List<WithQueryCommand> with) {
261261
for (ElementSymbol es: withQueryCommand.getColumns()) {
262262
translatedElements.add(translate(es));
263263
}
264+
item.setColumns(translatedElements);
264265
}
265266
item.setSubquery(translate(withQueryCommand.getCommand()));
266267
items.add(item);

engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java

+1
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ public ProcessorPlan optimize(
241241
if (queryCommand == null || CriteriaCapabilityValidatorVisitor.validateCommandPushdown(modelID, metadata, capFinder, aNode) == null) {
242242
supportsWithPushdown = false;
243243
} else {
244+
//TODO: do this prior to alias generation, or rerun alias generation here
244245
queryCommand.setWith(pushDownWith);
245246
}
246247
} else {

engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ protected DDLStringVisitor append(Object o) {
8383
private static final String END_HINT = "*/"; //$NON-NLS-1$
8484
private static final char ID_ESCAPE_CHAR = '\"';
8585
protected StringBuilder parts = new StringBuilder();
86+
private boolean shortNameOnly = false;
8687

8788
/**
8889
* Helper to quickly get the parser string for an object using the visitor.
@@ -722,7 +723,9 @@ public void visit(WithQueryCommand obj) {
722723
append(SPACE);
723724
if (obj.getColumns() != null && !obj.getColumns().isEmpty()) {
724725
append(Tokens.LPAREN);
726+
shortNameOnly = true;
725727
registerNodes(obj.getColumns(), 0);
728+
shortNameOnly = false;
726729
append(Tokens.RPAREN);
727730
append(SPACE);
728731
}
@@ -1274,7 +1277,7 @@ static String escapeStringValue( String str,
12741277
}
12751278

12761279
public void visit( ElementSymbol obj ) {
1277-
if (obj.getDisplayMode().equals(ElementSymbol.DisplayMode.SHORT_OUTPUT_NAME)) {
1280+
if (obj.getDisplayMode().equals(ElementSymbol.DisplayMode.SHORT_OUTPUT_NAME) || shortNameOnly) {
12781281
outputShortName(obj);
12791282
return;
12801283
}

engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java

+22
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,28 @@ public class TestWithClauseProcessing {
7777
helpProcess(plan, dataManager, expected);
7878
}
7979

80+
@Test public void testWithPushdown1() throws TeiidException {
81+
FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
82+
BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
83+
caps.setCapabilitySupport(Capability.COMMON_TABLE_EXPRESSIONS, true);
84+
caps.setCapabilitySupport(Capability.QUERY_FROM_JOIN_SELFJOIN, true);
85+
caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT, true);
86+
capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
87+
88+
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$
89+
90+
HardcodedDataManager dataManager = new HardcodedDataManager(RealMetadataFactory.example1Cached());
91+
List<?>[] expected = new List[] {
92+
Arrays.asList("a", 1, Boolean.FALSE),
93+
};
94+
95+
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);
96+
97+
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);
98+
99+
helpProcess(plan, dataManager, expected);
100+
}
101+
80102
@Test public void testWithPushdownWithConstants() throws TeiidException {
81103
FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
82104
BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();

0 commit comments

Comments
 (0)