From c629799500242eeaeef0a8641f2507aa7292f6ea Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 16 Aug 2017 17:21:24 +0300 Subject: [PATCH 001/116] Fixed insufficient arguments checking [#CLICKHOUSE-3102]. --- dbms/src/Functions/FunctionsStringArray.h | 4 ++++ dbms/src/Interpreters/loadMetadata.cpp | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dbms/src/Functions/FunctionsStringArray.h b/dbms/src/Functions/FunctionsStringArray.h index be44cd1d47f..bd9222699cf 100644 --- a/dbms/src/Functions/FunctionsStringArray.h +++ b/dbms/src/Functions/FunctionsStringArray.h @@ -20,6 +20,7 @@ namespace DB namespace ErrorCodes { extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int BAD_ARGUMENTS; } @@ -210,6 +211,9 @@ public: ErrorCodes::ILLEGAL_COLUMN); sep = col->getValue(); + + if (sep.empty()) + throw Exception("Illegal separator for function " + getName() + ". Must be not empty.", ErrorCodes::BAD_ARGUMENTS); } /// Returns the position of the argument that is the column of strings diff --git a/dbms/src/Interpreters/loadMetadata.cpp b/dbms/src/Interpreters/loadMetadata.cpp index dac4ef0c911..80b670f4c3f 100644 --- a/dbms/src/Interpreters/loadMetadata.cpp +++ b/dbms/src/Interpreters/loadMetadata.cpp @@ -137,7 +137,6 @@ void loadMetadataSystem(Context & context) auto system_database = std::make_shared(SYSTEM_DATABASE, global_path + "metadata/" SYSTEM_DATABASE); context.addDatabase(SYSTEM_DATABASE, system_database); - } } From a11759c75bd7d9964e94bc87cba200cc1ff17483 Mon Sep 17 00:00:00 2001 From: blazerer Date: Wed, 16 Aug 2017 17:51:54 +0300 Subject: [PATCH 002/116] mysqlxx transaction exception safety Fix terminate on exception and rollback query fail. --- libs/libmysqlxx/include/mysqlxx/Transaction.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/libmysqlxx/include/mysqlxx/Transaction.h b/libs/libmysqlxx/include/mysqlxx/Transaction.h index 542cd8e12e7..2b3a26ef63a 100644 --- a/libs/libmysqlxx/include/mysqlxx/Transaction.h +++ b/libs/libmysqlxx/include/mysqlxx/Transaction.h @@ -22,8 +22,14 @@ public: virtual ~Transaction() { - if (!finished) - rollback(); + try + { + if (!finished) + rollback(); + } + catch (...) + { + } } void commit() From b6cafb9a885491ae5c1797fd9d2fcb5beb4f333f Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 16 Aug 2017 20:21:39 +0300 Subject: [PATCH 003/116] Set "max_replica_delay_for_distributed_queries" to five minutes by default [#CLICKHOUSE-2141]. --- dbms/src/Interpreters/Settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/Interpreters/Settings.h b/dbms/src/Interpreters/Settings.h index 81b96ef53e4..a0eb9639060 100644 --- a/dbms/src/Interpreters/Settings.h +++ b/dbms/src/Interpreters/Settings.h @@ -274,7 +274,7 @@ struct Settings * Zero means do not take delay into account. \ */ \ \ - M(SettingUInt64, max_replica_delay_for_distributed_queries, 0) \ + M(SettingUInt64, max_replica_delay_for_distributed_queries, 300) \ /** Suppose max_replica_delay_for_distributed_queries is set and all replicas for the queried table are stale. \ * If this setting is enabled, the query will be performed anyway, otherwise the error will be reported. \ */ \ From 0490a268f755ce4409d8e02b76141a93fea62896 Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 16 Aug 2017 21:06:40 +0300 Subject: [PATCH 004/116] Cmake: find_unwind: Fix disable on arm --- libs/libdaemon/cmake/find_unwind.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/libdaemon/cmake/find_unwind.cmake b/libs/libdaemon/cmake/find_unwind.cmake index 0c55715b60c..80b2c746c7c 100644 --- a/libs/libdaemon/cmake/find_unwind.cmake +++ b/libs/libdaemon/cmake/find_unwind.cmake @@ -1,7 +1,7 @@ include (CMakePushCheckState) cmake_push_check_state () -if (CMAKE_SYSTEM MATCHES "Linux" AND NOT ARM) +if (CMAKE_SYSTEM MATCHES "Linux" AND NOT ARCH_ARM) option (USE_INTERNAL_UNWIND_LIBRARY "Set to FALSE to use system unwind library instead of bundled" ${NOT_UNBUNDLED}) else () option (USE_INTERNAL_UNWIND_LIBRARY "Set to FALSE to use system unwind library instead of bundled" OFF) @@ -34,7 +34,7 @@ endif () if (UNWIND_LIBRARY AND UNWIND_INCLUDE_DIR) set (USE_UNWIND 1) -elseif (CMAKE_SYSTEM MATCHES "Linux" AND NOT ARM) +elseif (CMAKE_SYSTEM MATCHES "Linux" AND NOT ARCH_ARM) set (USE_INTERNAL_UNWIND_LIBRARY 1) set (UNWIND_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/libunwind/include") set (UNWIND_LIBRARY unwind) From 164ad05ae1366440ee47f7f34b92b697c97a985e Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 16 Aug 2017 22:22:49 +0300 Subject: [PATCH 005/116] Little better [#CLICKHOUSE-3231]. --- .../Storages/MergeTree/DataPartsExchange.cpp | 4 +-- dbms/src/Storages/MergeTree/MergeTreeData.cpp | 13 +++------- .../Storages/MergeTree/MergeTreeDataPart.cpp | 13 +++++++++- .../Storages/MergeTree/MergeTreeDataPart.h | 25 +++++++++++-------- .../MergeTree/ShardedPartitionUploader.cpp | 4 +-- 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/dbms/src/Storages/MergeTree/DataPartsExchange.cpp b/dbms/src/Storages/MergeTree/DataPartsExchange.cpp index b0d98f44ae9..c7eb2abbaa7 100644 --- a/dbms/src/Storages/MergeTree/DataPartsExchange.cpp +++ b/dbms/src/Storages/MergeTree/DataPartsExchange.cpp @@ -268,9 +268,7 @@ MergeTreeData::MutableDataPartPtr Fetcher::fetchPartImpl( new_data_part->info = MergeTreePartInfo::fromPartName(part_name); MergeTreePartInfo::parseMinMaxDatesFromPartName(part_name, new_data_part->min_date, new_data_part->max_date); new_data_part->modification_time = time(nullptr); - new_data_part->loadColumns(true); - new_data_part->loadChecksums(true); - new_data_part->loadIndex(); + new_data_part->loadColumnsChecksumsIndex(true, false); new_data_part->is_sharded = false; new_data_part->checksums.checkEqual(checksums, false); diff --git a/dbms/src/Storages/MergeTree/MergeTreeData.cpp b/dbms/src/Storages/MergeTree/MergeTreeData.cpp index f675eaee193..55163ffe408 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeData.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeData.cpp @@ -302,7 +302,7 @@ void MergeTreeData::loadDataParts(bool skip_sanity_checks) Poco::DirectoryIterator end; for (Poco::DirectoryIterator it(full_path); it != end; ++it) { - /// Skip temporary directories older than one day. + /// Skip temporary directories. if (startsWith(it.name(), "tmp")) continue; @@ -326,10 +326,7 @@ void MergeTreeData::loadDataParts(bool skip_sanity_checks) try { - part->loadColumns(require_part_metadata); - part->loadChecksums(require_part_metadata); - part->loadIndex(); - part->checkNotBroken(require_part_metadata); + part->loadColumnsChecksumsIndex(require_part_metadata, true); } catch (const Exception & e) { @@ -1544,11 +1541,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeData::loadPartAndFixMetadata(const St if (Poco::File(full_part_path + "columns.txt").exists()) Poco::File(full_part_path + "columns.txt").remove(); - part->loadColumns(false); - part->loadChecksums(false); - part->loadIndex(); - part->checkNotBroken(false); - + part->loadColumnsChecksumsIndex(false, true); part->modification_time = Poco::File(full_part_path).getLastModified().epochTime(); /// If the checksums file is not present, calculate the checksums and write them to disk. diff --git a/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp b/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp index 6d5de63053a..c628a70179d 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp @@ -529,6 +529,17 @@ void MergeTreeDataPart::renameAddPrefix(bool to_detached, const String & prefix) renameTo(dst_name()); } + +void MergeTreeDataPart::loadColumnsChecksumsIndex(bool require_columns_checksums, bool check_consistency) +{ + loadColumns(require_columns_checksums); + loadChecksums(require_columns_checksums); + loadIndex(); + if (check_consistency) + checkConsistency(require_columns_checksums); +} + + void MergeTreeDataPart::loadIndex() { /// Size - in number of marks. @@ -627,7 +638,7 @@ void MergeTreeDataPart::loadColumns(bool require) columns.readText(file); } -void MergeTreeDataPart::checkNotBroken(bool require_part_metadata) +void MergeTreeDataPart::checkConsistency(bool require_part_metadata) { String path = getFullPath(); diff --git a/dbms/src/Storages/MergeTree/MergeTreeDataPart.h b/dbms/src/Storages/MergeTree/MergeTreeDataPart.h index d7c30b9ad22..3d6211f78a7 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeDataPart.h +++ b/dbms/src/Storages/MergeTree/MergeTreeDataPart.h @@ -180,19 +180,12 @@ struct MergeTreeDataPart /// Renames a part by appending a prefix to the name. To_detached - also moved to the detached directory. void renameAddPrefix(bool to_detached, const String & prefix) const; - /// Loads index file. Also calculates this->size if size=0 - void loadIndex(); - - /// If checksums.txt exists, reads files' checksums (and sizes) from it - void loadChecksums(bool require); - /// Populates columns_to_size map (compressed size). void accumulateColumnSizes(ColumnToSize & column_to_size) const; - /// Reads columns names and types from columns.txt - void loadColumns(bool require); - - void checkNotBroken(bool require_part_metadata); + /// Initialize columns (from columns.txt if exists, or create from column files if not). + /// Load checksums from checksums.txt if exists. Load index if required. + void loadColumnsChecksumsIndex(bool require_columns_checksums, bool check_consistency); /// Checks that .bin and .mrk files exist bool hasColumnFiles(const String & column) const; @@ -200,6 +193,18 @@ struct MergeTreeDataPart /// For data in RAM ('index') size_t getIndexSizeInBytes() const; size_t getIndexSizeInAllocatedBytes() const; + +private: + /// Reads columns names and types from columns.txt + void loadColumns(bool require); + + /// If checksums.txt exists, reads files' checksums (and sizes) from it + void loadChecksums(bool require); + + /// Loads index file. Also calculates this->size if size=0 + void loadIndex(); + + void checkConsistency(bool require_part_metadata); }; } diff --git a/dbms/src/Storages/MergeTree/ShardedPartitionUploader.cpp b/dbms/src/Storages/MergeTree/ShardedPartitionUploader.cpp index 55950a5a93d..b51180b51c4 100644 --- a/dbms/src/Storages/MergeTree/ShardedPartitionUploader.cpp +++ b/dbms/src/Storages/MergeTree/ShardedPartitionUploader.cpp @@ -107,9 +107,7 @@ void Service::processQuery(const Poco::Net::HTMLForm & params, ReadBuffer & body data_part->info = MergeTreePartInfo::fromPartName(part_name); MergeTreePartInfo::parseMinMaxDatesFromPartName(part_name, data_part->min_date, data_part->max_date); data_part->modification_time = time(nullptr); - data_part->loadColumns(true); - data_part->loadChecksums(true); - data_part->loadIndex(); + data_part->loadColumnsChecksumsIndex(true, false); data_part->is_sharded = false; data_part->checksums.checkEqual(checksums, false); From 3a86673aea96db7e2c46f96bd291d7a7c2ece6ef Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 16 Aug 2017 22:41:52 +0300 Subject: [PATCH 006/116] Fixed error when part could become broken during ALTER MODIFY of element of Nested column [#CLICKHOUSE-3232]. --- dbms/src/Storages/MergeTree/MergeTreeData.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dbms/src/Storages/MergeTree/MergeTreeData.cpp b/dbms/src/Storages/MergeTree/MergeTreeData.cpp index 55163ffe408..78a7c3188f0 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeData.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeData.cpp @@ -1030,7 +1030,16 @@ MergeTreeData::AlterDataPartTransactionPtr MergeTreeData::alterDataPart( part->size_in_bytes, static_cast(part->size_in_bytes) / this->getTotalActiveSizeInBytes()); ExpressionBlockInputStream in(part_in, expression); - MergedColumnOnlyOutputStream out(*this, full_path + part->name + '/', true, compression_method, false); + + /** Don't write offsets for arrays, because ALTER never change them + * (MODIFY COLUMN could only change types of elements but never modify array sizes). + * Also note that they does not participate in 'rename_map'. + * Also note, that for columns, that are parts of Nested, + * temporary column name ('converting_column_name') created in 'createConvertExpression' method + * will have old name of shared offsets for arrays. + */ + MergedColumnOnlyOutputStream out(*this, full_path + part->name + '/', true, compression_method, true /* skip_offsets */); + in.readPrefix(); out.writePrefix(); From eb88391655178d5b7a23658d70225456b66b0b81 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 16 Aug 2017 23:10:25 +0300 Subject: [PATCH 007/116] Fixed error with alias substitution [#CLICKHOUSE-2986]. --- dbms/src/Interpreters/ExpressionAnalyzer.cpp | 19 ++++++++++++------- .../00494_alias_substitution_bug.reference | 2 ++ .../00494_alias_substitution_bug.sql | 5 +++++ 3 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 dbms/tests/queries/0_stateless/00494_alias_substitution_bug.reference create mode 100644 dbms/tests/queries/0_stateless/00494_alias_substitution_bug.sql diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index bce55a70a89..9532f6678ac 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -1009,8 +1009,10 @@ void ExpressionAnalyzer::normalizeTreeImpl( /// rewrite rules that act when you go from top to bottom. bool replaced = false; - ASTFunction * func_node = typeid_cast(ast.get()); - if (func_node) + ASTIdentifier * identifier_node = nullptr; + ASTFunction * func_node = nullptr; + + if ((func_node = typeid_cast(ast.get()))) { /** Is there a column in the table whose name fully matches the function entry? * For example, in the table there is a column "domain(URL)", and we requested domain(URL). @@ -1048,13 +1050,13 @@ void ExpressionAnalyzer::normalizeTreeImpl( } } } - else if (ASTIdentifier * node = typeid_cast(ast.get())) + else if ((identifier_node = typeid_cast(ast.get()))) { - if (node->kind == ASTIdentifier::Column) + if (identifier_node->kind == ASTIdentifier::Column) { /// If it is an alias, but not a parent alias (for constructs like "SELECT column + 1 AS column"). - Aliases::const_iterator jt = aliases.find(node->name); - if (jt != aliases.end() && current_alias != node->name) + Aliases::const_iterator jt = aliases.find(identifier_node->name); + if (jt != aliases.end() && current_alias != identifier_node->name) { /// Let's replace it with the corresponding tree node. if (current_asts.count(jt->second.get())) @@ -1116,7 +1118,7 @@ void ExpressionAnalyzer::normalizeTreeImpl( return; } - /// Recurring calls. Don't go into subqueries. + /// Recurring calls. Don't go into subqueries. Don't go into components of compound identifiers. /// We also do not go to the left argument of lambda expressions, so as not to replace the formal parameters /// on aliases in expressions of the form 123 AS x, arrayMap(x -> 1, [2]). @@ -1134,6 +1136,9 @@ void ExpressionAnalyzer::normalizeTreeImpl( normalizeTreeImpl(child, finished_asts, current_asts, current_alias, level + 1); } } + else if (identifier_node) + { + } else { for (auto & child : ast->children) diff --git a/dbms/tests/queries/0_stateless/00494_alias_substitution_bug.reference b/dbms/tests/queries/0_stateless/00494_alias_substitution_bug.reference new file mode 100644 index 00000000000..6ed281c757a --- /dev/null +++ b/dbms/tests/queries/0_stateless/00494_alias_substitution_bug.reference @@ -0,0 +1,2 @@ +1 +1 diff --git a/dbms/tests/queries/0_stateless/00494_alias_substitution_bug.sql b/dbms/tests/queries/0_stateless/00494_alias_substitution_bug.sql new file mode 100644 index 00000000000..81c4b1a39a4 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00494_alias_substitution_bug.sql @@ -0,0 +1,5 @@ +DROP TABLE IF EXISTS test.nested; +CREATE TABLE test.nested (n Nested(x UInt8)) ENGINE = Memory; +INSERT INTO test.nested VALUES ([1, 2]); +SELECT 1 AS x FROM remote('127.0.0.1', test.nested) ARRAY JOIN n.x; +DROP TABLE test.nested; From 16d6c4f9e73f22aaf917193b8866d925066740a9 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 16 Aug 2017 23:27:35 +0300 Subject: [PATCH 008/116] Removed very old protocol compatibility features [#CLICKHOUSE-2]. --- dbms/src/Client/Connection.cpp | 23 ++++--------------- dbms/src/Core/Defines.h | 3 --- dbms/src/Core/Progress.cpp | 8 ++----- .../DataStreams/NativeBlockInputStream.cpp | 2 +- dbms/src/DataStreams/NativeBlockInputStream.h | 3 +-- .../DataStreams/NativeBlockOutputStream.cpp | 2 +- .../src/DataStreams/NativeBlockOutputStream.h | 3 +-- dbms/src/Server/TCPHandler.cpp | 15 ++++-------- 8 files changed, 16 insertions(+), 43 deletions(-) diff --git a/dbms/src/Client/Connection.cpp b/dbms/src/Client/Connection.cpp index d66571a6641..8054699c7ec 100644 --- a/dbms/src/Client/Connection.cpp +++ b/dbms/src/Client/Connection.cpp @@ -351,8 +351,8 @@ void Connection::sendQuery( block_in.reset(); block_out.reset(); - /// If server version is new enough, send empty block which meand end of data. - if (server_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES && !with_pending_data) + /// Send empty block which means end of data. + if (!with_pending_data) { sendData(Block()); out->next(); @@ -384,9 +384,7 @@ void Connection::sendData(const Block & block, const String & name) } writeVarUInt(Protocol::Client::Data, *out); - - if (server_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - writeStringBinary(name, *out); + writeStringBinary(name, *out); size_t prev_bytes = out->count(); @@ -405,9 +403,7 @@ void Connection::sendPreparedData(ReadBuffer & input, size_t size, const String /// NOTE 'Throttler' is not used in this method (could use, but it's not important right now). writeVarUInt(Protocol::Client::Data, *out); - - if (server_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - writeStringBinary(name, *out); + writeStringBinary(name, *out); if (0 == size) copyData(input, *out); @@ -419,13 +415,6 @@ void Connection::sendPreparedData(ReadBuffer & input, size_t size, const String void Connection::sendExternalTablesData(ExternalTablesData & data) { - /// If working with older server, don't send any info. - if (server_revision < DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - { - out->next(); - return; - } - if (data.empty()) { /// Send empty block, which means end of data transfer. @@ -552,9 +541,7 @@ Block Connection::receiveData() initBlockInput(); String external_table_name; - - if (server_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - readStringBinary(external_table_name, *in); + readStringBinary(external_table_name, *in); size_t prev_bytes = in->count(); diff --git a/dbms/src/Core/Defines.h b/dbms/src/Core/Defines.h index 08184f55f84..10ba7030836 100644 --- a/dbms/src/Core/Defines.h +++ b/dbms/src/Core/Defines.h @@ -61,9 +61,6 @@ /// Name suffix for the column containing the array offsets. #define ARRAY_SIZES_COLUMN_NAME_SUFFIX ".size" -#define DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES 50264 -#define DBMS_MIN_REVISION_WITH_TOTAL_ROWS_IN_PROGRESS 51554 -#define DBMS_MIN_REVISION_WITH_BLOCK_INFO 51903 #define DBMS_MIN_REVISION_WITH_CLIENT_INFO 54032 #define DBMS_MIN_REVISION_WITH_SERVER_TIMEZONE 54058 #define DBMS_MIN_REVISION_WITH_QUOTA_KEY_IN_CLIENT_INFO 54060 diff --git a/dbms/src/Core/Progress.cpp b/dbms/src/Core/Progress.cpp index c96038ba290..540be33f6f1 100644 --- a/dbms/src/Core/Progress.cpp +++ b/dbms/src/Core/Progress.cpp @@ -17,9 +17,7 @@ void Progress::read(ReadBuffer & in, UInt64 server_revision) readVarUInt(new_rows, in); readVarUInt(new_bytes, in); - - if (server_revision >= DBMS_MIN_REVISION_WITH_TOTAL_ROWS_IN_PROGRESS) - readVarUInt(new_total_rows, in); + readVarUInt(new_total_rows, in); rows = new_rows; bytes = new_bytes; @@ -31,9 +29,7 @@ void Progress::write(WriteBuffer & out, UInt64 client_revision) const { writeVarUInt(rows.load(), out); writeVarUInt(bytes.load(), out); - - if (client_revision >= DBMS_MIN_REVISION_WITH_TOTAL_ROWS_IN_PROGRESS) - writeVarUInt(total_rows.load(), out); + writeVarUInt(total_rows.load(), out); } diff --git a/dbms/src/DataStreams/NativeBlockInputStream.cpp b/dbms/src/DataStreams/NativeBlockInputStream.cpp index b153cf2bd5f..a65cd6719e5 100644 --- a/dbms/src/DataStreams/NativeBlockInputStream.cpp +++ b/dbms/src/DataStreams/NativeBlockInputStream.cpp @@ -106,7 +106,7 @@ Block NativeBlockInputStream::readImpl() } /// Additional information about the block. - if (server_revision >= DBMS_MIN_REVISION_WITH_BLOCK_INFO) + if (server_revision > 0) res.info.read(istr); /// Dimensions diff --git a/dbms/src/DataStreams/NativeBlockInputStream.h b/dbms/src/DataStreams/NativeBlockInputStream.h index 2efbf7cd3cc..b1df20a782a 100644 --- a/dbms/src/DataStreams/NativeBlockInputStream.h +++ b/dbms/src/DataStreams/NativeBlockInputStream.h @@ -60,8 +60,7 @@ struct IndexForNativeFormat class NativeBlockInputStream : public IProfilingBlockInputStream { public: - /** If a non-zero server_revision is specified, additional block information may be expected and read, - * depending on what is supported for the specified revision. + /** If a non-zero server_revision is specified, additional block information may be expected and read. * * `index` is not required parameter. If set, only parts of columns specified in the index will be read. */ diff --git a/dbms/src/DataStreams/NativeBlockOutputStream.cpp b/dbms/src/DataStreams/NativeBlockOutputStream.cpp index 763ffabb7ee..b9cfc0fbac7 100644 --- a/dbms/src/DataStreams/NativeBlockOutputStream.cpp +++ b/dbms/src/DataStreams/NativeBlockOutputStream.cpp @@ -116,7 +116,7 @@ void NativeBlockOutputStream::writeData(const IDataType & type, const ColumnPtr void NativeBlockOutputStream::write(const Block & block) { /// Additional information about the block. - if (client_revision >= DBMS_MIN_REVISION_WITH_BLOCK_INFO) + if (client_revision > 0) block.info.write(ostr); /// Dimensions diff --git a/dbms/src/DataStreams/NativeBlockOutputStream.h b/dbms/src/DataStreams/NativeBlockOutputStream.h index 16ba2415cc7..d76cb827863 100644 --- a/dbms/src/DataStreams/NativeBlockOutputStream.h +++ b/dbms/src/DataStreams/NativeBlockOutputStream.h @@ -20,8 +20,7 @@ class CompressedWriteBuffer; class NativeBlockOutputStream : public IBlockOutputStream { public: - /** If non-zero client_revision is specified, additional block information can be written, - * depending on what is supported for the specified revision. + /** If non-zero client_revision is specified, additional block information can be written. */ NativeBlockOutputStream( WriteBuffer & ostr_, UInt64 client_revision_ = 0, diff --git a/dbms/src/Server/TCPHandler.cpp b/dbms/src/Server/TCPHandler.cpp index d93d60bd61e..011454a5159 100644 --- a/dbms/src/Server/TCPHandler.cpp +++ b/dbms/src/Server/TCPHandler.cpp @@ -144,8 +144,7 @@ void TCPHandler::runImpl() continue; /// Get blocks of temporary tables - if (client_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - readData(global_settings); + readData(global_settings); /// Reset the input stream, as we received an empty block while receiving external table data. /// So, the stream has been marked as cancelled and we can't read from it anymore. @@ -416,8 +415,7 @@ void TCPHandler::sendTotals() initBlockOutput(); writeVarUInt(Protocol::Server::Totals, *out); - if (client_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - writeStringBinary("", *out); + writeStringBinary("", *out); state.block_out->write(totals); state.maybe_compressed_out->next(); @@ -438,8 +436,7 @@ void TCPHandler::sendExtremes() initBlockOutput(); writeVarUInt(Protocol::Server::Extremes, *out); - if (client_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - writeStringBinary("", *out); + writeStringBinary("", *out); state.block_out->write(extremes); state.maybe_compressed_out->next(); @@ -612,8 +609,7 @@ bool TCPHandler::receiveData() /// The name of the temporary table for writing data, default to empty string String external_table_name; - if (client_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - readStringBinary(external_table_name, *in); + readStringBinary(external_table_name, *in); /// Read one block from the network and write it down Block block = state.block_in->read(); @@ -717,8 +713,7 @@ void TCPHandler::sendData(Block & block) initBlockOutput(); writeVarUInt(Protocol::Server::Data, *out); - if (client_revision >= DBMS_MIN_REVISION_WITH_TEMPORARY_TABLES) - writeStringBinary("", *out); + writeStringBinary("", *out); state.block_out->write(block); state.maybe_compressed_out->next(); From 175cd99288eec3254cce772c6752133cc8c83a7a Mon Sep 17 00:00:00 2001 From: proller Date: Thu, 17 Aug 2017 00:01:43 +0300 Subject: [PATCH 009/116] Freebsd fixes: fix build with libc++, fix find system lib double-conversion (#1109) * Cmake: Don't detect and use -no-pie flag with clang * Camke: find_unwind: Fix disable on arm * Freebsd fixes: fix build with libc++, fix find system lib double-conversion --- cmake/Modules/Finddouble-conversion.cmake | 4 ++-- .../Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/Finddouble-conversion.cmake b/cmake/Modules/Finddouble-conversion.cmake index 178964b8e2e..cb01be0f25b 100644 --- a/cmake/Modules/Finddouble-conversion.cmake +++ b/cmake/Modules/Finddouble-conversion.cmake @@ -18,7 +18,7 @@ # DOUBLE_CONVERSION_INCLUDE_DIR The location of double-conversion headers find_path(DOUBLE_CONVERSION_ROOT_DIR - NAMES include/double-conversion.h + NAMES include/double-conversion/double-conversion.h ) find_library(DOUBLE_CONVERSION_LIBRARIES @@ -27,7 +27,7 @@ find_library(DOUBLE_CONVERSION_LIBRARIES ) find_path(DOUBLE_CONVERSION_INCLUDE_DIR - NAMES double-conversion.h + NAMES double-conversion/double-conversion.h PATHS ${DOUBLE_CONVERSION_ROOT_DIR}/include ${DOUBLE_CONVERSION_INCLUDE_PATHS} ) diff --git a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp index 11638044935..3283ca1d988 100644 --- a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp +++ b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp @@ -247,7 +247,7 @@ void ReplicatedMergeTreeCleanupThread::getBlocksSortedByTime(zkutil::ZooKeeperPt if (!status.exists) throw zkutil::KeeperException("A block node was suddenly deleted", ZNONODE); - cached_block_stats->emplace(elem.first, status.stat); + cached_block_stats->emplace(elem.first, RequiredStat(status.stat)); timed_blocks.emplace_back(elem.first, RequiredStat(status.stat)); } From 5ba535f05f3496b13a54bd696e2f0fb0e2f0052d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Vavru=C5=A1a?= Date: Wed, 16 Aug 2017 14:58:52 -0700 Subject: [PATCH 010/116] Dictionaries: remove duplicate MySQLDictionarySource.h include refs #1110 --- dbms/src/Dictionaries/DictionarySourceFactory.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/dbms/src/Dictionaries/DictionarySourceFactory.cpp b/dbms/src/Dictionaries/DictionarySourceFactory.cpp index 436f89fa525..a75618dbdac 100644 --- a/dbms/src/Dictionaries/DictionarySourceFactory.cpp +++ b/dbms/src/Dictionaries/DictionarySourceFactory.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include From 4988cb9f036754d50c6a3f6a592ff2d511721325 Mon Sep 17 00:00:00 2001 From: proller Date: Thu, 17 Aug 2017 21:17:17 +0300 Subject: [PATCH 011/116] Issue #1110 : Fix build without installed boost (#1115) --- cmake/print_include_directories.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/print_include_directories.cmake b/cmake/print_include_directories.cmake index ba0bba4c9df..4943f1e2afc 100644 --- a/cmake/print_include_directories.cmake +++ b/cmake/print_include_directories.cmake @@ -7,6 +7,9 @@ list(APPEND dirs ${dirs1}) get_property (dirs1 TARGET common PROPERTY INCLUDE_DIRECTORIES) list(APPEND dirs ${dirs1}) +get_property (dirs1 TARGET ${Boost_PROGRAM_OPTIONS_LIBRARY} PROPERTY INCLUDE_DIRECTORIES) +list(APPEND dirs ${dirs1}) + list(REMOVE_DUPLICATES dirs) file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/include_directories.txt "") foreach (dir ${dirs}) From 9f956d97ddd5175a356c502cfb911978a53bf1dc Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Thu, 17 Aug 2017 21:43:39 +0300 Subject: [PATCH 012/116] Removed debug output [#CLICKHOUSE-2]. --- dbms/src/Interpreters/ExpressionAnalyzer.cpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index 9532f6678ac..e3cafeb0e3e 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -943,12 +943,8 @@ void ExpressionAnalyzer::addASTAliases(ASTPtr & ast, int ignore_levels) ++subquery_index; } - std::cerr << ast->getColumnName() << "\n"; - ast->setAlias(alias); aliases[alias] = ast; - - std::cerr << ast->getAliasOrColumnName() << "\n"; } } @@ -2741,10 +2737,6 @@ void ExpressionAnalyzer::collectUsedColumns() columns_added_by_join.erase(it++); } -/* for (const auto & name_type : columns_added_by_join) - std::cerr << "JOINed column (required, not key): " << name_type.name << std::endl; - std::cerr << std::endl;*/ - /// Insert the columns required for the ARRAY JOIN calculation into the required columns list. NameSet array_join_sources; for (const auto & result_source : array_join_result_to_source) @@ -2840,15 +2832,6 @@ void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAnd joined_columns_name_type.emplace_back(col.name, col.type); } } - -/* for (const auto & name : join_key_names_left) - std::cerr << "JOIN key (left): " << name << std::endl; - for (const auto & name : join_key_names_right) - std::cerr << "JOIN key (right): " << name << std::endl; - std::cerr << std::endl; - for (const auto & name : joined_columns) - std::cerr << "JOINed column: " << name << std::endl; - std::cerr << std::endl;*/ } From 2fa8ee5dd384552b802b9b45585ad31719498f88 Mon Sep 17 00:00:00 2001 From: proller Date: Thu, 17 Aug 2017 19:49:23 +0300 Subject: [PATCH 013/116] Debian: keep debian/changelog commited with actual version. --- .gitignore | 1 - debian/changelog | 5 +++++ release | 8 ++++---- release_lib.sh | 10 ++++++---- 4 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 debian/changelog diff --git a/.gitignore b/.gitignore index a6509c69d76..208b03861e6 100644 --- a/.gitignore +++ b/.gitignore @@ -199,7 +199,6 @@ vgcore* *.changes build-stamp configure-stamp -debian/changelog debian/*.debhelper.log debian/*.debhelper debian/*.substvars diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 00000000000..15bf503f468 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +clickhouse (1.1.54275) unstable; urgency=low + + * Modified source code + + -- proller Thu, 17 Aug 2017 19:33:34 +0300 diff --git a/release b/release index d85357fc185..106f118ad74 100755 --- a/release +++ b/release @@ -10,9 +10,12 @@ source "./release_lib.sh" CONTROL=debian/control CHLOG=debian/changelog CHDATE=$(LC_ALL=C date -R | sed -e 's/,/\\,/g') # Replace comma to '\,' - DEBUILD_NOSIGN_OPTIONS="-us -uc" +if [ -z "$REVISION" ] ; then + get_revision_author +fi + while [[ $1 == --* ]] do if [[ $1 == '--test' ]]; then @@ -35,9 +38,6 @@ do fi done -if [ -z "$REVISION" ] ; then - get_revision_author -fi # Build options if [ -n "$SANITIZER" ] diff --git a/release_lib.sh b/release_lib.sh index abc392d9e1c..52e474cda65 100644 --- a/release_lib.sh +++ b/release_lib.sh @@ -25,7 +25,7 @@ function gen_revision_author { while [ $succeeded -eq 0 ] && [ $attempts -le $max_attempts ]; do attempts=$(($attempts + 1)) REVISION=$(($REVISION + 1)) - git_tag_grep=`git tag | grep "$VERSION_PREFIX$REVISION$VERSION_POSTFIX"` + ( git_tag_grep=`git tag | grep "$VERSION_PREFIX$REVISION$VERSION_POSTFIX"` ) || true if [ "$git_tag_grep" == "" ]; then succeeded=1 fi @@ -36,17 +36,19 @@ function gen_revision_author { fi auto_message="Auto version update to" - git_log_grep=`git log --oneline --max-count=1 | grep "$auto_message"` + ( git_log_grep=`git log --oneline --max-count=1 | grep "$auto_message"` ) || true if [ "$git_log_grep" == "" ]; then tag="$VERSION_PREFIX$REVISION$VERSION_POSTFIX" # First tag for correct git describe echo -e "\nTrying to create tag: $tag" - git tag -a "$tag" -m "$tag" + git tag -a "$tag" -m "$tag" || true git_describe=`git describe` sed -i -- "s/VERSION_REVISION .*)/VERSION_REVISION $REVISION)/g;s/VERSION_DESCRIBE .*)/VERSION_DESCRIBE $git_describe)/g" dbms/cmake/version.cmake - git commit -m "$auto_message [$REVISION]" dbms/cmake/version.cmake + + gen_changelog "$REVISION" "$CHDATE" "$AUTHOR" "$CHLOG" + git commit -m "$auto_message [$REVISION]" dbms/cmake/version.cmake debian/changelog #git push # Second tag for correct version information in version.cmake inside tag From 850bc9f19d894740f13d6d9c089dc05a8e70a697 Mon Sep 17 00:00:00 2001 From: Nikolai Kochetov Date: Thu, 17 Aug 2017 22:36:59 +0300 Subject: [PATCH 014/116] fixed reading const zero column in prewhere --- .../Storages/MergeTree/MergeTreeBaseBlockInputStream.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dbms/src/Storages/MergeTree/MergeTreeBaseBlockInputStream.cpp b/dbms/src/Storages/MergeTree/MergeTreeBaseBlockInputStream.cpp index ad288f0be5c..592a97135da 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeBaseBlockInputStream.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeBaseBlockInputStream.cpp @@ -246,8 +246,11 @@ Block MergeTreeBaseBlockInputStream::readFromPart() if (pre_range_reader) { /// Have to read rows from last partly read granula. - auto & range = ranges_to_read.back(); - task->current_range_reader = reader->readRange(range.begin, range.end); + if (!ranges_to_read.empty()) + { + auto & range = ranges_to_read.back(); + task->current_range_reader = reader->readRange(range.begin, range.end); + } /// But can just skip them. task->number_of_rows_to_skip = rows_was_read_in_last_range; } From f8bf45a5ec90c50a1c1b48c7cb6433f77947c3ae Mon Sep 17 00:00:00 2001 From: Nikolai Kochetov Date: Thu, 17 Aug 2017 22:57:38 +0300 Subject: [PATCH 015/116] added test [#CLICKHOUSE-3237] --- .../0_stateless/00495_reading_const_zero_column.reference | 0 .../queries/0_stateless/00495_reading_const_zero_column.sql | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 dbms/tests/queries/0_stateless/00495_reading_const_zero_column.reference create mode 100644 dbms/tests/queries/0_stateless/00495_reading_const_zero_column.sql diff --git a/dbms/tests/queries/0_stateless/00495_reading_const_zero_column.reference b/dbms/tests/queries/0_stateless/00495_reading_const_zero_column.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/dbms/tests/queries/0_stateless/00495_reading_const_zero_column.sql b/dbms/tests/queries/0_stateless/00495_reading_const_zero_column.sql new file mode 100644 index 00000000000..ad94b9c06b3 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00495_reading_const_zero_column.sql @@ -0,0 +1,5 @@ +drop table if exists one_table; +create table one_table (date Date, one UInt64) engine = MergeTree(date, (date, one), 8192); +insert into one_table select today(), toUInt64(1) from system.numbers limit 100000; +SET preferred_block_size_bytes = 8192; +select isNull(one) from one_table where isNull(one); From f28d0cff3c428179300453261ee883bfe2a57425 Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Thu, 17 Aug 2017 13:28:57 +0300 Subject: [PATCH 016/116] Add more detailed exception message. [#CLICKHOUSE-3234] --- dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp b/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp index c628a70179d..22f871e9c13 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeDataPart.cpp @@ -324,9 +324,7 @@ String MergeTreeDataPart::getColumnNameWithMinumumCompressedSize() const } if (!minimum_size_column) - throw Exception{ - "Could not find a column of minimum size in MergeTree", - ErrorCodes::LOGICAL_ERROR}; + throw Exception("Could not find a column of minimum size in MergeTree, part " + getFullPath(), ErrorCodes::LOGICAL_ERROR); return *minimum_size_column; } From 1a68a17a06779f72cc21256daf35168344f32e1c Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Thu, 17 Aug 2017 22:22:56 +0300 Subject: [PATCH 017/116] Avoid infinite loop in DDLWorker if ZooKeeper dies. [#CLICKHOUSE-2] --- dbms/src/Interpreters/DDLWorker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/Interpreters/DDLWorker.cpp b/dbms/src/Interpreters/DDLWorker.cpp index d77e1f275d5..0618626632e 100644 --- a/dbms/src/Interpreters/DDLWorker.cpp +++ b/dbms/src/Interpreters/DDLWorker.cpp @@ -862,7 +862,7 @@ void DDLWorker::run() tryLogCurrentException(log, "Terminating. Cannot initialize DDL queue."); return; } - } while (!initialized); + } while (!initialized && !stop_flag); while (!stop_flag) { From 97699eeea2ad5495bd9c15de6f2d0db1c49a13b4 Mon Sep 17 00:00:00 2001 From: proller Date: Fri, 18 Aug 2017 01:51:12 +0300 Subject: [PATCH 018/116] Auto version update to [54278] --- dbms/cmake/version.cmake | 4 ++-- debian/changelog | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dbms/cmake/version.cmake b/dbms/cmake/version.cmake index 4c3c9c34107..539abf6643d 100644 --- a/dbms/cmake/version.cmake +++ b/dbms/cmake/version.cmake @@ -1,6 +1,6 @@ # This strings autochanged from release_lib.sh: -set(VERSION_DESCRIBE v1.1.54275-testing) -set(VERSION_REVISION 54275) +set(VERSION_DESCRIBE v1.1.54278-testing) +set(VERSION_REVISION 54278) # end of autochange set (VERSION_MAJOR 1) diff --git a/debian/changelog b/debian/changelog index 15bf503f468..cf6a8a8ae96 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -clickhouse (1.1.54275) unstable; urgency=low +clickhouse (1.1.54278) unstable; urgency=low * Modified source code - -- proller Thu, 17 Aug 2017 19:33:34 +0300 + -- proller Fri, 18 Aug 2017 01:51:11 +0300 From 44f669c1ca26d751ba07b10dad94e1ac5698ea38 Mon Sep 17 00:00:00 2001 From: proller Date: Fri, 18 Aug 2017 02:02:51 +0300 Subject: [PATCH 019/116] Cmake: fix USE_INTERNAL_BOOST_LIBRARY=0 --- cmake/print_include_directories.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/print_include_directories.cmake b/cmake/print_include_directories.cmake index 4943f1e2afc..83b8064d262 100644 --- a/cmake/print_include_directories.cmake +++ b/cmake/print_include_directories.cmake @@ -7,8 +7,10 @@ list(APPEND dirs ${dirs1}) get_property (dirs1 TARGET common PROPERTY INCLUDE_DIRECTORIES) list(APPEND dirs ${dirs1}) -get_property (dirs1 TARGET ${Boost_PROGRAM_OPTIONS_LIBRARY} PROPERTY INCLUDE_DIRECTORIES) -list(APPEND dirs ${dirs1}) +if (USE_INTERNAL_BOOST_LIBRARY) + get_property (dirs1 TARGET ${Boost_PROGRAM_OPTIONS_LIBRARY} PROPERTY INCLUDE_DIRECTORIES) + list(APPEND dirs ${dirs1}) +endif () list(REMOVE_DUPLICATES dirs) file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/include_directories.txt "") From c720524078471244a940265d34f73727718f932b Mon Sep 17 00:00:00 2001 From: proller Date: Fri, 18 Aug 2017 02:03:15 +0300 Subject: [PATCH 020/116] Auto version update to [54279] --- dbms/cmake/version.cmake | 4 ++-- debian/changelog | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dbms/cmake/version.cmake b/dbms/cmake/version.cmake index 539abf6643d..74238ed1ac9 100644 --- a/dbms/cmake/version.cmake +++ b/dbms/cmake/version.cmake @@ -1,6 +1,6 @@ # This strings autochanged from release_lib.sh: -set(VERSION_DESCRIBE v1.1.54278-testing) -set(VERSION_REVISION 54278) +set(VERSION_DESCRIBE v1.1.54279-testing) +set(VERSION_REVISION 54279) # end of autochange set (VERSION_MAJOR 1) diff --git a/debian/changelog b/debian/changelog index cf6a8a8ae96..a81932ef4ce 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -clickhouse (1.1.54278) unstable; urgency=low +clickhouse (1.1.54279) unstable; urgency=low * Modified source code - -- proller Fri, 18 Aug 2017 01:51:11 +0300 + -- proller Fri, 18 Aug 2017 02:03:13 +0300 From 4687a2730d2159f1c70371ea6562ae938fca731e Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 18 Aug 2017 04:00:13 +0300 Subject: [PATCH 021/116] Allow to override umask in config [#CLICKHOUSE-2]. --- dbms/src/Server/config.xml | 5 +++++ libs/libdaemon/include/daemon/BaseDaemon.h | 2 +- libs/libdaemon/src/BaseDaemon.cpp | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dbms/src/Server/config.xml b/dbms/src/Server/config.xml index baf563c0a2c..e4706f3b7f1 100644 --- a/dbms/src/Server/config.xml +++ b/dbms/src/Server/config.xml @@ -114,6 +114,11 @@ --> + + + diff --git a/libs/libdaemon/include/daemon/BaseDaemon.h b/libs/libdaemon/include/daemon/BaseDaemon.h index 33a6889d610..c29261930ed 100644 --- a/libs/libdaemon/include/daemon/BaseDaemon.h +++ b/libs/libdaemon/include/daemon/BaseDaemon.h @@ -67,7 +67,7 @@ public: void buildLoggers(); /// Определяет параметр командной строки - void defineOptions(Poco::Util::OptionSet& _options) override; + void defineOptions(Poco::Util::OptionSet & _options) override; /// Заставляет демон завершаться, если хотя бы одна задача завершилась неудачно void exitOnTaskError(); diff --git a/libs/libdaemon/src/BaseDaemon.cpp b/libs/libdaemon/src/BaseDaemon.cpp index eb2ec6bdab8..e64d9236396 100644 --- a/libs/libdaemon/src/BaseDaemon.cpp +++ b/libs/libdaemon/src/BaseDaemon.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -691,7 +692,7 @@ std::string BaseDaemon::getDefaultCorePath() const return "/opt/cores/"; } -void BaseDaemon::initialize(Application& self) +void BaseDaemon::initialize(Application & self) { task_manager.reset(new Poco::TaskManager); ServerApplication::initialize(self); @@ -740,6 +741,18 @@ void BaseDaemon::initialize(Application& self) tzset(); } + /// This must be done before creation of any files (including logs). + if (config().has("umask")) + { + std::string umask_str = config().getString("umask"); + mode_t umask_num = 0; + std::stringstream stream; + stream << umask_str; + stream >> std::oct >> umask_num; + + umask(umask_num); + } + std::string log_path = config().getString("logger.log", ""); if (!log_path.empty()) log_path = Poco::Path(log_path).setFileName("").toString(); From 5908f17962391c788419096bee34ec76211497dd Mon Sep 17 00:00:00 2001 From: proller Date: Fri, 18 Aug 2017 04:32:52 +0300 Subject: [PATCH 022/116] Fix release script --- release | 3 +-- release_lib.sh | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/release b/release index 106f118ad74..8ee0d132211 100755 --- a/release +++ b/release @@ -8,7 +8,6 @@ cd $CURDIR source "./release_lib.sh" CONTROL=debian/control -CHLOG=debian/changelog CHDATE=$(LC_ALL=C date -R | sed -e 's/,/\\,/g') # Replace comma to '\,' DEBUILD_NOSIGN_OPTIONS="-us -uc" @@ -65,7 +64,7 @@ CMAKE_FLAGS_ADD+=" $LIBTCMALLOC_OPTS -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" REVISION+=$VERSION_POSTFIX echo -e "\nCurrent revision is $REVISION" -gen_changelog "$REVISION" "$CHDATE" "$AUTHOR" "$CHLOG" +gen_changelog "$REVISION" "$CHDATE" "$AUTHOR" "" # Build (only binary packages). debuild -e PATH -e SSH_AUTH_SOCK -e DEB_BUILD_OPTIONS=parallel=$THREAD_COUNT -e DEB_CC -e DEB_CXX -e DEB_CLANG -e CMAKE_FLAGS_ADD="$CMAKE_FLAGS_ADD" -b ${DEBUILD_NOSIGN_OPTIONS} ${DEBUILD_NODEPS_OPTIONS} diff --git a/release_lib.sh b/release_lib.sh index 52e474cda65..f5ddadb738f 100644 --- a/release_lib.sh +++ b/release_lib.sh @@ -47,7 +47,7 @@ function gen_revision_author { git_describe=`git describe` sed -i -- "s/VERSION_REVISION .*)/VERSION_REVISION $REVISION)/g;s/VERSION_DESCRIBE .*)/VERSION_DESCRIBE $git_describe)/g" dbms/cmake/version.cmake - gen_changelog "$REVISION" "$CHDATE" "$AUTHOR" "$CHLOG" + gen_changelog "$REVISION" "$CHDATE" "$AUTHOR" "" git commit -m "$auto_message [$REVISION]" dbms/cmake/version.cmake debian/changelog #git push @@ -92,6 +92,9 @@ function gen_changelog { CHDATE="$2" AUTHOR="$3" CHLOG="$4" + if [ -z "$CHLOG" ] ; then + CHLOG=debian/changelog + fi sed \ -e "s/[@]REVISION[@]/$REVISION/g" \ From 7b6fa26151bbde91e39760121f3494f9a14325af Mon Sep 17 00:00:00 2001 From: robot-metrika-test Date: Fri, 18 Aug 2017 04:35:46 +0300 Subject: [PATCH 023/116] Auto version update to [54280] --- dbms/cmake/version.cmake | 4 ++-- debian/changelog | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dbms/cmake/version.cmake b/dbms/cmake/version.cmake index 74238ed1ac9..2438e4e2597 100644 --- a/dbms/cmake/version.cmake +++ b/dbms/cmake/version.cmake @@ -1,6 +1,6 @@ # This strings autochanged from release_lib.sh: -set(VERSION_DESCRIBE v1.1.54279-testing) -set(VERSION_REVISION 54279) +set(VERSION_DESCRIBE v1.1.54280-testing) +set(VERSION_REVISION 54280) # end of autochange set (VERSION_MAJOR 1) diff --git a/debian/changelog b/debian/changelog index a81932ef4ce..dafd0ceef12 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -clickhouse (1.1.54279) unstable; urgency=low +clickhouse (1.1.54280) unstable; urgency=low * Modified source code - -- proller Fri, 18 Aug 2017 02:03:13 +0300 + -- From e545777187f5d2d2bca858268a43b20aab903e03 Mon Sep 17 00:00:00 2001 From: Alexey Zatelepin Date: Fri, 18 Aug 2017 15:38:43 +0300 Subject: [PATCH 024/116] fix PoolWithFailoverBase::TryResult initialization --- dbms/src/Common/PoolWithFailoverBase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/Common/PoolWithFailoverBase.h b/dbms/src/Common/PoolWithFailoverBase.h index 47ad7a7374a..6d436051685 100644 --- a/dbms/src/Common/PoolWithFailoverBase.h +++ b/dbms/src/Common/PoolWithFailoverBase.h @@ -71,7 +71,7 @@ public: TryResult() = default; explicit TryResult(Entry entry_) - : entry(std::move(entry)) + : entry(std::move(entry_)) , is_usable(true) , is_up_to_date(true) { From b29fea530107638bf8ff45f8565af225e43d16b7 Mon Sep 17 00:00:00 2001 From: proller Date: Fri, 18 Aug 2017 16:25:14 +0300 Subject: [PATCH 025/116] release script: fix autogenerating date on --version call. clean unused. --- debian/changelog | 2 +- release | 3 +-- release_lib.sh | 44 +++++++++++++------------------------------- 3 files changed, 15 insertions(+), 34 deletions(-) diff --git a/debian/changelog b/debian/changelog index dafd0ceef12..44d45811d3a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,4 +2,4 @@ clickhouse (1.1.54280) unstable; urgency=low * Modified source code - -- + -- proller Fri, 18 Aug 2017 16:18:33 +0300 diff --git a/release b/release index 8ee0d132211..9e9d200499f 100755 --- a/release +++ b/release @@ -8,7 +8,6 @@ cd $CURDIR source "./release_lib.sh" CONTROL=debian/control -CHDATE=$(LC_ALL=C date -R | sed -e 's/,/\\,/g') # Replace comma to '\,' DEBUILD_NOSIGN_OPTIONS="-us -uc" if [ -z "$REVISION" ] ; then @@ -64,7 +63,7 @@ CMAKE_FLAGS_ADD+=" $LIBTCMALLOC_OPTS -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" REVISION+=$VERSION_POSTFIX echo -e "\nCurrent revision is $REVISION" -gen_changelog "$REVISION" "$CHDATE" "$AUTHOR" "" +gen_changelog "$REVISION" "" "$AUTHOR" "" # Build (only binary packages). debuild -e PATH -e SSH_AUTH_SOCK -e DEB_BUILD_OPTIONS=parallel=$THREAD_COUNT -e DEB_CC -e DEB_CXX -e DEB_CLANG -e CMAKE_FLAGS_ADD="$CMAKE_FLAGS_ADD" -b ${DEBUILD_NOSIGN_OPTIONS} ${DEBUILD_NODEPS_OPTIONS} diff --git a/release_lib.sh b/release_lib.sh index f5ddadb738f..e1729f4412e 100644 --- a/release_lib.sh +++ b/release_lib.sh @@ -3,9 +3,9 @@ function get_revision { grep "set(VERSION_REVISION" ${BASEDIR}/dbms/cmake/version.cmake | sed 's/^.*VERSION_REVISION \(.*\))$/\1/' } -# remove me after fixing all testing-building scripts -function make_control { - true +function get_author { + AUTHOR=$(git config --get user.name || echo ${USER}) + echo $AUTHOR } # Generate revision number. @@ -47,7 +47,7 @@ function gen_revision_author { git_describe=`git describe` sed -i -- "s/VERSION_REVISION .*)/VERSION_REVISION $REVISION)/g;s/VERSION_DESCRIBE .*)/VERSION_DESCRIBE $git_describe)/g" dbms/cmake/version.cmake - gen_changelog "$REVISION" "$CHDATE" "$AUTHOR" "" + gen_changelog "$REVISION" "" "$AUTHOR" "" git commit -m "$auto_message [$REVISION]" dbms/cmake/version.cmake debian/changelog #git push @@ -78,7 +78,7 @@ function gen_revision_author { function get_revision_author { REVISION=$(get_revision) - AUTHOR=$(git config --get user.name || echo ${USER}) + AUTHOR=$(get_author) export REVISION export AUTHOR } @@ -92,10 +92,18 @@ function gen_changelog { CHDATE="$2" AUTHOR="$3" CHLOG="$4" + if [ -z "REVISION" ] ; then + get_revision_author + fi + if [ -z "$CHLOG" ] ; then CHLOG=debian/changelog fi + if [ -z "$CHDATE" ] ; then + CHDATE=$(LC_ALL=C date -R | sed -e 's/,/\\,/g') # Replace comma to '\,' + fi + sed \ -e "s/[@]REVISION[@]/$REVISION/g" \ -e "s/[@]DATE[@]/$CHDATE/g" \ @@ -103,29 +111,3 @@ function gen_changelog { -e "s/[@]EMAIL[@]/$(whoami)@yandex-team.ru/g" \ < $CHLOG.in > $CHLOG } - -# Upload to Metrica repository -# working directory - where script is itself -function upload_debs { - REVISION="$1" - # Determine the repository, in which you need to upload the packages. It corresponds to the version of Ubuntu. - source /etc/lsb-release - - if [ "$DISTRIB_CODENAME" == "precise" ]; then - REPO="metrika" - elif [ "$DISTRIB_CODENAME" == "trusty" ]; then - REPO="metrika-trusty" - elif [ "$DISTRIB_CODENAME" == "xenial" ]; then - REPO="metrika-xenial" - else - echo -e "\n\e[0;31mUnknown Ubuntu version $DISTRIB_CODENAME \e[0;0m\n" - fi - - # Upload to Metrica repository. - - cd ../ - DUPLOAD_CONF=dupload.conf - cat src/debian/dupload.conf.in | sed -e "s/[@]AUTHOR[@]/$(whoami)/g" > $DUPLOAD_CONF - - dupload metrika-yandex_1.1."$REVISION"_amd64.changes -t $REPO -c --nomail -} From 8726843fcd455b50baf2df54c2ae6ad63fb86d8d Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Fri, 18 Aug 2017 18:29:34 +0300 Subject: [PATCH 026/116] Add russian changelog for 2 recent revisions. [#CLICKHOUSE-2] --- CHANGELOG_RU.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 CHANGELOG_RU.md diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md new file mode 100644 index 00000000000..02dede9642c --- /dev/null +++ b/CHANGELOG_RU.md @@ -0,0 +1,102 @@ +# Релиз ClickHouse 1.1.54276 + +## Новые возможности: +* Добавлена опциональная секция WITH запроса SELECT. Пример запроса: `WITH 1+1 AS a SELECT a, a*a` +* Добавлена возможность синхронной вставки в Distributed таблицу: выдается Ok только после того как все данные записались на все шарды. Активируется настройкой insert_distributed_sync=1 +* Добавлен тип данных UUID для работы с 16-байтовыми идентификаторами +* Добавлены алиасы типов CHAR, FLOAT и т.д. для совместимости с Tableau +* Добавлены функции toYYYYMM, toYYYYMMDD, toYYYYMMDDhhmmss для перевода времени в числа +* Добавлена возможность использовать IP адреса (совместно с hostname) для идентификации сервера при работе с кластерными DDL запросами +* Добавлена поддержка неконстантных аргументов и отрицательных смещений в функции `substring(str, pos, len)` +* Добавлен параметр max_size для агрегатной функции `groupArray(max_size)(column)`, и оптимизирована её производительность + +## Основные изменения: +* Улучшение безопасности: все файлы сервера создаются с правами 0640 +* Улучшены сообщения об ошибках в случае синтаксически неверных запросов +* Значительно уменьшен расход оперативной памяти и улучшена производительность слияний больших MergeTree-кусков данных +* Значительно увеличена производительность слияний данных для движка ReplacingMergeTree +* Улучшена производительность асинхронных вставок из Distributed таблицы за счет объединения нескольких исходных вставок. Функционал включается настройкой distributed_directory_monitor_batch_inserts=1. + +## Обратно несовместимые изменения: +* Изменился бинарный формат агрегатных состояний функции `groupArray(array_column)` для массивов + +## Полный список изменений: +* Добавлен вывод nan и inf значений в формате JSON +* Более оптимальное выделение потоков при чтении из Distributed таблиц +* Разрешено задавать настройки в режиме readonly, если их значение не изменяется +* Добавлена возможность считывать нецелые гранулы движка MergeTree для выполнения ограничений на размер блока, задаваемый настройкой preferred_block_size_bytes - для уменьшения потребления оперативной памяти и увеличения кэш-локальности при обработке запросов из таблиц со столбцами большого размера +* Эффективное использование индекса, содержащего выражения типа `toStartOfHour(x)`, для условий вида `toStartOfHour(x) op сonstexpr` +* Добавлены новые настройки для MergeTree движков (секция merge_tree в config.xml): + - replicated_deduplication_window_seconds позволяет задать интервал дедупликации вставок в Replicated-таблицы в секундах + - cleanup_delay_period - периодичность запуска очистки неактуальных данных + - replicated_can_become_leader - запретить реплике становиться лидером (и назначать мержи) +* Ускорена очистка неактуальных данных из ZooKeeper +* Множественные улучшения и исправления работы кластерных DDL запросов. В частности, добавлена настройка distributed_ddl_task_timeout, ограничивающая время ожидания ответов серверов кластера. +* Улучшено отображение стэктрейсов в логах сервера +* Добавлен метод сжатия none +* Возможность использования нескольких секций dictionaries_config в config.xml +* Возможность подключения к MySQL через сокет на файловой системе +* В таблицу system.parts добавлен столбец с информацией о размере marks в байтах + +Исправления багов: +* Исправлена некорректная работа Distributed таблиц, использующих Merge таблицы, при SELECT с условием на поле _table +* Исправлен редкий race condition в ReplicatedMergeTree при проверке кусков данных +* Исправлено возможное зависание процедуры leader election при старте сервера +* Исправлено игнорирование настройки max_replica_delay_for_distributed_queries при использовании локальной реплики в качестве источника данных +* Исправлено некорректное поведение `ALTER TABLE CLEAR COLUMN IN PARTITION` при попытке очистить несуществующую колонку +* Исправлено исключение в функции multiIf при использовании пустых массивов или строк +* Исправлено чрезмерное выделение памяти при десериализации формата Native +* Исправлено некорректное автообновление Trie словарей +* Исправлено исключение при выполнении запросов с GROUP BY из Merge-таблицы при использовании SAMPLE +* Исправлено падение GROUP BY при использовании настройки distributed_aggregation_memory_efficient=1 +* Добавлена возможность указывать database.table в правой части IN и JOIN +* Исправлено использование слишком большого количества потоков при параллельной агрегации +* Исправлена работа функции if с аргументами FixedString +* Исправлена некорректная работа SELECT из Distributed-таблицы для шардов с весом 0 +* Исправлено падение запроса `CREATE VIEW IF EXISTS` +* Исправлено некорректное поведение при input_format_skip_unknown_fields=1 в случае отрицательных чисел +* Исправлен бесконечный цикл в функции `dictGetHierarchy()` в случае некоторых некорректных данных словаря +Исправлены ошибки типа `Syntax error: unexpected (...)` при выполнении распределенных запросов с подзапросами в секции IN или JOIN, в случае * использования совместно с Merge таблицами +* Исправлена неправильная интерпретация SELECT запроса из таблиц типа Dictionary +* Исправлена ошибка "Cannot mremap" при использовании множеств в секциях IN, JOIN, содержащих более 2 млрд. элементов +* Исправлен failover для словарей с источником MySQL +* Улучшения процесса разработки и сборки ClickHouse: +* Добавлена возмозможность сборки в Arcadia +* Добавлена возможность сборки с помощью gcc 7 +* Ускорена параллельная сборка с помощью ccache+distcc + + +# Релиз ClickHouse 1.1.54245 + +## Новые возможности: +* Распределённые DDL (например, `CREATE TABLE ON CLUSTER`) +* Реплицируемый запрос `ALTER TABLE CLEAR COLUMN IN PARTITION` +* Движок таблиц Dictionary (доступ к данным словаря в виде таблицы) +* Движок баз данных Dictionary (в такой базе автоматически доступны Dictionary-таблицы для всех подключённых внешних словарей) +* Возможность проверки необходимости обновления словаря путём отправки запроса в источник +* Qualified имена столбцов +* Квотирование идентификаторов двойными кавычками +* Сессии в HTTP интерфейсе +* Запрос OPTIMIZE для Replicated таблицы теперь можно выполнять не только на лидере + +## Обратно несовместимые изменения: +* Убрана команда SET GLOBAL + +## Мелкие изменения: +* Теперь после получения сигнала в лог печатается полный стектрейс +* Ослаблена проверка на количество повреждённых/лишних кусков при старте (было слишком много ложных срабатываний) + +## Исправления багов: +* Исправлено залипание плохого соединения при вставке в Distributed таблицу +* GLOBAL IN теперь работает при запросе из таблицы Merge, смотрящей в Distributed +* Теперь правильно определяется количество ядер на виртуалках Google Compute Engine +* Исправления в работе executable источника кэшируемых внешних словарей +* Исправлены сравнения строк, содержащих нулевые символы +* Исправлено сравнение полей первичного ключа типа Float32 с константами +* Раньше неправильная оценка размера поля могла приводить к слишком большим аллокациям +* Исправлено падение при запросе Nullable столбца, добавленного в таблицу ALTER-ом +* Исправлено падение при сортировке по Nullable столбцу, если количество строк меньше LIMIT +* Исправлен ORDER BY подзапроса, состоящего только из константных значений +* Раньше Replicated таблица могла остаться в невалидном состоянии после неудавшегося DROP TABLE +* Алиасы для скалярных подзапросов с пустым результатом теперь не теряются +* Теперь запрос, в котором использовалась компиляция, не завершается ошибкой, если .so файл повреждается From 42910f31f787852dbc069a10110351e540c484c4 Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Fri, 18 Aug 2017 19:29:24 +0300 Subject: [PATCH 027/116] Update CHANGELOG_RU.md --- CHANGELOG_RU.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md index 02dede9642c..28829a72f00 100644 --- a/CHANGELOG_RU.md +++ b/CHANGELOG_RU.md @@ -38,7 +38,7 @@ * Возможность подключения к MySQL через сокет на файловой системе * В таблицу system.parts добавлен столбец с информацией о размере marks в байтах -Исправления багов: +## Исправления багов: * Исправлена некорректная работа Distributed таблиц, использующих Merge таблицы, при SELECT с условием на поле _table * Исправлен редкий race condition в ReplicatedMergeTree при проверке кусков данных * Исправлено возможное зависание процедуры leader election при старте сервера From a04e9a256e20691afcb6cdc1019bb38cae576421 Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Fri, 18 Aug 2017 19:30:31 +0300 Subject: [PATCH 028/116] Update CHANGELOG_RU.md --- CHANGELOG_RU.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md index 28829a72f00..0f08a40a4ba 100644 --- a/CHANGELOG_RU.md +++ b/CHANGELOG_RU.md @@ -60,7 +60,8 @@ * Исправлена неправильная интерпретация SELECT запроса из таблиц типа Dictionary * Исправлена ошибка "Cannot mremap" при использовании множеств в секциях IN, JOIN, содержащих более 2 млрд. элементов * Исправлен failover для словарей с источником MySQL -* Улучшения процесса разработки и сборки ClickHouse: + +## Улучшения процесса разработки и сборки ClickHouse: * Добавлена возмозможность сборки в Arcadia * Добавлена возможность сборки с помощью gcc 7 * Ускорена параллельная сборка с помощью ccache+distcc From f918e224389ec7606cafac64946aaa7ca3146a0d Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 18 Aug 2017 19:36:02 +0300 Subject: [PATCH 029/116] Miscellaneous [#CLICKHOUSE-2]. --- dbms/src/Functions/FunctionFactory.cpp | 1 + dbms/src/Functions/FunctionFactory.h | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/dbms/src/Functions/FunctionFactory.cpp b/dbms/src/Functions/FunctionFactory.cpp index c8819fbbae8..c6fb89eee1b 100644 --- a/dbms/src/Functions/FunctionFactory.cpp +++ b/dbms/src/Functions/FunctionFactory.cpp @@ -9,6 +9,7 @@ namespace DB namespace ErrorCodes { extern const int UNKNOWN_FUNCTION; + extern const int LOGICAL_ERROR; } diff --git a/dbms/src/Functions/FunctionFactory.h b/dbms/src/Functions/FunctionFactory.h index 9702e233a44..fa577674178 100644 --- a/dbms/src/Functions/FunctionFactory.h +++ b/dbms/src/Functions/FunctionFactory.h @@ -16,11 +16,6 @@ class Context; class IFunction; using FunctionPtr = std::shared_ptr; -namespace ErrorCodes -{ - extern const int LOGICAL_ERROR; -} - /** Creates function by name. * Function could use for initialization (take ownership of shared_ptr, for example) From 2e468c143d6ea46569544e589339d74a213ebd85 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 18 Aug 2017 20:05:53 +0300 Subject: [PATCH 030/116] Added convenience comment in config [#CLICKHOUSE-2]. --- dbms/src/Server/config.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dbms/src/Server/config.xml b/dbms/src/Server/config.xml index e4706f3b7f1..dfd3f2433dd 100644 --- a/dbms/src/Server/config.xml +++ b/dbms/src/Server/config.xml @@ -111,6 +111,9 @@ Time zone is specified as identifier from IANA time zone database, like UTC or Africa/Abidjan. If not specified, system time zone at server startup is used. + + Please note, that server could display time zone alias instead of specified name. + Example: W-SU is an alias for Europe/Moscow and Zulu is an alias for UTC. --> From 5f4e8339258f343e559c14c1a87cf3b7ce338c78 Mon Sep 17 00:00:00 2001 From: Vadim Skipin Date: Fri, 18 Aug 2017 20:06:22 +0300 Subject: [PATCH 031/116] Cleanup function factories: * Switch to std::function to allow more complex creator logic * Cleanup headers --- .../AggregateFunctionFactory.cpp | 10 ++-- .../AggregateFunctionFactory.h | 52 ++++++++++++------- dbms/src/Functions/FunctionFactory.cpp | 11 +++- dbms/src/Functions/FunctionFactory.h | 47 ++++++++++------- .../TableFunctions/TableFunctionFactory.cpp | 14 ++++- .../src/TableFunctions/TableFunctionFactory.h | 50 ++++++++++-------- 6 files changed, 115 insertions(+), 69 deletions(-) diff --git a/dbms/src/AggregateFunctions/AggregateFunctionFactory.cpp b/dbms/src/AggregateFunctions/AggregateFunctionFactory.cpp index 19a01635065..6a541ff28b4 100644 --- a/dbms/src/AggregateFunctions/AggregateFunctionFactory.cpp +++ b/dbms/src/AggregateFunctions/AggregateFunctionFactory.cpp @@ -1,13 +1,17 @@ #include -#include -#include + #include #include #include +#include +#include +#include + #include -#include #include +#include + namespace DB { diff --git a/dbms/src/AggregateFunctions/AggregateFunctionFactory.h b/dbms/src/AggregateFunctions/AggregateFunctionFactory.h index be44a7a9e87..4e5423396bf 100644 --- a/dbms/src/AggregateFunctions/AggregateFunctionFactory.h +++ b/dbms/src/AggregateFunctions/AggregateFunctionFactory.h @@ -1,14 +1,22 @@ #pragma once -#include #include + #include +#include +#include +#include +#include +#include + namespace DB { +class Context; class IDataType; + using DataTypePtr = std::shared_ptr; using DataTypes = std::vector; @@ -19,22 +27,8 @@ class AggregateFunctionFactory final : public ext::singleton; - public: - - AggregateFunctionPtr get( - const String & name, - const DataTypes & argument_types, - const Array & parameters = {}, - int recursion_level = 0) const; - - AggregateFunctionPtr tryGet(const String & name, const DataTypes & argument_types, const Array & parameters = {}) const; - - bool isAggregateFunctionName(const String & name, int recursion_level = 0) const; + using Creator = std::function; /// For compatibility with SQL, it's possible to specify that certain aggregate function name is case insensitive. enum CaseSensitiveness @@ -43,11 +37,29 @@ public: CaseInsensitive }; - /// Register an aggregate function by its name. - void registerFunction(const String & name, Creator creator, CaseSensitiveness case_sensitiveness = CaseSensitive); + /// Register a function by its name. + /// No locking, you must register all functions before usage of get. + void registerFunction( + const String & name, + Creator creator, + CaseSensitiveness case_sensitiveness = CaseSensitive); + + /// Throws an exception if not found. + AggregateFunctionPtr get( + const String & name, + const DataTypes & argument_types, + const Array & parameters = {}, + int recursion_level = 0) const; + + /// Returns nullptr if not found. + AggregateFunctionPtr tryGet( + const String & name, + const DataTypes & argument_types, + const Array & parameters = {}) const; + + bool isAggregateFunctionName(const String & name, int recursion_level = 0) const; private: - AggregateFunctionPtr getImpl( const String & name, const DataTypes & argument_types, @@ -55,6 +67,8 @@ private: int recursion_level) const; private: + using AggregateFunctions = std::unordered_map; + AggregateFunctions aggregate_functions; /// Case insensitive aggregate functions will be additionally added here with lowercased name. diff --git a/dbms/src/Functions/FunctionFactory.cpp b/dbms/src/Functions/FunctionFactory.cpp index c6fb89eee1b..4b681b29263 100644 --- a/dbms/src/Functions/FunctionFactory.cpp +++ b/dbms/src/Functions/FunctionFactory.cpp @@ -1,7 +1,11 @@ -#include #include + +#include + #include +#include + namespace DB { @@ -13,7 +17,10 @@ namespace ErrorCodes } -void FunctionFactory::registerFunction(const String & name, Creator creator, CaseSensitiveness case_sensitiveness) +void FunctionFactory::registerFunction(const + std::string & name, + Creator creator, + CaseSensitiveness case_sensitiveness) { if (!functions.emplace(name, creator).second) throw Exception("FunctionFactory: the function name '" + name + "' is not unique", diff --git a/dbms/src/Functions/FunctionFactory.h b/dbms/src/Functions/FunctionFactory.h index fa577674178..3f4693080a1 100644 --- a/dbms/src/Functions/FunctionFactory.h +++ b/dbms/src/Functions/FunctionFactory.h @@ -1,20 +1,19 @@ #pragma once -#include -#include -#include +#include + #include -#include -#include +#include +#include +#include +#include namespace DB { class Context; -class IFunction; -using FunctionPtr = std::shared_ptr; /** Creates function by name. @@ -25,12 +24,8 @@ class FunctionFactory : public ext::singleton { friend class StorageSystemFunctions; -private: - using Creator = FunctionPtr(*)(const Context & context); /// Not std::function, for lower object size and less indirection. - using Functions = std::unordered_map; - - Functions functions; - Functions case_insensitive_functions; +public: + using Creator = std::function; /// For compatibility with SQL, it's possible to specify that certain function name is case insensitive. enum CaseSensitiveness @@ -39,18 +34,30 @@ private: CaseInsensitive }; -public: - FunctionPtr get(const String & name, const Context & context) const; /// Throws an exception if not found. - FunctionPtr tryGet(const String & name, const Context & context) const; /// Returns nullptr if not found. - - /// No locking, you must register all functions before usage of get, tryGet. - void registerFunction(const String & name, Creator creator, CaseSensitiveness case_sensitiveness = CaseSensitive); + /// Register a function by its name. + /// No locking, you must register all functions before usage of get. + void registerFunction( + const std::string & name, + Creator creator, + CaseSensitiveness case_sensitiveness = CaseSensitive); template void registerFunction() { - registerFunction(String(Function::name), &Function::create); + registerFunction(Function::name, &Function::create); } + + /// Throws an exception if not found. + FunctionPtr get(const std::string & name, const Context & context) const; + + /// Returns nullptr if not found. + FunctionPtr tryGet(const std::string & name, const Context & context) const; + +private: + using Functions = std::unordered_map; + + Functions functions; + Functions case_insensitive_functions; }; } diff --git a/dbms/src/TableFunctions/TableFunctionFactory.cpp b/dbms/src/TableFunctions/TableFunctionFactory.cpp index 267c3c202a2..a3355fd32e9 100644 --- a/dbms/src/TableFunctions/TableFunctionFactory.cpp +++ b/dbms/src/TableFunctions/TableFunctionFactory.cpp @@ -1,7 +1,8 @@ -#include +#include + #include -#include +#include namespace DB @@ -11,9 +12,17 @@ namespace ErrorCodes { extern const int READONLY; extern const int UNKNOWN_FUNCTION; + extern const int LOGICAL_ERROR; } +void TableFunctionFactory::registerFunction(const std::string & name, Creator creator) +{ + if (!functions.emplace(name, std::move(creator)).second) + throw Exception("TableFunctionFactory: the table function name '" + name + "' is not unique", + ErrorCodes::LOGICAL_ERROR); +} + TableFunctionPtr TableFunctionFactory::get( const std::string & name, const Context & context) const @@ -24,6 +33,7 @@ TableFunctionPtr TableFunctionFactory::get( auto it = functions.find(name); if (it == functions.end()) throw Exception("Unknown table function " + name, ErrorCodes::UNKNOWN_FUNCTION); + return it->second(); } diff --git a/dbms/src/TableFunctions/TableFunctionFactory.h b/dbms/src/TableFunctions/TableFunctionFactory.h index fd58b9e625e..de782630386 100644 --- a/dbms/src/TableFunctions/TableFunctionFactory.h +++ b/dbms/src/TableFunctions/TableFunctionFactory.h @@ -1,46 +1,50 @@ #pragma once -#include -#include -#include -#include #include +#include + +#include +#include +#include +#include + namespace DB { -namespace ErrorCodes -{ - extern const int LOGICAL_ERROR; -} +class Context; /** Lets you get a table function by its name. */ -class TableFunctionFactory : public ext::singleton +class TableFunctionFactory final: public ext::singleton { -private: - /// No std::function, for smaller object size and less indirection. - using Creator = TableFunctionPtr(*)(); - using TableFunctions = std::unordered_map; - - TableFunctions functions; - public: - TableFunctionPtr get( - const String & name, - const Context & context) const; + using Creator = std::function; - /// Register a table function by its name. + /// Register a function by its name. /// No locking, you must register all functions before usage of get. + void registerFunction(const std::string & name, Creator creator); + template void registerFunction() { - if (!functions.emplace(std::string(Function::name), []{ return TableFunctionPtr(std::make_unique()); }).second) - throw Exception("TableFunctionFactory: the table function name '" + String(Function::name) + "' is not unique", - ErrorCodes::LOGICAL_ERROR); + auto creator = [] () -> TableFunctionPtr { + return std::make_shared(); + }; + registerFunction(Function::name, std::move(creator)); } + + /// Throws an exception if not found. + TableFunctionPtr get( + const std::string & name, + const Context & context) const; + +private: + using TableFunctions = std::unordered_map; + + TableFunctions functions; }; } From 434a7d8f3823770368f951d8ac16dd48fe6dcfa5 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 18 Aug 2017 21:45:02 +0300 Subject: [PATCH 032/116] Fixed function "substring" with out-of-bound negative offset argument [#CLICKHOUSE-2]. --- dbms/src/Functions/GatherUtils.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/dbms/src/Functions/GatherUtils.h b/dbms/src/Functions/GatherUtils.h index d0f90733c95..48d8a3112c5 100644 --- a/dbms/src/Functions/GatherUtils.h +++ b/dbms/src/Functions/GatherUtils.h @@ -107,16 +107,16 @@ struct NumericArraySource Slice getSliceFromRight(size_t offset) const { size_t elem_size = offsets[row_num] - prev_offset; - if (offset >= elem_size) - return {&elements[prev_offset], 0}; + if (offset > elem_size) + return {&elements[prev_offset], elem_size}; return {&elements[offsets[row_num] - offset], offset}; } Slice getSliceFromRight(size_t offset, size_t length) const { size_t elem_size = offsets[row_num] - prev_offset; - if (offset >= elem_size) - return {&elements[prev_offset], 0}; + if (offset > elem_size) + return {&elements[prev_offset], elem_size}; return {&elements[offsets[row_num] - offset], std::min(length, offset)}; } }; @@ -246,16 +246,16 @@ struct StringSource Slice getSliceFromRight(size_t offset) const { size_t elem_size = offsets[row_num] - prev_offset - 1; - if (offset >= elem_size) - return {&elements[prev_offset], 0}; + if (offset > elem_size) + return {&elements[prev_offset], elem_size}; return {&elements[prev_offset + elem_size - offset], offset}; } Slice getSliceFromRight(size_t offset, size_t length) const { size_t elem_size = offsets[row_num] - prev_offset - 1; - if (offset >= elem_size) - return {&elements[prev_offset], 0}; + if (offset > elem_size) + return {&elements[prev_offset], elem_size}; return {&elements[prev_offset + elem_size - offset], std::min(length, offset)}; } }; @@ -321,15 +321,15 @@ struct FixedStringSource Slice getSliceFromRight(size_t offset) const { - if (offset >= string_size) - return {pos, 0}; + if (offset > string_size) + return {pos, string_size}; return {pos + string_size - offset, offset}; } Slice getSliceFromRight(size_t offset, size_t length) const { - if (offset >= string_size) - return {pos, 0}; + if (offset > string_size) + return {pos, string_size}; return {pos + string_size - offset, std::min(length, offset)}; } }; @@ -560,16 +560,16 @@ struct GenericArraySource Slice getSliceFromRight(size_t offset) const { size_t elem_size = offsets[row_num] - prev_offset; - if (offset >= elem_size) - return {&elements, prev_offset, 0}; + if (offset > elem_size) + return {&elements, prev_offset, elem_size}; return {&elements, offsets[row_num] - offset, offset}; } Slice getSliceFromRight(size_t offset, size_t length) const { size_t elem_size = offsets[row_num] - prev_offset; - if (offset >= elem_size) - return {&elements, prev_offset, 0}; + if (offset > elem_size) + return {&elements, prev_offset, elem_size}; return {&elements, offsets[row_num] - offset, std::min(length, offset)}; } }; From 304ccf29b2c0fbb4773622bd67ab88dbcd975711 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 18 Aug 2017 22:02:50 +0300 Subject: [PATCH 033/116] Fixed error; added test [#CLICKHOUSE-2]. --- dbms/src/Functions/FunctionsString.cpp | 18 ++++++--- .../00496_substring_negative_offset.reference | 40 +++++++++++++++++++ .../00496_substring_negative_offset.sql | 4 ++ 3 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 dbms/tests/queries/0_stateless/00496_substring_negative_offset.reference create mode 100644 dbms/tests/queries/0_stateless/00496_substring_negative_offset.sql diff --git a/dbms/src/Functions/FunctionsString.cpp b/dbms/src/Functions/FunctionsString.cpp index 975f5dc6777..e1cdc8dc6a1 100644 --- a/dbms/src/Functions/FunctionsString.cpp +++ b/dbms/src/Functions/FunctionsString.cpp @@ -871,10 +871,18 @@ public: throw Exception("Third argument provided for function substring could not be negative.", ErrorCodes::ARGUMENT_OUT_OF_BOUND); } - if (const ColumnString * col = checkAndGetColumn(&*column_string)) - executeForSource(column_start, column_length, column_start_const, column_length_const, start_value, length_value, block, result, StringSource(*col)); - else if (const ColumnFixedString * col = checkAndGetColumn(&*column_string)) - executeForSource(column_start, column_length, column_start_const, column_length_const, start_value, length_value, block, result, FixedStringSource(*col)); + if (const ColumnString * col = checkAndGetColumn(column_string.get())) + executeForSource(column_start, column_length, column_start_const, column_length_const, start_value, length_value, + block, result, StringSource(*col)); + else if (const ColumnFixedString * col = checkAndGetColumn(column_string.get())) + executeForSource(column_start, column_length, column_start_const, column_length_const, start_value, length_value, + block, result, FixedStringSource(*col)); + else if (const ColumnConst * col = checkAndGetColumnConst(column_string.get())) + executeForSource(column_start, column_length, column_start_const, column_length_const, start_value, length_value, + block, result, ConstSource(*col)); + else if (const ColumnConst * col = checkAndGetColumnConst(column_string.get())) + executeForSource(column_start, column_length, column_start_const, column_length_const, start_value, length_value, + block, result, ConstSource(*col)); else throw Exception( "Illegal column " + block.getByPosition(arguments[0]).column->getName() + " of first argument of function " + getName(), @@ -945,7 +953,7 @@ public: if (start >= 0x8000000000000000ULL || length >= 0x8000000000000000ULL) throw Exception("Too large values of 2nd or 3rd argument provided for function substring.", ErrorCodes::ARGUMENT_OUT_OF_BOUND); - if (const ColumnString * col = checkAndGetColumn(&*column_string)) + if (const ColumnString * col = checkAndGetColumn(column_string.get())) { std::shared_ptr col_res = std::make_shared(); block.getByPosition(result).column = col_res; diff --git a/dbms/tests/queries/0_stateless/00496_substring_negative_offset.reference b/dbms/tests/queries/0_stateless/00496_substring_negative_offset.reference new file mode 100644 index 00000000000..b592f370dea --- /dev/null +++ b/dbms/tests/queries/0_stateless/00496_substring_negative_offset.reference @@ -0,0 +1,40 @@ +abc +abc +abc +bc +c + +abc +bc +c + +abc +abc +abc +bc +c + +abc +bc +c + +abc +abc +abc +bc +c + +abc +bc +c + +abc +abc +abc +bc +c + +abc +bc +c + diff --git a/dbms/tests/queries/0_stateless/00496_substring_negative_offset.sql b/dbms/tests/queries/0_stateless/00496_substring_negative_offset.sql new file mode 100644 index 00000000000..170af8f79b4 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00496_substring_negative_offset.sql @@ -0,0 +1,4 @@ +SELECT substring('abc', number - 5) FROM system.numbers LIMIT 10; +SELECT substring(materialize('abc'), number - 5) FROM system.numbers LIMIT 10; +SELECT substring(toFixedString('abc', 3), number - 5) FROM system.numbers LIMIT 10; +SELECT substring(materialize(toFixedString('abc', 3)), number - 5) FROM system.numbers LIMIT 10; From d5b9f2127fe7733063bcb0c9b9f50f10111c8c7a Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 18 Aug 2017 22:06:39 +0300 Subject: [PATCH 034/116] Added test result [#CLICKHOUSE-2]. --- .../queries/0_stateless/00488_non_ascii_column_names.reference | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 dbms/tests/queries/0_stateless/00488_non_ascii_column_names.reference diff --git a/dbms/tests/queries/0_stateless/00488_non_ascii_column_names.reference b/dbms/tests/queries/0_stateless/00488_non_ascii_column_names.reference new file mode 100644 index 00000000000..77bcc007aa3 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00488_non_ascii_column_names.reference @@ -0,0 +1,2 @@ +hello +hello world From 12a034478c55a021f6fc5bd7c52b9599e9597593 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 18 Aug 2017 22:30:39 +0300 Subject: [PATCH 035/116] Fixed bad translation [#CLICKHOUSE-2]. --- dbms/src/DataStreams/RemoteBlockInputStream.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/DataStreams/RemoteBlockInputStream.h b/dbms/src/DataStreams/RemoteBlockInputStream.h index e81c4b71db3..0117ac37703 100644 --- a/dbms/src/DataStreams/RemoteBlockInputStream.h +++ b/dbms/src/DataStreams/RemoteBlockInputStream.h @@ -109,7 +109,7 @@ private: Tables external_tables; QueryProcessingStage::Enum stage; - /// Threads for reading from temporary tables and following sending of data + /// Streams for reading from temporary tables and following sending of data /// to remote servers for GLOBAL-subqueries std::vector external_tables_data; std::mutex external_tables_mutex; From 61f65e97a8f43dba2d5365d1d542710dbcf6bf4b Mon Sep 17 00:00:00 2001 From: Vadim Skipin Date: Fri, 18 Aug 2017 22:30:55 +0300 Subject: [PATCH 036/116] Fix typo --- .../evaluateConstantExpression.cpp | 2 +- .../Interpreters/evaluateConstantExpression.h | 2 +- dbms/src/Storages/StorageFactory.cpp | 18 +++++++++--------- dbms/src/TableFunctions/TableFunctionMerge.cpp | 2 +- .../TableFunctions/TableFunctionNumbers.cpp | 2 +- .../src/TableFunctions/TableFunctionRemote.cpp | 4 ++-- .../TableFunctionShardByHash.cpp | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/dbms/src/Interpreters/evaluateConstantExpression.cpp b/dbms/src/Interpreters/evaluateConstantExpression.cpp index 2839e01bb26..24ea8924c38 100644 --- a/dbms/src/Interpreters/evaluateConstantExpression.cpp +++ b/dbms/src/Interpreters/evaluateConstantExpression.cpp @@ -60,7 +60,7 @@ ASTPtr evaluateConstantExpressionAsLiteral(ASTPtr & node, const Context & contex } -ASTPtr evaluateConstantExpressionOrIdentidierAsLiteral(ASTPtr & node, const Context & context) +ASTPtr evaluateConstantExpressionOrIdentifierAsLiteral(ASTPtr & node, const Context & context) { if (const ASTIdentifier * id = typeid_cast(node.get())) return std::make_shared(node->range, Field(id->name)); diff --git a/dbms/src/Interpreters/evaluateConstantExpression.h b/dbms/src/Interpreters/evaluateConstantExpression.h index 52dbed9f83d..ed3befdf02b 100644 --- a/dbms/src/Interpreters/evaluateConstantExpression.h +++ b/dbms/src/Interpreters/evaluateConstantExpression.h @@ -29,6 +29,6 @@ std::shared_ptr evaluateConstantExpressionAsLiteral(std::shared_ptr * Also, if AST is identifier, then return string literal with its name. * Useful in places where some name may be specified as identifier, or as result of a constant expression. */ -std::shared_ptr evaluateConstantExpressionOrIdentidierAsLiteral(std::shared_ptr & node, const Context & context); +std::shared_ptr evaluateConstantExpressionOrIdentifierAsLiteral(std::shared_ptr & node, const Context & context); } diff --git a/dbms/src/Storages/StorageFactory.cpp b/dbms/src/Storages/StorageFactory.cpp index e33e93605c7..adf212a9a59 100644 --- a/dbms/src/Storages/StorageFactory.cpp +++ b/dbms/src/Storages/StorageFactory.cpp @@ -321,7 +321,7 @@ StoragePtr StorageFactory::get( if (args.empty() || args.size() > 2) throw Exception(error_msg, ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[0] = evaluateConstantExpressionOrIdentidierAsLiteral(args[0], local_context); + args[0] = evaluateConstantExpressionOrIdentifierAsLiteral(args[0], local_context); String format_name = static_cast(*args[0]).value.safeGet(); int source_fd = -1; @@ -352,7 +352,7 @@ StoragePtr StorageFactory::get( source_fd = static_cast(literal->value.get()); } - args[1] = evaluateConstantExpressionOrIdentidierAsLiteral(args[1], local_context); + args[1] = evaluateConstantExpressionOrIdentifierAsLiteral(args[1], local_context); source_path = static_cast(*args[1]).value.safeGet(); } @@ -457,7 +457,7 @@ StoragePtr StorageFactory::get( " - name of source database and regexp for table names.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[0] = evaluateConstantExpressionOrIdentidierAsLiteral(args[0], local_context); + args[0] = evaluateConstantExpressionOrIdentifierAsLiteral(args[0], local_context); args[1] = evaluateConstantExpressionAsLiteral(args[1], local_context); String source_database = static_cast(*args[0]).value.safeGet(); @@ -497,8 +497,8 @@ StoragePtr StorageFactory::get( String cluster_name = getClusterName(*args[0]); - args[1] = evaluateConstantExpressionOrIdentidierAsLiteral(args[1], local_context); - args[2] = evaluateConstantExpressionOrIdentidierAsLiteral(args[2], local_context); + args[1] = evaluateConstantExpressionOrIdentifierAsLiteral(args[1], local_context); + args[2] = evaluateConstantExpressionOrIdentifierAsLiteral(args[2], local_context); String remote_database = static_cast(*args[1]).value.safeGet(); String remote_table = static_cast(*args[2]).value.safeGet(); @@ -550,8 +550,8 @@ StoragePtr StorageFactory::get( " destination_database, destination_table, num_buckets, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[0] = evaluateConstantExpressionOrIdentidierAsLiteral(args[0], local_context); - args[1] = evaluateConstantExpressionOrIdentidierAsLiteral(args[1], local_context); + args[0] = evaluateConstantExpressionOrIdentifierAsLiteral(args[0], local_context); + args[1] = evaluateConstantExpressionOrIdentifierAsLiteral(args[1], local_context); String destination_database = static_cast(*args[0]).value.safeGet(); String destination_table = static_cast(*args[1]).value.safeGet(); @@ -598,8 +598,8 @@ StoragePtr StorageFactory::get( throw Exception(error_message_argument_number_mismatch, ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[0] = evaluateConstantExpressionOrIdentidierAsLiteral(args[0], local_context); - args[1] = evaluateConstantExpressionOrIdentidierAsLiteral(args[1], local_context); + args[0] = evaluateConstantExpressionOrIdentifierAsLiteral(args[0], local_context); + args[1] = evaluateConstantExpressionOrIdentifierAsLiteral(args[1], local_context); String destination_database = static_cast(*args[0]).value.safeGet(); String destination_table = static_cast(*args[1]).value.safeGet(); diff --git a/dbms/src/TableFunctions/TableFunctionMerge.cpp b/dbms/src/TableFunctions/TableFunctionMerge.cpp index 2c50759fcde..d6e2c7d4dc7 100644 --- a/dbms/src/TableFunctions/TableFunctionMerge.cpp +++ b/dbms/src/TableFunctions/TableFunctionMerge.cpp @@ -71,7 +71,7 @@ StoragePtr TableFunctionMerge::execute(const ASTPtr & ast_function, const Contex " - name of source database and regexp for table names.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[0] = evaluateConstantExpressionOrIdentidierAsLiteral(args[0], context); + args[0] = evaluateConstantExpressionOrIdentifierAsLiteral(args[0], context); args[1] = evaluateConstantExpressionAsLiteral(args[1], context); String source_database = static_cast(*args[0]).value.safeGet(); diff --git a/dbms/src/TableFunctions/TableFunctionNumbers.cpp b/dbms/src/TableFunctions/TableFunctionNumbers.cpp index 8e2187ec675..ee141f68549 100644 --- a/dbms/src/TableFunctions/TableFunctionNumbers.cpp +++ b/dbms/src/TableFunctions/TableFunctionNumbers.cpp @@ -32,7 +32,7 @@ StoragePtr TableFunctionNumbers::execute(const ASTPtr & ast_function, const Cont throw Exception("Table function 'numbers' requires exactly one argument: amount of numbers.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[0] = evaluateConstantExpressionOrIdentidierAsLiteral(args[0], context); + args[0] = evaluateConstantExpressionOrIdentifierAsLiteral(args[0], context); UInt64 limit = static_cast(*args[0]).value.safeGet(); diff --git a/dbms/src/TableFunctions/TableFunctionRemote.cpp b/dbms/src/TableFunctions/TableFunctionRemote.cpp index 9700ceb6fc2..d1240c93832 100644 --- a/dbms/src/TableFunctions/TableFunctionRemote.cpp +++ b/dbms/src/TableFunctions/TableFunctionRemote.cpp @@ -219,7 +219,7 @@ StoragePtr TableFunctionRemote::execute(const ASTPtr & ast_function, const Conte description = getStringLiteral(*args[arg_num], "Hosts pattern"); ++arg_num; - args[arg_num] = evaluateConstantExpressionOrIdentidierAsLiteral(args[arg_num], context); + args[arg_num] = evaluateConstantExpressionOrIdentifierAsLiteral(args[arg_num], context); remote_database = static_cast(*args[arg_num]).value.safeGet(); ++arg_num; @@ -235,7 +235,7 @@ StoragePtr TableFunctionRemote::execute(const ASTPtr & ast_function, const Conte if (arg_num >= args.size()) throw Exception(err, ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - args[arg_num] = evaluateConstantExpressionOrIdentidierAsLiteral(args[arg_num], context); + args[arg_num] = evaluateConstantExpressionOrIdentifierAsLiteral(args[arg_num], context); remote_table = static_cast(*args[arg_num]).value.safeGet(); ++arg_num; } diff --git a/dbms/src/TableFunctions/TableFunctionShardByHash.cpp b/dbms/src/TableFunctions/TableFunctionShardByHash.cpp index 583990f4cd8..edcda344fe6 100644 --- a/dbms/src/TableFunctions/TableFunctionShardByHash.cpp +++ b/dbms/src/TableFunctions/TableFunctionShardByHash.cpp @@ -57,8 +57,8 @@ StoragePtr TableFunctionShardByHash::execute(const ASTPtr & ast_function, const cluster_name = getClusterName(*args[0]); key = getStringLiteral(*args[1], "Key to hash"); - args[2] = evaluateConstantExpressionOrIdentidierAsLiteral(args[2], context); - args[3] = evaluateConstantExpressionOrIdentidierAsLiteral(args[3], context); + args[2] = evaluateConstantExpressionOrIdentifierAsLiteral(args[2], context); + args[3] = evaluateConstantExpressionOrIdentifierAsLiteral(args[3], context); remote_database = static_cast(*args[2]).value.safeGet(); remote_table = static_cast(*args[3]).value.safeGet(); From e52428ddb2d47fd2caa26aa38452b955ff3d0a8f Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Fri, 18 Aug 2017 23:56:19 +0300 Subject: [PATCH 037/116] Fixed SIGSEGV in CREATE TABLE AS . MV without ENGINE is forbidden! [#CLICKHOUSE-2] Resolves #1112 Resolves #598 --- .../Interpreters/InterpreterCreateQuery.cpp | 16 ++++++++-- dbms/src/Parsers/ParserCreateQuery.cpp | 8 ++--- dbms/src/Storages/StorageMaterializedView.cpp | 30 ++++++++----------- ...insert_without_explicit_database.reference | 4 +++ ...s_and_insert_without_explicit_database.sql | 25 ++++++++++++++++ 5 files changed, 59 insertions(+), 24 deletions(-) diff --git a/dbms/src/Interpreters/InterpreterCreateQuery.cpp b/dbms/src/Interpreters/InterpreterCreateQuery.cpp index b17ba8dd66f..80536a76a15 100644 --- a/dbms/src/Interpreters/InterpreterCreateQuery.cpp +++ b/dbms/src/Interpreters/InterpreterCreateQuery.cpp @@ -445,8 +445,20 @@ String InterpreterCreateQuery::setEngine( String as_database_name = create.as_database.empty() ? context.getCurrentDatabase() : create.as_database; String as_table_name = create.as_table; - storage_name = as_storage->getName(); - create.storage = typeid_cast(*context.getCreateQuery(as_database_name, as_table_name)).storage; + auto as_create_ptr = context.getCreateQuery(as_database_name, as_table_name); + auto & as_create = typeid_cast(*as_create_ptr); + + if (!create.storage) + { + if (as_create.is_view || as_create.is_materialized_view) + create.storage = as_create.inner_storage; + else + create.storage = as_create.storage; + + storage_name = typeid_cast(*create.storage).name; + } + else + storage_name = as_storage->getName(); } else if (create.is_temporary) set_engine("Memory"); diff --git a/dbms/src/Parsers/ParserCreateQuery.cpp b/dbms/src/Parsers/ParserCreateQuery.cpp index f4f939ff01e..25037bd67b9 100644 --- a/dbms/src/Parsers/ParserCreateQuery.cpp +++ b/dbms/src/Parsers/ParserCreateQuery.cpp @@ -323,12 +323,10 @@ bool ParserCreateQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) /// AS SELECT ... if (!s_as.ignore(pos, expected)) return false; - Pos before_select = pos; - if (!s_select.ignore(pos, expected)) - return false; - pos = before_select; + ParserSelectQuery select_p; - select_p.parse(pos, select, expected); + if (!select_p.parse(pos, select, expected)) + return false; } auto query = std::make_shared(StringRange(begin, pos)); diff --git a/dbms/src/Storages/StorageMaterializedView.cpp b/dbms/src/Storages/StorageMaterializedView.cpp index ba861f04a06..08429ed5e5a 100644 --- a/dbms/src/Storages/StorageMaterializedView.cpp +++ b/dbms/src/Storages/StorageMaterializedView.cpp @@ -19,6 +19,7 @@ namespace DB namespace ErrorCodes { extern const int LOGICAL_ERROR; + extern const int INCORRECT_QUERY; } @@ -29,7 +30,7 @@ static void extractDependentTable(const ASTSelectQuery & query, String & select_ if (!query_table) return; - if (const ASTIdentifier * ast_id = typeid_cast(query_table.get())) + if (auto ast_id = typeid_cast(query_table.get())) { auto query_database = query.database(); @@ -41,7 +42,7 @@ static void extractDependentTable(const ASTSelectQuery & query, String & select_ select_database_name = typeid_cast(*query_database).name; select_table_name = ast_id->name; } - else if (const ASTSelectQuery * ast_select = typeid_cast(query_table.get())) + else if (auto ast_select = typeid_cast(query_table.get())) { extractDependentTable(*ast_select, select_database_name, select_table_name); } @@ -66,13 +67,18 @@ StorageMaterializedView::StorageMaterializedView( database_name(database_name_), context(context_), columns(columns_) { ASTCreateQuery & create = typeid_cast(*query_); + + if (!create.select) + throw Exception("SELECT query is not specified for " + getName(), ErrorCodes::INCORRECT_QUERY); + + if (!create.inner_storage) + throw Exception("ENGINE of MaterializedView should be specified explicitly", ErrorCodes::INCORRECT_QUERY); + ASTSelectQuery & select = typeid_cast(*create.select); /// If the internal query does not specify a database, retrieve it from the context and write it to the query. select.setDatabaseIfNeeded(database_name); - inner_query = create.select; - extractDependentTable(select, select_database_name, select_table_name); if (!select_table_name.empty()) @@ -80,7 +86,8 @@ StorageMaterializedView::StorageMaterializedView( DatabaseAndTableName(select_database_name, select_table_name), DatabaseAndTableName(database_name, table_name)); - auto inner_table_name = getInnerTableName(); + String inner_table_name = getInnerTableName(); + inner_query = create.select; /// If there is an ATTACH request, then the internal table must already be connected. if (!attach_) @@ -91,18 +98,7 @@ StorageMaterializedView::StorageMaterializedView( manual_create_query->table = inner_table_name; manual_create_query->columns = create.columns; manual_create_query->children.push_back(manual_create_query->columns); - - /// If you do not specify a storage type in the query, try retrieving it from SELECT query. - if (!create.inner_storage) - { - /// TODO also try to extract `params` to create a table - auto func = std::make_shared(); - func->name = context.getTable(select_database_name, select_table_name)->getName(); - manual_create_query->storage = func; - } - else - manual_create_query->storage = create.inner_storage; - + manual_create_query->storage = create.inner_storage; manual_create_query->children.push_back(manual_create_query->storage); /// Execute the query. diff --git a/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.reference b/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.reference index 8fb767d89d5..37514bc429b 100644 --- a/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.reference +++ b/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.reference @@ -1,2 +1,6 @@ 2014-01-02 0 0 0000-00-00 00:00:00 2014-01-02 03:04:06 1 2014-01-02 03:04:06 +0 +0 +0 +0 diff --git a/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql b/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql index a3f475d2f25..47a7ef07503 100644 --- a/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql +++ b/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql @@ -11,3 +11,28 @@ SELECT * FROM default.test_view; DROP TABLE default.test_table; DROP TABLE default.test_view; + +-- Check only sophisticated constructors and desctructors: + +USE test; +DROP TABLE IF EXISTS tmp; +DROP TABLE IF EXISTS tmp_mv; +DROP TABLE IF EXISTS tmp_mv2; +DROP TABLE IF EXISTS `.inner.tmp_mv`; +DROP TABLE IF EXISTS `.inner.tmp_mv2`; + +CREATE TABLE tmp (date Date, name String) ENGINE = Memory; +CREATE MATERIALIZED VIEW tmp_mv ENGINE = AggregatingMergeTree(date, (date, name), 8192) AS SELECT date, name, countState() AS cc FROM tmp GROUP BY date, name; +CREATE TABLE tmp_mv2 AS tmp_mv; +CREATE TABLE tmp_mv3 AS tmp_mv ENGINE = Memory; +CREATE MATERIALIZED VIEW tmp_mv4 ENGINE = AggregatingMergeTree(date, date, 8192) POPULATE AS SELECT DISTINCT * FROM tmp_mv; + +DROP TABLE tmp_mv; +DROP TABLE tmp_mv2; +DROP TABLE tmp_mv3; +DROP TABLE tmp_mv4; + +EXISTS TABLE `.inner.tmp_mv`; +EXISTS TABLE `.inner.tmp_mv2`; +EXISTS TABLE `.inner.tmp_mv3`; +EXISTS TABLE `.inner.tmp_mv4`; From 1d39b94992c65c7e678dd6e8045c302b5ac0c3ac Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Sat, 19 Aug 2017 00:10:35 +0300 Subject: [PATCH 038/116] Update 00101_materialized_views_and_insert_without_explicit_database.sql --- ...aterialized_views_and_insert_without_explicit_database.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql b/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql index 47a7ef07503..772ac54d830 100644 --- a/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql +++ b/dbms/tests/queries/0_stateless/00101_materialized_views_and_insert_without_explicit_database.sql @@ -18,8 +18,8 @@ USE test; DROP TABLE IF EXISTS tmp; DROP TABLE IF EXISTS tmp_mv; DROP TABLE IF EXISTS tmp_mv2; -DROP TABLE IF EXISTS `.inner.tmp_mv`; -DROP TABLE IF EXISTS `.inner.tmp_mv2`; +DROP TABLE IF EXISTS `.inner.tmp_mv`; +DROP TABLE IF EXISTS `.inner.tmp_mv2`; CREATE TABLE tmp (date Date, name String) ENGINE = Memory; CREATE MATERIALIZED VIEW tmp_mv ENGINE = AggregatingMergeTree(date, (date, name), 8192) AS SELECT date, name, countState() AS cc FROM tmp GROUP BY date, name; From 47c8d89ba0002032a5972d9ba2c4c52c5f4bbcd5 Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Sat, 19 Aug 2017 01:51:36 +0300 Subject: [PATCH 039/116] Update CHANGELOG_RU.md --- CHANGELOG_RU.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md index 0f08a40a4ba..e2100c0f9bc 100644 --- a/CHANGELOG_RU.md +++ b/CHANGELOG_RU.md @@ -15,7 +15,7 @@ * Улучшены сообщения об ошибках в случае синтаксически неверных запросов * Значительно уменьшен расход оперативной памяти и улучшена производительность слияний больших MergeTree-кусков данных * Значительно увеличена производительность слияний данных для движка ReplacingMergeTree -* Улучшена производительность асинхронных вставок из Distributed таблицы за счет объединения нескольких исходных вставок. Функционал включается настройкой distributed_directory_monitor_batch_inserts=1. +* Улучшена производительность асинхронных вставок из Distributed таблицы за счет объединения нескольких исходных вставок. Функциональность включается настройкой distributed_directory_monitor_batch_inserts=1. ## Обратно несовместимые изменения: * Изменился бинарный формат агрегатных состояний функции `groupArray(array_column)` для массивов From 8ee56421aba03ee71c99b26ea4d98e1a65713e5e Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Sat, 19 Aug 2017 01:52:35 +0300 Subject: [PATCH 040/116] Update CHANGELOG_RU.md --- CHANGELOG_RU.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md index e2100c0f9bc..772263efa25 100644 --- a/CHANGELOG_RU.md +++ b/CHANGELOG_RU.md @@ -21,7 +21,7 @@ * Изменился бинарный формат агрегатных состояний функции `groupArray(array_column)` для массивов ## Полный список изменений: -* Добавлен вывод nan и inf значений в формате JSON +* Добавлена настройка `output_format_json_quote_denormals`, включающая вывод nan и inf значений в формате JSON * Более оптимальное выделение потоков при чтении из Distributed таблиц * Разрешено задавать настройки в режиме readonly, если их значение не изменяется * Добавлена возможность считывать нецелые гранулы движка MergeTree для выполнения ограничений на размер блока, задаваемый настройкой preferred_block_size_bytes - для уменьшения потребления оперативной памяти и увеличения кэш-локальности при обработке запросов из таблиц со столбцами большого размера From e25f232b5ac2599e8e310afb1942a65a393fa1f0 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sat, 19 Aug 2017 01:56:19 +0300 Subject: [PATCH 041/116] Raising limit on max size for merge (step 1 of 4) [#CLICKHOUSE-2] --- dbms/src/Storages/MergeTree/MergeTreeSettings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/Storages/MergeTree/MergeTreeSettings.h b/dbms/src/Storages/MergeTree/MergeTreeSettings.h index b922f75870b..5f89b888492 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeSettings.h +++ b/dbms/src/Storages/MergeTree/MergeTreeSettings.h @@ -22,7 +22,7 @@ struct MergeTreeSettings /** Merge settings. */ /// Maximum in total size of parts to merge, when there are maximum (minimum) free threads in background pool (or entries in replication queue). - size_t max_bytes_to_merge_at_max_space_in_pool = 100ULL * 1024 * 1024 * 1024; + size_t max_bytes_to_merge_at_max_space_in_pool = 150ULL * 1024 * 1024 * 1024; size_t max_bytes_to_merge_at_min_space_in_pool = 1024 * 1024; /// How many tasks of merging parts are allowed simultaneously in ReplicatedMergeTree queue. From 1852ec843cac18f0028f4ff22392968439e71255 Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Sat, 19 Aug 2017 01:57:38 +0300 Subject: [PATCH 042/116] Update CHANGELOG_RU.md --- CHANGELOG_RU.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md index 772263efa25..8a66cc18b55 100644 --- a/CHANGELOG_RU.md +++ b/CHANGELOG_RU.md @@ -56,7 +56,7 @@ * Исправлено падение запроса `CREATE VIEW IF EXISTS` * Исправлено некорректное поведение при input_format_skip_unknown_fields=1 в случае отрицательных чисел * Исправлен бесконечный цикл в функции `dictGetHierarchy()` в случае некоторых некорректных данных словаря -Исправлены ошибки типа `Syntax error: unexpected (...)` при выполнении распределенных запросов с подзапросами в секции IN или JOIN, в случае * использования совместно с Merge таблицами +* Исправлены ошибки типа `Syntax error: unexpected (...)` при выполнении распределенных запросов с подзапросами в секции IN или JOIN, в случае * использования совместно с Merge таблицами * Исправлена неправильная интерпретация SELECT запроса из таблиц типа Dictionary * Исправлена ошибка "Cannot mremap" при использовании множеств в секциях IN, JOIN, содержащих более 2 млрд. элементов * Исправлен failover для словарей с источником MySQL From 1307fd4e0566c48ddd9566ce8b444fc4624c07ff Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Sat, 19 Aug 2017 01:58:05 +0300 Subject: [PATCH 043/116] Update CHANGELOG_RU.md --- CHANGELOG_RU.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md index 8a66cc18b55..5bdd899f8db 100644 --- a/CHANGELOG_RU.md +++ b/CHANGELOG_RU.md @@ -56,7 +56,7 @@ * Исправлено падение запроса `CREATE VIEW IF EXISTS` * Исправлено некорректное поведение при input_format_skip_unknown_fields=1 в случае отрицательных чисел * Исправлен бесконечный цикл в функции `dictGetHierarchy()` в случае некоторых некорректных данных словаря -* Исправлены ошибки типа `Syntax error: unexpected (...)` при выполнении распределенных запросов с подзапросами в секции IN или JOIN, в случае * использования совместно с Merge таблицами +* Исправлены ошибки типа `Syntax error: unexpected (...)` при выполнении распределенных запросов с подзапросами в секции IN или JOIN, в случае использования совместно с Merge таблицами * Исправлена неправильная интерпретация SELECT запроса из таблиц типа Dictionary * Исправлена ошибка "Cannot mremap" при использовании множеств в секциях IN, JOIN, содержащих более 2 млрд. элементов * Исправлен failover для словарей с источником MySQL From ce3e4676fab55fab0412ed9bd19c4b98c031aa6b Mon Sep 17 00:00:00 2001 From: Alexey Zatelepin Date: Sat, 19 Aug 2017 21:35:01 +0300 Subject: [PATCH 044/116] remove unnecessary calls to find() [#CLICKHOUSE-2171] --- dbms/src/DataStreams/DistinctBlockInputStream.cpp | 2 +- dbms/src/Interpreters/Set.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbms/src/DataStreams/DistinctBlockInputStream.cpp b/dbms/src/DataStreams/DistinctBlockInputStream.cpp index 21fd85c4098..f27c1ee0f62 100644 --- a/dbms/src/DataStreams/DistinctBlockInputStream.cpp +++ b/dbms/src/DataStreams/DistinctBlockInputStream.cpp @@ -115,7 +115,7 @@ void DistinctBlockInputStream::buildFilter( /// Make a key. typename Method::Key key = state.getKey(columns, columns.size(), i, key_sizes); - typename Method::Data::iterator it = method.data.find(key); + typename Method::Data::iterator it; bool inserted; method.data.emplace(key, it, inserted); diff --git a/dbms/src/Interpreters/Set.cpp b/dbms/src/Interpreters/Set.cpp index 5662886648a..4939e245f71 100644 --- a/dbms/src/Interpreters/Set.cpp +++ b/dbms/src/Interpreters/Set.cpp @@ -83,7 +83,7 @@ void NO_INLINE Set::insertFromBlockImplCase( /// Obtain a key to insert to the set typename Method::Key key = state.getKey(key_columns, keys_size, i, key_sizes); - typename Method::Data::iterator it = method.data.find(key); + typename Method::Data::iterator it; bool inserted; method.data.emplace(key, it, inserted); From 7dc4d6f7b368e69d06ba9361145371f8c6a8bc4b Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 20 Aug 2017 04:05:59 +0300 Subject: [PATCH 045/116] Miscellaneous [#CLICKHOUSE-2]. --- dbms/src/Common/HashTable/HashTable.h | 135 ++++++++++++++------------ 1 file changed, 73 insertions(+), 62 deletions(-) diff --git a/dbms/src/Common/HashTable/HashTable.h b/dbms/src/Common/HashTable/HashTable.h index 5480cedcba5..82e3a647cb2 100644 --- a/dbms/src/Common/HashTable/HashTable.h +++ b/dbms/src/Common/HashTable/HashTable.h @@ -293,6 +293,30 @@ protected: return place_value; } + + template + size_t ALWAYS_INLINE findCellUnrolled(const Key & x, size_t hash_value, size_t place_value) const + { + while (true) + { + size_t places[N]; + for (size_t i = 0; i < N; ++i) + { + places[i] = place_value; + place_value = grower.next(place_value); + } + + for (size_t i = 0; i < N; ++i) + { + const Cell & cell = buf[places[i]]; + + if (cell.isZero(*this) || cell.keyEquals(x, hash_value)) + return places[i]; + } + } + } + + /// Find an empty cell, starting with the specified position and further along the collision resolution chain. size_t ALWAYS_INLINE findEmptyCell(const Key & x, size_t hash_value, size_t place_value) const { @@ -422,6 +446,50 @@ protected: } + template + class iterator_base + { + using Container = typename std::conditional::type; + using cell_type = typename std::conditional::type; + + Container * container; + cell_type * ptr; + + friend class HashTable; + + public: + iterator_base() {} + iterator_base(Container * container_, cell_type * ptr_) : container(container_), ptr(ptr_) {} + + bool operator== (const iterator_base & rhs) const { return ptr == rhs.ptr; } + bool operator!= (const iterator_base & rhs) const { return ptr != rhs.ptr; } + + Derived & operator++() + { + if (unlikely(ptr->isZero(*container))) + ptr = container->buf; + else + ++ptr; + + while (ptr < container->buf + container->grower.bufSize() && ptr->isZero(*container)) + ++ptr; + + return static_cast(*this); + } + + auto & operator* () const { return ptr->getValue(); } + auto operator->() const { return &ptr->getValue(); } + + auto getPtr() const { return ptr; } + size_t getHash() const { return ptr->getHash(*container); } + + size_t getCollisionChainLength() const + { + return container->grower.place((ptr - container->buf) - container->grower.place(getHash())); + } + }; + + public: using key_type = Key; using value_type = typename Cell::value_type; @@ -499,74 +567,17 @@ public: bool is_initialized = false; }; - class iterator + + class iterator : public iterator_base { - Self * container; - Cell * ptr; - - friend class HashTable; - public: - iterator() {} - iterator(Self * container_, Cell * ptr_) : container(container_), ptr(ptr_) {} - - bool operator== (const iterator & rhs) const { return ptr == rhs.ptr; } - bool operator!= (const iterator & rhs) const { return ptr != rhs.ptr; } - - iterator & operator++() - { - if (unlikely(ptr->isZero(*container))) - ptr = container->buf; - else - ++ptr; - - while (ptr < container->buf + container->grower.bufSize() && ptr->isZero(*container)) - ++ptr; - - return *this; - } - - value_type & operator* () const { return ptr->getValue(); } - value_type * operator->() const { return &ptr->getValue(); } - - Cell * getPtr() const { return ptr; } - size_t getHash() const { return ptr->getHash(*container); } + using iterator_base::iterator_base; }; - - class const_iterator + class const_iterator : public iterator_base { - const Self * container; - const Cell * ptr; - - friend class HashTable; - public: - const_iterator() {} - const_iterator(const Self * container_, const Cell * ptr_) : container(container_), ptr(ptr_) {} - const_iterator(const iterator & rhs) : container(rhs.container), ptr(rhs.ptr) {} - - bool operator== (const const_iterator & rhs) const { return ptr == rhs.ptr; } - bool operator!= (const const_iterator & rhs) const { return ptr != rhs.ptr; } - - const_iterator & operator++() - { - if (unlikely(ptr->isZero(*container))) - ptr = container->buf; - else - ++ptr; - - while (ptr < container->buf + container->grower.bufSize() && ptr->isZero(*container)) - ++ptr; - - return *this; - } - - const value_type & operator* () const { return ptr->getValue(); } - const value_type * operator->() const { return &ptr->getValue(); } - - const Cell * getPtr() const { return ptr; } - size_t getHash() const { return ptr->getHash(*container); } + using iterator_base::iterator_base; }; From 2fb7a34f0da2fa88992033a6cc8336fc55847991 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 20 Aug 2017 04:07:11 +0300 Subject: [PATCH 046/116] Miscellaneous [#CLICKHOUSE-2]. --- dbms/src/Common/HashTable/HashTable.h | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/dbms/src/Common/HashTable/HashTable.h b/dbms/src/Common/HashTable/HashTable.h index 82e3a647cb2..52b1f0fab89 100644 --- a/dbms/src/Common/HashTable/HashTable.h +++ b/dbms/src/Common/HashTable/HashTable.h @@ -294,29 +294,6 @@ protected: } - template - size_t ALWAYS_INLINE findCellUnrolled(const Key & x, size_t hash_value, size_t place_value) const - { - while (true) - { - size_t places[N]; - for (size_t i = 0; i < N; ++i) - { - places[i] = place_value; - place_value = grower.next(place_value); - } - - for (size_t i = 0; i < N; ++i) - { - const Cell & cell = buf[places[i]]; - - if (cell.isZero(*this) || cell.keyEquals(x, hash_value)) - return places[i]; - } - } - } - - /// Find an empty cell, starting with the specified position and further along the collision resolution chain. size_t ALWAYS_INLINE findEmptyCell(const Key & x, size_t hash_value, size_t place_value) const { From fc409f61e53646d2e88a57287496b67de546bca2 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 20 Aug 2017 16:12:14 +0300 Subject: [PATCH 047/116] Miscellaneous [#CLICKHOUSE-2]. --- dbms/src/Common/HashTable/HashTable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/Common/HashTable/HashTable.h b/dbms/src/Common/HashTable/HashTable.h index 52b1f0fab89..d62043fbce2 100644 --- a/dbms/src/Common/HashTable/HashTable.h +++ b/dbms/src/Common/HashTable/HashTable.h @@ -455,7 +455,7 @@ protected: } auto & operator* () const { return ptr->getValue(); } - auto operator->() const { return &ptr->getValue(); } + auto * operator->() const { return &ptr->getValue(); } auto getPtr() const { return ptr; } size_t getHash() const { return ptr->getHash(*container); } From 4c0c1ae602f75b046c77d84cd3f431218c245441 Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Mon, 21 Aug 2017 16:24:29 +0300 Subject: [PATCH 048/116] Add a changelog. [#CLICKHOUSE-3] --- CHANGELOG.md | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000000..912718808a6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,112 @@ +# ClickHouse release 1.1.54276 + +## New features: + +* You can use an optional WITH clause in a SELECT query. Example query: `WITH 1+1 AS a SELECT a, a*a` +* INSERT can be performed synchronously in a Distributed table: OK is returned only after all the data is saved on all the shards. This is activated by the setting insert_distributed_sync=1. +* Added the UUID data type for working with 16-byte identifiers. +* Added aliases of CHAR, FLOAT and other types for compatibility with the Tableau. +* Added the functions toYYYYMM, toYYYYMMDD, and toYYYYMMDDhhmmss for converting time into numbers. +* You can use IP addresses (together with the hostname) to identify servers for clustered DDL queries. +* Added support for non-constant arguments and negative offsets in the function `substring(str, pos, len).` +* Added the max_size parameter for the `groupArray(max_size)(column)` aggregate function, and optimized its performance. + +## Major changes: + +* Improved security: all server files are created with 0640 permissions. +* Improved error messages for queries with invalid syntax. +* Significantly reduced memory consumption and improved performance when merging large sections of MergeTree data. +* Significantly increased the performance of data merges for the ReplacingMergeTree engine. +* Improved performance for asynchronous inserts from a Distributed table by batching multiple source inserts. To enable this functionality, use the setting distributed_directory_monitor_batch_inserts=1. + +## Backward incompatible changes: + +* Changed the binary format of aggregate states of `groupArray(array_column)` functions for arrays. + +## Complete list of changes: + +* Added the `output_format_json_quote_denormals` setting, which enables outputting nan and inf values in JSON format. +* Optimized thread allocation when reading from a Distributed table. +* Settings can be modified in readonly mode if the value doesn't change. +* Added the ability to read fractional granules of the MergeTree engine in order to meet restrictions on the block size specified in the preferred_block_size_bytes setting. The purpose is to reduce the consumption of RAM and increase cache locality when processing queries from tables with large columns. +* Efficient use of indexes that contain expressions like `toStartOfHour(x)` for conditions like `toStartOfHour(x) op сonstexpr.` +* Added new settings for MergeTree engines (the merge_tree section in config.xml): + - replicated_deduplication_window_seconds sets the size of deduplication window in seconds for Replicated tables. + - cleanup_delay_period sets how often to start cleanup to remove outdated data. + - replicated_can_become_leader can prevent a replica from becoming the leader (and assigning merges). +* Accelerated cleanup to remove outdated data from ZooKeeper. +* Multiple improvements and fixes for clustered DDL queries. Of particular interest is the new setting distributed_ddl_task_timeout, which limits the time to wait for a response from the servers in the cluster. +* Improved display of stack traces in the server logs. +* Added the "none" value for the compression method. +* You can use multiple dictionaries_config sections in config.xml. +* It is possible to connect to MySQL through a socket in the file system. +* The `system.parts` table has a new column with information about the size of marks, in bytes. + +## Bug fixes: + +* Distributed tables using a Merge table now work correctly for a SELECT query with a condition on the _table field. +* Fixed a rare race condition in ReplicatedMergeTree when checking data parts. +* Fixed possible freezing on "leader election" when starting a server. +* The max_replica_delay_for_distributed_queries setting was ignored when using a local replica of the data source. This has been fixed. +* Fixed incorrect behavior of `ALTER TABLE CLEAR COLUMN IN PARTITION` when attempting to clean a non-existing column. +* Fixed an exception in the multiIf function when using empty arrays or strings. +* Fixed excessive memory allocations when deserializing Native format. +* Fixed incorrect auto-update of Trie dictionaries. +* Fixed an exception when running queries with a GROUP BY clause from a Merge table when using SAMPLE. +* Fixed a crash of GROUP BY when using distributed_aggregation_memory_efficient=1. +* Now you can specify the database.table in the right side of IN and JOIN. +* Too many threads were used for parallel aggregation. This has been fixed. +* Fixed how the "if" function works with FixedString arguments. +* SELECT worked incorrectly from a Distributed table for shards with a weight of 0. This has been fixed. +* Crashes no longer occur when running `CREATE VIEW IF EXISTS.` +* Fixed incorrect behavior when input_format_skip_unknown_fields=1 is set and there are negative numbers. +* Fixed an infinite loop in the `dictGetHierarchy()` function if there is some invalid data in the dictionary. +* Fixed `Syntax error: unexpected (...)` errors when running distributed queries with subqueries in an IN or JOIN clause and Merge tables. +* Fixed the incorrect interpretation of a SELECT query from Dictionary tables. +* Fixed the "Cannot mremap" error when using arrays in IN and JOIN clauses with more than 2 billion elements. +* Fixed the failover for dictionaries with MySQL as the source. + +## Improved workflow for developing and assembling ClickHouse: + +* Builds can be assembled in Arcadia. +* You can use gcc 7 to compile ClickHouse. +* Parallel builds using ccache+distcc are faster now. + +# ClickHouse release 1.1.54245 + +## New features: + +* Distributed DDL (for example, `CREATE TABLE ON CLUSTER`). +* The replicated request `ALTER TABLE CLEAR COLUMN IN PARTITION.` +* The engine for Dictionary tables (access to dictionary data in the form of a table). +* Dictionary database engine (this type of database automatically has Dictionary tables available for all the connected external dictionaries). +* You can check for updates to the dictionary by sending a request to the source. +* Qualified column names +* Quoting identifiers using double quotation marks. +* Sessions in the HTTP interface. +* The OPTIMIZE query for a Replicated table can can run not only on the leader. + +## Backward incompatible changes: + +* Removed SET GLOBAL. + +## Minor changes: + +* If an alert is triggered, the full stack trace is printed into the log. +* Relaxed the verification of the number of damaged or extra data parts at startup (there were too many false positives). + +## Bug fixes: + +* Fixed a bad connection "sticking" when inserting into a Distributed table. +* GLOBAL IN now works for a query from a Merge table that looks at a Distributed table. +* The incorrect number of cores was detected on a Google Compute Engine virtual machine. This has been fixed. +* Changes in how an executable source of cached external dictionaries works. +* Fixed the comparison of strings containing null characters. +* Fixed the comparison of Float32 primary key fields with constants. +* Previously, an incorrect estimate of the size of a field could lead to overly large allocations. This has been fixed. +* Fixed a crash when querying a Nullable column added to a table using ALTER. +* Fixed a crash when sorting by a Nullable column, if the number of rows is less than LIMIT. +* Fixed an ORDER BY subquery consisting of only constant values. +* Previously, a Replicated table could remain in the invalid state after a failed DROP TABLE. +* Aliases for scalar subqueries with empty results are no longer lost. +* Now a query that used compilation does not fail with an error if the .so file gets damaged. From 75f1df36e4fbf8035d6419d147a95966129a8665 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Tue, 22 Aug 2017 20:29:02 +0300 Subject: [PATCH 049/116] Miscellaneous [#CLICKHOUSE-2]. --- dbms/src/AggregateFunctions/AggregateFunctionSum.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dbms/src/AggregateFunctions/AggregateFunctionSum.h b/dbms/src/AggregateFunctions/AggregateFunctionSum.h index 10bbc7d8d8b..54f84688d6e 100644 --- a/dbms/src/AggregateFunctions/AggregateFunctionSum.h +++ b/dbms/src/AggregateFunctions/AggregateFunctionSum.h @@ -15,9 +15,7 @@ namespace DB template struct AggregateFunctionSumData { - T sum; - - AggregateFunctionSumData() : sum(0) {} + T sum{}; }; From e47a29fd4b4711a2d66e29c64ddc81534c2c8c28 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 21 Aug 2017 23:11:31 +0300 Subject: [PATCH 050/116] More sophisticated test of hash tables with integer keys [#CLICKHOUSE-2]. --- dbms/src/Common/tests/int_hashes_perf.cpp | 20 +- dbms/src/Interpreters/tests/hash_map2.cpp | 410 +++++++++++++++------- 2 files changed, 294 insertions(+), 136 deletions(-) diff --git a/dbms/src/Common/tests/int_hashes_perf.cpp b/dbms/src/Common/tests/int_hashes_perf.cpp index be1cb2e5b93..990292e4e66 100644 --- a/dbms/src/Common/tests/int_hashes_perf.cpp +++ b/dbms/src/Common/tests/int_hashes_perf.cpp @@ -306,16 +306,16 @@ int main(int argc, char ** argv) setAffinity(); - if (!method || method == 0) test (n, &data[0], "0: identity"); - if (!method || method == 1) test (n, &data[0], "1: intHash32"); - if (!method || method == 2) test (n, &data[0], "2: intHash64"); - if (!method || method == 3) test (n, &data[0], "3: two rounds"); - if (!method || method == 4) test (n, &data[0], "4: two rounds and two variables"); - if (!method || method == 5) test (n, &data[0], "5: two rounds with less ops"); - if (!method || method == 6) test (n, &data[0], "6: murmur64 mixer"); - if (!method || method == 7) test (n, &data[0], "7: mulShift"); - if (!method || method == 8) test (n, &data[0], "8: tabulation"); - if (!method || method == 9) test (n, &data[0], "9: crc32"); + if (!method || method == 0) test (n, &data[0], "0: identity"); + if (!method || method == 1) test (n, &data[0], "1: intHash32"); + if (!method || method == 2) test (n, &data[0], "2: intHash64"); + if (!method || method == 3) test (n, &data[0], "3: two rounds"); + if (!method || method == 4) test (n, &data[0], "4: two rounds and two variables"); + if (!method || method == 5) test (n, &data[0], "5: two rounds with less ops"); + if (!method || method == 6) test (n, &data[0], "6: murmur64 mixer"); + if (!method || method == 7) test (n, &data[0], "7: mulShift"); + if (!method || method == 8) test(n, &data[0], "8: tabulation"); + if (!method || method == 9) test (n, &data[0], "9: crc32"); return 0; } diff --git a/dbms/src/Interpreters/tests/hash_map2.cpp b/dbms/src/Interpreters/tests/hash_map2.cpp index 8a8027c726a..0d946eb43a8 100644 --- a/dbms/src/Interpreters/tests/hash_map2.cpp +++ b/dbms/src/Interpreters/tests/hash_map2.cpp @@ -21,69 +21,307 @@ using Key = UInt64; using Value = UInt64; -struct CellWithoutZeroWithSavedHash : public HashMapCell > + + +/// Various hash functions to test + +namespace Hashes { -// size_t saved_hash; + struct IdentityHash + { + size_t operator()(Key x) const + { + return x; + } + }; - static constexpr bool need_zero_value_storage = false; + struct SimpleMultiplyHash + { + size_t operator()(Key x) const + { + return x * 0xff51afd7ed558ccdULL; + } + }; - CellWithoutZeroWithSavedHash() : HashMapCell() {} - CellWithoutZeroWithSavedHash(const Key & key_, const State & state) : HashMapCell(key_, state) {} - CellWithoutZeroWithSavedHash(const value_type & value_, const State & state) : HashMapCell(value_, state) {} + struct MultiplyAndMixHash + { + size_t operator()(Key x) const + { + x *= 0xff51afd7ed558ccdULL; + x ^= x >> 33; + return x; + } + }; -/* bool keyEquals(const Key & key_) const { return value.first == key_; } - bool keyEquals(const CellWithoutZeroWithSavedHash & other) const { return saved_hash == other.saved_hash && value.first == other.value.first; } + struct MixMultiplyMixHash + { + size_t operator()(Key x) const + { + x ^= x >> 33; + x *= 0xff51afd7ed558ccdULL; + x ^= x >> 33; + return x; + } + }; - void setHash(size_t hash_value) { saved_hash = hash_value; } - size_t getHash(const DefaultHash & hash) const { return saved_hash; }*/ -}; + struct MurMurMixHash + { + size_t operator()(Key x) const + { + x ^= x >> 33; + x *= 0xff51afd7ed558ccdULL; + x ^= x >> 33; + x *= 0xc4ceb9fe1a85ec53ULL; + x ^= x >> 33; + return x; + } + }; -struct Grower : public HashTableGrower<> + struct MixAllBitsHash + { + size_t operator()(Key x) const + { + x ^= x >> 1; + x ^= x >> 2; + x ^= x >> 4; + x ^= x >> 8; + x ^= x >> 16; + x ^= x >> 32; + return x; + } + }; + + struct IntHash32 + { + size_t operator()(Key x) const + { + x = (~x) + (x << 18); + x = x ^ ((x >> 31) | (x << 33)); + x = x * 21; + x = x ^ ((x >> 11) | (x << 53)); + x = x + (x << 6); + x = x ^ ((x >> 22) | (x << 42)); + + return x; + } + }; + + struct ArcadiaNumericHash + { + size_t operator()(Key x) const + { + x += ~(x << 32); + x ^= (x >> 22); + x += ~(x << 13); + x ^= (x >> 8); + x += (x << 3); + x ^= (x >> 15); + x += ~(x << 27); + x ^= (x >> 31); + + return x; + } + }; + + struct MurMurButDifferentHash + { + size_t operator()(Key x) const + { + x ^= x >> 23; + x *= 0x2127599bf4325c37ULL; + x ^= x >> 47; + x *= 0xb492b66fbe98f273ULL; + x ^= x >> 33; + return x; + } + }; + + struct TwoRoundsTwoVarsHash + { + size_t operator()(Key x) const + { + UInt64 a = x; + UInt64 b = x; + + a ^= a >> 23; + b ^= b >> 15; + + a *= 0x2127599bf4325c37ULL; + b *= 0xb492b66fbe98f273ULL; + + a ^= a >> 47; + b ^= b >> 33; + + return a ^ b; + } + }; + + struct TwoRoundsLessOpsHash + { + size_t operator()(Key x) const + { + x *= 0xb492b66fbe98f273ULL; + x ^= x >> 23; + x *= 0x2127599bf4325c37ULL; + x ^= x >> 47; + + return x; + } + }; + + #if __SSE4_2__ + #include + #endif + + struct CRC32Hash + { + size_t operator()(Key x) const + { + #if __SSE4_2__ + return _mm_crc32_u64(-1ULL, x); + #else + /// On other platforms we do not have CRC32. NOTE This can be confusing. + return intHash64(x); + #endif + } + }; + + struct MulShiftHash + { + size_t operator()(Key x) const + { + static UInt64 random[2][256] = + { + { + 0xb9979dc11a7ab921, 0x069177f0cca1cb81, 0xa77b7458984cdca6, 0x20cdddcd60ebf956, 0x54a7e16ccc85c618, 0x5a7b32512add86d0, 0xd4024d92207929e0, 0x927506e044a87bcb, 0x0ee2fafa66d27f8d, 0x34e5d597062edc13, 0x9d9e5971e4ef679f, 0x1373fa521c455462, 0xae20d7a035922d67, 0x2acceeaa1c38dea1, 0xa8d7318d831b2291, 0x237a092ca188a58d, 0xf3aab9c253e94340, 0x59c067c9247ad798, 0x9a2a3b0fc175faea, 0xb4ff42232b62408a, 0xc33f6f6e14b2ad59, 0xd8354b02517bb45e, 0x6cd3324afa8e1fa8, 0x491f3efd10beb8ce, 0xec5511355b29b707, 0x11a0e525b3f8a1d9, 0xaecb034c53727bb3, 0xaad2f1a0f7b1bb15, 0xdc318ef665bf079b, 0xecaed1b2e1808d2d, 0x38ccecd71d8548f5, 0x4a29ee777e1e8984, 0x58d683d104a9a9ac, 0x1c86c3ae03b0d968, 0x6ae480de1f434851, 0xdbb254502c123636, 0x7c8514ca7feb2780, 0x209ce2dacac250c4, 0xec256290581d4242, 0xba54af4e004cd657, 0xef09683b8da8cfd4, 0xef4b60e1cc22c00f, 0x8bb9849ecb4f0f4e, 0x64186f57b4e7e197, 0xf86d9122f253282c, 0xe545dcc26d8232fc, 0x7a8eeab5b064887e, 0xd77895d6c7baf87b, 0x07bf805fc0fcef52, 0x362d110a780e166b, 0x1b0a76b85b924a27, 0x49904133b1fb35c4, 0x76328bab42b9f5b8, 0xcfd15d94b28db6d0, 0x8908beb1031eb7b3, 0xbe05c1d38c789639, 0x9a38f06e2a4a5e2e, 0x9c49fa7b05cbd5e7, 0xf31aa060547fc13b, 0xafcfd8714b2a4082, 0x71a117f24d3d8cbe, 0x201a2c30737c1243, 0x9915450b0b26957e, 0xbe5865d67bd08830, 0x1efd55f709543d56, 0x69305e7e4c08948e, 0xd19d4fe1a47b1598, 0x36e4246123e542b7, 0x4cf0640cc2b66fdf, 0xf4301d669c78d4f9, 0xe1e7025ea57b3a3e, 0x6d59685c09510c07, 0xd90b29fbe9680c7a, 0x5575a24ba532391e, 0xdebab7c32a11d297, 0x09010bd6a6b295c8, 0x5b745d475a2cc5f8, 0x1a17df8fa5d2fb0e, 0x9eb9c9a1c56caa5d, 0x8759a2d4b80f3104, 0x1a6732736d219e48, 0xb9a934bedbbb1b64, 0xe88fc304f4f41aa2, 0xb650530683f9aecf, 0xc6de4393e1754ec5, 0x455dd664a10d1975, 0x295dffd0c8accda1, 0x4b0e49b50e1c3cd1, 0xf9b16d40c7bcb99d, 0x73f924a20a6b9bba, 0x59d4473fddb90104, 0x16a1b347c260d1b0, 0x0b6c06c9546458b7, 0x808f3c2d9e112207, 0xd142ca3cdf2a92c8, 0x36b4ea106906393d, 0x3ad7d15985207a3f, 0x5b3236e568021603, 0x95ff5ce56c0c9e4f, 0x35b8973c8634cac8, 0xd09591efe1cea59e, 0x9a852d896596d1c5, 0x5b8d231f680d8003, 0xaf56403d17f64962, 0x27f9e41e098024b4, 0x276adf3aacd76289, 0x0f828c068e8e4552, 0x45b28f9c40591b8c, 0xf543929acc2fd3a1, 0x7f5c232270f8675c, 0x96bf54ca56992a6b, 0x831ceab94de9a77f, 0x884d660886d85f97, 0xa441f1401555b4cd, 0x2f7a37e0df322ca7, 0xcfd621bcaf7e8968, 0x2f4c4f54612f78bf, 0x81ad69be79a99942, 0x452169980a69690a, 0xfe7ecd6fdfffc7db, 0x6750d09c96c0723e, 0xa96e8b7c1f87d0b7, 0x9355142350227cfb, 0xd04b2c03a5fd752c, 0xaa884bf5cbaef0c9, 0x47439b6a210da3c7, 0x08366f260246b77d, 0xada9a09bde98ac47, + 0xf285854404e11a2e, 0x1f6b5f0db9344910, 0x43635afd969b49a1, 0xf6e336e4883a399c, 0xb3dc4cd8d0589e84, 0xeda5c2c0fc7742f4, 0x10b3b8fb622b125b, 0x9f109b5ab6eeed6e, 0x69277c89abd4cd78, 0xea221cf76ab7fc86, 0xfa0ca125e8daf891, 0xdac858a3c5e11c00, 0xafab19a748a947ae, 0xeb2b69a5a4da6489, 0x601eb5a12ac4565b, 0xf782900ee4cd7365, 0xa1dc2fd083f4546c, 0xf8723698955f8c1a, 0x1ef4282aebf3d945, 0x653da3bf71e624bd, 0xbe04b29a9baf7d5a, 0xb18f73a34543666f, 0x90c901c604dce6e2, 0x3208dbe059534b49, 0xacb11eee833467d5, 0x3d07083a9d5be0d6, 0x6bd915dd0fef2557, 0xabee35defb430211, 0xb3180e083638dc85, 0x2be0361e7febfce0, 0x4d97cf883fabdc41, 0xf1be01ddae8c4048, 0xb7d0b4f0332d2992, 0x72141ded3dd6f55a, 0x9123d943f30926d9, 0x7eeca6bc6be7313c, 0x95ab321d7ee5c72c, 0x21421b21f9d81288, 0x19233206a680c160, 0xf09a9d339c9d311c, 0x05133ec82d1ecd3b, 0x71f02fcd10beb60a, 0x5e61ad5eeb1ceeee, 0x087c9fbd97613ab5, 0xfe250587d99f3438, 0x5e871afeec0fa630, 0x4f88441aa4eedd4d, 0x1a42dd66f7452619, 0xf58e8d8f81b957ef, 0x66986b54ecf07347, 0x2382340318cfb238, 0x7d1c4f93c49b788c, 0xd8d9fa627f06932a, 0x6aa7c64c4873e3d5, 0x27efff555b10bb4e, 0x784a1565db94187f, 0x4271a9c1fcd0772f, 0xd234d11377eb40b0, 0xcaef5e6aa3977628, 0x64009936900c3fb0, 0xf0ae881430c514c5, 0x0cd32d01c5798aa4, 0xc45b39cce35de6e4, 0x1307b9f4d832f787, 0xceeee5e813135402, 0xc930a0867296e8a3, 0xe4b52a4e4f3d9783, 0xe4e7934e0d97202f, 0x51d1e9340b2459ce, 0x99cc0f90dcfe55b9, 0xf4f27b19cdedfe55, 0x9debe48d7c4cb666, 0xccd8bda6061dd33a, 0x3d1b011a2f870b00, 0xbb4bf9865127ebc3, 0xa149ab768fb8f044, 0x3119a981452666bd, 0x65db8aa27ea6d215, 0x1c6d1bd4e5f373ce, 0xa17f5382b2217d61, 0x9599f49e8a4c3636, 0x745bea7bbfdb01c0, 0x3827fcecc93556d5, 0x23467c41001df3a1, 0x6b055e5393e6df45, 0x845fe338233e4e8f, 0x2924d70bee302e1e, 0x00ff993181bdc604, 0x491f3a3eb8502037, 0x5d76d4307fb75616, 0xd02fc60a95d3e5ef, 0x807b31765ef80cfd, 0x94d6208ae964ca56, 0x01985a747cedaf30, 0xc93ba934dd080643, 0xff2171253b5f3f29, 0x661b5bf4c5c90793, 0x3e16f8961257ea4d, 0x6234adf4978717be, 0x0fb6ebda63b582d7, 0xe93085e5a1bfd52a, 0x356873f8edf17b1b, 0x6bd859a750a2cd58, 0x413c4f77cf56e540, 0x416f62eca618e666, 0x3fdbb2157558f5fc, 0x3446b31c6c14a00c, 0xba534ff625129ce8, 0x2579bbcd151f4a9c, 0xb13327991b337d1d, 0xe548cfe328d2e52a, 0x8685e6bd4abe8bc5, 0xc912ce5f3fe32b12, 0x544f4c648136ef2a, 0xac9dc00a55c71ae7, 0xb9c2048993ef7255, 0xdbfb82775439009b, 0x7124703dd90168cd, 0xfbf35a0d9e650617, 0x2c757dcd616aea51, 0x2c465d4aceb02eab, 0x28cb9d0f78dc8657, 0x87cfaeaa76051bc8, 0x0aeaf0c08f5e04a1, 0x7c60c6ac4e1bcdaa, 0x5904b7dcc3ac2e1f, 0x17625e6c1972f71c, 0x64dc0d8c46a96c16, + }, + { + 0xb2b37152266d808f, 0xd1688ce5907fa9bb, 0xb4fbde50315ebb85, 0x94e1d1a40be0f814, 0xe5ef4ab98cebd353, 0xf908528b3ec218e6, 0xacc740ba335dceda, 0x19f10e26e4c68a48, 0x840a9672a2f5a2b5, 0xc0cf3b2996e6d1e9, 0x548a34dffc0570c1, 0xdc031240feff5c48, 0x92297ff0b800820e, 0x0c11352081d2a81e, 0x8fd8d29c79d55a69, 0x66488d4729e78c30, 0x941d465e2582b6fb, 0xe76b9689bba28cc5, 0x4103bec4b7c08c40, 0x4e4b4b76d188000c, 0x844db5402e959fc8, 0x2e134ee324e2f088, 0x625fa933c1fa4d1a, 0x1d4f0121515d0ce0, 0xb1d0d19a00d95196, 0xc38fe9c8032d86ac, 0xd6d71c1464cf5365, 0xef8d00bb18b455e8, 0x7536cd4fc7f65501, 0x97b4b02c30117dce, 0x7411e5084e20b6b9, 0x988167ff559bec81, 0xf91372f1a162a022, 0xc638ef90a723246c, 0x6761b912a7d129a9, 0x56927af0806a2486, 0xae697de7c569d46c, 0xf0587bfdf442de4e, 0x02b83e162ef75c67, 0x712f8e20cd8d62cd, 0x443a2b5a16f137ca, 0x5faca36e7dc9b149, 0x3fefa267d527a8d5, 0xa8bbd36ee9c73ceb, 0x451a8aa3972efdbd, 0x0b5a7ddaf5d22b7f, 0x37a58d60fb0033f5, 0xd57f6057b724127a, 0xa36b778ce2959583, 0xfd843a9d8800b0b4, 0x057f720e9582b96e, 0x4304286582ffe050, 0xa3fe58e3d150bad8, 0x3b1cc25468a8cf65, 0x5a343b883d439ecd, 0xefebddaf9fccf271, 0xdee57a385349bdc0, 0x685936c14e3c96ad, 0x54efe66dcb28d0fa, 0x3b3a5bbb4873165e, 0x6a10806224cc7c73, 0x8b81d349a6653e23, 0xd3c77a6c5254a1c1, 0xe426ed8badd6ae84, 0x159ed3abb8289790, 0xc34a0abddf1c3868, 0x7e0ffe203c7b27d3, 0x26a12e8a39321471, 0x058ef4beca30a376, 0xa329f59e34edcd3c, 0x72b0a270dcf9a332, 0x166ceb4a84f8b7e6, 0xa280d2c77091a912, 0xec16fa92ca834210, 0x87cb7bde305e2e8c, 0x637fbc31719a722e, 0xf1d6b723b62c74b9, 0xa79f73228d226e72, 0xdde9e7d9b6111fc5, 0x7ceb45bc84699f40, 0xa91bfc1705e0d732, 0x306af3eed572452d, 0x4a9433f2005ed515, 0x9f00376f44600cec, 0xefd838b045fb86ef, 0x65098de0679c0513, 0x51ccc18e00e21e0e, 0xd462c4e789677c32, 0x95a177c568ffc03e, 0xb12376a070d7b2d7, 0x664ae720214ec675, 0xcf15fe99a80aebd0, 0xa7d007e79eec58ab, 0x2c6b911aa9872e3d, 0x77f746e811360633, 0xd0830a895f8f557b, 0xfbefdc19fccb70e2, 0x02e4ca8f22349a2f, 0xcc8e04e0283f929c, 0xeb743ce2f3f2a830, 0x966611978470f470, 0xd46e0a5f306e76d0, 0xad2c8ed5bcd22c46, 0xf1eba8f4d933b891, 0x058a7875bb427a22, 0x45107f3da4aa3e16, 0xe81284e4b7d9db22, 0xe004099ab8178db8, 0x53e36cc21df27075, 0xd9a17d119adf78de, 0xe95c27a78e7824e7, 0xb584e128467f80dc, 0xd44ff1193314853c, 0xf0124a034d852e19, 0xc9077af6da8a9ce9, 0x57a082ea0d3f7acd, 0x14cd16087a7bf2a7, 0xeb64143d63df7307, 0xe15943fecae64d35, 0x978bb411cfc5f25c, 0x76a96f8f617871b7, 0xd7d9eddcbfae7bd1, 0x61bcfec611e3ed1c, 0xf2af9d3e527ecf80, 0x8182c0a8ee728f30, 0x7ca964bcddcbe009, 0x99c70ed92ad37d47, 0x52ad14b9a60bebdc, + 0x651a92a09a0f6cd9, 0xf081fe7ada03ec1f, 0xc2e558216dc44e49, 0x28d1e01b15889c1b, 0xd24d7e86573816dd, 0x965aa3b1404a1b4b, 0x39776cd5c65d62da, 0x5a1afb7ffaff7228, 0x993d7e2bccb5b123, 0x8af2f371498b991f, 0xec8f424fd6b122f9, 0xf7a7a05f114f446d, 0xf1729f142472c92c, 0x1e47d5d4dbd7d8d2, 0x3c79a550342c0bb7, 0x70d8ff005cc97454, 0x565f5c2a091373b5, 0xb2f07256c7f2de3b, 0xcc0e305a4fa50bba, 0x90d7259bcd4d4dfd, 0x57a21147c7b8d4b4, 0xb4e904c414344400, 0x1b9843cef6b7de4e, 0xc55ed544783d7077, 0x951fd36278c4af42, 0x5596691ec2a6c112, 0xa96366b16e85bae6, 0xdce8b9304db2cf16, 0x4196a4a77dad5d51, 0xc035d6a8486f503c, 0xda814111a183c18b, 0x850d476c24afcdeb, 0x8b1fb1911d79a756, 0x3fbb083dc9ff1546, 0xd9ea3048315a4840, 0x1bbaf883b34fb0e8, 0xc7812b9babc4f1aa, 0xeee79e6e139bfd6d, 0x0f61f802cad137ab, 0xe6702e761b466507, 0x00fea66009d13ddd, 0x27865b24fdc1543a, 0xe53c0cadcbd4ba6d, 0x081dead3238fe2fe, 0xc4ad52df5a17e06b, 0xdf196982de8820b4, 0x93056ac04ef6a5d0, 0xe3b0e29b5b394f0b, 0xd22124f2f63464f3, 0xcfdc91988a08c919, 0x142e82bacd825129, 0xa295a43e93e4e702, 0x1b344f1ae78d7438, 0x1ad39d6fce7b2de1, 0xf38a7608b3c52ae3, 0x0411864df1f01a7b, 0x8da709efa240a816, 0x4db801db3b0405a4, 0x82e53d875886c89c, 0x1f8a6580748a29c4, 0xb5f3c5da7b0c656d, 0xe6308e06103bb9da, 0x1c044a02583c3b23, 0x7824fafc7744ded1, 0x120ae3a85640de45, 0xbe7841a70dbe7f85, 0x13b1bedabd2227e0, 0x543f4d8601666ca0, 0x140acc8931524f45, 0x07d8d511f4deaf51, 0xe4218d90e617fb4c, 0xbff96e733749a010, 0x6cb6990dbdfed3a6, 0xe651708ed78c4008, 0x2d86b38cd518d5fe, 0x41316f458fcf5a20, 0x74cf6939366c2013, 0x298a2a81db72ba3a, 0xbdeb78b42a71be11, 0x7bf37745b51a4e93, 0x71d074c050fd7f32, 0xd7ae1af287ef3c83, 0x6545c0921918a9c4, 0x81b80a0be366c29b, 0xb5f96c0c829ff255, 0xedc1e2598be87178, 0xd930d6eafb62c208, 0x1b4ae0fd3bc45e3f, 0xae4eba5234af88a3, 0xef250aa0f82c9251, 0xf842992589d21959, 0x76d99f8cc618151d, 0xc0d053337ad3d0da, 0x87569479dbbdcc16, 0xc0a31211852f8ac5, 0xf09022e229d40060, 0x2a4acf18d2d9a943, 0x95b9dd630a124a30, 0xe3d441a7c183a2df, 0xb70592e18a0d31d5, 0x45dfe88bf06ec04f, 0x9a8982b8dabc5814, 0x9853c63295eb60a1, 0xcc6ab672b45261c5, 0x1d59b5ef15f998e5, 0xab052dc26ca65d9b, 0xc29094316db6ad02, 0x90e2463bc2a67bd5, 0x5d9658394413a531, 0xbbae171ee3e4997a, 0x7baf87e1759cbfee, 0x269b8ee8cb2d9c69, 0x98d272695f943d3c, 0xc2aa69caf54a47ae, 0xfb6d9caf908685a0, 0x36aab7dfb5ef3444, 0x9a28ca1db0e037e0, 0xd54c3b5005923402, 0x124addbcdcfa5bc1, 0x277b48aaa7bec0d9, 0x76d3a563d86fa26e, 0x0545a2263944b662, 0xdfd9e108d234c7a9, 0xa7f406b6d42d6ec8, 0x9becf8e91d0daf3e, 0xc53f653fc3f42bd7, 0x66a70e50c0535454, 0x2ff4d545d6a21306, + } + }; + + x ^= x >> 33; + x *= random[0][x & 0xFF]; + x ^= x >> 33; + x *= random[1][x & 0xFF]; + x ^= x >> 33; + + return x; + } + }; + + struct TabulationHash + { + size_t operator()(Key x) const + { + static UInt64 random[8][256] = + { + { + 0x4f3cecaf24409b1b, 0x6ad9f166d91c6613, 0x54bf75358aea8524, 0x3fbc1de24a079a6e, 0x57ea94a0259aec73, 0xf9174938aeb467ca, 0x6f5deec36e40d25e, 0x534addc1aa10643b, 0x94734451bc5c5ec5, 0x4d72432932c6c7b7, 0x56ddb2f1203575ef, 0x8f7f217ead5654b0, 0xd7c0eac16d4aa24e, 0x84e4265047714b2d, 0x449769b97c43e1e1, 0xfed98b3f4c5b7698, 0x48bb913b09ea35c1, 0xe69cfcd6052df551, 0x483636e39bab623d, 0xc108de147d29545a, 0xeafb7485ba1f8e40, 0xd4a3891e24ab7233, 0x941f1975d079ba30, 0x8776cd48b75bbf4c, 0x42c5f14b72ec0eef, 0x19a18efdff3a84b5, 0xec4078cb31112625, 0x3063155b2e1cace2, 0x4d0fd702d00c53d5, 0xc80ad41b4e104360, 0x67e9d8d12617d417, 0x1a6de5d7f6a3958b, 0x9520893617a19775, 0x8842a4072f85e7b1, 0xa066c6eec0f4c288, 0x91c753eb152561fb, 0x1eacdc853dbdc4d3, 0x38e8e61d8cc61e0e, 0x22117333fc2eb16e, 0xed909eb368ecc36b, 0x2b67fc646f0b73d2, 0x7c28b15e21c0a93a, 0x13f8de9d1bad4d5f, 0xd96a893cf9da4125, 0xd3bbc92ad05fb53e, 0xd13aaad8d8075799, 0x18f003d700064040, 0xbb47fd3c38570068, 0xcd3db144d1a1f6d4, 0xebb33f814155f734, 0x740c6c7f4d91ac30, 0x9e3ae55cefe1f46e, 0x678c8b1c10da8b96, 0x37510cf678751024, 0x4e9e97713eb900d6, 0xb11271b9b1617fe7, 0xf2b35c453dfcfc22, 0xf5c2a8307ec8d153, 0x14089b8b1462447b, 0x5a350397786bb472, 0xfff7cd246e11a821, 0xe5649ebd197aa820, 0x5b7b9b407888c0f8, 0x617e4610c8e466fa, 0x928f11ee454fbeb6, 0x72e6a8006953074e, 0xb695a3dadef3ae60, 0xa26906a7e0140bbd, 0xf856fd404e987a6f, 0x95cddade446d74c7, 0xf7cd44918454ca8d, 0x34b17066e9a0f88d, 0x3481e736e1fd2fbb, 0xdf09f9dab79514ba, 0xf9352d79440c48ae, 0xae71591dcae8b4b2, 0x2f1bfdb07031c1ee, 0x50f106bd520bb92d, 0xbc39d67db555d325, 0x0768dcf245299385, 0x2d0f0564d3ee2403, 0x0b4075b353804510, 0x3722374ac591e9d2, 0x561d767a57b72214, 0xd6e1775b179939ea, 0xedaf88090284c61e, 0xc897695662d2c7d2, 0xe2bdcab72b125c05, 0x37c0d44b70a6e565, 0x3c5be744f87454d9, 0xd8d969301f77195a, 0x3445efae8fea16b9, 0x338b465dd8e11413, 0x4bcde36d984527ac, 0x0b803b6976171f05, 0x51a7386146462803, 0xc2897c1a69b6f1c1, 0x5ab092594684a5b4, 0xd3f4afafab7fc3ee, 0x744c31a06c5c0460, 0x49f01a31eefe4021, 0xaa62ba4831a87a0c, 0x61052036b02cb121, 0xc4bb5582ed8d7e4a, 0x25b6b517dcf0d7fa, 0x703b1897ff50a997, 0x83e5b7ef256dead8, 0x8da8e0ea74709e3e, 0xd5e2be449fd500a8, 0x0c386f813d21c684, 0x4bfee7a5bc728b8e, 0x5f0aca2baba81c31, 0x7ddfcfe8a6e897de, 0x90b69d33b9af5fbd, 0xfddedc985978876b, 0xc8f93bbdde12f7f2, 0x45d7a1087f4739f0, 0x75ea324184f1e5b8, 0x97b78ad1ec2ef95f, 0x192e5bf5ab92521b, 0x5175eefdc3fadec7, 0xa23a36c97bac48b2, 0x6e1c21a7c232880e, 0xf8010ca06ce802ea, 0x6e9822f71a8123cb, 0xdcb21616d2941bc5, 0x6f2929e3943e0777, 0x5a6ae6bc66eb2f1d, 0xf20a3c93c0fa6172, 0xcc1f91002d11567d, 0xa558d8dd4fec490b, 0xbe0ca1be73f5d533, 0x66dd4427dc66bbe1, 0x6a27341a10cd985f, 0x8d12380bcbd9bec3, 0xfefaaf20d5b9139f, 0x8641d578cdc4e199, 0x5f21e78ab4d25c23, 0xef52fdd1026d6f8a, 0x842f108fa0fcb69d, 0x9bc3723415c2724b, 0xc9615a1d92ab9500, 0x7c0850b85e7535cd, 0x8e93357abaf1ed24, 0xdf6fb36799938890, 0xe2082b8202e65187, 0x11170a177d855ab0, 0x751564db24effa8d, 0xa74b7769d222649f, 0x12a999982fd65d64, 0xc380a14a49b93b32, 0x5b9e932a4f264ee3, 0x1ca4323b708a0aec, 0x28fd5d5a327c91d9, 0x31289307419c9f1b, 0x20bda201fd63649d, 0xd1d1c8c8163836d6, 0x9cdae51d6993d0a3, 0x3a6fbe9579c1da3a, 0x27072cbc6d3a4825, 0x94b7107387607e61, 0xb1b0b605f39f115c, 0xb2557d474dc4e952, 0x8794c509cf6e26b1, 0xc1a8398cb2e98c9c, 0x92d0f486b7ac4afd, 0x9082064213d7c39b, 0x7e200cefde5ed88d, 0x904b5a00dd597b29, 0xe84c40f0bf571c92, 0x196b4a47fe185361, 0x2fb3e66b0fa8c185, 0x581a7f90e8646a69, 0x4b74f5f56f087180, 0x2e94fe98e0b1cc0a, 0x198f7bfbc692eda7, 0xa4d0b7908707016e, 0x0c90ee281eff932d, 0x879a1cf4c24d189a, 0x2d66cea5314bd480, 0x23346e49480e7e83, 0x82d63e12f56ea02c, 0x4ce802d35f8f46e2, 0xd143fe931608d5f5, 0x66c466071c6718a2, 0x59a5ab0a39dd53b2, 0x4805529d2a394dff, 0x631151511fde3379, 0xab98f8154c24669d, 0xb3a05b6b742dcdf2, 0x9d9827d3e071e26f, 0x9c157833c16216fa, 0xa9c8584ed28c8023, 0x94ca7cddf52bbc28, 0xc34d111216c15159, 0x68abebbb05b62206, 0x4786f8c9094da769, 0xb9c218515d329fe9, 0xd997a2ad91f01905, 0x81aaa629f3b2bce0, 0xefef8a896238229a, 0x6af252f60dd72940, 0x4492c36d5f165eac, 0x9dd50a2ef4d5f9a1, + 0xdfbf94a3550e6ecd, 0x9288b91b1caf05e7, 0x9c0ad10f9c67d06e, 0xdd4acdcb36db48c5, 0x7570a07af93f329d, 0xa31f26e2fffef103, 0x2886476327948381, 0xbddd48e33441c988, 0xc887b91661bf6e9b, 0xfc21127e01445e2f, 0xf0a8e3af7c953713, 0x47da9d0482ee366b, 0xc3d6ca5719939732, 0xedeadea909a6fa76, 0x26fcdad40d586205, 0xa1dd97b354af5ed4, 0xcc8aa75425740654, 0x4a0c5113156178f9, 0x981abd8fcf766b13, 0x99f31176a6cb712a, 0x49ac51e92982f34e, 0xdfeaa1da9373b16f, 0xa31666230da09aa3, 0xdc1eaceaf1afa2e2, 0x4326313df2d59166, 0x8836b6746f79236a, 0xe166e915f72d2540, 0x09cf7b4b78b2637e, 0x55369c7b01071949, 0x86ff67741a6c3cb6, 0x76503dcd4383b8cd, 0x36731b7b7cf8df2e, 0x51a2d6aad260273b, 0xf6d7cbb0db4253cb, 0x1230054a3bd28926, 0x4eb266aae155fc98, 0x9a2a7f60a9dac0e9, 0x79290b7b9035b3d4, 0x3a424cdbbe2aaa45, 0xcc46944623341c59, 0x7c185b60bade4199, 0x6ae892b88237cebc, 0xdd8ec8066e75ae58, 0x69a8aa059ff444a0, 0x987e27eae07462d5, 0x539f69c3d236e3c3, 0xc6bcae3c97941ed6, 0x29e853acc29b3eb5, 0x1faeb880153ba613, 0xd35bb34905b04517, 0xabcc7468231c83ca, 0x286d214a37fb65b3, + }, + { + 0x55baa482d6094d30, 0xa775277f382073a4, 0x73bae2387e32c5f8, 0x4a6416aaca027e0c, 0x0ad38404a8ca17e5, 0x37ca2344345f1a5d, 0x9c910f03937fc178, 0xd99efaccd8d0f15a, 0x557c9d7538915f7e, 0x500ee4fb62acc9e5, 0x3f1eb011057383c9, 0xaa4fe82c1926b108, 0x84e24186cfadd3fb, 0x0862cef2d38de5f0, 0xf03099ce7d642f66, 0x143b22300078711e, 0x04d44b5b3444abb0, 0x2c46d930d09accf6, 0xc5c8cfe5da8a7e49, 0x9c0dfe1f0c791972, 0xe287ed0f98ffb25c, 0xe91eb5daf941701b, 0xf4989aba25810a10, 0xa23853aed0869787, 0xc008036099dbab0e, 0x752dd9e217b5c4fd, 0x763c0b933129e776, 0x7b474798a5a16875, 0x31c3cf01e8ac88ae, 0xa3075c68c217fbbd, 0x12b53ba28ba2ef53, 0x62d619c3d366944e, 0x8d1aa326f3f96bb6, 0xe4ba4927c89184c3, 0x863b2374081f1e4f, 0xa2f5b1f264772e64, 0x7d8085a2941f5b09, 0xc19447f7e00838ca, 0x1fc50c73bd36adff, 0xc10e2d3ea18d12a2, 0xfb9d34ae20b0977a, 0x809ae69b8558a6d5, 0xf643d21e8543a777, 0x1223ae6c2809d3c5, 0x5ff0047e9b20a9d6, 0x814623fd6a99203e, 0xc912bd1a4b7ba3e1, 0xf4683a10792dce3a, 0x6157694e70c50676, 0xae3916927aae4a7c, 0x0973002f06279ed7, 0x0f4cd1c254c5e26e, 0x7d7ba6bb160200c3, 0x3c3bd06bd3fa92d9, 0x1e559440993b113a, 0xfca7ed369bf393eb, 0x6caa82117c2f3ca6, 0x4d848224ec4a0dfd, 0xfde9e96a3023bfc4, 0x3bf9ed37ebcad940, 0xcbf6587df4678baa, 0x98d4968ce7ec8779, 0x2644f85c1e0fbe76, 0xc984308f877374a2, 0xd53e563c2f8511a5, 0xd6dd5155704369f7, 0x853bdf051a2a6a2d, 0x21d9a29d02e502b4, 0x65150c59e806b5a9, 0xa1943a083f94e255, 0xdd5422dee2ebf9d2, 0x7a418ce99f1795b8, 0x98b0e22488a10741, 0xcabcf61f9966df2d, 0x58e14076e68fca44, 0x314d7ddf395cccdf, 0xcc403b46e733f565, 0xf15b35f8d71d8a1b, 0xf5f1b4f972ab688c, 0x1b3b1dea29c68904, 0x2c96354f3f1da731, 0x00f045692ffcf9f2, 0x03ace2077bc44510, 0x7da8d3d81d6d03f5, 0x5cd83bc6f5d9f8ad, 0x7c04887a3721286e, 0x1bd151e4125406cc, 0x888c7ad9ebd8ba2f, 0x143f637fe24a0da0, 0x6b3779a345052dc8, 0xbef717c4f597384e, 0xcbaffc196a0aebed, 0xc7c4c469a8d9c20a, 0x4e260ce8512295c8, 0xe0c9b47f50817abe, 0x0dd940d3900eaabe, 0x91d566526665dcf7, 0x470d9079c9c2fc39, 0x388867f7a6d48949, 0xd0c3ba55686d3d6c, 0x9880ba4fa1a0765d, 0x31178f63e3c86654, 0x1ad2daa404e3ce35, 0xcb816899daf1d758, 0x943662411dd67f38, 0xff9592c29d8c8150, 0x123d9c7fe4bf5702, 0xae43ea51c75b1793, 0x9d3e98a5ae2bc556, 0x601f8a748a24ab05, 0x3b090e60d6837c99, 0x6236755d48edd559, 0xefff911ef6b222b5, 0xdd567e4aafa31faa, 0x98bcb00b24a47474, 0x7cb94e6af25671c5, 0x5e821e019dde465e, 0x7defecfae68e913b, 0x915811752db3d4e7, 0x8be3d8cb181a5e8f, 0x95915979542f5ef1, 0x49708c505e34e6e5, 0xda4c55a2f6d1dc53, 0x2474d9abbfdc58c0, 0xc83b01a3120290ea, 0xd35cfa7833fb3e6a, 0x26dceb5adf4d2e72, 0xb4a95e8d3921a995, 0x05f9eea1de04e25c, 0xe1b3f728f77a0ea7, 0xd0e72bcdb5a43289, 0x532a242c481e5582, 0xa1af8ca39bd360b1, 0x92f5d69ceab3c9a3, 0x4d3effdcb8889428, 0x1a41253f9e794758, 0x8ddaf31b28db2834, 0x0e183ef313da9b9e, 0xd9b3f3a53daeee98, 0x39d555f28e821b18, 0xc5209431aed2ea3a, 0x70836f760f213e2c, 0xc8eb3a1a5b250610, 0xee225c27d0fae90c, 0xa3d1bfdb2f236eec, 0xe4ea1d3c6ab29fb1, 0x3e4113121d92c559, 0xd6f76fcb55b71cc9, 0x9b2c2b439c547467, 0xd4c0eaa7c33240f8, 0xbfaf66aa8c19832f, 0x9d3b1f5a4b810871, 0x01635ec6f0d79ff2, 0x60ac5b58598a106c, 0x487dd435e33b6846, 0x60bffd49a79cc594, 0x7b94ee39d7958a63, 0x146e9a412ad1259f, 0x7f78dd55015459f7, 0xf9b4611ed19dcc7b, 0x02099fed0debcb39, 0xfa2c53462f353c9f, 0x4df9be5b185dac4e, 0xdff08e1bb6197444, 0x68b8eef25269c9d1, 0x29375f899bfdf95c, 0x717425fb6cf4f3e7, 0xd05924d6516744ea, 0x7767e15c3f0ae746, 0xef09e001fbd96e10, 0x3ede191e2efd92b4, 0x2870f7b6584ed8db, 0x5b865889a51ac221, 0xc48bec3f1fb51b24, 0x221b7a0a04040567, 0xea1db24529ff5064, 0x1258c51e195e4518, 0x84789f760d2611c0, 0xff729a0328c4f026, 0xf600dfa2d51a3a17, 0xf90dc307cb46a03a, 0x9a7fdb17130b19d8, 0xbc52f4ea57b7260b, 0x40a6a8b285f3ab9e, 0xeb3cffe125e5ec4d, 0x7403e102ed00cedb, 0x73f6ef7ce2d178b7, 0xcffa6b38980c2e97, 0xd0e796c209ee19d2, 0x592bf15bd1da7c94, 0x39d26577581c4aac, 0x5396af489dd6bc53, 0x93258b2aa667f2e1, 0x848a94686c6f7296, 0x03e62afec9dee865, 0x07f2fd48c7715faa, 0xc15419583397837f, 0x672d8bce0e659a4e, 0x30773e75d88a6236, 0x87e89b73fd6b2338, 0x44b36eeaa3cf1782, 0x463715a899473e12, 0xacbbbf9ef34f1993, 0xe69201e06e0366bd, + 0x4bb133053a2711e8, 0x3d8a3aa545b44de0, 0x76c4052be97df9b4, 0x764d1f80780c0dc3, 0x2f857803d304866b, 0x6e4bcb1fe6dba6f0, 0x203bda623fffa785, 0x4d4ebd02bbfd90f0, 0x4bb68df8e27003ad, 0xa8f2c6e2fcdd7a3c, 0xd671f8629f1e6a49, 0x8c5bc906af678f51, 0xc15daa98abab5323, 0x5e452b96ea600fd3, 0x8639b76f2b8701d0, 0x38d0efba497d2ed2, 0xe58138b534ec6b00, 0xc2ae5081bea98827, 0x94804a7d23f42a72, 0x2aeb670b22f6b6bd, 0xf82c45c2f9056dcf, 0x90688fa9103a686d, 0x033d4d30d160e812, 0x882a3ece84fec7b2, 0x3e6a772e2759e4da, 0x5e8c67943a040727, 0x32d55a6250431795, 0x7fc3e1139a64263d, 0xe43b8cc338035f25, 0x2dc5cf5c635e6b83, 0xa28357ae64955e46, 0xdd5be08f32c7243d, 0xe444c100eab4a18a, 0x879f71ed16556a1f, 0x4946e311697b872c, 0x3b03ec5646dc6737, 0x50dfa7300f6d9cc4, 0x8e7f48c57f42e905, 0x3649232984345f09, 0x8f8455e58304e686, 0x1ddecfecdd046180, 0x3bc6a932474b2a09, 0x350c7f543f5ccce4, 0x657e3a0eb2152346, 0xf71988c12b0bcd16, 0xa3e5210ed52837b5, 0x1cc15b50de742d38, 0x6d951d94d09d05e0, 0x0b62b88308358306, 0x7d8d89a552fc7b2c, 0x2ca923216a4670b5, 0x9b9ed6833377a5c8, + }, + { + 0xbb80ca3eebdae7b4, 0xf5fc0d7464541a53, 0x9a2c38654912cf7a, 0x021a17fd20db7bfd, 0xbc058265765c6a1d, 0x8b50b42412f8dd1e, 0x61dac7b7556a005f, 0x0df84fd583671469, 0x58165564a89bf07c, 0xff19c3a56cfe3267, 0x858ab38bb08616d3, 0x645f43110df8c740, 0x30348b0389c8d7c9, 0xf7d9a363581d8eaa, 0x671246f994cd2296, 0xa806a2677b012b0a, 0xa3c10c4870db951c, 0x56034551fe978bc9, 0xb06ee3c60f36cb7e, 0x632d0d010f3dc94d, 0x75d975398748a7c2, 0x6b90477488a987b5, 0x9fe5b16871658519, 0xf04888c6a874558a, 0xb138a4d0d84d3cab, 0xb11a09eff6ff47cc, 0x4eede1a796b9f4b0, 0xbb484f86d18aaecf, 0x2a30f47cfb79fa2c, 0x81ae01d95ac19546, 0x994abf9277a54039, 0x8ccdf00781ccd895, 0x7a0f04ea61661d2e, 0x89c3a67131ccc7d7, 0x3c45517546a7ba31, 0x22fd6f368fb15fa9, 0x9de7fbe2b23b406c, 0x9c781d12f148508a, 0xc3a45b7d9f3b9a66, 0xdc9e5ffdfc3dd94f, 0x2e7571001e32d2c1, 0x50e37ff45132e76c, 0x470f8344ec798a14, 0x4935da7cd2ab3c1d, 0xbae60625dbb8865a, 0x17c9776beba8739b, 0x43639b7937f12895, 0x6be16198b6f962c3, 0x4d91d6ef47a9a3db, 0x2dbdead3f22822f2, 0x3c81b7f0cfaaba7f, 0xef3a37046d27f6f3, 0x31d68e3a049ac326, 0xa8c44e710a99aa40, 0x93be20d0a0572ffe, 0xa38e5189e299539d, 0x3bee2001ad51ba22, 0x46edbadd327d48d7, 0xba8bfd9e4105d214, 0xb60dae7c54d82759, 0x7d93ed61474ac119, 0xfe57a9875ef3388c, 0xf27d7420dbc63872, 0x5f026dd089f44ca7, 0x04ccb7959ff3d70e, 0xf1c48fb27f2396ce, 0x9be866e8a8598eda, 0x6ac8d846c3e15a03, 0xf67e5ccd61c63b36, 0xdf30033839e8d09b, 0xfc1af6737d5bd799, 0xd670eba2d160fb3a, 0xe2e38d82c480922d, 0xd9c110c0b7454bb7, 0xcdd114994b88c8b4, 0x99a7cf833cec3774, 0x66f2e51c71fa8474, 0x5ab5e8bc8b4b961c, 0x8079e6a7a2c87c6b, 0x346759d7e0e87e26, 0x3afb97b58da05ee7, 0x29c3b79b60a81743, 0x673a121ba778462b, 0x58bb6651c3676e58, 0x21ca8f3b3717e87a, 0x48eb7f1e72e2d6fb, 0xf1fc8baf3eacf652, 0x6b60026b8bc860ef, 0x8d63de031fa90638, 0x1e5e8d6237d49d97, 0x38136b31c0b6215d, 0xe4577bee2ba3ac08, 0x82f23249ef3f3240, 0xfa7d83521c2cd147, 0x0b0c9b7d0a3e865e, 0xf91c445ceb6d8de8, 0x20c4aad83cc1588a, 0xfa18db09e7aa57b0, 0x9462bde17785da6b, 0x58de5861f9e1e0f0, 0xe1ea5249d05bc6b9, 0x64122980de6a88dd, 0x2dbf98533c8dda27, 0xf4a3f494cbeb0826, 0x0da98b56ec88bb70, 0x0f3023729baf8a54, 0x2de585c4fbd9726b, 0x2e75bbaea4864189, 0xd882334004de7a85, 0xb2902adfd01a3826, 0x97c3aa5b950b920f, 0x46842894ea9be2b1, 0x21eca237fe98a7ad, 0x3b1b381c09d5fde3, 0xcd80bbf3dc0a4f51, 0x81a22e80d737c423, 0xdfa4b9c3efa2690c, 0xb6640950f3512262, 0x8ab28a948a71fd7f, 0x1dcc9fa50918eae2, 0x2fcddc6cb9c448d8, 0x2af05f8c76f15e5b, 0xcd239ecc0d4ab1c2, 0x842916ee4c7bc90c, 0xa0e0067d3a2ca83e, 0x9c057b0a000c604e, 0xd66eaba1537d6547, 0x0fe6b8cfc9d6b2db, 0x7bca27e7f4463505, 0x795772f9d573c8de, 0xe7bd9d26f2c5a659, 0xc647ade7c3e886e1, 0x555b27d9e409c407, 0xbc92740673659089, 0x9937bc604b77b522, 0xecce084bccc0c015, 0xf040a0322db51be2, 0x48774313fa139741, 0xb0ef318171f2b231, 0xe1a8325d453addcf, 0xcff3ab63cf4e5300, 0x53d93408ab26653e, 0xb62ec45defb84ad3, 0xefa0678ac0ae466f, 0x3b77863961b7dd21, 0x9494470fdb1023d1, 0x7fc8a6630e395ffc, 0x34b2823c1fed2f01, 0x52bac1ec78029fc6, 0xb5b3dc553d87f40c, 0x8123455bf05c58d6, 0x99b48302e79f7585, 0x13599a21e6e5dbc6, 0xfa9ff5b4d2450b6e, 0xfeeff34ef2cec325, 0xd06b665f50c684a8, 0xd79c8e679afe4e42, 0x396e4fa2fd3d0219, 0x2470437d8c870bc1, 0xc409103bdac24398, 0x716685e54881c123, 0xa682b9ee57ceaba4, 0x5b072e58695c9d2b, 0x10bc4ff5df48b7f4, 0xf34e0ebbedb97531, 0x67b217d3fef4a126, 0xdebd2bfbb4d93189, 0xac02afd9ed15866d, 0x58b5a2be17103744, 0x52d898777aa0eb3f, 0x5ffc2287b414c08d, 0xcc4b3bd481c388b9, 0x9178a0523ce86cf3, 0x4052d981085790f6, 0x9dcc9bf08a7c81d1, 0x63c090d225c1ca65, 0x10f5fd1d5c89636f, 0x86fbfb7d0d9fe33d, 0xbf0ce7f29378ada3, 0x285b12f15fca3646, 0x48f4bb45a0ac2d95, 0xd03da469351ed891, 0x6445027b3770e1df, 0x619121108e91a7e5, 0xae25db3c091700f8, 0xa420a3820bce4cb3, 0xac925ff9d73c8aeb, 0x938a9d2d71e5de1b, 0xb117d661029ee7c3, 0xd26c8298488fe9a5, 0xaaa6efe17a616f72, 0x0d762246d5447e63, 0x8ca2e2259cb0807f, 0xd4ee85540367fde5, 0xf48c06b4576464ca, 0x8939ce11f242d079, 0x61f661397ee42812, 0xb9c933b237d256eb, 0xef6462b82accd495, 0xc841b19f709ee355, 0x40a83507a842a821, 0x81ebbef507433d5d, 0xdbf8e966e48b8425, 0x6fe079d5474e7efe, + 0x95164bf3a6925ba4, 0xc606b1562c361bb6, 0x5e4478e57790321a, 0x72681d0c09b894d9, 0xa76b0fba11901df2, 0x31440946e0469413, 0xc007a32eb76038c7, 0xab2153b29a4f0afc, 0x1f260a34d801d133, 0xd478c19f40b0bc11, 0xbd507cd60448b636, 0x8bda5189b7e59cf5, 0xffe796e29958ea74, 0xc4497c21ed10d1f6, 0x0969bce43ac75030, 0xcfc56de77cb6a984, 0xc562800010f354eb, 0xd5412ac41f5e7a68, 0x3adeb5267c1c4c5c, 0xe4f9374056ed7da6, 0xc0145376822450fa, 0xb49b18b4d61d9c87, 0xffef71bf89364602, 0x3eae710f3dc5a3a7, 0xa3d8d45b2acbeee2, 0xe0629b6961ad0ae1, 0x7cbdd9e4aed684c3, 0xad7465e6350cf367, 0x4bb75782cd44f10e, 0x0b779338049be08b, 0x9f4d62c6a7f950e5, 0x7b77447b20b2c5c9, 0x1c202fb8a66a3b97, 0x6a42dbcbda5bd100, 0x30092bd58ff3f2b5, 0x4932990285689a17, 0x4eb3bf0664008056, 0x7349d0f71c402501, 0x1ac5c7890be1648f, 0x804e58480e1d9f03, 0x7745715195b33cc1, 0x7acaab2ae047de17, 0xbef967dd731932e8, 0xf39b36adf14f5f39, 0x54de75433d72679d, 0xa024427954257afc, 0xdc1f2602b79f60f6, 0x6945f75ca9b85afd, 0x79be4d5842f6e76c, 0x8587b10172ed4972, 0xfd94c25d96f769fb, 0x58fc9b5d7e109c27, + }, + { + 0xa88a7951f6af7c26, 0x854223da3e20c283, 0x2b2e5c4b70cfae4c, 0x63d43562ba946eec, 0x3a222d1e4bd67ede, 0xecd349cc5df57d11, 0xd8813655f95d202b, 0x8da9c54f840b6f23, 0xe19c356b4c7b0e4b, 0x33f801964d3e714d, 0x35ec2635f57d0e59, 0x2c9ad2755c85c608, 0xcd9005585557a085, 0xaf5a46b900bc2133, 0x9586a1d04597e820, 0x092aa13847e86510, 0x255145c434b7e9ed, 0x3be538ef4cd81013, 0x75c1a51b0c0a12af, 0x97c6bc4285339205, 0x71527e929440d1a8, 0xd89efb27b6632cc3, 0xe37e45bcf5418690, 0x9c19764bdb37ef75, 0xed923b87b16de861, 0x285c43a3fae7fd2c, 0xbda2e10ae12bf7ac, 0xf1d3e73d1c39c17f, 0x5f476ec09a2b58c9, 0x9ed9986bc0418584, 0x428210cdf58a1cb6, 0x99445397fabf0c25, 0xca1937c189d93e58, 0x16fd348ffd5d396a, 0x818f411019500b44, 0x8a950a743d53ad01, 0xccc6eea71c3bdea5, 0xd4c55e5e176b9c4a, 0x3220310c80c91a0c, 0xbc91c8af3025a7fd, 0xa52ac42dce9de1d7, 0xf1d40470602653c2, 0xa27709831970c604, 0xd9f77ac5ffa4546f, 0x33e08cda8037240f, 0x96291c5479dbb9c8, 0xcf93a6ec7a12e2aa, 0x3c414a99ace70849, 0x122e90df962e9ee4, 0xf29546a83900111b, 0xec5663205fbfcf62, 0xe54ba5b1804c55eb, 0x29a082609d1b4607, 0x159d3fcdb03a178f, 0x432d87c0f1810558, 0xd671f5b26b5d3965, 0x54ce81d17eb43632, 0xf82d6c60b41a7546, 0x1164d69b71895a9f, 0xe83730e7cf0d4fd5, 0x1ec8d8088556425a, 0x9fe70630541a2576, 0xd0b459959e7aa521, 0xb5f8fd1ceb0d643d, 0x3f264f978c5656e9, 0xf43dcafceba77ce3, 0x75cac4b48a08888c, 0x921d45dd4616f967, 0xc213d9e1ced5f9f1, 0x19663c87a2146214, 0x7c27f197147eff89, 0x7dc892acb09d55a8, 0x9e5229b1d98ceae3, 0x4edf950bd9d0bc8c, 0x4bae80af91b8f299, 0xd4033b0de084e625, 0x087bc700c8b74054, 0x28e1a48622969996, 0x7f7cd7de54d8b186, 0x88c3d303be96ab69, 0x9b45d7933cf40caa, 0x6df9872317ad2f89, 0x024a9ec77017d4e5, 0x165ba6c512af3185, 0xcf84b4c2e74de3f1, 0xbc697622ec5647ae, 0x706da3e4a61fe96f, 0xd9d3f9db778740f1, 0xf9c0e5eca2f2bcff, 0x2d524da481d9272e, 0x16bba40a6cce9ba5, 0x750e05ec675e93da, 0xdc93851adb541514, 0x9f1c7da1e981d778, 0x190070f1a5cf108f, 0x2c888733a270fae7, 0x39456e2ae70645ab, 0xd4c9d08cdcb1f71c, 0xc8196c614ca3e3c4, 0xd2b3cf7103fae0e9, 0x8836fd84df92bcc0, 0x6d50b0d36d72027b, 0xd11a6103e091d19b, 0x31b7b9817144abc1, 0x7f7052bea785c0f1, 0xe427d056c016e098, 0xde52125ca177b382, 0x97e2625bd4b40471, 0xcaac8129ff6244ea, 0xe2d1883196dc692a, 0x5b2b56d6cc7f1e5b, 0x6fcf8aa25135af49, 0xe6101fb2e7485b12, 0x43f699984ef3c842, 0x9063be433e05bb12, 0x3dc329422371eaa0, 0x599eb4840a097253, 0x89352561c10c16d8, 0x635bb8b0d0f2b10d, 0xd782844495ae23cb, 0xc3600266328f4a5d, 0x4abcc70311e5544a, 0xd7255c63db4e07f3, 0x39f379dcb004d6de, 0x82b2de870ad576b6, 0xf77baccb37f7a560, 0xe69c1c3b10f96c4e, 0xce668e8e4b8bdfb7, 0x5861502a49b34f17, 0x478844ec4a8d5d66, 0x29c8670c21feb8b1, 0x07b62ef8da3d3f98, 0x03198d5e29bb4811, 0x1d7cc509bc687944, 0x0f4bf147856e231b, 0x9bbf2c791c6f62d6, 0x97ea02cecb758f59, 0x519c16e96124ca95, 0x4590342c9e56d7e9, 0x6c3162803d692c2f, 0x77d690a788f2c008, 0x5b26afe0c406bcb0, 0xd2edea6ed5cbdea3, 0x23312eaddd21053e, 0x25b89ec08450bfb1, 0xdc6c41322241964c, 0x84b621796cddbc43, 0x7aa80d38b629966a, 0xfaddb1d7897daebf, 0x52c9251f7c37b125, 0x660c122e18c6a660, 0xed69ac30d66ce018, 0x417d46843cf3717a, 0x2eb3c3e35b5d50a2, 0x5236d099920e9c43, 0x82e41f78bb052814, 0xa6c70570b1dc8f20, 0x7c6c07e98c8192d2, 0xcfc74b2d5b86c5dc, 0xf1c4bebb6ea53836, 0xeee8de556fe348d8, 0xbeb43fa9f9ad4d1b, 0xd7bb5de4e32801ca, 0x331badb0d8fb1447, 0xcc484b71eb42660e, 0x08bb5bccd9b6cb79, 0x061a30335f58167a, 0x30ae0e1ee7d10f15, 0x0575c89117a048ac, 0x4cb57a8db1042199, 0xeb535a2899c5d90d, 0x6ccb63317da9b90e, 0xc2e045cc5a36ab33, 0xd72daa0318985a3d, 0xa83e48709485bcd3, 0x88bff618e9ce00e9, 0xd130f20674e94346, 0x9c604d925b7c78e9, 0x57f9630b7996c471, 0xf4167ed7bf51929d, 0xb47df98e06143ad1, 0xa91de782989a17a1, 0xfa450c2a983a516c, 0xd9f1ffc1142a974e, 0xb12fa960ef7acb7a, 0x9d1145c686991175, 0xc843bf8185df5cf5, 0x999f7f2a410af422, 0xdc14ac5eec660cf6, 0xa7305a02180595a1, 0xb026a76f4950433d, 0xaf56dbdf42def30a, 0xc9f77d35c81844d5, 0x3e3dbe0b889f855e, 0xb7c6251ff5793431, 0x29970f12adff286d, 0x0f4256a46c9509a6, 0x861398aa76312757, 0x80117a92346c98e8, 0xcb941de6d36d9a8d, 0xf96763bbf815159d, 0x9dee36d76883f2fa, 0xce293626a8588322, 0xf2cd528f36deb9fd, + 0xee498833047760ff, 0x1735ef925ff3d8c9, 0x900e8a7581ba1243, 0xee66bb7219040439, 0x6916ba9919ee8980, 0xa5bf86f79c70dbe2, 0x6a4d218937106d41, 0x75b536d8a0e5934f, 0x15bfc0732c3a95d8, 0x60d202befa86f934, 0x8fce130f3a4721ea, 0x1dd04bc6bcddfe7b, 0x6253416ae2d529ab, 0x7942ac94c61a1103, 0xe30727ae935ad303, 0x198c70f055a0e11b, 0xc02d61abd4e871f8, 0x2d7fa01655e098c7, 0x9a18702441c63e27, 0x89f16573478cacbe, 0xf61b4d689888d5ba, 0x05854fce331ed312, 0x25adcf465754d6c7, 0x70e46a973b538cb5, 0xa567e24814e5eadf, 0x91819099ee2f7f3e, 0xa3fd1834aedf96f0, 0xa66c001124586041, 0x1de1d70453fd3ffd, 0xf08f8c9a3e638f4d, 0x5e7d8f4f27e06fde, 0x753ef15506e33866, 0x70f4901b22561095, 0xbf657c8be01ac8f1, 0xe3de164e00ab04ea, 0x88fa9dacc90e5e8e, 0x807af1339e75e9b1, 0xc2051e7c2d63f73f, 0x2aec04cbe0b6122a, 0x1f75fa1370b3c282, 0x8408940d0d46a3ec, 0xa7f7bf86e49f72df, 0x41ee278d9e440b0c, 0xff2158d4506077ec, 0x577a7ead4560808c, 0x7528a71b079c5f6d, 0x5508b7bf4ee8a355, 0x36cb40725f579ddf, 0x6f3628b1c380efdc, 0x53603471e5bde573, 0xb64003bd645a150b, 0x057df07f11dfd440, + }, + { + 0x9a77c7345cda77e2, 0x1ca85a2de1696bd9, 0xa5d9f1910f778ee8, 0x0f0568887c6835c4, 0x24d690187d3653b4, 0x16910eb48bbdf5d0, 0x91ad593d66ec3534, 0x9c84391fd555b7ea, 0xb7fbb2192c63fe68, 0x7cfed94f758f1072, 0x18dcb3b59a47ebc5, 0xa55f240d78072f6e, 0xe9c6c21cca2f8688, 0xe19eac5f19e46ac1, 0xb2682eda034d9cac, 0xfe3158c2b0cccc30, 0xd4893a7d8dfcc06f, 0x45758e32476450ce, 0x566595a64c4095db, 0x1c4d3bdf1b7f3f6b, 0x5a4a224a87582225, 0x67b4874cfa50d87f, 0x4afa51637244ed08, 0x972730da8b35e3d8, 0xc69ccdcf7676fa8f, 0x38a300f1a694a5a0, 0x58e578aba836edd9, 0x66ed06828b3cec53, 0x90fb57d1165837e0, 0xf8a28b42413bf900, 0xef361c212eee9d10, 0x584b1ffa73cc8cfa, 0xcae9e0a934eb7d6d, 0x54167f5166af683e, 0x0c86f4cc8b19543c, 0x6e895e81dead892f, 0x4d3712e2ce5aade8, 0xc1f214e71386fc5f, 0x5a919420900ce0b1, 0xe0d695ae0e37816f, 0xf531bb6a312b2844, 0x2ed6482bf280f375, 0x6f2cc06de0ed8798, 0x67ac3ea472c443cd, 0xf78f10414e69031f, 0x64a6fe0d3752f133, 0xfc579f78ad9c5fa9, 0xff7a4136a5887609, 0x83e6fa63dd05fcfc, 0x68bfbd0be612a1c0, 0xca9425599a7540e9, 0x95726b8f12208486, 0x79044fd8de167316, 0xd7a9dd6654df09a0, 0x7c5e2c454fdd3efe, 0x987a944a6698f80a, 0x14180a87e1e47dc1, 0x6e20e89e26bde6a3, 0x4729dc95fa0662f9, 0xa821bba5ce926e50, 0x25fda875eb4a26fc, 0x420e8ab43d767572, 0xbd72b87e93afe4e0, 0xc613165495fb12dd, 0x6c911c526cebf7b3, 0xd5375557a5e06a20, 0x7827cec995f9a783, 0xaf5bc58a7a6256f9, 0xa804f99b2986c91a, 0x090093da8f2d134d, 0x23a07269e2b3bdc0, 0xa0d112abebc21ead, 0xea60ceb3baede59b, 0x8edcb89e1449ebd5, 0x027227159f41556a, 0x818a8f349b46f3ca, 0x53c2fe4592c6d0b7, 0xad4c079cdf7f0f8f, 0x29ca4e889b080e1c, 0x0b24ef9197d62236, 0x8407220fcb49ff43, 0xf1ec64ff67d2a53d, 0x3257f1ab7b151e38, 0x473dafcfc804d842, 0x4840a949d38ee2e3, 0xd545611202ed1527, 0x2629c7420b29415c, 0x98dfbf9765f495f8, 0xa89e3299b7ff0dd2, 0x0acdbaea06493258, 0xd9fc11c216a06144, 0xa742f8c6441ceaaf, 0xa9bb953a7f594f36, 0xa5d25771ab29777c, 0x07467df7ae8651b1, 0x761c1e03fcea8625, 0x4fc0ceb9103e332e, 0x194f9eb3126b3469, 0xaaf201319cba0588, 0xdd357625e56d8d4f, 0x4c59e1e05c9c6e3c, 0x5de60410b28490cd, 0xf7b5fca38dbe10e1, 0x3cc4669d484a0e58, 0xaf5e4a1497b92520, 0xaba9ae98f8eb01ed, 0x23dcb749536e6d96, 0x176cdcb765585dfd, 0x9fdcc03eb6cc8aee, 0x7ef90df8d70ac032, 0x869ea534767effef, 0x3192464580f307c9, 0x0f364ffd58da0220, 0x5241ceea28126c87, 0x93a33f579362d687, 0x0ba283ed8c936244, 0xdfeaef961188fc6a, 0xc5fd5d7d19be65aa, 0x6cf7691fe8b97941, 0xb098cfdce8f83ce3, 0x2d2efd8e86efc5fb, 0xc847895f32509250, 0x7d5a439ca9805332, 0x6c73f8404c1d1b78, 0x63537939023b3534, 0x8f8c41a3790edbba, 0xbc07c56e04f83c0a, 0xd7776d8ceaa173b2, 0xb0958a6df751ea82, 0x72a49d76e3fdaaaa, 0x9a8755ed0d97c66a, 0xcc0212498aa9cf50, 0x49e15b32e397894c, 0xe7c9c8e6bbd3da89, 0x10320696fd4d50ca, 0x2e8e5e50b61234de, 0x65c4cba41a7c3d6c, 0x611009b13d54d04f, 0xf8a3147d1f5f8703, 0xa5e55f0497be92f0, 0x40972e0f332a88ce, 0x993e6b327b8b1b75, 0x3106bd73d7354afb, 0x38d21d37d5a32391, 0x23f2e73b6b532c54, 0xaa59ee2a4c0c0ae4, 0xa872464eebe07296, 0xe17597ea6d64ca1e, 0x7e81473b38c3a278, 0xfe779897a3a0817c, 0x6d39781d430c4199, 0x32f38244bdf00c87, 0x9170f5844adc6a17, 0xe7702538eab72626, 0xfc59dcf970709ec3, 0x4f5a5b877dffbb7e, 0x522bb999b577b0ae, 0x2f88f8601b6f03ec, 0x9359cf049c509223, 0xfbc59ca041039433, 0x0a130f79dc2c18dd, 0x2828b4b5c02cacac, 0xd323880c43c9088f, 0xa9d0fe1a5b95c24c, 0x4709d409107ce76b, 0xe3a966ae902a7db8, 0xe2d8b08e6ce7a27b, 0x87342131b457b8a2, 0xec10987c7b4e5237, 0x0686be69892b3d8b, 0xa10e34f060579ac4, 0x25b4f4d8893ef395, 0xfdf80694a47c1318, 0x4a7aef81eb0f0ccc, 0x4cdd7f1f2e26765c, 0xcdcd19799d02f601, 0x2a73302b9a783cec, 0x41c90bcd5a4048a5, 0x903cbaa13552c646, 0xf21e5360d91f720c, 0x61eb5b8837518aea, 0xc329fc22f184568c, 0x8c7bae6e28c5a811, 0x487b2e663c332db1, 0xcfe6e9d0990c269c, 0x2d470bff7ee5ba04, 0xdf7a75e3b806df45, 0xaec2713615ccfc13, 0xe9141f72150dda5f, 0xa43273d143e08a43, 0xe99cfbfa3c6c6ad5, 0x9c79062ab5592dcf, 0x4df4a40c0f04e044, 0x52dfa998e2dcd87a, 0x747314f727da3567, 0x5514e3fa427ea9cc, 0x4da2a99d17b80a97, 0x1d399dae1e0500f7, 0x48c22762a4b945c2, 0x90cc863a18f4d095, 0xfbc1d454dc9bd7a9, 0x5f20c7f4035e7272, 0x44169fc6292aa860, 0x8bfa97163371ffad, + 0x0e4293b569cb4d08, 0xb859b978360af10a, 0x07f6a9aab3b807c8, 0x010aaf41927d14ee, 0xd79589856a744970, 0x6baf36d0195c5065, 0xb810cc0627c17bda, 0x53a7dac8761bfde4, 0x4f754280adde73a9, 0xc4220c627d177648, 0xa5b40676ec727b56, 0x188beac8841560f9, 0x5efc63712cb61fcc, 0xe08979b6232ed50c, 0xcc3cb06cd0d7bebd, 0x5d3aba8695f9b103, 0x8b585f9d522fa83a, 0xaf7abb7baf0a4de8, 0xc1485c2ad8193e3a, 0x920d19b1f34ff0c5, 0xda68cfd7d17036ae, 0xa4bf1ca38d152d89, 0xb7f8901716ce010b, 0xa07214f75395d901, 0x752d62b076fd1fd2, 0x997e7d2bbc6fb233, 0x32c2642bf5bba727, 0xb7565ca330a2f23a, 0xcf30d62aa921e747, 0xc35e14e2fe9d2f9b, 0xf041eb4dce789e7f, 0x1ede4e7bb4ef9106, 0x4c7037fd27336b12, 0xb3cc7c62a252d53f, 0x4eaa8a8db5134ba5, 0x386609a59b8caad9, 0x24572e5c57a6a540, 0x952f057e75b2d9ea, 0xc451a53b0896ad06, 0xced825ff76147b56, 0x157888dbbff3c714, 0xfe327864760f6a02, 0xe14812fbf2c9f4bd, 0x2681e1b1ee53bae9, 0x9cd66fd424ab5257, 0x2d75400927ec4c76, 0x99f40c24efe79cce, 0x76cdc64580b62737, 0xf10725bd0cfe4778, 0x77fb36ae946625df, 0x77ef10083f683fd0, 0x05eeb4a1ef54449e, + }, + { + 0x2a56217db4e684e9, 0xefd9be7c8ed05934, 0xd5bffad1bd8f125c, 0x03fb5363e1edfb14, 0x1cc6cc64c4d0ae1f, 0x0a42031ee4292ddc, 0xf301f9059c9f18df, 0x1af5471bd5244a32, 0x7c7ea2e05b9caf0d, 0xfd14b6b8f328dbbc, 0x3c8434c59f2ac51c, 0xb2c4539718146cf3, 0x7c57e402dfa9d30b, 0xe32ea9139bbaa8fb, 0xec7fe2183e1047e1, 0x8eb981ad72a62dd6, 0x433a2771754ec560, 0x5b4c387fe5449a87, 0x25090e65b33c7fa5, 0xfc479b37a179ebb8, 0xd4bdfa34464c1ef3, 0x5e561efcb0eed040, 0x39a48202df8f4c7f, 0x598f1a20ab01585e, 0xaa2d4a27ec04a943, 0xf8c313551fe9b622, 0x4ae1ceea76c17a7c, 0x6fe875a68dcc86e2, 0x447ad01c13e542c1, 0xe400f20550810995, 0x96d49f014cd98fca, 0x5ed385299c7b4dfe, 0xf76b155e53afbfeb, 0x5e04d2ee1866a1d3, 0x7f2947d0cc9fbdaf, 0x32cd48c6924917b2, 0xeda920681759dac8, 0xf128a276a5875d34, 0x7b61d4508840d642, 0x56fcc9b9ec0c5b19, 0x286ee601e0677a6b, 0xc2d38be64e18d90e, 0x97b0f73b230f6c6b, 0xe51c164458c48dab, 0x5e8c90d219b3f05a, 0xd4f9042b2a886a9c, 0x4973f70976bec492, 0x8d125fc3576e1f4a, 0x7d04238d15b03dbc, 0x1ad3e0fb8cbf01ac, 0x552889b6f89b226f, 0xd3be2ccfe71bad98, 0x194c18a44225502b, 0x3c1342293f7d8758, 0x3c55a71842d822e7, 0x429ef302612a85f5, 0x8778fef06d83323c, 0xd4a6dccde826dc6f, 0xd08961f8bcd0aae7, 0x8f7bddf23e6e5943, 0x336b311a93c6c5e1, 0x0ca66bd597df1ea0, 0x305b2bd1379da391, 0x44ba8703ddaa9264, 0x19df8550c98bb110, 0x654e939254612508, 0x86c299ab6ab25a0e, 0x7b0890ae521e8533, 0xbc43e5ab2fe50a30, 0xd92ea375251cc568, 0x148e8f2917940c46, 0x6cd9dc6ff544fe7e, 0x8b1e28ab642e561f, 0x660776023bc2cf22, 0x34c2dfa5b20f690e, 0x8696dcd5d31e8443, 0xcc4fab161a9769f9, 0x1666e5268191f4b8, 0x190f9860f9715459, 0x9b96062d8ace3903, 0xf9769277ef1e35cc, 0x84da71550dd5e12e, 0x28e9114a9d82f629, 0xf0123e1a100c2b32, 0xca7b2c16287ff884, 0x9e033549734d526c, 0x1047bdb6d289b437, 0x7d5e90dbb8dbfdb8, 0xe7f5db555bea587a, 0xe0813e5683b7c932, 0x7f0cf9dec9364053, 0x4b51e815d18ba7b0, 0x5442aae2b67f3f75, 0x3e016e48f53685a7, 0x418b19bf6b7dae9a, 0xa5cd71e10d2b07bf, 0x77910d9f7ea5986f, 0xbca898a323103afb, 0x9a1a705c170bc1c6, 0xd3af2645987bf970, 0x01e992f0723bf52f, 0x587600e55581ac01, 0x67d16733b2effc05, 0x4d9b139f2edbb511, 0x7254a7b70ccbd629, 0xeb34ca5036cbdca7, 0xef01c6006ea8deb2, 0x52825250d2fbae30, 0x783058f42afbe1d5, 0x5c8777aa43452402, 0xfadb9609e3097035, 0x26a60ccf9c9a6bcc, 0x9c0f764a411520a8, 0xa452a6ef30600db1, 0x07ff2a1a7dd635b7, 0x7421a0fccb49019a, 0xcd366f636226d1a9, 0xc3789659bc65500b, 0x7eadf2fc78431397, 0x39ac21bfaa8fb1c1, 0x1bd1044a1056e136, 0xd8d03bf161c45d8b, 0xa511107ae70ef91f, 0x4578577bf3401ad7, 0x7c747dd3185ac6f9, 0xae0f70b1e3d09eaf, 0x34315f4df64ec30f, 0x18b14e9991d7e75d, 0x2fb793a55cc3d6a1, 0xdeec732db958e157, 0x14822e15ce378be5, 0xa7890eb4399904ff, 0x03635ac694453df4, 0x3db6ebf58882a657, 0xb48e4695b2ba4450, 0xa3737c721d865244, 0x02d14362965a4abf, 0xff08ef4806d880aa, 0x75325bbce2624d55, 0x25c08941a17f15a1, 0x5a9bda82aedf1631, 0x86a6454b0ad89de0, 0x3431e81e69f3272f, 0xedd40f8308cf1760, 0xe02e37d2a28bf538, 0xe9a937eef9393b02, 0x1624ce92539df4e8, 0xabd1b62b1f30ee74, 0xa9cbcba7fa08005f, 0x0cb2ef53a66f43e9, 0x9e4380060bca9250, 0x8d0e1a93db1ce300, 0x38c355289c9e2599, 0x505e684e514832c3, 0x4a2e806b8d273941, 0x9cbeddcbffbe7c68, 0xdc5679abed54d763, 0x415002250f8db2f2, 0x7068cc805ee3fcc2, 0x331e549068e34679, 0x2cf7b17f7c1c1429, 0xf56b5b8e160e6f39, 0xa1a52ce0472d370a, 0xa019766ba1516e03, 0x50d65e1a44c81bc7, 0x2b821396f26b4f8b, 0xca68a52ad5b4d3ee, 0x5b8c38f8751ed2a1, 0x5d7f679a79227e10, 0x554296b41e0465aa, 0x9c93098b0649659b, 0x6e4b0c5f0b38c0f0, 0xb98a0ed0d12d0683, 0x3df67a148a059c8b, 0xc540796f70d1da65, 0x30e979d9a14cf535, 0x2a01c7abbdddcd67, 0x56b9828e1afab21a, 0x8ba914926bf7b789, 0x73ce0e23ec8277aa, 0x88946c2ed16236bb, 0x78b3f48c210ff713, 0x353f05a0cd499072, 0x4ca2b54469718a85, 0x7d49332ae3aa820c, 0xf91dc24e6b26d0a9, 0xa44f11be64887621, 0x350a66d62dcdc0ef, 0x0aef379c4bc78b26, 0x8db49dc3b772f90c, 0x1a6fb16f766f8569, 0xa5e6512c63882797, 0xd20a287e698666e4, 0x67368df4deee5bff, 0x4712556de85489d5, 0x9e7b838a28c71245, 0xe66f3915761df924, 0x451318769b9f2e7b, 0x7a3fdc9968ed3682, 0x6983aae7ce79736e, 0x38d4d5317189ddef, 0x599cf389921caf79, 0xc79bdbb20f0a655d, 0x4f8b4bcce704f85a, + 0xc348cd9a28c98ff6, 0x6e320be1b5a41d45, 0x8fef58da19bc2f6a, 0x9194b77af87e49e0, 0xc67e195b0c368ea6, 0xad14b1accc6c322f, 0x668645f2798545a7, 0xf6e30036843fcc30, 0x886410567bbc5d8f, 0x818d5b833ca5f60c, 0xafb2568c92411155, 0x7d14aaf154c7e21e, 0x3bc86219a3d8bbc7, 0xc10ebbc3b69e9412, 0xf7b5f7ff0c119182, 0x03bc3b8a327daa8f, 0xcba179fe94ffbabf, 0x59ab5d718f499bac, 0xae52c530c3d2ccd4, 0x9542aaa796d65f7b, 0x82676e2203703ed6, 0xd42ec1caa36c91a6, 0xf998d9cb425d1bea, 0x2ea9111019bfde4c, 0x47c73357f1537f18, 0xbecb28ccb3d5ad74, 0x2ee54b2939756235, 0x926750d275c4ca4a, 0xb0876ebdf17df92f, 0x7e46ab036486d51f, 0xf82281750609d41b, 0xb4bd4ce265f7acce, 0x964c14b31bc4ff70, 0x6d164994e041a402, 0xadfdaeb0d3f5ae7a, 0xce2165e87f4d6f83, 0x6847c6a461ecab8f, 0x81d0538a06450fa7, 0xa421f73ef5306975, 0xd5be7ce8e0cd329e, 0x7dba1cc002b8b151, 0xec22e7c23e5f55c8, 0x9c9d1fb4ec0e97e5, 0x49f970017912e3a0, 0xaed66e59557a741a, 0x0d0d16ee28d6c13d, 0x66af528b4dd156ba, 0xe14636d09a64c4c7, 0xd9aefe8a0b2b52bc, 0x52d78a74baf8f8db, 0x195318f6527513e3, 0xa3506be0fd193599, + }, + { + 0x693c954182b4741c, 0x68f2b504c79f50f4, 0x9ea2d3fcd31219be, 0xdeb379709610abaf, 0x252c789c065bc767, 0xd53f8b1079a53490, 0xf9a295c7237f72d4, 0x16b079440a1ee6e5, 0x95b90c538974ec37, 0x9f7e700f6115fc58, 0x226cae7b140ad1d5, 0x079694f207e3eeb5, 0xb5d9ca4428146a90, 0x602e940309e3812b, 0x9c997f99ee478ab5, 0x57ce949fa068ed62, 0x2bceddb522fb218e, 0xf6cda5f368302b3b, 0xbc3415845cb3f0ec, 0x6b6b6c1124c65f20, 0xa70c0cf3a07fddf2, 0xa82d3063e783ecee, 0xe45f2bcb8cc21ecf, 0x31a06bb1c2c4c87b, 0x10cb087ac4218670, 0xcee2cfc8aab38285, 0x32dc35d2c9e66a9c, 0x54d190bb546a7407, 0xab83af6298bfbd45, 0x3299f79be4d69bd5, 0x4232803bab2cbc3c, 0x365fc10f694dadc7, 0xab6461f35ca74fd7, 0x4d79db0109543f2d, 0xc20a65a40c1a7c75, 0xc480935ea03366f2, 0x69051ec1905745de, 0xc434caaf41d67fb4, 0x43600d4b75af4651, 0x26a0263f6670d3bf, 0x22a56bf53b14e42f, 0x27903ae759cd1bf0, 0x4d93a0ffe7823e59, 0x51ba7d675e503778, 0x31d1591bc39e1ee6, 0x47abcfb03f7fbe6a, 0xc374032ffbb2529d, 0xc947a9a6d22c8a77, 0x4cbdb8657757deb6, 0x3ddac2d6494105e6, 0x6a71d630068b6937, 0xe91d52f7c517c4a0, 0xca5b5b34e3d39a30, 0xe85aebe2a54f3b0c, 0xa6c6e4855b9bc019, 0x180684b73cf3bf1c, 0x899c91feca383c61, 0x2a86d2bbc21d072c, 0xe360fc3e5090918e, 0x7fe7617c889df4cd, 0xf623d4c6855984bc, 0x853e73111dd8b7a1, 0x44019810ef8f4e5d, 0xa3a3da1cb9b0d365, 0x623d252bfad4920e, 0xd0a7e63d2c3c1716, 0x0ba0707098019a41, 0x5e53c2e2c983c23e, 0x450b52be3d49d69e, 0x9ab447f195a55292, 0x102d78a093d7f1df, 0x3f7c94cf01499b19, 0x33e76d65080e3507, 0x8359da72871602eb, 0x5ef38d12d198cd49, 0x086093b0a719e03e, 0x79d43fc327975daa, 0x40603f81e5322103, 0xa3d0c309f83d6668, 0x7bd49ef8dab4bf13, 0xe8c42b598fbc95d0, 0x40e3f510fd4ee26f, 0xfc2336b4a41d7551, 0x4f05c2ce8cfdec8e, 0xac2751b38bea1d1c, 0xe144cb59ecf184ef, 0x2d9b520a145c8c16, 0x5406f27989bc96f6, 0x23852a7bae978b47, 0xd524b42073f547c0, 0x576b9e7e58ceb7bc, 0xd9fa306c26bc5f59, 0x98fb2ccfdb313b82, 0xdd9af8268276b52e, 0x0ceb16a78c1976ce, 0x36af4961f8495a94, 0x73806309402da06b, 0x95039f7c76076df2, 0x6f7e82fae9851c79, 0x109333447490d749, 0x1f7b22431e0def0f, 0x7dc4611f05707f17, 0x5813730f34eefad7, 0xdb1fcb04572ae4a2, 0x407d37ae2379c94d, 0x4954946ac085f469, 0xf458acbf19e6c1dc, 0x2be788825f25be5c, 0xb0a0c5df6f9288f4, 0x6ea1bbd73d1ae82e, 0x6d5e97db179b28b9, 0x75316e71e46cd0e8, 0x45e01681319d4af7, 0x6040c6b875672aac, 0x7410ff82c09dcd91, 0x7d0089bcb5a48794, 0xa523a1c12fa0802c, 0xc706705b526a1e20, 0xd9f04815c0a6456c, 0x5f4636135077785e, 0x739dc5f1763648ba, 0x7904fcb8dd9bc1f4, 0x1a0ada96d0e5c541, 0x536030bc09131cb2, 0x5ca7a3fd6cd28982, 0x5a547f3cd3550cfe, 0x2ba4bb1c218f771f, 0x0ca35e7f151cf0c9, 0x7df42783cbb3c2a1, 0x6e595392af3971a3, 0x58cec5b3c93fd809, 0xe0542bc9c4bf2efc, 0x0ed113ff0880017c, 0xcb83af5016ca1a5c, 0xe6bcdf6f4858fca3, 0xc62a665e28b71345, 0x7a54581d47c2c867, 0x4caad9fc4b10e1f5, 0x40f2f726071d98d5, 0xc2359aa4ed087f16, 0x9b9aec929bc2c626, 0xd8fd364849d25a77, 0x8c0c8dcb6f8737cc, 0x94a189e5e3927e4f, 0x27f8743006e6c34e, 0xd5a7ee0aa548f683, 0x063e2b21d7d094e9, 0xd4213f38104a5537, 0x71b6218a8230c5ba, 0x10b229265323b4d2, 0x22234374a2734482, 0x569bb9d4b9a86b85, 0xaab0651b418d3b46, 0x8571f8d5871bbf1a, 0x48f130a098213091, 0xdf03437620ff0b3b, 0x3cecf68a577637e7, 0x6a696cfe69915e8b, 0x8dbeb76a195c4bce, 0x035186a897f2a454, 0xfc2c666ace71b74d, 0xd8eb7d118a1f8f80, 0x83047174cd5de1e4, 0x23ba618cb482fa3d, 0x26898e552ea4231b, 0xc04fe13b89da5b34, 0x0cfe71a23468a6ac, 0x58cafe5f25162c0b, 0xdcd2af6d1599e02f, 0x7935c18e94667b84, 0x11816440f6daf103, 0xdb45ed1052ac7f5a, 0x7f800876907b2cf2, 0x47ad23232c79a575, 0x31c14a166b1ecfa1, 0x2016835b15bc7dcb, 0xe36e6f0dc3163bf7, 0x8ac4fd23c1434c1e, 0xea8658a15b3dc7fe, 0x9e097194ae34823a, 0x4c512342a1df82f3, 0xbc466d229b632dda, 0x6f58bf666deb6ac1, 0x1cf0ce404ac53c42, 0x0d7b776466bf4144, 0xd11ec613cb7fd08e, 0xb41380a877ab9a37, 0x0c3f31d6ca1f15da, 0x5c4367d3b7153bb0, 0x008f82043cdb673b, 0xcbc376c830250dfa, 0xd69657607aa62bf1, 0x76c76e0eb1d2e2a9, 0xbda67585c841a49a, 0x935a6956f82ea2d4, 0xf2ca4947064cdf9a, 0x394ae4a2cd6c5e31, 0xffc5b5acf2dd77fd, 0xd2c1e4b30eb836e1, 0xa26050157ce432b6, 0xb4118e6f65668938, 0x4ba5e3cedc2f33b9, 0x5320d4d82a7f3a52, 0x6500f53bfe4e40d4, + 0x74b48ff4c216ff96, 0x24c60a293dc8ea12, 0x8be1ac3d6efc61ae, 0x467684a7fdae0f6f, 0x8fe8c9a92a7f547b, 0x7824e120587a07b1, 0x2fcec2a5b63c3bf4, 0x1b73d74a5e67ba18, 0xb4581385dc6d258e, 0xf45e65a2291cca42, 0xce06c8be6f931f25, 0x83256e283e8982f7, 0xb9ae8d52823e0688, 0x6dbd2c9b6581a333, 0x84a84ee825e9ebab, 0x512149c44e3a5fa5, 0x4080391afd375a5e, 0x1b56667fcc708c58, 0x758f5051d80f4990, 0x3c7252fd2f439ab6, 0x22c150a13f828513, 0xfb4e2a09669176d2, 0x3762920064169341, 0xc78b23529c6bd59d, 0x76a6d00007ce11f8, 0x1ffd518cc0483314, 0x20a6c708a2ec7bb3, 0x24b4ddd0f6d1b755, 0x298018f86e982755, 0xb0f82e23a1e85822, 0xecac046a868165c2, 0x5fdf358d794a07c7, 0xb72398853a968370, 0x7418df33c3ff125e, 0x172bcb5300b3aab7, 0x2a4048baec8aeabe, 0x7ea98016f7c85ec1, 0x1afc507dc66113a8, 0xde2cbcb467b19ba1, 0xf5a60fe30f9e61e5, 0x25cccf868b6b0e3b, 0xce8a8992473f0d92, 0x2bed9615c305de79, 0x99cd4a3a30b13dcd, 0x264a0526e87720ef, 0x7c7b33cb6639c9af, 0x8b19555ad810fc7c, 0xdac5e39d6f01a264, 0x6fabe6f54bfe61cf, 0xee542526eaea7792, 0xf7feffe02cab8d9f, 0xc21130a67aaf401f, + }, + { + 0x8c9519953a0631c2, 0x865d637bb43b22be, 0xacb65a491f886c05, 0xfc4d38f8192d9757, 0x8d395f9f6dc42f0c, 0x53087dcadb04465e, 0x5a986f1d06d0fdd7, 0x60ecef2322d82ca6, 0xecb5726c2d321cf0, 0xc35d5a4bef2702b1, 0x5dd2b609c322b708, 0xbcf3b95dc3d729ca, 0x1d9170b9e1453366, 0x186553051a4e25be, 0x2a53d48fb82f77ee, 0xf46c760a61c999c1, 0xd0cc0a9782d8fb6c, 0x527f4ba4e3b5aeaf, 0x4bbe8f93317c3443, 0x045620b59ed19311, 0xc7b0c55124f293df, 0x4109b240dd664668, 0xe3eb86d84935282e, 0xdb084f7c80268067, 0x77453a7266c1d524, 0x64f313320afdd17e, 0x8bae4a0bda3e3e66, 0x2de67df4d33aa930, 0xa3068a663be947d2, 0xcea196429334afa7, 0xe7e0cea87cfab510, 0x741c10a48562fa44, 0x14494d5a04a6c202, 0x40e7a06890d50be4, 0xe1aa5f52250a65b5, 0xf4a25f6b7e5a6194, 0x565c00e7636c7c52, 0xf75c7fb672be9b3f, 0xe6afa72a659ee1bf, 0x6b64f6e131206bbc, 0xc890512940bbd56f, 0x2534086dc1a69681, 0xb00843f54690b56e, 0xcc5516083f0bdb0c, 0xa95c2e34fdc988c9, 0x849b826becbbf7f3, 0xebeb852f8b802332, 0x961f2b23e86a263c, 0xd72a88270464d6f2, 0x6763243e613eeff2, 0x254cdfdd48b072a1, 0xac3ab9855e94f5f0, 0x9fb7af5dbfd5dbb9, 0xc94e6163f1c0a8cf, 0xf288005dd9ade2e1, 0x87ef56d822a9de2d, 0x8ecab7bed5a7e85e, 0x83ea1bcff015e925, 0x1271137d38e2ff89, 0xa27a077e369d6a32, 0xb9f8913c07ce52b7, 0x5fe99b17468419b0, 0x9fdd39945a89b502, 0x794bc51777290510, 0xe852021031f3314c, 0xf67cff6fd964bac3, 0x7ac582022256c0c0, 0x77604f6943584c22, 0x323a2ce1c1306628, 0x08dd88c98350de11, 0xb8342e4f577818ca, 0xa5bc1d61a6d047c1, 0xddaa89ea44bbbf88, 0xc1a542d3e1620265, 0x8b764ba499a45119, 0x22d9c1904111885d, 0x101ae7d9ebba120f, 0x82ca6f603e96e10e, 0xd05317bd6f339e88, 0x54a4848959d20898, 0x00b0acad87d94f8e, 0xf2ab9bac6fdc358c, 0x95ca172cb6bf18f7, 0x08291eaf145b6f9c, 0xa485afdec21bf027, 0x2c25fdf6dc219361, 0x1a5318cefb7c2036, 0xcfcfafedd3ab62d8, 0x4c7ed76ef4b8ccd6, 0x473466ac0ac16385, 0x2c04553a07032b8a, 0xd31e4a32538843c7, 0x12dd65e138f6644d, 0x161130caf6577e8b, 0x63e5b4ff2c5441b1, 0xa8b0a84d06a58ed6, 0x125dac5910d5ea2b, 0xa97c12ae44459255, 0xb3cc802562a5fd6c, 0x4409c1575626adaa, 0xa067d92c8e8b8dbb, 0xfededf949bad949a, 0xb9d172a91a3a9009, 0x2ec5d64517692699, 0xc8412695f56eb641, 0x7ad115e4cb00eddd, 0x32c2242ed438b420, 0xa429ceede7138969, 0x7f6db9822cf384e9, 0x2dc39b0bca1f2932, 0xde92a487585eaca6, 0x87c87d0858a70e1e, 0xd2419508213e36f4, 0x18bbfbb774311ea8, 0xb625e058422964c0, 0x4334b1e764f683ad, 0xde817e4a6a1f7368, 0x39329302a8c2c2a9, 0xaa4c1e6c6f785843, 0x8dc7ef86d9d2d0f7, 0x597965f6f249653a, 0xff346827822aa645, 0x368a3637d29d39f2, 0x93775a1b92fc4b06, 0x310b2ad79909ac04, 0x689a60e616b90265, 0x85e4b485dab67c13, 0xd90f3f8b9d54d5d5, 0x7e14be6743d94267, 0x48faebe7430aef01, 0xae5b11c885ecdfb5, 0x52eb6c5cef5587c3, 0x17023e5091ba5663, 0x5bdd13b983a987aa, 0x8a398958b5466a69, 0x6dc644518b81ab09, 0xfb4bb0dd2d533832, 0x1d4baa7ded0c80ed, 0x97d94a33f3f1dc18, 0x4eaa82471d6d2466, 0xdc80226d2e5a87b8, 0x6e7946ed519df314, 0x5e78f110eb7b9c3d, 0xae1445dc0b05b119, 0xaf3a2b4ad6a7e4f3, 0x2b3fab4aff638a6f, 0x482ee0a0ee944717, 0x6c638acb12e6ef9a, 0xf59ffb896ccd4720, 0x4c3e1c2d1a151201, 0xb6f9b34cec313119, 0x4c44261e36facdd5, 0xc59d9c212c3ea06c, 0x9388664dc1d30ca2, 0x29b9d9b5eabffb2c, 0x7808d154b0ec1b3a, 0xc4aaf60b740308fa, 0x6f7aca6f0741b2b5, 0x2edf4f889c09621d, 0x1fa820ee83261292, 0x7a162fd7a082003c, 0x870c2de2f130ff5a, 0xc32d6a90658eb347, 0x0b5a6e242082dc01, 0xf15db35e61e3e4f9, 0x05cb98edaeddde3b, 0xf42a568ba8650943, 0x7a70bb17d9251446, 0x1192a280cb3f6e41, 0x1e793c64522c4580, 0x29a80c9474c9b619, 0x4ccd8e988ea18381, 0xb8838a1136fbfc48, 0x108a0978ea3b5737, 0xe8d5e36bf6eebbc7, 0x62b9f51dbf53b7e6, 0x6996fcba08c05853, 0x500713ada63dec92, 0x55e48c824b0341da, 0xa76a0dee1b82ae93, 0x95706b1d4d8ec8ec, 0x2b100b833913b0a5, 0x2dcc7ccc931f4a69, 0xf198714708999d3e, 0x36d8a256f6be869f, 0x74791453a9159591, 0x3e0e78593608f415, 0xc18f5072b7288cc1, 0x1e045ab5b4deeb8b, 0x55ce3a1e68cc7318, 0xadb069bc0ea75ce6, 0x5f0c72e82faa5d12, 0xb0dcec4f4a5b32eb, 0xb2af1e588a6b3d69, 0x7133d52a1259083f, 0xaf5cbeb8c7d7b228, 0xe00640c93ba3c4e0, 0x5264e4f06b24e751, 0xf4b8ad26a7e50c2d, 0x034dcdb8121f9b91, 0x8d18c62ff6c0b2c9, 0x04c378dbb5c92962, 0x7c7c041b704a39bb, 0x8c7cac2bd6fab046, + 0xe830751a18b1fb5e, 0x9e30fb31b333ccec, 0x4fba9d374256093e, 0x598628d4b2871fde, 0xd6854917cc217ab4, 0x4da3839966d614cd, 0x6c2ee98d9f0a6bf9, 0xa643c8991753f6e4, 0x4a7982d0be1d0930, 0x441b590a0694d4f4, 0xac70c5107d531b97, 0xbb9e36477a76bbd2, 0x921ccfb831039d8e, 0x61f6991dc827545c, 0x6c5afe13298cf2ad, 0xecf28b9022ab3a75, 0x11e0265d86c2d913, 0x51b4aeded81317ec, 0x5bdccaa59f2cbeb8, 0xb9c76e9f66388e78, 0xa6babe827af99e38, 0x7c92e55ca21c6159, 0xe49bad2924782213, 0x3c2f72423ad5f50d, 0xb3755cfa70e505b4, 0x9f55bc675f2dd8d0, 0xf2891d2b3c912007, 0xbfe5cf184e166eff, 0x0e43e71fdd72d966, 0xf56228bcd5c95ca0, 0x80fa47660411d1a6, 0x92166503e32b5c2f, 0x542096f618073022, 0x5dd3a8ea782205c5, 0xb520095d8dff2a5e, 0x045b81afc2f56ade, 0xb85681ed6f1de692, 0xb9a75fdde941cf34, 0x58e17def17bb5d6b, 0xd4b11a833adbd178, 0x787ab0355e2fda17, 0x38e5bda322c1a58a, 0x0c1bf5f6457d6d33, 0x93172c3a82e1c498, 0xf3d6f541b2b86965, 0x4e7f9e55316d0a31, 0xc2e824b016aab50b, 0x1d6c62558ea1c109, 0x5370f2b9133e09ee, 0x43137d4fa9a8437f, 0xe5239ad79830662b, 0x4e109cd3220f67dd, + }, + }; + size_t res = 0; + + for (size_t i = 0; i < 8; ++i) + { + res ^= random[i][UInt8(x)]; + x >>= 8; + } + + return res; + } + }; +} + + + +template