Commit 0f0360e2 authored by Igor Babaev's avatar Igor Babaev

Fixed LP bug #725050.

The bug in the function print_keyuse() caused crashes if
hash join could be used. It happened because the function
ignored the fact that KEYUSE structures could be created
for hash joins as well. 
parent 1b03a028
...@@ -4967,3 +4967,21 @@ SET SESSION join_cache_level = DEFAULT; ...@@ -4967,3 +4967,21 @@ SET SESSION join_cache_level = DEFAULT;
SET SESSION join_buffer_size = DEFAULT; SET SESSION join_buffer_size = DEFAULT;
DROP TABLE t1,t2; DROP TABLE t1,t2;
set @@optimizer_switch=@save_optimizer_switch; set @@optimizer_switch=@save_optimizer_switch;
#
# Bug #725050: print keyuse info when hash join is used
#
create table t1 (a int, b int);
insert into t1 values (2,2), (1,1);
create table t2 (a int);
insert into t2 values (2), (3);
set session join_cache_level=3;
set @@debug = 'd:t:O,/tmp/trace.out';
explain select t1.b from t1,t2 where t1.b=t2.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.b 2 Using where; Using join buffer (flat, BNLH join)
select t1.b from t1,t2 where t1.b=t2.a;
b
2
set session join_cache_level=default;
drop table t1,t2;
...@@ -3100,3 +3100,21 @@ DROP TABLE t1,t2; ...@@ -3100,3 +3100,21 @@ DROP TABLE t1,t2;
# this must be the last command in the file # this must be the last command in the file
set @@optimizer_switch=@save_optimizer_switch; set @@optimizer_switch=@save_optimizer_switch;
--echo #
--echo # Bug #725050: print keyuse info when hash join is used
--echo #
create table t1 (a int, b int);
insert into t1 values (2,2), (1,1);
create table t2 (a int);
insert into t2 values (2), (3);
set session join_cache_level=3;
set @@debug = 'd:t:O,/tmp/trace.out';
explain select t1.b from t1,t2 where t1.b=t2.a;
select t1.b from t1,t2 where t1.b=t2.a;
set session join_cache_level=default;
drop table t1,t2;
...@@ -231,14 +231,18 @@ void print_keyuse(KEYUSE *keyuse) ...@@ -231,14 +231,18 @@ void print_keyuse(KEYUSE *keyuse)
char buff[256]; char buff[256];
char buf2[64]; char buf2[64];
const char *fieldname; const char *fieldname;
JOIN_TAB *join_tab= keyuse->table->reginfo.join_tab;
KEY *key_info= join_tab->get_keyinfo_by_key_no(keyuse->key);
String str(buff,(uint32) sizeof(buff), system_charset_info); String str(buff,(uint32) sizeof(buff), system_charset_info);
str.length(0); str.length(0);
keyuse->val->print(&str, QT_ORDINARY); keyuse->val->print(&str, QT_ORDINARY);
str.append('\0'); str.append('\0');
if (keyuse->keypart == FT_KEYPART) if (keyuse->is_for_hash_join())
fieldname= keyuse->table->field[keyuse->keypart]->field_name;
else if (keyuse->keypart == FT_KEYPART)
fieldname= "FT_KEYPART"; fieldname= "FT_KEYPART";
else else
fieldname= keyuse->table->key_info[keyuse->key].key_part[keyuse->keypart].field->field_name; fieldname= key_info->key_part[keyuse->keypart].field->field_name;
longlong2str(keyuse->used_tables, buf2, 16, 0); longlong2str(keyuse->used_tables, buf2, 16, 0);
DBUG_LOCK_FILE; DBUG_LOCK_FILE;
fprintf(DBUG_FILE, "KEYUSE: %s.%s=%s optimize: %u used_tables: %s " fprintf(DBUG_FILE, "KEYUSE: %s.%s=%s optimize: %u used_tables: %s "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment