Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
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
Show 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