ClickHouse

Форк
0
/
globalVariable.cpp 
96 строк · 2.9 Кб
1
#include <Functions/IFunction.h>
2
#include <Functions/FunctionFactory.h>
3
#include <Functions/FunctionHelpers.h>
4
#include <DataTypes/DataTypesNumber.h>
5
#include <DataTypes/DataTypeString.h>
6
#include <Columns/ColumnString.h>
7
#include <Columns/ColumnConst.h>
8
#include <Core/Field.h>
9

10
#include <unordered_map>
11
#include <Poco/String.h>
12

13

14
namespace DB
15
{
16
namespace ErrorCodes
17
{
18
    extern const int BAD_ARGUMENTS;
19
}
20

21
namespace
22
{
23

24
/** globalVariable('name') - takes constant string argument and returns the value of global variable with that name.
25
  * It is intended for compatibility with MySQL.
26
  *
27
  * Currently it's a stub, no variables are implemented. Feel free to add more variables.
28
  */
29
class FunctionGlobalVariable : public IFunction
30
{
31
public:
32
    static constexpr auto name = "globalVariable";
33
    static FunctionPtr create(ContextPtr)
34
    {
35
        return std::make_shared<FunctionGlobalVariable>();
36
    }
37

38
    String getName() const override
39
    {
40
        return name;
41
    }
42

43
    size_t getNumberOfArguments() const override
44
    {
45
        return 1;
46
    }
47

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

50
    DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
51
    {
52
        if (!checkColumnConst<ColumnString>(arguments[0].column.get()))
53
            throw Exception(ErrorCodes::BAD_ARGUMENTS, "Argument of function {} must be constant string", getName());
54

55
        String variable_name = assert_cast<const ColumnConst &>(*arguments[0].column).getValue<String>();
56
        auto variable = global_variable_map.find(Poco::toLower(variable_name));
57
        if (variable == global_variable_map.end())
58
            return std::make_shared<DataTypeInt32>();
59
        else
60
            return variable->second.type;
61
    }
62

63
    ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override
64
    {
65
        const ColumnWithTypeAndName & col = arguments[0];
66
        String variable_name = assert_cast<const ColumnConst &>(*col.column).getValue<String>();
67
        auto variable = global_variable_map.find(Poco::toLower(variable_name));
68

69
        Field val = 0;
70
        if (variable != global_variable_map.end())
71
            val = variable->second.value;
72

73
        return result_type->createColumnConst(input_rows_count, val);
74
    }
75

76
private:
77
    struct TypeAndValue
78
    {
79
        DataTypePtr type;
80
        Field value;
81
    };
82
    std::unordered_map<String, TypeAndValue> global_variable_map
83
        = {{"max_allowed_packet", {std::make_shared<DataTypeInt32>(), 67108864}},
84
           {"version", {std::make_shared<DataTypeString>(), "5.7.30"}},
85
           {"version_comment", {std::make_shared<DataTypeString>(), ""}},
86
           {"transaction_isolation", {std::make_shared<DataTypeString>(), "READ-UNCOMMITTED"}}};
87
};
88

89
}
90

91
REGISTER_FUNCTION(GlobalVariable)
92
{
93
    factory.registerFunction<FunctionGlobalVariable>();
94
}
95

96
}
97

98

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

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

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

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