From 56e1a6936bcdebb8fe672ea040235bfa9867e10e Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Sun, 29 Jan 2012 14:35:30 -0800 Subject: [PATCH] Fixed LP bug #923236. When working on MWL#247 I forgot to adjust the function create_hj_key_for_table() that created a key definition for hash join keys. The modified function must set the values of the fields ext_key_parts, ext_key_flags, ext_key_part_map added to the key definition structure in MWL#247. --- mysql-test/r/innodb_ext_key.result | 21 +++++++++++++++++++++ mysql-test/t/innodb_ext_key.test | 26 ++++++++++++++++++++++++++ sql/sql_select.cc | 4 ++++ 3 files changed, 51 insertions(+) diff --git a/mysql-test/r/innodb_ext_key.result b/mysql-test/r/innodb_ext_key.result index ec980b2e73b..033d9bc53a1 100644 --- a/mysql-test/r/innodb_ext_key.result +++ b/mysql-test/r/innodb_ext_key.result @@ -677,5 +677,26 @@ a 24 set optimizer_switch=@save_optimizer_switch; DROP TABLE t1,t2; +# +# LP Bug #923236: hash join + extended_keys = on +# +CREATE TABLE t1 (a int) ENGINE=MyISAM; +CREATE TABLE t2 (b int) ENGINE=MyISAM; +INSERT INTO t1 (a) VALUES (4), (6); +INSERT INTO t2 (b) VALUES (0), (8); +set @save_optimizer_switch=@@optimizer_switch; +SET join_cache_level=3; +SET optimizer_switch='join_cache_hashed=on'; +SET optimizer_switch='join_cache_bka=on'; +SET optimizer_switch='extended_keys=on'; +EXPLAIN +SELECT * FROM t1, t2 WHERE b=a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where +1 SIMPLE t2 hash_ALL NULL #hash#$hj 5 test.t1.a 2 Using where; Using join buffer (flat, BNLH join) +SELECT * FROM t1, t2 WHERE b=a; +a b +set optimizer_switch=@save_optimizer_switch; +DROP TABLE t1,t2; set optimizer_switch=@save_ext_key_optimizer_switch; SET SESSION STORAGE_ENGINE=DEFAULT; diff --git a/mysql-test/t/innodb_ext_key.test b/mysql-test/t/innodb_ext_key.test index 8175c60b381..58d692f720d 100644 --- a/mysql-test/t/innodb_ext_key.test +++ b/mysql-test/t/innodb_ext_key.test @@ -381,5 +381,31 @@ set optimizer_switch=@save_optimizer_switch; DROP TABLE t1,t2; +--echo # +--echo # LP Bug #923236: hash join + extended_keys = on +--echo # + +CREATE TABLE t1 (a int) ENGINE=MyISAM; + +CREATE TABLE t2 (b int) ENGINE=MyISAM; + +INSERT INTO t1 (a) VALUES (4), (6); +INSERT INTO t2 (b) VALUES (0), (8); + +set @save_optimizer_switch=@@optimizer_switch; + +SET join_cache_level=3; +SET optimizer_switch='join_cache_hashed=on'; +SET optimizer_switch='join_cache_bka=on'; +SET optimizer_switch='extended_keys=on'; + +EXPLAIN +SELECT * FROM t1, t2 WHERE b=a; +SELECT * FROM t1, t2 WHERE b=a; + +set optimizer_switch=@save_optimizer_switch; + +DROP TABLE t1,t2; + set optimizer_switch=@save_ext_key_optimizer_switch; SET SESSION STORAGE_ENGINE=DEFAULT; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index df7aa5e36b2..907905fd47f 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7320,6 +7320,10 @@ static bool create_hj_key_for_table(JOIN *join, JOIN_TAB *join_tab, keyuse++; } while (keyuse->table == table && keyuse->is_for_hash_join()); + keyinfo->ext_key_parts= keyinfo->key_parts; + keyinfo->ext_key_flags= keyinfo->flags; + keyinfo->ext_key_part_map= 0; + join_tab->hj_key= keyinfo; DBUG_RETURN(FALSE);