ClickHouse
63 строки · 2.0 Кб
1#include <Columns/ColumnConst.h>
2#include <Columns/ColumnString.h>
3#include <DataTypes/DataTypeString.h>
4#include <DataTypes/DataTypesNumber.h>
5#include <Functions/FunctionFactory.h>
6#include <Functions/FunctionHelpers.h>
7#include <Functions/IFunction.h>
8
9#include <Common/logger_useful.h>
10
11namespace DB
12{
13namespace ErrorCodes
14{
15extern const int ILLEGAL_TYPE_OF_ARGUMENT;
16}
17
18namespace
19{
20class FunctionLogTrace : public IFunction
21{
22public:
23static constexpr auto name = "logTrace";
24static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionLogTrace>(); }
25
26String getName() const override { return name; }
27
28size_t getNumberOfArguments() const override { return 1; }
29
30bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; }
31
32DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
33{
34if (!isString(arguments[0]))
35throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of argument of function {}",
36arguments[0]->getName(), getName());
37return std::make_shared<DataTypeUInt8>();
38}
39
40ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override
41{
42String message;
43if (const ColumnConst * col = checkAndGetColumnConst<ColumnString>(arguments[0].column.get()))
44message = col->getDataAt(0).data;
45else
46throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be Constant string",
47getName());
48
49static auto log = getLogger("FunctionLogTrace");
50LOG_TRACE(log, fmt::runtime(message));
51
52return DataTypeUInt8().createColumnConst(input_rows_count, 0);
53}
54};
55
56}
57
58REGISTER_FUNCTION(LogTrace)
59{
60factory.registerFunction<FunctionLogTrace>();
61}
62
63}
64