Merge pull request #4737 from guybe7/zlexcount_fix

Don't call sdscmp() with shared.maxstring or shared.minstring
This commit is contained in:
Salvatore Sanfilippo 2018-11-28 16:53:32 +01:00 committed by GitHub
commit 6a6471aad5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 9 deletions

View File

@ -574,12 +574,12 @@ int zslParseLexRangeItem(robj *item, sds *dest, int *ex) {
switch(c[0]) { switch(c[0]) {
case '+': case '+':
if (c[1] != '\0') return C_ERR; if (c[1] != '\0') return C_ERR;
*ex = 0; *ex = 1;
*dest = shared.maxstring; *dest = shared.maxstring;
return C_OK; return C_OK;
case '-': case '-':
if (c[1] != '\0') return C_ERR; if (c[1] != '\0') return C_ERR;
*ex = 0; *ex = 1;
*dest = shared.minstring; *dest = shared.minstring;
return C_OK; return C_OK;
case '(': case '(':
@ -652,9 +652,8 @@ int zslIsInLexRange(zskiplist *zsl, zlexrangespec *range) {
zskiplistNode *x; zskiplistNode *x;
/* Test for ranges that will always be empty. */ /* Test for ranges that will always be empty. */
if (sdscmplex(range->min,range->max) > 1 || int cmp = sdscmplex(range->min,range->max);
(sdscmp(range->min,range->max) == 0 && if (cmp > 0 || (cmp == 0 && (range->minex || range->maxex)))
(range->minex || range->maxex)))
return 0; return 0;
x = zsl->tail; x = zsl->tail;
if (x == NULL || !zslLexValueGteMin(x->ele,range)) if (x == NULL || !zslLexValueGteMin(x->ele,range))
@ -927,9 +926,8 @@ int zzlIsInLexRange(unsigned char *zl, zlexrangespec *range) {
unsigned char *p; unsigned char *p;
/* Test for ranges that will always be empty. */ /* Test for ranges that will always be empty. */
if (sdscmplex(range->min,range->max) > 1 || int cmp = sdscmplex(range->min,range->max);
(sdscmp(range->min,range->max) == 0 && if (cmp > 0 || (cmp == 0 && (range->minex || range->maxex)))
(range->minex || range->maxex)))
return 0; return 0;
p = ziplistIndex(zl,-2); /* Last element. */ p = ziplistIndex(zl,-2); /* Last element. */

View File

@ -388,7 +388,7 @@ start_server {tags {"zset"}} {
0 omega} 0 omega}
} }
test "ZRANGEBYLEX/ZREVRANGEBYLEX/ZCOUNT basics" { test "ZRANGEBYLEX/ZREVRANGEBYLEX/ZLEXCOUNT basics" {
create_default_lex_zset create_default_lex_zset
# inclusive range # inclusive range
@ -416,6 +416,22 @@ start_server {tags {"zset"}} {
assert_equal {} [r zrevrangebylex zset \[elez \[elex] assert_equal {} [r zrevrangebylex zset \[elez \[elex]
assert_equal {} [r zrevrangebylex zset (hill (omega] assert_equal {} [r zrevrangebylex zset (hill (omega]
} }
test "ZLEXCOUNT advanced" {
create_default_lex_zset
assert_equal 9 [r zlexcount zset - +]
assert_equal 0 [r zlexcount zset + -]
assert_equal 0 [r zlexcount zset + \[c]
assert_equal 0 [r zlexcount zset \[c -]
assert_equal 8 [r zlexcount zset \[bar +]
assert_equal 5 [r zlexcount zset \[bar \[foo]
assert_equal 4 [r zlexcount zset \[bar (foo]
assert_equal 4 [r zlexcount zset (bar \[foo]
assert_equal 3 [r zlexcount zset (bar (foo]
assert_equal 5 [r zlexcount zset - (foo]
assert_equal 1 [r zlexcount zset (maxstring +]
}
test "ZRANGEBYSLEX with LIMIT" { test "ZRANGEBYSLEX with LIMIT" {
create_default_lex_zset create_default_lex_zset