@@ -547,6 +547,11 @@ void QueryAnalyzer::evaluateScalarSubqueryIfNeeded(QueryTreeNodePtr & node, Iden
547547 node->getNodeTypeName (),
548548 node->formatASTForErrorMessage ());
549549
550+ bool is_correlated_subquery = (query_node != nullptr && query_node->isCorrelated ())
551+ || (union_node != nullptr && union_node->isCorrelated ());
552+ if (is_correlated_subquery)
553+ throw Exception (ErrorCodes::BAD_ARGUMENTS, " Cannot evaluate correlated scalar subquery" );
554+
550555 auto & context = scope.context ;
551556
552557 Block scalar_block;
@@ -2533,7 +2538,8 @@ ProjectionName QueryAnalyzer::resolveWindow(QueryTreeNodePtr & node, IdentifierR
25332538 auto & window_node = node->as <WindowNode &>();
25342539 window_node.setParentWindowName ({});
25352540
2536- ProjectionNames partition_by_projection_names = resolveExpressionNodeList (window_node.getPartitionByNode (),
2541+ ProjectionNames partition_by_projection_names = resolveExpressionNodeList (
2542+ window_node.getPartitionByNode (),
25372543 scope,
25382544 false /* allow_lambda_expression*/ ,
25392545 false /* allow_table_expression*/ );
@@ -2743,7 +2749,8 @@ ProjectionNames QueryAnalyzer::resolveFunction(QueryTreeNodePtr & node, Identifi
27432749
27442750 // / Resolve function parameters
27452751
2746- auto parameters_projection_names = resolveExpressionNodeList (function_node_ptr->getParametersNode (),
2752+ auto parameters_projection_names = resolveExpressionNodeList (
2753+ function_node_ptr->getParametersNode (),
27472754 scope,
27482755 false /* allow_lambda_expression*/ ,
27492756 false /* allow_table_expression*/ );
@@ -2924,7 +2931,8 @@ ProjectionNames QueryAnalyzer::resolveFunction(QueryTreeNodePtr & node, Identifi
29242931
29252932 // / Resolve function arguments
29262933 bool allow_table_expressions = is_special_function_in || is_special_function_exists;
2927- auto arguments_projection_names = resolveExpressionNodeList (function_node_ptr->getArgumentsNode (),
2934+ auto arguments_projection_names = resolveExpressionNodeList (
2935+ function_node_ptr->getArgumentsNode (),
29282936 scope,
29292937 true /* allow_lambda_expression*/ ,
29302938 allow_table_expressions /* allow_table_expression*/ );
@@ -3929,7 +3937,11 @@ ProjectionNames QueryAnalyzer::resolveExpressionNode(
39293937 else
39303938 resolveUnion (node, subquery_scope);
39313939
3932- if (!allow_table_expression)
3940+ bool is_correlated_subquery = node_type == QueryTreeNodeType::QUERY
3941+ ? node->as <QueryNode>()->isCorrelated ()
3942+ : node->as <UnionNode>()->isCorrelated ();
3943+
3944+ if (!allow_table_expression && !is_correlated_subquery)
39333945 evaluateScalarSubqueryIfNeeded (node, subquery_scope);
39343946
39353947 if (result_projection_names.empty ())
@@ -4022,7 +4034,12 @@ ProjectionNames QueryAnalyzer::resolveExpressionNode(
40224034 * Example: CREATE TABLE test_table (id UInt64, value UInt64) ENGINE=TinyLog; SELECT plus(*) FROM test_table;
40234035 * Example: SELECT *** FROM system.one;
40244036 */
4025- ProjectionNames QueryAnalyzer::resolveExpressionNodeList (QueryTreeNodePtr & node_list, IdentifierResolveScope & scope, bool allow_lambda_expression, bool allow_table_expression)
4037+ ProjectionNames QueryAnalyzer::resolveExpressionNodeList (
4038+ QueryTreeNodePtr & node_list,
4039+ IdentifierResolveScope & scope,
4040+ bool allow_lambda_expression,
4041+ bool allow_table_expression
4042+ )
40264043{
40274044 auto & node_list_typed = node_list->as <ListNode &>();
40284045 size_t node_list_size = node_list_typed.getNodes ().size ();
0 commit comments