Merge lp:~mmcm/akiban-server/sql-nested-map-folder into lp:~akiban-technologies/akiban-server/trunk
- sql-nested-map-folder
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Thomas Jones-Low |
Approved revision: | 2728 |
Merged at revision: | 2726 |
Proposed branch: | lp:~mmcm/akiban-server/sql-nested-map-folder |
Merge into: | lp:~akiban-technologies/akiban-server/trunk |
Diff against target: |
597 lines (+314/-24) 31 files modified
src/main/java/com/akiban/sql/optimizer/rule/MapFolder.java (+33/-12) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/README.txt (+18/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.expected (+18/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.expected (+19/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.expected (+20/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.expected (+20/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.expected (+21/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.expected (+20/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.expected (+19/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.expected (+19/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.expected (+21/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.sql (+1/-0) src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/schema.ddl (+4/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/README.txt (+6/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project-nested.expected (+4/-4) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project.expected (+3/-3) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.expected (+14/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.sql (+3/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.expected (+18/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.sql (+3/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.expected (+14/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.sql (+3/-0) src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/not-in-inner.expected (+5/-5) |
To merge this branch: | bzr merge lp:~mmcm/akiban-server/sql-nested-map-folder |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Thomas Jones-Low | Approve | ||
Review via email: mp+177664@code.launchpad.net |
Commit message
Description of the change
Correctly place operators added to implement non-group outer- and semi- joins.
These (NullIfEmpty, OnlyIfEmpty, Limit(1)) need to stay in the inside of the loop they are put in. They should not migrate down to faster loops the way ordinary single-row operators can.
As a consequence of this, outer joins (NullIfEmpty) need more often to materialize the join via Project. For instance, given t1 LEFT t2 LEFT t3, inside the t2 ⟕ t3 loop, If_Empty to supply a NULL t3, then Project(t2,t3) to implement that join, then outside that loop, but still inside the outer loop, If_Empty to supply the NULL of that join, then another Project to combine t1 and t2,t3 fields.
The code changes are relatively straightforward: the basic mechanisms were already in place, including adding Projects. This branch adds some more tests, so reviewers should convince themselves that the generated plans for those tests are correct for their queries. Also, several existing tests that would have duplicated rows from a semi-join are affected in similar ways.
Preview Diff
1 | === modified file 'src/main/java/com/akiban/sql/optimizer/rule/MapFolder.java' | |||
2 | --- src/main/java/com/akiban/sql/optimizer/rule/MapFolder.java 2013-03-22 20:05:57 +0000 | |||
3 | +++ src/main/java/com/akiban/sql/optimizer/rule/MapFolder.java 2013-07-30 18:29:34 +0000 | |||
4 | @@ -149,18 +149,7 @@ | |||
5 | 149 | map.setInner(new NullIfEmpty(map.getInner())); | 149 | map.setInner(new NullIfEmpty(map.getInner())); |
6 | 150 | break; | 150 | break; |
7 | 151 | case SEMI: | 151 | case SEMI: |
20 | 152 | { | 152 | map.setInner(new Limit(map.getInner(), 1)); |
9 | 153 | PlanNode inner = map.getInner(); | ||
10 | 154 | if ((inner instanceof Select) && | ||
11 | 155 | ((Select)inner).getConditions().isEmpty()) | ||
12 | 156 | inner = ((Select)inner).getInput(); | ||
13 | 157 | // Right-nested semi-joins only need one Limit, since | ||
14 | 158 | // all the effects happen inside the fastest loop. | ||
15 | 159 | if (!((inner instanceof MapJoin) && | ||
16 | 160 | ((MapJoin)inner).getJoinType() == JoinNode.JoinType.SEMI)) | ||
17 | 161 | inner = new Limit(map.getInner(), 1); | ||
18 | 162 | map.setInner(inner); | ||
19 | 163 | } | ||
21 | 164 | break; | 153 | break; |
22 | 165 | case ANTI: | 154 | case ANTI: |
23 | 166 | map.setInner(new OnlyIfEmpty(map.getInner())); | 155 | map.setInner(new OnlyIfEmpty(map.getInner())); |
24 | @@ -204,11 +193,21 @@ | |||
25 | 204 | (parent instanceof ResultSet) || | 193 | (parent instanceof ResultSet) || |
26 | 205 | (parent instanceof AggregateSource) || | 194 | (parent instanceof AggregateSource) || |
27 | 206 | (parent instanceof Sort) || | 195 | (parent instanceof Sort) || |
28 | 196 | (parent instanceof NullIfEmpty) || | ||
29 | 197 | (parent instanceof OnlyIfEmpty) || | ||
30 | 198 | (parent instanceof Limit) || | ||
31 | 207 | // Captures enough at the edge of the inside. | 199 | // Captures enough at the edge of the inside. |
32 | 208 | (child instanceof Project) || | 200 | (child instanceof Project) || |
33 | 209 | (child instanceof UpdateInput))); | 201 | (child instanceof UpdateInput))); |
34 | 210 | if (child != map) { | 202 | if (child != map) { |
35 | 211 | PlanNode inner = map.getInner(); | 203 | PlanNode inner = map.getInner(); |
36 | 204 | // Add a Project to capture fields within the loop before | ||
37 | 205 | // leaving the scope of its outer binding, that is, | ||
38 | 206 | // materialize the join as a projected row. | ||
39 | 207 | // The cases where this is needed are: | ||
40 | 208 | // (1) This loop is itself on the outer side of another loop. | ||
41 | 209 | // (2) It implements the nullable side of an outer join. | ||
42 | 210 | // (3) Nested inside and so feeding another instance of (2) or (3). | ||
43 | 212 | if (parent instanceof MapJoin) { | 211 | if (parent instanceof MapJoin) { |
44 | 213 | MapJoinProject nested = findAddedProject((MapJoin)parent, | 212 | MapJoinProject nested = findAddedProject((MapJoin)parent, |
45 | 214 | mapJoinProjects); | 213 | mapJoinProjects); |
46 | @@ -226,12 +225,31 @@ | |||
47 | 226 | nested, mapJoinProjects); | 225 | nested, mapJoinProjects); |
48 | 227 | } | 226 | } |
49 | 228 | } | 227 | } |
50 | 228 | else if (parent instanceof NullIfEmpty) { | ||
51 | 229 | // Even though we stop at the outer join, we still | ||
52 | 230 | // need to find the map that it's contained in. | ||
53 | 231 | PlanNode ancestor = parent; | ||
54 | 232 | do { | ||
55 | 233 | ancestor = ancestor.getOutput(); | ||
56 | 234 | } while ((ancestor instanceof Select) || | ||
57 | 235 | (ancestor instanceof Project)); | ||
58 | 236 | if (ancestor instanceof MapJoin) { | ||
59 | 237 | MapJoinProject nested = findAddedProject((MapJoin)ancestor, | ||
60 | 238 | mapJoinProjects); | ||
61 | 239 | inner = addProject((MapJoin)ancestor, map, inner, | ||
62 | 240 | nested, mapJoinProjects); | ||
63 | 241 | } | ||
64 | 242 | } | ||
65 | 229 | map.getOutput().replaceInput(map, inner); | 243 | map.getOutput().replaceInput(map, inner); |
66 | 230 | parent.replaceInput(child, map); | 244 | parent.replaceInput(child, map); |
67 | 231 | map.setInner(child); | 245 | map.setInner(child); |
68 | 232 | } | 246 | } |
69 | 233 | } | 247 | } |
70 | 234 | 248 | ||
71 | 249 | // A pending Project used to capture bindings inside the loop. | ||
72 | 250 | // When complete, we will walk the tree to determine which fields, | ||
73 | 251 | // if any, from its scope are used downstream and capture them or | ||
74 | 252 | // else throw the Project away. | ||
75 | 235 | static class MapJoinProject implements PlanVisitor, ExpressionVisitor { | 253 | static class MapJoinProject implements PlanVisitor, ExpressionVisitor { |
76 | 236 | MapJoin parentMap, childMap; | 254 | MapJoin parentMap, childMap; |
77 | 237 | MapJoinProject nested; | 255 | MapJoinProject nested; |
78 | @@ -269,6 +287,7 @@ | |||
79 | 269 | this.innerSources = innerSources; | 287 | this.innerSources = innerSources; |
80 | 270 | } | 288 | } |
81 | 271 | 289 | ||
82 | 290 | // Are any of the inner bindings used outer? | ||
83 | 272 | public boolean find() { | 291 | public boolean find() { |
84 | 273 | columns = new ArrayList<>(); | 292 | columns = new ArrayList<>(); |
85 | 274 | for (MapJoinProject loop = this; loop != null; loop = loop.nested) { | 293 | for (MapJoinProject loop = this; loop != null; loop = loop.nested) { |
86 | @@ -280,6 +299,7 @@ | |||
87 | 280 | return foundOuter; | 299 | return foundOuter; |
88 | 281 | } | 300 | } |
89 | 282 | 301 | ||
90 | 302 | // Actually install field expressions for this Project. | ||
91 | 283 | public void install() { | 303 | public void install() { |
92 | 284 | Set<ColumnExpression> seen = new HashSet<>(); | 304 | Set<ColumnExpression> seen = new HashSet<>(); |
93 | 285 | for (ColumnExpression column : columns) { | 305 | for (ColumnExpression column : columns) { |
94 | @@ -289,6 +309,7 @@ | |||
95 | 289 | } | 309 | } |
96 | 290 | } | 310 | } |
97 | 291 | 311 | ||
98 | 312 | // Splice this unneeded Project out. | ||
99 | 292 | public void remove() { | 313 | public void remove() { |
100 | 293 | project.getOutput().replaceInput(project, project.getInput()); | 314 | project.getOutput().replaceInput(project, project.getInput()); |
101 | 294 | project = null; | 315 | project = null; |
102 | 295 | 316 | ||
103 | === modified file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/README.txt' | |||
104 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/README.txt 2012-09-05 21:30:52 +0000 | |||
105 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/README.txt 2013-07-30 18:29:34 +0000 | |||
106 | @@ -1,5 +1,23 @@ | |||
107 | 1 | aggregate: Aggregation with nested loops | 1 | aggregate: Aggregation with nested loops |
108 | 2 | 2 | ||
109 | 3 | nested-inner-inner: Nested joins: inner then inner | ||
110 | 4 | |||
111 | 5 | nested-inner-left: Nested joins: inner then left | ||
112 | 6 | |||
113 | 7 | nested-inner-right: Nested joins: inner then right | ||
114 | 8 | |||
115 | 9 | nested-left-inner: Nested joins: left then inner | ||
116 | 10 | |||
117 | 11 | nested-left-left: Nested joins: left then left | ||
118 | 12 | |||
119 | 13 | nested-left-right: Nested joins: left then right | ||
120 | 14 | |||
121 | 15 | nested-right-inner: Nested joins: right then inner | ||
122 | 16 | |||
123 | 17 | nested-right-left: Nested joins: right then left | ||
124 | 18 | |||
125 | 19 | nested-right-right: Nested joins: right then right | ||
126 | 20 | |||
127 | 3 | outer: Outer join across groups. | 21 | outer: Outer join across groups. |
128 | 4 | 22 | ||
129 | 5 | outer-join-condition: Outer join with another condition. | 23 | outer-join-condition: Outer join with another condition. |
130 | 6 | 24 | ||
131 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.expected' | |||
132 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.expected 1970-01-01 00:00:00 +0000 | |||
133 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.expected 2013-07-30 18:29:34 +0000 | |||
134 | @@ -0,0 +1,18 @@ | |||
135 | 1 | SelectQuery@6f8affe | ||
136 | 2 | ResultSet@30ea5045[id, s, id, s, id, s] | ||
137 | 3 | MapJoin@ca7bd3d() | ||
138 | 4 | Flatten@6fe01bb8(t1) | ||
139 | 5 | GroupScan@5878f648(Group(test.t1), rows = 1, cost = 0.00000) | ||
140 | 6 | TableSource@1c26ffc6(t1 - TableGroup@44622e9a(t1)) | ||
141 | 7 | MapJoin@6d711e58() | ||
142 | 8 | Flatten@623c0669(t2) | ||
143 | 9 | Select@1d7f5b8a[t2.id == t1.id] | ||
144 | 10 | GroupScan@1452d027(Group(test.t2), rows = 1, cost = 0.00000) | ||
145 | 11 | TableSource@58fc4d0e(t2 - TableGroup@9e1a389(t2)) | ||
146 | 12 | Project@673bfb19[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
147 | 13 | Select@12e25b42[] | ||
148 | 14 | Select@48dfbadd[] | ||
149 | 15 | Flatten@52c909e1(t3) | ||
150 | 16 | AncestorLookup@5865288b(t3 -> [t3]) | ||
151 | 17 | SingleIndexScan@5948eb03(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
152 | 18 | TableSource@2d3c68ad(t3 - TableGroup@3cb77c70(t3)) | ||
153 | 0 | \ No newline at end of file | 19 | \ No newline at end of file |
154 | 1 | 20 | ||
155 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.sql' | |||
156 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.sql 1970-01-01 00:00:00 +0000 | |||
157 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-inner.sql 2013-07-30 18:29:34 +0000 | |||
158 | @@ -0,0 +1,1 @@ | |||
159 | 1 | SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id INNER JOIN t3 ON t2.id = t3.id | ||
160 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
161 | 1 | 3 | ||
162 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.expected' | |||
163 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.expected 1970-01-01 00:00:00 +0000 | |||
164 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.expected 2013-07-30 18:29:34 +0000 | |||
165 | @@ -0,0 +1,19 @@ | |||
166 | 1 | SelectQuery@34a7c644 | ||
167 | 2 | ResultSet@72c9b55d[id, s, id, s, id, s] | ||
168 | 3 | MapJoin@35f9de2() | ||
169 | 4 | Flatten@7b020cf2(t1) | ||
170 | 5 | GroupScan@7a766228(Group(test.t1), rows = 1, cost = 0.00000) | ||
171 | 6 | TableSource@5e1f9277(t1 - TableGroup@72266ee7(t1)) | ||
172 | 7 | MapJoin@393b3a3d() | ||
173 | 8 | Flatten@43a022f5(t2) | ||
174 | 9 | Select@5f6c9825[t2.id == t1.id] | ||
175 | 10 | GroupScan@5278d614(Group(test.t2), rows = 1, cost = 0.00000) | ||
176 | 11 | TableSource@42dd975(t2 - TableGroup@7b2ee558(t2)) | ||
177 | 12 | Project@18a2278b[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
178 | 13 | Select@3dd2234f[] | ||
179 | 14 | Select@43d33396[] | ||
180 | 15 | NullIfEmpty@5edfdfa3 | ||
181 | 16 | Flatten@46572582(t3) | ||
182 | 17 | AncestorLookup@3bd376fe(t3 -> [t3]) | ||
183 | 18 | SingleIndexScan@38293c61(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
184 | 19 | TableSource@6ac8f2e7(t3 - TableGroup@1b3b2115(t3)) | ||
185 | 0 | \ No newline at end of file | 20 | \ No newline at end of file |
186 | 1 | 21 | ||
187 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.sql' | |||
188 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.sql 1970-01-01 00:00:00 +0000 | |||
189 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-left.sql 2013-07-30 18:29:34 +0000 | |||
190 | @@ -0,0 +1,1 @@ | |||
191 | 1 | SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id | ||
192 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
193 | 1 | 3 | ||
194 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.expected' | |||
195 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.expected 1970-01-01 00:00:00 +0000 | |||
196 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.expected 2013-07-30 18:29:34 +0000 | |||
197 | @@ -0,0 +1,20 @@ | |||
198 | 1 | SelectQuery@6dd64b31 | ||
199 | 2 | ResultSet@fe2b64d[id, s, id, s, id, s] | ||
200 | 3 | MapJoin@788f8d68() | ||
201 | 4 | Flatten@6a8d819(t3) | ||
202 | 5 | GroupScan@188ce4ae(Group(test.t3), rows = 1, cost = 0.00000) | ||
203 | 6 | TableSource@4252736f(t3 - TableGroup@49f96819(t3)) | ||
204 | 7 | Project@6d2e8160[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
205 | 8 | Select@82ffda0[] | ||
206 | 9 | NullIfEmpty@3966e4fa | ||
207 | 10 | MapJoin@15216740() | ||
208 | 11 | Flatten@370354b9(t1) | ||
209 | 12 | GroupScan@4401a596(Group(test.t1), rows = 1, cost = 0.00000) | ||
210 | 13 | TableSource@15492050(t1 - TableGroup@481e3dbb(t1)) | ||
211 | 14 | Select@3baf59e6[] | ||
212 | 15 | Project@406793be[t1.id, t2.id, t1.s, t2.s] | ||
213 | 16 | Flatten@753729a6(t2) | ||
214 | 17 | AncestorLookup@1242f687(t2 -> [t2]) | ||
215 | 18 | Select@6a47226e[t3.id == t2.id] | ||
216 | 19 | SingleIndexScan@64259a44(Index(test.t2.PRIMARY[IndexColumn(id)]), NONE, =t1.id, rows = 1, cost = 11.9848) | ||
217 | 20 | TableSource@33189e6d(t2 - TableGroup@60b319b9(t2)) | ||
218 | 0 | \ No newline at end of file | 21 | \ No newline at end of file |
219 | 1 | 22 | ||
220 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.sql' | |||
221 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.sql 1970-01-01 00:00:00 +0000 | |||
222 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-inner-right.sql 2013-07-30 18:29:34 +0000 | |||
223 | @@ -0,0 +1,1 @@ | |||
224 | 1 | SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id | ||
225 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
226 | 1 | 3 | ||
227 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.expected' | |||
228 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.expected 1970-01-01 00:00:00 +0000 | |||
229 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.expected 2013-07-30 18:29:34 +0000 | |||
230 | @@ -0,0 +1,20 @@ | |||
231 | 1 | SelectQuery@773bf444 | ||
232 | 2 | ResultSet@121d984[id, s, id, s, id, s] | ||
233 | 3 | MapJoin@14336855() | ||
234 | 4 | Flatten@12d86228(t1) | ||
235 | 5 | GroupScan@3b06aecf(Group(test.t1), rows = 1, cost = 0.00000) | ||
236 | 6 | TableSource@765bf858(t1 - TableGroup@33beb64f(t1)) | ||
237 | 7 | Project@554f69b0[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
238 | 8 | Select@50a3cd91[] | ||
239 | 9 | NullIfEmpty@17db7729 | ||
240 | 10 | MapJoin@2db31713() | ||
241 | 11 | Flatten@3c1439c2(t2) | ||
242 | 12 | Select@48aff7d5[t2.id == t1.id] | ||
243 | 13 | GroupScan@18b7e63b(Group(test.t2), rows = 1, cost = 0.00000) | ||
244 | 14 | TableSource@2b72af70(t2 - TableGroup@516c382a(t2)) | ||
245 | 15 | Select@496c30fb[] | ||
246 | 16 | Project@781ffa5a[t2.id, t2.s, t3.id, t3.s] | ||
247 | 17 | Flatten@53dc0e5e(t3) | ||
248 | 18 | AncestorLookup@5e03d465(t3 -> [t3]) | ||
249 | 19 | SingleIndexScan@4d6d631b(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
250 | 20 | TableSource@4ec2506(t3 - TableGroup@4885a953(t3)) | ||
251 | 0 | \ No newline at end of file | 21 | \ No newline at end of file |
252 | 1 | 22 | ||
253 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.sql' | |||
254 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.sql 1970-01-01 00:00:00 +0000 | |||
255 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-inner.sql 2013-07-30 18:29:34 +0000 | |||
256 | @@ -0,0 +1,1 @@ | |||
257 | 1 | SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id INNER JOIN t3 ON t2.id = t3.id | ||
258 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
259 | 1 | 3 | ||
260 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.expected' | |||
261 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.expected 1970-01-01 00:00:00 +0000 | |||
262 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.expected 2013-07-30 18:29:34 +0000 | |||
263 | @@ -0,0 +1,21 @@ | |||
264 | 1 | SelectQuery@5b3a7993 | ||
265 | 2 | ResultSet@5c03d0af[id, s, id, s, id, s] | ||
266 | 3 | MapJoin@1b85f4a1() | ||
267 | 4 | Flatten@72b85245(t1) | ||
268 | 5 | GroupScan@777f8424(Group(test.t1), rows = 1, cost = 0.00000) | ||
269 | 6 | TableSource@7dc52fe(t1 - TableGroup@54bc94c6(t1)) | ||
270 | 7 | Project@7e79c05a[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
271 | 8 | Select@6b439594[] | ||
272 | 9 | NullIfEmpty@15282f42 | ||
273 | 10 | MapJoin@28cb7ea0() | ||
274 | 11 | Flatten@23216ada(t2) | ||
275 | 12 | Select@47e64f4c[t2.id == t1.id] | ||
276 | 13 | GroupScan@61602b74(Group(test.t2), rows = 1, cost = 0.00000) | ||
277 | 14 | TableSource@154587e3(t2 - TableGroup@70c4fe9d(t2)) | ||
278 | 15 | Select@136a0e8[] | ||
279 | 16 | Project@7d558b0e[t2.id, t2.s, t3.id, t3.s] | ||
280 | 17 | NullIfEmpty@297ddff7 | ||
281 | 18 | Flatten@66ee203a(t3) | ||
282 | 19 | AncestorLookup@6fae669(t3 -> [t3]) | ||
283 | 20 | SingleIndexScan@422cfb13(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
284 | 21 | TableSource@36d7da6e(t3 - TableGroup@1717be56(t3)) | ||
285 | 0 | \ No newline at end of file | 22 | \ No newline at end of file |
286 | 1 | 23 | ||
287 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.sql' | |||
288 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.sql 1970-01-01 00:00:00 +0000 | |||
289 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-left.sql 2013-07-30 18:29:34 +0000 | |||
290 | @@ -0,0 +1,1 @@ | |||
291 | 1 | SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id | ||
292 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
293 | 1 | 3 | ||
294 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.expected' | |||
295 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.expected 1970-01-01 00:00:00 +0000 | |||
296 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.expected 2013-07-30 18:29:34 +0000 | |||
297 | @@ -0,0 +1,20 @@ | |||
298 | 1 | SelectQuery@47d13cd | ||
299 | 2 | ResultSet@2f9efa08[id, s, id, s, id, s] | ||
300 | 3 | MapJoin@41cc788f() | ||
301 | 4 | Flatten@7138ebd2(t3) | ||
302 | 5 | GroupScan@56ff1608(Group(test.t3), rows = 1, cost = 0.00000) | ||
303 | 6 | TableSource@492c032(t3 - TableGroup@4ff93d7(t3)) | ||
304 | 7 | Project@6e313ba4[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
305 | 8 | Select@6242c480[] | ||
306 | 9 | NullIfEmpty@c2a3624 | ||
307 | 10 | MapJoin@27430ad1() | ||
308 | 11 | Flatten@50026210(t1) | ||
309 | 12 | GroupScan@227b337a(Group(test.t1), rows = 1, cost = 0.00000) | ||
310 | 13 | TableSource@5818428c(t1 - TableGroup@4670a045(t1)) | ||
311 | 14 | Select@4c743179[t3.id == t2.id] | ||
312 | 15 | Project@7e1c0bf9[t1.id, t2.id, t1.s, t2.s] | ||
313 | 16 | NullIfEmpty@27487bb9 | ||
314 | 17 | Flatten@605c2625(t2) | ||
315 | 18 | AncestorLookup@7b2c2d5(t2 -> [t2]) | ||
316 | 19 | SingleIndexScan@691531e5(Index(test.t2.PRIMARY[IndexColumn(id)]), NONE, =t1.id, rows = 1, cost = 11.9848) | ||
317 | 20 | TableSource@3e8814f6(t2 - TableGroup@6e7ee748(t2)) | ||
318 | 0 | \ No newline at end of file | 21 | \ No newline at end of file |
319 | 1 | 22 | ||
320 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.sql' | |||
321 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.sql 1970-01-01 00:00:00 +0000 | |||
322 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-left-right.sql 2013-07-30 18:29:34 +0000 | |||
323 | @@ -0,0 +1,1 @@ | |||
324 | 1 | SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id | ||
325 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
326 | 1 | 3 | ||
327 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.expected' | |||
328 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.expected 1970-01-01 00:00:00 +0000 | |||
329 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.expected 2013-07-30 18:29:34 +0000 | |||
330 | @@ -0,0 +1,19 @@ | |||
331 | 1 | SelectQuery@70a66e76 | ||
332 | 2 | ResultSet@3e9e3ec1[id, s, id, s, id, s] | ||
333 | 3 | MapJoin@73bf3f3f() | ||
334 | 4 | Flatten@5f0b23d8(t3) | ||
335 | 5 | GroupScan@10d17c77(Group(test.t3), rows = 1, cost = 0.00000) | ||
336 | 6 | TableSource@3fbd8be(t3 - TableGroup@29427141(t3)) | ||
337 | 7 | MapJoin@49197790() | ||
338 | 8 | Flatten@545e6aa7(t2) | ||
339 | 9 | Select@26f8b46e[t3.id == t2.id] | ||
340 | 10 | GroupScan@120db5bf(Group(test.t2), rows = 1, cost = 0.00000) | ||
341 | 11 | TableSource@b52a3fd(t2 - TableGroup@421717db(t2)) | ||
342 | 12 | Project@72a1105[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
343 | 13 | Select@5ac362ef[] | ||
344 | 14 | Select@7a1f4cc2[] | ||
345 | 15 | NullIfEmpty@1ce89331 | ||
346 | 16 | Flatten@2ac2537(t1) | ||
347 | 17 | AncestorLookup@691784ca(t1 -> [t1]) | ||
348 | 18 | SingleIndexScan@70f1fad(Index(test.t1.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
349 | 19 | TableSource@5e8c3cd9(t1 - TableGroup@71e89a79(t1)) | ||
350 | 0 | \ No newline at end of file | 20 | \ No newline at end of file |
351 | 1 | 21 | ||
352 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.sql' | |||
353 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.sql 1970-01-01 00:00:00 +0000 | |||
354 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-inner.sql 2013-07-30 18:29:34 +0000 | |||
355 | @@ -0,0 +1,1 @@ | |||
356 | 1 | SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id INNER JOIN t3 ON t2.id = t3.id | ||
357 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
358 | 1 | 3 | ||
359 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.expected' | |||
360 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.expected 1970-01-01 00:00:00 +0000 | |||
361 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.expected 2013-07-30 18:29:34 +0000 | |||
362 | @@ -0,0 +1,19 @@ | |||
363 | 1 | SelectQuery@7eba8a14 | ||
364 | 2 | ResultSet@8bf680c[id, s, id, s, id, s] | ||
365 | 3 | MapJoin@630fa3df() | ||
366 | 4 | Flatten@5ddbcc3d(t2) | ||
367 | 5 | GroupScan@17cfb848(Group(test.t2), rows = 1, cost = 0.00000) | ||
368 | 6 | TableSource@6f6ce13f(t2 - TableGroup@464b8b2e(t2)) | ||
369 | 7 | MapJoin@99e9d10() | ||
370 | 8 | NullIfEmpty@c598a5f | ||
371 | 9 | Flatten@93de8ef(t1) | ||
372 | 10 | AncestorLookup@4a8b694e(t1 -> [t1]) | ||
373 | 11 | SingleIndexScan@6aea61e(Index(test.t1.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
374 | 12 | TableSource@5538283f(t1 - TableGroup@341bfeff(t1)) | ||
375 | 13 | Project@4e47f050[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
376 | 14 | Select@54f23c56[] | ||
377 | 15 | NullIfEmpty@1a023213 | ||
378 | 16 | Flatten@3f87a7a6(t3) | ||
379 | 17 | AncestorLookup@6258abc(t3 -> [t3]) | ||
380 | 18 | SingleIndexScan@ab73fcb(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
381 | 19 | TableSource@48d07bc1(t3 - TableGroup@4bd2dec(t3)) | ||
382 | 0 | \ No newline at end of file | 20 | \ No newline at end of file |
383 | 1 | 21 | ||
384 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.sql' | |||
385 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.sql 1970-01-01 00:00:00 +0000 | |||
386 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-left.sql 2013-07-30 18:29:34 +0000 | |||
387 | @@ -0,0 +1,1 @@ | |||
388 | 1 | SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id | ||
389 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
390 | 1 | 3 | ||
391 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.expected' | |||
392 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.expected 1970-01-01 00:00:00 +0000 | |||
393 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.expected 2013-07-30 18:29:34 +0000 | |||
394 | @@ -0,0 +1,21 @@ | |||
395 | 1 | SelectQuery@5f42920f | ||
396 | 2 | ResultSet@b8347a5[id, s, id, s, id, s] | ||
397 | 3 | MapJoin@2711edd3() | ||
398 | 4 | Flatten@4d45a08d(t3) | ||
399 | 5 | GroupScan@a14cbaf(Group(test.t3), rows = 1, cost = 0.00000) | ||
400 | 6 | TableSource@577ab9(t3 - TableGroup@5b485354(t3)) | ||
401 | 7 | Project@57d4a78a[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s] | ||
402 | 8 | Select@4a438212[] | ||
403 | 9 | NullIfEmpty@2013d7b | ||
404 | 10 | MapJoin@6956de9d() | ||
405 | 11 | Flatten@162fb09d(t2) | ||
406 | 12 | Select@46314b72[t3.id == t2.id] | ||
407 | 13 | GroupScan@4e504d5e(Group(test.t2), rows = 1, cost = 0.00000) | ||
408 | 14 | TableSource@6f3a07db(t2 - TableGroup@7a077e7c(t2)) | ||
409 | 15 | Select@1f6b5744[] | ||
410 | 16 | Project@3548a494[t2.id, t1.id, t1.s, t2.s] | ||
411 | 17 | NullIfEmpty@402e4179 | ||
412 | 18 | Flatten@14f41ecc(t1) | ||
413 | 19 | AncestorLookup@1ccc8fda(t1 -> [t1]) | ||
414 | 20 | SingleIndexScan@39f83ffb(Index(test.t1.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848) | ||
415 | 21 | TableSource@4ad9f3e9(t1 - TableGroup@59309578(t1)) | ||
416 | 0 | \ No newline at end of file | 22 | \ No newline at end of file |
417 | 1 | 23 | ||
418 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.sql' | |||
419 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.sql 1970-01-01 00:00:00 +0000 | |||
420 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/nested-right-right.sql 2013-07-30 18:29:34 +0000 | |||
421 | @@ -0,0 +1,1 @@ | |||
422 | 1 | SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id | ||
423 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
424 | 1 | 3 | ||
425 | === modified file 'src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/schema.ddl' | |||
426 | --- src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/schema.ddl 2012-02-26 19:35:32 +0000 | |||
427 | +++ src/test/resources/com/akiban/sql/optimizer/rule/fold-maps/schema.ddl 2013-07-30 18:29:34 +0000 | |||
428 | @@ -41,3 +41,7 @@ | |||
429 | 41 | GROUPING FOREIGN KEY (cid) REFERENCES customers(cid) | 41 | GROUPING FOREIGN KEY (cid) REFERENCES customers(cid) |
430 | 42 | ); | 42 | ); |
431 | 43 | CREATE INDEX state ON addresses(state); | 43 | CREATE INDEX state ON addresses(state); |
432 | 44 | |||
433 | 45 | CREATE TABLE t1(id INT PRIMARY KEY NOT NULL, s VARCHAR(10)); | ||
434 | 46 | CREATE TABLE t2(id INT PRIMARY KEY NOT NULL, s VARCHAR(10)); | ||
435 | 47 | CREATE TABLE t3(id INT PRIMARY KEY NOT NULL, s VARCHAR(10)); | ||
436 | 44 | 48 | ||
437 | === modified file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/README.txt' | |||
438 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/README.txt 2013-01-08 23:18:56 +0000 | |||
439 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/README.txt 2013-07-30 18:29:34 +0000 | |||
440 | @@ -33,3 +33,9 @@ | |||
441 | 33 | map-join-project: Need both sides of outer loop. | 33 | map-join-project: Need both sides of outer loop. |
442 | 34 | 34 | ||
443 | 35 | map-join-project-nested: Needed in inner loop because outer loop is like that. | 35 | map-join-project-nested: Needed in inner loop because outer loop is like that. |
444 | 36 | |||
445 | 37 | nested-in: nested semi-joins | ||
446 | 38 | |||
447 | 39 | nested-not-in: nested anti-joins | ||
448 | 40 | |||
449 | 41 | nested-in-not: nested semi inside anti | ||
450 | 36 | 42 | ||
451 | === modified file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project-nested.expected' | |||
452 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project-nested.expected 2013-01-08 22:14:51 +0000 | |||
453 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project-nested.expected 2013-07-30 18:29:34 +0000 | |||
454 | @@ -3,10 +3,10 @@ | |||
455 | 3 | MapJoin@6dca323d() | 3 | MapJoin@6dca323d() |
456 | 4 | SingleIndexScan@75a87b1a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | 4 | SingleIndexScan@75a87b1a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) |
457 | 5 | MapJoin@82a244f() | 5 | MapJoin@82a244f() |
462 | 6 | MapJoin@6b5c2b9() | 6 | NullIfEmpty@66374dc7 |
463 | 7 | Select@7030320[c3.name == c2.name] | 7 | MapJoin@6b5c2b9() |
464 | 8 | SingleIndexScan@56c22d78(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | 8 | Select@7030320[c3.name == c2.name] |
465 | 9 | NullIfEmpty@66374dc7 | 9 | SingleIndexScan@56c22d78(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) |
466 | 10 | Select@4663a6c1[] | 10 | Select@4663a6c1[] |
467 | 11 | MapJoin@38d3783e() | 11 | MapJoin@38d3783e() |
468 | 12 | SingleIndexScan@437b4b97(Index(test.customers.name[IndexColumn(name)]), covering/NONE, =c2.name, rows = 1, cost = 6.04220) | 12 | SingleIndexScan@437b4b97(Index(test.customers.name[IndexColumn(name)]), covering/NONE, =c2.name, rows = 1, cost = 6.04220) |
469 | 13 | 13 | ||
470 | === modified file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project.expected' | |||
471 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project.expected 2013-01-08 22:14:51 +0000 | |||
472 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/map-join-project.expected 2013-07-30 18:29:34 +0000 | |||
473 | @@ -3,9 +3,9 @@ | |||
474 | 3 | MapJoin@273d638c() | 3 | MapJoin@273d638c() |
475 | 4 | SingleIndexScan@2f529074(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | 4 | SingleIndexScan@2f529074(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) |
476 | 5 | MapJoin@24ebb33() | 5 | MapJoin@24ebb33() |
480 | 6 | MapJoin@7ee41273() | 6 | NullIfEmpty@4db64e4e |
481 | 7 | SingleIndexScan@2f777d1a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | 7 | MapJoin@7ee41273() |
482 | 8 | NullIfEmpty@4db64e4e | 8 | SingleIndexScan@2f777d1a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) |
483 | 9 | Select@2ec72eb4[] | 9 | Select@2ec72eb4[] |
484 | 10 | Project@7bcf0abd[c1.name, c1.cid] | 10 | Project@7bcf0abd[c1.name, c1.cid] |
485 | 11 | Select@55ca3dcb[c3.name == c2.name] | 11 | Select@55ca3dcb[c3.name == c2.name] |
486 | 12 | 12 | ||
487 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.expected' | |||
488 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.expected 1970-01-01 00:00:00 +0000 | |||
489 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.expected 2013-07-30 18:29:34 +0000 | |||
490 | @@ -0,0 +1,14 @@ | |||
491 | 1 | SelectQuery@338c94e3 | ||
492 | 2 | ResultSet@5282dd85[name] | ||
493 | 3 | MapJoin@52a6490c() | ||
494 | 4 | SingleIndexScan@2305dd38(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | ||
495 | 5 | Project@d9d7115[customers.name] | ||
496 | 6 | Select@5b6b20ae[] | ||
497 | 7 | OnlyIfEmpty@2dfd1d0c | ||
498 | 8 | MapJoin@55fe997e() | ||
499 | 9 | Select@3e0f4b4d[customers.cid == orders.cid] | ||
500 | 10 | SingleIndexScan@5e18cc0f(Index(test.orders.__akiban_fk_0[IndexColumn(cid)]), covering/NONE, rows = 1000, cost = 688.942) | ||
501 | 11 | Select@66261964[] | ||
502 | 12 | Limit@447e166a(LIMIT 1) | ||
503 | 13 | Select@4f4d28a0[orders.oid == items.oid] | ||
504 | 14 | SingleIndexScan@31f1ac47(Index(test.items.sku[IndexColumn(sku)]), covering/NONE, =1234, rows = 97, cost = 158.981) | ||
505 | 0 | \ No newline at end of file | 15 | \ No newline at end of file |
506 | 1 | 16 | ||
507 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.sql' | |||
508 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.sql 1970-01-01 00:00:00 +0000 | |||
509 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in-not.sql 2013-07-30 18:29:34 +0000 | |||
510 | @@ -0,0 +1,3 @@ | |||
511 | 1 | SELECT name FROM customers | ||
512 | 2 | WHERE cid NOT IN (SELECT cid FROM orders | ||
513 | 3 | WHERE oid IN (SELECT oid FROM items WHERE sku = '1234')) | ||
514 | 0 | \ No newline at end of file | 4 | \ No newline at end of file |
515 | 1 | 5 | ||
516 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.expected' | |||
517 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.expected 1970-01-01 00:00:00 +0000 | |||
518 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.expected 2013-07-30 18:29:34 +0000 | |||
519 | @@ -0,0 +1,18 @@ | |||
520 | 1 | SelectQuery@270cd144 | ||
521 | 2 | ResultSet@3a7edb63[name] | ||
522 | 3 | MapJoin@30944cb9() | ||
523 | 4 | SingleIndexScan@58391e99(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | ||
524 | 5 | Project@5e755e95[customers.name] | ||
525 | 6 | Select@6b94b8a5[] | ||
526 | 7 | Limit@2f7708ec(LIMIT 1) | ||
527 | 8 | MapJoin@e07fc0f() | ||
528 | 9 | Select@2e3543fb[customers.cid == orders.cid] | ||
529 | 10 | SingleIndexScan@2b022b70(Index(test.orders.__akiban_fk_0[IndexColumn(cid)]), covering/NONE, rows = 1000, cost = 688.942) | ||
530 | 11 | Select@9a6f6ca[] | ||
531 | 12 | Limit@1b71dc1f(LIMIT 1) | ||
532 | 13 | Select@b80fa71[] | ||
533 | 14 | Flatten@457514c6(items) | ||
534 | 15 | Select@502a854c[items.sku == 1234] | ||
535 | 16 | AncestorLookup@179569b2(items -> [items]) | ||
536 | 17 | SingleIndexScan@524e3136(Index(test.items.__akiban_fk_1[IndexColumn(oid)]), NONE, =orders.oid, rows = 1, cost = 188.762) | ||
537 | 18 | TableSource@b849d5c(items - TableGroup@b80fa71(customers)) | ||
538 | 0 | \ No newline at end of file | 19 | \ No newline at end of file |
539 | 1 | 20 | ||
540 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.sql' | |||
541 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.sql 1970-01-01 00:00:00 +0000 | |||
542 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-in.sql 2013-07-30 18:29:34 +0000 | |||
543 | @@ -0,0 +1,3 @@ | |||
544 | 1 | SELECT name FROM customers | ||
545 | 2 | WHERE cid IN (SELECT cid FROM orders | ||
546 | 3 | WHERE oid IN (SELECT oid FROM items WHERE sku = '1234')) | ||
547 | 0 | \ No newline at end of file | 4 | \ No newline at end of file |
548 | 1 | 5 | ||
549 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.expected' | |||
550 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.expected 1970-01-01 00:00:00 +0000 | |||
551 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.expected 2013-07-30 18:29:34 +0000 | |||
552 | @@ -0,0 +1,14 @@ | |||
553 | 1 | SelectQuery@173d3c4c | ||
554 | 2 | ResultSet@3541ad7f[name] | ||
555 | 3 | MapJoin@6a58f699() | ||
556 | 4 | SingleIndexScan@76a5ed5a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | ||
557 | 5 | Project@6ae58829[customers.name] | ||
558 | 6 | Select@34e7293[] | ||
559 | 7 | OnlyIfEmpty@29662a39 | ||
560 | 8 | MapJoin@781ec91() | ||
561 | 9 | Select@62d22770[customers.cid == orders.cid] | ||
562 | 10 | SingleIndexScan@531b5cbf(Index(test.orders.__akiban_fk_0[IndexColumn(cid)]), covering/NONE, rows = 1000, cost = 688.942) | ||
563 | 11 | Select@7cc50827[] | ||
564 | 12 | OnlyIfEmpty@725e196a | ||
565 | 13 | Select@6b9a786f[orders.oid == items.oid] | ||
566 | 14 | SingleIndexScan@7fd6b8ce(Index(test.items.sku[IndexColumn(sku)]), covering/NONE, =1234, rows = 97, cost = 158.981) | ||
567 | 0 | \ No newline at end of file | 15 | \ No newline at end of file |
568 | 1 | 16 | ||
569 | === added file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.sql' | |||
570 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.sql 1970-01-01 00:00:00 +0000 | |||
571 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/nested-not-in.sql 2013-07-30 18:29:34 +0000 | |||
572 | @@ -0,0 +1,3 @@ | |||
573 | 1 | SELECT name FROM customers | ||
574 | 2 | WHERE cid NOT IN (SELECT cid FROM orders | ||
575 | 3 | WHERE oid NOT IN (SELECT oid FROM items WHERE sku = '1234')) | ||
576 | 0 | \ No newline at end of file | 4 | \ No newline at end of file |
577 | 1 | 5 | ||
578 | === modified file 'src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/not-in-inner.expected' | |||
579 | --- src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/not-in-inner.expected 2012-11-19 16:24:59 +0000 | |||
580 | +++ src/test/resources/com/akiban/sql/optimizer/rule/reverse-ins/not-in-inner.expected 2013-07-30 18:29:34 +0000 | |||
581 | @@ -2,11 +2,11 @@ | |||
582 | 2 | ResultSet@55de5cd2[cid] | 2 | ResultSet@55de5cd2[cid] |
583 | 3 | MapJoin@5208873f() | 3 | MapJoin@5208873f() |
584 | 4 | SingleIndexScan@2de7632c(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) | 4 | SingleIndexScan@2de7632c(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740) |
590 | 5 | MapJoin@321ff53f() | 5 | Project@79a00b08[customers.cid] |
591 | 6 | SingleIndexScan@501e14ce(Index(test.parent.PRIMARY[IndexColumn(id)]), covering/NONE, rows = 100, cost = 69.9260) | 6 | Select@7a347899[] |
592 | 7 | Project@79a00b08[customers.cid] | 7 | OnlyIfEmpty@66e80979 |
593 | 8 | Select@7a347899[] | 8 | MapJoin@321ff53f() |
594 | 9 | OnlyIfEmpty@66e80979 | 9 | SingleIndexScan@501e14ce(Index(test.parent.PRIMARY[IndexColumn(id)]), covering/NONE, rows = 100, cost = 69.9260) |
595 | 10 | Select@287c958f[] | 10 | Select@287c958f[] |
596 | 11 | Flatten@b3ef40d(items) | 11 | Flatten@b3ef40d(items) |
597 | 12 | Select@bc61bb7[customers.name == items.sku] | 12 | Select@bc61bb7[customers.name == items.sku] |
As described.