diff --git a/internal/server/crud.go b/internal/server/crud.go index ab0bbdee..32e8393a 100644 --- a/internal/server/crud.go +++ b/internal/server/crud.go @@ -479,17 +479,23 @@ func (s *Server) cmdRENAME(msg *Message) (resp.Value, commandDetails, error) { if col == nil { return retwerr(errKeyNotFound) } - var ierr error + var hasHook, hasChannel bool s.hooks.Ascend(nil, func(v interface{}) bool { h := v.(*Hook) if h.Key == key || h.Key == newKey { - ierr = errKeyHasHooksSet - return false + if h.channel { + hasChannel = true + } else { + hasHook = true + } } return true }) - if ierr != nil { - return retwerr(ierr) + if hasHook { + return retwerr(errKeyHasHooksSet) + } + if hasChannel { + return retwerr(errKeyHasChannelsSet) } var updated bool newCol, _ := s.cols.Get(newKey) diff --git a/internal/server/token.go b/internal/server/token.go index dad0b314..576e4f62 100644 --- a/internal/server/token.go +++ b/internal/server/token.go @@ -21,6 +21,7 @@ var errIDNotFound = errors.New("id not found") var errIDAlreadyExists = errors.New("id already exists") var errPathNotFound = errors.New("path not found") var errKeyHasHooksSet = errors.New("key has hooks set") +var errKeyHasChannelsSet = errors.New("key has channels set") var errNotRectangle = errors.New("not a rectangle") func errInvalidArgument(arg string) error { diff --git a/tests/keys_test.go b/tests/keys_test.go index 58a050c8..b0fcffa2 100644 --- a/tests/keys_test.go +++ b/tests/keys_test.go @@ -113,8 +113,8 @@ func keys_RENAME_test(mc *mockServer) error { Do("RENAME", "foo", "mynewkey").Err("key not found"), Do("SCAN", "mynewkey", "COUNT").Str("1"), Do("SETCHAN", "mychan", "INTERSECTS", "mynewkey", "BOUNDS", 10, 10, 20, 20).Str("1"), - Do("RENAME", "mynewkey", "foo2").Err("key has hooks set"), - Do("RENAMENX", "mynewkey", "foo2").Err("key has hooks set"), + Do("RENAME", "mynewkey", "foo2").Err("key has channels set"), + Do("RENAMENX", "mynewkey", "foo2").Err("key has channels set"), Do("SET", "mykey", "myid1", "HASH", "9my5xp7").OK(), Do("RENAME", "mykey", "foo2").OK(), Do("RENAMENX", "foo2", "foo3").Str("1"),