#include #include #include #include #include #include namespace DB { namespace { /// Substitute return type for Date and DateTime class AggregateFunctionGroupUniqArrayDate : public AggregateFunctionGroupUniqArray { DataTypePtr getReturnType() const override { return std::make_shared(std::make_shared()); } }; class AggregateFunctionGroupUniqArrayDateTime : public AggregateFunctionGroupUniqArray { DataTypePtr getReturnType() const override { return std::make_shared(std::make_shared()); } }; static IAggregateFunction * createWithExtraTypes(const DataTypePtr & argument_type) { WhichDataType which(argument_type); if (which.idx == TypeIndex::Date) return new AggregateFunctionGroupUniqArrayDate; else if (which.idx == TypeIndex::DateTime) return new AggregateFunctionGroupUniqArrayDateTime; else { /// Check that we can use plain version of AggreagteFunctionGroupUniqArrayGeneric if (argument_type->isValueUnambiguouslyRepresentedInContiguousMemoryRegion()) return new AggreagteFunctionGroupUniqArrayGeneric(argument_type); else return new AggreagteFunctionGroupUniqArrayGeneric(argument_type); } } AggregateFunctionPtr createAggregateFunctionGroupUniqArray(const std::string & name, const DataTypes & argument_types, const Array & parameters) { assertNoParameters(name, parameters); assertUnary(name, argument_types); AggregateFunctionPtr res(createWithNumericType(*argument_types[0])); if (!res) res = AggregateFunctionPtr(createWithExtraTypes(argument_types[0])); if (!res) throw Exception("Illegal type " + argument_types[0]->getName() + " of argument for aggregate function " + name, ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); return res; } } void registerAggregateFunctionGroupUniqArray(AggregateFunctionFactory & factory) { factory.registerFunction("groupUniqArray", createAggregateFunctionGroupUniqArray); } }