ClickHouse

Форк
0
/
timezoneOf.cpp 
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

9
namespace DB
10
{
11

12
namespace ErrorCodes
13
{
14
    extern const int BAD_ARGUMENTS;
15
}
16

17

18
namespace
19
{
20

21

22
/** timezoneOf(x) - get the name of the timezone of DateTime data type.
23
  * Example: Pacific/Pitcairn.
24
  */
25
class FunctionTimezoneOf : public IFunction
26
{
27
public:
28
    static constexpr auto name = "timezoneOf";
29
    String getName() const override { return name; }
30
    static FunctionPtr create(ContextPtr) { return std::make_unique<FunctionTimezoneOf>(); }
31

32
    size_t getNumberOfArguments() const override { return 1; }
33

34
    bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; }
35

36
    DataTypePtr getReturnTypeImpl(const DataTypes & types) const override
37
    {
38
        DataTypePtr type_no_nullable = removeNullable(types[0]);
39

40
        if (isDateTime(type_no_nullable) || isDateTime64(type_no_nullable))
41
            return std::make_shared<DataTypeString>();
42
        else
43
            throw Exception(ErrorCodes::BAD_ARGUMENTS, "Bad argument for function {}, should be DateTime or DateTime64", name);
44
    }
45

46
    bool useDefaultImplementationForNulls() const override { return false; }
47
    bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }
48
    ColumnNumbers getArgumentsThatDontImplyNullableReturnType(size_t /*number_of_arguments*/) const override { return {0}; }
49

50
    ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override
51
    {
52
        DataTypePtr type_no_nullable = removeNullable(arguments[0].type);
53

54
        return DataTypeString().createColumnConst(input_rows_count,
55
            dynamic_cast<const TimezoneMixin &>(*type_no_nullable).getTimeZone().getTimeZone());
56
    }
57

58
    ColumnPtr getConstantResultForNonConstArguments(const ColumnsWithTypeAndName & arguments, const DataTypePtr &) const override
59
    {
60
        DataTypePtr type_no_nullable = removeNullable(arguments[0].type);
61

62
        return DataTypeString().createColumnConst(1,
63
            dynamic_cast<const TimezoneMixin &>(*type_no_nullable).getTimeZone().getTimeZone());
64
    }
65
};
66

67
}
68

69
REGISTER_FUNCTION(TimezoneOf)
70
{
71
    factory.registerFunction<FunctionTimezoneOf>();
72
    factory.registerAlias("timeZoneOf", "timezoneOf");
73
}
74

75
}
76

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.