diff options
author | antirez <antirez@gmail.com> | 2015-02-23 11:24:24 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2015-02-23 11:24:24 +0100 |
commit | fc365a3a001d0ec55e6bde914708911aa1b524c4 (patch) | |
tree | 9884ddc5761432b60d04557c06500665c3600465 /src/db.c | |
parent | 0aa5acc8f31a45ba4ee625227bae80e125fd8bdb (diff) | |
download | redis-fc365a3a001d0ec55e6bde914708911aa1b524c4.tar.gz |
Change RENAME behavior when src and dst keys are the same.
Fixes issue #2392.
Diffstat (limited to 'src/db.c')
-rw-r--r-- | src/db.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -688,16 +688,20 @@ void shutdownCommand(redisClient *c) { void renameGenericCommand(redisClient *c, int nx) { robj *o; long long expire; + int samekey = 0; - /* To use the same key as src and dst is probably an error */ - if (sdscmp(c->argv[1]->ptr,c->argv[2]->ptr) == 0) { - addReply(c,shared.sameobjecterr); - return; - } + /* When source and dest key is the same, no operation is performed, + * if the key exists, however we still return an error on unexisting key. */ + if (sdscmp(c->argv[1]->ptr,c->argv[2]->ptr) == 0) samekey = 1; if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr)) == NULL) return; + if (samekey) { + addReply(c,nx ? shared.czero : shared.ok); + return; + } + incrRefCount(o); expire = getExpire(c->db,c->argv[1]); if (lookupKeyWrite(c->db,c->argv[2]) != NULL) { |