Crash in Item_equal_fields_iterator::get_curr_field with semijoin+materialization
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
MariaDB |
Fix Released
|
Critical
|
Sergey Petrunia |
Bug Description
The following query:
SELECT *
FROM t2
WHERE t2.a = ALL (
SELECT t4.a
FROM t4
WHERE t4.a IN (
)
);
crashes as follows:
#3 <signal handler called>
#4 0x00000000005f656c in Item_equal_
#5 0x00000000005e5bd3 in Item_equal:
#6 0x0000000000734fbe in find_item_equal (cond_equal=
#7 0x0000000000806702 in setup_sj_
#8 0x000000000074ae5c in make_join_readinfo (join=0x1f0ec4f0, options=0, no_jbuf_after=3) at sql_select.cc:9294
#9 0x000000000074e369 in JOIN::optimize (this=0x1f0ec4f0) at sql_select.cc:1497
#10 0x000000000057ab4e in st_select_
#11 0x00000000008038c0 in JOIN::optimize_
#12 0x000000000074eac1 in JOIN::optimize (this=0x1f0e62d0) at sql_select.cc:1622
#13 0x00000000007505bb in mysql_select (thd=0x1efd9438, rref_pointer_
og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_
at sql_select.cc:2887
#14 0x0000000000756a7a in handle_select (thd=0x1efd9438, lex=0x1efdb840, result=0x1f09a898, setup_tables_
#15 0x00000000006a33de in execute_
#16 0x00000000006a50bc in mysql_execute_
#17 0x00000000006ade55 in mysql_parse (thd=0x1efd9438,
rawbuf=
#18 0x00000000006aed25 in dispatch_command (command=COM_QUERY, thd=0x1efd9438,
packet=
#19 0x00000000006b0333 in do_command (thd=0x1efd9438) at sql_parse.cc:906
#20 0x000000000069ac67 in handle_
#21 0x00000033b600673d in start_thread () from /lib64/
#22 0x00000033b58d40cd in clone () from /lib64/libc.so.6
Explain also crashes. There are no empty or 1-row tables.
minimal optimizer switch: semijoin=
full optimizer switch: index_merge=
bzr version-info:
revision-id: <email address hidden>
date: 2011-08-27 00:40:29 +0300
build-date: 2011-08-29 12:13:10 +0300
revno: 3167
branch-nick: maria-5.3
test case:
CREATE TABLE t2 (a int);
INSERT INTO t2 VALUES ('a'),('a');
CREATE TABLE t4 (a varchar(1));
INSERT INTO t4 VALUES ('m'),('o');
CREATE TABLE t3 (a varchar(1) , b varchar(1) ) ;
INSERT INTO t3 VALUES ('b','b');
CREATE TABLE t5 (a varchar(1), KEY (a)) ;
INSERT INTO t5 VALUES ('d'),('e');
SET SESSION optimizer_
SELECT *
FROM t2
WHERE t2.a = ALL (
SELECT t4.a
FROM t4
WHERE t4.a IN (
)
);
Changed in maria: | |
milestone: | none → 5.3 |
assignee: | nobody → Sergey Petrunia (sergefp) |
Changed in maria: | |
importance: | Undecided → High |
Changed in maria: | |
importance: | High → Critical |
Changed in maria: | |
status: | New → Fix Committed |
Changed in maria: | |
status: | Fix Committed → Fix Released |
The crash is here:
(gdb) wher fields_ iterator: :get_curr_ field (this=0x90434bcc) at item_cmpfunc.h:1790 :contains (this=0xb1fbb00, field=0xb1f2338) at item_cmpfunc. cc:5438 0xb1f945c, field=0xb1f2338, inherited_ fl=0x90434cea) at sql_select.cc:10313 materialization _part2 (sjm_tab=0xb1fb084) at opt_subselect. cc:3150 lex::optimize_ unflattened_ subqueries (this=0xb184938) at sql_lex.cc:3126 unflattened_ subqueries (this=0xb1fbe40) at opt_subselect. cc:4324
#0 0x0822cd38 in Item_equal_
#1 0x0821d9cc in Item_equal:
#2 0x0835e4ad in find_item_equal (cond_equal=
#3 0x08424d6d in setup_sj_
#4 0x083616f3 in make_join_readinfo (join=0xb201db8, options=4, no_jbuf_after=3) at sql_select.cc:9306
#5 0x08371c61 in JOIN::optimize (this=0xb201db8) at sql_select.cc:1497
#6 0x081b96cb in st_select_
#7 0x08421fdb in JOIN::optimize_
#8 0x08371cf2 in JOIN::optimize (this=0xb1fbe40) at sql_select.cc:1504
#9 0x08373a40 in mysql_select (...) at sql_select.cc:2887
(gdb) up :contains (this=0xb1fbb00, field=0xb1f2338) at item_cmpfunc. cc:5438
^^^^^ ^^^^^^^ ^^^^^ How come this is an Item_func_eq, while we are
#1 0x0821d9cc in Item_equal:
(gdb) p this
$306 = (Item_func_eq *) 0xb1fbb00
in Item_equal's function?
Item_equal and Item_func_eq do not inherit from one another, something
is clearly wrong.
(gdb) up :contains (this=0xb1fbb00, field=0xb1f2338) at item_cmpfunc. cc:5438 0xb1f945c, field=0xb1f2338, inherited_ fl=0x90434cea) at sql_select.cc:10313 >current_ level.head( )
#1 0x0821d9cc in Item_equal:
(gdb) p this
$306 = (Item_func_eq *) 0xb1fbb00
(gdb) up
#2 0x0835e4ad in find_item_equal (cond_equal=
(gdb) p cond_equal-
$307 = (Item_func_eq *) 0xb1fbb00
(gdb) p &cond_equal- >current_ level
$309 = (List<Item_equal> *) 0xb1f9464
(gdb) p cond_equal- >current_ level.head( )
$307 = (Item_func_eq *) 0xb1fbb00
^^^ So we went up and see that cond_equal- >current_ level, which is of type
List<Item_equal> somehow ended up containing an Item_func_eq.