From 4dada1b5bce3da69899eb14364142819002cf029 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 23 May 2012 11:02:38 +0200 Subject: [PATCH] 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. --- src/t_zset.c | 3 ++- tests/unit/type/zset.tcl | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/t_zset.c b/src/t_zset.c index 50ad8d43..4812709e 100644 --- a/src/t_zset.c +++ b/src/t_zset.c @@ -1259,10 +1259,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. */ diff --git a/tests/unit/type/zset.tcl b/tests/unit/type/zset.tcl index bab98854..806f4c88 100644 --- a/tests/unit/type/zset.tcl +++ b/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 -- 2.47.2