mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 07:01:59 +00:00
Merge
This commit is contained in:
parent
892704d332
commit
c6194d47f4
@ -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'ов и вызовов виртуальных функций.
|
||||
*/
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -0,0 +1,2 @@
|
||||
2015-01-01 1 0
|
||||
2015-01-01 2 -9
|
17
dbms/tests/queries/0_stateless/00043_summing_empty_part.sql
Normal file
17
dbms/tests/queries/0_stateless/00043_summing_empty_part.sql
Normal 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;
|
Loading…
Reference in New Issue
Block a user