summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <svoj@may.pils.ru>2006-06-21 17:30:59 +0500
committerunknown <svoj@may.pils.ru>2006-06-21 17:30:59 +0500
commitafc129c0d5093b9dc5c8802edc39b8c4d578b950 (patch)
tree8321d5354f0f2cad96af6f61c246c17bdb8bdf4d
parent5d243f211d01e659db6eebb25f29a1eebe69bf53 (diff)
downloadmariadb-git-afc129c0d5093b9dc5c8802edc39b8c4d578b950.tar.gz
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.
-rw-r--r--mysql-test/r/myisam.result13
-rw-r--r--mysql-test/t/myisam.test12
-rw-r--r--sql/opt_sum.cc6
3 files changed, 31 insertions, 0 deletions
diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result
index 3b4519e5444..91a5bb08c0f 100644
--- a/mysql-test/r/myisam.result
+++ b/mysql-test/r/myisam.result
@@ -748,3 +748,16 @@ select count(id1) from t1 where id2 = 10;
count(id1)
5
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;
diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test
index 7e4cc324b12..06f913111d3 100644
--- a/mysql-test/t/myisam.test
+++ b/mysql-test/t/myisam.test
@@ -705,4 +705,16 @@ select count(*) from t1 where id2 = 10;
select count(id1) from t1 where id2 = 10;
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
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index cfb5b3695a3..63373a8579a 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -673,6 +673,12 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
{
KEY_PART_INFO *part,*part_end;
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;
*prefix_len= 0;
for (part= keyinfo->key_part, part_end= part+keyinfo->key_parts ;