summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2007-09-10 16:26:51 +0400
committerunknown <sergefp@mysql.com>2007-09-10 16:26:51 +0400
commit732f05a642279a569c6ed2b67fafff05b9de76c3 (patch)
treea047b9f282dae4ad808feaba2b70309d45ec7bfa
parent10012b36feb18180892201b4afdd995e9e0f1a0a (diff)
downloadmariadb-git-732f05a642279a569c6ed2b67fafff05b9de76c3.tar.gz
BUG#30385: Server crash when deleting with ORDER BY and LIMIT
in get_index_for_order(), don't walk over the end of the index key parts when matching index description and needed ordering. mysql-test/r/delete.result: BUG#30385: Testcase mysql-test/t/delete.test: BUG#30385: Testcase
-rw-r--r--mysql-test/r/delete.result11
-rw-r--r--mysql-test/t/delete.test13
-rw-r--r--sql/opt_range.cc3
3 files changed, 26 insertions, 1 deletions
diff --git a/mysql-test/r/delete.result b/mysql-test/r/delete.result
index a5c22e66569..5dd37e6b98d 100644
--- a/mysql-test/r/delete.result
+++ b/mysql-test/r/delete.result
@@ -193,4 +193,15 @@ select @a;
@a
1
drop table t1;
+CREATE TABLE t1 (
+`date` date ,
+`time` time ,
+`seq` int(10) unsigned NOT NULL auto_increment,
+PRIMARY KEY (`seq`),
+KEY `seq` (`seq`),
+KEY `time` (`time`),
+KEY `date` (`date`)
+);
+DELETE FROM t1 ORDER BY date ASC, time ASC LIMIT 1;
+drop table t1;
End of 4.1 tests
diff --git a/mysql-test/t/delete.test b/mysql-test/t/delete.test
index 301b2cdbb99..fdbb96e0c2f 100644
--- a/mysql-test/t/delete.test
+++ b/mysql-test/t/delete.test
@@ -184,4 +184,17 @@ delete from t1 where (@a:= f1) order by f1 limit 1;
select @a;
drop table t1;
+# BUG#30385 "Server crash when deleting with order by and limit"
+CREATE TABLE t1 (
+ `date` date ,
+ `time` time ,
+ `seq` int(10) unsigned NOT NULL auto_increment,
+ PRIMARY KEY (`seq`),
+ KEY `seq` (`seq`),
+ KEY `time` (`time`),
+ KEY `date` (`date`)
+);
+DELETE FROM t1 ORDER BY date ASC, time ASC LIMIT 1;
+drop table t1;
+
--echo End of 4.1 tests
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 01b366077b0..a8ba609f9dc 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -825,6 +825,7 @@ uint get_index_for_order(TABLE *table, ORDER *order, ha_rows limit)
if (!(table->keys_in_use_for_query.is_set(idx)))
continue;
KEY_PART_INFO *keyinfo= table->key_info[idx].key_part;
+ uint n_parts= table->key_info[idx].key_parts;
uint partno= 0;
/*
@@ -834,7 +835,7 @@ uint get_index_for_order(TABLE *table, ORDER *order, ha_rows limit)
*/
if (!(table->file->index_flags(idx, 0, 1) & HA_READ_ORDER))
continue;
- for (ord= order; ord; ord= ord->next, partno++)
+ for (ord= order; ord && partno < n_parts; ord= ord->next, partno++)
{
Item *item= order->item[0];
if (!(item->type() == Item::FIELD_ITEM &&