提交 e945a546 编写于 作者: M Matt Stancliff 提交者: antirez

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)
上级 d81c3831
...@@ -264,16 +264,13 @@ void sortCommand(redisClient *c) { ...@@ -264,16 +264,13 @@ void sortCommand(redisClient *c) {
j++; j++;
} }
/* 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;
......
...@@ -238,6 +238,24 @@ start_server { ...@@ -238,6 +238,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]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册