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.
This commit is contained in:
Igor Babaev 2011-02-27 22:37:46 -08:00
parent 1b03a028fc
commit 0f0360e21f
3 changed files with 42 additions and 2 deletions

View File

@ -4967,3 +4967,21 @@ SET SESSION join_cache_level = DEFAULT;
SET SESSION join_buffer_size = DEFAULT;
DROP TABLE t1,t2;
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;

View File

@ -3100,3 +3100,21 @@ DROP TABLE t1,t2;
# this must be the last command in the file
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;

View File

@ -231,14 +231,18 @@ void print_keyuse(KEYUSE *keyuse)
char buff[256];
char buf2[64];
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);
str.length(0);
keyuse->val->print(&str, QT_ORDINARY);
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";
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);
DBUG_LOCK_FILE;
fprintf(DBUG_FILE, "KEYUSE: %s.%s=%s optimize: %u used_tables: %s "