Fix join for totals.

This commit is contained in:
Nikolai Kochetov 2019-04-10 14:04:56 +03:00
parent 31ed0f0e38
commit 94305c41e3
3 changed files with 10 additions and 4 deletions

View File

@ -749,13 +749,17 @@ void InterpreterSelectQuery::executeImpl(TPipeline & pipeline, const BlockInputS
header_before_join = pipeline.getHeader();
/// In case joined subquery has totals, and we don't, add default chunk to totals.
bool default_totals = false;
if (!pipeline.hasTotals())
{
pipeline.addDefaultTotals();
default_totals = true;
}
pipeline.addSimpleTransform([&](const Block & header, QueryPipeline::StreamType type)
{
bool on_totals = type == QueryPipeline::StreamType::Totals;
return std::make_shared<ExpressionTransform>(header, expressions.before_join, on_totals);
return std::make_shared<ExpressionTransform>(header, expressions.before_join, on_totals, default_totals);
});
}
else

View File

@ -11,10 +11,11 @@ static Block transformHeader(Block header, const ExpressionActionsPtr & expressi
}
ExpressionTransform::ExpressionTransform(const Block & header, ExpressionActionsPtr expression, bool on_totals)
ExpressionTransform::ExpressionTransform(const Block & header, ExpressionActionsPtr expression, bool on_totals, bool default_totals)
: ISimpleTransform(header, transformHeader(header, expression), on_totals)
, expression(std::move(expression))
, on_totals(on_totals)
, default_totals(default_totals)
{
}
@ -24,7 +25,7 @@ void ExpressionTransform::transform(Chunk & chunk)
if (on_totals)
{
if (!expression->hasTotalsInJoin())
if (default_totals && !expression->hasTotalsInJoin())
return;
expression->executeOnTotals(block);

View File

@ -10,7 +10,7 @@ using ExpressionActionsPtr = std::shared_ptr<ExpressionActions>;
class ExpressionTransform : public ISimpleTransform
{
public:
ExpressionTransform(const Block & header, ExpressionActionsPtr expression, bool on_totals = false);
ExpressionTransform(const Block & header, ExpressionActionsPtr expression, bool on_totals = false, bool default_totals = false);
String getName() const override { return "ExpressionTransform"; }
@ -20,6 +20,7 @@ protected:
private:
ExpressionActionsPtr expression;
bool on_totals;
bool default_totals;
};
}