MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / buildExpression

Method buildExpression

src/Analyzer/QueryTreeBuilder.cpp:663–865  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

661}
662
663QueryTreeNodePtr 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 {}",

Callers

nothing calls this directly

Calls 15

applyVisitorFunction · 0.85
isASTLambdaFunctionFunction · 0.85
backQuoteFunction · 0.85
isLambdaFunctionMethod · 0.80
isOperatorMethod · 0.80
markAsOperatorMethod · 0.80
getNodesMethod · 0.80
setOriginalASTMethod · 0.80
IdentifierClass · 0.70
ExceptionClass · 0.50
toLowerFunction · 0.50
atMethod · 0.45

Tested by

no test coverage detected