]> git.saurik.com Git - redis.git/commitdiff
Test for empty inner range when looking for elements in range
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 11 Mar 2011 17:17:53 +0000 (18:17 +0100)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 11 Mar 2011 17:18:02 +0000 (18:18 +0100)
src/t_zset.c
tests/unit/type/zset.tcl

index 65c9962258f28857938440c6ddb1c8dbfd10d393..b8a961eb775022e46ef2468ecbb54334a6ce6520 100644 (file)
@@ -226,10 +226,12 @@ zskiplistNode *zslFirstInRange(zskiplist *zsl, zrangespec range) {
                 x = x->level[i].forward;
     }
 
-    /* The tail is in range, so the previous block should always return a
-     * node that is non-NULL and the last one to be out of range. */
+    /* This is an inner range, so the next node cannot be NULL. */
     x = x->level[0].forward;
-    redisAssert(x != NULL && zslValueInRange(x->score,&range));
+    redisAssert(x != NULL);
+
+    /* Check if score <= max. */
+    if (!zslValueLteMax(x->score,&range)) return NULL;
     return x;
 }
 
@@ -250,9 +252,11 @@ zskiplistNode *zslLastInRange(zskiplist *zsl, zrangespec range) {
                 x = x->level[i].forward;
     }
 
-    /* The header is in range, so the previous block should always return a
-     * node that is non-NULL and in range. */
-    redisAssert(x != NULL && zslValueInRange(x->score,&range));
+    /* This is an inner range, so this node cannot be NULL. */
+    redisAssert(x != NULL);
+
+    /* Check if score >= min. */
+    if (!zslValueGteMin(x->score,&range)) return NULL;
     return x;
 }
 
@@ -531,8 +535,12 @@ unsigned char *zzlFirstInRange(unsigned char *zl, zrangespec range) {
         redisAssert(sptr != NULL);
 
         score = zzlGetScore(sptr);
-        if (zslValueGteMin(score,&range))
-            return eptr;
+        if (zslValueGteMin(score,&range)) {
+            /* Check if score <= max. */
+            if (zslValueLteMax(score,&range))
+                return eptr;
+            return NULL;
+        }
 
         /* Move to next element. */
         eptr = ziplistNext(zl,sptr);
@@ -555,8 +563,12 @@ unsigned char *zzlLastInRange(unsigned char *zl, zrangespec range) {
         redisAssert(sptr != NULL);
 
         score = zzlGetScore(sptr);
-        if (zslValueLteMax(score,&range))
-            return eptr;
+        if (zslValueLteMax(score,&range)) {
+            /* Check if score >= min. */
+            if (zslValueGteMin(score,&range))
+                return eptr;
+            return NULL;
+        }
 
         /* Move to previous element by moving to the score of previous element.
          * When this returns NULL, we know there also is no element. */
index fdeebd2fec3322772d5502b275a2bf81c95d132a..6218a95ccb552e0c5a46291e3b8a1612ea42134d 100644 (file)
@@ -247,6 +247,12 @@ start_server {tags {"zset"}} {
         assert_equal {} [r zrangebyscore zset (-inf (-6]
         assert_equal {} [r zrevrangebyscore zset (+inf (6]
         assert_equal {} [r zrevrangebyscore zset (-6 (-inf]
+
+        # empty inner range
+        assert_equal {} [r zrangebyscore zset 2.4 2.6]
+        assert_equal {} [r zrangebyscore zset (2.4 2.6]
+        assert_equal {} [r zrangebyscore zset 2.4 (2.6]
+        assert_equal {} [r zrangebyscore zset (2.4 (2.6]
     }
 
     test "ZRANGEBYSCORE with WITHSCORES" {