summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extra/replace.c26
-rw-r--r--mysql-test/r/select.result13
-rw-r--r--mysql-test/t/select.test15
-rw-r--r--sql/table.cc1
4 files changed, 42 insertions, 13 deletions
diff --git a/extra/replace.c b/extra/replace.c
index 5a086e5ca9c..98945ed35b3 100644
--- a/extra/replace.c
+++ b/extra/replace.c
@@ -376,8 +376,8 @@ static REP_SET *make_new_set(REP_SETS *sets);
static void make_sets_invisible(REP_SETS *sets);
static void free_last_set(REP_SETS *sets);
static void free_sets(REP_SETS *sets);
-static void set_bit(REP_SET *set, uint bit);
-static void clear_bit(REP_SET *set, uint bit);
+static void internal_set_bit(REP_SET *set, uint bit);
+static void internal_clear_bit(REP_SET *set, uint bit);
static void or_bits(REP_SET *to,REP_SET *from);
static void copy_bits(REP_SET *to,REP_SET *from);
static int cmp_bits(REP_SET *set1,REP_SET *set2);
@@ -454,7 +454,7 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count,
{
if (from[i][0] == '\\' && from[i][1] == '^')
{
- set_bit(start_states,states+1);
+ internal_set_bit(start_states,states+1);
if (!from[i][2])
{
start_states->table_offset=i;
@@ -463,8 +463,8 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count,
}
else if (from[i][0] == '\\' && from[i][1] == '$')
{
- set_bit(start_states,states);
- set_bit(word_states,states);
+ internal_set_bit(start_states,states);
+ internal_set_bit(word_states,states);
if (!from[i][2] && start_states->table_offset == (uint) ~0)
{
start_states->table_offset=i;
@@ -473,11 +473,11 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count,
}
else
{
- set_bit(word_states,states);
+ internal_set_bit(word_states,states);
if (from[i][0] == '\\' && (from[i][1] == 'b' && from[i][2]))
- set_bit(start_states,states+1);
+ internal_set_bit(start_states,states+1);
else
- set_bit(start_states,states);
+ internal_set_bit(start_states,states);
}
for (pos=from[i], len=0; *pos ; pos++)
{
@@ -583,9 +583,9 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count,
follow[i].len > found_end)
found_end=follow[i].len;
if (chr && follow[i].chr)
- set_bit(new_set,i+1); /* To next set */
+ internal_set_bit(new_set,i+1); /* To next set */
else
- set_bit(new_set,i);
+ internal_set_bit(new_set,i);
}
}
if (found_end)
@@ -602,7 +602,7 @@ REPLACE *init_replace(my_string *from, my_string *to,uint count,
if (follow[bit_nr-1].len < found_end ||
(new_set->found_len &&
(chr == 0 || !follow[bit_nr].chr)))
- clear_bit(new_set,i);
+ internal_clear_bit(new_set,i);
else
{
if (chr == 0 || !follow[bit_nr].chr)
@@ -751,13 +751,13 @@ static void free_sets(REP_SETS *sets)
return;
}
-static void set_bit(REP_SET *set, uint bit)
+static void internal_set_bit(REP_SET *set, uint bit)
{
set->bits[bit / WORD_BIT] |= 1 << (bit % WORD_BIT);
return;
}
-static void clear_bit(REP_SET *set, uint bit)
+static void internal_clear_bit(REP_SET *set, uint bit)
{
set->bits[bit / WORD_BIT] &= ~ (1 << (bit % WORD_BIT));
return;
diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index a05b379ed88..607cd11f089 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -2387,3 +2387,16 @@ EXPLAIN SELECT i FROM t1 WHERE i=1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index
DROP TABLE t1;
+CREATE TABLE t1 ( a BLOB, INDEX (a(20)) );
+CREATE TABLE t2 ( a BLOB, INDEX (a(20)) );
+INSERT INTO t1 VALUES ('one'),('two'),('three'),('four'),('five');
+INSERT INTO t2 VALUES ('one'),('two'),('three'),('four'),('five');
+EXPLAIN SELECT * FROM t1 LEFT JOIN t2 USE INDEX (a) ON t1.a=t2.a;
+table type possible_keys key key_len ref rows Extra
+t1 ALL NULL NULL NULL NULL 5
+t2 ref a a 23 t1.a 5
+EXPLAIN SELECT * FROM t1 LEFT JOIN t2 FORCE INDEX (a) ON t1.a=t2.a;
+table type possible_keys key key_len ref rows Extra
+t1 ALL NULL NULL NULL NULL 5
+t2 ref a a 23 t1.a 5
+DROP TABLE t1, t2;
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index 9bbd26a9c1c..c00395d95e7 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -1930,3 +1930,18 @@ INSERT INTO t1 VALUES (3,'c');
EXPLAIN SELECT i FROM t1 WHERE i=1;
DROP TABLE t1;
+
+#
+# Test case for bug 7520: a wrong cost of the index for a BLOB field
+#
+
+CREATE TABLE t1 ( a BLOB, INDEX (a(20)) );
+CREATE TABLE t2 ( a BLOB, INDEX (a(20)) );
+
+INSERT INTO t1 VALUES ('one'),('two'),('three'),('four'),('five');
+INSERT INTO t2 VALUES ('one'),('two'),('three'),('four'),('five');
+
+EXPLAIN SELECT * FROM t1 LEFT JOIN t2 USE INDEX (a) ON t1.a=t2.a;
+EXPLAIN SELECT * FROM t1 LEFT JOIN t2 FORCE INDEX (a) ON t1.a=t2.a;
+
+DROP TABLE t1, t2;
diff --git a/sql/table.cc b/sql/table.cc
index 6427755dab4..1abe4af9711 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -627,6 +627,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
if (!(field->flags & BINARY_FLAG))
keyinfo->flags|= HA_END_SPACE_KEY;
}
+ set_if_bigger(outparam->max_key_length, keyinfo->key_length);
if (i == 0 && key != primary_key)
field->flags |=
((keyinfo->flags & HA_NOSAME) &&