Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
7236fdb2
Commit
7236fdb2
authored
Oct 13, 2010
by
Pieter Noordhuis
Browse files
Return error when min and/or max in the sorted set range spec is not a double
parent
91504b6c
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/t_zset.c
View file @
7236fdb2
...
@@ -307,7 +307,8 @@ zskiplistNode* zslistTypeGetElementByRank(zskiplist *zsl, unsigned long rank) {
...
@@ -307,7 +307,8 @@ zskiplistNode* zslistTypeGetElementByRank(zskiplist *zsl, unsigned long rank) {
}
}
/* Populate the rangespec according to the objects min and max. */
/* Populate the rangespec according to the objects min and max. */
int
zslParseRange
(
robj
*
min
,
robj
*
max
,
zrangespec
*
spec
)
{
static
int
zslParseRange
(
robj
*
min
,
robj
*
max
,
zrangespec
*
spec
)
{
char
*
eptr
;
spec
->
minex
=
spec
->
maxex
=
0
;
spec
->
minex
=
spec
->
maxex
=
0
;
/* Parse the min-max interval. If one of the values is prefixed
/* Parse the min-max interval. If one of the values is prefixed
...
@@ -318,20 +319,24 @@ int zslParseRange(robj *min, robj *max, zrangespec *spec) {
...
@@ -318,20 +319,24 @@ int zslParseRange(robj *min, robj *max, zrangespec *spec) {
spec
->
min
=
(
long
)
min
->
ptr
;
spec
->
min
=
(
long
)
min
->
ptr
;
}
else
{
}
else
{
if
(((
char
*
)
min
->
ptr
)[
0
]
==
'('
)
{
if
(((
char
*
)
min
->
ptr
)[
0
]
==
'('
)
{
spec
->
min
=
strtod
((
char
*
)
min
->
ptr
+
1
,
NULL
);
spec
->
min
=
strtod
((
char
*
)
min
->
ptr
+
1
,
&
eptr
);
if
(
eptr
[
0
]
!=
'\0'
||
isnan
(
spec
->
min
))
return
REDIS_ERR
;
spec
->
minex
=
1
;
spec
->
minex
=
1
;
}
else
{
}
else
{
spec
->
min
=
strtod
((
char
*
)
min
->
ptr
,
NULL
);
spec
->
min
=
strtod
((
char
*
)
min
->
ptr
,
&
eptr
);
if
(
eptr
[
0
]
!=
'\0'
||
isnan
(
spec
->
min
))
return
REDIS_ERR
;
}
}
}
}
if
(
max
->
encoding
==
REDIS_ENCODING_INT
)
{
if
(
max
->
encoding
==
REDIS_ENCODING_INT
)
{
spec
->
max
=
(
long
)
max
->
ptr
;
spec
->
max
=
(
long
)
max
->
ptr
;
}
else
{
}
else
{
if
(((
char
*
)
max
->
ptr
)[
0
]
==
'('
)
{
if
(((
char
*
)
max
->
ptr
)[
0
]
==
'('
)
{
spec
->
max
=
strtod
((
char
*
)
max
->
ptr
+
1
,
NULL
);
spec
->
max
=
strtod
((
char
*
)
max
->
ptr
+
1
,
&
eptr
);
if
(
eptr
[
0
]
!=
'\0'
||
isnan
(
spec
->
max
))
return
REDIS_ERR
;
spec
->
maxex
=
1
;
spec
->
maxex
=
1
;
}
else
{
}
else
{
spec
->
max
=
strtod
((
char
*
)
max
->
ptr
,
NULL
);
spec
->
max
=
strtod
((
char
*
)
max
->
ptr
,
&
eptr
);
if
(
eptr
[
0
]
!=
'\0'
||
isnan
(
spec
->
max
))
return
REDIS_ERR
;
}
}
}
}
...
@@ -481,7 +486,10 @@ void zremrangebyscoreCommand(redisClient *c) {
...
@@ -481,7 +486,10 @@ void zremrangebyscoreCommand(redisClient *c) {
zset
*
zs
;
zset
*
zs
;
/* Parse the range arguments. */
/* Parse the range arguments. */
zslParseRange
(
c
->
argv
[
2
],
c
->
argv
[
3
],
&
range
);
if
(
zslParseRange
(
c
->
argv
[
2
],
c
->
argv
[
3
],
&
range
)
!=
REDIS_OK
)
{
addReplyError
(
c
,
"min or max is not a double"
);
return
;
}
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_ZSET
))
return
;
checkType
(
c
,
o
,
REDIS_ZSET
))
return
;
...
@@ -838,7 +846,10 @@ void genericZrangebyscoreCommand(redisClient *c, int reverse, int justcount) {
...
@@ -838,7 +846,10 @@ void genericZrangebyscoreCommand(redisClient *c, int reverse, int justcount) {
void
*
replylen
=
NULL
;
void
*
replylen
=
NULL
;
/* Parse the range arguments. */
/* Parse the range arguments. */
zslParseRange
(
c
->
argv
[
2
],
c
->
argv
[
3
],
&
range
);
if
(
zslParseRange
(
c
->
argv
[
2
],
c
->
argv
[
3
],
&
range
)
!=
REDIS_OK
)
{
addReplyError
(
c
,
"min or max is not a double"
);
return
;
}
/* Parse optional extra arguments. Note that ZCOUNT will exactly have
/* Parse optional extra arguments. Note that ZCOUNT will exactly have
* 4 arguments, so we'll never enter the following code path. */
* 4 arguments, so we'll never enter the following code path. */
...
...
tests/unit/type/zset.tcl
View file @
7236fdb2
...
@@ -253,6 +253,12 @@ start_server {tags {"zset"}} {
...
@@ -253,6 +253,12 @@ start_server {tags {"zset"}} {
assert_equal
{
d 3 c 2
}
[
r zrevrangebyscore zset 5 2 LIMIT 2 3 WITHSCORES
]
assert_equal
{
d 3 c 2
}
[
r zrevrangebyscore zset 5 2 LIMIT 2 3 WITHSCORES
]
}
}
test
"ZRANGEBYSCORE with non-value min or max"
{
assert_error
"*not a double*"
{
r zrangebyscore fooz str 1
}
assert_error
"*not a double*"
{
r zrangebyscore fooz 1 str
}
assert_error
"*not a double*"
{
r zrangebyscore fooz 1 NaN
}
}
tags
{
"slow"
}
{
tags
{
"slow"
}
{
test
{
ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set
}
{
test
{
ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set
}
{
set err
{}
set err
{}
...
@@ -386,6 +392,12 @@ start_server {tags {"zset"}} {
...
@@ -386,6 +392,12 @@ start_server {tags {"zset"}} {
assert_equal
{
a e
}
[
r zrange zset 0 -1
]
assert_equal
{
a e
}
[
r zrange zset 0 -1
]
}
}
test
"ZREMRANGEBYSCORE with non-value min or max"
{
assert_error
"*not a double*"
{
r zremrangebyscore fooz str 1
}
assert_error
"*not a double*"
{
r zremrangebyscore fooz 1 str
}
assert_error
"*not a double*"
{
r zremrangebyscore fooz 1 NaN
}
}
test
"ZREMRANGEBYRANK basics"
{
test
"ZREMRANGEBYRANK basics"
{
proc remrangebyrank
{
min max
}
{
proc remrangebyrank
{
min max
}
{
create_zset zset
{
1 a 2 b 3 c 4 d 5 e
}
create_zset zset
{
1 a 2 b 3 c 4 d 5 e
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment