|
24 | 24 | #include <Analyzer/QueryTreeBuilder.h> |
25 | 25 | #include <Analyzer/QueryNode.h> |
26 | 26 | #include <Analyzer/ColumnNode.h> |
| 27 | +#include <Analyzer/ConstantNode.h> |
27 | 28 | #include <Analyzer/JoinNode.h> |
28 | 29 | #include <Analyzer/InDepthQueryTreeVisitor.h> |
29 | 30 | #include <Analyzer/Utils.h> |
@@ -105,9 +106,9 @@ class SearcherVisitor : public InDepthQueryTreeVisitorWithContext<SearcherVisito |
105 | 106 |
|
106 | 107 | explicit SearcherVisitor(std::unordered_set<QueryTreeNodeType> types_, ContextPtr context) : Base(context), types(types_) {} |
107 | 108 |
|
108 | | - bool needChildVisit(QueryTreeNodePtr &, QueryTreeNodePtr & /*child*/) |
| 109 | + bool needChildVisit(QueryTreeNodePtr & /*parent*/, QueryTreeNodePtr & /*child*/) |
109 | 110 | { |
110 | | - return !passed_node; |
| 111 | + return getSubqueryDepth() <= 2 && !passed_node; |
111 | 112 | } |
112 | 113 |
|
113 | 114 | void enterImpl(QueryTreeNodePtr & node) |
@@ -245,12 +246,22 @@ void IStorageCluster::updateQueryWithJoinToSendIfNeeded( |
245 | 246 | collector.visit(modified_query_tree); |
246 | 247 | const auto & columns = collector.getColumns(); |
247 | 248 |
|
248 | | - query_node.resolveProjectionColumns(columns); |
249 | | - auto column_nodes_to_select = std::make_shared<ListNode>(); |
250 | | - column_nodes_to_select->getNodes().reserve(columns.size()); |
251 | | - for (auto & column : columns) |
252 | | - column_nodes_to_select->getNodes().emplace_back(std::make_shared<ColumnNode>(column, table_function_node)); |
253 | | - query_node.getProjectionNode() = column_nodes_to_select; |
| 249 | + if (columns.empty()) |
| 250 | + { |
| 251 | + auto column_nodes_to_select = std::make_shared<ListNode>(); |
| 252 | + column_nodes_to_select->getNodes().reserve(1); |
| 253 | + column_nodes_to_select->getNodes().emplace_back(std::make_shared<ConstantNode>(1)); |
| 254 | + query_node.getProjectionNode() = column_nodes_to_select; |
| 255 | + } |
| 256 | + else |
| 257 | + { |
| 258 | + query_node.resolveProjectionColumns(columns); |
| 259 | + auto column_nodes_to_select = std::make_shared<ListNode>(); |
| 260 | + column_nodes_to_select->getNodes().reserve(columns.size()); |
| 261 | + for (auto & column : columns) |
| 262 | + column_nodes_to_select->getNodes().emplace_back(std::make_shared<ColumnNode>(column, table_function_node)); |
| 263 | + query_node.getProjectionNode() = column_nodes_to_select; |
| 264 | + } |
254 | 265 |
|
255 | 266 | if (info.has_local_columns_in_where) |
256 | 267 | { |
|
0 commit comments