diff --git a/redis.c b/redis.c index 5da103d8..f60569de 100644 --- a/redis.c +++ b/redis.c @@ -5197,15 +5197,29 @@ static void zrangebyscoreCommand(redisClient *c) { double min = strtod(c->argv[2]->ptr,NULL); double max = strtod(c->argv[3]->ptr,NULL); int offset = 0, limit = -1; + int withscores = 0; + int badsyntax = 0; - if (c->argc != 4 && c->argc != 7) { + if (c->argc == 5 || c->argc == 8) { + if (strcasecmp(c->argv[c->argc-1]->ptr,"withscores") == 0) withscores = 1; + else badsyntax = 1; + } + + if (c->argc != (4 + withscores) && c->argc != (7 + withscores)) { + badsyntax = 1; + } + + + if (badsyntax) { addReplySds(c, sdsnew("-ERR wrong number of arguments for ZRANGEBYSCORE\r\n")); return; - } else if (c->argc == 7 && strcasecmp(c->argv[4]->ptr,"limit")) { + } + + if (c->argc == (7 + withscores) && strcasecmp(c->argv[4]->ptr,"limit")) { addReply(c,shared.syntaxerr); return; - } else if (c->argc == 7) { + } else if (c->argc == (7 + withscores)) { offset = atoi(c->argv[5]->ptr); limit = atoi(c->argv[6]->ptr); if (offset < 0) offset = 0; @@ -5251,11 +5265,14 @@ static void zrangebyscoreCommand(redisClient *c) { addReplyBulkLen(c,ele); addReply(c,ele); addReply(c,shared.crlf); + if (withscores) + addReplyDouble(c,ln->score); ln = ln->forward[0]; rangelen++; if (limit > 0) limit--; } - lenobj->ptr = sdscatprintf(sdsempty(),"*%d\r\n",rangelen); + lenobj->ptr = sdscatprintf(sdsempty(),"*%d\r\n", + withscores ? (rangelen*2) : rangelen); } } } diff --git a/test-redis.tcl b/test-redis.tcl index 14a1256e..dde6f628 100644 --- a/test-redis.tcl +++ b/test-redis.tcl @@ -1310,6 +1310,16 @@ proc main {server port} { $r zrangebyscore zset 2 4 } {b c d} + test {ZRANGEBYSCORE withscores} { + $r del zset + $r zadd zset 1 a + $r zadd zset 2 b + $r zadd zset 3 c + $r zadd zset 4 d + $r zadd zset 5 e + $r zrangebyscore zset 2 4 withscores + } {b 2 c 3 d 4} + test {ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set} { set err {} $r del zset @@ -1363,6 +1373,16 @@ proc main {server port} { [$r zrangebyscore zset 0 10 LIMIT 20 10] } {{a b} {c d e} {c d e} {}} + test {ZRANGEBYSCORE with LIMIT and withscores} { + $r del zset + $r zadd zset 10 a + $r zadd zset 20 b + $r zadd zset 30 c + $r zadd zset 40 d + $r zadd zset 50 e + $r zrangebyscore zset 20 50 LIMIT 2 3 withscores + } {d 40 e 50} + test {ZREMRANGE basics} { $r del zset $r zadd zset 1 a