Skip to content

Commit 973d77b

Browse files
authored
fix: bitfield no operations command (#5756)
1 parent 1894ba5 commit 973d77b

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

src/server/bitops_family.cc

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,9 +1033,7 @@ nonstd::expected<CommandList, string> ParseToCommandList(CmdArgList args, bool r
10331033
}
10341034

10351035
if (cmd == Cmds::OVERFLOW_OPT) {
1036-
if (read_only) {
1037-
make_unexpected("BITFIELD_RO only supports the GET subcommand");
1038-
}
1036+
// BITFIELD_RO shouldn't support this cmd, but it is ignored in Valkey so we ignore it too
10391037
using pol = Overflow::Policy;
10401038
auto res = parser.MapNext("SAT", pol::SAT, "WRAP", pol::WRAP, "FAIL", pol::FAIL);
10411039
if (!parser.HasError()) {
@@ -1086,7 +1084,7 @@ void SendResults(const vector<ResultType>& results, SinkReplyBuilder* builder) {
10861084
auto* rb = static_cast<RedisReplyBuilder*>(builder);
10871085
const size_t total = results.size();
10881086
if (total == 0) {
1089-
rb->SendNullArray();
1087+
rb->SendEmptyArray();
10901088
return;
10911089
}
10921090

@@ -1102,7 +1100,7 @@ void SendResults(const vector<ResultType>& results, SinkReplyBuilder* builder) {
11021100
void BitFieldGeneric(CmdArgList args, bool read_only, Transaction* tx, SinkReplyBuilder* builder) {
11031101
if (args.size() == 1) {
11041102
auto* rb = static_cast<RedisReplyBuilder*>(builder);
1105-
rb->SendNullArray();
1103+
rb->SendEmptyArray();
11061104
return;
11071105
}
11081106
auto key = ArgS(args, 0);
@@ -1394,8 +1392,8 @@ void BitOpsFamily::Register(CommandRegistry* registry) {
13941392
registry->StartFamily();
13951393
*registry << CI{"BITPOS", CO::CommandOpt::READONLY, -3, 1, 1, acl::kBitPos}.SetHandler(&BitPos)
13961394
<< CI{"BITCOUNT", CO::READONLY, -2, 1, 1, acl::kBitCount}.SetHandler(&BitCount)
1397-
<< CI{"BITFIELD", CO::WRITE, -3, 1, 1, acl::kBitField}.SetHandler(&BitField)
1398-
<< CI{"BITFIELD_RO", CO::READONLY, -5, 1, 1, acl::kBitFieldRo}.SetHandler(&BitFieldRo)
1395+
<< CI{"BITFIELD", CO::WRITE, -2, 1, 1, acl::kBitField}.SetHandler(&BitField)
1396+
<< CI{"BITFIELD_RO", CO::READONLY, -2, 1, 1, acl::kBitFieldRo}.SetHandler(&BitFieldRo)
13991397
<< CI{"BITOP", CO::WRITE | CO::NO_AUTOJOURNAL, -4, 2, -1, acl::kBitOp}.SetHandler(
14001398
&BitOp)
14011399
<< CI{"GETBIT", CO::READONLY | CO::FAST, 3, 1, 1, acl::kGetBit}.SetHandler(&GetBit)

src/server/bitops_family_test.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,4 +880,11 @@ TEST_F(BitOpsFamilyTest, BitFieldAdditionalWrongArguments) {
880880
ASSERT_THAT(Run({"bitfield", "foo", "incrby", "i16", "0", "bar"}), syntax_error);
881881
}
882882

883+
TEST_F(BitOpsFamilyTest, BitFieldNoOps) {
884+
EXPECT_THAT(Run({"BITFIELD", "k", "OVERFLOW", "SAT"}), RespArray(ElementsAre()));
885+
EXPECT_THAT(Run({"BITFIELD", "k"}), RespArray(ElementsAre()));
886+
EXPECT_THAT(Run({"BITFIELD_RO", "k", "OVERFLOW", "SAT"}), RespArray(ElementsAre()));
887+
EXPECT_THAT(Run({"BITFIELD_RO", "k"}), RespArray(ElementsAre()));
888+
}
889+
883890
} // end of namespace dfly

0 commit comments

Comments
 (0)