diff --git a/src/db.c b/src/db.c index 1100c7ef..df2e50ca 100644 --- a/src/db.c +++ b/src/db.c @@ -743,7 +743,7 @@ void moveCommand(client *c) { robj *o; redisDb *src, *dst; int srcid; - long long dbid; + long long dbid, expire; if (server.cluster_enabled) { addReplyError(c,"MOVE is not allowed in cluster mode"); @@ -777,6 +777,7 @@ void moveCommand(client *c) { addReply(c,shared.czero); return; } + expire = getExpire(c->db,c->argv[1]); /* Return zero if the key already exists in the target DB */ if (lookupKeyWrite(dst,c->argv[1]) != NULL) { @@ -784,6 +785,7 @@ void moveCommand(client *c) { return; } dbAdd(dst,c->argv[1],o); + if (expire) setExpire(dst,c->argv[1],expire); incrRefCount(o); /* OK! key moved, free the entry in the source DB */ diff --git a/tests/unit/keyspace.tcl b/tests/unit/keyspace.tcl index e808aaf9..b66dbb2a 100644 --- a/tests/unit/keyspace.tcl +++ b/tests/unit/keyspace.tcl @@ -193,6 +193,19 @@ start_server {tags {"keyspace"}} { set e } {*ERR*index out of range} + test {MOVE can move key expire metadata as well} { + r select 10 + r flushdb + r select 9 + r set mykey foo ex 100 + r move mykey 10 + assert {[r ttl mykey] == -2} + r select 10 + assert {[r ttl mykey] > 0 && [r ttl mykey] <= 100} + assert {[r get mykey] eq "foo"} + r select 9 + } + test {SET/GET keys in different DBs} { r set a hello r set b world