ClickHouse

Форк
0
/
generateULID.cpp 
94 строки · 2.8 Кб
1
#include "config.h"
2

3
#if USE_ULID
4

5
#include <Columns/ColumnFixedString.h>
6
#include <DataTypes/DataTypeFixedString.h>
7
#include <Functions/FunctionFactory.h>
8
#include <Functions/FunctionHelpers.h>
9
#include <Functions/IFunction.h>
10
#include <Interpreters/Context.h>
11

12
#include <ulid.h>
13

14

15
namespace DB
16
{
17

18
namespace ErrorCodes
19
{
20
    extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
21
}
22

23
class FunctionGenerateULID : public IFunction
24
{
25
public:
26
    static constexpr size_t ULID_LENGTH = 26;
27

28
    static constexpr auto name = "generateULID";
29

30
    static FunctionPtr create(ContextPtr /*context*/)
31
    {
32
        return std::make_shared<FunctionGenerateULID>();
33
    }
34

35
    String getName() const override { return name; }
36

37
    size_t getNumberOfArguments() const override { return 0; }
38

39
    bool isVariadic() const override { return true; }
40
    bool isDeterministic() const override { return false; }
41
    bool isDeterministicInScopeOfQuery() const override { return false; }
42
    bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; }
43

44
    DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
45
    {
46
        if (arguments.size() > 1)
47
            throw Exception(
48
                ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
49
                "Number of arguments for function {} doesn't match: passed {}, should be 0 or 1.",
50
                getName(), arguments.size());
51

52
        return std::make_shared<DataTypeFixedString>(ULID_LENGTH);
53
    }
54

55
    bool useDefaultImplementationForConstants() const override { return true; }
56

57
    ColumnPtr executeImpl(const ColumnsWithTypeAndName & /*arguments*/, const DataTypePtr &, size_t input_rows_count) const override
58
    {
59
        auto col_res = ColumnFixedString::create(ULID_LENGTH);
60
        auto & vec_res = col_res->getChars();
61

62
        vec_res.resize(input_rows_count * ULID_LENGTH);
63

64
        ulid_generator generator;
65
        ulid_generator_init(&generator, 0);
66

67
        for (size_t offset = 0, size = vec_res.size(); offset < size; offset += ULID_LENGTH)
68
            ulid_generate(&generator, reinterpret_cast<char *>(&vec_res[offset]));
69

70
        return col_res;
71
    }
72
};
73

74

75
REGISTER_FUNCTION(GenerateULID)
76
{
77
    factory.registerFunction<FunctionGenerateULID>(FunctionDocumentation
78
    {
79
        .description=R"(
80
Generates a Universally Unique Lexicographically Sortable Identifier (ULID).
81
This function takes an optional argument, the value of which is discarded to generate different values in case the function is called multiple times.
82
The function returns a value of type FixedString(26).
83
)",
84
        .examples{
85
            {"ulid", "SELECT generateULID()", ""},
86
            {"multiple", "SELECT generateULID(1), generateULID(2)", ""}},
87
        .categories{"ULID"}
88
    },
89
    FunctionFactory::CaseSensitive);
90
}
91

92
}
93

94
#endif
95

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

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

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

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