]> git.saurik.com Git - redis.git/commitdiff
HDEL: Abort deleting fields when hash is removed
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Wed, 27 Jul 2011 10:29:36 +0000 (12:29 +0200)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Wed, 27 Jul 2011 10:29:40 +0000 (12:29 +0200)
src/t_hash.c
tests/unit/type/hash.tcl

index 4b9b37d69fed10b3c3586583dc0b38997647e887..83ca5b2754c3fce9d9e9bede7e1a1d95e90ba7f2 100644 (file)
@@ -403,8 +403,11 @@ void hdelCommand(redisClient *c) {
 
     for (j = 2; j < c->argc; j++) {
         if (hashTypeDelete(o,c->argv[j])) {
 
     for (j = 2; j < c->argc; j++) {
         if (hashTypeDelete(o,c->argv[j])) {
-            if (hashTypeLength(o) == 0) dbDelete(c->db,c->argv[1]);
             deleted++;
             deleted++;
+            if (hashTypeLength(o) == 0) {
+                dbDelete(c->db,c->argv[1]);
+                break;
+            }
         }
     }
     if (deleted) {
         }
     }
     if (deleted) {
index 9b043d3f3c3614f8f8154922a1c36dc4bd7dbacc..718bc04ad3a98988cc09c4e91c59965f7baba362 100644 (file)
@@ -235,6 +235,13 @@ start_server {tags {"hash"}} {
         r hgetall myhash
     } {b 2}
 
         r hgetall myhash
     } {b 2}
 
+    test {HDEL - hash becomes empty before deleting all specified fields} {
+        r del myhash
+        r hmset myhash a 1 b 2 c 3
+        assert_equal 3 [r hdel myhash a b c d e]
+        assert_equal 0 [r exists myhash]
+    }
+
     test {HEXISTS} {
         set rv {}
         set k [lindex [array names smallhash *] 0]
     test {HEXISTS} {
         set rv {}
         set k [lindex [array names smallhash *] 0]