Merge lp:~mmcm/akiban-server/sql-nested-map-folder into lp:~akiban-technologies/akiban-server/trunk

Proposed by Mike McMahon
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
Reviewer Review Type Date Requested Status
Thomas Jones-Low Approve
Review via email: mp+177664@code.launchpad.net

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.

To post a comment you must log in.
Revision history for this message
Thomas Jones-Low (tjoneslo) wrote :

As described.

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/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 map.setInner(new NullIfEmpty(map.getInner()));
6 break;
7 case SEMI:
8- {
9- PlanNode inner = map.getInner();
10- if ((inner instanceof Select) &&
11- ((Select)inner).getConditions().isEmpty())
12- inner = ((Select)inner).getInput();
13- // Right-nested semi-joins only need one Limit, since
14- // all the effects happen inside the fastest loop.
15- if (!((inner instanceof MapJoin) &&
16- ((MapJoin)inner).getJoinType() == JoinNode.JoinType.SEMI))
17- inner = new Limit(map.getInner(), 1);
18- map.setInner(inner);
19- }
20+ map.setInner(new Limit(map.getInner(), 1));
21 break;
22 case ANTI:
23 map.setInner(new OnlyIfEmpty(map.getInner()));
24@@ -204,11 +193,21 @@
25 (parent instanceof ResultSet) ||
26 (parent instanceof AggregateSource) ||
27 (parent instanceof Sort) ||
28+ (parent instanceof NullIfEmpty) ||
29+ (parent instanceof OnlyIfEmpty) ||
30+ (parent instanceof Limit) ||
31 // Captures enough at the edge of the inside.
32 (child instanceof Project) ||
33 (child instanceof UpdateInput)));
34 if (child != map) {
35 PlanNode inner = map.getInner();
36+ // Add a Project to capture fields within the loop before
37+ // leaving the scope of its outer binding, that is,
38+ // materialize the join as a projected row.
39+ // The cases where this is needed are:
40+ // (1) This loop is itself on the outer side of another loop.
41+ // (2) It implements the nullable side of an outer join.
42+ // (3) Nested inside and so feeding another instance of (2) or (3).
43 if (parent instanceof MapJoin) {
44 MapJoinProject nested = findAddedProject((MapJoin)parent,
45 mapJoinProjects);
46@@ -226,12 +225,31 @@
47 nested, mapJoinProjects);
48 }
49 }
50+ else if (parent instanceof NullIfEmpty) {
51+ // Even though we stop at the outer join, we still
52+ // need to find the map that it's contained in.
53+ PlanNode ancestor = parent;
54+ do {
55+ ancestor = ancestor.getOutput();
56+ } while ((ancestor instanceof Select) ||
57+ (ancestor instanceof Project));
58+ if (ancestor instanceof MapJoin) {
59+ MapJoinProject nested = findAddedProject((MapJoin)ancestor,
60+ mapJoinProjects);
61+ inner = addProject((MapJoin)ancestor, map, inner,
62+ nested, mapJoinProjects);
63+ }
64+ }
65 map.getOutput().replaceInput(map, inner);
66 parent.replaceInput(child, map);
67 map.setInner(child);
68 }
69 }
70
71+ // A pending Project used to capture bindings inside the loop.
72+ // When complete, we will walk the tree to determine which fields,
73+ // if any, from its scope are used downstream and capture them or
74+ // else throw the Project away.
75 static class MapJoinProject implements PlanVisitor, ExpressionVisitor {
76 MapJoin parentMap, childMap;
77 MapJoinProject nested;
78@@ -269,6 +287,7 @@
79 this.innerSources = innerSources;
80 }
81
82+ // Are any of the inner bindings used outer?
83 public boolean find() {
84 columns = new ArrayList<>();
85 for (MapJoinProject loop = this; loop != null; loop = loop.nested) {
86@@ -280,6 +299,7 @@
87 return foundOuter;
88 }
89
90+ // Actually install field expressions for this Project.
91 public void install() {
92 Set<ColumnExpression> seen = new HashSet<>();
93 for (ColumnExpression column : columns) {
94@@ -289,6 +309,7 @@
95 }
96 }
97
98+ // Splice this unneeded Project out.
99 public void remove() {
100 project.getOutput().replaceInput(project, project.getInput());
101 project = null;
102
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 aggregate: Aggregation with nested loops
108
109+nested-inner-inner: Nested joins: inner then inner
110+
111+nested-inner-left: Nested joins: inner then left
112+
113+nested-inner-right: Nested joins: inner then right
114+
115+nested-left-inner: Nested joins: left then inner
116+
117+nested-left-left: Nested joins: left then left
118+
119+nested-left-right: Nested joins: left then right
120+
121+nested-right-inner: Nested joins: right then inner
122+
123+nested-right-left: Nested joins: right then left
124+
125+nested-right-right: Nested joins: right then right
126+
127 outer: Outer join across groups.
128
129 outer-join-condition: Outer join with another condition.
130
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+SelectQuery@6f8affe
136+ ResultSet@30ea5045[id, s, id, s, id, s]
137+ MapJoin@ca7bd3d()
138+ Flatten@6fe01bb8(t1)
139+ GroupScan@5878f648(Group(test.t1), rows = 1, cost = 0.00000)
140+ TableSource@1c26ffc6(t1 - TableGroup@44622e9a(t1))
141+ MapJoin@6d711e58()
142+ Flatten@623c0669(t2)
143+ Select@1d7f5b8a[t2.id == t1.id]
144+ GroupScan@1452d027(Group(test.t2), rows = 1, cost = 0.00000)
145+ TableSource@58fc4d0e(t2 - TableGroup@9e1a389(t2))
146+ Project@673bfb19[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
147+ Select@12e25b42[]
148+ Select@48dfbadd[]
149+ Flatten@52c909e1(t3)
150+ AncestorLookup@5865288b(t3 -> [t3])
151+ SingleIndexScan@5948eb03(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
152+ TableSource@2d3c68ad(t3 - TableGroup@3cb77c70(t3))
153\ No newline at end of file
154
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+SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id INNER JOIN t3 ON t2.id = t3.id
160\ No newline at end of file
161
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+SelectQuery@34a7c644
167+ ResultSet@72c9b55d[id, s, id, s, id, s]
168+ MapJoin@35f9de2()
169+ Flatten@7b020cf2(t1)
170+ GroupScan@7a766228(Group(test.t1), rows = 1, cost = 0.00000)
171+ TableSource@5e1f9277(t1 - TableGroup@72266ee7(t1))
172+ MapJoin@393b3a3d()
173+ Flatten@43a022f5(t2)
174+ Select@5f6c9825[t2.id == t1.id]
175+ GroupScan@5278d614(Group(test.t2), rows = 1, cost = 0.00000)
176+ TableSource@42dd975(t2 - TableGroup@7b2ee558(t2))
177+ Project@18a2278b[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
178+ Select@3dd2234f[]
179+ Select@43d33396[]
180+ NullIfEmpty@5edfdfa3
181+ Flatten@46572582(t3)
182+ AncestorLookup@3bd376fe(t3 -> [t3])
183+ SingleIndexScan@38293c61(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
184+ TableSource@6ac8f2e7(t3 - TableGroup@1b3b2115(t3))
185\ No newline at end of file
186
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+SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id
192\ No newline at end of file
193
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+SelectQuery@6dd64b31
199+ ResultSet@fe2b64d[id, s, id, s, id, s]
200+ MapJoin@788f8d68()
201+ Flatten@6a8d819(t3)
202+ GroupScan@188ce4ae(Group(test.t3), rows = 1, cost = 0.00000)
203+ TableSource@4252736f(t3 - TableGroup@49f96819(t3))
204+ Project@6d2e8160[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
205+ Select@82ffda0[]
206+ NullIfEmpty@3966e4fa
207+ MapJoin@15216740()
208+ Flatten@370354b9(t1)
209+ GroupScan@4401a596(Group(test.t1), rows = 1, cost = 0.00000)
210+ TableSource@15492050(t1 - TableGroup@481e3dbb(t1))
211+ Select@3baf59e6[]
212+ Project@406793be[t1.id, t2.id, t1.s, t2.s]
213+ Flatten@753729a6(t2)
214+ AncestorLookup@1242f687(t2 -> [t2])
215+ Select@6a47226e[t3.id == t2.id]
216+ SingleIndexScan@64259a44(Index(test.t2.PRIMARY[IndexColumn(id)]), NONE, =t1.id, rows = 1, cost = 11.9848)
217+ TableSource@33189e6d(t2 - TableGroup@60b319b9(t2))
218\ No newline at end of file
219
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+SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id
225\ No newline at end of file
226
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+SelectQuery@773bf444
232+ ResultSet@121d984[id, s, id, s, id, s]
233+ MapJoin@14336855()
234+ Flatten@12d86228(t1)
235+ GroupScan@3b06aecf(Group(test.t1), rows = 1, cost = 0.00000)
236+ TableSource@765bf858(t1 - TableGroup@33beb64f(t1))
237+ Project@554f69b0[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
238+ Select@50a3cd91[]
239+ NullIfEmpty@17db7729
240+ MapJoin@2db31713()
241+ Flatten@3c1439c2(t2)
242+ Select@48aff7d5[t2.id == t1.id]
243+ GroupScan@18b7e63b(Group(test.t2), rows = 1, cost = 0.00000)
244+ TableSource@2b72af70(t2 - TableGroup@516c382a(t2))
245+ Select@496c30fb[]
246+ Project@781ffa5a[t2.id, t2.s, t3.id, t3.s]
247+ Flatten@53dc0e5e(t3)
248+ AncestorLookup@5e03d465(t3 -> [t3])
249+ SingleIndexScan@4d6d631b(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
250+ TableSource@4ec2506(t3 - TableGroup@4885a953(t3))
251\ No newline at end of file
252
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+SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id INNER JOIN t3 ON t2.id = t3.id
258\ No newline at end of file
259
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+SelectQuery@5b3a7993
265+ ResultSet@5c03d0af[id, s, id, s, id, s]
266+ MapJoin@1b85f4a1()
267+ Flatten@72b85245(t1)
268+ GroupScan@777f8424(Group(test.t1), rows = 1, cost = 0.00000)
269+ TableSource@7dc52fe(t1 - TableGroup@54bc94c6(t1))
270+ Project@7e79c05a[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
271+ Select@6b439594[]
272+ NullIfEmpty@15282f42
273+ MapJoin@28cb7ea0()
274+ Flatten@23216ada(t2)
275+ Select@47e64f4c[t2.id == t1.id]
276+ GroupScan@61602b74(Group(test.t2), rows = 1, cost = 0.00000)
277+ TableSource@154587e3(t2 - TableGroup@70c4fe9d(t2))
278+ Select@136a0e8[]
279+ Project@7d558b0e[t2.id, t2.s, t3.id, t3.s]
280+ NullIfEmpty@297ddff7
281+ Flatten@66ee203a(t3)
282+ AncestorLookup@6fae669(t3 -> [t3])
283+ SingleIndexScan@422cfb13(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
284+ TableSource@36d7da6e(t3 - TableGroup@1717be56(t3))
285\ No newline at end of file
286
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+SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id
292\ No newline at end of file
293
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+SelectQuery@47d13cd
299+ ResultSet@2f9efa08[id, s, id, s, id, s]
300+ MapJoin@41cc788f()
301+ Flatten@7138ebd2(t3)
302+ GroupScan@56ff1608(Group(test.t3), rows = 1, cost = 0.00000)
303+ TableSource@492c032(t3 - TableGroup@4ff93d7(t3))
304+ Project@6e313ba4[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
305+ Select@6242c480[]
306+ NullIfEmpty@c2a3624
307+ MapJoin@27430ad1()
308+ Flatten@50026210(t1)
309+ GroupScan@227b337a(Group(test.t1), rows = 1, cost = 0.00000)
310+ TableSource@5818428c(t1 - TableGroup@4670a045(t1))
311+ Select@4c743179[t3.id == t2.id]
312+ Project@7e1c0bf9[t1.id, t2.id, t1.s, t2.s]
313+ NullIfEmpty@27487bb9
314+ Flatten@605c2625(t2)
315+ AncestorLookup@7b2c2d5(t2 -> [t2])
316+ SingleIndexScan@691531e5(Index(test.t2.PRIMARY[IndexColumn(id)]), NONE, =t1.id, rows = 1, cost = 11.9848)
317+ TableSource@3e8814f6(t2 - TableGroup@6e7ee748(t2))
318\ No newline at end of file
319
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+SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id
325\ No newline at end of file
326
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+SelectQuery@70a66e76
332+ ResultSet@3e9e3ec1[id, s, id, s, id, s]
333+ MapJoin@73bf3f3f()
334+ Flatten@5f0b23d8(t3)
335+ GroupScan@10d17c77(Group(test.t3), rows = 1, cost = 0.00000)
336+ TableSource@3fbd8be(t3 - TableGroup@29427141(t3))
337+ MapJoin@49197790()
338+ Flatten@545e6aa7(t2)
339+ Select@26f8b46e[t3.id == t2.id]
340+ GroupScan@120db5bf(Group(test.t2), rows = 1, cost = 0.00000)
341+ TableSource@b52a3fd(t2 - TableGroup@421717db(t2))
342+ Project@72a1105[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
343+ Select@5ac362ef[]
344+ Select@7a1f4cc2[]
345+ NullIfEmpty@1ce89331
346+ Flatten@2ac2537(t1)
347+ AncestorLookup@691784ca(t1 -> [t1])
348+ SingleIndexScan@70f1fad(Index(test.t1.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
349+ TableSource@5e8c3cd9(t1 - TableGroup@71e89a79(t1))
350\ No newline at end of file
351
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+SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id INNER JOIN t3 ON t2.id = t3.id
357\ No newline at end of file
358
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+SelectQuery@7eba8a14
364+ ResultSet@8bf680c[id, s, id, s, id, s]
365+ MapJoin@630fa3df()
366+ Flatten@5ddbcc3d(t2)
367+ GroupScan@17cfb848(Group(test.t2), rows = 1, cost = 0.00000)
368+ TableSource@6f6ce13f(t2 - TableGroup@464b8b2e(t2))
369+ MapJoin@99e9d10()
370+ NullIfEmpty@c598a5f
371+ Flatten@93de8ef(t1)
372+ AncestorLookup@4a8b694e(t1 -> [t1])
373+ SingleIndexScan@6aea61e(Index(test.t1.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
374+ TableSource@5538283f(t1 - TableGroup@341bfeff(t1))
375+ Project@4e47f050[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
376+ Select@54f23c56[]
377+ NullIfEmpty@1a023213
378+ Flatten@3f87a7a6(t3)
379+ AncestorLookup@6258abc(t3 -> [t3])
380+ SingleIndexScan@ab73fcb(Index(test.t3.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
381+ TableSource@48d07bc1(t3 - TableGroup@4bd2dec(t3))
382\ No newline at end of file
383
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+SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id
389\ No newline at end of file
390
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+SelectQuery@5f42920f
396+ ResultSet@b8347a5[id, s, id, s, id, s]
397+ MapJoin@2711edd3()
398+ Flatten@4d45a08d(t3)
399+ GroupScan@a14cbaf(Group(test.t3), rows = 1, cost = 0.00000)
400+ TableSource@577ab9(t3 - TableGroup@5b485354(t3))
401+ Project@57d4a78a[t1.id, t1.s, t2.id, t2.s, t3.id, t3.s]
402+ Select@4a438212[]
403+ NullIfEmpty@2013d7b
404+ MapJoin@6956de9d()
405+ Flatten@162fb09d(t2)
406+ Select@46314b72[t3.id == t2.id]
407+ GroupScan@4e504d5e(Group(test.t2), rows = 1, cost = 0.00000)
408+ TableSource@6f3a07db(t2 - TableGroup@7a077e7c(t2))
409+ Select@1f6b5744[]
410+ Project@3548a494[t2.id, t1.id, t1.s, t2.s]
411+ NullIfEmpty@402e4179
412+ Flatten@14f41ecc(t1)
413+ AncestorLookup@1ccc8fda(t1 -> [t1])
414+ SingleIndexScan@39f83ffb(Index(test.t1.PRIMARY[IndexColumn(id)]), NONE, =t2.id, rows = 1, cost = 11.9848)
415+ TableSource@4ad9f3e9(t1 - TableGroup@59309578(t1))
416\ No newline at end of file
417
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+SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id
423\ No newline at end of file
424
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 GROUPING FOREIGN KEY (cid) REFERENCES customers(cid)
430 );
431 CREATE INDEX state ON addresses(state);
432+
433+CREATE TABLE t1(id INT PRIMARY KEY NOT NULL, s VARCHAR(10));
434+CREATE TABLE t2(id INT PRIMARY KEY NOT NULL, s VARCHAR(10));
435+CREATE TABLE t3(id INT PRIMARY KEY NOT NULL, s VARCHAR(10));
436
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 map-join-project: Need both sides of outer loop.
442
443 map-join-project-nested: Needed in inner loop because outer loop is like that.
444+
445+nested-in: nested semi-joins
446+
447+nested-not-in: nested anti-joins
448+
449+nested-in-not: nested semi inside anti
450
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 MapJoin@6dca323d()
456 SingleIndexScan@75a87b1a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
457 MapJoin@82a244f()
458- MapJoin@6b5c2b9()
459- Select@7030320[c3.name == c2.name]
460- SingleIndexScan@56c22d78(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
461- NullIfEmpty@66374dc7
462+ NullIfEmpty@66374dc7
463+ MapJoin@6b5c2b9()
464+ Select@7030320[c3.name == c2.name]
465+ SingleIndexScan@56c22d78(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
466 Select@4663a6c1[]
467 MapJoin@38d3783e()
468 SingleIndexScan@437b4b97(Index(test.customers.name[IndexColumn(name)]), covering/NONE, =c2.name, rows = 1, cost = 6.04220)
469
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 MapJoin@273d638c()
475 SingleIndexScan@2f529074(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
476 MapJoin@24ebb33()
477- MapJoin@7ee41273()
478- SingleIndexScan@2f777d1a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
479- NullIfEmpty@4db64e4e
480+ NullIfEmpty@4db64e4e
481+ MapJoin@7ee41273()
482+ SingleIndexScan@2f777d1a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
483 Select@2ec72eb4[]
484 Project@7bcf0abd[c1.name, c1.cid]
485 Select@55ca3dcb[c3.name == c2.name]
486
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+SelectQuery@338c94e3
492+ ResultSet@5282dd85[name]
493+ MapJoin@52a6490c()
494+ SingleIndexScan@2305dd38(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
495+ Project@d9d7115[customers.name]
496+ Select@5b6b20ae[]
497+ OnlyIfEmpty@2dfd1d0c
498+ MapJoin@55fe997e()
499+ Select@3e0f4b4d[customers.cid == orders.cid]
500+ SingleIndexScan@5e18cc0f(Index(test.orders.__akiban_fk_0[IndexColumn(cid)]), covering/NONE, rows = 1000, cost = 688.942)
501+ Select@66261964[]
502+ Limit@447e166a(LIMIT 1)
503+ Select@4f4d28a0[orders.oid == items.oid]
504+ SingleIndexScan@31f1ac47(Index(test.items.sku[IndexColumn(sku)]), covering/NONE, =1234, rows = 97, cost = 158.981)
505\ No newline at end of file
506
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+SELECT name FROM customers
512+ WHERE cid NOT IN (SELECT cid FROM orders
513+ WHERE oid IN (SELECT oid FROM items WHERE sku = '1234'))
514\ No newline at end of file
515
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+SelectQuery@270cd144
521+ ResultSet@3a7edb63[name]
522+ MapJoin@30944cb9()
523+ SingleIndexScan@58391e99(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
524+ Project@5e755e95[customers.name]
525+ Select@6b94b8a5[]
526+ Limit@2f7708ec(LIMIT 1)
527+ MapJoin@e07fc0f()
528+ Select@2e3543fb[customers.cid == orders.cid]
529+ SingleIndexScan@2b022b70(Index(test.orders.__akiban_fk_0[IndexColumn(cid)]), covering/NONE, rows = 1000, cost = 688.942)
530+ Select@9a6f6ca[]
531+ Limit@1b71dc1f(LIMIT 1)
532+ Select@b80fa71[]
533+ Flatten@457514c6(items)
534+ Select@502a854c[items.sku == 1234]
535+ AncestorLookup@179569b2(items -> [items])
536+ SingleIndexScan@524e3136(Index(test.items.__akiban_fk_1[IndexColumn(oid)]), NONE, =orders.oid, rows = 1, cost = 188.762)
537+ TableSource@b849d5c(items - TableGroup@b80fa71(customers))
538\ No newline at end of file
539
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+SELECT name FROM customers
545+ WHERE cid IN (SELECT cid FROM orders
546+ WHERE oid IN (SELECT oid FROM items WHERE sku = '1234'))
547\ No newline at end of file
548
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+SelectQuery@173d3c4c
554+ ResultSet@3541ad7f[name]
555+ MapJoin@6a58f699()
556+ SingleIndexScan@76a5ed5a(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
557+ Project@6ae58829[customers.name]
558+ Select@34e7293[]
559+ OnlyIfEmpty@29662a39
560+ MapJoin@781ec91()
561+ Select@62d22770[customers.cid == orders.cid]
562+ SingleIndexScan@531b5cbf(Index(test.orders.__akiban_fk_0[IndexColumn(cid)]), covering/NONE, rows = 1000, cost = 688.942)
563+ Select@7cc50827[]
564+ OnlyIfEmpty@725e196a
565+ Select@6b9a786f[orders.oid == items.oid]
566+ SingleIndexScan@7fd6b8ce(Index(test.items.sku[IndexColumn(sku)]), covering/NONE, =1234, rows = 97, cost = 158.981)
567\ No newline at end of file
568
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+SELECT name FROM customers
574+ WHERE cid NOT IN (SELECT cid FROM orders
575+ WHERE oid NOT IN (SELECT oid FROM items WHERE sku = '1234'))
576\ No newline at end of file
577
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 ResultSet@55de5cd2[cid]
583 MapJoin@5208873f()
584 SingleIndexScan@2de7632c(Index(test.customers.name[IndexColumn(name)]), covering/NONE, rows = 100, cost = 74.1740)
585- MapJoin@321ff53f()
586- SingleIndexScan@501e14ce(Index(test.parent.PRIMARY[IndexColumn(id)]), covering/NONE, rows = 100, cost = 69.9260)
587- Project@79a00b08[customers.cid]
588- Select@7a347899[]
589- OnlyIfEmpty@66e80979
590+ Project@79a00b08[customers.cid]
591+ Select@7a347899[]
592+ OnlyIfEmpty@66e80979
593+ MapJoin@321ff53f()
594+ SingleIndexScan@501e14ce(Index(test.parent.PRIMARY[IndexColumn(id)]), covering/NONE, rows = 100, cost = 69.9260)
595 Select@287c958f[]
596 Flatten@b3ef40d(items)
597 Select@bc61bb7[customers.name == items.sku]

Subscribers

People subscribed via source and target branches