ClickHouse
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
14namespace DB
15{
16namespace ErrorCodes
17{
18extern const int BAD_ARGUMENTS;
19}
20
21namespace
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*/
29class FunctionGlobalVariable : public IFunction
30{
31public:
32static constexpr auto name = "globalVariable";
33static FunctionPtr create(ContextPtr)
34{
35return std::make_shared<FunctionGlobalVariable>();
36}
37
38String getName() const override
39{
40return name;
41}
42
43size_t getNumberOfArguments() const override
44{
45return 1;
46}
47
48bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; }
49
50DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
51{
52if (!checkColumnConst<ColumnString>(arguments[0].column.get()))
53throw Exception(ErrorCodes::BAD_ARGUMENTS, "Argument of function {} must be constant string", getName());
54
55String variable_name = assert_cast<const ColumnConst &>(*arguments[0].column).getValue<String>();
56auto variable = global_variable_map.find(Poco::toLower(variable_name));
57if (variable == global_variable_map.end())
58return std::make_shared<DataTypeInt32>();
59else
60return variable->second.type;
61}
62
63ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override
64{
65const ColumnWithTypeAndName & col = arguments[0];
66String variable_name = assert_cast<const ColumnConst &>(*col.column).getValue<String>();
67auto variable = global_variable_map.find(Poco::toLower(variable_name));
68
69Field val = 0;
70if (variable != global_variable_map.end())
71val = variable->second.value;
72
73return result_type->createColumnConst(input_rows_count, val);
74}
75
76private:
77struct TypeAndValue
78{
79DataTypePtr type;
80Field value;
81};
82std::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
91REGISTER_FUNCTION(GlobalVariable)
92{
93factory.registerFunction<FunctionGlobalVariable>();
94}
95
96}
97
98