Merge lp:~mmcm/akiban-server/sql-flatten-expr-subquery into lp:~akiban-technologies/akiban-server/trunk

Proposed by Mike McMahon
Status: Merged
Approved by: Nathan Williams
Approved revision: 2732
Merged at revision: 2730
Proposed branch: lp:~mmcm/akiban-server/sql-flatten-expr-subquery
Merge into: lp:~akiban-technologies/akiban-server/trunk
Diff against target: 109 lines (+44/-36)
4 files modified
src/main/java/com/akiban/sql/optimizer/SubqueryFlattener.java (+40/-36)
src/test/resources/com/akiban/sql/optimizer/flatten/README.txt (+2/-0)
src/test/resources/com/akiban/sql/optimizer/flatten/select-10.expected (+1/-0)
src/test/resources/com/akiban/sql/optimizer/flatten/select-10.sql (+1/-0)
To merge this branch: bzr merge lp:~mmcm/akiban-server/sql-flatten-expr-subquery
Reviewer Review Type Date Requested Status
Nathan Williams Approve
Review via email: mp+179038@code.launchpad.net

Description of the change

Fix flattening of comparison with unique expression subquery.

If a subquery is unique (returns at most one row -- this is the basic criterion of flattening), < and < ANY are the same (etc. -- and provided that things are simple enough that UNKNOWN vs. FALSE doesn't matter). The flattener understood this, but dropped the ball at the very end in formulating the new comparison node. Its type comes from the outer comparison, not the inside of the subquery, which will be simply EXPRESSION.

To post a comment you must log in.
Revision history for this message
Nathan Williams (nwilliams) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/main/java/com/akiban/sql/optimizer/SubqueryFlattener.java'
2--- src/main/java/com/akiban/sql/optimizer/SubqueryFlattener.java 2013-06-22 18:35:49 +0000
3+++ src/main/java/com/akiban/sql/optimizer/SubqueryFlattener.java 2013-08-07 19:29:28 +0000
4@@ -221,42 +221,46 @@
5 }
6
7 int nodeType = 0;
8- switch (subqueryNode.getSubqueryType()) {
9- // TODO: The ALL and NOT_IN cases aren't actually supported here yet.
10- case IN:
11- case EQ_ANY:
12- case NOT_IN:
13- case NE_ALL:
14- nodeType = NodeTypes.BINARY_EQUALS_OPERATOR_NODE;
15- break;
16-
17- case NE_ANY:
18- case EQ_ALL:
19- nodeType = NodeTypes.BINARY_NOT_EQUALS_OPERATOR_NODE;
20- break;
21-
22- case LE_ANY:
23- case GT_ALL:
24- nodeType = NodeTypes.BINARY_LESS_EQUALS_OPERATOR_NODE;
25- break;
26-
27- case LT_ANY:
28- case GE_ALL:
29- nodeType = NodeTypes.BINARY_LESS_THAN_OPERATOR_NODE;
30- break;
31-
32- case GE_ANY:
33- case LT_ALL:
34- nodeType = NodeTypes.BINARY_GREATER_EQUALS_OPERATOR_NODE;
35- break;
36-
37- case GT_ANY:
38- case LE_ALL:
39- nodeType = NodeTypes.BINARY_GREATER_THAN_OPERATOR_NODE;
40- break;
41-
42- default:
43- assert false;
44+ if (parentComparisonOperator != null)
45+ nodeType = parentComparisonOperator.getNodeType();
46+ else {
47+ switch (subqueryNode.getSubqueryType()) {
48+ // TODO: The ALL and NOT_IN cases aren't actually supported here yet.
49+ case IN:
50+ case EQ_ANY:
51+ case NOT_IN:
52+ case NE_ALL:
53+ nodeType = NodeTypes.BINARY_EQUALS_OPERATOR_NODE;
54+ break;
55+
56+ case NE_ANY:
57+ case EQ_ALL:
58+ nodeType = NodeTypes.BINARY_NOT_EQUALS_OPERATOR_NODE;
59+ break;
60+
61+ case LE_ANY:
62+ case GT_ALL:
63+ nodeType = NodeTypes.BINARY_LESS_EQUALS_OPERATOR_NODE;
64+ break;
65+
66+ case LT_ANY:
67+ case GE_ALL:
68+ nodeType = NodeTypes.BINARY_LESS_THAN_OPERATOR_NODE;
69+ break;
70+
71+ case GE_ANY:
72+ case LT_ALL:
73+ nodeType = NodeTypes.BINARY_GREATER_EQUALS_OPERATOR_NODE;
74+ break;
75+
76+ case GT_ANY:
77+ case LE_ALL:
78+ nodeType = NodeTypes.BINARY_GREATER_THAN_OPERATOR_NODE;
79+ break;
80+
81+ default:
82+ assert false;
83+ }
84 }
85 ValueNode newNode = (ValueNode)nodeFactory.getNode(nodeType, leftOperand, rightOperand, parserContext);
86 newNode.setType(new DataTypeDescriptor(TypeId.BOOLEAN_ID, false));
87
88=== modified file 'src/test/resources/com/akiban/sql/optimizer/flatten/README.txt'
89--- src/test/resources/com/akiban/sql/optimizer/flatten/README.txt 2013-06-22 18:32:07 +0000
90+++ src/test/resources/com/akiban/sql/optimizer/flatten/README.txt 2013-08-07 19:29:28 +0000
91@@ -23,3 +23,5 @@
92 select-9: VALUES single row
93
94 select-9x: VALUES multiple rows (no change)
95+
96+select-10: outer comparison instead of ANY
97
98=== added file 'src/test/resources/com/akiban/sql/optimizer/flatten/select-10.expected'
99--- src/test/resources/com/akiban/sql/optimizer/flatten/select-10.expected 1970-01-01 00:00:00 +0000
100+++ src/test/resources/com/akiban/sql/optimizer/flatten/select-10.expected 2013-08-07 19:29:28 +0000
101@@ -0,0 +1,1 @@
102+SELECT test.child.name AS name FROM test.child, test.parent WHERE (test.parent.name = 'foo') AND ((test.child.pid > test.parent.id) AND TRUE)
103\ No newline at end of file
104
105=== added file 'src/test/resources/com/akiban/sql/optimizer/flatten/select-10.sql'
106--- src/test/resources/com/akiban/sql/optimizer/flatten/select-10.sql 1970-01-01 00:00:00 +0000
107+++ src/test/resources/com/akiban/sql/optimizer/flatten/select-10.sql 2013-08-07 19:29:28 +0000
108@@ -0,0 +1,1 @@
109+SELECT name FROM child WHERE pid > (SELECT parent.id FROM parent WHERE parent.name = 'foo')

Subscribers

People subscribed via source and target branches