mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 16:50:48 +00:00
Merge pull request #50685 from ClickHouse/fix_asan_analyzer_prewhere
Fix asan issue with analyzer and prewhere
This commit is contained in:
commit
0d9bf2f196
@ -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();
|
||||
}
|
||||
|
@ -0,0 +1,4 @@
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
@ -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;
|
Loading…
Reference in New Issue
Block a user