#include #include #include #include #include #include namespace DB { struct Settings; namespace ErrorCodes { extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; extern const int ILLEGAL_TYPE_OF_ARGUMENT; } namespace { auto parseArguments(const std::string & name, const DataTypes & arguments) { DataTypes args; bool tuple_argument = false; if (arguments.size() == 1) { // sumMap state is fully given by its result, so it can be stored in // SimpleAggregateFunction columns. There is a caveat: it must support // sumMap(sumMap(...)), e.g. it must be able to accept its own output as // an input. This is why it also accepts a Tuple(keys, values) argument. const auto * tuple_type = checkAndGetDataType(arguments[0].get()); if (!tuple_type) throw Exception("When function " + name + " gets one argument it must be a tuple", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); const auto elems = tuple_type->getElements(); args.insert(args.end(), elems.begin(), elems.end()); tuple_argument = true; } else { args.insert(args.end(), arguments.begin(), arguments.end()); tuple_argument = false; } if (args.size() < 2) throw Exception("Aggregate function " + name + " requires at least two arguments of Array type or one argument of tuple of two arrays", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); const auto * array_type = checkAndGetDataType(args[0].get()); if (!array_type) throw Exception("First argument for function " + name + " must be an array, not " + args[0]->getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); DataTypePtr keys_type = array_type->getNestedType(); DataTypes values_types; values_types.reserve(args.size() - 1); for (size_t i = 1; i < args.size(); ++i) { array_type = checkAndGetDataType(args[i].get()); if (!array_type) throw Exception("Argument #" + toString(i) + " for function " + name + " must be an array.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); values_types.push_back(array_type->getNestedType()); } return std::tuple{std::move(keys_type), std::move(values_types), tuple_argument}; } // This function instantiates a particular overload of the sumMap family of // functions. // The template parameter MappedFunction is an aggregate // function template that allows to choose the aggregate function variant that // accepts either normal arguments or tuple argument. template