summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/join_cache.result20
-rw-r--r--mysql-test/t/join_cache.test22
-rw-r--r--sql/key.cc22
-rw-r--r--sql/sql_select.cc6
4 files changed, 47 insertions, 23 deletions
diff --git a/mysql-test/r/join_cache.result b/mysql-test/r/join_cache.result
index b5ed0b9d59a..23a3d2081e2 100644
--- a/mysql-test/r/join_cache.result
+++ b/mysql-test/r/join_cache.result
@@ -6952,4 +6952,24 @@ a a b
2 NULL 42
SET SESSION join_cache_level = DEFAULT;
DROP TABLE t1,t2;
+#
+# Bug #697557: hash join on a varchar field
+#
+CREATE TABLE t1 ( f1 varchar(10) , f2 int(11) , KEY (f1));
+INSERT INTO t1 VALUES ('r',1), ('m',2);
+CREATE TABLE t2 ( f1 varchar(10) , f2 int(11) , KEY (f1));
+INSERT INTO t2 VALUES
+('hgtofubn',1), ('GDOXZ',91), ('n',2), ('fggxgalh',88),
+('hgtofu',1), ('GDO',101), ('n',3), ('fggxga',55),
+('hgtofu',3), ('GDO',33), ('nn',3), ('fggxgarrr',77);
+SET SESSION join_cache_level=3;
+EXPLAIN
+SELECT * FROM t1,t2 WHERE t2.f1 = t1.f1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL f1 NULL NULL NULL 2 Using where
+1 SIMPLE t2 hash f1 f1 13 test.t1.f1 12 Using join buffer (flat, BNLH join)
+SELECT * FROM t1,t2 WHERE t2.f1 = t1.f1;
+f1 f2 f1 f2
+SET SESSION join_cache_level = DEFAULT;
+DROP TABLE t1,t2;
set @@optimizer_switch=@save_optimizer_switch;
diff --git a/mysql-test/t/join_cache.test b/mysql-test/t/join_cache.test
index ab9e10536e1..9892d2cf5be 100644
--- a/mysql-test/t/join_cache.test
+++ b/mysql-test/t/join_cache.test
@@ -2931,6 +2931,28 @@ SET SESSION join_cache_level = DEFAULT;
DROP TABLE t1,t2;
+--echo #
+--echo # Bug #697557: hash join on a varchar field
+--echo #
+
+CREATE TABLE t1 ( f1 varchar(10) , f2 int(11) , KEY (f1));
+INSERT INTO t1 VALUES ('r',1), ('m',2);
+
+CREATE TABLE t2 ( f1 varchar(10) , f2 int(11) , KEY (f1));
+INSERT INTO t2 VALUES
+ ('hgtofubn',1), ('GDOXZ',91), ('n',2), ('fggxgalh',88),
+ ('hgtofu',1), ('GDO',101), ('n',3), ('fggxga',55),
+ ('hgtofu',3), ('GDO',33), ('nn',3), ('fggxgarrr',77);
+
+SET SESSION join_cache_level=3;
+EXPLAIN
+SELECT * FROM t1,t2 WHERE t2.f1 = t1.f1;
+SELECT * FROM t1,t2 WHERE t2.f1 = t1.f1;
+
+SET SESSION join_cache_level = DEFAULT;
+
+DROP TABLE t1,t2;
+
# this must be the last command in the file
set @@optimizer_switch=@save_optimizer_switch;
diff --git a/sql/key.cc b/sql/key.cc
index 780cc6733c1..fd5c129eee8 100644
--- a/sql/key.cc
+++ b/sql/key.cc
@@ -689,20 +689,12 @@ ulong key_hashnr(KEY *key_info, uint used_key_parts, const uchar *key)
pack_length= 0;
break;
case HA_KEYTYPE_VARTEXT1:
- cs= key_part->field->charset();
- length= (uint)(pos[0]);
- pack_length= 1;
- break;
- case HA_KEYTYPE_VARBINARY1:
- cs= &my_charset_bin;
- length= (uint)(pos[0]);
- pack_length= 1;
- break;
case HA_KEYTYPE_VARTEXT2:
cs= key_part->field->charset();
length= uint2korr(pos);
pack_length= 2;
break;
+ case HA_KEYTYPE_VARBINARY1:
case HA_KEYTYPE_VARBINARY2:
cs= &my_charset_bin;
length= uint2korr(pos);
@@ -806,23 +798,13 @@ bool key_buf_cmp(KEY *key_info, uint used_key_parts,
pack_length= 0;
break;
case HA_KEYTYPE_VARTEXT1:
- cs= key_part->field->charset();
- length1= (uint)(pos1[0]);
- length2= (uint)(pos2[0]);
- pack_length= 1;
- break;
- case HA_KEYTYPE_VARBINARY1:
- cs= &my_charset_bin;
- length1= (uint)(pos1[0]);
- length2= (uint)(pos2[0]);
- pack_length= 1;
- break;
case HA_KEYTYPE_VARTEXT2:
cs= key_part->field->charset();
length1= uint2korr(pos1);
length2= uint2korr(pos2);
pack_length= 2;
break;
+ case HA_KEYTYPE_VARBINARY1:
case HA_KEYTYPE_VARBINARY2:
cs= &my_charset_bin;
length1= uint2korr(pos1);
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 37930edb27f..de9c7f5c13a 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -7877,8 +7877,8 @@ uint check_join_cache_usage(JOIN_TAB *tab,
bool *icp_other_tables_ok,
bool *idx_cond_fact_out)
{
- uint flags;
COST_VECT cost;
+ uint flags= 0;
ha_rows rows= 0;
uint bufsz= 4096;
JOIN_CACHE *prev_cache=0;
@@ -7996,8 +7996,8 @@ uint check_join_cache_usage(JOIN_TAB *tab,
}
if ((cache_level <=4 && !no_hashed_cache) || no_bka_cache ||
- ((flags & HA_MRR_NO_ASSOCIATION) && cache_level <=6) ||
- tab->is_ref_for_hash_join())
+ tab->is_ref_for_hash_join() ||
+ ((flags & HA_MRR_NO_ASSOCIATION) && cache_level <=6))
{
if (!tab->hash_join_is_possible() ||
tab->make_scan_filter())