提交 db47ef92 编写于 作者: C CurtizJ

fix prewhere

上级 3c1735d9
...@@ -324,7 +324,7 @@ InterpreterSelectQuery::InterpreterSelectQuery( ...@@ -324,7 +324,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
table_id = storage->getStorageID(); table_id = storage->getStorageID();
} }
auto analyze = [&] () auto analyze = [&] (bool try_move_to_prewhere = true)
{ {
syntax_analyzer_result = SyntaxAnalyzer(*context, options).analyze( syntax_analyzer_result = SyntaxAnalyzer(*context, options).analyze(
query_ptr, source_header.getNamesAndTypesList(), required_result_column_names, storage, NamesAndTypesList()); query_ptr, source_header.getNamesAndTypesList(), required_result_column_names, storage, NamesAndTypesList());
...@@ -397,7 +397,7 @@ InterpreterSelectQuery::InterpreterSelectQuery( ...@@ -397,7 +397,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
throw Exception("PREWHERE is not supported if the table is filtered by row-level security expression", ErrorCodes::ILLEGAL_PREWHERE); throw Exception("PREWHERE is not supported if the table is filtered by row-level security expression", ErrorCodes::ILLEGAL_PREWHERE);
/// Calculate structure of the result. /// Calculate structure of the result.
result_header = getSampleBlockImpl(); result_header = getSampleBlockImpl(try_move_to_prewhere);
}; };
analyze(); analyze();
...@@ -425,8 +425,13 @@ InterpreterSelectQuery::InterpreterSelectQuery( ...@@ -425,8 +425,13 @@ InterpreterSelectQuery::InterpreterSelectQuery(
query.setExpression(ASTSelectQuery::Expression::WHERE, makeASTFunction("and", query.prewhere()->clone(), query.where()->clone())); query.setExpression(ASTSelectQuery::Expression::WHERE, makeASTFunction("and", query.prewhere()->clone(), query.where()->clone()));
need_analyze_again = true; need_analyze_again = true;
} }
if (need_analyze_again) if (need_analyze_again)
analyze(); {
/// Do not try move conditions to PREWHERE for the second time.
/// Otherwise, we won't be able to fallback from inefficient PREWHERE to WHERE later.
analyze(/* try_move_to_prewhere = */ false);
}
/// If there is no WHERE, filter blocks as usual /// If there is no WHERE, filter blocks as usual
if (query.prewhere() && !query.where()) if (query.prewhere() && !query.where())
...@@ -509,7 +514,7 @@ QueryPipeline InterpreterSelectQuery::executeWithProcessors() ...@@ -509,7 +514,7 @@ QueryPipeline InterpreterSelectQuery::executeWithProcessors()
} }
Block InterpreterSelectQuery::getSampleBlockImpl() Block InterpreterSelectQuery::getSampleBlockImpl(bool try_move_to_prewhere)
{ {
auto & query = getSelectQuery(); auto & query = getSelectQuery();
const Settings & settings = context->getSettingsRef(); const Settings & settings = context->getSettingsRef();
...@@ -533,7 +538,7 @@ Block InterpreterSelectQuery::getSampleBlockImpl() ...@@ -533,7 +538,7 @@ Block InterpreterSelectQuery::getSampleBlockImpl()
current_info.sets = query_analyzer->getPreparedSets(); current_info.sets = query_analyzer->getPreparedSets();
/// Try transferring some condition from WHERE to PREWHERE if enabled and viable /// Try transferring some condition from WHERE to PREWHERE if enabled and viable
if (settings.optimize_move_to_prewhere && query.where() && !query.prewhere() && !query.final()) if (settings.optimize_move_to_prewhere && try_move_to_prewhere && query.where() && !query.prewhere() && !query.final())
MergeTreeWhereOptimizer{current_info, *context, merge_tree, MergeTreeWhereOptimizer{current_info, *context, merge_tree,
syntax_analyzer_result->requiredSourceColumns(), log}; syntax_analyzer_result->requiredSourceColumns(), log};
}; };
......
...@@ -104,7 +104,7 @@ private: ...@@ -104,7 +104,7 @@ private:
ASTSelectQuery & getSelectQuery() { return query_ptr->as<ASTSelectQuery &>(); } ASTSelectQuery & getSelectQuery() { return query_ptr->as<ASTSelectQuery &>(); }
Block getSampleBlockImpl(); Block getSampleBlockImpl(bool try_move_to_prewhere);
struct Pipeline struct Pipeline
{ {
......
...@@ -431,9 +431,11 @@ void MergeTreeRangeReader::ReadResult::setFilter(const ColumnPtr & new_filter) ...@@ -431,9 +431,11 @@ void MergeTreeRangeReader::ReadResult::setFilter(const ColumnPtr & new_filter)
} }
ConstantFilterDescription const_description(*new_filter); ConstantFilterDescription const_description(*new_filter);
if (const_description.always_false) if (const_description.always_true)
setFilterConstTrue();
else if (const_description.always_false)
clear(); clear();
else if (!const_description.always_true) else
{ {
FilterDescription filter_description(*new_filter); FilterDescription filter_description(*new_filter);
filter_holder = filter_description.data_holder ? filter_description.data_holder : new_filter; filter_holder = filter_description.data_holder ? filter_description.data_holder : new_filter;
......
DROP TABLE IF EXISTS t;
CREATE TABLE t (a Int, b Int, c Int) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t SELECT number, number * 2, number * 3 FROM numbers(100);
SELECT count() FROM t PREWHERE NOT ignore(a) WHERE b > 0;
SELECT sum(a) FROM t PREWHERE isNotNull(a) WHERE isNotNull(b) AND c > 0;
DROP TABLE t;
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册