Skip to content

Commit c276eb5

Browse files
Merge pull request ClickHouse#83029 from ClickHouse/backport/25.6/82950
Backport ClickHouse#82950 to 25.6: Fix filter conjuncts removal in StorageMerge
2 parents bab7587 + 9c28d1a commit c276eb5

File tree

4 files changed

+17
-6
lines changed

4 files changed

+17
-6
lines changed

src/Analyzer/Utils.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,9 @@ bool hasUnknownColumn(const QueryTreeNodePtr & node, QueryTreeNodePtr table_expr
11221122
{
11231123
auto * column_node = current->as<ColumnNode>();
11241124
auto source = column_node->getColumnSourceOrNull();
1125-
if (source && table_expression && !source->isEqual(*table_expression))
1125+
/// Column source can be nullptr if JOIN node was replaced with a table expression.
1126+
/// In that case column is not from the specified table expression.
1127+
if (source != table_expression)
11261128
return true;
11271129
break;
11281130
}

src/Storages/transformQueryForExternalDatabaseAnalyzer.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ class PrepareForExternalDatabaseVisitor : public InDepthQueryTreeVisitor<Prepare
6060

6161
ASTPtr getASTForExternalDatabaseFromQueryTree(ContextPtr context, const QueryTreeNodePtr & query_tree, const QueryTreeNodePtr & table_expression)
6262
{
63-
auto new_tree = query_tree->clone();
63+
auto replacement_table_expression = table_expression->clone();
64+
auto new_tree = query_tree->cloneAndReplace(table_expression, replacement_table_expression);
6465

6566
PrepareForExternalDatabaseVisitor visitor;
6667
visitor.visit(new_tree);
@@ -71,9 +72,9 @@ ASTPtr getASTForExternalDatabaseFromQueryTree(ContextPtr context, const QueryTre
7172
if (const auto * join_node = join_tree->as<JoinNode>())
7273
{
7374
if (join_node->getKind() == JoinKind::Left)
74-
allow_where = join_node->getLeftTableExpression()->isEqual(*table_expression);
75+
allow_where = join_node->getLeftTableExpression()->isEqual(*replacement_table_expression);
7576
else if (join_node->getKind() == JoinKind::Right)
76-
allow_where = join_node->getRightTableExpression()->isEqual(*table_expression);
77+
allow_where = join_node->getRightTableExpression()->isEqual(*replacement_table_expression);
7778
else
7879
allow_where = (join_node->getKind() == JoinKind::Inner);
7980
}
@@ -83,9 +84,9 @@ ASTPtr getASTForExternalDatabaseFromQueryTree(ContextPtr context, const QueryTre
8384
if (allow_where)
8485
{
8586
if (query_node->hasPrewhere())
86-
removeExpressionsThatDoNotDependOnTableIdentifiers(query_node->getPrewhere(), table_expression, context);
87+
removeExpressionsThatDoNotDependOnTableIdentifiers(query_node->getPrewhere(), replacement_table_expression, context);
8788
if (query_node->hasWhere())
88-
removeExpressionsThatDoNotDependOnTableIdentifiers(query_node->getWhere(), table_expression, context);
89+
removeExpressionsThatDoNotDependOnTableIdentifiers(query_node->getWhere(), replacement_table_expression, context);
8990
}
9091

9192
auto query_node_ast = query_node->toAST({ .add_cast_for_constants = false, .fully_qualified_identifiers = false });

tests/queries/0_stateless/03549_analyzer_fix_filter_removal.reference

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
SET allow_experimental_analyzer = 1;
2+
3+
CREATE TABLE m (`key` UInt32) ENGINE = Merge(currentDatabase(), 'a');
4+
CREATE TABLE b (`key` UInt32, `ID` UInt32) ENGINE = MergeTree ORDER BY key;
5+
6+
CREATE TABLE a1 (`day` Date, `id` UInt32) ENGINE = Distributed('test_cluster_two_shards', currentDatabase(), a1_replicated, id);
7+
8+
SELECT * FROM m INNER JOIN b USING (key) WHERE ID = 1; -- { serverError UNKNOWN_TABLE, ALL_CONNECTION_TRIES_FAILED }

0 commit comments

Comments
 (0)