diff --git a/dbms/include/DB/Functions/FunctionsURL.h b/dbms/include/DB/Functions/FunctionsURL.h index 5f3cc2acd79..192f059a4be 100644 --- a/dbms/include/DB/Functions/FunctionsURL.h +++ b/dbms/include/DB/Functions/FunctionsURL.h @@ -358,6 +358,78 @@ public: first = true; } + /// Получить следующий токен, если есть, или вернуть false. + bool get(Pos & token_begin, Pos & token_end) + { + if (pos == NULL) + return false; + + if (first) + { + first = false; + pos = strchr(pos, '?'); + if (pos == NULL) + return false; + ++pos; + } + + token_begin = pos; + pos = strchr(pos, '='); + if (pos == NULL) + return false; + ++pos; + pos = strpbrk(pos, "&;#"); + if (pos == NULL) + { + token_end = end; + } + else + { + token_end = pos; + + if (*pos == '#') + pos = NULL; + else + ++pos; + } + + return true; + } +}; + + +class URLHierarchyImpl +{ +private: + Pos pos; + Pos end; + bool first; + +public: + static String getName() { return "extractURLParameters"; } + + static void checkArguments(const DataTypes & arguments) + { + if (arguments.size() != 1) + throw Exception("Number of arguments for function " + getName() + " doesn't match: passed " + + Poco::NumberFormatter::format(arguments.size()) + ", should be 1.", + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + + if (!dynamic_cast(&*arguments[0])) + throw Exception("Illegal type " + arguments[0]->getName() + " of first argument of function " + getName() + ". Must be String.", + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + } + + void init(Block & block, const ColumnNumbers & arguments) {} + + /// Вызывается для каждой следующей строки. + void set(Pos pos_, Pos end_) + { + pos = pos_; + end = end_; + first = true; + } + /// Получить следующий токен, если есть, или вернуть false. bool get(Pos & token_begin, Pos & token_end) {