diff --git a/src/Interpreters/InterpreterSelectQuery.cpp b/src/Interpreters/InterpreterSelectQuery.cpp index 11c3a6b1211baebfe69770d0c286aa42af1729e8..9452fbeaa43ce7a05668c0bf80bcf51fd5ad6d8c 100644 --- a/src/Interpreters/InterpreterSelectQuery.cpp +++ b/src/Interpreters/InterpreterSelectQuery.cpp @@ -89,6 +89,7 @@ #include #include #include +#include namespace DB @@ -1508,12 +1509,13 @@ void InterpreterSelectQuery::executeTotalsAndHaving(QueryPipeline & pipeline, bo { const Settings & settings = context->getSettingsRef(); - auto totals_having = std::make_shared( - pipeline.getHeader(), overflow_row, expression, + TotalsHavingStep totals_having_step( + DataStream{.header = pipeline.getHeader()}, + overflow_row, expression, has_having ? getSelectQuery().having()->getColumnName() : "", settings.totals_mode, settings.totals_auto_threshold, final); - pipeline.addTotalsHavingTransform(std::move(totals_having)); + totals_having_step.transformPipeline(pipeline); } diff --git a/src/Processors/QueryPlan/TotalsHavingStep.cpp b/src/Processors/QueryPlan/TotalsHavingStep.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0db1acd74f5825e8b22ae4406c2149e9ca3f5ff5 --- /dev/null +++ b/src/Processors/QueryPlan/TotalsHavingStep.cpp @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +namespace DB +{ + +TotalsHavingStep::TotalsHavingStep( + const DataStream & input_stream_, + bool overflow_row_, + const ExpressionActionsPtr & expression_, + const std::string & filter_column_, + TotalsMode totals_mode_, + double auto_include_threshold_, + bool final_) + : ITransformingStep( + input_stream_, + DataStream{.header = TotalsHavingTransform::transformHeader(input_stream_.header, expression_, final_)}) + , overflow_row(overflow_row_) + , expression(expression_) + , filter_column_name(filter_column_) + , totals_mode(totals_mode_) + , auto_include_threshold(auto_include_threshold_) + , final(final_) +{ +} + +void TotalsHavingStep::transformPipeline(QueryPipeline & pipeline) +{ + auto totals_having = std::make_shared( + pipeline.getHeader(), overflow_row, expression, + filter_column_name, totals_mode, auto_include_threshold, final); + + pipeline.addTotalsHavingTransform(std::move(totals_having)); +} + +} diff --git a/src/Processors/QueryPlan/TotalsHavingStep.h b/src/Processors/QueryPlan/TotalsHavingStep.h new file mode 100644 index 0000000000000000000000000000000000000000..ddb0ccd25728d00af1145fd41ad59302ea20753e --- /dev/null +++ b/src/Processors/QueryPlan/TotalsHavingStep.h @@ -0,0 +1,39 @@ +#pragma once +#include +#include + +namespace DB +{ + +class ExpressionActions; +using ExpressionActionsPtr = std::shared_ptr; + +enum class TotalsMode; + +class TotalsHavingStep : public ITransformingStep +{ +public: + TotalsHavingStep( + const DataStream & input_stream_, + bool overflow_row_, + const ExpressionActionsPtr & expression_, + const std::string & filter_column_, + TotalsMode totals_mode_, + double auto_include_threshold_, + bool final_); + + String getName() const override { return "TotalsHaving"; } + + void transformPipeline(QueryPipeline & pipeline) override; + +private: + bool overflow_row; + ExpressionActionsPtr expression; + String filter_column_name; + TotalsMode totals_mode; + double auto_include_threshold; + bool final; +}; + +} + diff --git a/src/Processors/Transforms/TotalsHavingTransform.cpp b/src/Processors/Transforms/TotalsHavingTransform.cpp index 083066a72d95e88324e36bf7cdb976fa98acfd67..eb1cbf6e9d810ea3de2e3392073c764522e99330 100644 --- a/src/Processors/Transforms/TotalsHavingTransform.cpp +++ b/src/Processors/Transforms/TotalsHavingTransform.cpp @@ -32,7 +32,7 @@ void finalizeChunk(Chunk & chunk) chunk.setColumns(std::move(columns), num_rows); } -static Block createOutputHeader(Block block, const ExpressionActionsPtr & expression, bool final) +Block TotalsHavingTransform::transformHeader(Block block, const ExpressionActionsPtr & expression, bool final) { if (final) finalizeBlock(block); @@ -51,7 +51,7 @@ TotalsHavingTransform::TotalsHavingTransform( TotalsMode totals_mode_, double auto_include_threshold_, bool final_) - : ISimpleTransform(header, createOutputHeader(header, expression_, final_), true) + : ISimpleTransform(header, transformHeader(header, expression_, final_), true) , overflow_row(overflow_row_) , expression(expression_) , filter_column_name(filter_column_) diff --git a/src/Processors/Transforms/TotalsHavingTransform.h b/src/Processors/Transforms/TotalsHavingTransform.h index f16b333ffd4eca5a149067d61a279a04d491da3c..8191ec763b09240c3fe01f70270b302730c5b144 100644 --- a/src/Processors/Transforms/TotalsHavingTransform.h +++ b/src/Processors/Transforms/TotalsHavingTransform.h @@ -37,6 +37,8 @@ public: Status prepare() override; void work() override; + static Block transformHeader(Block block, const ExpressionActionsPtr & expression, bool final); + protected: void transform(Chunk & chunk) override; diff --git a/src/Processors/ya.make b/src/Processors/ya.make index 537d81e9750a3e0aa893d55d28641fa870b5ec0c..b5be02082417f8a20e7552396dad8ee3a8b6ec3b 100644 --- a/src/Processors/ya.make +++ b/src/Processors/ya.make @@ -155,6 +155,7 @@ SRCS( QueryPlan/ReadFromPreparedSource.cpp QueryPlan/ReadFromStorageStep.cpp QueryPlan/ReadNothingStep.cpp + QueryPlan/TotalsHavingStep QueryPlan/QueryPlan.cpp )