]> git.saurik.com Git - redis.git/commitdiff
Fixed misuse of the new iterator semantics in ZUNIONSTORE
authorantirez <antirez@gmail.com>
Sun, 15 May 2011 15:28:06 +0000 (17:28 +0200)
committerantirez <antirez@gmail.com>
Sun, 15 May 2011 15:28:06 +0000 (17:28 +0200)
src/t_zset.c

index 8b1662091f1a0516efd1c9e0b5c05641fbbb5427..1c55cb97a575e3a7ae3819cb64dcb29533767ad4 100644 (file)
@@ -1521,6 +1521,8 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
 
                 score = src[0].weight * zval.score;
                 for (j = 1; j < setnum; j++) {
+                    /* It is not safe to access the hash we zset we are
+                     * iterating, so explicitly check for equal object. */
                     if (src[j].subject == src[0].subject) {
                         value = zval.score*src[j].weight;
                         zunionInterAggregate(&score,value,aggregate);
@@ -1564,7 +1566,12 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
                 /* Because the inputs are sorted by size, it's only possible
                  * for sets at larger indices to hold this element. */
                 for (j = (i+1); j < setnum; j++) {
-                    if (zuiFind(&src[j],&zval,&value)) {
+                    /* It is not safe to access the hash we zset we are
+                     * iterating, so explicitly check for equal object. */
+                    if(src[j].subject == src[i].subject) {
+                        value = zval.score*src[j].weight;
+                        zunionInterAggregate(&score,value,aggregate);
+                    } else if (zuiFind(&src[j],&zval,&value)) {
                         value *= src[j].weight;
                         zunionInterAggregate(&score,value,aggregate);
                     }