Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed issue #516 (ZINTERSTORE mixing sets and zsets).

Weeks ago trying to fix an harmless GCC warning I introduced a bug in
the ziplist-encoded implementations of sorted sets.

The bug completely broke zuiNext() iterator, that is used in the
ZINTERSTORE and ZUNIONSTORE implementation, so those two commands are no
longer reliable starting from Redis version 2.4.12 and latest 2.6.0-RC
releases.

This commit fixes the problem and adds a regression test.
  • Loading branch information...
commit b0a20939562ede36e6e66c75a60abf423bee15ab 1 parent cd2f985
@antirez authored
Showing with 10 additions and 1 deletion.
  1. +2 −1  src/t_zset.c
  2. +8 −0 tests/unit/type/zset.tcl
View
3  src/t_zset.c
@@ -1261,10 +1261,11 @@ int zuiNext(zsetopsrc *op, zsetopval *val) {
if (op->type == REDIS_SET) {
iterset *it = &op->iter.set;
if (op->encoding == REDIS_ENCODING_INTSET) {
- int64_t ell = val->ell;
+ int64_t ell;
if (!intsetGet(it->is.is,it->is.ii,&ell))
return 0;
+ val->ell = ell;
val->score = 1.0;
/* Move to next element. */
View
8 tests/unit/type/zset.tcl
@@ -524,6 +524,14 @@ start_server {tags {"zset"}} {
r zrange out 0 -1 withscores
} {neginf 0}
+ test {ZINTERSTORE #516 regression, mixed sets and ziplist zsets} {
+ r sadd one 100 101 102 103
+ r sadd two 100 200 201 202
+ r zadd three 1 500 1 501 1 502 1 503 1 100
+ r zinterstore to_here 3 one two three WEIGHTS 0 0 1
+ r zrange to_here 0 -1
+ } {100}
+
proc stressers {encoding} {
if {$encoding == "ziplist"} {
# Little extra to allow proper fuzzing in the sorting stresser
Please sign in to comment.
Something went wrong with that request. Please try again.