diff --git a/dbms/include/DB/Functions/FunctionsMiscellaneous.h b/dbms/include/DB/Functions/FunctionsMiscellaneous.h index a69de157421b7506d3d574ca923d9e14b4ca8b43..27b1da01066b48880c5e5946791ee16547509366 100644 --- a/dbms/include/DB/Functions/FunctionsMiscellaneous.h +++ b/dbms/include/DB/Functions/FunctionsMiscellaneous.h @@ -422,6 +422,9 @@ public: /// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение. DataTypePtr getReturnType(const DataTypes & arguments) const { + if (arguments.size() < 1) + throw Exception("Function " + getName() + " requires at least one argument.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + return new DataTypeTuple(arguments); } diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index 5ca6df161ba2f4b700c820dffc6b9fd03691f8b3..5fd72994ddf1c8fc9c538bbdfca26af5a16574fc 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -1151,6 +1151,10 @@ void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block) void ExpressionAnalyzer::makeExplicitSet(ASTFunction * node, const Block & sample_block, bool create_ordered_set) { IAST & args = *node->arguments; + + if (args.children.size() != 2) + throw Exception("Wrong number of arguments passed to function in", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + ASTPtr & arg = args.children.at(1); DataTypes set_element_types; @@ -1188,12 +1192,20 @@ void ExpressionAnalyzer::makeExplicitSet(ASTFunction * node, const Block & sampl { if (set_func->name == "tuple") { - /// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2). - ASTFunction * any_element = typeid_cast(&*set_func->arguments->children.at(0)); - if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple")) - single_value = true; - else + if (set_func->arguments->children.empty()) + { + /// Пустое множество. elements_ast = set_func->arguments; + } + else + { + /// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2). + ASTFunction * any_element = typeid_cast(&*set_func->arguments->children.at(0)); + if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple")) + single_value = true; + else + elements_ast = set_func->arguments; + } } else {