diff --git a/dbms/src/Functions/randomASKII.cpp b/dbms/src/Functions/randomASKII.cpp index 01b89dc6269..d1138fe0c0d 100644 --- a/dbms/src/Functions/randomASKII.cpp +++ b/dbms/src/Functions/randomASKII.cpp @@ -13,35 +13,94 @@ class FunctionRandomASKII : public IFunction public: static constexpr auto name = "randomASKII"; - static FunctionPtr create(const Context &) - { - return std::make_shared(); - } - - explicit FunctionRandomASKII() - { - } + static FunctionPtr create(const Context &){ return std::make_shared(); } String getName() const override { return name; } - size_t getNumberOfArguments() const override + + size_t getNumberOfArguments() const override { return 1; } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { - return 0; + return std::make_shared() } - DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override + void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override { - return std::make_shared(); + if (!(executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result) + || executeType(block, arguments, result))) + throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName() + + " of argument of function " + getName(), + ErrorCodes::ILLEGAL_COLUMN); } - bool isDeterministic() const override { return false; } - - void executeImpl(Block & block, const ColumnNumbers &, size_t result, size_t input_rows_count) override +private: + template + bool executeType(Block & block, const ColumnNumbers & arguments, size_t result) { - block.getByPosition(result).column = DataTypeString().createColumnConst(input_rows_count, "randomASKII"); + if (const ColumnVector * col_from = checkAndGetColumn>(block.getByPosition(arguments[0]).column.get())) + { + auto col_to = ColumnString::create(); + + const typename ColumnVector::Container & vec_from = col_from->getData(); + ColumnString::Chars & data_to = col_to->getChars(); + ColumnString::Offsets & offsets_to = col_to->getOffsets(); + size_t size = vec_from.size(); + data_to.resize(size * 2); + offsets_to.resize(size); + + WriteBufferFromVector buf_to(data_to); + + for (size_t i = 0; i < size; ++i) + { + // formatReadableSizeWithBinarySuffix(static_cast(vec_from[i]), buf_to); + // writeChar(0, buf_to); + // offsets_to[i] = buf_to.count(); + + } + + buf_to.finish(); +// block.getByPosition(result).column = std::move(col_to); + + block.getByPosition(result).column = DataTypeString().createColumnConst(input_rows_count, "randomASKII"); + return true; + } + + return false; } + + + + // explicit FunctionRandomASKII() + // { + // } + + // size_t getNumberOfArguments() const override + // { + // return 0; + // } + + // DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override + // { + // return std::make_shared(); + // } + + // bool isDeterministic() const override { return false; } + + // void executeImpl(Block & block, const ColumnNumbers &, size_t result, size_t input_rows_count) override + // { + // block.getByPosition(result).column = DataTypeString().createColumnConst(input_rows_count, "randomASKII"); + // } };