Skip to content

Commit 8cdcaaa

Browse files
committed
Backport #67522 to 24.6: Analyzer: Do not traverse unresolved subtrees
1 parent 8597925 commit 8cdcaaa

4 files changed

Lines changed: 22 additions & 9 deletions

File tree

src/Planner/findParallelReplicasQuery.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,13 @@ std::stack<const QueryNode *> getSupportingParallelReplicasQuery(const IQueryTre
112112
return res;
113113
}
114114

115-
class ReplaceTableNodeToDummyVisitor : public InDepthQueryTreeVisitor<ReplaceTableNodeToDummyVisitor, true>
115+
class ReplaceTableNodeToDummyVisitor : public InDepthQueryTreeVisitorWithContext<ReplaceTableNodeToDummyVisitor>
116116
{
117117
public:
118-
using Base = InDepthQueryTreeVisitor<ReplaceTableNodeToDummyVisitor, true>;
118+
using Base = InDepthQueryTreeVisitorWithContext<ReplaceTableNodeToDummyVisitor>;
119119
using Base::Base;
120120

121-
void visitImpl(const QueryTreeNodePtr & node)
121+
void enterImpl(QueryTreeNodePtr & node)
122122
{
123123
auto * table_node = node->as<TableNode>();
124124
auto * table_function_node = node->as<TableFunctionNode>();
@@ -133,21 +133,19 @@ class ReplaceTableNodeToDummyVisitor : public InDepthQueryTreeVisitor<ReplaceTab
133133
ColumnsDescription(storage_snapshot->getColumns(get_column_options)),
134134
storage_snapshot);
135135

136-
auto dummy_table_node = std::make_shared<TableNode>(std::move(storage_dummy), context);
136+
auto dummy_table_node = std::make_shared<TableNode>(std::move(storage_dummy), getContext());
137137

138138
dummy_table_node->setAlias(node->getAlias());
139139
replacement_map.emplace(node.get(), std::move(dummy_table_node));
140140
}
141141
}
142142

143-
ContextPtr context;
144143
std::unordered_map<const IQueryTreeNode *, QueryTreeNodePtr> replacement_map;
145144
};
146145

147-
QueryTreeNodePtr replaceTablesWithDummyTables(const QueryTreeNodePtr & query, const ContextPtr & context)
146+
QueryTreeNodePtr replaceTablesWithDummyTables(QueryTreeNodePtr query, const ContextPtr & context)
148147
{
149-
ReplaceTableNodeToDummyVisitor visitor;
150-
visitor.context = context;
148+
ReplaceTableNodeToDummyVisitor visitor(context);
151149
visitor.visit(query);
152150

153151
return query->cloneAndReplace(visitor.replacement_map);

src/Planner/findQueryForParallelReplicas.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ using QueryTreeNodePtr = std::shared_ptr<IQueryTreeNode>;
1313

1414
struct SelectQueryOptions;
1515

16-
/// Find a qury which can be executed with parallel replicas up to WithMergableStage.
16+
/// Find a query which can be executed with parallel replicas up to WithMergableStage.
1717
/// Returned query will always contain some (>1) subqueries, possibly with joins.
1818
const QueryNode * findQueryForParallelReplicas(const QueryTreeNodePtr & query_tree_node, SelectQueryOptions & select_query_options);
1919

tests/queries/0_stateless/03215_analyzer_replace_with_dummy_tables.reference

Whitespace-only changes.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
create table t (number UInt64) engine MergeTree order by number;
2+
3+
SELECT 1
4+
FROM
5+
(
6+
SELECT number IN (
7+
SELECT number
8+
FROM view(
9+
SELECT number
10+
FROM numbers(1)
11+
)
12+
)
13+
FROM t
14+
)
15+
SETTINGS allow_experimental_parallel_reading_from_replicas = 1, max_parallel_replicas = 2, allow_experimental_analyzer = 1; -- { serverError CLUSTER_DOESNT_EXIST }

0 commit comments

Comments
 (0)