Commit 946342c1 authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

hincrby should report an error when called against a hash key that doesn't contain an integer

parent 029245fe
...@@ -3221,7 +3221,7 @@ static int getDoubleFromObject(robj *o, double *target) { ...@@ -3221,7 +3221,7 @@ static int getDoubleFromObject(robj *o, double *target) {
} else if (o->encoding == REDIS_ENCODING_INT) { } else if (o->encoding == REDIS_ENCODING_INT) {
value = (long)o->ptr; value = (long)o->ptr;
} else { } else {
redisAssert(1 != 1); redisPanic("Unknown string encoding");
} }
} }
...@@ -3258,7 +3258,7 @@ static int getLongLongFromObject(robj *o, long long *target) { ...@@ -3258,7 +3258,7 @@ static int getLongLongFromObject(robj *o, long long *target) {
} else if (o->encoding == REDIS_ENCODING_INT) { } else if (o->encoding == REDIS_ENCODING_INT) {
value = (long)o->ptr; value = (long)o->ptr;
} else { } else {
redisAssert(1 != 1); redisPanic("Unknown string encoding");
} }
} }
...@@ -6462,12 +6462,11 @@ static void hincrbyCommand(redisClient *c) { ...@@ -6462,12 +6462,11 @@ static void hincrbyCommand(redisClient *c) {
if (getLongLongFromObjectOrReply(c,c->argv[3],&incr,NULL) != REDIS_OK) return; if (getLongLongFromObjectOrReply(c,c->argv[3],&incr,NULL) != REDIS_OK) return;
if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return; if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
if ((current = hashGet(o,c->argv[2])) != NULL) { if ((current = hashGet(o,c->argv[2])) != NULL) {
if (current->encoding == REDIS_ENCODING_RAW) if (getLongLongFromObjectOrReply(c,current,&value,
value = strtoll(current->ptr,NULL,10); "hash value is not an integer") != REDIS_OK) {
else if (current->encoding == REDIS_ENCODING_INT) decrRefCount(current);
value = (long)current->ptr; return;
else }
redisAssert(1 != 1);
decrRefCount(current); decrRefCount(current);
} else { } else {
value = 0; value = 0;
......
...@@ -1898,11 +1898,15 @@ proc main {} { ...@@ -1898,11 +1898,15 @@ proc main {} {
list [$r hincrby smallhash tmp 17179869184] [$r hincrby bighash tmp 17179869184] list [$r hincrby smallhash tmp 17179869184] [$r hincrby bighash tmp 17179869184]
} {34359738368 34359738368} } {34359738368 34359738368}
test {HINCRBY against key with spaces (no integer encoded)} { test {HINCRBY fails against hash value with spaces} {
$r hset smallhash tmp " 11 " $r hset smallhash str " 11 "
$r hset bighash tmp " 11 " $r hset bighash str " 11 "
list [$r hincrby smallhash tmp 1] [$r hincrby bighash tmp 1] catch {$r hincrby smallhash str 1} smallerr
} {12 12} catch {$r hincrby smallhash str 1} bigerr
set rv {}
lappend rv [string match "ERR*not an integer*" $smallerr]
lappend rv [string match "ERR*not an integer*" $bigerr]
} {1 1}
# TODO: # TODO:
# Randomized test, small and big # Randomized test, small and big
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment