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

Function queryHasArrayJoinInJoinTree

src/Planner/Utils.cpp:368–424  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

366}
367
368bool queryHasArrayJoinInJoinTree(const QueryTreeNodePtr & query_node)
369{
370 const auto & query_node_typed = query_node->as<const QueryNode &>();
371
372 std::vector<QueryTreeNodePtr> join_tree_nodes_to_process;
373 join_tree_nodes_to_process.push_back(query_node_typed.getJoinTree());
374
375 while (!join_tree_nodes_to_process.empty())
376 {
377 auto join_tree_node_to_process = join_tree_nodes_to_process.back();
378 join_tree_nodes_to_process.pop_back();
379
380 auto join_tree_node_type = join_tree_node_to_process->getNodeType();
381
382 switch (join_tree_node_type)
383 {
384 case QueryTreeNodeType::TABLE:
385 [[fallthrough]];
386 case QueryTreeNodeType::QUERY:
387 [[fallthrough]];
388 case QueryTreeNodeType::UNION:
389 [[fallthrough]];
390 case QueryTreeNodeType::TABLE_FUNCTION:
391 {
392 break;
393 }
394 case QueryTreeNodeType::ARRAY_JOIN:
395 {
396 return true;
397 }
398 case QueryTreeNodeType::CROSS_JOIN:
399 {
400 auto & cross_join_node = join_tree_node_to_process->as<CrossJoinNode &>();
401 for (const auto & expr : cross_join_node.getTableExpressions())
402 join_tree_nodes_to_process.push_back(expr);
403
404 break;
405 }
406 case QueryTreeNodeType::JOIN:
407 {
408 auto & join_node = join_tree_node_to_process->as<JoinNode &>();
409 join_tree_nodes_to_process.push_back(join_node.getLeftTableExpression());
410 join_tree_nodes_to_process.push_back(join_node.getRightTableExpression());
411 break;
412 }
413 default:
414 {
415 throw Exception(ErrorCodes::LOGICAL_ERROR,
416 "Unexpected node type for table expression. "
417 "Expected table, table function, query, union, join or array join. Actual {}",
418 join_tree_node_to_process->getNodeTypeName());
419 }
420 }
421 }
422
423 return false;
424}
425

Callers 1

QueryAnalysisResultMethod · 0.85

Calls 7

getNodeTypeNameMethod · 0.80
ExceptionClass · 0.50
push_backMethod · 0.45
emptyMethod · 0.45
backMethod · 0.45
pop_backMethod · 0.45
getNodeTypeMethod · 0.45

Tested by

no test coverage detected