diff --git a/redis.c b/redis.c index 8f524dd6..6ad439b0 100644 --- a/redis.c +++ b/redis.c @@ -5483,13 +5483,16 @@ static void zrankCommand(redisClient *c) { while (x->forward[i] && (x->forward[i]->score < *score || (x->forward[i]->score == *score && - compareStringObjects(x->forward[i]->obj,c->argv[2]) < 0))) { + compareStringObjects(x->forward[i]->obj,c->argv[2]) <= 0))) { rank += x->span[i]; x = x->forward[i]; } - if (x->forward[i] && compareStringObjects(x->forward[i]->obj,c->argv[2]) == 0) { - addReplyLong(c, rank); + /* x might be equal to zsl->header, so test if obj is non-NULL */ + if (x->obj && compareStringObjects(x->obj,c->argv[2]) == 0) { + /* the pointer from zsl->header to the first element also spans one, + * which makes the rank 1-based */ + addReplyLong(c, rank-1); return; } } diff --git a/test-redis.tcl b/test-redis.tcl index 4ec3830e..0fc1e7df 100644 --- a/test-redis.tcl +++ b/test-redis.tcl @@ -1545,7 +1545,7 @@ proc main {server port} { set ele [lindex [$r zrange myzset $index $index] 0] set rank [$r zrank myzset $ele] if {$rank != $index} { - set err "$ele RANK is wrong! ($rank != [expr $index+1])" + set err "$ele RANK is wrong! ($rank != $index)" break } }