Merge lp:~stewart/drizzle/bug588408 into lp:~drizzle-trunk/drizzle/development

Proposed by Stewart Smith
Status: Merged
Merged at revision: 1594
Proposed branch: lp:~stewart/drizzle/bug588408
Merge into: lp:~drizzle-trunk/drizzle/development
Diff against target: 375 lines (+304/-9)
3 files modified
drizzled/join.cc (+15/-9)
tests/r/bug588408.result (+152/-0)
tests/t/bug588408.test (+137/-0)
To merge this branch: bzr merge lp:~stewart/drizzle/bug588408
Reviewer Review Type Date Requested Status
Drizzle Developers Pending
Review via email: mp+26781@code.launchpad.net

Description of the change

To post a comment you must log in.
Revision history for this message
Stewart Smith (stewart) wrote :

and http://hudson.drizzle.org/view/Drizzle-param/job/drizzle-param-freebsd80/4/ for the FreeBSD one due to some kind of spurious failure on the first run.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'drizzled/join.cc'
2--- drizzled/join.cc 2010-06-02 23:40:24 +0000
3+++ drizzled/join.cc 2010-06-04 05:51:24 +0000
4@@ -495,8 +495,7 @@
5 { /* Impossible cond */
6 zero_result_cause= having_value == Item::COND_FALSE ?
7 "Impossible HAVING" : "Impossible WHERE";
8- error= 0;
9- return(0);
10+ goto setup_subq_exit;
11 }
12 }
13
14@@ -515,8 +514,7 @@
15 if (res == HA_ERR_KEY_NOT_FOUND)
16 {
17 zero_result_cause= "No matching min/max row";
18- error=0;
19- return(0);
20+ goto setup_subq_exit;
21 }
22 if (res > 1)
23 {
24@@ -526,8 +524,7 @@
25 if (res < 0)
26 {
27 zero_result_cause= "No matching min/max row";
28- error=0;
29- return(0);
30+ goto setup_subq_exit;
31 }
32 zero_result_cause= "Select tables optimized away";
33 tables_list= 0; // All tables resolved
34@@ -546,6 +543,7 @@
35 COND *table_independent_conds= make_cond_for_table(conds, PSEUDO_TABLE_BITS, 0, 0);
36 conds= table_independent_conds;
37 }
38+ goto setup_subq_exit;
39 }
40 }
41 if (!tables_list)
42@@ -578,8 +576,7 @@
43 select_lex->master_unit() == &session->lex->unit)) // upper level SELECT
44 {
45 zero_result_cause= "no matching row in const table";
46- error= 0;
47- return(0);
48+ goto setup_subq_exit;
49 }
50 if (!(session->options & OPTION_BIG_SELECTS) &&
51 best_read > (double) session->variables.max_join_size &&
52@@ -645,7 +642,7 @@
53 {
54 zero_result_cause=
55 "Impossible WHERE noticed after reading const tables";
56- return(0); // error == 0
57+ goto setup_subq_exit;
58 }
59
60 error= -1; /* if goto err */
61@@ -1110,6 +1107,15 @@
62
63 error= 0;
64 return(0);
65+
66+setup_subq_exit:
67+ /* Even with zero matching rows, subqueries in the HAVING clause
68+ may need to be evaluated if there are aggregate functions in the query.
69+ */
70+ if (setup_subquery_materialization())
71+ return 1;
72+ error= 0;
73+ return 0;
74 }
75
76 /**
77
78=== added file 'tests/r/bug588408.result'
79--- tests/r/bug588408.result 1970-01-01 00:00:00 +0000
80+++ tests/r/bug588408.result 2010-06-04 05:51:24 +0000
81@@ -0,0 +1,152 @@
82+#
83+# BUG#46680 - Assertion failed in file item_subselect.cc,
84+# line 305 crashing on HAVING subquery
85+#
86+# Create tables
87+#
88+CREATE TABLE t1 (
89+pk INT,
90+v VARCHAR(1) DEFAULT NULL,
91+PRIMARY KEY(pk)
92+);
93+CREATE TABLE t2 LIKE t1;
94+CREATE TABLE t3 LIKE t1;
95+CREATE TABLE empty1 (a int);
96+INSERT INTO t1 VALUES (1,'c'),(2,NULL);
97+INSERT INTO t2 VALUES (3,'m'),(4,NULL);
98+INSERT INTO t3 VALUES (1,'n');
99+
100+#
101+# 1) Test that subquery materialization is setup for query with
102+# premature optimize() exit due to "Impossible WHERE"
103+#
104+SELECT MIN(t2.pk)
105+FROM t2 JOIN t1 ON t1.pk=t2.pk
106+WHERE 'j'
107+HAVING ('m') IN (
108+SELECT v
109+FROM t2);
110+MIN(t2.pk)
111+NULL
112+Warnings:
113+Warning 1292 Truncated incorrect INTEGER value: 'j'
114+
115+EXPLAIN
116+SELECT MIN(t2.pk)
117+FROM t2 JOIN t1 ON t1.pk=t2.pk
118+WHERE 'j'
119+HAVING ('m') IN (
120+SELECT v
121+FROM t2);
122+id select_type table type possible_keys key key_len ref rows Extra
123+1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
124+2 SUBQUERY t2 ALL NULL NULL NULL NULL 2
125+Warnings:
126+Warning 1292 Truncated incorrect INTEGER value: 'j'
127+
128+#
129+# 2) Test that subquery materialization is setup for query with
130+# premature optimize() exit due to "No matching min/max row"
131+#
132+SELECT MIN(t2.pk)
133+FROM t2
134+WHERE t2.pk>10
135+HAVING ('m') IN (
136+SELECT v
137+FROM t2);
138+MIN(t2.pk)
139+NULL
140+
141+EXPLAIN
142+SELECT MIN(t2.pk)
143+FROM t2
144+WHERE t2.pk>10
145+HAVING ('m') IN (
146+SELECT v
147+FROM t2);
148+id select_type table type possible_keys key key_len ref rows Extra
149+1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No matching min/max row
150+2 SUBQUERY t2 ALL NULL NULL NULL NULL 2
151+
152+#
153+# 3) Test that subquery materialization is setup for query with
154+# premature optimize() exit due to "Select tables optimized away"
155+#
156+# NOTE: The result of this query is actually wrong; it should be NULL
157+# See BUG#47762. Even so, the test case is still needed to test
158+# that the HAVING subquery does not crash the server
159+#
160+SELECT MIN(pk)
161+FROM t1
162+WHERE pk=NULL
163+HAVING ('m') IN (
164+SELECT v
165+FROM t2);
166+MIN(pk)
167+2
168+
169+EXPLAIN
170+SELECT MIN(pk)
171+FROM t1
172+WHERE pk=NULL
173+HAVING ('m') IN (
174+SELECT v
175+FROM t2);
176+id select_type table type possible_keys key key_len ref rows Extra
177+1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
178+2 SUBQUERY t2 ALL NULL NULL NULL NULL 2
179+
180+#
181+# 4) Test that subquery materialization is setup for query with
182+# premature optimize() exit due to "No matching row in const table"
183+#
184+
185+SELECT MIN(a)
186+FROM (SELECT a FROM empty1) tt
187+HAVING ('m') IN (
188+SELECT v
189+FROM t2);
190+MIN(a)
191+NULL
192+
193+EXPLAIN
194+SELECT MIN(a)
195+FROM (SELECT a FROM empty1) tt
196+HAVING ('m') IN (
197+SELECT v
198+FROM t2);
199+id select_type table type possible_keys key key_len ref rows Extra
200+1 PRIMARY <derived2> system NULL NULL NULL NULL 0 const row not found
201+3 SUBQUERY t2 ALL NULL NULL NULL NULL 2
202+2 DERIVED empty1 ALL NULL NULL NULL NULL 1
203+
204+#
205+# 5) Test that subquery materialization is setup for query with
206+# premature optimize() exit due to "Impossible WHERE noticed
207+# after reading const tables"
208+#
209+SELECT min(t1.pk)
210+FROM t1
211+WHERE t1.pk IN (SELECT 1 from t3 where pk>10)
212+HAVING ('m') IN (
213+SELECT v
214+FROM t2);
215+min(t1.pk)
216+NULL
217+
218+EXPLAIN
219+SELECT min(t1.pk)
220+FROM t1
221+WHERE t1.pk IN (SELECT 1 from t3 where pk>10)
222+HAVING ('m') IN (
223+SELECT v
224+FROM t2);
225+id select_type table type possible_keys key key_len ref rows Extra
226+1 PRIMARY t1 index NULL PRIMARY 4 NULL 2 Using where; Using index
227+3 SUBQUERY t2 ALL NULL NULL NULL NULL 2
228+2 SUBQUERY t3 index PRIMARY PRIMARY 4 NULL 1 Using where; Using index
229+#
230+# Cleanup for BUG#46680
231+#
232+DROP TABLE IF EXISTS t1,t2,t3,empty1;
233+End of 6.0 tests
234
235=== added file 'tests/t/bug588408.test'
236--- tests/t/bug588408.test 1970-01-01 00:00:00 +0000
237+++ tests/t/bug588408.test 2010-06-04 05:51:24 +0000
238@@ -0,0 +1,137 @@
239+--echo #
240+--echo # BUG#46680 - Assertion failed in file item_subselect.cc,
241+--echo # line 305 crashing on HAVING subquery
242+--echo #
243+
244+--echo # Create tables
245+--echo #
246+
247+CREATE TABLE t1 (
248+ pk INT,
249+ v VARCHAR(1) DEFAULT NULL,
250+ PRIMARY KEY(pk)
251+);
252+CREATE TABLE t2 LIKE t1;
253+CREATE TABLE t3 LIKE t1;
254+CREATE TABLE empty1 (a int);
255+
256+INSERT INTO t1 VALUES (1,'c'),(2,NULL);
257+INSERT INTO t2 VALUES (3,'m'),(4,NULL);
258+INSERT INTO t3 VALUES (1,'n');
259+
260+--echo
261+--echo #
262+--echo # 1) Test that subquery materialization is setup for query with
263+--echo # premature optimize() exit due to "Impossible WHERE"
264+--echo #
265+SELECT MIN(t2.pk)
266+FROM t2 JOIN t1 ON t1.pk=t2.pk
267+WHERE 'j'
268+HAVING ('m') IN (
269+SELECT v
270+FROM t2);
271+
272+--echo
273+EXPLAIN
274+SELECT MIN(t2.pk)
275+FROM t2 JOIN t1 ON t1.pk=t2.pk
276+WHERE 'j'
277+HAVING ('m') IN (
278+SELECT v
279+FROM t2);
280+
281+--echo
282+--echo #
283+--echo # 2) Test that subquery materialization is setup for query with
284+--echo # premature optimize() exit due to "No matching min/max row"
285+--echo #
286+SELECT MIN(t2.pk)
287+FROM t2
288+WHERE t2.pk>10
289+HAVING ('m') IN (
290+SELECT v
291+FROM t2);
292+
293+--echo
294+EXPLAIN
295+SELECT MIN(t2.pk)
296+FROM t2
297+WHERE t2.pk>10
298+HAVING ('m') IN (
299+SELECT v
300+FROM t2);
301+
302+--echo
303+--echo #
304+--echo # 3) Test that subquery materialization is setup for query with
305+--echo # premature optimize() exit due to "Select tables optimized away"
306+--echo #
307+--echo # NOTE: The result of this query is actually wrong; it should be NULL
308+--echo # See BUG#47762. Even so, the test case is still needed to test
309+--echo # that the HAVING subquery does not crash the server
310+--echo #
311+SELECT MIN(pk)
312+FROM t1
313+WHERE pk=NULL
314+HAVING ('m') IN (
315+SELECT v
316+FROM t2);
317+
318+--echo
319+EXPLAIN
320+SELECT MIN(pk)
321+FROM t1
322+WHERE pk=NULL
323+HAVING ('m') IN (
324+SELECT v
325+FROM t2);
326+
327+--echo
328+--echo #
329+--echo # 4) Test that subquery materialization is setup for query with
330+--echo # premature optimize() exit due to "No matching row in const table"
331+--echo #
332+--echo
333+SELECT MIN(a)
334+FROM (SELECT a FROM empty1) tt
335+HAVING ('m') IN (
336+SELECT v
337+FROM t2);
338+
339+--echo
340+EXPLAIN
341+SELECT MIN(a)
342+FROM (SELECT a FROM empty1) tt
343+HAVING ('m') IN (
344+SELECT v
345+FROM t2);
346+
347+--echo
348+--echo #
349+--echo # 5) Test that subquery materialization is setup for query with
350+--echo # premature optimize() exit due to "Impossible WHERE noticed
351+--echo # after reading const tables"
352+--echo #
353+SELECT min(t1.pk)
354+FROM t1
355+WHERE t1.pk IN (SELECT 1 from t3 where pk>10)
356+HAVING ('m') IN (
357+SELECT v
358+FROM t2);
359+
360+--echo
361+EXPLAIN
362+SELECT min(t1.pk)
363+FROM t1
364+WHERE t1.pk IN (SELECT 1 from t3 where pk>10)
365+HAVING ('m') IN (
366+SELECT v
367+FROM t2);
368+
369+--echo #
370+--echo # Cleanup for BUG#46680
371+--echo #
372+DROP TABLE IF EXISTS t1,t2,t3,empty1;
373+
374+###
375+--echo End of 6.0 tests