diff --git a/dbms/include/DB/Common/HashTable/HashTable.h b/dbms/include/DB/Common/HashTable/HashTable.h index 02c157035a8..4d9edc52ad4 100644 --- a/dbms/include/DB/Common/HashTable/HashTable.h +++ b/dbms/include/DB/Common/HashTable/HashTable.h @@ -443,16 +443,18 @@ public: bool next() { + if (!is_initialized) + { + Cell::State::read(in); + DB::readVarUInt(size, in); + is_initialized = true; + } + if (read_count == size) { is_eof = true; return false; } - else if (read_count == 0) - { - Cell::State::read(in); - DB::readVarUInt(size, in); - } cell.read(in); ++read_count; @@ -462,18 +464,19 @@ public: inline const value_type & get() const { - if ((read_count == 0) || is_eof) + if (!is_initialized || is_eof) throw DB::Exception("No available data", DB::ErrorCodes::NO_AVAILABLE_DATA); return cell.getValue(); } private: - DB::ReadBuffer in; + DB::ReadBuffer & in; Cell cell; size_t read_count = 0; size_t size; bool is_eof = false; + bool is_initialized = false; }; class iterator diff --git a/dbms/include/DB/Common/HashTable/SmallTable.h b/dbms/include/DB/Common/HashTable/SmallTable.h index c68963a4798..3202a2a03f5 100644 --- a/dbms/include/DB/Common/HashTable/SmallTable.h +++ b/dbms/include/DB/Common/HashTable/SmallTable.h @@ -80,18 +80,21 @@ public: bool next() { - if (read_count == size) - { - is_eof = true; - return false; - } - else if (read_count == 0) + if (!is_initialized) { Cell::State::read(in); DB::readVarUInt(size, in); if (size > capacity) throw DB::Exception("Illegal size"); + + is_initialized = true; + } + + if (read_count == size) + { + is_eof = true; + return false; } cell.read(in); @@ -102,18 +105,19 @@ public: inline const value_type & get() const { - if ((read_count == 0) || is_eof) + if (!is_initialized || is_eof) throw DB::Exception("No available data", DB::ErrorCodes::NO_AVAILABLE_DATA); return cell.getValue(); } private: - DB::ReadBuffer in; + DB::ReadBuffer & in; Cell cell; size_t read_count = 0; size_t size; bool is_eof = false; + bool is_initialized = false; }; class iterator diff --git a/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.reference b/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.reference index b82ec5b6e3a..8c94b8a5d58 100644 --- a/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.reference +++ b/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.reference @@ -206,6 +206,7 @@ 31 53574 35 55022 36 53961 +1 1 1 3 1 6 1 @@ -414,3 +415,4 @@ 31 54074 35 54153 36 53999 +1 diff --git a/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.sql b/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.sql index 2886daeb3b3..b91ae03bf0a 100644 --- a/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.sql +++ b/dbms/tests/queries/0_stateless/00212_aggregate_function_uniq.sql @@ -16,6 +16,8 @@ SELECT Y, uniqHLL12(Z) FROM (SELECT number AS X, IPv4NumToString(toUInt32(X)) AS SELECT Y, uniqHLL12(Z) FROM (SELECT number AS X, IPv4NumToString(toUInt32(X)) AS Z, (3*X*X - 7*X + 11) % 37 AS Y FROM system.numbers LIMIT 3000) GROUP BY Y; SELECT Y, uniqHLL12(Z) FROM (SELECT number AS X, IPv4NumToString(toUInt32(X)) AS Z, (3*X*X - 7*X + 11) % 37 AS Y FROM system.numbers LIMIT 1000000) GROUP BY Y; +SELECT uniqHLL12(dummy) FROM remote('127.0.0.{1,2}', system.one); + /* uniqCombined */ SELECT Y, uniqCombined(X) FROM (SELECT number AS X, (3*X*X - 7*X + 11) % 37 AS Y FROM system.numbers LIMIT 15) GROUP BY Y; @@ -33,3 +35,5 @@ SELECT Y, uniqCombined(X) FROM (SELECT number AS X, round(toFloat32(1/(1 + (3*X* SELECT Y, uniqCombined(Z) FROM (SELECT number AS X, IPv4NumToString(toUInt32(X)) AS Z, (3*X*X - 7*X + 11) % 37 AS Y FROM system.numbers LIMIT 15) GROUP BY Y; SELECT Y, uniqCombined(Z) FROM (SELECT number AS X, IPv4NumToString(toUInt32(X)) AS Z, (3*X*X - 7*X + 11) % 37 AS Y FROM system.numbers LIMIT 3000) GROUP BY Y; SELECT Y, uniqCombined(Z) FROM (SELECT number AS X, IPv4NumToString(toUInt32(X)) AS Z, (3*X*X - 7*X + 11) % 37 AS Y FROM system.numbers LIMIT 1000000) GROUP BY Y; + +SELECT uniqCombined(dummy) FROM remote('127.0.0.{1,2}', system.one);