Merge pull request #50685 from ClickHouse/fix_asan_analyzer_prewhere

Fix asan issue with analyzer and prewhere
This commit is contained in:
Alexander Gololobov 2023-06-09 11:32:20 +02:00 committed by GitHub
commit 0d9bf2f196
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 21 deletions

View File

@ -114,32 +114,35 @@ void optimizeTreeSecondPass(const QueryPlanOptimizationSettings & optimization_s
while (!stack.empty())
{
auto & frame = stack.back();
if (frame.next_child == 0)
{
has_reading_from_mt |= typeid_cast<const ReadFromMergeTree *>(frame.node->step.get()) != nullptr;
/// NOTE: frame cannot be safely used after stack was modified.
auto & frame = stack.back();
if (optimization_settings.read_in_order)
optimizeReadInOrder(*frame.node, nodes);
if (frame.next_child == 0)
{
has_reading_from_mt |= typeid_cast<const ReadFromMergeTree *>(frame.node->step.get()) != nullptr;
if (optimization_settings.optimize_projection)
num_applied_projection += optimizeUseAggregateProjections(*frame.node, nodes);
if (optimization_settings.read_in_order)
optimizeReadInOrder(*frame.node, nodes);
if (optimization_settings.aggregation_in_order)
optimizeAggregationInOrder(*frame.node, nodes);
if (optimization_settings.optimize_projection)
num_applied_projection += optimizeUseAggregateProjections(*frame.node, nodes);
if (optimization_settings.distinct_in_order)
tryDistinctReadInOrder(frame.node);
}
if (optimization_settings.aggregation_in_order)
optimizeAggregationInOrder(*frame.node, nodes);
/// Traverse all children first.
if (frame.next_child < frame.node->children.size())
{
auto next_frame = Frame{.node = frame.node->children[frame.next_child]};
++frame.next_child;
stack.push_back(next_frame);
continue;
if (optimization_settings.distinct_in_order)
tryDistinctReadInOrder(frame.node);
}
/// Traverse all children first.
if (frame.next_child < frame.node->children.size())
{
auto next_frame = Frame{.node = frame.node->children[frame.next_child]};
++frame.next_child;
stack.push_back(next_frame);
continue;
}
}
if (optimization_settings.optimize_projection)
@ -160,9 +163,10 @@ void optimizeTreeSecondPass(const QueryPlanOptimizationSettings & optimization_s
}
}
/// NOTE: optimizePrewhere can modify the stack.
optimizePrewhere(stack, nodes);
optimizePrimaryKeyCondition(stack);
enableMemoryBoundMerging(*frame.node, nodes);
enableMemoryBoundMerging(*stack.back().node, nodes);
stack.pop_back();
}

View File

@ -0,0 +1,4 @@
0 0
0 0
0 0
0 0

View File

@ -0,0 +1,15 @@
DROP TABLE IF EXISTS t_02784;
CREATE TABLE t_02784 (c1 UInt64, c2 UInt64) ENGINE=MergeTree() ORDER BY c1 SETTINGS min_bytes_for_wide_part=1;
INSERT INTO t_02784 SELECT number, number FROM numbers(1);
SET allow_experimental_analyzer=1;
SET move_all_conditions_to_prewhere=1;
SELECT c1, c2 FROM t_02784 WHERE c1 = 0 AND c2 = 0;
SELECT c1, c2 FROM t_02784 WHERE c2 = 0 AND c1 = 0;
SELECT c2, c1 FROM t_02784 WHERE c1 = 0 AND c2 = 0;
SELECT c2, c1 FROM t_02784 WHERE c2 = 0 AND c1 = 0;
DROP TABLE t_02784;