| 661 | } |
| 662 | |
| 663 | QueryTreeNodePtr QueryTreeBuilder::buildExpression(const ASTPtr & expression, const ContextPtr & context) const |
| 664 | { |
| 665 | QueryTreeNodePtr result; |
| 666 | |
| 667 | if (const auto * ast_identifier = expression->as<ASTIdentifier>()) |
| 668 | { |
| 669 | auto identifier = Identifier(ast_identifier->name_parts); |
| 670 | result = std::make_shared<IdentifierNode>(std::move(identifier)); |
| 671 | } |
| 672 | else if (const auto * table_identifier = expression->as<ASTTableIdentifier>()) |
| 673 | { |
| 674 | auto identifier = Identifier(table_identifier->name_parts); |
| 675 | result = std::make_shared<IdentifierNode>(std::move(identifier)); |
| 676 | } |
| 677 | else if (const auto * asterisk = expression->as<ASTAsterisk>()) |
| 678 | { |
| 679 | auto column_transformers = buildColumnTransformers(asterisk->transformers, context); |
| 680 | result = std::make_shared<MatcherNode>(std::move(column_transformers)); |
| 681 | } |
| 682 | else if (const auto * qualified_asterisk = expression->as<ASTQualifiedAsterisk>()) |
| 683 | { |
| 684 | auto & qualified_identifier = qualified_asterisk->qualifier->as<ASTIdentifier &>(); |
| 685 | auto column_transformers = buildColumnTransformers(qualified_asterisk->transformers, context); |
| 686 | result = std::make_shared<MatcherNode>(Identifier(qualified_identifier.name_parts), std::move(column_transformers)); |
| 687 | } |
| 688 | else if (const auto * ast_literal = expression->as<ASTLiteral>()) |
| 689 | { |
| 690 | if (context->getSettingsRef()[Setting::use_variant_as_common_type]) |
| 691 | result = std::make_shared<ConstantNode>(ast_literal->value, applyVisitor(FieldToDataType<LeastSupertypeOnError::Variant>(), ast_literal->value)); |
| 692 | else |
| 693 | result = std::make_shared<ConstantNode>(ast_literal->value); |
| 694 | } |
| 695 | else if (const auto * function = expression->as<ASTFunction>()) |
| 696 | { |
| 697 | if (function->isLambdaFunction() || isASTLambdaFunction(*function)) |
| 698 | { |
| 699 | const auto & lambda_arguments_and_expression = function->arguments->as<ASTExpressionList &>().children; |
| 700 | auto & lambda_arguments_tuple = lambda_arguments_and_expression.at(0)->as<ASTFunction &>(); |
| 701 | |
| 702 | auto lambda_arguments_nodes = std::make_shared<ListNode>(); |
| 703 | Names lambda_arguments; |
| 704 | NameSet lambda_arguments_set; |
| 705 | |
| 706 | if (lambda_arguments_tuple.arguments) |
| 707 | { |
| 708 | const auto & lambda_arguments_list = lambda_arguments_tuple.arguments->as<ASTExpressionList &>().children; |
| 709 | for (const auto & lambda_argument : lambda_arguments_list) |
| 710 | { |
| 711 | const auto * lambda_argument_identifier = lambda_argument->as<ASTIdentifier>(); |
| 712 | |
| 713 | if (!lambda_argument_identifier) |
| 714 | throw Exception(ErrorCodes::BAD_ARGUMENTS, |
| 715 | "Lambda {} argument is not identifier", |
| 716 | function->formatForErrorMessage()); |
| 717 | |
| 718 | if (lambda_argument_identifier->name_parts.size() > 1) |
| 719 | throw Exception(ErrorCodes::BAD_ARGUMENTS, |
| 720 | "Lambda {} argument identifier must contain single part. Actual {}", |
nothing calls this directly
no test coverage detected