summaryrefslogtreecommitdiff
path: root/src/sort.c
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2011-12-01 16:07:55 +0100
committerantirez <antirez@gmail.com>2011-12-01 16:08:05 +0100
commit237194b76064c95028b14e9ff7d7abfb10abd63d (patch)
treeb775226cd1435d74a6cd7accd20e24fb5273d99a /src/sort.c
parent1576520cc0c2deda30288bea797fdacf322581ec (diff)
downloadredis-237194b76064c95028b14e9ff7d7abfb10abd63d.tar.gz
Fixed SORT bugs (issue #224) with regression tests.
Diffstat (limited to 'src/sort.c')
-rw-r--r--src/sort.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/src/sort.c b/src/sort.c
index f70810b9b..1a8376a8b 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -141,11 +141,7 @@ void sortCommand(redisClient *c) {
/* Lookup the key to sort. It must be of the right types */
sortval = lookupKeyRead(c->db,c->argv[1]);
- if (sortval == NULL) {
- addReply(c,shared.emptymultibulk);
- return;
- }
- if (sortval->type != REDIS_SET && sortval->type != REDIS_LIST &&
+ if (sortval && sortval->type != REDIS_SET && sortval->type != REDIS_LIST &&
sortval->type != REDIS_ZSET)
{
addReply(c,shared.wrongtypeerr);
@@ -161,7 +157,10 @@ void sortCommand(redisClient *c) {
/* Now we need to protect sortval incrementing its count, in the future
* SORT may have options able to overwrite/delete keys during the sorting
* and the sorted key itself may get destroied */
- incrRefCount(sortval);
+ if (sortval)
+ incrRefCount(sortval);
+ else
+ sortval = createListObject();
/* The SORT command has an SQL-alike syntax, parse it */
while(j < c->argc) {
@@ -200,7 +199,8 @@ void sortCommand(redisClient *c) {
}
/* Destructively convert encoded sorted sets for SORT. */
- if (sortval->type == REDIS_ZSET) zsetConvert(sortval, REDIS_ENCODING_SKIPLIST);
+ if (sortval->type == REDIS_ZSET)
+ zsetConvert(sortval, REDIS_ENCODING_SKIPLIST);
/* Load the sorting vector with all the objects to sort */
switch(sortval->type) {
@@ -367,12 +367,9 @@ void sortCommand(redisClient *c) {
}
}
}
- setKey(c->db,storekey,sobj);
+ if (outputlen) setKey(c->db,storekey,sobj);
decrRefCount(sobj);
- /* Note: we add 1 because the DB is dirty anyway since even if the
- * SORT result is empty a new key is set and maybe the old content
- * replaced. */
- server.dirty += 1+outputlen;
+ server.dirty += outputlen;
addReplyLongLong(c,outputlen);
}