Fix sampling with prewhere. [#CLICKHOUSE-3972]

This commit is contained in:
Nikolai Kochetov 2018-09-10 13:06:12 +03:00
parent b4e62da3a6
commit 1d62c9309c

View File

@ -2678,7 +2678,7 @@ bool ExpressionAnalyzer::appendPrewhere(ExpressionActionsChain & chain, bool onl
Names required_sample_columns;
if (sampling_expression)
required_sample_columns = ExpressionAnalyzer(sampling_expression, context, nullptr, source_columns).getRequiredSourceColumns();
required_sample_columns = ExpressionAnalyzer(sampling_expression, context, storage).getRequiredSourceColumns();
initChain(chain, source_columns);
auto & step = chain.getLastStep();
@ -2687,15 +2687,6 @@ bool ExpressionAnalyzer::appendPrewhere(ExpressionActionsChain & chain, bool onl
step.required_output.push_back(prewhere_column_name);
step.can_remove_required_output.push_back(true);
/// Add required columns for sample expression to required output in order not to remove them after
/// prewhere execution because sampling is executed after prewhere.
/// TODO: add sampling execution to common chain.
for (const auto & column : required_sample_columns)
{
step.required_output.push_back(column);
step.can_remove_required_output.push_back(true);
}
{
/// Remove unused source_columns from prewhere actions.
auto tmp_actions = std::make_shared<ExpressionActions>(source_columns, context);
@ -2704,6 +2695,18 @@ bool ExpressionAnalyzer::appendPrewhere(ExpressionActionsChain & chain, bool onl
auto required_columns = tmp_actions->getRequiredColumns();
NameSet required_source_columns(required_columns.begin(), required_columns.end());
/// Add required columns for sample expression to required output in order not to remove them after
/// prewhere execution because sampling is executed after prewhere.
/// TODO: add sampling execution to common chain.
for (const auto & column : required_sample_columns)
{
if (required_source_columns.count(column))
{
step.required_output.push_back(column);
step.can_remove_required_output.push_back(true);
}
}
auto names = step.actions->getSampleBlock().getNames();
NameSet name_set(names.begin(), names.end());