Crash in Ordered_key::get_field_idx with partial_match_rowid_merge=on

Bug #613009 reported by Philip Stoev
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
MariaDB
Fix Released
High
Timour Katchaounov

Bug Description

The following query:

SELECT table2 .`col_date_key`
FROM CC table1 JOIN (
SELECT *
FROM B ) table2 ON table1 .`col_varchar_key`
WHERE ( table1 .`pk` , table1 .`col_int_key` ) NOT IN (
SELECT `col_int_nokey` , MAX( `col_int_nokey` )
FROM CC ) ;

crashes as follows:

#3 0x0827e86a in handle_segfault (sig=11) at mysqld.cc:2703
#4 <signal handler called>
#5 0x0823ad8f in Ordered_key::get_field_idx (this=0x65010e, i=0) at item_subselect.h:955
#6 0x08239803 in subselect_rowid_merge_engine::init (this=0xb5f949c8, non_null_key_parts=0x0, partial_match_key_parts=0xb5f8bcd0) at item_subselect.cc:4861
#7 0x08237e66 in subselect_hash_sj_engine::exec (this=0xb5f8bc88) at item_subselect.cc:4162
#8 0x0822fb79 in Item_subselect::exec (this=0xb5f597b0) at item_subselect.cc:481
#9 0x0822fd72 in Item_in_subselect::exec (this=0xb5f597b0) at item_subselect.cc:578
#10 0x082315dc in Item_in_subselect::val_bool (this=0xb5f597b0) at item_subselect.cc:1246
#11 0x081cf276 in Item::val_bool_result (this=0xb5f597b0) at item.h:783
#12 0x081fab3f in Item_in_optimizer::val_int (this=0xb5f8a328) at item_cmpfunc.cc:1873
#13 0x081cf218 in Item::val_int_result (this=0xb5f8a328) at item.h:779
#14 0x081cb0da in Item_cache_int::cache_value (this=0xb5f8e170) at item.cc:7720
#15 0x081d2e6a in Item_cache_wrapper::cache (this=0xb5f8e0f8) at item.cc:6725
#16 0x081c8cb5 in Item_cache_wrapper::val_bool (this=0xb5f8e0f8) at item.cc:6889
#17 0x081f6e5d in Item_func_not::val_int (this=0xb5f59918) at item_cmpfunc.cc:287
#18 0x081b8d6e in Item::val_bool (this=0xb5f59918) at item.cc:187
#19 0x082027f9 in Item_cond_and::val_int (this=0xb5f8b938) at item_cmpfunc.cc:4548
#20 0x0831d5b8 in evaluate_join_record (join=0xb5f80330, join_tab=0xb5f8b540, error=0) at sql_select.cc:13181
#21 0x0831d229 in sub_select (join=0xb5f80330, join_tab=0xb5f8b540, end_of_records=false) at sql_select.cc:13087
#22 0x0831c62f in do_select (join=0xb5f80330, fields=0xab2df0c, table=0x0, procedure=0x0) at sql_select.cc:12633
#23 0x083029f3 in JOIN::exec (this=0xb5f80330) at sql_select.cc:2355
#24 0x08303129 in mysql_select (thd=0xab2c4f8, rref_pointer_array=0xab2df90, tables=0xb5f57718, wild_num=0, fields=..., conds=0xb5f59918, og_num=0,
    order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2147764736, result=0xb5f80300, unit=0xab2dbd4, select_lex=0xab2de74)
    at sql_select.cc:2556
#25 0x082fb71b in handle_select (thd=0xab2c4f8, lex=0xab2db78, result=0xb5f80300, setup_tables_done_option=0) at sql_select.cc:276
#26 0x0829a164 in execute_sqlcom_select (thd=0xab2c4f8, all_tables=0xb5f57718) at sql_parse.cc:5081
#27 0x08290b3c in mysql_execute_command (thd=0xab2c4f8) at sql_parse.cc:2265
#28 0x0829c325 in mysql_parse (thd=0xab2c4f8,
    inBuf=0xb5f31430 "SELECT table2 .`col_date_key`\nFROM CC table1 JOIN (\nSELECT *\nFROM B ) table2 ON table1 .`col_varchar_key`\nWHERE ( table1 .`pk` , table1 .`col_int_key` ) NOT IN (\nSELECT `col_int_nokey` , MAX("..., length=230, found_semicolon=0xb60ff230) at sql_parse.cc:6027
#29 0x0828e5f2 in dispatch_command (command=COM_QUERY, thd=0xab2c4f8, packet=0xab2e519 "", packet_length=233) at sql_parse.cc:1184
#30 0x0828dae0 in do_command (thd=0xab2c4f8) at sql_parse.cc:890
#31 0x0828ac78 in handle_one_connection (arg=0xab2c4f8) at sql_connect.cc:1153
#32 0x00a08919 in start_thread () from /lib/libpthread.so.0
#33 0x00951e5e in clone () from /lib/libc.so.6

explain:

