diff --git a/src/server/generic_family.cc b/src/server/generic_family.cc index 97c03eb96b6a..fb7e9677b94e 100644 --- a/src/server/generic_family.cc +++ b/src/server/generic_family.cc @@ -870,6 +870,9 @@ OpResult OpRen(const OpArgs& op_args, string_view from_key, string_view to is_prior_list = (to_res.it->second.ObjType() == OBJ_LIST); } + // Delete the "from" document from the search index before deleting from the database + op_args.shard->search_indices()->RemoveDoc(from_key, op_args.db_cntx, from_res.it->second); + bool sticky = from_res.it->first.IsSticky(); uint64_t exp_ts = db_slice.ExpireTime(from_res.exp_it); diff --git a/src/server/search/search_family_test.cc b/src/server/search/search_family_test.cc index 82fbc3e71012..00287c3c11d8 100644 --- a/src/server/search/search_family_test.cc +++ b/src/server/search/search_family_test.cc @@ -2722,4 +2722,23 @@ TEST_F(SearchFamilyTest, JsonWithNullFields) { AreDocIds("doc:1", "doc:2")); } +TEST_F(SearchFamilyTest, RenameDocumentBetweenIndices) { + absl::FlagSaver fs; + + SetTestFlag("cluster_mode", "emulated"); + ResetService(); + + EXPECT_EQ(Run({"ft.create", "idx1", "prefix", "1", "idx1", "filter", "@index==\"yes\"", "schema", + "t", "text"}), + "OK"); + EXPECT_EQ(Run({"ft.create", "idx2", "prefix", "1", "idx2", "filter", "@index==\"yes\"", "schema", + "t", "text"}), + "OK"); + + Run({"hset", "idx1:{doc}1", "t", "foo1", "index", "yes"}); + + EXPECT_EQ(Run({"rename", "idx1:{doc}1", "idx2:{doc}1"}), "OK"); + EXPECT_EQ(Run({"rename", "idx2:{doc}1", "idx1:{doc}1"}), "OK"); +} + } // namespace dfly