Merge pull request #57196 from amosbird/fix-57194

Fix incorrect JOIN plan optimization with partially materialized normal projection
This commit is contained in:
Antonio Andelic 2023-11-27 09:15:13 +01:00 committed by GitHub
commit 4c2de5219d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 2 deletions

View File

@ -268,7 +268,7 @@ bool optimizeUseNormalProjections(Stack & stack, QueryPlan::Nodes & nodes)
}
else
{
const auto & main_stream = iter->node->children.front()->step->getOutputStream();
const auto & main_stream = iter->node->children[iter->next_child - 1]->step->getOutputStream();
const auto * proj_stream = &next_node->step->getOutputStream();
if (auto materializing = makeMaterializingDAG(proj_stream->header, main_stream.header))
@ -284,7 +284,7 @@ bool optimizeUseNormalProjections(Stack & stack, QueryPlan::Nodes & nodes)
auto & union_node = nodes.emplace_back();
DataStreams input_streams = {main_stream, *proj_stream};
union_node.step = std::make_unique<UnionStep>(std::move(input_streams));
union_node.children = {iter->node->children.front(), next_node};
union_node.children = {iter->node->children[iter->next_child - 1], next_node};
iter->node->children[iter->next_child - 1] = &union_node;
}

View File

@ -0,0 +1,13 @@
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1 (id UInt32, s String) Engine = MergeTree ORDER BY id;
CREATE TABLE t2 (id1 UInt32, id2 UInt32) Engine = MergeTree ORDER BY id1 SETTINGS index_granularity = 1;
INSERT INTO t2 SELECT number, number from numbers(100);
ALTER TABLE t2 ADD PROJECTION proj (SELECT id2 ORDER BY id2);
INSERT INTO t2 SELECT number, number from numbers(100);
SELECT s FROM t1 as lhs LEFT JOIN (SELECT * FROM t2 WHERE id2 = 2) as rhs ON lhs.id = rhs.id2;
DROP TABLE t1;
DROP TABLE t2;