1#include <Functions/FunctionFactory.h>
2#include <Functions/FunctionStringToString.h>
3#include "FunctionsURL.h"
4#include <common/find_symbols.h>
5
6namespace DB
7{
8
9struct ExtractPath
10{
11 static size_t getReserveLengthForElement() { return 25; }
12
13 static void execute(Pos data, size_t size, Pos & res_data, size_t & res_size)
14 {
15 res_data = data;
16 res_size = 0;
17
18 Pos pos = data;
19 Pos end = pos + size;
20
21 if (end != (pos = find_first_symbols<'/'>(pos, end)) && pos[1] == '/' && end != (pos = find_first_symbols<'/'>(pos + 2, end)))
22 {
23 Pos query_string_or_fragment = find_first_symbols<'?', '#'>(pos, end);
24
25 res_data = pos;
26 res_size = query_string_or_fragment - res_data;
27 }
28 }
29};
30
31struct NamePath { static constexpr auto name = "path"; };
32using FunctionPath = FunctionStringToString<ExtractSubstringImpl<ExtractPath>, NamePath>;
33
34void registerFunctionPath(FunctionFactory & factory)
35{
36 factory.registerFunction<FunctionPath>();
37}
38
39}
40