X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/5574b53eae1743cca9eed5a9dd25bf418c974701..4ce22375f45e7e1a6f9c9548fe47613b61242e48:/src/t_string.c?ds=sidebyside diff --git a/src/t_string.c b/src/t_string.c index 1f0b1fbc..d6143ed2 100644 --- a/src/t_string.c +++ b/src/t_string.c @@ -344,11 +344,12 @@ void incrDecrCommand(redisClient *c, long long incr) { if (getLongLongFromObjectOrReply(c,o,&value,NULL) != REDIS_OK) return; oldvalue = value; - value += incr; - if ((incr < 0 && value > oldvalue) || (incr > 0 && value < oldvalue)) { + if ((incr < 0 && oldvalue < 0 && incr < (LLONG_MIN-oldvalue)) || + (incr > 0 && oldvalue > 0 && incr > (LLONG_MAX-oldvalue))) { addReplyError(c,"increment or decrement would overflow"); return; } + value += incr; new = createStringObjectFromLongLong(value); if (o) dbOverwrite(c->db,c->argv[1],new); @@ -385,7 +386,7 @@ void decrbyCommand(redisClient *c) { void incrbyfloatCommand(redisClient *c) { long double incr, value; - robj *o, *new; + robj *o, *new, *aux; o = lookupKeyWrite(c->db,c->argv[1]); if (o != NULL && checkType(c,o,REDIS_STRING)) return; @@ -406,6 +407,14 @@ void incrbyfloatCommand(redisClient *c) { signalModifiedKey(c->db,c->argv[1]); server.dirty++; addReplyBulk(c,new); + + /* Always replicate INCRBYFLOAT as a SET command with the final value + * in order to make sure that differences in float pricision or formatting + * will not create differences in replicas or after an AOF restart. */ + aux = createStringObject("SET",3); + rewriteClientCommandArgument(c,0,aux); + decrRefCount(aux); + rewriteClientCommandArgument(c,2,new); } void appendCommand(redisClient *c) {