Author: shawkins
Date: 2011-08-17 16:24:17 -0400 (Wed, 17 Aug 2011)
New Revision: 3391
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeEditor.java
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
Log:
TEIID-1717 fix for NPE with Texttable join
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeEditor.java
===================================================================
---
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeEditor.java 2011-08-17
15:24:59 UTC (rev 3390)
+++
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeEditor.java 2011-08-17
20:24:17 UTC (rev 3391)
@@ -54,6 +54,9 @@
}
public static final PlanNode findNodePreOrder(PlanNode root, int types, int stopTypes)
{
+ if (root == null) {
+ return null;
+ }
if((types & root.getType()) == root.getType()) {
return root;
} else if((stopTypes & root.getType()) == root.getType()) {
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java
===================================================================
---
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java 2011-08-17
15:24:59 UTC (rev 3390)
+++
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java 2011-08-17
20:24:17 UTC (rev 3391)
@@ -227,7 +227,7 @@
PlanNode sortNode = createSortNode(new
ArrayList<SingleElementSymbol>(orderSymbols), outputSymbols);
boolean distinct = false;
- if (sourceNode.getType() == NodeConstants.Types.SOURCE &&
outputSymbols.size() == expressions.size() &&
outputSymbols.containsAll(expressions)) {
+ if (sourceNode.getFirstChild() != null && sourceNode.getType() ==
NodeConstants.Types.SOURCE && outputSymbols.size() == expressions.size()
&& outputSymbols.containsAll(expressions)) {
PlanNode setOp = NodeEditor.findNodePreOrder(sourceNode.getFirstChild(),
NodeConstants.Types.SET_OP, NodeConstants.Types.SOURCE);
if (setOp != null) {
if (setOp.hasBooleanProperty(NodeConstants.Info.USE_ALL)) {
Modified:
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
===================================================================
---
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-17
15:24:59 UTC (rev 3390)
+++
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-17
20:24:17 UTC (rev 3391)
@@ -278,6 +278,21 @@
helpProcess(plan, createCommandContext(), dataManager, expected);
}
+ @Test public void testTextTableJoin1() throws Exception {
+ String sql = "select e1, e2 from texttable('a' COLUMNS col string) x,
pm1.g1 where col = e1";
+
+ List[] expected = new List[] {
+ Arrays.asList("a", 0),
+ Arrays.asList("a", 3),
+ Arrays.asList("a", 0),
+ };
+
+ FakeDataManager dataManager = new FakeDataManager();
+ sampleData1(dataManager);
+ RelationalPlan plan = (RelationalPlan)helpGetPlan(helpParse(sql),
RealMetadataFactory.example1Cached());
+ helpProcess(plan, createCommandContext(), dataManager, expected);
+ }
+
public static void process(String sql, List[] expectedResults) throws Exception {
FakeDataManager dataManager = new FakeDataManager();
sampleData1(dataManager);
Show replies by thread