summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2011-02-23 09:39:29 +0100
committerPieter Noordhuis <pcnoordhuis@gmail.com>2011-02-23 09:39:29 +0100
commit61e254767591198d0cc191c043509d5b573cd526 (patch)
tree476ea5a249da32ffc1a361eaf418d168188fdfa4
parent595b5974f8865d5f77b8914336355472a619449d (diff)
downloadredis-61e254767591198d0cc191c043509d5b573cd526.tar.gz
Restore argc/argv in EXEC after command is executed
-rw-r--r--src/multi.c4
-rw-r--r--tests/unit/other.tcl7
2 files changed, 11 insertions, 0 deletions
diff --git a/src/multi.c b/src/multi.c
index 59fc9d9e8..ba3a0cd6c 100644
--- a/src/multi.c
+++ b/src/multi.c
@@ -110,6 +110,10 @@ void execCommand(redisClient *c) {
c->argc = c->mstate.commands[j].argc;
c->argv = c->mstate.commands[j].argv;
call(c,c->mstate.commands[j].cmd);
+
+ /* Commands may alter argc/argv, restore mstate. */
+ c->mstate.commands[j].argc = c->argc;
+ c->mstate.commands[j].argv = c->argv;
}
c->argv = orig_argv;
c->argc = orig_argc;
diff --git a/tests/unit/other.tcl b/tests/unit/other.tcl
index c142ba7f0..c090d1d2c 100644
--- a/tests/unit/other.tcl
+++ b/tests/unit/other.tcl
@@ -174,6 +174,13 @@ start_server {tags {"other"}} {
set _ $err
} {*ERR MULTI*}
+ test {MULTI where commands alter argc/argv} {
+ r sadd myset a
+ r multi
+ r spop myset
+ list [r exec] [r exists myset]
+ } {a 0}
+
test {WATCH inside MULTI is not allowed} {
set err {}
r multi