Fix key extraction for SORT

We only want to use the last STORE key, but we have to record
we actually found a STORE key so we can increment the final return
key count.

Test added to prevent further regression.

Closes #1883, #1645, #1647
This commit is contained in:
Matt Stancliff 2014-07-21 17:31:21 -04:00 committed by antirez
parent 53fdfda9e3
commit 87815ab5ba
2 changed files with 11 additions and 2 deletions

View File

@ -1076,7 +1076,7 @@ int *evalGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
* follow in SQL-alike style. Here we parse just the minimum in order to * follow in SQL-alike style. Here we parse just the minimum in order to
* correctly identify keys in the "STORE" option. */ * correctly identify keys in the "STORE" option. */
int *sortGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys) { int *sortGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys) {
int i, j, num, *keys; int i, j, num, *keys, found_store = 0;
REDIS_NOTUSED(cmd); REDIS_NOTUSED(cmd);
num = 0; num = 0;
@ -1107,12 +1107,13 @@ int *sortGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
/* Note: we don't increment "num" here and continue the loop /* Note: we don't increment "num" here and continue the loop
* to be sure to process the *last* "STORE" option if multiple * to be sure to process the *last* "STORE" option if multiple
* ones are provided. This is same behavior as SORT. */ * ones are provided. This is same behavior as SORT. */
found_store = 1;
keys[num] = i+1; /* <store-key> */ keys[num] = i+1; /* <store-key> */
break; break;
} }
} }
} }
*numkeys = num; *numkeys = num + found_store;
return keys; return keys;
} }

View File

@ -95,6 +95,14 @@ start_server {
assert_encoding ziplist sort-res assert_encoding ziplist sort-res
} }
test "SORT extracts STORE correctly" {
r command getkeys sort abc store def
} {abc def}
test "SORT extracts multiple STORE correctly" {
r command getkeys sort abc store invalid store stillbad store def
} {abc def}
test "SORT DESC" { test "SORT DESC" {
assert_equal [lsort -decreasing -integer $result] [r sort tosort DESC] assert_equal [lsort -decreasing -integer $result] [r sort tosort DESC]
} }