mirror of
https://github.com/fluencelabs/redis
synced 2025-03-31 14:51:04 +00:00
Fix zero-ordering SORT when called against lists
People mostly use SORT against lists, but our prior behavior was pretending lists were an unordered bag requiring a forced-sort when no sort was requested. We can just use the native list ordering to ensure consistency across replicaion and scripting calls. Closes #2079 Closes #545 (again)
This commit is contained in:
parent
6fbaeddf3f
commit
6c0abc4a0e
15
src/sort.c
15
src/sort.c
@ -285,16 +285,13 @@ void sortCommand(redisClient *c) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the STORE option, or when SORT is called from a Lua script,
|
/* When sorting a set with no sort specified, we must sort the output
|
||||||
* we want to force a specific ordering even when no explicit ordering
|
* so the result is consistent across scripting and replication.
|
||||||
* was asked (SORT BY nosort). This guarantees that replication / AOF
|
|
||||||
* is deterministic.
|
|
||||||
*
|
*
|
||||||
* However in the case 'dontsort' is true, but the type to sort is a
|
* The other types (list, sorted set) will retain their native order
|
||||||
* sorted set, we don't need to do anything as ordering is guaranteed
|
* even if no sort order is requested, so they remain stable across
|
||||||
* in this special case. */
|
* scripting and replication. */
|
||||||
if ((storekey || c->flags & REDIS_LUA_CLIENT) &&
|
if ((dontsort && sortval->type == REDIS_SET))
|
||||||
(dontsort && sortval->type != REDIS_ZSET))
|
|
||||||
{
|
{
|
||||||
/* Force ALPHA sorting */
|
/* Force ALPHA sorting */
|
||||||
dontsort = 0;
|
dontsort = 0;
|
||||||
|
@ -246,6 +246,24 @@ start_server {
|
|||||||
r sort mylist by num get x:*->
|
r sort mylist by num get x:*->
|
||||||
} {100}
|
} {100}
|
||||||
|
|
||||||
|
test "SORT by nosort retains native order for lists" {
|
||||||
|
r del testa
|
||||||
|
r lpush testa 2 1 4 3 5
|
||||||
|
r sort testa by nosort
|
||||||
|
} {5 3 4 1 2}
|
||||||
|
|
||||||
|
test "SORT by nosort plus store retains native order for lists" {
|
||||||
|
r del testa
|
||||||
|
r lpush testa 2 1 4 3 5
|
||||||
|
r sort testa by nosort store testb
|
||||||
|
r lrange testb 0 -1
|
||||||
|
} {5 3 4 1 2}
|
||||||
|
|
||||||
|
test "SORT by nosort with limit returns based on original list order" {
|
||||||
|
r sort testa by nosort limit 0 3 store testb
|
||||||
|
r lrange testb 0 -1
|
||||||
|
} {5 3 4}
|
||||||
|
|
||||||
tags {"slow"} {
|
tags {"slow"} {
|
||||||
set num 100
|
set num 100
|
||||||
set res [create_random_dataset $num lpush]
|
set res [create_random_dataset $num lpush]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user