fix fuzzer in query with 'WITH FILL' and 'WITH TOTALS'

This commit is contained in:
Anton Popov 2021-06-22 16:08:12 +03:00
parent 82f0a5f2dd
commit 447fef702d
5 changed files with 41 additions and 13 deletions

View File

@ -40,10 +40,8 @@ void FillingStep::transformPipeline(QueryPipeline & pipeline, const BuildQueryPi
{ {
pipeline.addSimpleTransform([&](const Block & header, QueryPipeline::StreamType stream_type) -> ProcessorPtr pipeline.addSimpleTransform([&](const Block & header, QueryPipeline::StreamType stream_type) -> ProcessorPtr
{ {
if (stream_type == QueryPipeline::StreamType::Totals) bool on_totals = stream_type == QueryPipeline::StreamType::Totals;
return nullptr; return std::make_shared<FillingTransform>(header, sort_description, on_totals);
return std::make_shared<FillingTransform>(header, sort_description);
}); });
} }

View File

@ -30,12 +30,16 @@ Block FillingTransform::transformHeader(Block header, const SortDescription & so
} }
FillingTransform::FillingTransform( FillingTransform::FillingTransform(
const Block & header_, const SortDescription & sort_description_) const Block & header_, const SortDescription & sort_description_, bool on_totals_)
: ISimpleTransform(header_, transformHeader(header_, sort_description_), true) : ISimpleTransform(header_, transformHeader(header_, sort_description_), true)
, sort_description(sort_description_) , sort_description(sort_description_)
, on_totals(on_totals_)
, filling_row(sort_description_) , filling_row(sort_description_)
, next_row(sort_description_) , next_row(sort_description_)
{ {
if (on_totals)
return;
auto try_convert_fields = [](auto & descr, const auto & type) auto try_convert_fields = [](auto & descr, const auto & type)
{ {
auto max_type = Field::Types::Null; auto max_type = Field::Types::Null;
@ -106,7 +110,7 @@ FillingTransform::FillingTransform(
IProcessor::Status FillingTransform::prepare() IProcessor::Status FillingTransform::prepare()
{ {
if (input.isFinished() && !output.isFinished() && !has_input && !generate_suffix) if (!on_totals && input.isFinished() && !output.isFinished() && !has_input && !generate_suffix)
{ {
should_insert_first = next_row < filling_row; should_insert_first = next_row < filling_row;
@ -126,6 +130,9 @@ IProcessor::Status FillingTransform::prepare()
void FillingTransform::transform(Chunk & chunk) void FillingTransform::transform(Chunk & chunk)
{ {
if (on_totals)
return;
Columns old_fill_columns; Columns old_fill_columns;
Columns old_other_columns; Columns old_other_columns;
MutableColumns res_fill_columns; MutableColumns res_fill_columns;

View File

@ -13,7 +13,7 @@ namespace DB
class FillingTransform : public ISimpleTransform class FillingTransform : public ISimpleTransform
{ {
public: public:
FillingTransform(const Block & header_, const SortDescription & sort_description_); FillingTransform(const Block & header_, const SortDescription & sort_description_, bool on_totals_);
String getName() const override { return "FillingTransform"; } String getName() const override { return "FillingTransform"; }
@ -28,6 +28,8 @@ private:
void setResultColumns(Chunk & chunk, MutableColumns & fill_columns, MutableColumns & other_columns) const; void setResultColumns(Chunk & chunk, MutableColumns & fill_columns, MutableColumns & other_columns) const;
const SortDescription sort_description; /// Contains only rows with WITH FILL. const SortDescription sort_description; /// Contains only rows with WITH FILL.
const bool on_totals; /// FillingTransform does nothing on totals.
FillingRow filling_row; /// Current row, which is used to fill gaps. FillingRow filling_row; /// Current row, which is used to fill gaps.
FillingRow next_row; /// Row to which we need to generate filling rows. FillingRow next_row; /// Row to which we need to generate filling rows.

View File

@ -1,8 +1,20 @@
20 0 15 0
19 0 14 0
18 0 13 0
17 0 12 0
16 0 11 0
10 0
9 0
8 0
7 7
6 0
5 0
4 4
3 0
2 0
1 1
0 12
15 0 15 0
14 0 14 0
13 0 13 0

View File

@ -5,4 +5,13 @@ FROM numbers(10)
WHERE number % 3 = 1 WHERE number % 3 = 1
GROUP BY number GROUP BY number
WITH TOTALS WITH TOTALS
ORDER BY number DESC WITH FILL FROM 20; ORDER BY number DESC WITH FILL FROM 15;
SELECT
number,
sum(number)
FROM numbers(10)
WHERE number % 3 = 1
GROUP BY number
WITH TOTALS
ORDER BY 10, number DESC WITH FILL FROM 15;