mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-21 17:20:50 +00:00
dbms: fixed error with hash tables [#METR-10571].
This commit is contained in:
parent
5e5997d150
commit
7cde6bb6a6
@ -86,10 +86,22 @@ private:
|
|||||||
* Элемент может остаться на месте, или переместиться в новое место "справа",
|
* Элемент может остаться на месте, или переместиться в новое место "справа",
|
||||||
* или переместиться левее по цепочке разрешения коллизий, из-за того, что элементы левее него были перемещены в новое место "справа".
|
* или переместиться левее по цепочке разрешения коллизий, из-за того, что элементы левее него были перемещены в новое место "справа".
|
||||||
*/
|
*/
|
||||||
for (size_t i = 0; i < old_size; ++i)
|
size_t i = 0;
|
||||||
|
for (; i < old_size; ++i)
|
||||||
if (buf[i].version == version)
|
if (buf[i].version == version)
|
||||||
reinsert(buf[i]);
|
reinsert(buf[i]);
|
||||||
|
|
||||||
|
/** Также имеется особый случай:
|
||||||
|
* если элемент должен был быть в конце старого буфера, [ x]
|
||||||
|
* но находится в начале из-за цепочки разрешения коллизий, [o x]
|
||||||
|
* то после ресайза, он сначала снова окажется не на своём месте, [ xo ]
|
||||||
|
* и для того, чтобы перенести его куда надо,
|
||||||
|
* надо будет после переноса всех элементов из старой половинки [ o x ]
|
||||||
|
* обработать ещё хвостик из цепочки разрешения коллизий сразу после неё [ o x ]
|
||||||
|
*/
|
||||||
|
for (; buf[i].version == version; ++i)
|
||||||
|
reinsert(buf[i]);
|
||||||
|
|
||||||
#ifdef DBMS_HASH_MAP_DEBUG_RESIZES
|
#ifdef DBMS_HASH_MAP_DEBUG_RESIZES
|
||||||
watch.stop();
|
watch.stop();
|
||||||
std::cerr << std::fixed << std::setprecision(3)
|
std::cerr << std::fixed << std::setprecision(3)
|
||||||
|
@ -181,10 +181,22 @@ private:
|
|||||||
* Элемент может остаться на месте, или переместиться в новое место "справа",
|
* Элемент может остаться на месте, или переместиться в новое место "справа",
|
||||||
* или переместиться левее по цепочке разрешения коллизий, из-за того, что элементы левее него были перемещены в новое место "справа".
|
* или переместиться левее по цепочке разрешения коллизий, из-за того, что элементы левее него были перемещены в новое место "справа".
|
||||||
*/
|
*/
|
||||||
for (size_t i = 0; i < old_size; ++i)
|
size_t i = 0;
|
||||||
|
for (; i < old_size; ++i)
|
||||||
if (!ZeroTraits::check(buf[i].first))
|
if (!ZeroTraits::check(buf[i].first))
|
||||||
reinsert(buf[i]);
|
reinsert(buf[i]);
|
||||||
|
|
||||||
|
/** Также имеется особый случай:
|
||||||
|
* если элемент должен был быть в конце старого буфера, [ x]
|
||||||
|
* но находится в начале из-за цепочки разрешения коллизий, [o x]
|
||||||
|
* то после ресайза, он сначала снова окажется не на своём месте, [ xo ]
|
||||||
|
* и для того, чтобы перенести его куда надо,
|
||||||
|
* надо будет после переноса всех элементов из старой половинки [ o x ]
|
||||||
|
* обработать ещё хвостик из цепочки разрешения коллизий сразу после неё [ o x ]
|
||||||
|
*/
|
||||||
|
for (; !ZeroTraits::check(buf[i].first); ++i)
|
||||||
|
reinsert(buf[i]);
|
||||||
|
|
||||||
#ifdef DBMS_HASH_MAP_DEBUG_RESIZES
|
#ifdef DBMS_HASH_MAP_DEBUG_RESIZES
|
||||||
watch.stop();
|
watch.stop();
|
||||||
std::cerr << std::fixed << std::setprecision(3)
|
std::cerr << std::fixed << std::setprecision(3)
|
||||||
|
@ -87,10 +87,22 @@ private:
|
|||||||
* Элемент может остаться на месте, или переместиться в новое место "справа",
|
* Элемент может остаться на месте, или переместиться в новое место "справа",
|
||||||
* или переместиться левее по цепочке разрешения коллизий, из-за того, что элементы левее него были перемещены в новое место "справа".
|
* или переместиться левее по цепочке разрешения коллизий, из-за того, что элементы левее него были перемещены в новое место "справа".
|
||||||
*/
|
*/
|
||||||
for (size_t i = 0; i < old_size; ++i)
|
size_t i = 0;
|
||||||
|
for (; i < old_size; ++i)
|
||||||
if (!ZeroTraits::check(buf[i]))
|
if (!ZeroTraits::check(buf[i]))
|
||||||
reinsert(buf[i]);
|
reinsert(buf[i]);
|
||||||
|
|
||||||
|
/** Также имеется особый случай:
|
||||||
|
* если элемент должен был быть в конце старого буфера, [ x]
|
||||||
|
* но находится в начале из-за цепочки разрешения коллизий, [o x]
|
||||||
|
* то после ресайза, он сначала снова окажется не на своём месте, [ xo ]
|
||||||
|
* и для того, чтобы перенести его куда надо,
|
||||||
|
* надо будет после переноса всех элементов из старой половинки [ o x ]
|
||||||
|
* обработать ещё хвостик из цепочки разрешения коллизий сразу после неё [ o x ]
|
||||||
|
*/
|
||||||
|
for (; !ZeroTraits::check(buf[i]); ++i)
|
||||||
|
reinsert(buf[i]);
|
||||||
|
|
||||||
#ifdef DBMS_HASH_MAP_DEBUG_RESIZES
|
#ifdef DBMS_HASH_MAP_DEBUG_RESIZES
|
||||||
watch.stop();
|
watch.stop();
|
||||||
std::cerr << std::fixed << std::setprecision(3)
|
std::cerr << std::fixed << std::setprecision(3)
|
||||||
|
Loading…
Reference in New Issue
Block a user