]> git.saurik.com Git - redis.git/blobdiff - src/t_zset.c
Fix ZUNIONSTORE/ZINTERSTORE to never store a NaN score.
[redis.git] / src / t_zset.c
index 9b59ca9a63b544857e302ac48fc67732691c93a7..a85a9dc179f5f285900633307822dfe188603789 100644 (file)
@@ -541,6 +541,10 @@ int qsortCompareZsetopsrcByCardinality(const void *s1, const void *s2) {
 inline static void zunionInterAggregate(double *target, double val, int aggregate) {
     if (aggregate == REDIS_AGGR_SUM) {
         *target = *target + val;
 inline static void zunionInterAggregate(double *target, double val, int aggregate) {
     if (aggregate == REDIS_AGGR_SUM) {
         *target = *target + val;
+        /* The result of adding two doubles is NaN when one variable
+         * is +inf and the other is -inf. When these numbers are added,
+         * we maintain the convention of the result being 0.0. */
+        if (isnan(*target)) *target = 0.0;
     } else if (aggregate == REDIS_AGGR_MIN) {
         *target = val < *target ? val : *target;
     } else if (aggregate == REDIS_AGGR_MAX) {
     } else if (aggregate == REDIS_AGGR_MIN) {
         *target = val < *target ? val : *target;
     } else if (aggregate == REDIS_AGGR_MAX) {
@@ -713,6 +717,7 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
         dbAdd(c->db,dstkey,dstobj);
         addReplyLongLong(c, dstzset->zsl->length);
         if (!touched) touchWatchedKey(c->db,dstkey);
         dbAdd(c->db,dstkey,dstobj);
         addReplyLongLong(c, dstzset->zsl->length);
         if (!touched) touchWatchedKey(c->db,dstkey);
+        server.dirty++;
     } else {
         decrRefCount(dstobj);
         addReply(c, shared.czero);
     } else {
         decrRefCount(dstobj);
         addReply(c, shared.czero);