mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-10 18:05:44 +02:00
chore: fixes the parse error for xread/xreadgroup with unbalanced ids (#4266)
Partially addresses #4193 Signed-off-by: Roman Gershman <roman@dragonflydb.io>
This commit is contained in:
parent
f428dc31be
commit
44e27efc00
3 changed files with 15 additions and 9 deletions
|
@ -361,7 +361,7 @@ int StreamAppendItem(stream* s, CmdArgList fields, uint64_t now_ms, streamID* ad
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Avoid overflow when trying to add an element to the stream (listpack
|
/* Avoid overflow when trying to add an element to the stream (listpack
|
||||||
* can only host up to 32bit length sttrings, and also a total listpack size
|
* can only host up to 32bit length strings, and also a total listpack size
|
||||||
* can't be bigger than 32bit length. */
|
* can't be bigger than 32bit length. */
|
||||||
size_t totelelen = 0;
|
size_t totelelen = 0;
|
||||||
for (size_t i = 0; i < fields.size(); i++) {
|
for (size_t i = 0; i < fields.size(); i++) {
|
||||||
|
@ -2114,8 +2114,12 @@ std::optional<ReadOpts> ParseReadArgsOrReply(CmdArgList args, bool read_group,
|
||||||
|
|
||||||
size_t pair_count = args.size() - opts.streams_arg;
|
size_t pair_count = args.size() - opts.streams_arg;
|
||||||
if ((pair_count % 2) != 0) {
|
if ((pair_count % 2) != 0) {
|
||||||
const auto m = "Unbalanced list of streams: for each stream key an ID must be specified";
|
const char* cmd_name = read_group ? "xreadgroup" : "xread";
|
||||||
builder->SendError(m, kSyntaxErr);
|
const char* symbol = read_group ? ">" : "$";
|
||||||
|
const auto msg = absl::StrCat("Unbalanced '", cmd_name,
|
||||||
|
"' list of streams: for each stream key an ID or '", symbol,
|
||||||
|
"' must be specified");
|
||||||
|
builder->SendError(msg, kSyntaxErr);
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
streams_count = pair_count / 2;
|
streams_count = pair_count / 2;
|
||||||
|
|
|
@ -404,8 +404,8 @@ TEST_F(StreamFamilyTest, XReadInvalidArgs) {
|
||||||
EXPECT_THAT(resp, ErrArg("syntax error"));
|
EXPECT_THAT(resp, ErrArg("syntax error"));
|
||||||
|
|
||||||
// Unbalanced list of streams.
|
// Unbalanced list of streams.
|
||||||
resp = Run({"xread", "count", "invalid", "streams", "s1", "s2", "s3", "0", "0"});
|
resp = Run({"xread", "count", "invalid", "streams", "s1", "s2", "0", "0"});
|
||||||
EXPECT_THAT(resp, ErrArg("syntax error"));
|
EXPECT_THAT(resp, ErrArg("value is not an integer"));
|
||||||
|
|
||||||
// Wrong type.
|
// Wrong type.
|
||||||
Run({"set", "foo", "v"});
|
Run({"set", "foo", "v"});
|
||||||
|
@ -442,7 +442,12 @@ TEST_F(StreamFamilyTest, XReadGroupInvalidArgs) {
|
||||||
|
|
||||||
// Unbalanced list of streams.
|
// Unbalanced list of streams.
|
||||||
resp = Run({"xreadgroup", "group", "group", "alice", "streams", "s1", "s2", "s3", "0", "0"});
|
resp = Run({"xreadgroup", "group", "group", "alice", "streams", "s1", "s2", "s3", "0", "0"});
|
||||||
EXPECT_THAT(resp, ErrArg("syntax error"));
|
EXPECT_THAT(resp, ErrArg("Unbalanced 'xreadgroup' list of streams: for each stream key an ID or "
|
||||||
|
"'>' must be specified"));
|
||||||
|
|
||||||
|
resp = Run({"XREAD", "COUNT", "1", "STREAMS", "mystream"});
|
||||||
|
ASSERT_THAT(resp, ErrArg("Unbalanced 'xread' list of streams: for each stream key an ID or '$' "
|
||||||
|
"must be specified"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(StreamFamilyTest, XReadGroupEmpty) {
|
TEST_F(StreamFamilyTest, XReadGroupEmpty) {
|
||||||
|
|
|
@ -1563,9 +1563,6 @@ OpResult<KeyIndex> DetermineKeys(const CommandId* cid, CmdArgList args) {
|
||||||
string_view arg = ArgS(args, i);
|
string_view arg = ArgS(args, i);
|
||||||
if (absl::EqualsIgnoreCase(arg, "STREAMS")) {
|
if (absl::EqualsIgnoreCase(arg, "STREAMS")) {
|
||||||
size_t left = args.size() - i - 1;
|
size_t left = args.size() - i - 1;
|
||||||
if (left < 2 || left % 2 != 0)
|
|
||||||
return OpStatus::SYNTAX_ERR;
|
|
||||||
|
|
||||||
return KeyIndex(i + 1, i + 1 + (left / 2));
|
return KeyIndex(i + 1, i + 1 + (left / 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue