This commit is contained in:
Michael Kolupaev 2014-05-07 15:44:14 +04:00
parent 892704d332
commit c6194d47f4
4 changed files with 31 additions and 8 deletions

View File

@ -20,7 +20,7 @@ class SummingSortedBlockInputStream : public MergingSortedBlockInputStream
public:
SummingSortedBlockInputStream(BlockInputStreams inputs_, const SortDescription & description_, size_t max_block_size_)
: MergingSortedBlockInputStream(inputs_, description_, max_block_size_),
log(&Logger::get("SummingSortedBlockInputStream")), current_row_is_zero(false)
log(&Logger::get("SummingSortedBlockInputStream")), current_row_is_zero(false), output_is_non_empty(false)
{
}
@ -59,6 +59,8 @@ private:
Row current_row;
bool current_row_is_zero; /// Текущая строчка просуммировалась в ноль, и её следует удалить.
bool output_is_non_empty; /// Отдали ли мы наружу хоть одну строку.
/** Делаем поддержку двух разных курсоров - с Collation и без.
* Шаблоны используем вместо полиморфных SortCursor'ов и вызовов виртуальных функций.
*/

View File

@ -7,9 +7,6 @@ namespace DB
void SummingSortedBlockInputStream::insertCurrentRow(ColumnPlainPtrs & merged_columns)
{
if (current_row_is_zero)
return;
for (size_t i = 0; i < num_columns; ++i)
merged_columns[i]->insert(current_row[i]);
}
@ -84,9 +81,10 @@ void SummingSortedBlockInputStream::merge(Block & merged_block, ColumnPlainPtrs
if (next_key != current_key)
{
/// Запишем данные для предыдущей группы.
if (!current_key[0].isNull())
if (!current_key[0].isNull() && !current_row_is_zero)
{
++merged_rows;
output_is_non_empty = true;
insertCurrentRow(merged_columns);
}
@ -116,9 +114,13 @@ void SummingSortedBlockInputStream::merge(Block & merged_block, ColumnPlainPtrs
return;
}
/// Запишем данные для последней группы.
++merged_rows;
insertCurrentRow(merged_columns);
/// Запишем данные для последней группы, если она ненулевая.
/// Если она нулевая, и без нее выходной поток окажется пустым, запишем ее все равно.
if (!current_row_is_zero || !output_is_non_empty)
{
++merged_rows;
insertCurrentRow(merged_columns);
}
children.clear();
}

View File

@ -0,0 +1,2 @@
2015-01-01 1 0
2015-01-01 2 -9

View File

@ -0,0 +1,17 @@
CREATE DATABASE IF NOT EXISTS test;
DROP TABLE IF EXISTS test.empty_summing;
CREATE TABLE test.empty_summing (d Date, k UInt64, v Int8) ENGINE=SummingMergeTree(d, k, 8192);
INSERT INTO test.empty_summing VALUES ('2015-01-01', 1, 10);
INSERT INTO test.empty_summing VALUES ('2015-01-01', 1, -10);
OPTIMIZE TABLE test.empty_summing;
SELECT * FROM test.empty_summing;
INSERT INTO test.empty_summing VALUES ('2015-01-01', 1, 4),('2015-01-01', 2, -9),('2015-01-01', 3, -14);
INSERT INTO test.empty_summing VALUES ('2015-01-01', 1, -2),('2015-01-01', 1, -2),('2015-01-01', 3, 14);
OPTIMIZE TABLE test.empty_summing;
SELECT * FROM test.empty_summing;
DROP TABLE test.empty_summing;