ClickHouse
75 строк · 2.5 Кб
1#include <Functions/IFunction.h>
2#include <Functions/FunctionFactory.h>
3#include <DataTypes/DataTypeString.h>
4#include <DataTypes/DataTypeNullable.h>
5#include <DataTypes/DataTypeDateTime.h>
6#include <Common/DateLUTImpl.h>
7#include <Core/Field.h>
8
9namespace DB
10{
11
12namespace ErrorCodes
13{
14extern const int BAD_ARGUMENTS;
15}
16
17
18namespace
19{
20
21
22/** timezoneOf(x) - get the name of the timezone of DateTime data type.
23* Example: Pacific/Pitcairn.
24*/
25class FunctionTimezoneOf : public IFunction
26{
27public:
28static constexpr auto name = "timezoneOf";
29String getName() const override { return name; }
30static FunctionPtr create(ContextPtr) { return std::make_unique<FunctionTimezoneOf>(); }
31
32size_t getNumberOfArguments() const override { return 1; }
33
34bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; }
35
36DataTypePtr getReturnTypeImpl(const DataTypes & types) const override
37{
38DataTypePtr type_no_nullable = removeNullable(types[0]);
39
40if (isDateTime(type_no_nullable) || isDateTime64(type_no_nullable))
41return std::make_shared<DataTypeString>();
42else
43throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bad argument for function {}, should be DateTime or DateTime64", name);
44}
45
46bool useDefaultImplementationForNulls() const override { return false; }
47bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }
48ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; }
49
50ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override
51{
52DataTypePtr type_no_nullable = removeNullable(arguments[0].type);
53
54return DataTypeString().createColumnConst(input_rows_count,
55dynamic_cast<const TimezoneMixin &>(*type_no_nullable).getTimeZone().getTimeZone());
56}
57
58ColumnPtr getConstantResultForNonConstArguments(const ColumnsWithTypeAndName & arguments, const DataTypePtr &) const override
59{
60DataTypePtr type_no_nullable = removeNullable(arguments[0].type);
61
62return DataTypeString().createColumnConst(1,
63dynamic_cast<const TimezoneMixin &>(*type_no_nullable).getTimeZone().getTimeZone());
64}
65};
66
67}
68
69REGISTER_FUNCTION(TimezoneOf)
70{
71factory.registerFunction<FunctionTimezoneOf>();
72factory.registerAlias("timeZoneOf", "timezoneOf");
73}
74
75}
76