From 674f06875c28f229ed54efc670e7d5980d30c396 Mon Sep 17 00:00:00 2001 From: Rounak Nandanwar Date: Mon, 10 Jul 2023 12:20:59 +0530 Subject: [PATCH] fix: zunion and zunionstore zero numkeys bug (#1522) Fixes #1442 Signed-off-by: rounaknandanwar --- src/server/transaction.cc | 6 ++++-- src/server/zset_family.cc | 2 +- src/server/zset_family_test.cc | 6 ++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/server/transaction.cc b/src/server/transaction.cc index 6fbaec62b..834ee4c42 100644 --- a/src/server/transaction.cc +++ b/src/server/transaction.cc @@ -1445,12 +1445,14 @@ OpResult DetermineKeys(const CommandId* cid, CmdArgList args) { if (!absl::SimpleAtoi(num, &num_custom_keys) || num_custom_keys < 0) return OpStatus::INVALID_INT; - // TODO Fix this for Z family functions. - // Examples that crash: ZUNION 0 myset if (name == "ZDIFF" && num_custom_keys == 0) { return OpStatus::INVALID_INT; } + if (name == "ZUNION" && num_custom_keys == 0) { + return OpStatus::SYNTAX_ERR; + } + if (args.size() < size_t(num_custom_keys) + num_keys_index + 1) return OpStatus::SYNTAX_ERR; } diff --git a/src/server/zset_family.cc b/src/server/zset_family.cc index 51197cf5d..17346b044 100644 --- a/src/server/zset_family.cc +++ b/src/server/zset_family.cc @@ -956,7 +956,7 @@ OpResult FillAggType(string_view agg, SetOpArgs* op_args) { // Parse functions return the number of arguments read from CmdArgList OpResult ParseAggregate(CmdArgList args, bool store, SetOpArgs* op_args) { - if (args.size() < 1) { + if (args.size() <= 1) { return OpStatus::SYNTAX_ERR; } diff --git a/src/server/zset_family_test.cc b/src/server/zset_family_test.cc index 86e7f50b7..947de4230 100644 --- a/src/server/zset_family_test.cc +++ b/src/server/zset_family_test.cc @@ -291,6 +291,9 @@ TEST_F(ZSetFamilyTest, ZUnionError) { resp = Run({"zunion", "0"}); EXPECT_THAT(resp, ErrArg("wrong number of arguments")); + resp = Run({"zunion", "0", "myset"}); + EXPECT_THAT(resp, ErrArg("syntax error")); + resp = Run({"zunion", "3", "z1", "z2", "z3", "weights", "1", "1", "k"}); EXPECT_THAT(resp, ErrArg("weight value is not a float")); @@ -360,6 +363,9 @@ TEST_F(ZSetFamilyTest, ZUnionStore) { resp = Run({"zunionstore", "key", "0"}); EXPECT_THAT(resp, ErrArg("wrong number of arguments")); + resp = Run({"zunionstore", "key", "0", "aggregate"}); + EXPECT_THAT(resp, ErrArg("syntax error")); + resp = Run({"zunionstore", "key", "0", "aggregate", "sum"}); EXPECT_THAT(resp, ErrArg("at least 1 input key is needed")); resp = Run({"zunionstore", "key", "-1", "aggregate", "sum"});