Commit 5c0cdea6 authored by unknown's avatar unknown

BUG#20357 - Got error 124 from storage engine using MIN and MAX

            functions in queries

Using MAX()/MIN() on table with disabled indexes (by ALTER TABLE)
results in error 124 (wrong index) from storage engine.

The problem was that optimizer use disabled index to optimize
MAX()/MIN(). Normally it must skip disabled index and perform
table scan.

This patch skips disabled indexes for min/max optimization.


mysql-test/r/myisam.result:
  Test case for BUG#20357.
mysql-test/t/myisam.test:
  Test case for BUG#20357.
sql/opt_sum.cc:
  Skip disabled/ignored indexes for min/max optimization.
parent ef02d496
...@@ -748,3 +748,16 @@ select count(id1) from t1 where id2 = 10; ...@@ -748,3 +748,16 @@ select count(id1) from t1 where id2 = 10;
count(id1) count(id1)
5 5
drop table t1; drop table t1;
CREATE TABLE t1(a TINYINT, KEY(a)) ENGINE=MyISAM;
INSERT INTO t1 VALUES(1);
SELECT MAX(a) FROM t1 IGNORE INDEX(a);
MAX(a)
1
ALTER TABLE t1 DISABLE KEYS;
SELECT MAX(a) FROM t1;
MAX(a)
1
SELECT MAX(a) FROM t1 IGNORE INDEX(a);
MAX(a)
1
DROP TABLE t1;
...@@ -705,4 +705,16 @@ select count(*) from t1 where id2 = 10; ...@@ -705,4 +705,16 @@ select count(*) from t1 where id2 = 10;
select count(id1) from t1 where id2 = 10; select count(id1) from t1 where id2 = 10;
drop table t1; drop table t1;
#
# BUG##20357 - Got error 124 from storage engine using MIN and MAX functions
# in queries
#
CREATE TABLE t1(a TINYINT, KEY(a)) ENGINE=MyISAM;
INSERT INTO t1 VALUES(1);
SELECT MAX(a) FROM t1 IGNORE INDEX(a);
ALTER TABLE t1 DISABLE KEYS;
SELECT MAX(a) FROM t1;
SELECT MAX(a) FROM t1 IGNORE INDEX(a);
DROP TABLE t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -673,6 +673,12 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref, ...@@ -673,6 +673,12 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
{ {
KEY_PART_INFO *part,*part_end; KEY_PART_INFO *part,*part_end;
key_part_map key_part_to_use= 0; key_part_map key_part_to_use= 0;
/*
Perform a check if index is not disabled by ALTER TABLE
or IGNORE INDEX.
*/
if (!table->keys_in_use_for_query.is_set(idx))
continue;
uint jdx= 0; uint jdx= 0;
*prefix_len= 0; *prefix_len= 0;
for (part= keyinfo->key_part, part_end= part+keyinfo->key_parts ; for (part= keyinfo->key_part, part_end= part+keyinfo->key_parts ;
......
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