From 4ab18a3331a870d9617ec5fc763f227cf4110283 Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 10 Oct 2011 15:21:19 +0200 Subject: [PATCH] Fix for bug #128 about the RENAME command. --- src/db.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/db.c b/src/db.c index 7bfca543..9620b6e8 100644 --- a/src/db.c +++ b/src/db.c @@ -328,6 +328,7 @@ void shutdownCommand(redisClient *c) { void renameGenericCommand(redisClient *c, int nx) { robj *o; + time_t expire; /* To use the same key as src and dst is probably an error */ if (sdscmp(c->argv[1]->ptr,c->argv[2]->ptr) == 0) { @@ -339,16 +340,18 @@ void renameGenericCommand(redisClient *c, int nx) { return; incrRefCount(o); + expire = getExpire(c->db,c->argv[1]); if (lookupKeyWrite(c->db,c->argv[2]) != NULL) { if (nx) { decrRefCount(o); addReply(c,shared.czero); return; } - dbOverwrite(c->db,c->argv[2],o); - } else { - dbAdd(c->db,c->argv[2],o); + /* Overwrite: delete the old key before creating the new one with the same name. */ + dbDelete(c->db,c->argv[2]); } + dbAdd(c->db,c->argv[2],o); + if (expire != -1) setExpire(c->db,c->argv[2],expire); dbDelete(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[2]);