Fix lost considion in predicate push down.

This commit is contained in:
Nikolai Kochetov 2021-06-17 12:47:12 +03:00
parent 3d7100ca60
commit 4a496f1374
3 changed files with 15 additions and 22 deletions

View File

@ -467,7 +467,7 @@ class IColumn;
\
M(Bool, query_plan_enable_optimizations, true, "Apply optimizations to query plan", 0) \
M(UInt64, query_plan_max_optimizations_to_apply, 10000, "Limit the total number of optimizations applied to query plan. If zero, ignored. If limit reached, throw exception", 0) \
M(Bool, query_plan_filter_push_down, false, "Allow to push down filter by predicate query plan step", 0) \
M(Bool, query_plan_filter_push_down, true, "Allow to push down filter by predicate query plan step", 0) \
\
M(UInt64, limit, 0, "Limit on read rows from the most 'end' result for select query, default 0 means no limit length", 0) \
M(UInt64, offset, 0, "Offset on read rows from the most 'end' result for select query", 0) \

View File

@ -1595,35 +1595,26 @@ ConjunctionNodes getConjunctionNodes(ActionsDAG::Node * predicate, std::unordere
if (cur.node->type != ActionsDAG::ActionType::ARRAY_JOIN && cur.node->type != ActionsDAG::ActionType::INPUT)
allowed_nodes.emplace(cur.node);
}
else if (is_conjunction)
{
for (const auto * child : cur.node->children)
{
if (allowed_nodes.count(child))
{
if (allowed.insert(child).second)
conjunction.allowed.push_back(child);
}
}
}
else if (cur.is_predicate)
if (cur.is_predicate && ! is_conjunction)
{
if (rejected.insert(cur.node).second)
conjunction.rejected.push_back(cur.node);
if (allowed_nodes.count(cur.node))
{
if (allowed.insert(cur.node).second)
conjunction.allowed.push_back(cur.node);
}
else
{
if (rejected.insert(cur.node).second)
conjunction.rejected.push_back(cur.node);
}
}
stack.pop();
}
}
if (conjunction.allowed.empty())
{
/// If nothing was added to conjunction, check if it is trivial.
if (allowed_nodes.count(predicate))
conjunction.allowed.push_back(predicate);
}
return conjunction;
}

View File

@ -13,6 +13,8 @@ SETTINGS index_granularity = 8192;
INSERT INTO test VALUES (1,0,1),(1,0,2),(1,0,3),(1,0,4),(1,0,5),(1,0,6),(1,1,7),(0,0,7);
set query_plan_filter_push_down = true;
SELECT id, flag FROM test t1
INNER JOIN (SELECT DISTINCT id FROM test) AS t2 ON t1.id = t2.id
WHERE flag = 0 and t = 1 AND id NOT IN (SELECT 1 WHERE 0);