Browse files

Merge pull request #1586 from mattsta/fix-zunioninterstorekeys

Fix key extraction for z{union,inter}store
  • Loading branch information...
2 parents c1a7d3e + f0782a6 commit aca6cb529bf27b29e7bec4050371a852fb3e8222 @antirez committed Mar 10, 2014
Showing with 16 additions and 2 deletions.
  1. +16 −2 src/db.c
View
18 src/db.c
@@ -993,9 +993,23 @@ int *zunionInterGetKeys(struct redisCommand *cmd,robj **argv, int argc, int *num
*numkeys = 0;
return NULL;
}
- keys = zmalloc(sizeof(int)*num);
+
+ /* Keys in z{union,inter}store come from two places:
+ argv[1] = storage key,
+ argv[3...n] = keys to intersect */
+
+ /* (num+1) is (argv[2] + 1) to account for argv[1] too */
+ keys = zmalloc(sizeof(int)*(num+1));
+
+ /* Add all key positions for argv[3...n] to keys[] */
for (i = 0; i < num; i++) keys[i] = 3+i;
- *numkeys = num;
+
+ /* Now add the argv[1] key position (the storage key target)
+ to our list of command positions containing keys.
+ num is the number of source keys, but we initialized
+ keys[] to size num+1, so keys[num] is safe and valid and okay. */
+ keys[num] = 1;
+ *numkeys = num+1; /* Total keys = {union,inter} keys + storage key */
return keys;
}

0 comments on commit aca6cb5

Please sign in to comment.