mirror of
https://github.com/MariaDB/server.git
synced 2025-11-22 17:44:29 +03:00
Bug #31890 Partitions: ORDER BY DESC in InnoDB not working.
It's not InnoDB specific bug.
Error is in QUEUE code, about the way we handle queue->max_at_top.
It's either '0' or '-2' and we do '^' operation to get the proper
direction. Though queue->compare() function can return '-2' as
a result of comparison sometimes. So we'll get
queue->compare() ^ queue->max_at_top == 0 (when max_at_top is -2)
and _downheap() function code will go wrong way here:
...
if (next_index < elements &&
(queue->compare(queue->first_cmp_arg,
queue->root[next_index]+offset_to_key,
queue->root[next_index+1]+offset_to_key) ^
queue->max_at_top) > 0)
next_index++;
...
Fixed by changing max_at_top to be either 1 or -1, doing
'* max_at_top' to get proper direction.
include/queues.h:
Bug #31890 Partitions: ORDER BY DESC in InnoDB not working
max_at_top policy changed
mysql-test/r/partition.result:
Bug #31890 Partitions: ORDER BY DESC in InnoDB not working
test result
mysql-test/t/partition.test:
Bug #31890 Partitions: ORDER BY DESC in InnoDB not working
test case
mysys/queues.c:
Bug #31890 Partitions: ORDER BY DESC in InnoDB not working.
queue->max_at_top policy changed - now it can either be '1' or '-1'.
We multiply comparison result on max_at_top to get the proper
direction.
This commit is contained in:
@@ -1296,4 +1296,39 @@ create table t1
|
||||
partition by key(s1) partitions 3;
|
||||
insert into t1 values (null,null);
|
||||
drop table t1;
|
||||
CREATE TABLE t1
|
||||
(int_column INT, char_column CHAR(5),
|
||||
PRIMARY KEY(char_column,int_column))
|
||||
PARTITION BY KEY(char_column,int_column)
|
||||
PARTITIONS 101;
|
||||
INSERT INTO t1 (int_column, char_column) VALUES
|
||||
( 39868 ,'zZZRW'),
|
||||
( 545592 ,'zZzSD'),
|
||||
( 4936 ,'zzzsT'),
|
||||
( 9274 ,'ZzZSX'),
|
||||
( 970185 ,'ZZzTN'),
|
||||
( 786036 ,'zZzTO'),
|
||||
( 37240 ,'zZzTv'),
|
||||
( 313801 ,'zzzUM'),
|
||||
( 782427 ,'ZZZva'),
|
||||
( 907955 ,'zZZvP'),
|
||||
( 453491 ,'zzZWV'),
|
||||
( 756594 ,'ZZZXU'),
|
||||
( 718061 ,'ZZzZH');
|
||||
SELECT * FROM t1 ORDER BY char_column DESC;
|
||||
int_column char_column
|
||||
718061 ZZzZH
|
||||
756594 ZZZXU
|
||||
453491 zzZWV
|
||||
907955 zZZvP
|
||||
782427 ZZZva
|
||||
313801 zzzUM
|
||||
37240 zZzTv
|
||||
786036 zZzTO
|
||||
970185 ZZzTN
|
||||
9274 ZzZSX
|
||||
4936 zzzsT
|
||||
545592 zZzSD
|
||||
39868 zZZRW
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
||||
@@ -1549,4 +1549,31 @@ while ($cnt)
|
||||
--enable_query_log
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #31890 Partitions: ORDER BY DESC in InnoDB not working
|
||||
#
|
||||
|
||||
CREATE TABLE t1
|
||||
(int_column INT, char_column CHAR(5),
|
||||
PRIMARY KEY(char_column,int_column))
|
||||
PARTITION BY KEY(char_column,int_column)
|
||||
PARTITIONS 101;
|
||||
INSERT INTO t1 (int_column, char_column) VALUES
|
||||
( 39868 ,'zZZRW'),
|
||||
( 545592 ,'zZzSD'),
|
||||
( 4936 ,'zzzsT'),
|
||||
( 9274 ,'ZzZSX'),
|
||||
( 970185 ,'ZZzTN'),
|
||||
( 786036 ,'zZzTO'),
|
||||
( 37240 ,'zZzTv'),
|
||||
( 313801 ,'zzzUM'),
|
||||
( 782427 ,'ZZZva'),
|
||||
( 907955 ,'zZZvP'),
|
||||
( 453491 ,'zzZWV'),
|
||||
( 756594 ,'ZZZXU'),
|
||||
( 718061 ,'ZZzZH');
|
||||
SELECT * FROM t1 ORDER BY char_column DESC;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
Reference in New Issue
Block a user