Change RENAME behavior when src and dst keys are the same.
Fixes issue #2392.
This commit is contained in:
parent
0aa5acc8f3
commit
fc365a3a00
14
src/db.c
14
src/db.c
@ -688,16 +688,20 @@ void shutdownCommand(redisClient *c) {
|
|||||||
void renameGenericCommand(redisClient *c, int nx) {
|
void renameGenericCommand(redisClient *c, int nx) {
|
||||||
robj *o;
|
robj *o;
|
||||||
long long expire;
|
long long expire;
|
||||||
|
int samekey = 0;
|
||||||
|
|
||||||
/* To use the same key as src and dst is probably an error */
|
/* When source and dest key is the same, no operation is performed,
|
||||||
if (sdscmp(c->argv[1]->ptr,c->argv[2]->ptr) == 0) {
|
* if the key exists, however we still return an error on unexisting key. */
|
||||||
addReply(c,shared.sameobjecterr);
|
if (sdscmp(c->argv[1]->ptr,c->argv[2]->ptr) == 0) samekey = 1;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr)) == NULL)
|
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (samekey) {
|
||||||
|
addReply(c,nx ? shared.czero : shared.ok);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
incrRefCount(o);
|
incrRefCount(o);
|
||||||
expire = getExpire(c->db,c->argv[1]);
|
expire = getExpire(c->db,c->argv[1]);
|
||||||
if (lookupKeyWrite(c->db,c->argv[2]) != NULL) {
|
if (lookupKeyWrite(c->db,c->argv[2]) != NULL) {
|
||||||
|
@ -368,7 +368,18 @@ start_server {tags {"basic"}} {
|
|||||||
format $err
|
format $err
|
||||||
} {ERR*}
|
} {ERR*}
|
||||||
|
|
||||||
test {RENAME where source and dest key is the same} {
|
test {RENAME where source and dest key are the same (existing)} {
|
||||||
|
r set mykey foo
|
||||||
|
r rename mykey mykey
|
||||||
|
} {OK}
|
||||||
|
|
||||||
|
test {RENAMENX where source and dest key are the same (existing)} {
|
||||||
|
r set mykey foo
|
||||||
|
r renamenx mykey mykey
|
||||||
|
} {0}
|
||||||
|
|
||||||
|
test {RENAME where source and dest key are the same (non existing)} {
|
||||||
|
r del mykey
|
||||||
catch {r rename mykey mykey} err
|
catch {r rename mykey mykey} err
|
||||||
format $err
|
format $err
|
||||||
} {ERR*}
|
} {ERR*}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user