id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> system NULL NULL NULL NULL 1 100.00
1 PRIMARY table1 ALL NULL NULL NULL NULL 20 100.00 Using where
3 SUBQUERY CC ALL NULL NULL NULL NULL 20 100.00
2 DERIVED B system NULL NULL NULL NULL 1 100.00
Warnings:
Note 1003 select '1900-01-01' AS `col_date_key` from `test`.`CC` `table1` join (select '1' AS `pk`,'1' AS `col_int_nokey`,'7' AS `col_int_key`,'1900-01-01' AS `col_date_key`,'f' AS `col_varchar_key` from `test`.`B`) `table2` where ((not(<in_optimizer>((`test`.`table1`.`pk`,`test`.`table1`.`col_int_key`),(`test`.`table1`.`pk`,`test`.`table1`.`col_int_key`) in ( <materialize> (select `test`.`CC`.`col_int_nokey`,max(`test`.`CC`.`col_int_nokey`) from `test`.`CC` ), <primary_index_lookup>(`test`.`table1`.`pk` in <temporary table> on distinct_key where ((`test`.`table1`.`pk` = `materialized subselect`.`col_int_nokey`) and (`test`.`table1`.`col_int_key` = `materialized subselect`.`MAX( ``col_int_nokey`` )`))))))) and `test`.`table1`.`col_varchar_key`)

Note that the EXPLAIN does not reveal that partial match has been used. Instead, materialization is mentioned in the extended EXPLAIN.

Tags: rqg match partial
Revision history for this message
Philip Stoev (pstoev-askmonty) wrote :

Test case :

SET SESSION optimizer_switch='partial_match_rowid_merge=on,partial_match_table_scan=off,semijoin=off';

CREATE TABLE `CC` (
  `pk` int(11) NOT NULL AUTO_INCREMENT,
  `col_int_nokey` int(11) DEFAULT NULL,
  `col_int_key` int(11) DEFAULT NULL,
  `col_date_key` date DEFAULT NULL,
  `col_varchar_key` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`pk`),
  KEY `col_int_key` (`col_int_key`),
  KEY `col_date_key` (`col_date_key`),
  KEY `col_varchar_key` (`col_varchar_key`,`col_int_key`)
) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=latin1;
INSERT INTO `CC` VALUES (10,7,8,NULL,'v');
INSERT INTO `CC` VALUES (11,1,9,'2006-06-14','r');
INSERT INTO `CC` VALUES (12,5,9,'2002-09-12','a');
INSERT INTO `CC` VALUES (13,3,186,'2005-02-15','m');
INSERT INTO `CC` VALUES (14,6,NULL,NULL,'y');
INSERT INTO `CC` VALUES (15,92,2,'2008-11-04','j');
INSERT INTO `CC` VALUES (16,7,3,'2004-09-04','d');
INSERT INTO `CC` VALUES (17,NULL,0,'2006-06-05','z');
INSERT INTO `CC` VALUES (18,3,133,'1900-01-01','e');
INSERT INTO `CC` VALUES (19,5,1,'1900-01-01','h');
INSERT INTO `CC` VALUES (20,1,8,'1900-01-01','b');
INSERT INTO `CC` VALUES (21,2,5,'2005-01-13','s');
INSERT INTO `CC` VALUES (22,NULL,5,'2006-05-21','e');
INSERT INTO `CC` VALUES (23,1,8,'2003-09-08','j');
INSERT INTO `CC` VALUES (24,0,6,'2006-12-23','e');
INSERT INTO `CC` VALUES (25,210,51,'2006-10-15','f');
INSERT INTO `CC` VALUES (26,8,4,'2005-04-06','v');
INSERT INTO `CC` VALUES (27,7,7,'2008-04-07','x');
INSERT INTO `CC` VALUES (28,5,6,'2006-10-10','m');
INSERT INTO `CC` VALUES (29,NULL,4,'1900-01-01','c');
CREATE TABLE `B` (
  `pk` int(11) NOT NULL AUTO_INCREMENT,
  `col_int_nokey` int(11) DEFAULT NULL,
  `col_int_key` int(11) DEFAULT NULL,
  `col_date_key` date DEFAULT NULL,
  `col_varchar_key` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`pk`),
  KEY `col_int_key` (`col_int_key`),
  KEY `col_date_key` (`col_date_key`),
  KEY `col_varchar_key` (`col_varchar_key`,`col_int_key`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
INSERT INTO `B` VALUES (1,1,7,'1900-01-01','f');

SELECT table2 .`col_date_key`
FROM CC table1 JOIN (
SELECT *
FROM B ) table2 ON table1 .`col_varchar_key`
WHERE ( table1 .`pk` , table1 .`col_int_key` ) NOT IN (
SELECT `col_int_nokey` , MAX( `col_int_nokey` )
FROM CC ) ;

Changed in maria:
milestone: none → 5.3
assignee: nobody → Timour Katchaounov (timour)
Revision history for this message
Timour Katchaounov (timour) wrote :

This is a partial_match_rowid_merge specific bug.

Changed in maria:
status: New → Confirmed
Changed in maria:
status: Confirmed → In Progress
Changed in maria:
status: In Progress → Fix Committed
importance: Undecided → High
Changed in maria:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.