Add support for nan in RESP3 double (#1133)
This commit is contained in:
parent
991b0b0b31
commit
f0bdf8405b
6
read.c
6
read.c
@ -303,11 +303,13 @@ static int processLineItem(redisReader *r) {
|
|||||||
d = INFINITY; /* Positive infinite. */
|
d = INFINITY; /* Positive infinite. */
|
||||||
} else if (len == 4 && strcasecmp(buf,"-inf") == 0) {
|
} else if (len == 4 && strcasecmp(buf,"-inf") == 0) {
|
||||||
d = -INFINITY; /* Negative infinite. */
|
d = -INFINITY; /* Negative infinite. */
|
||||||
|
} else if (len == 3 && strcasecmp(buf,"nan") == 0) {
|
||||||
|
d = NAN; /* nan. */
|
||||||
} else {
|
} else {
|
||||||
d = strtod((char*)buf,&eptr);
|
d = strtod((char*)buf,&eptr);
|
||||||
/* RESP3 only allows "inf", "-inf", and finite values, while
|
/* RESP3 only allows "inf", "-inf", and finite values, while
|
||||||
* strtod() allows other variations on infinity, NaN,
|
* strtod() allows other variations on infinity,
|
||||||
* etc. We explicity handle our two allowed infinite cases
|
* etc. We explicity handle our two allowed infinite cases and NaN
|
||||||
* above, so strtod() should only result in finite values. */
|
* above, so strtod() should only result in finite values. */
|
||||||
if (buf[0] == '\0' || eptr != &buf[len] || !isfinite(d)) {
|
if (buf[0] == '\0' || eptr != &buf[len] || !isfinite(d)) {
|
||||||
__redisReaderSetError(r,REDIS_ERR_PROTOCOL,
|
__redisReaderSetError(r,REDIS_ERR_PROTOCOL,
|
||||||
|
|||||||
7
test.c
7
test.c
@ -674,12 +674,13 @@ static void test_reply_reader(void) {
|
|||||||
freeReplyObject(reply);
|
freeReplyObject(reply);
|
||||||
redisReaderFree(reader);
|
redisReaderFree(reader);
|
||||||
|
|
||||||
test("Set error when RESP3 double is NaN: ");
|
test("Correctly parses RESP3 double NaN: ");
|
||||||
reader = redisReaderCreate();
|
reader = redisReaderCreate();
|
||||||
redisReaderFeed(reader, ",nan\r\n",6);
|
redisReaderFeed(reader, ",nan\r\n",6);
|
||||||
ret = redisReaderGetReply(reader,&reply);
|
ret = redisReaderGetReply(reader,&reply);
|
||||||
test_cond(ret == REDIS_ERR &&
|
test_cond(ret == REDIS_OK &&
|
||||||
strcasecmp(reader->errstr,"Bad double value") == 0);
|
((redisReply*)reply)->type == REDIS_REPLY_DOUBLE &&
|
||||||
|
isnan(((redisReply*)reply)->dval));
|
||||||
freeReplyObject(reply);
|
freeReplyObject(reply);
|
||||||
redisReaderFree(reader);
|
redisReaderFree(reader);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user