]> git.saurik.com Git - redis.git/commitdiff
Implemented LIMIT option in ZRANGEBYSCORE. We now enter feature-freeze
authorantirez <antirez@gmail.com>
Sat, 28 Nov 2009 21:01:13 +0000 (22:01 +0100)
committerantirez <antirez@gmail.com>
Sat, 28 Nov 2009 21:01:13 +0000 (22:01 +0100)
TODO
redis-cli.c
redis.c

diff --git a/TODO b/TODO
index 22b278a9e93b508ff1b1ccb63b1fbe0bf52f32de..a62743ea27c5c1553972982aca3f14400ef886c0 100644 (file)
--- 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)
 ============================
index e9f95c14d840348bae922bbff4be26394a6f4bc8..ea3cf9d513a979569a1fed9bc4c374f175578eaa 100644 (file)
@@ -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 98434620fae24652f08a07aa283c55467f30350d..bff40cecc9284609c49852241bfac36496387b6e 100644 (file)
--- 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);
         }