From: antirez Date: Sat, 28 Nov 2009 21:01:13 +0000 (+0100) Subject: Implemented LIMIT option in ZRANGEBYSCORE. We now enter feature-freeze X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/80181f7848a26f6763d1d106e2b91dff9b53bfc8 Implemented LIMIT option in ZRANGEBYSCORE. We now enter feature-freeze --- diff --git a/TODO b/TODO index 22b278a9..a62743ea 100644 --- a/TODO +++ b/TODO @@ -8,6 +8,7 @@ Most of the features already implemented for this release. The following is a li * Man pages for SRANDMEMBER, missing Z-commands, ... * Write docs for the "STORE" operaiton of SORT. Link to the article about SORT by written by defunkt. * ZRANGEBYSCORE LIMIT option and test. +* check the command table for deny on OOM correctness. VERSION 1.4 TODO (Hash type) ============================ diff --git a/redis-cli.c b/redis-cli.c index e9f95c14..ea3cf9d5 100644 --- a/redis-cli.c +++ b/redis-cli.c @@ -97,7 +97,7 @@ static struct redisCommand cmdTable[] = { {"zrem",3,REDIS_CMD_BULK}, {"zremrangebyscore",4,REDIS_CMD_INLINE}, {"zrange",4,REDIS_CMD_INLINE}, - {"zrangebyscore",4,REDIS_CMD_INLINE}, + {"zrangebyscore",-4,REDIS_CMD_INLINE}, {"zrevrange",4,REDIS_CMD_INLINE}, {"zcard",2,REDIS_CMD_INLINE}, {"zscore",3,REDIS_CMD_BULK}, diff --git a/redis.c b/redis.c index 98434620..bff40cec 100644 --- a/redis.c +++ b/redis.c @@ -521,7 +521,7 @@ static struct redisCommand cmdTable[] = { {"zrem",zremCommand,3,REDIS_CMD_BULK}, {"zremrangebyscore",zremrangebyscoreCommand,4,REDIS_CMD_INLINE}, {"zrange",zrangeCommand,4,REDIS_CMD_INLINE}, - {"zrangebyscore",zrangebyscoreCommand,4,REDIS_CMD_INLINE}, + {"zrangebyscore",zrangebyscoreCommand,-4,REDIS_CMD_INLINE}, {"zrevrange",zrevrangeCommand,4,REDIS_CMD_INLINE}, {"zcard",zcardCommand,2,REDIS_CMD_INLINE}, {"zscore",zscoreCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM}, @@ -4559,6 +4559,18 @@ static void zrangebyscoreCommand(redisClient *c) { robj *o; double min = strtod(c->argv[2]->ptr,NULL); double max = strtod(c->argv[3]->ptr,NULL); + int offset = 0, limit = -1; + + if (c->argc != 4 && c->argc != 7) { + addReplySds(c,sdsnew("-ERR wrong number of arguments\r\n")); + return; + } else if (c->argc == 7 && strcasecmp(c->argv[4]->ptr,"limit")) { + addReply(c,shared.syntaxerr); + return; + } else if (c->argc == 7) { + offset = atoi(c->argv[5]->ptr); + limit = atoi(c->argv[6]->ptr); + } o = lookupKeyRead(c->db,c->argv[1]); if (o == NULL) { @@ -4590,12 +4602,19 @@ static void zrangebyscoreCommand(redisClient *c) { decrRefCount(lenobj); while(ln && ln->score <= max) { + if (offset) { + offset--; + ln = ln->forward[0]; + continue; + } + if (limit == 0) break; ele = ln->obj; addReplyBulkLen(c,ele); addReply(c,ele); addReply(c,shared.crlf); ln = ln->forward[0]; rangelen++; + if (limit > 0) limit--; } lenobj->ptr = sdscatprintf(sdsempty(),"*%d\r\n",rangelen); }