mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 07:31:57 +00:00
Add defaultValueOfTypeName
This commit is contained in:
parent
898e19e18d
commit
4bbcec3d33
69
src/Functions/defaultValueOfTypeName.cpp
Normal file
69
src/Functions/defaultValueOfTypeName.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
#include <Functions/IFunctionImpl.h>
|
||||
#include <Functions/FunctionFactory.h>
|
||||
#include <Core/Field.h>
|
||||
#include <Columns/ColumnConst.h>
|
||||
#include <DataTypes/DataTypeFactory.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int ILLEGAL_COLUMN;
|
||||
}
|
||||
|
||||
/// Returns global default value for type name (example: 0 for numeric types, '' for String).
|
||||
class FunctionDefaultValueOfTypeName : public IFunction
|
||||
{
|
||||
public:
|
||||
static constexpr auto name = "defaultValueOfTypeName";
|
||||
static FunctionPtr create(const Context &)
|
||||
{
|
||||
return std::make_shared<FunctionDefaultValueOfTypeName>();
|
||||
}
|
||||
|
||||
String getName() const override
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
bool useDefaultImplementationForNulls() const override { return false; }
|
||||
bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }
|
||||
|
||||
size_t getNumberOfArguments() const override
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
||||
{
|
||||
auto col_type_const = typeid_cast<const ColumnConst *>(arguments.front().column.get());
|
||||
if (!col_type_const || !isString(arguments.front().type))
|
||||
throw Exception("The argument of function " + getName() + " must be a constant string describing type. "
|
||||
"Instead there is a column with the following structure: " + arguments.front().column->dumpStructure(),
|
||||
ErrorCodes::ILLEGAL_COLUMN);
|
||||
|
||||
return DataTypeFactory::instance().get(col_type_const->getValue<String>());
|
||||
}
|
||||
|
||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) const override
|
||||
{
|
||||
const IDataType & type = *block.getByPosition(arguments[0]).type;
|
||||
block.getByPosition(result).column = type.createColumnConst(input_rows_count, type.getDefault());
|
||||
}
|
||||
|
||||
ColumnPtr getResultIfAlwaysReturnsConstantAndHasArguments(const Block & block, const ColumnNumbers & arguments) const override
|
||||
{
|
||||
const IDataType & type = *block.getByPosition(arguments[0]).type;
|
||||
return type.createColumnConst(1, type.getDefault());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void registerFunctionDefaultValueOfTypeName(FunctionFactory & factory)
|
||||
{
|
||||
factory.registerFunction<FunctionDefaultValueOfTypeName>();
|
||||
}
|
||||
|
||||
}
|
@ -18,6 +18,7 @@ void registerFunctionBlockSerializedSize(FunctionFactory &);
|
||||
void registerFunctionToColumnTypeName(FunctionFactory &);
|
||||
void registerFunctionDumpColumnStructure(FunctionFactory &);
|
||||
void registerFunctionDefaultValueOfArgumentType(FunctionFactory &);
|
||||
void registerFunctionDefaultValueOfTypeName(FunctionFactory &);
|
||||
void registerFunctionBlockSize(FunctionFactory &);
|
||||
void registerFunctionBlockNumber(FunctionFactory &);
|
||||
void registerFunctionRowNumberInBlock(FunctionFactory &);
|
||||
@ -79,6 +80,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory)
|
||||
registerFunctionToColumnTypeName(factory);
|
||||
registerFunctionDumpColumnStructure(factory);
|
||||
registerFunctionDefaultValueOfArgumentType(factory);
|
||||
registerFunctionDefaultValueOfTypeName(factory);
|
||||
registerFunctionBlockSize(factory);
|
||||
registerFunctionBlockNumber(factory);
|
||||
registerFunctionRowNumberInBlock(factory);
|
||||
|
Loading…
Reference in New Issue
Block a user