diff --git a/dbms/include/DB/Functions/FunctionsStringArray.h b/dbms/include/DB/Functions/FunctionsStringArray.h index 51fd4f22b6e..a8f0edcd00a 100644 --- a/dbms/include/DB/Functions/FunctionsStringArray.h +++ b/dbms/include/DB/Functions/FunctionsStringArray.h @@ -18,7 +18,7 @@ namespace DB * splitByString(sep, s) * splitByRegexp(regexp, s) * - * extractAll(regexp, s) - выделить из строки подпоследовательности, соответствующие регекспу. + * extractAll(s, regexp) - выделить из строки подпоследовательности, соответствующие регекспу. * - первый subpattern, если в regexp-е есть subpattern; * - нулевой subpattern (сматчившуюся часть, иначе); * - инача, пустой массив @@ -70,6 +70,12 @@ public: end = end_; } + /// Возвращает позицию аргумента, являющегося столбцом строк + size_t getStringsArgumentPosition() + { + return 0; + } + /// Получить следующий токен, если есть, или вернуть false. bool get(Pos & token_begin, Pos & token_end) { @@ -135,6 +141,12 @@ public: sep = sep_str[0]; } + /// Возвращает позицию аргумента, являющегося столбцом строк + size_t getStringsArgumentPosition() + { + return 1; + } + void set(Pos pos_, Pos end_) { pos = pos_; @@ -189,6 +201,12 @@ public: sep = col->getData(); } + /// Возвращает позицию аргумента, являющегося столбцом строк + size_t getStringsArgumentPosition() + { + return 1; + } + /// Вызывается для каждой следующей строки. void set(Pos pos_, Pos end_) { @@ -240,7 +258,7 @@ public: /// Инициализировать по аргументам функции. void init(Block & block, const ColumnNumbers & arguments) { - const ColumnConstString * col = dynamic_cast(&*block.getByPosition(arguments[0]).column); + const ColumnConstString * col = dynamic_cast(&*block.getByPosition(arguments[1]).column); if (!col) throw Exception("Illegal column " + col->getName() + " of first argument of function " + getName() + ". Must be constant string.", @@ -252,6 +270,12 @@ public: matches.resize(capture + 1); } + /// Возвращает позицию аргумента, являющегося столбцом строк + size_t getStringsArgumentPosition() + { + return 0; + } + /// Вызывается для каждой следующей строки. void set(Pos pos_, Pos end_) { @@ -271,7 +295,7 @@ public: token_begin = pos + matches[capture].offset; token_end = token_begin + matches[capture].length; - pos += matches[capture].offset + matches[capture].length; + pos += matches[capture].offset + matches[capture].length; return true; } @@ -301,9 +325,11 @@ public: { Generator generator; generator.init(block, arguments); + size_t arrayArgumentPosition = arguments[generator.getStringsArgumentPosition()]; - const ColumnString * col_str = dynamic_cast(&*block.getByPosition(arguments.back()).column); - const ColumnConstString * col_const_str = dynamic_cast(&*block.getByPosition(arguments.back()).column); + const ColumnString * col_str = dynamic_cast(&*block.getByPosition(arrayArgumentPosition).column); + const ColumnConstString * col_const_str = + dynamic_cast(&*block.getByPosition(arrayArgumentPosition).column); ColumnArray * col_res = new ColumnArray(new ColumnString); ColumnString & res_strings = dynamic_cast(col_res->getData()); @@ -370,8 +396,8 @@ public: block.getByPosition(result).column = new ColumnConstArray(col_const_str->size(), dst, new DataTypeArray(new DataTypeString)); } else - throw Exception("Illegal columns " + block.getByPosition(arguments.back()).column->getName() - + ", " + block.getByPosition(arguments.back()).column->getName() + throw Exception("Illegal columns " + block.getByPosition(arrayArgumentPosition).column->getName() + + ", " + block.getByPosition(arrayArgumentPosition).column->getName() + " of arguments of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); } diff --git a/dbms/include/DB/Functions/FunctionsURL.h b/dbms/include/DB/Functions/FunctionsURL.h index 96ecf7b312f..ac966cae034 100644 --- a/dbms/include/DB/Functions/FunctionsURL.h +++ b/dbms/include/DB/Functions/FunctionsURL.h @@ -430,6 +430,12 @@ public: } void init(Block & block, const ColumnNumbers & arguments) {} + + /// Возвращает позицию аргумента, являющегося столбцом строк + size_t getStringsArgumentPosition() + { + return 0; + } /// Вызывается для каждой следующей строки. void set(Pos pos_, Pos end_) @@ -491,6 +497,12 @@ public: ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } + /// Возвращает позицию аргумента, являющегося столбцом строк + size_t getStringsArgumentPosition() + { + return 0; + } + void init(Block & block, const ColumnNumbers & arguments) {} /// Вызывается для каждой следующей строки. @@ -554,6 +566,12 @@ public: } void init(Block & block, const ColumnNumbers & arguments) {} + + /// Возвращает позицию аргумента, являющегося столбцом строк + size_t getStringsArgumentPosition() + { + return 0; + } /// Вызывается для каждой следующей строки. void set(Pos pos_, Pos end_)