Skip to content

Commit 0e35f78

Browse files
authored
fix(server): hmget non uniqe keys response (#4745)
* fix server: hmget non uniqe keys response Signed-off-by: adi_holden <[email protected]>
1 parent 93ac813 commit 0e35f78

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

src/server/hset_family.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -408,10 +408,10 @@ OpResult<vector<OptStr>> OpHMGet(const OpArgs& op_args, std::string_view key, Cm
408408
if (pv.Encoding() == kEncodingListPack) {
409409
uint8_t* lp = (uint8_t*)pv.RObjPtr();
410410

411-
absl::flat_hash_map<string_view, unsigned> reverse;
411+
absl::flat_hash_map<string_view, absl::InlinedVector<size_t, 3>> reverse;
412412
reverse.reserve(fields.size() + 1);
413413
for (size_t i = 0; i < fields.size(); ++i) {
414-
reverse.emplace(ArgS(fields, i), i); // map fields to their index.
414+
reverse[ArgS(fields, i)].push_back(i); // map fields to their index.
415415
}
416416

417417
size_t lplen = lpLength(lp);
@@ -431,8 +431,10 @@ OpResult<vector<OptStr>> OpHMGet(const OpArgs& op_args, std::string_view key, Cm
431431

432432
auto it = reverse.find(key);
433433
if (it != reverse.end()) {
434-
DCHECK_LT(it->second, result.size());
435-
result[it->second].emplace(LpGetView(lp_elem, ibuf)); // populate found items.
434+
for (size_t index : it->second) {
435+
DCHECK_LT(index, result.size());
436+
result[index].emplace(LpGetView(lp_elem, ibuf)); // populate found items.
437+
}
436438
}
437439

438440
lp_elem = lpNext(lp, lp_elem); // switch to the next key

src/server/hset_family_test.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ TEST_P(HestFamilyTestProtocolVersioned, Get) {
9191
ASSERT_THAT(resp, ArgType(RespExpr::ARRAY));
9292
EXPECT_THAT(resp.GetVec(), ElementsAre("1", "3", ArgType(RespExpr::NIL)));
9393

94+
resp = Run({"hmget", "x", "a", "c", "d", "d", "c", "a"});
95+
ASSERT_THAT(resp, ArgType(RespExpr::ARRAY));
96+
EXPECT_THAT(resp.GetVec(),
97+
ElementsAre("1", "3", ArgType(RespExpr::NIL), ArgType(RespExpr::NIL), "3", "1"));
98+
9499
resp = Run({"hgetall", "x"});
95100
ASSERT_THAT(resp, ArgType(RespExpr::ARRAY));
96101
EXPECT_THAT(resp.GetVec(), ElementsAre("a", "1", "b", "2", "c", "3"));

0 commit comments

Comments
 (0)