]> git.saurik.com Git - redis.git/commitdiff
Make SORT BY <constant> STORE ... to always produce the same output by force sorting...
authorantirez <antirez@gmail.com>
Wed, 1 Feb 2012 16:05:45 +0000 (17:05 +0100)
committerantirez <antirez@gmail.com>
Wed, 1 Feb 2012 16:05:45 +0000 (17:05 +0100)
src/sort.c
tests/unit/sort.tcl

index 11b73ad389d69f4482d106885875ff7be71d6068..3f02e49a709a4cbf32c6d4ba92480de55d218f05 100644 (file)
@@ -203,6 +203,15 @@ void sortCommand(redisClient *c) {
         j++;
     }
 
+    /* If we have STORE we need to force sorting for deterministic output
+     * and replication. We use alpha sorting since this is guaranteed to
+     * work with any input. */
+    if (storekey && dontsort) {
+        dontsort = 0;
+        alpha = 1;
+        sortby = NULL;
+    }
+
     /* Destructively convert encoded sorted sets for SORT. */
     if (sortval->type == REDIS_ZSET)
         zsetConvert(sortval, REDIS_ENCODING_SKIPLIST);
index a50f04736106ec4e27bfaa7257d0d2e0816379a5..20eec44bc903c50a7418ee5723e0c3262e3eb867 100644 (file)
@@ -157,6 +157,13 @@ start_server {
         r exists foo
     } {0}
 
+    test "SORT with BY <constant> and STORE should still order output" {
+        r del myset mylist
+        r sadd myset a b c d e f g h i l m n o p q r s t u v z
+        r sort myset alpha by _ store mylist
+        r lrange mylist 0 -1
+    } {a b c d e f g h i l m n o p q r s t u v z}
+
     tags {"slow"} {
         set num 100
         set res [create_random_dataset $num lpush]