diff --git a/README.md b/README.md index a6f2c29d628..0ded3035b55 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,4 @@ ClickHouse is an open-source column-oriented database management system that all * [ClickHouse Workshop in Novosibirsk](https://2020.codefest.ru/lecture/1628) on TBD date. * [Talks on Saint HighLoad++ in St. Petersburg](https://www.highload.ru/spb/2020/abstracts/6647) on TBD date. * [Yandex C++ Open-Source Sprints in Moscow](https://events.yandex.ru/events/otkrytyj-kod-v-yandek-28-03-2020) on TBD date. +* [ClickHouse in Avito (online in Russian)](https://avitotech.timepad.ru/event/1290051/) on April 9, 2020. diff --git a/base/daemon/BaseDaemon.cpp b/base/daemon/BaseDaemon.cpp index eff779c6430..dc70d06619f 100644 --- a/base/daemon/BaseDaemon.cpp +++ b/base/daemon/BaseDaemon.cpp @@ -367,137 +367,7 @@ void BaseDaemon::reloadConfiguration() } -namespace -{ - -enum class InstructionFail -{ - NONE = 0, - SSE3 = 1, - SSSE3 = 2, - SSE4_1 = 3, - SSE4_2 = 4, - AVX = 5, - AVX2 = 6, - AVX512 = 7 -}; - -std::string instructionFailToString(InstructionFail fail) -{ - switch (fail) - { - case InstructionFail::NONE: - return "NONE"; - case InstructionFail::SSE3: - return "SSE3"; - case InstructionFail::SSSE3: - return "SSSE3"; - case InstructionFail::SSE4_1: - return "SSE4.1"; - case InstructionFail::SSE4_2: - return "SSE4.2"; - case InstructionFail::AVX: - return "AVX"; - case InstructionFail::AVX2: - return "AVX2"; - case InstructionFail::AVX512: - return "AVX512"; - } - __builtin_unreachable(); -} - - -sigjmp_buf jmpbuf; - -void sigIllCheckHandler(int, siginfo_t *, void *) -{ - siglongjmp(jmpbuf, 1); -} - -/// Check if necessary sse extensions are available by trying to execute some sse instructions. -/// If instruction is unavailable, SIGILL will be sent by kernel. -void checkRequiredInstructionsImpl(volatile InstructionFail & fail) -{ -#if __SSE3__ - fail = InstructionFail::SSE3; - __asm__ volatile ("addsubpd %%xmm0, %%xmm0" : : : "xmm0"); -#endif - -#if __SSSE3__ - fail = InstructionFail::SSSE3; - __asm__ volatile ("pabsw %%xmm0, %%xmm0" : : : "xmm0"); - -#endif - -#if __SSE4_1__ - fail = InstructionFail::SSE4_1; - __asm__ volatile ("pmaxud %%xmm0, %%xmm0" : : : "xmm0"); -#endif - -#if __SSE4_2__ - fail = InstructionFail::SSE4_2; - __asm__ volatile ("pcmpgtq %%xmm0, %%xmm0" : : : "xmm0"); -#endif - -#if __AVX__ - fail = InstructionFail::AVX; - __asm__ volatile ("vaddpd %%ymm0, %%ymm0, %%ymm0" : : : "ymm0"); -#endif - -#if __AVX2__ - fail = InstructionFail::AVX2; - __asm__ volatile ("vpabsw %%ymm0, %%ymm0" : : : "ymm0"); -#endif - -#if __AVX512__ - fail = InstructionFail::AVX512; - __asm__ volatile ("vpabsw %%zmm0, %%zmm0" : : : "zmm0"); -#endif - - fail = InstructionFail::NONE; -} - -/// Check SSE and others instructions availability -/// Calls exit on fail -void checkRequiredInstructions() -{ - struct sigaction sa{}; - struct sigaction sa_old{}; - sa.sa_sigaction = sigIllCheckHandler; - sa.sa_flags = SA_SIGINFO; - auto signal = SIGILL; - if (sigemptyset(&sa.sa_mask) != 0 - || sigaddset(&sa.sa_mask, signal) != 0 - || sigaction(signal, &sa, &sa_old) != 0) - { - std::cerr << "Can not set signal handler\n"; - exit(1); - } - - volatile InstructionFail fail = InstructionFail::NONE; - - if (sigsetjmp(jmpbuf, 1)) - { - std::cerr << "Instruction check fail. There is no " << instructionFailToString(fail) << " instruction set\n"; - exit(1); - } - - checkRequiredInstructionsImpl(fail); - - if (sigaction(signal, &sa_old, nullptr)) - { - std::cerr << "Can not set signal handler\n"; - exit(1); - } -} - -} - - -BaseDaemon::BaseDaemon() -{ - checkRequiredInstructions(); -} +BaseDaemon::BaseDaemon() = default; BaseDaemon::~BaseDaemon() diff --git a/dbms/programs/copier/Aliases.h b/dbms/programs/copier/Aliases.h index 4beff891bf4..c4d9c40d9f1 100644 --- a/dbms/programs/copier/Aliases.h +++ b/dbms/programs/copier/Aliases.h @@ -3,19 +3,21 @@ #include namespace DB - { using ConfigurationPtr = Poco::AutoPtr; using DatabaseAndTableName = std::pair; + using ListOfDatabasesAndTableNames = std::vector; /// Hierarchical description of the tasks + struct ShardPartitionPiece; struct ShardPartition; struct TaskShard; struct TaskTable; struct TaskCluster; struct ClusterPartition; + using PartitionPieces = std::vector; using TasksPartition = std::map>; using ShardInfo = Cluster::ShardInfo; using TaskShardPtr = std::shared_ptr; diff --git a/dbms/programs/copier/CMakeLists.txt b/dbms/programs/copier/CMakeLists.txt index ff9ba2f250f..5573fbc5e5d 100644 --- a/dbms/programs/copier/CMakeLists.txt +++ b/dbms/programs/copier/CMakeLists.txt @@ -12,6 +12,6 @@ set(CLICKHOUSE_COPIER_LINK PRIVATE clickhouse_dictionaries string_utils ${Poco_XML_LIBRARY} PUBLIC daemon) -set(CLICKHOUSE_COPIER_INCLUDE SYSTEM PRIVATE ${PCG_RANDOM_INCLUDE_DIR}) +set(CLICKHOUSE_COPIER_INCLUDE SYSTEM PRIVATE ${PCG_RANDOM_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) clickhouse_program_add(copier) diff --git a/dbms/programs/copier/ClusterCopier.cpp b/dbms/programs/copier/ClusterCopier.cpp index fcb2a69d2a4..c4714ff201f 100644 --- a/dbms/programs/copier/ClusterCopier.cpp +++ b/dbms/programs/copier/ClusterCopier.cpp @@ -25,7 +25,7 @@ void ClusterCopier::init() { if (response.error != Coordination::ZOK) return; - UInt64 version = ++task_descprtion_version; + UInt64 version = ++task_description_version; LOG_DEBUG(log, "Task description should be updated, local version " << version); }; @@ -145,8 +145,18 @@ void ClusterCopier::discoverShardPartitions(const ConnectionTimeouts & timeouts, for (const String & partition_name : filtered_partitions_names) { - task_shard->partition_tasks.emplace(partition_name, ShardPartition(*task_shard, partition_name)); + const size_t number_of_splits = task_table.number_of_splits; + task_shard->partition_tasks.emplace(partition_name, ShardPartition(*task_shard, partition_name, number_of_splits)); task_shard->checked_partitions.emplace(partition_name, true); + + auto shard_partition_it = task_shard->partition_tasks.find(partition_name); + PartitionPieces & shard_partition_pieces = shard_partition_it->second.pieces; + + for (size_t piece_number = 0; piece_number < number_of_splits; ++piece_number) + { + bool res = checkPresentPartitionPiecesOnCurrentShard(timeouts, *task_shard, partition_name, piece_number); + shard_partition_pieces.emplace_back(shard_partition_it->second, piece_number, res); + } } if (!missing_partitions.empty()) @@ -204,14 +214,14 @@ void ClusterCopier::reloadTaskDescription() task_description_watch_zookeeper = zookeeper; String task_config_str; - Coordination::Stat stat; + Coordination::Stat stat{}; int code; zookeeper->tryGetWatch(task_description_path, task_config_str, &stat, task_description_watch_callback, &code); if (code) throw Exception("Can't get description node " + task_description_path, ErrorCodes::BAD_ARGUMENTS); - LOG_DEBUG(log, "Loading description, zxid=" << task_descprtion_current_stat.czxid); + LOG_DEBUG(log, "Loading description, zxid=" << task_description_current_stat.czxid); auto config = getConfigurationFromXMLString(task_config_str); /// Setup settings @@ -219,14 +229,14 @@ void ClusterCopier::reloadTaskDescription() context.setSettings(task_cluster->settings_common); task_cluster_current_config = config; - task_descprtion_current_stat = stat; + task_description_current_stat = stat; } void ClusterCopier::updateConfigIfNeeded() { - UInt64 version_to_update = task_descprtion_version; - bool is_outdated_version = task_descprtion_current_version != version_to_update; - bool is_expired_session = !task_description_watch_zookeeper || task_description_watch_zookeeper->expired(); + UInt64 version_to_update = task_description_version; + bool is_outdated_version = task_description_current_version != version_to_update; + bool is_expired_session = !task_description_watch_zookeeper || task_description_watch_zookeeper->expired(); if (!is_outdated_version && !is_expired_session) return; @@ -234,7 +244,7 @@ void ClusterCopier::updateConfigIfNeeded() LOG_DEBUG(log, "Updating task description"); reloadTaskDescription(); - task_descprtion_current_version = version_to_update; + task_description_current_version = version_to_update; } void ClusterCopier::process(const ConnectionTimeouts & timeouts) @@ -242,7 +252,8 @@ void ClusterCopier::process(const ConnectionTimeouts & timeouts) for (TaskTable & task_table : task_cluster->table_tasks) { LOG_INFO(log, "Process table task " << task_table.table_id << " with " - << task_table.all_shards.size() << " shards, " << task_table.local_shards.size() << " of them are local ones"); + << task_table.all_shards.size() << " shards, " + << task_table.local_shards.size() << " of them are local ones"); if (task_table.all_shards.empty()) continue; @@ -298,6 +309,9 @@ void ClusterCopier::process(const ConnectionTimeouts & timeouts) } } + /// Delete helping tables in both cases (whole table is done or not) + dropHelpingTables(task_table); + if (!table_is_done) { throw Exception("Too many tries to process table " + task_table.table_id + ". Abort remaining execution", @@ -308,6 +322,13 @@ void ClusterCopier::process(const ConnectionTimeouts & timeouts) /// Protected section + +/* + * Creates task worker node and checks maximum number of workers not to exceed the limit. + * To achive this we have to check version of workers_version_path node and create current_worker_path + * node atomically. + * */ + zkutil::EphemeralNodeHolder::Ptr ClusterCopier::createTaskWorkerNodeAndWaitIfNeed( const zkutil::ZooKeeperPtr & zookeeper, const String & description, @@ -320,8 +341,8 @@ zkutil::EphemeralNodeHolder::Ptr ClusterCopier::createTaskWorkerNodeAndWaitIfNee std::this_thread::sleep_for(current_sleep_time); String workers_version_path = getWorkersPathVersion(); - String workers_path = getWorkersPath(); - String current_worker_path = getCurrentWorkerNodePath(); + String workers_path = getWorkersPath(); + String current_worker_path = getCurrentWorkerNodePath(); UInt64 num_bad_version_errors = 0; @@ -375,22 +396,57 @@ zkutil::EphemeralNodeHolder::Ptr ClusterCopier::createTaskWorkerNodeAndWaitIfNee } } -/** Checks that the whole partition of a table was copied. We should do it carefully due to dirty lock. - * State of some task could change during the processing. - * We have to ensure that all shards have the finished state and there is no dirty flag. - * Moreover, we have to check status twice and check zxid, because state can change during the checking. - */ -bool ClusterCopier::checkPartitionIsDone(const TaskTable & task_table, const String & partition_name, const TasksShard & shards_with_partition) + +bool ClusterCopier::checkPartitionPieceIsClean( + const zkutil::ZooKeeperPtr & zookeeper, + const CleanStateClock & clean_state_clock, + const String & task_status_path) { - LOG_DEBUG(log, "Check that all shards processed partition " << partition_name << " successfully"); + LogicalClock task_start_clock; + + Coordination::Stat stat{}; + if (zookeeper->exists(task_status_path, &stat)) + task_start_clock = LogicalClock(stat.mzxid); + + return clean_state_clock.is_clean() && (!task_start_clock.hasHappened() || clean_state_clock.discovery_zxid <= task_start_clock); +} + + +bool ClusterCopier::checkAllPiecesInPartitionAreDone(const TaskTable & task_table, const String & partition_name, const TasksShard & shards_with_partition) +{ + bool answer = true; + for (size_t piece_number = 0; piece_number < task_table.number_of_splits; ++piece_number) + { + bool piece_is_done = checkPartitionPieceIsDone(task_table, partition_name, piece_number, shards_with_partition); + if (!piece_is_done) + LOG_DEBUG(log, "Partition " << partition_name << " piece " + toString(piece_number) + " is not already done."); + answer &= piece_is_done; + } + + return answer; +} + + +/* The same as function above + * Assume that we don't know on which shards do we have partition certain piece. + * We'll check them all (I mean shards that contain the whole partition) + * And shards that don't have certain piece MUST mark that piece is_done true. + * */ +bool ClusterCopier::checkPartitionPieceIsDone(const TaskTable & task_table, const String & partition_name, + size_t piece_number, const TasksShard & shards_with_partition) +{ + LOG_DEBUG(log, "Check that all shards processed partition " << partition_name + << " piece " + toString(piece_number) + " successfully"); auto zookeeper = context.getZooKeeper(); - Strings status_paths; + /// Collect all shards that contain partition piece number piece_number. + Strings piece_status_paths; for (auto & shard : shards_with_partition) { ShardPartition & task_shard_partition = shard->partition_tasks.find(partition_name)->second; - status_paths.emplace_back(task_shard_partition.getShardStatusPath()); + ShardPartitionPiece & shard_partition_piece = task_shard_partition.pieces[piece_number]; + piece_status_paths.emplace_back(shard_partition_piece.getShardStatusPath()); } std::vector zxid1, zxid2; @@ -398,7 +454,7 @@ bool ClusterCopier::checkPartitionIsDone(const TaskTable & task_table, const Str try { std::vector get_futures; - for (const String & path : status_paths) + for (const String & path : piece_status_paths) get_futures.emplace_back(zookeeper->asyncGet(path)); // Check that state is Finished and remember zxid @@ -409,34 +465,31 @@ bool ClusterCopier::checkPartitionIsDone(const TaskTable & task_table, const Str TaskStateWithOwner status = TaskStateWithOwner::fromString(res.data); if (status.state != TaskState::Finished) { - LOG_INFO(log, "The task " << res.data << " is being rewritten by " << status.owner << ". Partition will be rechecked"); + LOG_INFO(log, "The task " << res.data << " is being rewritten by " + << status.owner << ". Partition piece will be rechecked"); return false; } zxid1.push_back(res.stat.pzxid); } - // Check that partition is not dirty + const String piece_is_dirty_flag_path = task_table.getCertainPartitionPieceIsDirtyPath(partition_name, piece_number); + const String piece_is_dirty_cleaned_path = task_table.getCertainPartitionPieceIsCleanedPath(partition_name, piece_number); + const String piece_task_status_path = task_table.getCertainPartitionPieceTaskStatusPath(partition_name, piece_number); + + CleanStateClock clean_state_clock (zookeeper, piece_is_dirty_flag_path, piece_is_dirty_cleaned_path); + + const bool is_clean = checkPartitionPieceIsClean(zookeeper, clean_state_clock, piece_task_status_path); + + + if (!is_clean) { - CleanStateClock clean_state_clock ( - zookeeper, - task_table.getPartitionIsDirtyPath(partition_name), - task_table.getPartitionIsCleanedPath(partition_name) - ); - Coordination::Stat stat; - LogicalClock task_start_clock; - if (zookeeper->exists(task_table.getPartitionTaskStatusPath(partition_name), &stat)) - task_start_clock = LogicalClock(stat.mzxid); - zookeeper->get(task_table.getPartitionTaskStatusPath(partition_name), &stat); - if (!clean_state_clock.is_clean() || task_start_clock <= clean_state_clock.discovery_zxid) - { - LOG_INFO(log, "Partition " << partition_name << " become dirty"); - return false; - } + LOG_INFO(log, "Partition " << partition_name << " become dirty"); + return false; } get_futures.clear(); - for (const String & path : status_paths) + for (const String & path : piece_status_paths) get_futures.emplace_back(zookeeper->asyncGet(path)); // Remember zxid of states again @@ -448,25 +501,183 @@ bool ClusterCopier::checkPartitionIsDone(const TaskTable & task_table, const Str } catch (const Coordination::Exception & e) { - LOG_INFO(log, "A ZooKeeper error occurred while checking partition " << partition_name - << ". Will recheck the partition. Error: " << e.displayText()); + LOG_INFO(log, "A ZooKeeper error occurred while checking partition " << partition_name << " piece number " + << toString(piece_number) << ". Will recheck the partition. Error: " << e.displayText()); return false; } // If all task is finished and zxid is not changed then partition could not become dirty again - for (UInt64 shard_num = 0; shard_num < status_paths.size(); ++shard_num) + for (UInt64 shard_num = 0; shard_num < piece_status_paths.size(); ++shard_num) { if (zxid1[shard_num] != zxid2[shard_num]) { - LOG_INFO(log, "The task " << status_paths[shard_num] << " is being modified now. Partition will be rechecked"); + LOG_INFO(log, "The task " << piece_status_paths[shard_num] << " is being modified now. Partition piece will be rechecked"); return false; } } - LOG_INFO(log, "Partition " << partition_name << " is copied successfully"); + LOG_INFO(log, "Partition " << partition_name << " piece number " << toString(piece_number) << " is copied successfully"); return true; } + +TaskStatus ClusterCopier::tryMoveAllPiecesToDestinationTable(const TaskTable & task_table, const String & partition_name) +{ + bool inject_fault = false; + if (move_fault_probability > 0) + { + double value = std::uniform_real_distribution<>(0, 1)(task_table.task_cluster.random_engine); + inject_fault = value < move_fault_probability; + } + + LOG_DEBUG(log, "Try to move " << partition_name << " to destionation table"); + + auto zookeeper = context.getZooKeeper(); + + const auto current_partition_attach_is_active = task_table.getPartitionAttachIsActivePath(partition_name); + const auto current_partition_attach_is_done = task_table.getPartitionAttachIsDonePath(partition_name); + + /// Create ephemeral node to mark that we are active and process the partition + zookeeper->createAncestors(current_partition_attach_is_active); + zkutil::EphemeralNodeHolderPtr partition_attach_node_holder; + try + { + partition_attach_node_holder = zkutil::EphemeralNodeHolder::create(current_partition_attach_is_active, *zookeeper, host_id); + } + catch (const Coordination::Exception & e) + { + if (e.code == Coordination::ZNODEEXISTS) + { + LOG_DEBUG(log, "Someone is already moving pieces " << current_partition_attach_is_active); + return TaskStatus::Active; + } + + throw; + } + + + /// Exit if task has been already processed; + /// create blocking node to signal cleaning up if it is abandoned + { + String status_data; + if (zookeeper->tryGet(current_partition_attach_is_done, status_data)) + { + TaskStateWithOwner status = TaskStateWithOwner::fromString(status_data); + if (status.state == TaskState::Finished) + { + LOG_DEBUG(log, "All pieces for partition from this task " << current_partition_attach_is_active + << " has been successfully moved to destination table by " << status.owner); + return TaskStatus::Finished; + } + + /// Task is abandoned, because previously we created ephemeral node, possibly in other copier's process. + /// Initialize DROP PARTITION + LOG_DEBUG(log, "Moving piece for partition " << current_partition_attach_is_active + << " has not been successfully finished by " << status.owner + << ". Will try to move by myself."); + + /// Remove is_done marker. + zookeeper->remove(current_partition_attach_is_done); + } + } + + + /// Try start processing, create node about it + { + String start_state = TaskStateWithOwner::getData(TaskState::Started, host_id); + zookeeper->create(current_partition_attach_is_done, start_state, zkutil::CreateMode::Persistent); + } + + /// Move partition to original destination table. + for (size_t current_piece_number = 0; current_piece_number < task_table.number_of_splits; ++current_piece_number) + { + LOG_DEBUG(log, "Trying to move partition " << partition_name + << " piece " << toString(current_piece_number) + << " to original table"); + + ASTPtr query_alter_ast; + String query_alter_ast_string; + + DatabaseAndTableName original_table = task_table.table_push; + DatabaseAndTableName helping_table = DatabaseAndTableName(original_table.first, + original_table.second + "_piece_" + + toString(current_piece_number)); + + Settings settings_push = task_cluster->settings_push; + + /// It is important, ALTER ATTACH PARTITION must be done synchronously + /// And we will execute this ALTER query on each replica of a shard. + /// It is correct, because this query is idempotent. + settings_push.replication_alter_partitions_sync = 2; + + query_alter_ast_string += " ALTER TABLE " + getQuotedTable(original_table) + + " ATTACH PARTITION " + partition_name + + " FROM " + getQuotedTable(helping_table); + + LOG_DEBUG(log, "Executing ALTER query: " << query_alter_ast_string); + + try + { + size_t num_nodes = executeQueryOnCluster( + task_table.cluster_push, + query_alter_ast_string, + nullptr, + &settings_push, + PoolMode::GET_MANY, + ClusterExecutionMode::ON_EACH_NODE); + + LOG_INFO(log, "Number of nodes that executed ALTER query successfully : " << toString(num_nodes)); + } + catch (...) + { + LOG_DEBUG(log, "Error while moving partition " << partition_name + << " piece " << toString(current_piece_number) + << "to original table"); + throw; + } + + if (inject_fault) + throw Exception("Copy fault injection is activated", ErrorCodes::UNFINISHED); + + try + { + String query_deduplicate_ast_string; + if (!task_table.isReplicatedTable()) + { + query_deduplicate_ast_string += " OPTIMIZE TABLE " + getQuotedTable(original_table) + + " PARTITION " + partition_name + " DEDUPLICATE;"; + + LOG_DEBUG(log, "Executing OPTIMIZE DEDUPLICATE query: " << query_alter_ast_string); + + UInt64 num_nodes = executeQueryOnCluster( + task_table.cluster_push, + query_deduplicate_ast_string, + nullptr, + &task_cluster->settings_push, + PoolMode::GET_MANY); + + LOG_INFO(log, "Number of shard that executed OPTIMIZE DEDUPLICATE query successfully : " + << toString(num_nodes)); + } + } + catch (...) + { + LOG_DEBUG(log, "Error while executing OPTIMIZE DEDUPLICATE partition " << partition_name + << "in the original table"); + throw; + } + } + + /// Create node to signal that we finished moving + { + String state_finished = TaskStateWithOwner::getData(TaskState::Finished, host_id); + zookeeper->set(current_partition_attach_is_done, state_finished, 0); + } + + return TaskStatus::Finished; +} + +/// Removes MATERIALIZED and ALIAS columns from create table query ASTPtr ClusterCopier::removeAliasColumnsFromCreateQuery(const ASTPtr & query_ast) { const ASTs & column_asts = query_ast->as().columns_list->columns->children; @@ -499,10 +710,10 @@ ASTPtr ClusterCopier::removeAliasColumnsFromCreateQuery(const ASTPtr & query_ast return new_query_ast; } - /// Replaces ENGINE and table name in a create query -static std::shared_ptr rewriteCreateQueryStorage( - const ASTPtr & create_query_ast, const DatabaseAndTableName & new_table, const ASTPtr & new_storage_ast) +std::shared_ptr rewriteCreateQueryStorage(const ASTPtr & create_query_ast, + const DatabaseAndTableName & new_table, + const ASTPtr & new_storage_ast) { const auto & create = create_query_ast->as(); auto res = std::make_shared(create); @@ -521,29 +732,35 @@ static std::shared_ptr rewriteCreateQueryStorage( } -bool ClusterCopier::tryDropPartition(ShardPartition & task_partition, const zkutil::ZooKeeperPtr & zookeeper, const CleanStateClock & clean_state_clock) +bool ClusterCopier::tryDropPartitionPiece( + ShardPartition & task_partition, + const size_t current_piece_number, + const zkutil::ZooKeeperPtr & zookeeper, + const CleanStateClock & clean_state_clock) { if (is_safe_mode) throw Exception("DROP PARTITION is prohibited in safe mode", ErrorCodes::NOT_IMPLEMENTED); TaskTable & task_table = task_partition.task_shard.task_table; + ShardPartitionPiece & partition_piece = task_partition.pieces[current_piece_number]; - const String current_shards_path = task_partition.getPartitionShardsPath(); - const String current_partition_active_workers_dir = task_partition.getPartitionActiveWorkersPath(); - const String is_dirty_flag_path = task_partition.getCommonPartitionIsDirtyPath(); - const String dirt_cleaner_path = is_dirty_flag_path + "/cleaner"; - const String is_dirt_cleaned_path = task_partition.getCommonPartitionIsCleanedPath(); + const String current_shards_path = partition_piece.getPartitionPieceShardsPath(); + const String current_partition_active_workers_dir = partition_piece.getPartitionPieceActiveWorkersPath(); + const String is_dirty_flag_path = partition_piece.getPartitionPieceIsDirtyPath(); + const String dirty_cleaner_path = partition_piece.getPartitionPieceCleanerPath(); + const String is_dirty_cleaned_path = partition_piece.getPartitionPieceIsCleanedPath(); zkutil::EphemeralNodeHolder::Ptr cleaner_holder; try { - cleaner_holder = zkutil::EphemeralNodeHolder::create(dirt_cleaner_path, *zookeeper, host_id); + cleaner_holder = zkutil::EphemeralNodeHolder::create(dirty_cleaner_path, *zookeeper, host_id); } catch (const Coordination::Exception & e) { if (e.code == Coordination::ZNODEEXISTS) { - LOG_DEBUG(log, "Partition " << task_partition.name << " is cleaning now by somebody, sleep"); + LOG_DEBUG(log, "Partition " << task_partition.name << " piece " + << toString(current_piece_number) << " is cleaning now by somebody, sleep"); std::this_thread::sleep_for(default_sleep_time); return false; } @@ -551,12 +768,13 @@ bool ClusterCopier::tryDropPartition(ShardPartition & task_partition, const zkut throw; } - Coordination::Stat stat; + Coordination::Stat stat{}; if (zookeeper->exists(current_partition_active_workers_dir, &stat)) { if (stat.numChildren != 0) { - LOG_DEBUG(log, "Partition " << task_partition.name << " contains " << stat.numChildren << " active workers while trying to drop it. Going to sleep."); + LOG_DEBUG(log, "Partition " << task_partition.name << " contains " << stat.numChildren + << " active workers while trying to drop it. Going to sleep."); std::this_thread::sleep_for(default_sleep_time); return false; } @@ -585,8 +803,8 @@ bool ClusterCopier::tryDropPartition(ShardPartition & task_partition, const zkut // Lock the dirty flag zookeeper->set(is_dirty_flag_path, host_id, clean_state_clock.discovery_version.value()); - zookeeper->tryRemove(task_partition.getPartitionCleanStartPath()); - CleanStateClock my_clock(zookeeper, is_dirty_flag_path, is_dirt_cleaned_path); + zookeeper->tryRemove(partition_piece.getPartitionPieceCleanStartPath()); + CleanStateClock my_clock(zookeeper, is_dirty_flag_path, is_dirty_cleaned_path); /// Remove all status nodes { @@ -598,7 +816,11 @@ bool ClusterCopier::tryDropPartition(ShardPartition & task_partition, const zkut } } - String query = "ALTER TABLE " + getQuotedTable(task_table.table_push); + + DatabaseAndTableName original_table = task_table.table_push; + DatabaseAndTableName helping_table = DatabaseAndTableName(original_table.first, original_table.second + "_piece_" + toString(current_piece_number)); + + String query = "ALTER TABLE " + getQuotedTable(helping_table); query += " DROP PARTITION " + task_partition.name + ""; /// TODO: use this statement after servers will be updated up to 1.1.54310 @@ -611,23 +833,24 @@ bool ClusterCopier::tryDropPartition(ShardPartition & task_partition, const zkut settings_push.replication_alter_partitions_sync = 2; LOG_DEBUG(log, "Execute distributed DROP PARTITION: " << query); - /// Limit number of max executing replicas to 1 - UInt64 num_shards = executeQueryOnCluster(cluster_push, query, nullptr, &settings_push, PoolMode::GET_ONE, 1); + /// We have to drop partition_piece on each replica + size_t num_shards = executeQueryOnCluster( + cluster_push, query, + nullptr, + &settings_push, + PoolMode::GET_MANY, + ClusterExecutionMode::ON_EACH_NODE); - if (num_shards < cluster_push->getShardCount()) - { - LOG_INFO(log, "DROP PARTITION wasn't successfully executed on " << cluster_push->getShardCount() - num_shards << " shards"); - return false; - } + LOG_INFO(log, "DROP PARTITION was successfully executed on " << num_shards << " nodes of a cluster."); /// Update the locking node if (!my_clock.is_stale()) { zookeeper->set(is_dirty_flag_path, host_id, my_clock.discovery_version.value()); if (my_clock.clean_state_version) - zookeeper->set(is_dirt_cleaned_path, host_id, my_clock.clean_state_version.value()); + zookeeper->set(is_dirty_cleaned_path, host_id, my_clock.clean_state_version.value()); else - zookeeper->create(is_dirt_cleaned_path, host_id, zkutil::CreateMode::Persistent); + zookeeper->create(is_dirty_cleaned_path, host_id, zkutil::CreateMode::Persistent); } else { @@ -636,12 +859,13 @@ bool ClusterCopier::tryDropPartition(ShardPartition & task_partition, const zkut return false; } - LOG_INFO(log, "Partition " << task_partition.name << " was dropped on cluster " << task_table.cluster_push_name); + LOG_INFO(log, "Partition " << task_partition.name << " piece " << toString(current_piece_number) + << " was dropped on cluster " << task_table.cluster_push_name); if (zookeeper->tryCreate(current_shards_path, host_id, zkutil::CreateMode::Persistent) == Coordination::ZNODEEXISTS) zookeeper->set(current_shards_path, host_id); } - LOG_INFO(log, "Partition " << task_partition.name << " is safe for work now."); + LOG_INFO(log, "Partition " << task_partition.name << " piece " << toString(current_piece_number) << " is safe for work now."); return true; } @@ -659,6 +883,7 @@ bool ClusterCopier::tryProcessTable(const ConnectionTimeouts & timeouts, TaskTab ClusterPartition & cluster_partition = task_table.cluster_partitions[partition_name]; Stopwatch watch; + /// We will check all the shards of the table and check if they contain current partition. TasksShard expected_shards; UInt64 num_failed_shards = 0; @@ -684,8 +909,18 @@ bool ClusterCopier::tryProcessTable(const ConnectionTimeouts & timeouts, TaskTab if (has_partition) { - shard->partition_tasks.emplace(partition_name, ShardPartition(*shard, partition_name)); + const size_t number_of_splits = task_table.number_of_splits; + shard->partition_tasks.emplace(partition_name, ShardPartition(*shard, partition_name, number_of_splits)); LOG_DEBUG(log, "Discovered partition " << partition_name << " in shard " << shard->getDescription()); + /// To save references in the future. + auto shard_partition_it = shard->partition_tasks.find(partition_name); + PartitionPieces & shard_partition_pieces = shard_partition_it->second.pieces; + + for (size_t piece_number = 0; piece_number < number_of_splits; ++piece_number) + { + auto res = checkPresentPartitionPiecesOnCurrentShard(timeouts, *shard, partition_name, piece_number); + shard_partition_pieces.emplace_back(shard_partition_it->second, piece_number, res); + } } else { @@ -702,15 +937,17 @@ bool ClusterCopier::tryProcessTable(const ConnectionTimeouts & timeouts, TaskTab } auto it_shard_partition = shard->partition_tasks.find(partition_name); + /// Previously when we discovered that shard does not contain current partition, we skipped it. + /// At this moment partition have to be present. if (it_shard_partition == shard->partition_tasks.end()) - throw Exception("There are no such partition in a shard. This is a bug.", ErrorCodes::LOGICAL_ERROR); + throw Exception("There are no such partition in a shard. This is a bug.", ErrorCodes::LOGICAL_ERROR); auto & partition = it_shard_partition->second; expected_shards.emplace_back(shard); /// Do not sleep if there is a sequence of already processed shards to increase startup bool is_unprioritized_task = !previous_shard_is_instantly_finished && shard->priority.is_remote; - PartitionTaskStatus task_status = PartitionTaskStatus::Error; + TaskStatus task_status = TaskStatus::Error; bool was_error = false; has_shard_to_process = true; for (UInt64 try_num = 0; try_num < max_shard_partition_tries; ++try_num) @@ -718,20 +955,20 @@ bool ClusterCopier::tryProcessTable(const ConnectionTimeouts & timeouts, TaskTab task_status = tryProcessPartitionTask(timeouts, partition, is_unprioritized_task); /// Exit if success - if (task_status == PartitionTaskStatus::Finished) + if (task_status == TaskStatus::Finished) break; was_error = true; /// Skip if the task is being processed by someone - if (task_status == PartitionTaskStatus::Active) + if (task_status == TaskStatus::Active) break; /// Repeat on errors std::this_thread::sleep_for(default_sleep_time); } - if (task_status == PartitionTaskStatus::Error) + if (task_status == TaskStatus::Error) ++num_failed_shards; previous_shard_is_instantly_finished = !was_error; @@ -741,20 +978,51 @@ bool ClusterCopier::tryProcessTable(const ConnectionTimeouts & timeouts, TaskTab /// Check that whole cluster partition is done /// Firstly check the number of failed partition tasks, then look into ZooKeeper and ensure that each partition is done - bool partition_is_done = num_failed_shards == 0; + bool partition_copying_is_done = num_failed_shards == 0; try { - partition_is_done = - !has_shard_to_process - || (partition_is_done && checkPartitionIsDone(task_table, partition_name, expected_shards)); + partition_copying_is_done = + !has_shard_to_process + || (partition_copying_is_done && checkAllPiecesInPartitionAreDone(task_table, partition_name, expected_shards)); } catch (...) { tryLogCurrentException(log); - partition_is_done = false; + partition_copying_is_done = false; } - if (partition_is_done) + + bool partition_moving_is_done = false; + /// Try to move only if all pieces were copied. + if (partition_copying_is_done) + { + for (UInt64 try_num = 0; try_num < max_shard_partition_piece_tries_for_alter; ++try_num) + { + try + { + auto res = tryMoveAllPiecesToDestinationTable(task_table, partition_name); + /// Exit and mark current task is done. + if (res == TaskStatus::Finished) + { + partition_moving_is_done = true; + break; + } + + /// Exit if this task is active. + if (res == TaskStatus::Active) + break; + + /// Repeat on errors. + std::this_thread::sleep_for(default_sleep_time); + } + catch (...) + { + tryLogCurrentException(log, "Some error occured while moving pieces to destination table for partition " + partition_name); + } + } + } + + if (partition_copying_is_done && partition_moving_is_done) { task_table.finished_cluster_partitions.emplace(partition_name); @@ -763,20 +1031,20 @@ bool ClusterCopier::tryProcessTable(const ConnectionTimeouts & timeouts, TaskTab double elapsed = cluster_partition.elapsed_time_seconds; LOG_INFO(log, "It took " << std::fixed << std::setprecision(2) << elapsed << " seconds to copy partition " << partition_name - << ": " << formatReadableSizeWithDecimalSuffix(cluster_partition.bytes_copied) << " uncompressed bytes" - << ", " << formatReadableQuantity(cluster_partition.rows_copied) << " rows" - << " and " << cluster_partition.blocks_copied << " source blocks are copied"); + << ": " << formatReadableSizeWithDecimalSuffix(cluster_partition.bytes_copied) << " uncompressed bytes" + << ", " << formatReadableQuantity(cluster_partition.rows_copied) << " rows" + << " and " << cluster_partition.blocks_copied << " source blocks are copied"); if (cluster_partition.rows_copied) { LOG_INFO(log, "Average partition speed: " - << formatReadableSizeWithDecimalSuffix(cluster_partition.bytes_copied / elapsed) << " per second."); + << formatReadableSizeWithDecimalSuffix(cluster_partition.bytes_copied / elapsed) << " per second."); } if (task_table.rows_copied) { LOG_INFO(log, "Average table " << task_table.table_id << " speed: " - << formatReadableSizeWithDecimalSuffix(task_table.bytes_copied / elapsed) << " per second."); + << formatReadableSizeWithDecimalSuffix(task_table.bytes_copied / elapsed) << " per second."); } } } @@ -788,25 +1056,25 @@ bool ClusterCopier::tryProcessTable(const ConnectionTimeouts & timeouts, TaskTab if (!table_is_done) { LOG_INFO(log, "Table " + task_table.table_id + " is not processed yet." - << "Copied " << finished_partitions << " of " << required_partitions << ", will retry"); + << "Copied " << finished_partitions << " of " << required_partitions << ", will retry"); } return table_is_done; } - -PartitionTaskStatus ClusterCopier::tryProcessPartitionTask(const ConnectionTimeouts & timeouts, ShardPartition & task_partition, bool is_unprioritized_task) +/// Job for copying partition from particular shard. +TaskStatus ClusterCopier::tryProcessPartitionTask(const ConnectionTimeouts & timeouts, ShardPartition & task_partition, bool is_unprioritized_task) { - PartitionTaskStatus res; + TaskStatus res; try { - res = processPartitionTaskImpl(timeouts, task_partition, is_unprioritized_task); + res = iterateThroughAllPiecesInPartition(timeouts, task_partition, is_unprioritized_task); } catch (...) { tryLogCurrentException(log, "An error occurred while processing partition " + task_partition.name); - res = PartitionTaskStatus::Error; + res = TaskStatus::Error; } /// At the end of each task check if the config is updated @@ -822,26 +1090,79 @@ PartitionTaskStatus ClusterCopier::tryProcessPartitionTask(const ConnectionTimeo return res; } -PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTimeouts & timeouts, ShardPartition & task_partition, bool is_unprioritized_task) +TaskStatus ClusterCopier::iterateThroughAllPiecesInPartition(const ConnectionTimeouts & timeouts, ShardPartition & task_partition, + bool is_unprioritized_task) +{ + const size_t total_number_of_pieces = task_partition.task_shard.task_table.number_of_splits; + + TaskStatus res{TaskStatus::Finished}; + + bool was_failed_pieces = false; + bool was_active_pieces = false; + + for (size_t piece_number = 0; piece_number < total_number_of_pieces; piece_number++) + { + for (UInt64 try_num = 0; try_num < max_shard_partition_tries; ++try_num) + { + LOG_INFO(log, "Attempt number " << try_num << " to process partition " << task_partition.name + << " piece number " << piece_number << " on shard number " << task_partition.task_shard.numberInCluster() + << " with index " << task_partition.task_shard.indexInCluster()); + res = processPartitionPieceTaskImpl(timeouts, task_partition, piece_number, is_unprioritized_task); + + /// Exit if success + if (res == TaskStatus::Finished) + break; + + /// Skip if the task is being processed by someone + if (res == TaskStatus::Active) + break; + + /// Repeat on errors + std::this_thread::sleep_for(default_sleep_time); + } + + was_active_pieces = (res == TaskStatus::Active); + was_failed_pieces = (res == TaskStatus::Error); + } + + if (was_failed_pieces) + return TaskStatus::Error; + + if (was_active_pieces) + return TaskStatus::Active; + + return TaskStatus::Finished; +} + + +TaskStatus ClusterCopier::processPartitionPieceTaskImpl( + const ConnectionTimeouts & timeouts, ShardPartition & task_partition, + const size_t current_piece_number, bool is_unprioritized_task) { TaskShard & task_shard = task_partition.task_shard; TaskTable & task_table = task_shard.task_table; - ClusterPartition & cluster_partition = task_table.getClusterPartition(task_partition.name); + ClusterPartition & cluster_partition = task_table.getClusterPartition(task_partition.name); + ShardPartitionPiece & partition_piece = task_partition.pieces[current_piece_number]; + + const size_t number_of_splits = task_table.number_of_splits; + const String primary_key_comma_separated = task_table.primary_key_comma_separated; /// We need to update table definitions for each partition, it could be changed after ALTER - createShardInternalTables(timeouts, task_shard); + createShardInternalTables(timeouts, task_shard, true); + + auto split_table_for_current_piece = task_shard.list_of_split_tables_on_shard[current_piece_number]; auto zookeeper = context.getZooKeeper(); - const String is_dirty_flag_path = task_partition.getCommonPartitionIsDirtyPath(); - const String is_dirt_cleaned_path = task_partition.getCommonPartitionIsCleanedPath(); - const String current_task_is_active_path = task_partition.getActiveWorkerPath(); - const String current_task_status_path = task_partition.getShardStatusPath(); + const String piece_is_dirty_flag_path = partition_piece.getPartitionPieceIsDirtyPath(); + const String piece_is_dirty_cleaned_path = partition_piece.getPartitionPieceIsCleanedPath(); + const String current_task_piece_is_active_path = partition_piece.getActiveWorkerPath(); + const String current_task_piece_status_path = partition_piece.getShardStatusPath(); /// Auxiliary functions: /// Creates is_dirty node to initialize DROP PARTITION - auto create_is_dirty_node = [&, this] (const CleanStateClock & clock) + auto create_is_dirty_node = [&] (const CleanStateClock & clock) { if (clock.is_stale()) LOG_DEBUG(log, "Clean state clock is stale while setting dirty flag, cowardly bailing"); @@ -850,22 +1171,26 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime else if (clock.discovery_version) { LOG_DEBUG(log, "Updating clean state clock"); - zookeeper->set(is_dirty_flag_path, host_id, clock.discovery_version.value()); + zookeeper->set(piece_is_dirty_flag_path, host_id, clock.discovery_version.value()); } else { LOG_DEBUG(log, "Creating clean state clock"); - zookeeper->create(is_dirty_flag_path, host_id, zkutil::CreateMode::Persistent); + zookeeper->create(piece_is_dirty_flag_path, host_id, zkutil::CreateMode::Persistent); } }; /// Returns SELECT query filtering current partition and applying user filter - auto get_select_query = [&] (const DatabaseAndTableName & from_table, const String & fields, String limit = "") + auto get_select_query = [&] (const DatabaseAndTableName & from_table, const String & fields, bool enable_splitting, String limit = "") { String query; query += "SELECT " + fields + " FROM " + getQuotedTable(from_table); /// TODO: Bad, it is better to rewrite with ASTLiteral(partition_key_field) query += " WHERE (" + queryToString(task_table.engine_push_partition_key_ast) + " = (" + task_partition.name + " AS partition_key))"; + + if (enable_splitting) + query += " AND ( cityHash64(" + primary_key_comma_separated + ") %" + toString(number_of_splits) + " = " + toString(current_piece_number) + " )"; + if (!task_table.where_condition_str.empty()) query += " AND (" + task_table.where_condition_str + ")"; if (!limit.empty()) @@ -876,55 +1201,53 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime }; /// Load balancing - auto worker_node_holder = createTaskWorkerNodeAndWaitIfNeed(zookeeper, current_task_status_path, is_unprioritized_task); + auto worker_node_holder = createTaskWorkerNodeAndWaitIfNeed(zookeeper, current_task_piece_status_path, is_unprioritized_task); - LOG_DEBUG(log, "Processing " << current_task_status_path); + LOG_DEBUG(log, "Processing " << current_task_piece_status_path); - CleanStateClock clean_state_clock (zookeeper, is_dirty_flag_path, is_dirt_cleaned_path); + const String piece_status_path = partition_piece.getPartitionPieceShardsPath(); - LogicalClock task_start_clock; + CleanStateClock clean_state_clock(zookeeper, piece_is_dirty_flag_path, piece_is_dirty_cleaned_path); + + const bool is_clean = checkPartitionPieceIsClean(zookeeper, clean_state_clock, piece_status_path); + + /// Do not start if partition piece is dirty, try to clean it + if (is_clean) { - Coordination::Stat stat; - if (zookeeper->exists(task_partition.getPartitionShardsPath(), &stat)) - task_start_clock = LogicalClock(stat.mzxid); - } - - /// Do not start if partition is dirty, try to clean it - if (clean_state_clock.is_clean() - && (!task_start_clock.hasHappened() || clean_state_clock.discovery_zxid <= task_start_clock)) - { - LOG_DEBUG(log, "Partition " << task_partition.name << " appears to be clean"); - zookeeper->createAncestors(current_task_status_path); + LOG_DEBUG(log, "Partition " << task_partition.name + << " piece " + toString(current_piece_number) + " appears to be clean"); + zookeeper->createAncestors(current_task_piece_status_path); } else { - LOG_DEBUG(log, "Partition " << task_partition.name << " is dirty, try to drop it"); + LOG_DEBUG(log, "Partition " << task_partition.name + << " piece " + toString(current_piece_number) + " is dirty, try to drop it"); try { - tryDropPartition(task_partition, zookeeper, clean_state_clock); + tryDropPartitionPiece(task_partition, current_piece_number, zookeeper, clean_state_clock); } catch (...) { tryLogCurrentException(log, "An error occurred when clean partition"); } - return PartitionTaskStatus::Error; + return TaskStatus::Error; } /// Create ephemeral node to mark that we are active and process the partition - zookeeper->createAncestors(current_task_is_active_path); + zookeeper->createAncestors(current_task_piece_is_active_path); zkutil::EphemeralNodeHolderPtr partition_task_node_holder; try { - partition_task_node_holder = zkutil::EphemeralNodeHolder::create(current_task_is_active_path, *zookeeper, host_id); + partition_task_node_holder = zkutil::EphemeralNodeHolder::create(current_task_piece_is_active_path, *zookeeper, host_id); } catch (const Coordination::Exception & e) { if (e.code == Coordination::ZNODEEXISTS) { - LOG_DEBUG(log, "Someone is already processing " << current_task_is_active_path); - return PartitionTaskStatus::Active; + LOG_DEBUG(log, "Someone is already processing " << current_task_piece_is_active_path); + return TaskStatus::Active; } throw; @@ -934,32 +1257,54 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime /// create blocking node to signal cleaning up if it is abandoned { String status_data; - if (zookeeper->tryGet(current_task_status_path, status_data)) + if (zookeeper->tryGet(current_task_piece_status_path, status_data)) { TaskStateWithOwner status = TaskStateWithOwner::fromString(status_data); if (status.state == TaskState::Finished) { - LOG_DEBUG(log, "Task " << current_task_status_path << " has been successfully executed by " << status.owner); - return PartitionTaskStatus::Finished; + LOG_DEBUG(log, "Task " << current_task_piece_status_path + << " has been successfully executed by " << status.owner); + return TaskStatus::Finished; } - // Task is abandoned, initialize DROP PARTITION - LOG_DEBUG(log, "Task " << current_task_status_path << " has not been successfully finished by " << status.owner << ". Partition will be dropped and refilled."); + /// Task is abandoned, because previously we created ephemeral node, possibly in other copier's process. + /// Initialize DROP PARTITION + LOG_DEBUG(log, "Task " << current_task_piece_status_path + << " has not been successfully finished by " << status.owner + << ". Partition will be dropped and refilled."); create_is_dirty_node(clean_state_clock); - return PartitionTaskStatus::Error; + return TaskStatus::Error; } } + + /// Exit if current piece is absent on this shard. Also mark it as finished, because we will check + /// whether each shard have processed each partitition (and its pieces). + if (partition_piece.is_absent_piece) + { + String state_finished = TaskStateWithOwner::getData(TaskState::Finished, host_id); + auto res = zookeeper->tryCreate(current_task_piece_status_path, state_finished, zkutil::CreateMode::Persistent); + if (res == Coordination::ZNODEEXISTS) + LOG_DEBUG(log, "Partition " << task_partition.name << " piece " + + toString(current_piece_number) + " is absent on current replica of a shard. But other replicas have already marked it as done."); + if (res == Coordination::ZOK) + LOG_DEBUG(log, "Partition " << task_partition.name << " piece " + + toString(current_piece_number) + " is absent on current replica of a shard. Will mark it as done. Other replicas will do the same."); + return TaskStatus::Finished; + } + /// Check that destination partition is empty if we are first worker /// NOTE: this check is incorrect if pull and push tables have different partition key! String clean_start_status; - if (!zookeeper->tryGet(task_partition.getPartitionCleanStartPath(), clean_start_status) || clean_start_status != "ok") + if (!zookeeper->tryGet(partition_piece.getPartitionPieceCleanStartPath(), clean_start_status) || clean_start_status != "ok") { - zookeeper->createIfNotExists(task_partition.getPartitionCleanStartPath(), ""); - auto checker = zkutil::EphemeralNodeHolder::create(task_partition.getPartitionCleanStartPath() + "/checker", *zookeeper, host_id); + zookeeper->createIfNotExists(partition_piece.getPartitionPieceCleanStartPath(), ""); + auto checker = zkutil::EphemeralNodeHolder::create(partition_piece.getPartitionPieceCleanStartPath() + "/checker", + *zookeeper, host_id); // Maybe we are the first worker - ASTPtr query_select_ast = get_select_query(task_shard.table_split_shard, "count()"); + + ASTPtr query_select_ast = get_select_query(split_table_for_current_piece, "count()", /*enable_splitting*/ true); UInt64 count; { Context local_context = context; @@ -973,21 +1318,24 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime if (count != 0) { - Coordination::Stat stat_shards; - zookeeper->get(task_partition.getPartitionShardsPath(), &stat_shards); + LOG_INFO(log, "Partition " << task_partition.name << " piece " + << current_piece_number << "is not empty. In contains " << count << " rows."); + Coordination::Stat stat_shards{}; + zookeeper->get(partition_piece.getPartitionPieceShardsPath(), &stat_shards); /// NOTE: partition is still fresh if dirt discovery happens before cleaning if (stat_shards.numChildren == 0) { LOG_WARNING(log, "There are no workers for partition " << task_partition.name - << ", but destination table contains " << count << " rows" - << ". Partition will be dropped and refilled."); + << " piece " << toString(current_piece_number) + << ", but destination table contains " << count << " rows" + << ". Partition will be dropped and refilled."); create_is_dirty_node(clean_state_clock); - return PartitionTaskStatus::Error; + return TaskStatus::Error; } } - zookeeper->set(task_partition.getPartitionCleanStartPath(), "ok"); + zookeeper->set(partition_piece.getPartitionPieceCleanStartPath(), "ok"); } /// At this point, we need to sync that the destination table is clean /// before any actual work @@ -995,32 +1343,49 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime /// Try start processing, create node about it { String start_state = TaskStateWithOwner::getData(TaskState::Started, host_id); - CleanStateClock new_clean_state_clock (zookeeper, is_dirty_flag_path, is_dirt_cleaned_path); + CleanStateClock new_clean_state_clock (zookeeper, piece_is_dirty_flag_path, piece_is_dirty_cleaned_path); if (clean_state_clock != new_clean_state_clock) { - LOG_INFO(log, "Partition " << task_partition.name << " clean state changed, cowardly bailing"); - return PartitionTaskStatus::Error; + LOG_INFO(log, "Partition " << task_partition.name << " piece " + << toString(current_piece_number) << " clean state changed, cowardly bailing"); + return TaskStatus::Error; } else if (!new_clean_state_clock.is_clean()) { - LOG_INFO(log, "Partition " << task_partition.name << " is dirty and will be dropped and refilled"); + LOG_INFO(log, "Partition " << task_partition.name << " piece " + << toString(current_piece_number) << " is dirty and will be dropped and refilled"); create_is_dirty_node(new_clean_state_clock); - return PartitionTaskStatus::Error; + return TaskStatus::Error; } - zookeeper->create(current_task_status_path, start_state, zkutil::CreateMode::Persistent); + zookeeper->create(current_task_piece_status_path, start_state, zkutil::CreateMode::Persistent); } /// Try create table (if not exists) on each shard { - auto create_query_push_ast = rewriteCreateQueryStorage(task_shard.current_pull_table_create_query, task_table.table_push, task_table.engine_push_ast); + /// Define push table for current partition piece + auto database_and_table_for_current_piece= std::pair( + task_table.table_push.first, + task_table.table_push.second + "_piece_" + toString(current_piece_number)); + + auto new_engine_push_ast = task_table.engine_push_ast; + if (task_table.isReplicatedTable()) + { + new_engine_push_ast = task_table.rewriteReplicatedCreateQueryToPlain(); + } + + auto create_query_push_ast = rewriteCreateQueryStorage( + task_shard.current_pull_table_create_query, + database_and_table_for_current_piece, new_engine_push_ast); + create_query_push_ast->as().if_not_exists = true; String query = queryToString(create_query_push_ast); LOG_DEBUG(log, "Create destination tables. Query: " << query); - UInt64 shards = executeQueryOnCluster(task_table.cluster_push, query, create_query_push_ast, &task_cluster->settings_push, - PoolMode::GET_MANY); - LOG_DEBUG(log, "Destination tables " << getQuotedTable(task_table.table_push) << " have been created on " << shards - << " shards of " << task_table.cluster_push->getShardCount()); + UInt64 shards = executeQueryOnCluster(task_table.cluster_push, query, + create_query_push_ast, &task_cluster->settings_push, + PoolMode::GET_MANY); + LOG_DEBUG(log, "Destination tables " << getQuotedTable(task_table.table_push) + << " have been created on " << shards << " shards of " << task_table.cluster_push->getShardCount()); } /// Do the copying @@ -1033,15 +1398,15 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime } // Select all fields - ASTPtr query_select_ast = get_select_query(task_shard.table_read_shard, "*", inject_fault ? "1" : ""); + ASTPtr query_select_ast = get_select_query(task_shard.table_read_shard, "*", /*enable_splitting*/ true, inject_fault ? "1" : ""); LOG_DEBUG(log, "Executing SELECT query and pull from " << task_shard.getDescription() - << " : " << queryToString(query_select_ast)); + << " : " << queryToString(query_select_ast)); ASTPtr query_insert_ast; { String query; - query += "INSERT INTO " + getQuotedTable(task_shard.table_split_shard) + " VALUES "; + query += "INSERT INTO " + getQuotedTable(split_table_for_current_piece) + " VALUES "; ParserQuery p_query(query.data() + query.size()); query_insert_ast = parseQuery(p_query, query, 0); @@ -1081,7 +1446,7 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime throw Exception("ZooKeeper session is expired, cancel INSERT SELECT", ErrorCodes::UNFINISHED); if (!future_is_dirty_checker.valid()) - future_is_dirty_checker = zookeeper->asyncExists(is_dirty_flag_path); + future_is_dirty_checker = zookeeper->asyncExists(piece_is_dirty_flag_path); /// check_period_milliseconds should less than average insert time of single block /// Otherwise, the insertion will slow a little bit @@ -1123,30 +1488,56 @@ PartitionTaskStatus ClusterCopier::processPartitionTaskImpl(const ConnectionTime catch (...) { tryLogCurrentException(log, "An error occurred during copying, partition will be marked as dirty"); - return PartitionTaskStatus::Error; + create_is_dirty_node(clean_state_clock); + return TaskStatus::Error; } } + LOG_INFO(log, "Partition " << task_partition.name << " piece " + << toString(current_piece_number) << " copied. But not moved to original destination table."); + + + /// Try create original table (if not exists) on each shard + try + { + auto create_query_push_ast = rewriteCreateQueryStorage(task_shard.current_pull_table_create_query, + task_table.table_push, task_table.engine_push_ast); + create_query_push_ast->as().if_not_exists = true; + String query = queryToString(create_query_push_ast); + + LOG_DEBUG(log, "Create destination tables. Query: " << query); + UInt64 shards = executeQueryOnCluster(task_table.cluster_push, query, + create_query_push_ast, &task_cluster->settings_push, + PoolMode::GET_MANY); + LOG_DEBUG(log, "Destination tables " << getQuotedTable(task_table.table_push) + << " have been created on " << shards << " shards of " << task_table.cluster_push->getShardCount()); + } + catch (...) + { + tryLogCurrentException(log, "Error while creating original table. Maybe we are not first."); + } + /// Finalize the processing, change state of current partition task (and also check is_dirty flag) { String state_finished = TaskStateWithOwner::getData(TaskState::Finished, host_id); - CleanStateClock new_clean_state_clock (zookeeper, is_dirty_flag_path, is_dirt_cleaned_path); + CleanStateClock new_clean_state_clock (zookeeper, piece_is_dirty_flag_path, piece_is_dirty_cleaned_path); if (clean_state_clock != new_clean_state_clock) { - LOG_INFO(log, "Partition " << task_partition.name << " clean state changed, cowardly bailing"); - return PartitionTaskStatus::Error; + LOG_INFO(log, "Partition " << task_partition.name << " piece " + << toString(current_piece_number) << " clean state changed, cowardly bailing"); + return TaskStatus::Error; } else if (!new_clean_state_clock.is_clean()) { - LOG_INFO(log, "Partition " << task_partition.name << " became dirty and will be dropped and refilled"); + LOG_INFO(log, "Partition " << task_partition.name << " piece " + << toString(current_piece_number) << " became dirty and will be dropped and refilled"); create_is_dirty_node(new_clean_state_clock); - return PartitionTaskStatus::Error; + return TaskStatus::Error; } - zookeeper->set(current_task_status_path, state_finished, 0); + zookeeper->set(current_task_piece_status_path, state_finished, 0); } - LOG_INFO(log, "Partition " << task_partition.name << " copied"); - return PartitionTaskStatus::Finished; + return TaskStatus::Finished; } void ClusterCopier::dropAndCreateLocalTable(const ASTPtr & create_ast) @@ -1169,11 +1560,66 @@ void ClusterCopier::dropLocalTableIfExists(const DatabaseAndTableName & table_na interpreter.execute(); } + +void ClusterCopier::dropHelpingTables(const TaskTable & task_table) +{ + LOG_DEBUG(log, "Removing helping tables"); + for (size_t current_piece_number = 0; current_piece_number < task_table.number_of_splits; ++current_piece_number) + { + DatabaseAndTableName original_table = task_table.table_push; + DatabaseAndTableName helping_table = DatabaseAndTableName(original_table.first, original_table.second + "_piece_" + toString(current_piece_number)); + + String query = "DROP TABLE IF EXISTS " + getQuotedTable(helping_table); + + const ClusterPtr & cluster_push = task_table.cluster_push; + Settings settings_push = task_cluster->settings_push; + + LOG_DEBUG(log, "Execute distributed DROP TABLE: " << query); + /// We have to drop partition_piece on each replica + UInt64 num_nodes = executeQueryOnCluster( + cluster_push, query, + nullptr, + &settings_push, + PoolMode::GET_MANY, + ClusterExecutionMode::ON_EACH_NODE); + + LOG_DEBUG(log, "DROP TABLE query was successfully executed on " << toString(num_nodes) << " nodes."); + } +} + + +void ClusterCopier::dropParticularPartitionPieceFromAllHelpingTables(const TaskTable & task_table, const String & partition_name) +{ + LOG_DEBUG(log, "Try drop partition partition from all helping tables."); + for (size_t current_piece_number = 0; current_piece_number < task_table.number_of_splits; ++current_piece_number) + { + DatabaseAndTableName original_table = task_table.table_push; + DatabaseAndTableName helping_table = DatabaseAndTableName(original_table.first, original_table.second + "_piece_" + toString(current_piece_number)); + + String query = "ALTER TABLE " + getQuotedTable(helping_table) + " DROP PARTITION " + partition_name; + + const ClusterPtr & cluster_push = task_table.cluster_push; + Settings settings_push = task_cluster->settings_push; + + LOG_DEBUG(log, "Execute distributed DROP PARTITION: " << query); + /// We have to drop partition_piece on each replica + UInt64 num_nodes = executeQueryOnCluster( + cluster_push, query, + nullptr, + &settings_push, + PoolMode::GET_MANY, + ClusterExecutionMode::ON_EACH_NODE); + + LOG_DEBUG(log, "DROP PARTITION query was successfully executed on " << toString(num_nodes) << " nodes."); + } + LOG_DEBUG(log, "All helping tables dropped partition " << partition_name); +} + String ClusterCopier::getRemoteCreateTable(const DatabaseAndTableName & table, Connection & connection, const Settings * settings) { String query = "SHOW CREATE TABLE " + getQuotedTable(table); Block block = getBlockWithAllStreamData(std::make_shared( - connection, query, InterpreterShowCreateQuery::getSampleBlock(), context, settings)); + connection, query, InterpreterShowCreateQuery::getSampleBlock(), context, settings)); return typeid_cast(*block.safeGetByPosition(0).column).getDataAt(0).toString(); } @@ -1183,15 +1629,17 @@ ASTPtr ClusterCopier::getCreateTableForPullShard(const ConnectionTimeouts & time /// Fetch and parse (possibly) new definition auto connection_entry = task_shard.info.pool->get(timeouts, &task_cluster->settings_pull, true); String create_query_pull_str = getRemoteCreateTable( - task_shard.task_table.table_pull, - *connection_entry, - &task_cluster->settings_pull); + task_shard.task_table.table_pull, + *connection_entry, + &task_cluster->settings_pull); ParserCreateQuery parser_create_query; return parseQuery(parser_create_query, create_query_pull_str, 0); } -void ClusterCopier::createShardInternalTables(const ConnectionTimeouts & timeouts, TaskShard & task_shard, bool create_split) +/// If it is implicitly asked to create split Distributed table for certain piece on current shard, we will do it. +void ClusterCopier::createShardInternalTables(const ConnectionTimeouts & timeouts, + TaskShard & task_shard, bool create_split) { TaskTable & task_table = task_shard.task_table; @@ -1203,7 +1651,13 @@ void ClusterCopier::createShardInternalTables(const ConnectionTimeouts & timeout String read_shard_prefix = ".read_shard_" + toString(task_shard.indexInCluster()) + "."; String split_shard_prefix = ".split."; task_shard.table_read_shard = DatabaseAndTableName(working_database_name, read_shard_prefix + task_table.table_id); - task_shard.table_split_shard = DatabaseAndTableName(working_database_name, split_shard_prefix + task_table.table_id); + task_shard.main_table_split_shard = DatabaseAndTableName(working_database_name, split_shard_prefix + task_table.table_id); + + for (const auto & piece_number : ext::range(0, task_table.number_of_splits)) + { + task_shard.list_of_split_tables_on_shard[piece_number] = + DatabaseAndTableName(working_database_name, split_shard_prefix + task_table.table_id + "_piece_" + toString(piece_number)); + } /// Create special cluster with single shard String shard_read_cluster_name = read_shard_prefix + task_table.cluster_pull_name; @@ -1211,16 +1665,35 @@ void ClusterCopier::createShardInternalTables(const ConnectionTimeouts & timeout context.setCluster(shard_read_cluster_name, cluster_pull_current_shard); auto storage_shard_ast = createASTStorageDistributed(shard_read_cluster_name, task_table.table_pull.first, task_table.table_pull.second); - const auto & storage_split_ast = task_table.engine_split_ast; auto create_query_ast = removeAliasColumnsFromCreateQuery(task_shard.current_pull_table_create_query); - auto create_table_pull_ast = rewriteCreateQueryStorage(create_query_ast, task_shard.table_read_shard, storage_shard_ast); - auto create_table_split_ast = rewriteCreateQueryStorage(create_query_ast, task_shard.table_split_shard, storage_split_ast); + auto create_table_pull_ast = rewriteCreateQueryStorage(create_query_ast, task_shard.table_read_shard, storage_shard_ast); dropAndCreateLocalTable(create_table_pull_ast); if (create_split) - dropAndCreateLocalTable(create_table_split_ast); + { + auto create_table_split_piece_ast = rewriteCreateQueryStorage( + create_query_ast, + task_shard.main_table_split_shard, + task_table.main_engine_split_ast); + + dropAndCreateLocalTable(create_table_split_piece_ast); + + /// Create auxilary split tables for each piece + for (const auto & piece_number : ext::range(0, task_table.number_of_splits)) + { + const auto & storage_piece_split_ast = task_table.auxiliary_engine_split_asts[piece_number]; + + create_table_split_piece_ast = rewriteCreateQueryStorage( + create_query_ast, + task_shard.list_of_split_tables_on_shard[piece_number], + storage_piece_split_ast); + + dropAndCreateLocalTable(create_table_split_piece_ast); + } + } + } @@ -1266,14 +1739,16 @@ std::set ClusterCopier::getShardPartitions(const ConnectionTimeouts & ti return res; } -bool ClusterCopier::checkShardHasPartition(const ConnectionTimeouts & timeouts, TaskShard & task_shard, const String & partition_quoted_name) +bool ClusterCopier::checkShardHasPartition(const ConnectionTimeouts & timeouts, + TaskShard & task_shard, const String & partition_quoted_name) { createShardInternalTables(timeouts, task_shard, false); TaskTable & task_table = task_shard.task_table; std::string query = "SELECT 1 FROM " + getQuotedTable(task_shard.table_read_shard) - + " WHERE (" + queryToString(task_table.engine_push_partition_key_ast) + " = (" + partition_quoted_name + " AS partition_key))"; + + " WHERE (" + queryToString(task_table.engine_push_partition_key_ast) + + " = (" + partition_quoted_name + " AS partition_key))"; if (!task_table.where_condition_str.empty()) query += " AND (" + task_table.where_condition_str + ")"; @@ -1281,7 +1756,7 @@ bool ClusterCopier::checkShardHasPartition(const ConnectionTimeouts & timeouts, query += " LIMIT 1"; LOG_DEBUG(log, "Checking shard " << task_shard.getDescription() << " for partition " - << partition_quoted_name << " existence, executing query: " << query); + << partition_quoted_name << " existence, executing query: " << query); ParserQuery parser_query(query.data() + query.size()); ASTPtr query_ast = parseQuery(parser_query, query, 0); @@ -1291,14 +1766,58 @@ bool ClusterCopier::checkShardHasPartition(const ConnectionTimeouts & timeouts, return InterpreterFactory::get(query_ast, local_context)->execute().in->read().rows() != 0; } +bool ClusterCopier::checkPresentPartitionPiecesOnCurrentShard(const ConnectionTimeouts & timeouts, + TaskShard & task_shard, const String & partition_quoted_name, size_t current_piece_number) +{ + createShardInternalTables(timeouts, task_shard, false); + TaskTable & task_table = task_shard.task_table; + + std::string query = "SELECT 1 FROM " + getQuotedTable(task_shard.table_read_shard) + + " WHERE (" + queryToString(task_table.engine_push_partition_key_ast) + + " = (" + partition_quoted_name + " AS partition_key))"; + + const size_t number_of_splits = task_table.number_of_splits; + const String & primary_key_comma_separated = task_table.primary_key_comma_separated; + + query += " AND (cityHash64(" + primary_key_comma_separated + ") % " + + std::to_string(number_of_splits) + " = " + std::to_string(current_piece_number) + " )"; + + if (!task_table.where_condition_str.empty()) + query += " AND (" + task_table.where_condition_str + ")"; + + query += " LIMIT 1"; + + LOG_DEBUG(log, "Checking shard " << task_shard.getDescription() << " for partition " + << partition_quoted_name << " piece " << std::to_string(current_piece_number) + << "existence, executing query: " << query); + + ParserQuery parser_query(query.data() + query.size()); + ASTPtr query_ast = parseQuery(parser_query, query, 0); + + Context local_context = context; + local_context.setSettings(task_cluster->settings_pull); + auto result = InterpreterFactory::get(query_ast, local_context)->execute().in->read().rows(); + if (result != 0) + LOG_DEBUG(log, "Partition " << partition_quoted_name << " piece number " + << std::to_string(current_piece_number) << " is PRESENT on shard " << task_shard.getDescription()); + else + LOG_DEBUG(log, "Partition " << partition_quoted_name << " piece number " + << std::to_string(current_piece_number) << " is ABSENT on shard " << task_shard.getDescription()); + return result != 0; +} + +/** Executes simple query (without output streams, for example DDL queries) on each shard of the cluster + * Returns number of shards for which at least one replica executed query successfully + */ UInt64 ClusterCopier::executeQueryOnCluster( - const ClusterPtr & cluster, - const String & query, - const ASTPtr & query_ast_, - const Settings * settings, - PoolMode pool_mode, - UInt64 max_successful_executions_per_shard) const + const ClusterPtr & cluster, + const String & query, + const ASTPtr & query_ast_, + const Settings * settings, + PoolMode pool_mode, + ClusterExecutionMode execution_mode, + UInt64 max_successful_executions_per_shard) const { auto num_shards = cluster->getShardsInfo().size(); std::vector per_shard_num_successful_replicas(num_shards, 0); @@ -1312,6 +1831,11 @@ UInt64 ClusterCopier::executeQueryOnCluster( else query_ast = query_ast_; + /// We will have to execute query on each replica of a shard. + if (execution_mode == ClusterExecutionMode::ON_EACH_NODE) + max_successful_executions_per_shard = 0; + + std::atomic origin_replicas_number; /// We need to execute query on one replica at least auto do_for_shard = [&] (UInt64 shard_index) @@ -1320,13 +1844,15 @@ UInt64 ClusterCopier::executeQueryOnCluster( UInt64 & num_successful_executions = per_shard_num_successful_replicas.at(shard_index); num_successful_executions = 0; - auto increment_and_check_exit = [&] () + auto increment_and_check_exit = [&] () -> bool { ++num_successful_executions; return max_successful_executions_per_shard && num_successful_executions >= max_successful_executions_per_shard; }; UInt64 num_replicas = cluster->getShardsAddresses().at(shard_index).size(); + + origin_replicas_number += num_replicas; UInt64 num_local_replicas = shard.getLocalNodeCount(); UInt64 num_remote_replicas = num_replicas - num_local_replicas; @@ -1381,11 +1907,23 @@ UInt64 ClusterCopier::executeQueryOnCluster( thread_pool.wait(); } - UInt64 successful_shards = 0; + UInt64 successful_nodes = 0; for (UInt64 num_replicas : per_shard_num_successful_replicas) - successful_shards += (num_replicas > 0); + { + if (execution_mode == ClusterExecutionMode::ON_EACH_NODE) + successful_nodes += num_replicas; + else + /// Count only successful shards + successful_nodes += (num_replicas > 0); + } - return successful_shards; -} + if (execution_mode == ClusterExecutionMode::ON_EACH_NODE && successful_nodes != origin_replicas_number) + { + LOG_INFO(log, "There was an error while executing ALTER on each node. Query was executed on " + << toString(successful_nodes) << " nodes. But had to be executed on " << toString(origin_replicas_number.load())); + } + + return successful_nodes; +} } diff --git a/dbms/programs/copier/ClusterCopier.h b/dbms/programs/copier/ClusterCopier.h index 2b7b4fff9e2..4ad6265bb3c 100644 --- a/dbms/programs/copier/ClusterCopier.h +++ b/dbms/programs/copier/ClusterCopier.h @@ -5,8 +5,10 @@ #include "TaskCluster.h" #include "TaskTableAndShard.h" #include "ShardPartition.h" +#include "ShardPartitionPiece.h" #include "ZooKeeperStaff.h" + namespace DB { @@ -27,10 +29,10 @@ public: void init(); - template + template decltype(auto) retry(T && func, UInt64 max_tries = 100); - void discoverShardPartitions(const ConnectionTimeouts & timeouts, const TaskShardPtr & task_shard) ; + void discoverShardPartitions(const ConnectionTimeouts & timeouts, const TaskShardPtr & task_shard); /// Compute set of partitions, assume set of partitions aren't changed during the processing void discoverTablePartitions(const ConnectionTimeouts & timeouts, TaskTable & task_table, UInt64 num_threads = 0); @@ -54,6 +56,10 @@ public: copy_fault_probability = copy_fault_probability_; } + void setMoveFaultProbability(double move_fault_probability_) + { + move_fault_probability = move_fault_probability_; + } protected: @@ -73,59 +79,102 @@ protected: } zkutil::EphemeralNodeHolder::Ptr createTaskWorkerNodeAndWaitIfNeed( - const zkutil::ZooKeeperPtr &zookeeper, - const String &description, + const zkutil::ZooKeeperPtr & zookeeper, + const String & description, bool unprioritized); + /* + * Checks that partition piece or some other entity is clean. + * The only requirement is that you have to pass is_dirty_flag_path and is_dirty_cleaned_path to the function. + * And is_dirty_flag_path is a parent of is_dirty_cleaned_path. + * */ + static bool checkPartitionPieceIsClean( + const zkutil::ZooKeeperPtr & zookeeper, + const CleanStateClock & clean_state_clock, + const String & task_status_path); + + bool checkAllPiecesInPartitionAreDone(const TaskTable & task_table, const String & partition_name, const TasksShard & shards_with_partition); + /** Checks that the whole partition of a table was copied. We should do it carefully due to dirty lock. * State of some task could change during the processing. * We have to ensure that all shards have the finished state and there is no dirty flag. * Moreover, we have to check status twice and check zxid, because state can change during the checking. */ - bool checkPartitionIsDone(const TaskTable & task_table, const String & partition_name, - const TasksShard & shards_with_partition); + + /* The same as function above + * Assume that we don't know on which shards do we have partition certain piece. + * We'll check them all (I mean shards that contain the whole partition) + * And shards that don't have certain piece MUST mark that piece is_done true. + * */ + bool checkPartitionPieceIsDone(const TaskTable & task_table, const String & partition_name, + size_t piece_number, const TasksShard & shards_with_partition); + + + /*Alter successful insertion to helping tables it will move all pieces to destination table*/ + TaskStatus tryMoveAllPiecesToDestinationTable(const TaskTable & task_table, const String & partition_name); /// Removes MATERIALIZED and ALIAS columns from create table query - static ASTPtr removeAliasColumnsFromCreateQuery(const ASTPtr &query_ast); - - bool tryDropPartition(ShardPartition & task_partition, - const zkutil::ZooKeeperPtr & zookeeper, - const CleanStateClock & clean_state_clock); + static ASTPtr removeAliasColumnsFromCreateQuery(const ASTPtr & query_ast); + bool tryDropPartitionPiece(ShardPartition & task_partition, const size_t current_piece_number, + const zkutil::ZooKeeperPtr & zookeeper, const CleanStateClock & clean_state_clock); static constexpr UInt64 max_table_tries = 1000; static constexpr UInt64 max_shard_partition_tries = 600; + static constexpr UInt64 max_shard_partition_piece_tries_for_alter = 100; bool tryProcessTable(const ConnectionTimeouts & timeouts, TaskTable & task_table); - PartitionTaskStatus tryProcessPartitionTask(const ConnectionTimeouts & timeouts, - ShardPartition & task_partition, - bool is_unprioritized_task); + /// Job for copying partition from particular shard. + TaskStatus tryProcessPartitionTask(const ConnectionTimeouts & timeouts, + ShardPartition & task_partition, + bool is_unprioritized_task); - PartitionTaskStatus processPartitionTaskImpl(const ConnectionTimeouts & timeouts, - ShardPartition & task_partition, - bool is_unprioritized_task); + TaskStatus iterateThroughAllPiecesInPartition(const ConnectionTimeouts & timeouts, + ShardPartition & task_partition, + bool is_unprioritized_task); + + TaskStatus processPartitionPieceTaskImpl(const ConnectionTimeouts & timeouts, + ShardPartition & task_partition, + const size_t current_piece_number, + bool is_unprioritized_task); void dropAndCreateLocalTable(const ASTPtr & create_ast); - void dropLocalTableIfExists (const DatabaseAndTableName & table_name) const; + void dropLocalTableIfExists(const DatabaseAndTableName & table_name) const; - String getRemoteCreateTable(const DatabaseAndTableName & table, - Connection & connection, - const Settings * settings = nullptr); + void dropHelpingTables(const TaskTable & task_table); + + /// Is used for usage less disk space. + /// After all pieces were successfully moved to original destination + /// table we can get rid of partition pieces (partitions in helping tables). + void dropParticularPartitionPieceFromAllHelpingTables(const TaskTable & task_table, const String & partition_name); + + String getRemoteCreateTable(const DatabaseAndTableName & table, Connection & connection, const Settings * settings = nullptr); ASTPtr getCreateTableForPullShard(const ConnectionTimeouts & timeouts, TaskShard & task_shard); - void createShardInternalTables(const ConnectionTimeouts & timeouts, - TaskShard & task_shard, - bool create_split = true); + /// If it is implicitly asked to create split Distributed table for certain piece on current shard, we will do it. + void createShardInternalTables(const ConnectionTimeouts & timeouts, TaskShard & task_shard, bool create_split = true); - std::set getShardPartitions(const ConnectionTimeouts & timeouts, - TaskShard & task_shard); + std::set getShardPartitions(const ConnectionTimeouts & timeouts, TaskShard & task_shard); - bool checkShardHasPartition(const ConnectionTimeouts & timeouts, - TaskShard & task_shard, - const String & partition_quoted_name); + bool checkShardHasPartition(const ConnectionTimeouts & timeouts, TaskShard & task_shard, const String & partition_quoted_name); + + bool checkPresentPartitionPiecesOnCurrentShard(const ConnectionTimeouts & timeouts, + TaskShard & task_shard, const String & partition_quoted_name, size_t current_piece_number); + + /* + * This class is used in executeQueryOnCluster function + * You can execute query on each shard (no sense it is executed on each replica of a shard or not) + * or you can execute query on each replica on each shard. + * First mode is useful for INSERTS queries. + * */ + enum ClusterExecutionMode + { + ON_EACH_SHARD, + ON_EACH_NODE + }; /** Executes simple query (without output streams, for example DDL queries) on each shard of the cluster * Returns number of shards for which at least one replica executed query successfully @@ -136,6 +185,7 @@ protected: const ASTPtr & query_ast_ = nullptr, const Settings * settings = nullptr, PoolMode pool_mode = PoolMode::GET_ALL, + ClusterExecutionMode execution_mode = ClusterExecutionMode::ON_EACH_SHARD, UInt64 max_successful_executions_per_shard = 0) const; private: @@ -145,25 +195,25 @@ private: String working_database_name; /// Auto update config stuff - UInt64 task_descprtion_current_version = 1; - std::atomic task_descprtion_version{1}; + UInt64 task_description_current_version = 1; + std::atomic task_description_version{1}; Coordination::WatchCallback task_description_watch_callback; /// ZooKeeper session used to set the callback zkutil::ZooKeeperPtr task_description_watch_zookeeper; ConfigurationPtr task_cluster_initial_config; ConfigurationPtr task_cluster_current_config; - Coordination::Stat task_descprtion_current_stat{}; + Coordination::Stat task_description_current_stat{}; std::unique_ptr task_cluster; bool is_safe_mode = false; double copy_fault_probability = 0.0; + double move_fault_probability = 0.0; Context & context; Poco::Logger * log; std::chrono::milliseconds default_sleep_time{1000}; }; - } diff --git a/dbms/programs/copier/ClusterCopierApp.cpp b/dbms/programs/copier/ClusterCopierApp.cpp index e49c0d8eca4..14bfd3a3339 100644 --- a/dbms/programs/copier/ClusterCopierApp.cpp +++ b/dbms/programs/copier/ClusterCopierApp.cpp @@ -17,6 +17,8 @@ void ClusterCopierApp::initialize(Poco::Util::Application & self) is_safe_mode = config().has("safe-mode"); if (config().has("copy-fault-probability")) copy_fault_probability = std::max(std::min(config().getDouble("copy-fault-probability"), 1.0), 0.0); + if (config().has("move-fault-probability")) + move_fault_probability = std::max(std::min(config().getDouble("move-fault-probability"), 1.0), 0.0); base_dir = (config().has("base-dir")) ? config().getString("base-dir") : Poco::Path::current(); // process_id is '#_' time_t timestamp = Poco::Timestamp().epochTime(); @@ -58,23 +60,25 @@ void ClusterCopierApp::defineOptions(Poco::Util::OptionSet & options) Base::defineOptions(options); options.addOption(Poco::Util::Option("task-path", "", "path to task in ZooKeeper") - .argument("task-path").binding("task-path")); + .argument("task-path").binding("task-path")); options.addOption(Poco::Util::Option("task-file", "", "path to task file for uploading in ZooKeeper to task-path") - .argument("task-file").binding("task-file")); + .argument("task-file").binding("task-file")); options.addOption(Poco::Util::Option("task-upload-force", "", "Force upload task-file even node already exists") - .argument("task-upload-force").binding("task-upload-force")); + .argument("task-upload-force").binding("task-upload-force")); options.addOption(Poco::Util::Option("safe-mode", "", "disables ALTER DROP PARTITION in case of errors") - .binding("safe-mode")); + .binding("safe-mode")); options.addOption(Poco::Util::Option("copy-fault-probability", "", "the copying fails with specified probability (used to test partition state recovering)") - .argument("copy-fault-probability").binding("copy-fault-probability")); + .argument("copy-fault-probability").binding("copy-fault-probability")); + options.addOption(Poco::Util::Option("move-fault-probability", "", "the moving fails with specified probability (used to test partition state recovering)") + .argument("move-fault-probability").binding("move-fault-probability")); options.addOption(Poco::Util::Option("log-level", "", "sets log level") - .argument("log-level").binding("log-level")); + .argument("log-level").binding("log-level")); options.addOption(Poco::Util::Option("base-dir", "", "base directory for copiers, consecutive copier launches will populate /base-dir/launch_id/* directories") - .argument("base-dir").binding("base-dir")); + .argument("base-dir").binding("base-dir")); using Me = std::decay_t; options.addOption(Poco::Util::Option("help", "", "produce this help message").binding("help") - .callback(Poco::Util::OptionCallback(this, &Me::handleHelp))); + .callback(Poco::Util::OptionCallback(this, &Me::handleHelp))); } @@ -85,10 +89,10 @@ void ClusterCopierApp::mainImpl() auto log = &logger(); LOG_INFO(log, "Starting clickhouse-copier (" - << "id " << process_id << ", " - << "host_id " << host_id << ", " - << "path " << process_path << ", " - << "revision " << ClickHouseRevision::get() << ")"); + << "id " << process_id << ", " + << "host_id " << host_id << ", " + << "path " << process_path << ", " + << "revision " << ClickHouseRevision::get() << ")"); auto context = std::make_unique(Context::createGlobal()); context->makeGlobalContext(); @@ -115,6 +119,7 @@ void ClusterCopierApp::mainImpl() auto copier = std::make_unique(task_path, host_id, default_database, *context); copier->setSafeMode(is_safe_mode); copier->setCopyFaultProbability(copy_fault_probability); + copier->setMoveFaultProbability(move_fault_probability); auto task_file = config().getString("task-file", ""); if (!task_file.empty()) diff --git a/dbms/programs/copier/ClusterCopierApp.h b/dbms/programs/copier/ClusterCopierApp.h index 25350aefd3a..8cadd9d5dff 100644 --- a/dbms/programs/copier/ClusterCopierApp.h +++ b/dbms/programs/copier/ClusterCopierApp.h @@ -78,7 +78,8 @@ private: std::string task_path; std::string log_level = "trace"; bool is_safe_mode = false; - double copy_fault_probability = 0; + double copy_fault_probability = 0.0; + double move_fault_probability = 0.0; bool is_help = false; std::string base_dir; diff --git a/dbms/programs/copier/Internals.cpp b/dbms/programs/copier/Internals.cpp index c7fb8405ec9..545df2e779c 100644 --- a/dbms/programs/copier/Internals.cpp +++ b/dbms/programs/copier/Internals.cpp @@ -1,4 +1,5 @@ #include "Internals.h" +#include namespace DB { @@ -7,6 +8,8 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } +using ConfigurationPtr = Poco::AutoPtr; + ConfigurationPtr getConfigurationFromXMLString(const std::string & xml_data) { std::stringstream ss(xml_data); @@ -14,7 +17,6 @@ ConfigurationPtr getConfigurationFromXMLString(const std::string & xml_data) return {new Poco::Util::XMLConfiguration{&input_source}}; } - String getQuotedTable(const String & database, const String & table) { if (database.empty()) @@ -114,6 +116,142 @@ ASTPtr extractPartitionKey(const ASTPtr & storage_ast) } } +ASTPtr extractPrimaryKey(const ASTPtr & storage_ast) +{ + String storage_str = queryToString(storage_ast); + + const auto & storage = storage_ast->as(); + const auto & engine = storage.engine->as(); + + if (!endsWith(engine.name, "MergeTree")) + { + throw Exception("Unsupported engine was specified in " + storage_str + ", only *MergeTree engines are supported", + ErrorCodes::BAD_ARGUMENTS); + } + + if (!isExtendedDefinitionStorage(storage_ast)) + { + throw Exception("Is not extended deginition storage " + storage_str + " Will be fixed later.", + ErrorCodes::BAD_ARGUMENTS); + } + + if (storage.primary_key) + return storage.primary_key->clone(); + + return nullptr; +} + + +ASTPtr extractOrderBy(const ASTPtr & storage_ast) +{ + String storage_str = queryToString(storage_ast); + + const auto & storage = storage_ast->as(); + const auto & engine = storage.engine->as(); + + if (!endsWith(engine.name, "MergeTree")) + { + throw Exception("Unsupported engine was specified in " + storage_str + ", only *MergeTree engines are supported", + ErrorCodes::BAD_ARGUMENTS); + } + + if (!isExtendedDefinitionStorage(storage_ast)) + { + throw Exception("Is not extended deginition storage " + storage_str + " Will be fixed later.", + ErrorCodes::BAD_ARGUMENTS); + } + + if (storage.order_by) + return storage.order_by->clone(); + + throw Exception("ORDER BY cannot be empty", ErrorCodes::BAD_ARGUMENTS); +} + + +String createCommaSeparatedStringFrom(const Names & names) +{ + std::ostringstream ss; + if (!names.empty()) + { + std::copy(names.begin(), std::prev(names.end()), std::ostream_iterator(ss, ", ")); + ss << names.back(); + } + return ss.str(); +} + +Names extractPrimaryKeyColumnNames(const ASTPtr & storage_ast) +{ + const auto sorting_key_ast = extractOrderBy(storage_ast); + const auto primary_key_ast = extractPrimaryKey(storage_ast); + + const auto sorting_key_expr_list = MergeTreeData::extractKeyExpressionList(sorting_key_ast); + const auto primary_key_expr_list = primary_key_ast + ? MergeTreeData::extractKeyExpressionList(primary_key_ast) : sorting_key_expr_list->clone(); + + /// Maybe we have to handle VersionedCollapsing engine separately. But in our case in looks pointless. + + size_t primary_key_size = primary_key_expr_list->children.size(); + size_t sorting_key_size = sorting_key_expr_list->children.size(); + + if (primary_key_size > sorting_key_size) + throw Exception("Primary key must be a prefix of the sorting key, but its length: " + + toString(primary_key_size) + " is greater than the sorting key length: " + toString(sorting_key_size), + ErrorCodes::BAD_ARGUMENTS); + + Names primary_key_columns; + Names sorting_key_columns; + NameSet primary_key_columns_set; + + for (size_t i = 0; i < sorting_key_size; ++i) + { + String sorting_key_column = sorting_key_expr_list->children[i]->getColumnName(); + sorting_key_columns.push_back(sorting_key_column); + + if (i < primary_key_size) + { + String pk_column = primary_key_expr_list->children[i]->getColumnName(); + if (pk_column != sorting_key_column) + throw Exception("Primary key must be a prefix of the sorting key, but in position " + + toString(i) + " its column is " + pk_column + ", not " + sorting_key_column, + ErrorCodes::BAD_ARGUMENTS); + + if (!primary_key_columns_set.emplace(pk_column).second) + throw Exception("Primary key contains duplicate columns", ErrorCodes::BAD_ARGUMENTS); + + primary_key_columns.push_back(pk_column); + } + } + + return primary_key_columns; +} + +String extractReplicatedTableZookeeperPath(const ASTPtr & storage_ast) +{ + String storage_str = queryToString(storage_ast); + + const auto & storage = storage_ast->as(); + const auto & engine = storage.engine->as(); + + if (!endsWith(engine.name, "MergeTree")) + { + throw Exception( + "Unsupported engine was specified in " + storage_str + ", only *MergeTree engines are supported", + ErrorCodes::BAD_ARGUMENTS); + } + + if (!startsWith(engine.name, "Replicated")) + { + return ""; + } + + auto replicated_table_arguments = engine.arguments->children; + + auto zk_table_path_ast = replicated_table_arguments[0]->as(); + auto zk_table_path_string = zk_table_path_ast.value.safeGet(); + + return zk_table_path_string; +} + ShardPriority getReplicasPriority(const Cluster::Addresses & replicas, const std::string & local_hostname, UInt8 random) { ShardPriority res; diff --git a/dbms/programs/copier/Internals.h b/dbms/programs/copier/Internals.h index c47f42417d3..8e4f7afeb6e 100644 --- a/dbms/programs/copier/Internals.h +++ b/dbms/programs/copier/Internals.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -144,15 +145,15 @@ struct ShardPriority } }; -/// Execution status of a task -enum class PartitionTaskStatus +/// Execution status of a task. +/// Is used for: partition copying task status, partition piece copying task status, partition moving task status. +enum class TaskStatus { Active, Finished, Error, }; - struct MultiTransactionInfo { int32_t code; @@ -174,6 +175,35 @@ bool isExtendedDefinitionStorage(const ASTPtr & storage_ast); ASTPtr extractPartitionKey(const ASTPtr & storage_ast); +/* +* Choosing a Primary Key that Differs from the Sorting Key +* It is possible to specify a primary key (an expression with values that are written in the index file for each mark) +* that is different from the sorting key (an expression for sorting the rows in data parts). +* In this case the primary key expression tuple must be a prefix of the sorting key expression tuple. +* This feature is helpful when using the SummingMergeTree and AggregatingMergeTree table engines. +* In a common case when using these engines, the table has two types of columns: dimensions and measures. +* Typical queries aggregate values of measure columns with arbitrary GROUP BY and filtering by dimensions. +* Because SummingMergeTree and AggregatingMergeTree aggregate rows with the same value of the sorting key, +* it is natural to add all dimensions to it. As a result, the key expression consists of a long list of columns +* and this list must be frequently updated with newly added dimensions. +* In this case it makes sense to leave only a few columns in the primary key that will provide efficient +* range scans and add the remaining dimension columns to the sorting key tuple. +* ALTER of the sorting key is a lightweight operation because when a new column is simultaneously added t +* o the table and to the sorting key, existing data parts don't need to be changed. +* Since the old sorting key is a prefix of the new sorting key and there is no data in the newly added column, +* the data is sorted by both the old and new sorting keys at the moment of table modification. +* +* */ +ASTPtr extractPrimaryKey(const ASTPtr & storage_ast); + +ASTPtr extractOrderBy(const ASTPtr & storage_ast); + +String createCommaSeparatedStringFrom(const Names & names); + +Names extractPrimaryKeyColumnNames(const ASTPtr & storage_ast); + +String extractReplicatedTableZookeeperPath(const ASTPtr & storage_ast); + ShardPriority getReplicasPriority(const Cluster::Addresses & replicas, const std::string & local_hostname, UInt8 random); } diff --git a/dbms/programs/copier/ShardPartition.h b/dbms/programs/copier/ShardPartition.h index a299cf496d8..7de381977f9 100644 --- a/dbms/programs/copier/ShardPartition.h +++ b/dbms/programs/copier/ShardPartition.h @@ -1,24 +1,46 @@ #pragma once #include "Aliases.h" +#include "TaskTableAndShard.h" namespace DB { /// Just destination partition of a shard +/// I don't know what this comment means. +/// In short, when we discovered what shards contain currently processing partition, +/// This class describes a partition (name) that is stored on the shard (parent). struct ShardPartition { - ShardPartition(TaskShard & parent, const String & name_quoted_) : task_shard(parent), name(name_quoted_) {} + ShardPartition(TaskShard &parent, String name_quoted_, size_t number_of_splits = 10) + : task_shard(parent), name(std::move(name_quoted_)) { pieces.reserve(number_of_splits); } String getPartitionPath() const; + + String getPartitionPiecePath(size_t current_piece_number) const; + String getPartitionCleanStartPath() const; + + String getPartitionPieceCleanStartPath(size_t current_piece_number) const; + String getCommonPartitionIsDirtyPath() const; + String getCommonPartitionIsCleanedPath() const; + String getPartitionActiveWorkersPath() const; + String getActiveWorkerPath() const; + String getPartitionShardsPath() const; + String getShardStatusPath() const; + /// What partition pieces are present in current shard. + /// FYI: Piece is a part of partition which has modulo equals to concrete constant (less than number_of_splits obliously) + /// For example SELECT ... from ... WHERE partition=current_partition AND cityHash64(*) == const; + /// Absent pieces have field is_absent_piece equals to true. + PartitionPieces pieces; + TaskShard & task_shard; String name; }; @@ -28,11 +50,23 @@ inline String ShardPartition::getPartitionCleanStartPath() const return getPartitionPath() + "/clean_start"; } +inline String ShardPartition::getPartitionPieceCleanStartPath(size_t current_piece_number) const +{ + assert(current_piece_number < task_shard.task_table.number_of_splits); + return getPartitionPiecePath(current_piece_number) + "/clean_start"; +} + inline String ShardPartition::getPartitionPath() const { return task_shard.task_table.getPartitionPath(name); } +inline String ShardPartition::getPartitionPiecePath(size_t current_piece_number) const +{ + assert(current_piece_number < task_shard.task_table.number_of_splits); + return task_shard.task_table.getPartitionPiecePath(name, current_piece_number); +} + inline String ShardPartition::getShardStatusPath() const { // schema: //tables///shards/ diff --git a/dbms/programs/copier/ShardPartitionPiece.h b/dbms/programs/copier/ShardPartitionPiece.h new file mode 100644 index 00000000000..a21fd531da4 --- /dev/null +++ b/dbms/programs/copier/ShardPartitionPiece.h @@ -0,0 +1,88 @@ +#pragma once + +#include "Internals.h" + +namespace DB +{ + +struct ShardPartitionPiece +{ + + ShardPartitionPiece(ShardPartition &parent, size_t current_piece_number_, bool is_present_piece_) + : is_absent_piece(!is_present_piece_), current_piece_number(current_piece_number_), + shard_partition(parent) {} + + String getPartitionPiecePath() const; + + String getPartitionPieceCleanStartPath() const; + + String getPartitionPieceIsDirtyPath() const; + + String getPartitionPieceIsCleanedPath() const; + + String getPartitionPieceActiveWorkersPath() const; + + String getActiveWorkerPath() const ; + + /// On what shards do we have current partition. + String getPartitionPieceShardsPath() const; + + String getShardStatusPath() const; + + String getPartitionPieceCleanerPath() const; + + bool is_absent_piece; + const size_t current_piece_number; + + ShardPartition & shard_partition; +}; + + +inline String ShardPartitionPiece::getPartitionPiecePath() const +{ + return shard_partition.getPartitionPath() + "/piece_" + toString(current_piece_number); +} + +inline String ShardPartitionPiece::getPartitionPieceCleanStartPath() const +{ + return getPartitionPiecePath() + "/clean_start"; +} + +inline String ShardPartitionPiece::getPartitionPieceIsDirtyPath() const +{ + return getPartitionPiecePath() + "/is_dirty"; +} + +inline String ShardPartitionPiece::getPartitionPieceIsCleanedPath() const +{ + return getPartitionPieceIsDirtyPath() + "/cleaned"; +} + +inline String ShardPartitionPiece::getPartitionPieceActiveWorkersPath() const +{ + return getPartitionPiecePath() + "/partition_piece_active_workers"; +} + +inline String ShardPartitionPiece::getActiveWorkerPath() const +{ + return getPartitionPieceActiveWorkersPath() + "/" + toString(shard_partition.task_shard.numberInCluster()); +} + +/// On what shards do we have current partition. +inline String ShardPartitionPiece::getPartitionPieceShardsPath() const +{ + return getPartitionPiecePath() + "/shards"; +} + +inline String ShardPartitionPiece::getShardStatusPath() const +{ + return getPartitionPieceShardsPath() + "/" + toString(shard_partition.task_shard.numberInCluster()); +} + +inline String ShardPartitionPiece::getPartitionPieceCleanerPath() const +{ + return getPartitionPieceIsDirtyPath() + "/cleaner"; +} + + +} diff --git a/dbms/programs/copier/TaskTableAndShard.h b/dbms/programs/copier/TaskTableAndShard.h index cb4753264ed..615ad297b79 100644 --- a/dbms/programs/copier/TaskTableAndShard.h +++ b/dbms/programs/copier/TaskTableAndShard.h @@ -21,16 +21,44 @@ struct TaskTable TaskCluster & task_cluster; + /// These functions used in checkPartitionIsDone() or checkPartitionPieceIsDone() + /// They are implemented here not to call task_table.tasks_shard[partition_name].second.pieces[current_piece_number] etc. + String getPartitionPath(const String & partition_name) const; - String getPartitionIsDirtyPath(const String & partition_name) const; - String getPartitionIsCleanedPath(const String & partition_name) const; - String getPartitionTaskStatusPath(const String & partition_name) const; + + String getPartitionAttachIsActivePath(const String & partition_name) const; + + String getPartitionAttachIsDonePath(const String & partition_name) const; + + String getPartitionPiecePath(const String & partition_name, const size_t piece_number) const; + + String getCertainPartitionIsDirtyPath(const String & partition_name) const; + + String getCertainPartitionPieceIsDirtyPath(const String & partition_name, const size_t piece_number) const; + + String getCertainPartitionIsCleanedPath(const String & partition_name) const; + + String getCertainPartitionPieceIsCleanedPath(const String & partition_name, const size_t piece_number) const; + + String getCertainPartitionTaskStatusPath(const String & partition_name) const; + + String getCertainPartitionPieceTaskStatusPath(const String & partition_name, const size_t piece_number) const; + + + bool isReplicatedTable() const { return engine_push_zk_path != ""; } + + /// Partitions will be splitted into number-of-splits pieces. + /// Each piece will be copied independently. (10 by default) + size_t number_of_splits; String name_in_config; /// Used as task ID String table_id; + /// Column names in primary key + String primary_key_comma_separated; + /// Source cluster and table String cluster_pull_name; DatabaseAndTableName table_pull; @@ -40,14 +68,31 @@ struct TaskTable DatabaseAndTableName table_push; /// Storage of destination table + /// (tables that are stored on each shard of target cluster) String engine_push_str; ASTPtr engine_push_ast; ASTPtr engine_push_partition_key_ast; - /// A Distributed table definition used to split data + /// First argument of Replicated...MergeTree() + String engine_push_zk_path; + + ASTPtr rewriteReplicatedCreateQueryToPlain(); + + /* + * A Distributed table definition used to split data + * Distributed table will be created on each shard of default + * cluster to perform data copying and resharding + * */ String sharding_key_str; ASTPtr sharding_key_ast; - ASTPtr engine_split_ast; + ASTPtr main_engine_split_ast; + + /* + * To copy partiton piece form one cluster to another we have to use Distributed table. + * In case of usage separate table (engine_push) for each partiton piece, + * we have to use many Distributed tables. + * */ + ASTs auxiliary_engine_split_asts; /// Additional WHERE expression to filter input data String where_condition_str; @@ -62,10 +107,15 @@ struct TaskTable Strings enabled_partitions; NameSet enabled_partitions_set; - /// Prioritized list of shards + /** + * Prioritized list of shards + * all_shards contains information about all shards in the table. + * So we have to check whether particular shard have current partiton or not while processing. + */ TasksShard all_shards; TasksShard local_shards; + /// All partitions of the current table. ClusterPartitions cluster_partitions; NameSet finished_cluster_partitions; @@ -76,7 +126,8 @@ struct TaskTable { auto it = cluster_partitions.find(partition_name); if (it == cluster_partitions.end()) - throw Exception("There are no cluster partition " + partition_name + " in " + table_id, ErrorCodes::LOGICAL_ERROR); + throw Exception("There are no cluster partition " + partition_name + " in " + table_id, + ErrorCodes::LOGICAL_ERROR); return it->second; } @@ -85,13 +136,16 @@ struct TaskTable UInt64 rows_copied = 0; template - void initShards(RandomEngine && random_engine); + void initShards(RandomEngine &&random_engine); }; struct TaskShard { - TaskShard(TaskTable &parent, const ShardInfo &info_) : task_table(parent), info(info_) {} + TaskShard(TaskTable & parent, const ShardInfo & info_) : task_table(parent), info(info_) + { + list_of_split_tables_on_shard.assign(task_table.number_of_splits, DatabaseAndTableName()); + } TaskTable & task_table; @@ -123,7 +177,8 @@ struct TaskShard /// Internal distributed tables DatabaseAndTableName table_read_shard; - DatabaseAndTableName table_split_shard; + DatabaseAndTableName main_table_split_shard; + ListOfDatabasesAndTableNames list_of_split_tables_on_shard; }; @@ -134,29 +189,62 @@ inline String TaskTable::getPartitionPath(const String & partition_name) const + "/" + escapeForFileName(partition_name); // 201701 } -inline String TaskTable::getPartitionIsDirtyPath(const String & partition_name) const +inline String TaskTable::getPartitionAttachIsActivePath(const String & partition_name) const +{ + return getPartitionPath(partition_name) + "/attach_active"; +} + +inline String TaskTable::getPartitionAttachIsDonePath(const String & partition_name) const +{ + return getPartitionPath(partition_name) + "/attach_is_done"; +} + +inline String TaskTable::getPartitionPiecePath(const String & partition_name, size_t piece_number) const +{ + assert(piece_number < number_of_splits); + return getPartitionPath(partition_name) + "/piece_" + toString(piece_number); // 1...number_of_splits +} + +inline String TaskTable::getCertainPartitionIsDirtyPath(const String &partition_name) const { return getPartitionPath(partition_name) + "/is_dirty"; } -inline String TaskTable::getPartitionIsCleanedPath(const String & partition_name) const +inline String TaskTable::getCertainPartitionPieceIsDirtyPath(const String & partition_name, const size_t piece_number) const { - return getPartitionIsDirtyPath(partition_name) + "/cleaned"; + return getPartitionPiecePath(partition_name, piece_number) + "/is_dirty"; } -inline String TaskTable::getPartitionTaskStatusPath(const String & partition_name) const +inline String TaskTable::getCertainPartitionIsCleanedPath(const String & partition_name) const +{ + return getCertainPartitionIsDirtyPath(partition_name) + "/cleaned"; +} + +inline String TaskTable::getCertainPartitionPieceIsCleanedPath(const String & partition_name, const size_t piece_number) const +{ + return getCertainPartitionPieceIsDirtyPath(partition_name, piece_number) + "/cleaned"; +} + +inline String TaskTable::getCertainPartitionTaskStatusPath(const String & partition_name) const { return getPartitionPath(partition_name) + "/shards"; } -inline TaskTable::TaskTable(TaskCluster & parent, const Poco::Util::AbstractConfiguration & config, const String & prefix_, - const String & table_key) +inline String TaskTable::getCertainPartitionPieceTaskStatusPath(const String & partition_name, const size_t piece_number) const +{ + return getPartitionPiecePath(partition_name, piece_number) + "/shards"; +} + +inline TaskTable::TaskTable(TaskCluster & parent, const Poco::Util::AbstractConfiguration & config, + const String & prefix_, const String & table_key) : task_cluster(parent) { String table_prefix = prefix_ + "." + table_key + "."; name_in_config = table_key; + number_of_splits = config.getUInt64(table_prefix + "number_of_splits", 10); + cluster_pull_name = config.getString(table_prefix + "cluster_pull"); cluster_push_name = config.getString(table_prefix + "cluster_push"); @@ -176,13 +264,27 @@ inline TaskTable::TaskTable(TaskCluster & parent, const Poco::Util::AbstractConf ParserStorage parser_storage; engine_push_ast = parseQuery(parser_storage, engine_push_str, 0); engine_push_partition_key_ast = extractPartitionKey(engine_push_ast); + primary_key_comma_separated = createCommaSeparatedStringFrom(extractPrimaryKeyColumnNames(engine_push_ast)); + engine_push_zk_path = extractReplicatedTableZookeeperPath(engine_push_ast); } sharding_key_str = config.getString(table_prefix + "sharding_key"); + + auxiliary_engine_split_asts.reserve(number_of_splits); { ParserExpressionWithOptionalAlias parser_expression(false); sharding_key_ast = parseQuery(parser_expression, sharding_key_str, 0); - engine_split_ast = createASTStorageDistributed(cluster_push_name, table_push.first, table_push.second, sharding_key_ast); + main_engine_split_ast = createASTStorageDistributed(cluster_push_name, table_push.first, table_push.second, + sharding_key_ast); + + for (const auto piece_number : ext::range(0, number_of_splits)) + { + auxiliary_engine_split_asts.emplace_back + ( + createASTStorageDistributed(cluster_push_name, table_push.first, + table_push.second + "_piece_" + toString(piece_number), sharding_key_ast) + ); + } } where_condition_str = config.getString(table_prefix + "where_condition", ""); @@ -213,7 +315,7 @@ inline TaskTable::TaskTable(TaskCluster & parent, const Poco::Util::AbstractConf else { /// Parse sequence of ... - for (const String & key : keys) + for (const String &key : keys) { if (!startsWith(key, "partition")) throw Exception("Unknown key " + key + " in " + enabled_partitions_prefix, ErrorCodes::UNKNOWN_ELEMENT_IN_CONFIG); @@ -259,6 +361,25 @@ inline void TaskTable::initShards(RandomEngine && random_engine) local_shards.assign(all_shards.begin(), it_first_remote); } +inline ASTPtr TaskTable::rewriteReplicatedCreateQueryToPlain() +{ + ASTPtr prev_engine_push_ast = engine_push_ast->clone(); + + auto & new_storage_ast = prev_engine_push_ast->as(); + auto & new_engine_ast = new_storage_ast.engine->as(); + + auto & replicated_table_arguments = new_engine_ast.arguments->children; + + /// Delete first two arguments of Replicated...MergeTree() table. + replicated_table_arguments.erase(replicated_table_arguments.begin()); + replicated_table_arguments.erase(replicated_table_arguments.begin()); + + /// Remove replicated from name + new_engine_ast.name = new_engine_ast.name.substr(10); + + return new_storage_ast.clone(); +} + inline String DB::TaskShard::getDescription() const { @@ -272,7 +393,7 @@ inline String DB::TaskShard::getDescription() const inline String DB::TaskShard::getHostNameExample() const { - auto &replicas = task_table.cluster_pull->getShardsAddresses().at(indexInCluster()); + auto & replicas = task_table.cluster_pull->getShardsAddresses().at(indexInCluster()); return replicas.at(0).readableString(); } diff --git a/dbms/programs/copier/ZooKeeperStaff.h b/dbms/programs/copier/ZooKeeperStaff.h index 3133c68933d..2fc4d35400d 100644 --- a/dbms/programs/copier/ZooKeeperStaff.h +++ b/dbms/programs/copier/ZooKeeperStaff.h @@ -157,11 +157,8 @@ public: bool is_clean() const { - return - !is_stale() - && ( - !discovery_zxid.hasHappened() - || (clean_state_zxid.hasHappened() && discovery_zxid <= clean_state_zxid)); + return !is_stale() + && (!discovery_zxid.hasHappened() || (clean_state_zxid.hasHappened() && discovery_zxid <= clean_state_zxid)); } bool is_stale() const diff --git a/dbms/programs/local/LocalServer.cpp b/dbms/programs/local/LocalServer.cpp index ec2c01924f6..26752da5d87 100644 --- a/dbms/programs/local/LocalServer.cpp +++ b/dbms/programs/local/LocalServer.cpp @@ -148,7 +148,6 @@ try return Application::EXIT_OK; } - context = std::make_unique(Context::createGlobal()); context->makeGlobalContext(); context->setApplicationType(Context::ApplicationType::LOCAL); @@ -180,7 +179,7 @@ try setupUsers(); /// Limit on total number of concurrently executing queries. - /// There is no need for concurrent threads, override max_concurrent_queries. + /// There is no need for concurrent queries, override max_concurrent_queries. context->getProcessList().setMaxSize(0); /// Size of cache for uncompressed blocks. Zero means disabled. diff --git a/dbms/programs/main.cpp b/dbms/programs/main.cpp index 17518ad4e37..3c16fb64a57 100644 --- a/dbms/programs/main.cpp +++ b/dbms/programs/main.cpp @@ -1,3 +1,7 @@ +#include +#include +#include + #include #include #include @@ -118,6 +122,159 @@ bool isClickhouseApp(const std::string & app_suffix, std::vector & argv) return !argv.empty() && (app_name == argv[0] || endsWith(argv[0], "/" + app_name)); } + +enum class InstructionFail +{ + NONE = 0, + SSE3 = 1, + SSSE3 = 2, + SSE4_1 = 3, + SSE4_2 = 4, + AVX = 5, + AVX2 = 6, + AVX512 = 7 +}; + +const char * instructionFailToString(InstructionFail fail) +{ + switch (fail) + { + case InstructionFail::NONE: + return "NONE"; + case InstructionFail::SSE3: + return "SSE3"; + case InstructionFail::SSSE3: + return "SSSE3"; + case InstructionFail::SSE4_1: + return "SSE4.1"; + case InstructionFail::SSE4_2: + return "SSE4.2"; + case InstructionFail::AVX: + return "AVX"; + case InstructionFail::AVX2: + return "AVX2"; + case InstructionFail::AVX512: + return "AVX512"; + } + __builtin_unreachable(); +} + + +sigjmp_buf jmpbuf; + +[[noreturn]] void sigIllCheckHandler(int, siginfo_t *, void *) +{ + siglongjmp(jmpbuf, 1); +} + +/// Check if necessary SSE extensions are available by trying to execute some sse instructions. +/// If instruction is unavailable, SIGILL will be sent by kernel. +void checkRequiredInstructionsImpl(volatile InstructionFail & fail) +{ +#if defined(__SSE3__) + fail = InstructionFail::SSE3; + __asm__ volatile ("addsubpd %%xmm0, %%xmm0" : : : "xmm0"); +#endif + +#if defined(__SSSE3__) + fail = InstructionFail::SSSE3; + __asm__ volatile ("pabsw %%xmm0, %%xmm0" : : : "xmm0"); + +#endif + +#if defined(__SSE4_1__) + fail = InstructionFail::SSE4_1; + __asm__ volatile ("pmaxud %%xmm0, %%xmm0" : : : "xmm0"); +#endif + +#if defined(__SSE4_2__) + fail = InstructionFail::SSE4_2; + __asm__ volatile ("pcmpgtq %%xmm0, %%xmm0" : : : "xmm0"); +#endif + +#if defined(__AVX__) + fail = InstructionFail::AVX; + __asm__ volatile ("vaddpd %%ymm0, %%ymm0, %%ymm0" : : : "ymm0"); +#endif + +#if defined(__AVX2__) + fail = InstructionFail::AVX2; + __asm__ volatile ("vpabsw %%ymm0, %%ymm0" : : : "ymm0"); +#endif + +#if defined(__AVX512__) + fail = InstructionFail::AVX512; + __asm__ volatile ("vpabsw %%zmm0, %%zmm0" : : : "zmm0"); +#endif + + fail = InstructionFail::NONE; +} + +/// This function is safe to use in static initializers. +void writeError(const char * data, size_t size) +{ + while (size != 0) + { + ssize_t res = ::write(STDERR_FILENO, data, size); + + if ((-1 == res || 0 == res) && errno != EINTR) + _Exit(1); + + if (res > 0) + { + data += res; + size -= res; + } + } +} + +/// Check SSE and others instructions availability. Calls exit on fail. +/// This function must be called as early as possible, even before main, because static initializers may use unavailable instructions. +void checkRequiredInstructions() +{ + struct sigaction sa{}; + struct sigaction sa_old{}; + sa.sa_sigaction = sigIllCheckHandler; + sa.sa_flags = SA_SIGINFO; + auto signal = SIGILL; + if (sigemptyset(&sa.sa_mask) != 0 + || sigaddset(&sa.sa_mask, signal) != 0 + || sigaction(signal, &sa, &sa_old) != 0) + { + /// You may wonder about strlen. + /// Typical implementation of strlen is using SSE4.2 or AVX2. + /// But this is not the case because it's compiler builtin and is executed at compile time. + + const char * msg = "Can not set signal handler\n"; + writeError(msg, strlen(msg)); + _Exit(1); + } + + volatile InstructionFail fail = InstructionFail::NONE; + + if (sigsetjmp(jmpbuf, 1)) + { + const char * msg1 = "Instruction check fail. The CPU does not support "; + writeError(msg1, strlen(msg1)); + const char * msg2 = instructionFailToString(fail); + writeError(msg2, strlen(msg2)); + const char * msg3 = " instruction set.\n"; + writeError(msg3, strlen(msg3)); + _Exit(1); + } + + checkRequiredInstructionsImpl(fail); + + if (sigaction(signal, &sa_old, nullptr)) + { + const char * msg = "Can not set signal handler\n"; + writeError(msg, strlen(msg)); + _Exit(1); + } +} + +struct Checker { Checker() { checkRequiredInstructions(); } } checker; + } diff --git a/dbms/src/Core/Settings.h b/dbms/src/Core/Settings.h index 9b3f8d27ca0..ba74d5eee2b 100644 --- a/dbms/src/Core/Settings.h +++ b/dbms/src/Core/Settings.h @@ -249,6 +249,10 @@ struct Settings : public SettingsCollection M(SettingString, format_custom_result_before_delimiter, "", "Prefix before result set (for CustomSeparated format)", 0) \ M(SettingString, format_custom_result_after_delimiter, "", "Suffix after result set (for CustomSeparated format)", 0) \ \ + M(SettingString, format_regexp, "", "Regular expression (for Regexp format)", 0) \ + M(SettingString, format_regexp_escaping_rule, "Escaped", "Field escaping rule (for Regexp format)", 0) \ + M(SettingBool, format_regexp_skip_unmatched, false, "Skip lines unmatched by regular expression (for Regexp format", 0) \ + \ M(SettingBool, insert_allow_materialized_columns, 0, "If setting is enabled, Allow materialized columns in INSERT.", 0) \ M(SettingSeconds, http_connection_timeout, DEFAULT_HTTP_READ_BUFFER_CONNECTION_TIMEOUT, "HTTP connection timeout.", 0) \ M(SettingSeconds, http_send_timeout, DEFAULT_HTTP_READ_BUFFER_TIMEOUT, "HTTP send timeout", 0) \ diff --git a/dbms/src/Core/SettingsCollection.h b/dbms/src/Core/SettingsCollection.h index 88f19eab811..4b2af24eeb3 100644 --- a/dbms/src/Core/SettingsCollection.h +++ b/dbms/src/Core/SettingsCollection.h @@ -352,6 +352,7 @@ private: StringRef name; StringRef description; + StringRef type; bool is_important; IsChangedFunction is_changed; GetStringFunction get_string; @@ -398,6 +399,7 @@ public: const_reference(const const_reference & src) = default; const StringRef & getName() const { return member->name; } const StringRef & getDescription() const { return member->description; } + const StringRef & getType() const { return member->type; } bool isChanged() const { return member->is_changed(*collection); } Field getValue() const; String getValueAsString() const { return member->get_string(*collection); } diff --git a/dbms/src/Core/SettingsCollectionImpl.h b/dbms/src/Core/SettingsCollectionImpl.h index a97de0f48af..d5716c2a80d 100644 --- a/dbms/src/Core/SettingsCollectionImpl.h +++ b/dbms/src/Core/SettingsCollectionImpl.h @@ -323,7 +323,9 @@ void SettingsCollection::deserialize(ReadBuffer & buf, SettingsBinaryFo #define IMPLEMENT_SETTINGS_COLLECTION_ADD_MEMBER_INFO_HELPER_(TYPE, NAME, DEFAULT, DESCRIPTION, FLAGS) \ - add({StringRef(#NAME, strlen(#NAME)), StringRef(DESCRIPTION, strlen(DESCRIPTION)), \ + add({StringRef(#NAME, strlen(#NAME)), \ + StringRef(DESCRIPTION, strlen(DESCRIPTION)), \ + StringRef(#TYPE, strlen(#TYPE)), \ FLAGS & IMPORTANT, \ [](const Derived & d) { return d.NAME.changed; }, \ &Functions::NAME##_getString, &Functions::NAME##_getField, \ diff --git a/dbms/src/DataStreams/PushingToViewsBlockOutputStream.cpp b/dbms/src/DataStreams/PushingToViewsBlockOutputStream.cpp index 991d206777a..5752fbaff96 100644 --- a/dbms/src/DataStreams/PushingToViewsBlockOutputStream.cpp +++ b/dbms/src/DataStreams/PushingToViewsBlockOutputStream.cpp @@ -25,7 +25,7 @@ PushingToViewsBlockOutputStream::PushingToViewsBlockOutputStream( * Although now any insertion into the table is done via PushingToViewsBlockOutputStream, * but it's clear that here is not the best place for this functionality. */ - addTableLock(storage->lockStructureForShare(true, context.getInitialQueryId())); + addTableLock(storage->lockStructureForShare(context.getInitialQueryId())); /// If the "root" table deduplactes blocks, there are no need to make deduplication for children /// Moreover, deduplication for AggregatingMergeTree children could produce false positives due to low size of inserting blocks @@ -54,7 +54,7 @@ PushingToViewsBlockOutputStream::PushingToViewsBlockOutputStream( if (auto * materialized_view = dynamic_cast(dependent_table.get())) { - addTableLock(materialized_view->lockStructureForShare(true, context.getInitialQueryId())); + addTableLock(materialized_view->lockStructureForShare(context.getInitialQueryId())); StoragePtr inner_table = materialized_view->getTargetTable(); auto inner_table_id = inner_table->getStorageID(); diff --git a/dbms/src/Databases/DatabaseMySQL.cpp b/dbms/src/Databases/DatabaseMySQL.cpp index c5a6c91bdba..dad42a6fd90 100644 --- a/dbms/src/Databases/DatabaseMySQL.cpp +++ b/dbms/src/Databases/DatabaseMySQL.cpp @@ -358,7 +358,7 @@ void DatabaseMySQL::cleanOutdatedTables() ++iterator; else { - const auto table_lock = (*iterator)->lockAlterIntention(RWLockImpl::NO_QUERY); + const auto table_lock = (*iterator)->lockAlterIntention(); (*iterator)->shutdown(); (*iterator)->is_dropped = true; diff --git a/dbms/src/Formats/FormatFactory.cpp b/dbms/src/Formats/FormatFactory.cpp index a8e27054704..c2b890ec631 100644 --- a/dbms/src/Formats/FormatFactory.cpp +++ b/dbms/src/Formats/FormatFactory.cpp @@ -68,6 +68,9 @@ static FormatSettings getInputFormatSetting(const Settings & settings, const Con format_settings.custom.row_before_delimiter = settings.format_custom_row_before_delimiter; format_settings.custom.row_after_delimiter = settings.format_custom_row_after_delimiter; format_settings.custom.row_between_delimiter = settings.format_custom_row_between_delimiter; + format_settings.regexp.regexp = settings.format_regexp; + format_settings.regexp.escaping_rule = settings.format_regexp_escaping_rule; + format_settings.regexp.skip_unmatched = settings.format_regexp_skip_unmatched; /// Validate avro_schema_registry_url with RemoteHostFilter when non-empty and in Server context if (context.hasGlobalContext() && (context.getGlobalContext().getApplicationType() == Context::ApplicationType::SERVER)) @@ -352,10 +355,12 @@ FormatFactory::FormatFactory() registerOutputFormatProcessorAvro(*this); registerInputFormatProcessorTemplate(*this); registerOutputFormatProcessorTemplate(*this); + registerInputFormatProcessorRegexp(*this); registerFileSegmentationEngineTabSeparated(*this); registerFileSegmentationEngineCSV(*this); registerFileSegmentationEngineJSONEachRow(*this); + registerFileSegmentationEngineRegexp(*this); registerOutputFormatNull(*this); diff --git a/dbms/src/Formats/FormatFactory.h b/dbms/src/Formats/FormatFactory.h index 7c18971e0eb..7c515dbce90 100644 --- a/dbms/src/Formats/FormatFactory.h +++ b/dbms/src/Formats/FormatFactory.h @@ -178,6 +178,7 @@ void registerOutputFormatProcessorTemplate(FormatFactory &factory); void registerFileSegmentationEngineTabSeparated(FormatFactory & factory); void registerFileSegmentationEngineCSV(FormatFactory & factory); void registerFileSegmentationEngineJSONEachRow(FormatFactory & factory); +void registerFileSegmentationEngineRegexp(FormatFactory & factory); /// Output only (presentational) formats. @@ -198,5 +199,6 @@ void registerOutputFormatProcessorMySQLWrite(FormatFactory & factory); /// Input only formats. void registerInputFormatProcessorCapnProto(FormatFactory & factory); +void registerInputFormatProcessorRegexp(FormatFactory & factory); } diff --git a/dbms/src/Formats/FormatSettings.h b/dbms/src/Formats/FormatSettings.h index 610768e5d08..1eb95ce2dbf 100644 --- a/dbms/src/Formats/FormatSettings.h +++ b/dbms/src/Formats/FormatSettings.h @@ -122,6 +122,15 @@ struct FormatSettings Avro avro; + struct Regexp + { + std::string regexp; + std::string escaping_rule; + bool skip_unmatched = false; + }; + + Regexp regexp; + }; } diff --git a/dbms/src/Functions/FunctionJoinGet.cpp b/dbms/src/Functions/FunctionJoinGet.cpp index 0860deccb14..6a6c0c4a97e 100644 --- a/dbms/src/Functions/FunctionJoinGet.cpp +++ b/dbms/src/Functions/FunctionJoinGet.cpp @@ -65,7 +65,7 @@ FunctionBaseImplPtr JoinGetOverloadResolver::build(const ColumnsWithTypeAndName auto join = storage_join->getJoin(); DataTypes data_types(arguments.size()); - auto table_lock = storage_join->lockStructureForShare(false, context.getInitialQueryId()); + auto table_lock = storage_join->lockStructureForShare(context.getInitialQueryId()); for (size_t i = 0; i < arguments.size(); ++i) data_types[i] = arguments[i].type; diff --git a/dbms/src/Functions/FunctionsMultiStringPosition.h b/dbms/src/Functions/FunctionsMultiStringPosition.h new file mode 100644 index 00000000000..40a38a2a0ad --- /dev/null +++ b/dbms/src/Functions/FunctionsMultiStringPosition.h @@ -0,0 +1,129 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ +/** multiSearchAllPositions(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- find first occurrences (positions) of all the const patterns inside haystack + * multiSearchAllPositionsUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchAllPositionsCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchAllPositionsCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * + * multiSearchFirstPosition(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- returns the first position of the haystack matched by strings or zero if nothing was found + * multiSearchFirstPositionUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchFirstPositionCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchFirstPositionCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * + * multiSearchAny(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- find any of the const patterns inside haystack and return 0 or 1 + * multiSearchAnyUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchAnyCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchAnyCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + + * multiSearchFirstIndex(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- returns the first index of the matched string or zero if nothing was found + * multiSearchFirstIndexUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchFirstIndexCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchFirstIndexCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + */ + +namespace ErrorCodes +{ + extern const int ILLEGAL_TYPE_OF_ARGUMENT; + extern const int ILLEGAL_COLUMN; + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; +} + + +template +class FunctionsMultiStringPosition : public IFunction +{ +public: + static constexpr auto name = Name::name; + static FunctionPtr create(const Context &) { return std::make_shared(); } + + String getName() const override { return name; } + + size_t getNumberOfArguments() const override { return 2; } + bool useDefaultImplementationForConstants() const override { return true; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override + { + if (!isString(arguments[0])) + throw Exception( + "Illegal type " + arguments[0]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + const DataTypeArray * array_type = checkAndGetDataType(arguments[1].get()); + if (!array_type || !checkAndGetDataType(array_type->getNestedType().get())) + throw Exception( + "Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + return std::make_shared(std::make_shared()); + } + + void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override + { + using ResultType = typename Impl::ResultType; + + const ColumnPtr & column_haystack = block.getByPosition(arguments[0]).column; + + const ColumnString * col_haystack_vector = checkAndGetColumn(&*column_haystack); + + const ColumnPtr & arr_ptr = block.getByPosition(arguments[1]).column; + const ColumnConst * col_const_arr = checkAndGetColumnConst(arr_ptr.get()); + + if (!col_const_arr) + throw Exception( + "Illegal column " + block.getByPosition(arguments[1]).column->getName() + ". The array is not const", + ErrorCodes::ILLEGAL_COLUMN); + + Array src_arr = col_const_arr->getValue(); + + if (src_arr.size() > std::numeric_limits::max()) + throw Exception( + "Number of arguments for function " + getName() + " doesn't match: passed " + std::to_string(src_arr.size()) + + ", should be at most 255", + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + + std::vector refs; + for (const auto & el : src_arr) + refs.emplace_back(el.get()); + + const size_t column_haystack_size = column_haystack->size(); + + auto col_res = ColumnVector::create(); + auto col_offsets = ColumnArray::ColumnOffsets::create(column_haystack_size); + + auto & vec_res = col_res->getData(); + auto & offsets_res = col_offsets->getData(); + + vec_res.resize(column_haystack_size * refs.size()); + + if (col_haystack_vector) + Impl::vectorConstant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res); + else + throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN); + + size_t refs_size = refs.size(); + size_t accum = refs_size; + + for (size_t i = 0; i < column_haystack_size; ++i, accum += refs_size) + offsets_res[i] = accum; + + block.getByPosition(result).column = ColumnArray::create(std::move(col_res), std::move(col_offsets)); + } +}; + +} diff --git a/dbms/src/Functions/FunctionsMultiStringSearch.h b/dbms/src/Functions/FunctionsMultiStringSearch.h new file mode 100644 index 00000000000..ccaad0eaa9a --- /dev/null +++ b/dbms/src/Functions/FunctionsMultiStringSearch.h @@ -0,0 +1,127 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ +/** + * multiSearchAny(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- find any of the const patterns inside haystack and return 0 or 1 + * multiSearchAnyUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchAnyCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchAnyCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + + * multiSearchFirstIndex(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- returns the first index of the matched string or zero if nothing was found + * multiSearchFirstIndexUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchFirstIndexCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) + * multiSearchFirstIndexCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) + */ + +namespace ErrorCodes +{ + extern const int ILLEGAL_TYPE_OF_ARGUMENT; + extern const int ILLEGAL_COLUMN; + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int FUNCTION_NOT_ALLOWED; +} + + +/// The argument limiting raises from Volnitsky searcher -- it is performance crucial to save only one byte for pattern number. +/// But some other searchers use this function, for example, multiMatchAny -- hyperscan does not have such restrictions +template ::max()> +class FunctionsMultiStringSearch : public IFunction +{ + static_assert(LimitArgs > 0); + +public: + static constexpr auto name = Name::name; + static FunctionPtr create(const Context & context) + { + if (Impl::is_using_hyperscan && !context.getSettingsRef().allow_hyperscan) + throw Exception( + "Hyperscan functions are disabled, because setting 'allow_hyperscan' is set to 0", ErrorCodes::FUNCTION_NOT_ALLOWED); + + return std::make_shared(); + } + + String getName() const override { return name; } + + size_t getNumberOfArguments() const override { return 2; } + bool useDefaultImplementationForConstants() const override { return true; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override + { + if (!isString(arguments[0])) + throw Exception( + "Illegal type " + arguments[0]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + const DataTypeArray * array_type = checkAndGetDataType(arguments[1].get()); + if (!array_type || !checkAndGetDataType(array_type->getNestedType().get())) + throw Exception( + "Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + return Impl::getReturnType(); + } + + void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override + { + using ResultType = typename Impl::ResultType; + + const ColumnPtr & column_haystack = block.getByPosition(arguments[0]).column; + + const ColumnString * col_haystack_vector = checkAndGetColumn(&*column_haystack); + + const ColumnPtr & arr_ptr = block.getByPosition(arguments[1]).column; + const ColumnConst * col_const_arr = checkAndGetColumnConst(arr_ptr.get()); + + if (!col_const_arr) + throw Exception( + "Illegal column " + block.getByPosition(arguments[1]).column->getName() + ". The array is not const", + ErrorCodes::ILLEGAL_COLUMN); + + Array src_arr = col_const_arr->getValue(); + + if (src_arr.size() > LimitArgs) + throw Exception( + "Number of arguments for function " + getName() + " doesn't match: passed " + std::to_string(src_arr.size()) + + ", should be at most " + std::to_string(LimitArgs), + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + + std::vector refs; + refs.reserve(src_arr.size()); + + for (const auto & el : src_arr) + refs.emplace_back(el.get()); + + auto col_res = ColumnVector::create(); + auto col_offsets = ColumnArray::ColumnOffsets::create(); + + auto & vec_res = col_res->getData(); + auto & offsets_res = col_offsets->getData(); + + /// The blame for resizing output is for the callee. + if (col_haystack_vector) + Impl::vectorConstant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res, offsets_res); + else + throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN); + + if constexpr (Impl::is_column_array) + block.getByPosition(result).column = ColumnArray::create(std::move(col_res), std::move(col_offsets)); + else + block.getByPosition(result).column = std::move(col_res); + } +}; + +} diff --git a/dbms/src/Functions/FunctionsStringRegex.cpp b/dbms/src/Functions/FunctionsStringRegex.cpp index 40a42fd2643..856852ae197 100644 --- a/dbms/src/Functions/FunctionsStringRegex.cpp +++ b/dbms/src/Functions/FunctionsStringRegex.cpp @@ -1,5 +1,7 @@ #include "FunctionsStringRegex.h" #include "FunctionsStringSearch.h" +#include "FunctionsMultiStringSearch.h" +#include "FunctionsStringSearchToString.h" #include #include #include diff --git a/dbms/src/Functions/FunctionsStringSearch.cpp b/dbms/src/Functions/FunctionsStringSearch.cpp deleted file mode 100644 index 8279ded5f81..00000000000 --- a/dbms/src/Functions/FunctionsStringSearch.cpp +++ /dev/null @@ -1,707 +0,0 @@ -#include "FunctionsStringSearch.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace DB -{ -namespace ErrorCodes -{ - extern const int ILLEGAL_COLUMN; -} -/** Implementation details for functions of 'position' family depending on ASCII/UTF8 and case sensitiveness. - */ -struct PositionCaseSensitiveASCII -{ - /// For searching single substring inside big-enough contiguous chunk of data. Coluld have slightly expensive initialization. - using SearcherInBigHaystack = Volnitsky; - - /// For search many substrings in one string - using MultiSearcherInBigHaystack = MultiVolnitsky; - - /// For searching single substring, that is different each time. This object is created for each row of data. It must have cheap initialization. - using SearcherInSmallHaystack = LibCASCIICaseSensitiveStringSearcher; - - static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t haystack_size_hint) - { - return SearcherInBigHaystack(needle_data, needle_size, haystack_size_hint); - } - - static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) - { - return SearcherInSmallHaystack(needle_data, needle_size); - } - - static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) - { - return MultiSearcherInBigHaystack(needles); - } - - /// Number of code points between 'begin' and 'end' (this has different behaviour for ASCII and UTF-8). - static size_t countChars(const char * begin, const char * end) { return end - begin; } - - /// Convert string to lowercase. Only for case-insensitive search. - /// Implementation is permitted to be inefficient because it is called for single string. - static void toLowerIfNeed(std::string &) { } -}; - -struct PositionCaseInsensitiveASCII -{ - /// `Volnitsky` is not used here, because one person has measured that this is better. It will be good if you question it. - using SearcherInBigHaystack = ASCIICaseInsensitiveStringSearcher; - using MultiSearcherInBigHaystack = MultiVolnitskyCaseInsensitive; - using SearcherInSmallHaystack = LibCASCIICaseInsensitiveStringSearcher; - - static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t /*haystack_size_hint*/) - { - return SearcherInBigHaystack(needle_data, needle_size); - } - - static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) - { - return SearcherInSmallHaystack(needle_data, needle_size); - } - - static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) - { - return MultiSearcherInBigHaystack(needles); - } - - static size_t countChars(const char * begin, const char * end) { return end - begin; } - - static void toLowerIfNeed(std::string & s) { std::transform(std::begin(s), std::end(s), std::begin(s), tolower); } -}; - -struct PositionCaseSensitiveUTF8 -{ - using SearcherInBigHaystack = VolnitskyUTF8; - using MultiSearcherInBigHaystack = MultiVolnitskyUTF8; - using SearcherInSmallHaystack = LibCASCIICaseSensitiveStringSearcher; - - static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t haystack_size_hint) - { - return SearcherInBigHaystack(needle_data, needle_size, haystack_size_hint); - } - - static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) - { - return SearcherInSmallHaystack(needle_data, needle_size); - } - - static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) - { - return MultiSearcherInBigHaystack(needles); - } - - static size_t countChars(const char * begin, const char * end) - { - size_t res = 0; - for (auto it = begin; it != end; ++it) - if (!UTF8::isContinuationOctet(static_cast(*it))) - ++res; - return res; - } - - static void toLowerIfNeed(std::string &) { } -}; - -struct PositionCaseInsensitiveUTF8 -{ - using SearcherInBigHaystack = VolnitskyCaseInsensitiveUTF8; - using MultiSearcherInBigHaystack = MultiVolnitskyCaseInsensitiveUTF8; - using SearcherInSmallHaystack = UTF8CaseInsensitiveStringSearcher; /// TODO Very suboptimal. - - static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t haystack_size_hint) - { - return SearcherInBigHaystack(needle_data, needle_size, haystack_size_hint); - } - - static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) - { - return SearcherInSmallHaystack(needle_data, needle_size); - } - - static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) - { - return MultiSearcherInBigHaystack(needles); - } - - static size_t countChars(const char * begin, const char * end) - { - size_t res = 0; - for (auto it = begin; it != end; ++it) - if (!UTF8::isContinuationOctet(static_cast(*it))) - ++res; - return res; - } - - static void toLowerIfNeed(std::string & s) { Poco::UTF8::toLowerInPlace(s); } -}; - -template -struct PositionImpl -{ - static constexpr bool use_default_implementation_for_constants = false; - - using ResultType = UInt64; - - /// Find one substring in many strings. - static void vectorConstant( - const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & needle, PaddedPODArray & res) - { - const UInt8 * begin = data.data(); - const UInt8 * pos = begin; - const UInt8 * end = pos + data.size(); - - /// Current index in the array of strings. - size_t i = 0; - - typename Impl::SearcherInBigHaystack searcher = Impl::createSearcherInBigHaystack(needle.data(), needle.size(), end - pos); - - /// We will search for the next occurrence in all strings at once. - while (pos < end && end != (pos = searcher.search(pos, end - pos))) - { - /// Determine which index it refers to. - while (begin + offsets[i] <= pos) - { - res[i] = 0; - ++i; - } - - /// We check that the entry does not pass through the boundaries of strings. - if (pos + needle.size() < begin + offsets[i]) - res[i] = 1 + Impl::countChars(reinterpret_cast(begin + offsets[i - 1]), reinterpret_cast(pos)); - else - res[i] = 0; - - pos = begin + offsets[i]; - ++i; - } - - if (i < res.size()) - memset(&res[i], 0, (res.size() - i) * sizeof(res[0])); - } - - /// Search for substring in string. - static void constantConstant(std::string data, std::string needle, UInt64 & res) - { - Impl::toLowerIfNeed(data); - Impl::toLowerIfNeed(needle); - - res = data.find(needle); - if (res == std::string::npos) - res = 0; - else - res = 1 + Impl::countChars(data.data(), data.data() + res); - } - - /// Search each time for a different single substring inside each time different string. - static void vectorVector( - const ColumnString::Chars & haystack_data, - const ColumnString::Offsets & haystack_offsets, - const ColumnString::Chars & needle_data, - const ColumnString::Offsets & needle_offsets, - PaddedPODArray & res) - { - ColumnString::Offset prev_haystack_offset = 0; - ColumnString::Offset prev_needle_offset = 0; - - size_t size = haystack_offsets.size(); - - for (size_t i = 0; i < size; ++i) - { - size_t needle_size = needle_offsets[i] - prev_needle_offset - 1; - size_t haystack_size = haystack_offsets[i] - prev_haystack_offset - 1; - - if (0 == needle_size) - { - /// An empty string is always at the very beginning of `haystack`. - res[i] = 1; - } - else - { - /// It is assumed that the StringSearcher is not very difficult to initialize. - typename Impl::SearcherInSmallHaystack searcher = Impl::createSearcherInSmallHaystack( - reinterpret_cast(&needle_data[prev_needle_offset]), - needle_offsets[i] - prev_needle_offset - 1); /// zero byte at the end - - /// searcher returns a pointer to the found substring or to the end of `haystack`. - size_t pos = searcher.search(&haystack_data[prev_haystack_offset], &haystack_data[haystack_offsets[i] - 1]) - - &haystack_data[prev_haystack_offset]; - - if (pos != haystack_size) - { - res[i] = 1 - + Impl::countChars( - reinterpret_cast(&haystack_data[prev_haystack_offset]), - reinterpret_cast(&haystack_data[prev_haystack_offset + pos])); - } - else - res[i] = 0; - } - - prev_haystack_offset = haystack_offsets[i]; - prev_needle_offset = needle_offsets[i]; - } - } - - /// Find many substrings in single string. - static void constantVector( - const String & haystack, - const ColumnString::Chars & needle_data, - const ColumnString::Offsets & needle_offsets, - PaddedPODArray & res) - { - // NOTE You could use haystack indexing. But this is a rare case. - - ColumnString::Offset prev_needle_offset = 0; - - size_t size = needle_offsets.size(); - - for (size_t i = 0; i < size; ++i) - { - size_t needle_size = needle_offsets[i] - prev_needle_offset - 1; - - if (0 == needle_size) - { - res[i] = 1; - } - else - { - typename Impl::SearcherInSmallHaystack searcher = Impl::createSearcherInSmallHaystack( - reinterpret_cast(&needle_data[prev_needle_offset]), needle_offsets[i] - prev_needle_offset - 1); - - size_t pos = searcher.search( - reinterpret_cast(haystack.data()), - reinterpret_cast(haystack.data()) + haystack.size()) - - reinterpret_cast(haystack.data()); - - if (pos != haystack.size()) - { - res[i] = 1 + Impl::countChars(haystack.data(), haystack.data() + pos); - } - else - res[i] = 0; - } - - prev_needle_offset = needle_offsets[i]; - } - } - - template - static void vectorFixedConstant(Args &&...) - { - throw Exception("Functions 'position' don't support FixedString haystack argument", ErrorCodes::ILLEGAL_COLUMN); - } -}; - -template -struct MultiSearchAllPositionsImpl -{ - using ResultType = UInt64; - - static void vectorConstant( - const ColumnString::Chars & haystack_data, - const ColumnString::Offsets & haystack_offsets, - const std::vector & needles, - PaddedPODArray & res) - { - auto res_callback = [](const UInt8 * start, const UInt8 * end) -> UInt64 - { - return 1 + Impl::countChars(reinterpret_cast(start), reinterpret_cast(end)); - }; - - auto searcher = Impl::createMultiSearcherInBigHaystack(needles); - - const size_t haystack_string_size = haystack_offsets.size(); - const size_t needles_size = needles.size(); - - /// Something can be uninitialized after the search itself - std::fill(res.begin(), res.end(), 0); - - while (searcher.hasMoreToSearch()) - { - size_t prev_offset = 0; - for (size_t j = 0, from = 0; j < haystack_string_size; ++j, from += needles_size) - { - const auto * haystack = &haystack_data[prev_offset]; - const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; - searcher.searchOneAll(haystack, haystack_end, res.data() + from, res_callback); - prev_offset = haystack_offsets[j]; - } - } - } -}; - -template -struct MultiSearchImpl -{ - using ResultType = UInt8; - static constexpr bool is_using_hyperscan = false; - /// Variable for understanding, if we used offsets for the output, most - /// likely to determine whether the function returns ColumnVector of ColumnArray. - static constexpr bool is_column_array = false; - static auto getReturnType() { return std::make_shared>(); } - - static void vectorConstant( - const ColumnString::Chars & haystack_data, - const ColumnString::Offsets & haystack_offsets, - const std::vector & needles, - PaddedPODArray & res, - [[maybe_unused]] PaddedPODArray & offsets) - { - auto searcher = Impl::createMultiSearcherInBigHaystack(needles); - const size_t haystack_string_size = haystack_offsets.size(); - res.resize(haystack_string_size); - size_t iteration = 0; - while (searcher.hasMoreToSearch()) - { - size_t prev_offset = 0; - for (size_t j = 0; j < haystack_string_size; ++j) - { - const auto * haystack = &haystack_data[prev_offset]; - const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; - if (iteration == 0 || !res[j]) - res[j] = searcher.searchOne(haystack, haystack_end); - prev_offset = haystack_offsets[j]; - } - ++iteration; - } - } -}; - -template -struct MultiSearchFirstPositionImpl -{ - using ResultType = UInt64; - static constexpr bool is_using_hyperscan = false; - /// Variable for understanding, if we used offsets for the output, most - /// likely to determine whether the function returns ColumnVector of ColumnArray. - static constexpr bool is_column_array = false; - static auto getReturnType() { return std::make_shared>(); } - - static void vectorConstant( - const ColumnString::Chars & haystack_data, - const ColumnString::Offsets & haystack_offsets, - const std::vector & needles, - PaddedPODArray & res, - [[maybe_unused]] PaddedPODArray & offsets) - { - auto res_callback = [](const UInt8 * start, const UInt8 * end) -> UInt64 - { - return 1 + Impl::countChars(reinterpret_cast(start), reinterpret_cast(end)); - }; - auto searcher = Impl::createMultiSearcherInBigHaystack(needles); - const size_t haystack_string_size = haystack_offsets.size(); - res.resize(haystack_string_size); - size_t iteration = 0; - while (searcher.hasMoreToSearch()) - { - size_t prev_offset = 0; - for (size_t j = 0; j < haystack_string_size; ++j) - { - const auto * haystack = &haystack_data[prev_offset]; - const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; - if (iteration == 0 || res[j] == 0) - res[j] = searcher.searchOneFirstPosition(haystack, haystack_end, res_callback); - else - { - UInt64 result = searcher.searchOneFirstPosition(haystack, haystack_end, res_callback); - if (result != 0) - res[j] = std::min(result, res[j]); - } - prev_offset = haystack_offsets[j]; - } - ++iteration; - } - } -}; - -template -struct MultiSearchFirstIndexImpl -{ - using ResultType = UInt64; - static constexpr bool is_using_hyperscan = false; - /// Variable for understanding, if we used offsets for the output, most - /// likely to determine whether the function returns ColumnVector of ColumnArray. - static constexpr bool is_column_array = false; - static auto getReturnType() { return std::make_shared>(); } - - static void vectorConstant( - const ColumnString::Chars & haystack_data, - const ColumnString::Offsets & haystack_offsets, - const std::vector & needles, - PaddedPODArray & res, - [[maybe_unused]] PaddedPODArray & offsets) - { - auto searcher = Impl::createMultiSearcherInBigHaystack(needles); - const size_t haystack_string_size = haystack_offsets.size(); - res.resize(haystack_string_size); - size_t iteration = 0; - while (searcher.hasMoreToSearch()) - { - size_t prev_offset = 0; - for (size_t j = 0; j < haystack_string_size; ++j) - { - const auto * haystack = &haystack_data[prev_offset]; - const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; - /// hasMoreToSearch traverse needles in increasing order - if (iteration == 0 || res[j] == 0) - res[j] = searcher.searchOneFirstIndex(haystack, haystack_end); - prev_offset = haystack_offsets[j]; - } - ++iteration; - } - } -}; - -/** Token search the string, means that needle must be surrounded by some separator chars, like whitespace or puctuation. - */ -template -struct HasTokenImpl -{ - using ResultType = UInt8; - - static constexpr bool use_default_implementation_for_constants = true; - - static void vectorConstant( - const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & pattern, PaddedPODArray & res) - { - if (offsets.empty()) - return; - - const UInt8 * begin = data.data(); - const UInt8 * pos = begin; - const UInt8 * end = pos + data.size(); - - /// The current index in the array of strings. - size_t i = 0; - - TokenSearcher searcher(pattern.data(), pattern.size(), end - pos); - - /// We will search for the next occurrence in all rows at once. - while (pos < end && end != (pos = searcher.search(pos, end - pos))) - { - /// Let's determine which index it refers to. - while (begin + offsets[i] <= pos) - { - res[i] = negate_result; - ++i; - } - - /// We check that the entry does not pass through the boundaries of strings. - if (pos + pattern.size() < begin + offsets[i]) - res[i] = !negate_result; - else - res[i] = negate_result; - - pos = begin + offsets[i]; - ++i; - } - - /// Tail, in which there can be no substring. - if (i < res.size()) - memset(&res[i], negate_result, (res.size() - i) * sizeof(res[0])); - } - - template - static void vectorVector(Args &&...) - { - throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN); - } - - /// Search different needles in single haystack. - template - static void constantVector(Args &&...) - { - throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN); - } - - template - static void vectorFixedConstant(Args &&...) - { - throw Exception("Functions 'hasToken' don't support FixedString haystack argument", ErrorCodes::ILLEGAL_COLUMN); - } -}; - - -struct NamePosition -{ - static constexpr auto name = "position"; -}; -struct NamePositionUTF8 -{ - static constexpr auto name = "positionUTF8"; -}; -struct NamePositionCaseInsensitive -{ - static constexpr auto name = "positionCaseInsensitive"; -}; -struct NamePositionCaseInsensitiveUTF8 -{ - static constexpr auto name = "positionCaseInsensitiveUTF8"; -}; -struct NameMultiSearchAllPositions -{ - static constexpr auto name = "multiSearchAllPositions"; -}; -struct NameMultiSearchAllPositionsUTF8 -{ - static constexpr auto name = "multiSearchAllPositionsUTF8"; -}; -struct NameMultiSearchAllPositionsCaseInsensitive -{ - static constexpr auto name = "multiSearchAllPositionsCaseInsensitive"; -}; -struct NameMultiSearchAllPositionsCaseInsensitiveUTF8 -{ - static constexpr auto name = "multiSearchAllPositionsCaseInsensitiveUTF8"; -}; -struct NameMultiSearchAny -{ - static constexpr auto name = "multiSearchAny"; -}; -struct NameMultiSearchAnyUTF8 -{ - static constexpr auto name = "multiSearchAnyUTF8"; -}; -struct NameMultiSearchAnyCaseInsensitive -{ - static constexpr auto name = "multiSearchAnyCaseInsensitive"; -}; -struct NameMultiSearchAnyCaseInsensitiveUTF8 -{ - static constexpr auto name = "multiSearchAnyCaseInsensitiveUTF8"; -}; -struct NameMultiSearchFirstIndex -{ - static constexpr auto name = "multiSearchFirstIndex"; -}; -struct NameMultiSearchFirstIndexUTF8 -{ - static constexpr auto name = "multiSearchFirstIndexUTF8"; -}; -struct NameMultiSearchFirstIndexCaseInsensitive -{ - static constexpr auto name = "multiSearchFirstIndexCaseInsensitive"; -}; -struct NameMultiSearchFirstIndexCaseInsensitiveUTF8 -{ - static constexpr auto name = "multiSearchFirstIndexCaseInsensitiveUTF8"; -}; -struct NameMultiSearchFirstPosition -{ - static constexpr auto name = "multiSearchFirstPosition"; -}; -struct NameMultiSearchFirstPositionUTF8 -{ - static constexpr auto name = "multiSearchFirstPositionUTF8"; -}; -struct NameMultiSearchFirstPositionCaseInsensitive -{ - static constexpr auto name = "multiSearchFirstPositionCaseInsensitive"; -}; -struct NameMultiSearchFirstPositionCaseInsensitiveUTF8 -{ - static constexpr auto name = "multiSearchFirstPositionCaseInsensitiveUTF8"; -}; - -struct NameHasToken -{ - static constexpr auto name = "hasToken"; -}; - -struct NameHasTokenCaseInsensitive -{ - static constexpr auto name = "hasTokenCaseInsensitive"; -}; - - -using FunctionPosition = FunctionsStringSearch, NamePosition>; -using FunctionPositionUTF8 = FunctionsStringSearch, NamePositionUTF8>; -using FunctionPositionCaseInsensitive = FunctionsStringSearch, NamePositionCaseInsensitive>; -using FunctionPositionCaseInsensitiveUTF8 - = FunctionsStringSearch, NamePositionCaseInsensitiveUTF8>; - -using FunctionMultiSearchAllPositions - = FunctionsMultiStringPosition, NameMultiSearchAllPositions>; -using FunctionMultiSearchAllPositionsUTF8 - = FunctionsMultiStringPosition, NameMultiSearchAllPositionsUTF8>; -using FunctionMultiSearchAllPositionsCaseInsensitive - = FunctionsMultiStringPosition, NameMultiSearchAllPositionsCaseInsensitive>; -using FunctionMultiSearchAllPositionsCaseInsensitiveUTF8 = FunctionsMultiStringPosition< - MultiSearchAllPositionsImpl, - NameMultiSearchAllPositionsCaseInsensitiveUTF8>; - -using FunctionMultiSearch = FunctionsMultiStringSearch, NameMultiSearchAny>; -using FunctionMultiSearchUTF8 = FunctionsMultiStringSearch, NameMultiSearchAnyUTF8>; -using FunctionMultiSearchCaseInsensitive - = FunctionsMultiStringSearch, NameMultiSearchAnyCaseInsensitive>; -using FunctionMultiSearchCaseInsensitiveUTF8 - = FunctionsMultiStringSearch, NameMultiSearchAnyCaseInsensitiveUTF8>; - -using FunctionMultiSearchFirstIndex - = FunctionsMultiStringSearch, NameMultiSearchFirstIndex>; -using FunctionMultiSearchFirstIndexUTF8 - = FunctionsMultiStringSearch, NameMultiSearchFirstIndexUTF8>; -using FunctionMultiSearchFirstIndexCaseInsensitive - = FunctionsMultiStringSearch, NameMultiSearchFirstIndexCaseInsensitive>; -using FunctionMultiSearchFirstIndexCaseInsensitiveUTF8 - = FunctionsMultiStringSearch, NameMultiSearchFirstIndexCaseInsensitiveUTF8>; - -using FunctionMultiSearchFirstPosition - = FunctionsMultiStringSearch, NameMultiSearchFirstPosition>; -using FunctionMultiSearchFirstPositionUTF8 - = FunctionsMultiStringSearch, NameMultiSearchFirstPositionUTF8>; -using FunctionMultiSearchFirstPositionCaseInsensitive - = FunctionsMultiStringSearch, NameMultiSearchFirstPositionCaseInsensitive>; -using FunctionMultiSearchFirstPositionCaseInsensitiveUTF8 = FunctionsMultiStringSearch< - MultiSearchFirstPositionImpl, - NameMultiSearchFirstPositionCaseInsensitiveUTF8>; - -using FunctionHasToken = FunctionsStringSearch, NameHasToken>; -using FunctionHasTokenCaseInsensitive - = FunctionsStringSearch, NameHasTokenCaseInsensitive>; - -void registerFunctionsStringSearch(FunctionFactory & factory) -{ - factory.registerFunction(FunctionFactory::CaseInsensitive); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - - factory.registerFunction(); - factory.registerFunction(); - - factory.registerAlias("locate", NamePosition::name, FunctionFactory::CaseInsensitive); -} -} diff --git a/dbms/src/Functions/FunctionsStringSearch.h b/dbms/src/Functions/FunctionsStringSearch.h index 2ae5f3598a8..9f4360cf935 100644 --- a/dbms/src/Functions/FunctionsStringSearch.h +++ b/dbms/src/Functions/FunctionsStringSearch.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -10,9 +9,7 @@ #include #include #include -#include #include -#include namespace DB @@ -37,40 +34,12 @@ namespace DB * - the zero subpattern (the match part, otherwise); * - if not match - an empty string. * extract(haystack, pattern) - * - * replaceOne(haystack, pattern, replacement) - replacing the pattern with the specified rules, only the first occurrence. - * replaceAll(haystack, pattern, replacement) - replacing the pattern with the specified rules, all occurrences. - * - * replaceRegexpOne(haystack, pattern, replacement) - replaces the pattern with the specified regexp, only the first occurrence. - * replaceRegexpAll(haystack, pattern, replacement) - replaces the pattern with the specified type, all occurrences. - * - * multiSearchAllPositions(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- find first occurrences (positions) of all the const patterns inside haystack - * multiSearchAllPositionsUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchAllPositionsCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchAllPositionsCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * - * multiSearchFirstPosition(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- returns the first position of the haystack matched by strings or zero if nothing was found - * multiSearchFirstPositionUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchFirstPositionCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchFirstPositionCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * - * multiSearchAny(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- find any of the const patterns inside haystack and return 0 or 1 - * multiSearchAnyUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchAnyCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchAnyCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) - - * multiSearchFirstIndex(haystack, [pattern_1, pattern_2, ..., pattern_n]) -- returns the first index of the matched string or zero if nothing was found - * multiSearchFirstIndexUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchFirstIndexCaseInsensitive(haystack, [pattern_1, pattern_2, ..., pattern_n]) - * multiSearchFirstIndexCaseInsensitiveUTF8(haystack, [pattern_1, pattern_2, ..., pattern_n]) */ namespace ErrorCodes { extern const int ILLEGAL_TYPE_OF_ARGUMENT; extern const int ILLEGAL_COLUMN; - extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; - extern const int FUNCTION_NOT_ALLOWED; } template @@ -163,224 +132,4 @@ public: } }; - -template -class FunctionsStringSearchToString : public IFunction -{ -public: - static constexpr auto name = Name::name; - static FunctionPtr create(const Context &) { return std::make_shared(); } - - String getName() const override { return name; } - - size_t getNumberOfArguments() const override { return 2; } - - bool useDefaultImplementationForConstants() const override { return true; } - ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } - - DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override - { - if (!isString(arguments[0])) - throw Exception( - "Illegal type " + arguments[0]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - - if (!isString(arguments[1])) - throw Exception( - "Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - - return std::make_shared(); - } - - void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override - { - const ColumnPtr column = block.getByPosition(arguments[0]).column; - const ColumnPtr column_needle = block.getByPosition(arguments[1]).column; - - const ColumnConst * col_needle = typeid_cast(&*column_needle); - if (!col_needle) - throw Exception("Second argument of function " + getName() + " must be constant string", ErrorCodes::ILLEGAL_COLUMN); - - if (const ColumnString * col = checkAndGetColumn(column.get())) - { - auto col_res = ColumnString::create(); - - ColumnString::Chars & vec_res = col_res->getChars(); - ColumnString::Offsets & offsets_res = col_res->getOffsets(); - Impl::vector(col->getChars(), col->getOffsets(), col_needle->getValue(), vec_res, offsets_res); - - block.getByPosition(result).column = std::move(col_res); - } - else - throw Exception( - "Illegal column " + block.getByPosition(arguments[0]).column->getName() + " of argument of function " + getName(), - ErrorCodes::ILLEGAL_COLUMN); - } -}; - -template -class FunctionsMultiStringPosition : public IFunction -{ -public: - static constexpr auto name = Name::name; - static FunctionPtr create(const Context &) { return std::make_shared(); } - - String getName() const override { return name; } - - size_t getNumberOfArguments() const override { return 2; } - bool useDefaultImplementationForConstants() const override { return true; } - ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } - - DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override - { - if (!isString(arguments[0])) - throw Exception( - "Illegal type " + arguments[0]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - - const DataTypeArray * array_type = checkAndGetDataType(arguments[1].get()); - if (!array_type || !checkAndGetDataType(array_type->getNestedType().get())) - throw Exception( - "Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - - return std::make_shared(std::make_shared()); - } - - void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override - { - using ResultType = typename Impl::ResultType; - - const ColumnPtr & column_haystack = block.getByPosition(arguments[0]).column; - - const ColumnString * col_haystack_vector = checkAndGetColumn(&*column_haystack); - - const ColumnPtr & arr_ptr = block.getByPosition(arguments[1]).column; - const ColumnConst * col_const_arr = checkAndGetColumnConst(arr_ptr.get()); - - if (!col_const_arr) - throw Exception( - "Illegal column " + block.getByPosition(arguments[1]).column->getName() + ". The array is not const", - ErrorCodes::ILLEGAL_COLUMN); - - Array src_arr = col_const_arr->getValue(); - - if (src_arr.size() > std::numeric_limits::max()) - throw Exception( - "Number of arguments for function " + getName() + " doesn't match: passed " + std::to_string(src_arr.size()) - + ", should be at most 255", - ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - - std::vector refs; - for (const auto & el : src_arr) - refs.emplace_back(el.get()); - - const size_t column_haystack_size = column_haystack->size(); - - auto col_res = ColumnVector::create(); - auto col_offsets = ColumnArray::ColumnOffsets::create(column_haystack_size); - - auto & vec_res = col_res->getData(); - auto & offsets_res = col_offsets->getData(); - - vec_res.resize(column_haystack_size * refs.size()); - - if (col_haystack_vector) - Impl::vectorConstant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res); - else - throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN); - - size_t refs_size = refs.size(); - size_t accum = refs_size; - - for (size_t i = 0; i < column_haystack_size; ++i, accum += refs_size) - offsets_res[i] = accum; - - block.getByPosition(result).column = ColumnArray::create(std::move(col_res), std::move(col_offsets)); - } -}; - -/// The argument limiting raises from Volnitsky searcher -- it is performance crucial to save only one byte for pattern number. -/// But some other searchers use this function, for example, multiMatchAny -- hyperscan does not have such restrictions -template ::max()> -class FunctionsMultiStringSearch : public IFunction -{ - static_assert(LimitArgs > 0); - -public: - static constexpr auto name = Name::name; - static FunctionPtr create(const Context & context) - { - if (Impl::is_using_hyperscan && !context.getSettingsRef().allow_hyperscan) - throw Exception( - "Hyperscan functions are disabled, because setting 'allow_hyperscan' is set to 0", ErrorCodes::FUNCTION_NOT_ALLOWED); - - return std::make_shared(); - } - - String getName() const override { return name; } - - size_t getNumberOfArguments() const override { return 2; } - bool useDefaultImplementationForConstants() const override { return true; } - ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } - - DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override - { - if (!isString(arguments[0])) - throw Exception( - "Illegal type " + arguments[0]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - - const DataTypeArray * array_type = checkAndGetDataType(arguments[1].get()); - if (!array_type || !checkAndGetDataType(array_type->getNestedType().get())) - throw Exception( - "Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); - return Impl::getReturnType(); - } - - void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override - { - using ResultType = typename Impl::ResultType; - - const ColumnPtr & column_haystack = block.getByPosition(arguments[0]).column; - - const ColumnString * col_haystack_vector = checkAndGetColumn(&*column_haystack); - - const ColumnPtr & arr_ptr = block.getByPosition(arguments[1]).column; - const ColumnConst * col_const_arr = checkAndGetColumnConst(arr_ptr.get()); - - if (!col_const_arr) - throw Exception( - "Illegal column " + block.getByPosition(arguments[1]).column->getName() + ". The array is not const", - ErrorCodes::ILLEGAL_COLUMN); - - Array src_arr = col_const_arr->getValue(); - - if (src_arr.size() > LimitArgs) - throw Exception( - "Number of arguments for function " + getName() + " doesn't match: passed " + std::to_string(src_arr.size()) - + ", should be at most " + std::to_string(LimitArgs), - ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - - std::vector refs; - refs.reserve(src_arr.size()); - - for (const auto & el : src_arr) - refs.emplace_back(el.get()); - - auto col_res = ColumnVector::create(); - auto col_offsets = ColumnArray::ColumnOffsets::create(); - - auto & vec_res = col_res->getData(); - auto & offsets_res = col_offsets->getData(); - - /// The blame for resizing output is for the callee. - if (col_haystack_vector) - Impl::vectorConstant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res, offsets_res); - else - throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN); - - if constexpr (Impl::is_column_array) - block.getByPosition(result).column = ColumnArray::create(std::move(col_res), std::move(col_offsets)); - else - block.getByPosition(result).column = std::move(col_res); - } -}; - } diff --git a/dbms/src/Functions/FunctionsStringSearchToString.h b/dbms/src/Functions/FunctionsStringSearchToString.h new file mode 100644 index 00000000000..b28b129f651 --- /dev/null +++ b/dbms/src/Functions/FunctionsStringSearchToString.h @@ -0,0 +1,87 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ +/** Applies regexp re2 and extracts: + * - the first subpattern, if the regexp has a subpattern; + * - the zero subpattern (the match part, otherwise); + * - if not match - an empty string. + * extract(haystack, pattern) + */ + +namespace ErrorCodes +{ + extern const int ILLEGAL_TYPE_OF_ARGUMENT; + extern const int ILLEGAL_COLUMN; +} + + +template +class FunctionsStringSearchToString : public IFunction +{ +public: + static constexpr auto name = Name::name; + static FunctionPtr create(const Context &) { return std::make_shared(); } + + String getName() const override { return name; } + + size_t getNumberOfArguments() const override { return 2; } + + bool useDefaultImplementationForConstants() const override { return true; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override + { + if (!isString(arguments[0])) + throw Exception( + "Illegal type " + arguments[0]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + if (!isString(arguments[1])) + throw Exception( + "Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + return std::make_shared(); + } + + void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override + { + const ColumnPtr column = block.getByPosition(arguments[0]).column; + const ColumnPtr column_needle = block.getByPosition(arguments[1]).column; + + const ColumnConst * col_needle = typeid_cast(&*column_needle); + if (!col_needle) + throw Exception("Second argument of function " + getName() + " must be constant string", ErrorCodes::ILLEGAL_COLUMN); + + if (const ColumnString * col = checkAndGetColumn(column.get())) + { + auto col_res = ColumnString::create(); + + ColumnString::Chars & vec_res = col_res->getChars(); + ColumnString::Offsets & offsets_res = col_res->getOffsets(); + Impl::vector(col->getChars(), col->getOffsets(), col_needle->getValue(), vec_res, offsets_res); + + block.getByPosition(result).column = std::move(col_res); + } + else + throw Exception( + "Illegal column " + block.getByPosition(arguments[0]).column->getName() + " of argument of function " + getName(), + ErrorCodes::ILLEGAL_COLUMN); + } +}; + +} diff --git a/dbms/src/Functions/HasTokenImpl.h b/dbms/src/Functions/HasTokenImpl.h new file mode 100644 index 00000000000..b8f250be69f --- /dev/null +++ b/dbms/src/Functions/HasTokenImpl.h @@ -0,0 +1,83 @@ +#pragma once + +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int ILLEGAL_COLUMN; +} + +/** Token search the string, means that needle must be surrounded by some separator chars, like whitespace or puctuation. + */ +template +struct HasTokenImpl +{ + using ResultType = UInt8; + + static constexpr bool use_default_implementation_for_constants = true; + + static void vectorConstant( + const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & pattern, PaddedPODArray & res) + { + if (offsets.empty()) + return; + + const UInt8 * begin = data.data(); + const UInt8 * pos = begin; + const UInt8 * end = pos + data.size(); + + /// The current index in the array of strings. + size_t i = 0; + + TokenSearcher searcher(pattern.data(), pattern.size(), end - pos); + + /// We will search for the next occurrence in all rows at once. + while (pos < end && end != (pos = searcher.search(pos, end - pos))) + { + /// Let's determine which index it refers to. + while (begin + offsets[i] <= pos) + { + res[i] = negate_result; + ++i; + } + + /// We check that the entry does not pass through the boundaries of strings. + if (pos + pattern.size() < begin + offsets[i]) + res[i] = !negate_result; + else + res[i] = negate_result; + + pos = begin + offsets[i]; + ++i; + } + + /// Tail, in which there can be no substring. + if (i < res.size()) + memset(&res[i], negate_result, (res.size() - i) * sizeof(res[0])); + } + + template + static void vectorVector(Args &&...) + { + throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN); + } + + /// Search different needles in single haystack. + template + static void constantVector(Args &&...) + { + throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN); + } + + template + static void vectorFixedConstant(Args &&...) + { + throw Exception("Functions 'hasToken' don't support FixedString haystack argument", ErrorCodes::ILLEGAL_COLUMN); + } +}; + +} diff --git a/dbms/src/Functions/MultiSearchAllPositionsImpl.h b/dbms/src/Functions/MultiSearchAllPositionsImpl.h new file mode 100644 index 00000000000..f54fe41f20c --- /dev/null +++ b/dbms/src/Functions/MultiSearchAllPositionsImpl.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include + + +namespace DB +{ + +template +struct MultiSearchAllPositionsImpl +{ + using ResultType = UInt64; + + static void vectorConstant( + const ColumnString::Chars & haystack_data, + const ColumnString::Offsets & haystack_offsets, + const std::vector & needles, + PaddedPODArray & res) + { + auto res_callback = [](const UInt8 * start, const UInt8 * end) -> UInt64 + { + return 1 + Impl::countChars(reinterpret_cast(start), reinterpret_cast(end)); + }; + + auto searcher = Impl::createMultiSearcherInBigHaystack(needles); + + const size_t haystack_string_size = haystack_offsets.size(); + const size_t needles_size = needles.size(); + + /// Something can be uninitialized after the search itself + std::fill(res.begin(), res.end(), 0); + + while (searcher.hasMoreToSearch()) + { + size_t prev_offset = 0; + for (size_t j = 0, from = 0; j < haystack_string_size; ++j, from += needles_size) + { + const auto * haystack = &haystack_data[prev_offset]; + const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; + searcher.searchOneAll(haystack, haystack_end, res.data() + from, res_callback); + prev_offset = haystack_offsets[j]; + } + } + } +}; + +} diff --git a/dbms/src/Functions/MultiSearchFirstIndexImpl.h b/dbms/src/Functions/MultiSearchFirstIndexImpl.h new file mode 100644 index 00000000000..bb0bb57b9db --- /dev/null +++ b/dbms/src/Functions/MultiSearchFirstIndexImpl.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include + + +namespace DB +{ + +template +struct MultiSearchFirstIndexImpl +{ + using ResultType = UInt64; + static constexpr bool is_using_hyperscan = false; + /// Variable for understanding, if we used offsets for the output, most + /// likely to determine whether the function returns ColumnVector of ColumnArray. + static constexpr bool is_column_array = false; + static auto getReturnType() { return std::make_shared>(); } + + static void vectorConstant( + const ColumnString::Chars & haystack_data, + const ColumnString::Offsets & haystack_offsets, + const std::vector & needles, + PaddedPODArray & res, + [[maybe_unused]] PaddedPODArray & offsets) + { + auto searcher = Impl::createMultiSearcherInBigHaystack(needles); + const size_t haystack_string_size = haystack_offsets.size(); + res.resize(haystack_string_size); + size_t iteration = 0; + while (searcher.hasMoreToSearch()) + { + size_t prev_offset = 0; + for (size_t j = 0; j < haystack_string_size; ++j) + { + const auto * haystack = &haystack_data[prev_offset]; + const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; + /// hasMoreToSearch traverse needles in increasing order + if (iteration == 0 || res[j] == 0) + res[j] = searcher.searchOneFirstIndex(haystack, haystack_end); + prev_offset = haystack_offsets[j]; + } + ++iteration; + } + } +}; + +} diff --git a/dbms/src/Functions/MultiSearchFirstPositionImpl.h b/dbms/src/Functions/MultiSearchFirstPositionImpl.h new file mode 100644 index 00000000000..4743518e61e --- /dev/null +++ b/dbms/src/Functions/MultiSearchFirstPositionImpl.h @@ -0,0 +1,57 @@ +#pragma once + +#include +#include + + +namespace DB +{ + +template +struct MultiSearchFirstPositionImpl +{ + using ResultType = UInt64; + static constexpr bool is_using_hyperscan = false; + /// Variable for understanding, if we used offsets for the output, most + /// likely to determine whether the function returns ColumnVector of ColumnArray. + static constexpr bool is_column_array = false; + static auto getReturnType() { return std::make_shared>(); } + + static void vectorConstant( + const ColumnString::Chars & haystack_data, + const ColumnString::Offsets & haystack_offsets, + const std::vector & needles, + PaddedPODArray & res, + [[maybe_unused]] PaddedPODArray & offsets) + { + auto res_callback = [](const UInt8 * start, const UInt8 * end) -> UInt64 + { + return 1 + Impl::countChars(reinterpret_cast(start), reinterpret_cast(end)); + }; + auto searcher = Impl::createMultiSearcherInBigHaystack(needles); + const size_t haystack_string_size = haystack_offsets.size(); + res.resize(haystack_string_size); + size_t iteration = 0; + while (searcher.hasMoreToSearch()) + { + size_t prev_offset = 0; + for (size_t j = 0; j < haystack_string_size; ++j) + { + const auto * haystack = &haystack_data[prev_offset]; + const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; + if (iteration == 0 || res[j] == 0) + res[j] = searcher.searchOneFirstPosition(haystack, haystack_end, res_callback); + else + { + UInt64 result = searcher.searchOneFirstPosition(haystack, haystack_end, res_callback); + if (result != 0) + res[j] = std::min(result, res[j]); + } + prev_offset = haystack_offsets[j]; + } + ++iteration; + } + } +}; + +} diff --git a/dbms/src/Functions/MultiSearchImpl.h b/dbms/src/Functions/MultiSearchImpl.h new file mode 100644 index 00000000000..5b881e2fd55 --- /dev/null +++ b/dbms/src/Functions/MultiSearchImpl.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + + +namespace DB +{ + +template +struct MultiSearchImpl +{ + using ResultType = UInt8; + static constexpr bool is_using_hyperscan = false; + /// Variable for understanding, if we used offsets for the output, most + /// likely to determine whether the function returns ColumnVector of ColumnArray. + static constexpr bool is_column_array = false; + static auto getReturnType() { return std::make_shared>(); } + + static void vectorConstant( + const ColumnString::Chars & haystack_data, + const ColumnString::Offsets & haystack_offsets, + const std::vector & needles, + PaddedPODArray & res, + [[maybe_unused]] PaddedPODArray & offsets) + { + auto searcher = Impl::createMultiSearcherInBigHaystack(needles); + const size_t haystack_string_size = haystack_offsets.size(); + res.resize(haystack_string_size); + size_t iteration = 0; + while (searcher.hasMoreToSearch()) + { + size_t prev_offset = 0; + for (size_t j = 0; j < haystack_string_size; ++j) + { + const auto * haystack = &haystack_data[prev_offset]; + const auto * haystack_end = haystack + haystack_offsets[j] - prev_offset - 1; + if (iteration == 0 || !res[j]) + res[j] = searcher.searchOne(haystack, haystack_end); + prev_offset = haystack_offsets[j]; + } + ++iteration; + } + } +}; + +} diff --git a/dbms/src/Functions/PositionImpl.h b/dbms/src/Functions/PositionImpl.h new file mode 100644 index 00000000000..bc0b2c7bcfb --- /dev/null +++ b/dbms/src/Functions/PositionImpl.h @@ -0,0 +1,307 @@ +#include "FunctionsStringSearch.h" + +#include +#include +#include +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int ILLEGAL_COLUMN; +} + +/** Implementation details for functions of 'position' family depending on ASCII/UTF8 and case sensitiveness. + */ +struct PositionCaseSensitiveASCII +{ + /// For searching single substring inside big-enough contiguous chunk of data. Coluld have slightly expensive initialization. + using SearcherInBigHaystack = Volnitsky; + + /// For search many substrings in one string + using MultiSearcherInBigHaystack = MultiVolnitsky; + + /// For searching single substring, that is different each time. This object is created for each row of data. It must have cheap initialization. + using SearcherInSmallHaystack = LibCASCIICaseSensitiveStringSearcher; + + static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t haystack_size_hint) + { + return SearcherInBigHaystack(needle_data, needle_size, haystack_size_hint); + } + + static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) + { + return SearcherInSmallHaystack(needle_data, needle_size); + } + + static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) + { + return MultiSearcherInBigHaystack(needles); + } + + /// Number of code points between 'begin' and 'end' (this has different behaviour for ASCII and UTF-8). + static size_t countChars(const char * begin, const char * end) { return end - begin; } + + /// Convert string to lowercase. Only for case-insensitive search. + /// Implementation is permitted to be inefficient because it is called for single string. + static void toLowerIfNeed(std::string &) { } +}; + + +struct PositionCaseInsensitiveASCII +{ + /// `Volnitsky` is not used here, because one person has measured that this is better. It will be good if you question it. + using SearcherInBigHaystack = ASCIICaseInsensitiveStringSearcher; + using MultiSearcherInBigHaystack = MultiVolnitskyCaseInsensitive; + using SearcherInSmallHaystack = LibCASCIICaseInsensitiveStringSearcher; + + static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t /*haystack_size_hint*/) + { + return SearcherInBigHaystack(needle_data, needle_size); + } + + static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) + { + return SearcherInSmallHaystack(needle_data, needle_size); + } + + static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) + { + return MultiSearcherInBigHaystack(needles); + } + + static size_t countChars(const char * begin, const char * end) { return end - begin; } + + static void toLowerIfNeed(std::string & s) { std::transform(std::begin(s), std::end(s), std::begin(s), tolower); } +}; + + +struct PositionCaseSensitiveUTF8 +{ + using SearcherInBigHaystack = VolnitskyUTF8; + using MultiSearcherInBigHaystack = MultiVolnitskyUTF8; + using SearcherInSmallHaystack = LibCASCIICaseSensitiveStringSearcher; + + static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t haystack_size_hint) + { + return SearcherInBigHaystack(needle_data, needle_size, haystack_size_hint); + } + + static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) + { + return SearcherInSmallHaystack(needle_data, needle_size); + } + + static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) + { + return MultiSearcherInBigHaystack(needles); + } + + static size_t countChars(const char * begin, const char * end) + { + size_t res = 0; + for (auto it = begin; it != end; ++it) + if (!UTF8::isContinuationOctet(static_cast(*it))) + ++res; + return res; + } + + static void toLowerIfNeed(std::string &) { } +}; + + +struct PositionCaseInsensitiveUTF8 +{ + using SearcherInBigHaystack = VolnitskyCaseInsensitiveUTF8; + using MultiSearcherInBigHaystack = MultiVolnitskyCaseInsensitiveUTF8; + using SearcherInSmallHaystack = UTF8CaseInsensitiveStringSearcher; /// TODO Very suboptimal. + + static SearcherInBigHaystack createSearcherInBigHaystack(const char * needle_data, size_t needle_size, size_t haystack_size_hint) + { + return SearcherInBigHaystack(needle_data, needle_size, haystack_size_hint); + } + + static SearcherInSmallHaystack createSearcherInSmallHaystack(const char * needle_data, size_t needle_size) + { + return SearcherInSmallHaystack(needle_data, needle_size); + } + + static MultiSearcherInBigHaystack createMultiSearcherInBigHaystack(const std::vector & needles) + { + return MultiSearcherInBigHaystack(needles); + } + + static size_t countChars(const char * begin, const char * end) + { + size_t res = 0; + for (auto it = begin; it != end; ++it) + if (!UTF8::isContinuationOctet(static_cast(*it))) + ++res; + return res; + } + + static void toLowerIfNeed(std::string & s) { Poco::UTF8::toLowerInPlace(s); } +}; + + +template +struct PositionImpl +{ + static constexpr bool use_default_implementation_for_constants = false; + + using ResultType = UInt64; + + /// Find one substring in many strings. + static void vectorConstant( + const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & needle, PaddedPODArray & res) + { + const UInt8 * begin = data.data(); + const UInt8 * pos = begin; + const UInt8 * end = pos + data.size(); + + /// Current index in the array of strings. + size_t i = 0; + + typename Impl::SearcherInBigHaystack searcher = Impl::createSearcherInBigHaystack(needle.data(), needle.size(), end - pos); + + /// We will search for the next occurrence in all strings at once. + while (pos < end && end != (pos = searcher.search(pos, end - pos))) + { + /// Determine which index it refers to. + while (begin + offsets[i] <= pos) + { + res[i] = 0; + ++i; + } + + /// We check that the entry does not pass through the boundaries of strings. + if (pos + needle.size() < begin + offsets[i]) + res[i] = 1 + Impl::countChars(reinterpret_cast(begin + offsets[i - 1]), reinterpret_cast(pos)); + else + res[i] = 0; + + pos = begin + offsets[i]; + ++i; + } + + if (i < res.size()) + memset(&res[i], 0, (res.size() - i) * sizeof(res[0])); + } + + /// Search for substring in string. + static void constantConstant(std::string data, std::string needle, UInt64 & res) + { + Impl::toLowerIfNeed(data); + Impl::toLowerIfNeed(needle); + + res = data.find(needle); + if (res == std::string::npos) + res = 0; + else + res = 1 + Impl::countChars(data.data(), data.data() + res); + } + + /// Search each time for a different single substring inside each time different string. + static void vectorVector( + const ColumnString::Chars & haystack_data, + const ColumnString::Offsets & haystack_offsets, + const ColumnString::Chars & needle_data, + const ColumnString::Offsets & needle_offsets, + PaddedPODArray & res) + { + ColumnString::Offset prev_haystack_offset = 0; + ColumnString::Offset prev_needle_offset = 0; + + size_t size = haystack_offsets.size(); + + for (size_t i = 0; i < size; ++i) + { + size_t needle_size = needle_offsets[i] - prev_needle_offset - 1; + size_t haystack_size = haystack_offsets[i] - prev_haystack_offset - 1; + + if (0 == needle_size) + { + /// An empty string is always at the very beginning of `haystack`. + res[i] = 1; + } + else + { + /// It is assumed that the StringSearcher is not very difficult to initialize. + typename Impl::SearcherInSmallHaystack searcher = Impl::createSearcherInSmallHaystack( + reinterpret_cast(&needle_data[prev_needle_offset]), + needle_offsets[i] - prev_needle_offset - 1); /// zero byte at the end + + /// searcher returns a pointer to the found substring or to the end of `haystack`. + size_t pos = searcher.search(&haystack_data[prev_haystack_offset], &haystack_data[haystack_offsets[i] - 1]) + - &haystack_data[prev_haystack_offset]; + + if (pos != haystack_size) + { + res[i] = 1 + + Impl::countChars( + reinterpret_cast(&haystack_data[prev_haystack_offset]), + reinterpret_cast(&haystack_data[prev_haystack_offset + pos])); + } + else + res[i] = 0; + } + + prev_haystack_offset = haystack_offsets[i]; + prev_needle_offset = needle_offsets[i]; + } + } + + /// Find many substrings in single string. + static void constantVector( + const String & haystack, + const ColumnString::Chars & needle_data, + const ColumnString::Offsets & needle_offsets, + PaddedPODArray & res) + { + // NOTE You could use haystack indexing. But this is a rare case. + + ColumnString::Offset prev_needle_offset = 0; + + size_t size = needle_offsets.size(); + + for (size_t i = 0; i < size; ++i) + { + size_t needle_size = needle_offsets[i] - prev_needle_offset - 1; + + if (0 == needle_size) + { + res[i] = 1; + } + else + { + typename Impl::SearcherInSmallHaystack searcher = Impl::createSearcherInSmallHaystack( + reinterpret_cast(&needle_data[prev_needle_offset]), needle_offsets[i] - prev_needle_offset - 1); + + size_t pos = searcher.search( + reinterpret_cast(haystack.data()), + reinterpret_cast(haystack.data()) + haystack.size()) + - reinterpret_cast(haystack.data()); + + if (pos != haystack.size()) + { + res[i] = 1 + Impl::countChars(haystack.data(), haystack.data() + pos); + } + else + res[i] = 0; + } + + prev_needle_offset = needle_offsets[i]; + } + } + + template + static void vectorFixedConstant(Args &&...) + { + throw Exception("Functions 'position' don't support FixedString haystack argument", ErrorCodes::ILLEGAL_COLUMN); + } +}; + +} diff --git a/dbms/src/Functions/URL/cutURLParameter.cpp b/dbms/src/Functions/URL/cutURLParameter.cpp index b8f5c84fe83..f0103f42acd 100644 --- a/dbms/src/Functions/URL/cutURLParameter.cpp +++ b/dbms/src/Functions/URL/cutURLParameter.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include namespace DB diff --git a/dbms/src/Functions/URL/extractURLParameter.cpp b/dbms/src/Functions/URL/extractURLParameter.cpp index 8c5292bdc0a..c6234c66fc0 100644 --- a/dbms/src/Functions/URL/extractURLParameter.cpp +++ b/dbms/src/Functions/URL/extractURLParameter.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include namespace DB diff --git a/dbms/src/Functions/array/arrayReduce.cpp b/dbms/src/Functions/array/arrayReduce.cpp index e97607af135..3df07303eba 100644 --- a/dbms/src/Functions/array/arrayReduce.cpp +++ b/dbms/src/Functions/array/arrayReduce.cpp @@ -5,12 +5,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include @@ -108,7 +106,7 @@ DataTypePtr FunctionArrayReduce::getReturnTypeImpl(const ColumnsWithTypeAndName void FunctionArrayReduce::executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) { - IAggregateFunction & agg_func = *aggregate_function.get(); + IAggregateFunction & agg_func = *aggregate_function; std::unique_ptr arena = std::make_unique(); /// Aggregate functions do not support constant columns. Therefore, we materialize them. @@ -132,7 +130,7 @@ void FunctionArrayReduce::executeImpl(Block & block, const ColumnNumbers & argum else if (const ColumnConst * const_arr = checkAndGetColumnConst(col)) { materialized_columns.emplace_back(const_arr->convertToFullColumn()); - const auto & materialized_arr = typeid_cast(*materialized_columns.back().get()); + const auto & materialized_arr = typeid_cast(*materialized_columns.back()); aggregate_arguments_vec[i] = &materialized_arr.getData(); offsets_i = &materialized_arr.getOffsets(); } diff --git a/dbms/src/Functions/array/arrayReduceInRanges.cpp b/dbms/src/Functions/array/arrayReduceInRanges.cpp new file mode 100644 index 00000000000..18f1086ea6a --- /dev/null +++ b/dbms/src/Functions/array/arrayReduceInRanges.cpp @@ -0,0 +1,394 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int SIZES_OF_ARRAYS_DOESNT_MATCH; + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int ILLEGAL_COLUMN; + extern const int ILLEGAL_TYPE_OF_ARGUMENT; + extern const int BAD_ARGUMENTS; +} + + +/** Applies an aggregate function to value ranges in the array. + * The function does what arrayReduce do on a structure similar to segment tree. + * Space complexity: n * log(n) + * + * arrayReduceInRanges('agg', indices, lengths, arr1, ...) + */ +class FunctionArrayReduceInRanges : public IFunction +{ +public: + static const size_t minimum_step = 64; + static constexpr auto name = "arrayReduceInRanges"; + static FunctionPtr create(const Context &) { return std::make_shared(); } + + String getName() const override { return name; } + + bool isVariadic() const override { return true; } + size_t getNumberOfArguments() const override { return 0; } + + bool useDefaultImplementationForConstants() const override { return true; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override; + + void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) override; + +private: + /// lazy initialization in getReturnTypeImpl + /// TODO: init in OverloadResolver + mutable AggregateFunctionPtr aggregate_function; +}; + + +DataTypePtr FunctionArrayReduceInRanges::getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const +{ + /// The first argument is a constant string with the name of the aggregate function + /// (possibly with parameters in parentheses, for example: "quantile(0.99)"). + + if (arguments.size() < 3) + throw Exception("Number of arguments for function " + getName() + " doesn't match: passed " + + toString(arguments.size()) + ", should be at least 3.", + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); + + const ColumnConst * aggregate_function_name_column = checkAndGetColumnConst(arguments[0].column.get()); + if (!aggregate_function_name_column) + throw Exception("First argument for function " + getName() + " must be constant string: name of aggregate function.", + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + const DataTypeArray * ranges_type_array = checkAndGetDataType(arguments[1].type.get()); + if (!ranges_type_array) + throw Exception("Second argument for function " + getName() + " must be an array of ranges.", + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + const DataTypeTuple * ranges_type_tuple = checkAndGetDataType(ranges_type_array->getNestedType().get()); + if (!ranges_type_tuple || ranges_type_tuple->getElements().size() != 2) + throw Exception("Each array element in the second argument for function " + getName() + " must be a tuple (index, length).", + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + if (!isNativeInteger(ranges_type_tuple->getElements()[0])) + throw Exception("First tuple member in the second argument for function " + getName() + " must be ints or uints.", + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + if (!WhichDataType(ranges_type_tuple->getElements()[1]).isNativeUInt()) + throw Exception("Second tuple member in the second argument for function " + getName() + " must be uints.", + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + DataTypes argument_types(arguments.size() - 2); + for (size_t i = 2, size = arguments.size(); i < size; ++i) + { + const DataTypeArray * arg = checkAndGetDataType(arguments[i].type.get()); + if (!arg) + throw Exception("Argument " + toString(i) + " for function " + getName() + " must be an array but it has type " + + arguments[i].type->getName() + ".", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + + argument_types[i - 2] = arg->getNestedType(); + } + + if (!aggregate_function) + { + String aggregate_function_name_with_params = aggregate_function_name_column->getValue(); + + if (aggregate_function_name_with_params.empty()) + throw Exception("First argument for function " + getName() + " (name of aggregate function) cannot be empty.", + ErrorCodes::BAD_ARGUMENTS); + + String aggregate_function_name; + Array params_row; + getAggregateFunctionNameAndParametersArray(aggregate_function_name_with_params, + aggregate_function_name, params_row, "function " + getName()); + + aggregate_function = AggregateFunctionFactory::instance().get(aggregate_function_name, argument_types, params_row); + } + + return std::make_shared(aggregate_function->getReturnType()); +} + + +void FunctionArrayReduceInRanges::executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) +{ + IAggregateFunction & agg_func = *aggregate_function; + std::unique_ptr arena = std::make_unique(); + + /// Aggregate functions do not support constant columns. Therefore, we materialize them. + std::vector materialized_columns; + + /// Handling ranges + + const IColumn * ranges_col_array = block.getByPosition(arguments[1]).column.get(); + const IColumn * ranges_col_tuple = nullptr; + const ColumnArray::Offsets * ranges_offsets = nullptr; + if (const ColumnArray * arr = checkAndGetColumn(ranges_col_array)) + { + ranges_col_tuple = &arr->getData(); + ranges_offsets = &arr->getOffsets(); + } + else if (const ColumnConst * const_arr = checkAndGetColumnConst(ranges_col_array)) + { + materialized_columns.emplace_back(const_arr->convertToFullColumn()); + const auto & materialized_arr = typeid_cast(*materialized_columns.back()); + ranges_col_tuple = &materialized_arr.getData(); + ranges_offsets = &materialized_arr.getOffsets(); + } + else + throw Exception("Illegal column " + ranges_col_array->getName() + " as argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); + + const IColumn & indices_col = static_cast(ranges_col_tuple)->getColumn(0); + const IColumn & lengths_col = static_cast(ranges_col_tuple)->getColumn(1); + + /// Handling arguments + /// The code is mostly copied from `arrayReduce`. Maybe create a utility header? + + const size_t num_arguments_columns = arguments.size() - 2; + + std::vector aggregate_arguments_vec(num_arguments_columns); + const ColumnArray::Offsets * offsets = nullptr; + + for (size_t i = 0; i < num_arguments_columns; ++i) + { + const IColumn * col = block.getByPosition(arguments[i + 2]).column.get(); + + const ColumnArray::Offsets * offsets_i = nullptr; + if (const ColumnArray * arr = checkAndGetColumn(col)) + { + aggregate_arguments_vec[i] = &arr->getData(); + offsets_i = &arr->getOffsets(); + } + else if (const ColumnConst * const_arr = checkAndGetColumnConst(col)) + { + materialized_columns.emplace_back(const_arr->convertToFullColumn()); + const auto & materialized_arr = typeid_cast(*materialized_columns.back()); + aggregate_arguments_vec[i] = &materialized_arr.getData(); + offsets_i = &materialized_arr.getOffsets(); + } + else + throw Exception("Illegal column " + col->getName() + " as argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); + + if (i == 0) + offsets = offsets_i; + else if (*offsets_i != *offsets) + throw Exception("Lengths of all arrays passed to " + getName() + " must be equal.", + ErrorCodes::SIZES_OF_ARRAYS_DOESNT_MATCH); + } + const IColumn ** aggregate_arguments = aggregate_arguments_vec.data(); + + /// Handling results + + MutableColumnPtr result_holder = block.getByPosition(result).type->createColumn(); + ColumnArray * result_arr = static_cast(result_holder.get()); + IColumn & result_data = result_arr->getData(); + + result_arr->getOffsets().insert(ranges_offsets->begin(), ranges_offsets->end()); + + /// AggregateFunction's states should be inserted into column using specific way + auto res_col_aggregate_function = typeid_cast(&result_data); + + if (!res_col_aggregate_function && agg_func.isState()) + throw Exception("State function " + agg_func.getName() + " inserts results into non-state column " + + block.getByPosition(result).type->getName(), ErrorCodes::ILLEGAL_COLUMN); + + /// Perform the aggregation + + size_t begin = 0; + size_t end = 0; + size_t ranges_begin = 0; + size_t ranges_end = 0; + + for (size_t i = 0; i < input_rows_count; ++i) + { + begin = end; + end = (*offsets)[i]; + ranges_begin = ranges_end; + ranges_end = (*ranges_offsets)[i]; + + /// We will allocate pre-aggregation places for each `minimum_place << level` rows. + /// The value of `level` starts from 0, and it will never exceed the number of bits in a `size_t`. + /// We calculate the offset (and thus size) of those places in each level. + size_t place_offsets[sizeof(size_t) * 8]; + size_t place_total = 0; + { + size_t place_in_level = (end - begin) / minimum_step; + + place_offsets[0] = place_in_level; + for (size_t level = 0; place_in_level; ++level) + { + place_in_level >>= 1; + place_total = place_offsets[level] + place_in_level; + place_offsets[level + 1] = place_total; + } + } + + PODArray places(place_total); + for (size_t j = 0; j < place_total; ++j) + { + places[j] = arena->alignedAlloc(agg_func.sizeOfData(), agg_func.alignOfData()); + try + { + agg_func.create(places[j]); + } + catch (...) + { + for (size_t k = 0; k < j; ++k) + agg_func.destroy(places[k]); + throw; + } + } + + SCOPE_EXIT({ + for (size_t j = 0; j < place_total; ++j) + agg_func.destroy(places[j]); + }); + + auto true_func = &agg_func; + /// Unnest consecutive trailing -State combinators + while (auto func = typeid_cast(true_func)) + true_func = func->getNestedFunction().get(); + + /// Pre-aggregate to the initial level + for (size_t j = 0; j < place_offsets[0]; ++j) + { + size_t local_begin = j * minimum_step; + size_t local_end = (j + 1) * minimum_step; + + for (size_t k = local_begin; k < local_end; ++k) + true_func->add(places[j], aggregate_arguments, begin + k, arena.get()); + } + + /// Pre-aggregate to the higher levels by merging + { + size_t place_in_level = place_offsets[0] >> 1; + size_t place_begin = 0; + + for (size_t level = 0; place_in_level; ++level) + { + size_t next_place_begin = place_offsets[level]; + + for (size_t j = 0; j < place_in_level; ++j) + { + true_func->merge(places[next_place_begin + j], places[place_begin + (j << 1)], arena.get()); + true_func->merge(places[next_place_begin + j], places[place_begin + (j << 1) + 1], arena.get()); + } + + place_in_level >>= 1; + place_begin = next_place_begin; + } + } + + for (size_t j = ranges_begin; j < ranges_end; ++j) + { + size_t local_begin = 0; + size_t local_end = 0; + + { + Int64 index = indices_col.getInt(j); + UInt64 length = lengths_col.getUInt(j); + + /// Keep the same as in arraySlice + + if (index > 0) + { + local_begin = index - 1; + if (local_begin + length < end - begin) + local_end = local_begin + length; + else + local_end = end - begin; + } + else if (index < 0) + { + if (end - begin + index > 0) + local_begin = end - begin + index; + else + local_begin = 0; + + if (local_begin + length < end - begin) + local_end = local_begin + length; + else + local_end = end - begin; + } + } + + size_t place_begin = (local_begin + minimum_step - 1) / minimum_step; + size_t place_end = local_end / minimum_step; + + AggregateDataPtr place = arena->alignedAlloc(agg_func.sizeOfData(), agg_func.alignOfData()); + agg_func.create(place); + + SCOPE_EXIT({ + agg_func.destroy(place); + }); + + if (place_begin < place_end) + { + /// In this case, we can use pre-aggregated data. + + /// Aggregate rows before + for (size_t k = local_begin; k < place_begin * minimum_step; ++k) + true_func->add(place, aggregate_arguments, begin + k, arena.get()); + + /// Aggregate using pre-aggretated data + { + size_t level = 0; + size_t place_curr = place_begin; + + while (place_curr < place_end) + { + while (((place_curr >> level) & 1) == 0 && place_curr + (2 << level) <= place_end) + level += 1; + while (place_curr + (1 << level) > place_end) + level -= 1; + + size_t place_offset = 0; + if (level) + place_offset = place_offsets[level - 1]; + + true_func->merge(place, places[place_offset + (place_curr >> level)], arena.get()); + place_curr += 1 << level; + } + } + + /// Aggregate rows after + for (size_t k = place_end * minimum_step; k < local_end; ++k) + true_func->add(place, aggregate_arguments, begin + k, arena.get()); + } + else + { + /// In this case, we can not use pre-aggregated data. + + for (size_t k = local_begin; k < local_end; ++k) + true_func->add(place, aggregate_arguments, begin + k, arena.get()); + } + + if (!res_col_aggregate_function) + agg_func.insertResultInto(place, result_data); + else + res_col_aggregate_function->insertFrom(place); + } + } + + block.getByPosition(result).column = std::move(result_holder); +} + + +void registerFunctionArrayReduceInRanges(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/array/registerFunctionsArray.cpp b/dbms/src/Functions/array/registerFunctionsArray.cpp index 313ab7e27bb..084ed1ce702 100644 --- a/dbms/src/Functions/array/registerFunctionsArray.cpp +++ b/dbms/src/Functions/array/registerFunctionsArray.cpp @@ -33,6 +33,7 @@ void registerFunctionArrayFlatten(FunctionFactory &); void registerFunctionArrayWithConstant(FunctionFactory &); void registerFunctionArrayZip(FunctionFactory &); void registerFunctionArrayAUC(FunctionFactory &); +void registerFunctionArrayReduceInRanges(FunctionFactory &); void registerFunctionsArray(FunctionFactory & factory) { @@ -53,6 +54,7 @@ void registerFunctionsArray(FunctionFactory & factory) registerFunctionArraySlice(factory); registerFunctionArrayReverse(factory); registerFunctionArrayReduce(factory); + registerFunctionArrayReduceInRanges(factory); registerFunctionRange(factory); registerFunctionsEmptyArray(factory); registerFunctionEmptyArrayToSingle(factory); diff --git a/dbms/src/Functions/hasToken.cpp b/dbms/src/Functions/hasToken.cpp new file mode 100644 index 00000000000..ee04484ad54 --- /dev/null +++ b/dbms/src/Functions/hasToken.cpp @@ -0,0 +1,22 @@ +#include "FunctionsStringSearch.h" +#include +#include "HasTokenImpl.h" +#include + + +namespace DB +{ + +struct NameHasToken +{ + static constexpr auto name = "hasToken"; +}; + +using FunctionHasToken = FunctionsStringSearch, NameHasToken>; + +void registerFunctionHasToken(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/hasTokenCaseInsensitive.cpp b/dbms/src/Functions/hasTokenCaseInsensitive.cpp new file mode 100644 index 00000000000..c58df05d239 --- /dev/null +++ b/dbms/src/Functions/hasTokenCaseInsensitive.cpp @@ -0,0 +1,23 @@ +#include "FunctionsStringSearch.h" +#include +#include "HasTokenImpl.h" +#include + + +namespace DB +{ + +struct NameHasTokenCaseInsensitive +{ + static constexpr auto name = "hasTokenCaseInsensitive"; +}; + +using FunctionHasTokenCaseInsensitive + = FunctionsStringSearch, NameHasTokenCaseInsensitive>; + +void registerFunctionHasTokenCaseInsensitive(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAllPositions.cpp b/dbms/src/Functions/multiSearchAllPositions.cpp new file mode 100644 index 00000000000..c7aeb4d6245 --- /dev/null +++ b/dbms/src/Functions/multiSearchAllPositions.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringPosition.h" +#include "FunctionFactory.h" +#include "MultiSearchAllPositionsImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAllPositions +{ + static constexpr auto name = "multiSearchAllPositions"; +}; + +using FunctionMultiSearchAllPositions + = FunctionsMultiStringPosition, NameMultiSearchAllPositions>; + +void registerFunctionMultiSearchAllPositions(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAllPositionsCaseInsensitive.cpp b/dbms/src/Functions/multiSearchAllPositionsCaseInsensitive.cpp new file mode 100644 index 00000000000..4abcf7c8405 --- /dev/null +++ b/dbms/src/Functions/multiSearchAllPositionsCaseInsensitive.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringPosition.h" +#include "FunctionFactory.h" +#include "MultiSearchAllPositionsImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAllPositionsCaseInsensitive +{ + static constexpr auto name = "multiSearchAllPositionsCaseInsensitive"; +}; + +using FunctionMultiSearchAllPositionsCaseInsensitive + = FunctionsMultiStringPosition, NameMultiSearchAllPositionsCaseInsensitive>; + +void registerFunctionMultiSearchAllPositionsCaseInsensitive(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAllPositionsCaseInsensitiveUTF8.cpp b/dbms/src/Functions/multiSearchAllPositionsCaseInsensitiveUTF8.cpp new file mode 100644 index 00000000000..d9dbc1a7c8c --- /dev/null +++ b/dbms/src/Functions/multiSearchAllPositionsCaseInsensitiveUTF8.cpp @@ -0,0 +1,24 @@ +#include "FunctionsMultiStringPosition.h" +#include "FunctionFactory.h" +#include "MultiSearchAllPositionsImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAllPositionsCaseInsensitiveUTF8 +{ + static constexpr auto name = "multiSearchAllPositionsCaseInsensitiveUTF8"; +}; + +using FunctionMultiSearchAllPositionsCaseInsensitiveUTF8 = FunctionsMultiStringPosition< + MultiSearchAllPositionsImpl, + NameMultiSearchAllPositionsCaseInsensitiveUTF8>; + +void registerFunctionMultiSearchAllPositionsCaseInsensitiveUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAllPositionsUTF8.cpp b/dbms/src/Functions/multiSearchAllPositionsUTF8.cpp new file mode 100644 index 00000000000..8f39c0eade9 --- /dev/null +++ b/dbms/src/Functions/multiSearchAllPositionsUTF8.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringPosition.h" +#include "FunctionFactory.h" +#include "MultiSearchAllPositionsImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAllPositionsUTF8 +{ + static constexpr auto name = "multiSearchAllPositionsUTF8"; +}; + +using FunctionMultiSearchAllPositionsUTF8 + = FunctionsMultiStringPosition, NameMultiSearchAllPositionsUTF8>; + +void registerFunctionMultiSearchAllPositionsUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAny.cpp b/dbms/src/Functions/multiSearchAny.cpp new file mode 100644 index 00000000000..144dbdbfdc4 --- /dev/null +++ b/dbms/src/Functions/multiSearchAny.cpp @@ -0,0 +1,22 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAny +{ + static constexpr auto name = "multiSearchAny"; +}; + +using FunctionMultiSearch = FunctionsMultiStringSearch, NameMultiSearchAny>; + +void registerFunctionMultiSearchAny(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAnyCaseInsensitive.cpp b/dbms/src/Functions/multiSearchAnyCaseInsensitive.cpp new file mode 100644 index 00000000000..8b33a61013b --- /dev/null +++ b/dbms/src/Functions/multiSearchAnyCaseInsensitive.cpp @@ -0,0 +1,22 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAnyCaseInsensitive +{ + static constexpr auto name = "multiSearchAnyCaseInsensitive"; +}; +using FunctionMultiSearchCaseInsensitive + = FunctionsMultiStringSearch, NameMultiSearchAnyCaseInsensitive>; + +void registerFunctionMultiSearchAnyCaseInsensitive(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAnyCaseInsensitiveUTF8.cpp b/dbms/src/Functions/multiSearchAnyCaseInsensitiveUTF8.cpp new file mode 100644 index 00000000000..49a8b95a0e0 --- /dev/null +++ b/dbms/src/Functions/multiSearchAnyCaseInsensitiveUTF8.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAnyCaseInsensitiveUTF8 +{ + static constexpr auto name = "multiSearchAnyCaseInsensitiveUTF8"; +}; + +using FunctionMultiSearchCaseInsensitiveUTF8 + = FunctionsMultiStringSearch, NameMultiSearchAnyCaseInsensitiveUTF8>; + +void registerFunctionMultiSearchAnyCaseInsensitiveUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchAnyUTF8.cpp b/dbms/src/Functions/multiSearchAnyUTF8.cpp new file mode 100644 index 00000000000..55f2e449833 --- /dev/null +++ b/dbms/src/Functions/multiSearchAnyUTF8.cpp @@ -0,0 +1,21 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchAnyUTF8 +{ + static constexpr auto name = "multiSearchAnyUTF8"; +}; +using FunctionMultiSearchUTF8 = FunctionsMultiStringSearch, NameMultiSearchAnyUTF8>; + +void registerFunctionMultiSearchAnyUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstIndex.cpp b/dbms/src/Functions/multiSearchFirstIndex.cpp new file mode 100644 index 00000000000..65a25004964 --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstIndex.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstIndexImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstIndex +{ + static constexpr auto name = "multiSearchFirstIndex"; +}; + +using FunctionMultiSearchFirstIndex + = FunctionsMultiStringSearch, NameMultiSearchFirstIndex>; + +void registerFunctionMultiSearchFirstIndex(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstIndexCaseInsensitive.cpp b/dbms/src/Functions/multiSearchFirstIndexCaseInsensitive.cpp new file mode 100644 index 00000000000..bf643f0cf29 --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstIndexCaseInsensitive.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstIndexImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstIndexCaseInsensitive +{ + static constexpr auto name = "multiSearchFirstIndexCaseInsensitive"; +}; + +using FunctionMultiSearchFirstIndexCaseInsensitive + = FunctionsMultiStringSearch, NameMultiSearchFirstIndexCaseInsensitive>; + +void registerFunctionMultiSearchFirstIndexCaseInsensitive(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstIndexCaseInsensitiveUTF8.cpp b/dbms/src/Functions/multiSearchFirstIndexCaseInsensitiveUTF8.cpp new file mode 100644 index 00000000000..005152388ab --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstIndexCaseInsensitiveUTF8.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstIndexImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstIndexCaseInsensitiveUTF8 +{ + static constexpr auto name = "multiSearchFirstIndexCaseInsensitiveUTF8"; +}; + +using FunctionMultiSearchFirstIndexCaseInsensitiveUTF8 + = FunctionsMultiStringSearch, NameMultiSearchFirstIndexCaseInsensitiveUTF8>; + +void registerFunctionMultiSearchFirstIndexCaseInsensitiveUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstIndexUTF8.cpp b/dbms/src/Functions/multiSearchFirstIndexUTF8.cpp new file mode 100644 index 00000000000..1158fda2a63 --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstIndexUTF8.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstIndexImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstIndexUTF8 +{ + static constexpr auto name = "multiSearchFirstIndexUTF8"; +}; + +using FunctionMultiSearchFirstIndexUTF8 + = FunctionsMultiStringSearch, NameMultiSearchFirstIndexUTF8>; + +void registerFunctionMultiSearchFirstIndexUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstPosition.cpp b/dbms/src/Functions/multiSearchFirstPosition.cpp new file mode 100644 index 00000000000..06ac396250e --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstPosition.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstPositionImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstPosition +{ + static constexpr auto name = "multiSearchFirstPosition"; +}; + +using FunctionMultiSearchFirstPosition + = FunctionsMultiStringSearch, NameMultiSearchFirstPosition>; + +void registerFunctionMultiSearchFirstPosition(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstPositionCaseInsensitive.cpp b/dbms/src/Functions/multiSearchFirstPositionCaseInsensitive.cpp new file mode 100644 index 00000000000..1d028ad4513 --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstPositionCaseInsensitive.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstPositionImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstPositionCaseInsensitive +{ + static constexpr auto name = "multiSearchFirstPositionCaseInsensitive"; +}; + +using FunctionMultiSearchFirstPositionCaseInsensitive + = FunctionsMultiStringSearch, NameMultiSearchFirstPositionCaseInsensitive>; + +void registerFunctionMultiSearchFirstPositionCaseInsensitive(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstPositionCaseInsensitiveUTF8.cpp b/dbms/src/Functions/multiSearchFirstPositionCaseInsensitiveUTF8.cpp new file mode 100644 index 00000000000..0b355ddc446 --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstPositionCaseInsensitiveUTF8.cpp @@ -0,0 +1,24 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstPositionImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstPositionCaseInsensitiveUTF8 +{ + static constexpr auto name = "multiSearchFirstPositionCaseInsensitiveUTF8"; +}; + +using FunctionMultiSearchFirstPositionCaseInsensitiveUTF8 = FunctionsMultiStringSearch< + MultiSearchFirstPositionImpl, + NameMultiSearchFirstPositionCaseInsensitiveUTF8>; + +void registerFunctionMultiSearchFirstPositionCaseInsensitiveUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/multiSearchFirstPositionUTF8.cpp b/dbms/src/Functions/multiSearchFirstPositionUTF8.cpp new file mode 100644 index 00000000000..26e16d17e8d --- /dev/null +++ b/dbms/src/Functions/multiSearchFirstPositionUTF8.cpp @@ -0,0 +1,23 @@ +#include "FunctionsMultiStringSearch.h" +#include "FunctionFactory.h" +#include "MultiSearchFirstPositionImpl.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NameMultiSearchFirstPositionUTF8 +{ + static constexpr auto name = "multiSearchFirstPositionUTF8"; +}; + +using FunctionMultiSearchFirstPositionUTF8 + = FunctionsMultiStringSearch, NameMultiSearchFirstPositionUTF8>; + +void registerFunctionMultiSearchFirstPositionUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/position.cpp b/dbms/src/Functions/position.cpp new file mode 100644 index 00000000000..df1405ae94a --- /dev/null +++ b/dbms/src/Functions/position.cpp @@ -0,0 +1,21 @@ +#include "FunctionsStringSearch.h" +#include "FunctionFactory.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NamePosition +{ + static constexpr auto name = "position"; +}; + +using FunctionPosition = FunctionsStringSearch, NamePosition>; + +void registerFunctionPosition(FunctionFactory & factory) +{ + factory.registerFunction(FunctionFactory::CaseInsensitive); + factory.registerAlias("locate", NamePosition::name, FunctionFactory::CaseInsensitive); +} +} diff --git a/dbms/src/Functions/positionCaseInsensitive.cpp b/dbms/src/Functions/positionCaseInsensitive.cpp new file mode 100644 index 00000000000..00721dda212 --- /dev/null +++ b/dbms/src/Functions/positionCaseInsensitive.cpp @@ -0,0 +1,20 @@ +#include "FunctionsStringSearch.h" +#include "FunctionFactory.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NamePositionCaseInsensitive +{ + static constexpr auto name = "positionCaseInsensitive"; +}; + +using FunctionPositionCaseInsensitive = FunctionsStringSearch, NamePositionCaseInsensitive>; + +void registerFunctionPositionCaseInsensitive(FunctionFactory & factory) +{ + factory.registerFunction(); +} +} diff --git a/dbms/src/Functions/positionCaseInsensitiveUTF8.cpp b/dbms/src/Functions/positionCaseInsensitiveUTF8.cpp new file mode 100644 index 00000000000..196a5d67cd2 --- /dev/null +++ b/dbms/src/Functions/positionCaseInsensitiveUTF8.cpp @@ -0,0 +1,22 @@ +#include "FunctionsStringSearch.h" +#include "FunctionFactory.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NamePositionCaseInsensitiveUTF8 +{ + static constexpr auto name = "positionCaseInsensitiveUTF8"; +}; + +using FunctionPositionCaseInsensitiveUTF8 + = FunctionsStringSearch, NamePositionCaseInsensitiveUTF8>; + +void registerFunctionPositionCaseInsensitiveUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/positionUTF8.cpp b/dbms/src/Functions/positionUTF8.cpp new file mode 100644 index 00000000000..944b55005f3 --- /dev/null +++ b/dbms/src/Functions/positionUTF8.cpp @@ -0,0 +1,21 @@ +#include "FunctionsStringSearch.h" +#include "FunctionFactory.h" +#include "PositionImpl.h" + + +namespace DB +{ + +struct NamePositionUTF8 +{ + static constexpr auto name = "positionUTF8"; +}; + +using FunctionPositionUTF8 = FunctionsStringSearch, NamePositionUTF8>; + +void registerFunctionPositionUTF8(FunctionFactory & factory) +{ + factory.registerFunction(); +} + +} diff --git a/dbms/src/Functions/registerFunctionsStringSearch.cpp b/dbms/src/Functions/registerFunctionsStringSearch.cpp new file mode 100644 index 00000000000..e4f89201491 --- /dev/null +++ b/dbms/src/Functions/registerFunctionsStringSearch.cpp @@ -0,0 +1,66 @@ +namespace DB +{ + +class FunctionFactory; + +void registerFunctionPosition(FunctionFactory &); +void registerFunctionPositionUTF8(FunctionFactory &); +void registerFunctionPositionCaseInsensitive(FunctionFactory &); +void registerFunctionPositionCaseInsensitiveUTF8(FunctionFactory &); + +void registerFunctionMultiSearchAny(FunctionFactory &); +void registerFunctionMultiSearchAnyUTF8(FunctionFactory &); +void registerFunctionMultiSearchAnyCaseInsensitive(FunctionFactory &); +void registerFunctionMultiSearchAnyCaseInsensitiveUTF8(FunctionFactory &); + +void registerFunctionMultiSearchFirstIndex(FunctionFactory &); +void registerFunctionMultiSearchFirstIndexUTF8(FunctionFactory &); +void registerFunctionMultiSearchFirstIndexCaseInsensitive(FunctionFactory &); +void registerFunctionMultiSearchFirstIndexCaseInsensitiveUTF8(FunctionFactory &); + +void registerFunctionMultiSearchFirstPosition(FunctionFactory &); +void registerFunctionMultiSearchFirstPositionUTF8(FunctionFactory &); +void registerFunctionMultiSearchFirstPositionCaseInsensitive(FunctionFactory &); +void registerFunctionMultiSearchFirstPositionCaseInsensitiveUTF8(FunctionFactory &); + +void registerFunctionMultiSearchAllPositions(FunctionFactory &); +void registerFunctionMultiSearchAllPositionsUTF8(FunctionFactory &); +void registerFunctionMultiSearchAllPositionsCaseInsensitive(FunctionFactory &); +void registerFunctionMultiSearchAllPositionsCaseInsensitiveUTF8(FunctionFactory &); + +void registerFunctionHasToken(FunctionFactory &); +void registerFunctionHasTokenCaseInsensitive(FunctionFactory &); + + +void registerFunctionsStringSearch(FunctionFactory & factory) +{ + registerFunctionPosition(factory); + registerFunctionPositionUTF8(factory); + registerFunctionPositionCaseInsensitive(factory); + registerFunctionPositionCaseInsensitiveUTF8(factory); + + registerFunctionMultiSearchAny(factory); + registerFunctionMultiSearchAnyUTF8(factory); + registerFunctionMultiSearchAnyCaseInsensitive(factory); + registerFunctionMultiSearchAnyCaseInsensitiveUTF8(factory); + + registerFunctionMultiSearchFirstIndex(factory); + registerFunctionMultiSearchFirstIndexUTF8(factory); + registerFunctionMultiSearchFirstIndexCaseInsensitive(factory); + registerFunctionMultiSearchFirstIndexCaseInsensitiveUTF8(factory); + + registerFunctionMultiSearchFirstPosition(factory); + registerFunctionMultiSearchFirstPositionUTF8(factory); + registerFunctionMultiSearchFirstPositionCaseInsensitive(factory); + registerFunctionMultiSearchFirstPositionCaseInsensitiveUTF8(factory); + + registerFunctionMultiSearchAllPositions(factory); + registerFunctionMultiSearchAllPositionsUTF8(factory); + registerFunctionMultiSearchAllPositionsCaseInsensitive(factory); + registerFunctionMultiSearchAllPositionsCaseInsensitiveUTF8(factory); + + registerFunctionHasToken(factory); + registerFunctionHasTokenCaseInsensitive(factory); +} + +} diff --git a/dbms/src/Functions/visitParamExtractRaw.cpp b/dbms/src/Functions/visitParamExtractRaw.cpp index 5eeb36286a5..e6e89f1c7ba 100644 --- a/dbms/src/Functions/visitParamExtractRaw.cpp +++ b/dbms/src/Functions/visitParamExtractRaw.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include namespace DB diff --git a/dbms/src/Functions/visitParamExtractString.cpp b/dbms/src/Functions/visitParamExtractString.cpp index a6f4b98145d..b633a59807e 100644 --- a/dbms/src/Functions/visitParamExtractString.cpp +++ b/dbms/src/Functions/visitParamExtractString.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include namespace DB diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index 85a2dd2c3f8..d1be66df217 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #include #include diff --git a/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.cpp b/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.cpp index 389d6c825b0..f40e91e7dcd 100644 --- a/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.cpp +++ b/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.cpp @@ -38,6 +38,7 @@ struct NonGlobalTableData const CheckShardsAndTables & checker; const Context & context; + std::vector & renamed_tables; ASTFunction * function = nullptr; ASTTableJoin * table_join = nullptr; @@ -95,10 +96,11 @@ private: String alias = database_and_table->tryGetAlias(); if (alias.empty()) - throw Exception("Distributed table should have an alias when distributed_product_mode set to local.", + throw Exception("Distributed table should have an alias when distributed_product_mode set to local", ErrorCodes::DISTRIBUTED_IN_JOIN_SUBQUERY_DENIED); auto & identifier = database_and_table->as(); + renamed_tables.emplace_back(identifier.clone()); identifier.resetTable(database, table); } else @@ -118,6 +120,7 @@ public: { const CheckShardsAndTables & checker; const Context & context; + std::vector>> & renamed_tables; }; static void visit(ASTPtr & node, Data & data) @@ -148,8 +151,11 @@ private: if (node.name == "in" || node.name == "notIn") { auto & subquery = node.arguments->children.at(1); - NonGlobalTableVisitor::Data table_data{data.checker, data.context, &node, nullptr}; + std::vector renamed; + NonGlobalTableVisitor::Data table_data{data.checker, data.context, renamed, &node, nullptr}; NonGlobalTableVisitor(table_data).visit(subquery); + if (!renamed.empty()) + data.renamed_tables.emplace_back(subquery, std::move(renamed)); } } @@ -163,8 +169,11 @@ private: { if (auto & subquery = node.table_expression->as()->subquery) { - NonGlobalTableVisitor::Data table_data{data.checker, data.context, nullptr, table_join}; + std::vector renamed; + NonGlobalTableVisitor::Data table_data{data.checker, data.context, renamed, nullptr, table_join}; NonGlobalTableVisitor(table_data).visit(subquery); + if (!renamed.empty()) + data.renamed_tables.emplace_back(subquery, std::move(renamed)); } } } @@ -208,7 +217,7 @@ void InJoinSubqueriesPreprocessor::visit(ASTPtr & ast) const return; } - NonGlobalSubqueryVisitor::Data visitor_data{*checker, context}; + NonGlobalSubqueryVisitor::Data visitor_data{*checker, context, renamed_tables}; NonGlobalSubqueryVisitor(visitor_data).visit(ast); } diff --git a/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h b/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h index ff39d812dee..5aa9cfbcadf 100644 --- a/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h +++ b/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h @@ -35,6 +35,8 @@ class Context; class InJoinSubqueriesPreprocessor { public: + using SubqueryTables = std::vector>>; /// {subquery, renamed_tables} + struct CheckShardsAndTables { using Ptr = std::unique_ptr; @@ -45,8 +47,10 @@ public: virtual ~CheckShardsAndTables() {} }; - InJoinSubqueriesPreprocessor(const Context & context_, CheckShardsAndTables::Ptr _checker = std::make_unique()) + InJoinSubqueriesPreprocessor(const Context & context_, SubqueryTables & renamed_tables_, + CheckShardsAndTables::Ptr _checker = std::make_unique()) : context(context_) + , renamed_tables(renamed_tables_) , checker(std::move(_checker)) {} @@ -54,6 +58,7 @@ public: private: const Context & context; + SubqueryTables & renamed_tables; CheckShardsAndTables::Ptr checker; }; diff --git a/dbms/src/Interpreters/InterpreterAlterQuery.cpp b/dbms/src/Interpreters/InterpreterAlterQuery.cpp index 315527765ef..ddf1e27af87 100644 --- a/dbms/src/Interpreters/InterpreterAlterQuery.cpp +++ b/dbms/src/Interpreters/InterpreterAlterQuery.cpp @@ -82,7 +82,7 @@ BlockIO InterpreterAlterQuery::execute() if (!mutation_commands.empty()) { - auto table_lock_holder = table->lockStructureForShare(false /* because mutation is executed asyncronously */, context.getCurrentQueryId()); + auto table_lock_holder = table->lockStructureForShare(context.getCurrentQueryId()); MutationsInterpreter(table, mutation_commands, context, false).validate(table_lock_holder); table->mutate(mutation_commands, context); } @@ -101,7 +101,7 @@ BlockIO InterpreterAlterQuery::execute() switch (command.type) { case LiveViewCommand::REFRESH: - live_view->refresh(context); + live_view->refresh(); break; } } @@ -109,7 +109,7 @@ BlockIO InterpreterAlterQuery::execute() if (!alter_commands.empty()) { - auto table_lock_holder = table->lockAlterIntention(context.getCurrentQueryId()); + auto table_lock_holder = table->lockAlterIntention(); StorageInMemoryMetadata metadata = table->getInMemoryMetadata(); alter_commands.validate(metadata, context); alter_commands.prepare(metadata); diff --git a/dbms/src/Interpreters/InterpreterCreateQuery.cpp b/dbms/src/Interpreters/InterpreterCreateQuery.cpp index d81fff61f83..1f85ebc2a20 100644 --- a/dbms/src/Interpreters/InterpreterCreateQuery.cpp +++ b/dbms/src/Interpreters/InterpreterCreateQuery.cpp @@ -411,7 +411,7 @@ InterpreterCreateQuery::TableProperties InterpreterCreateQuery::setProperties(AS StoragePtr as_storage = DatabaseCatalog::instance().getTable({as_database_name, create.as_table}); /// as_storage->getColumns() and setEngine(...) must be called under structure lock of other_table for CREATE ... AS other_table. - as_storage_lock = as_storage->lockStructureForShare(false, context.getCurrentQueryId()); + as_storage_lock = as_storage->lockStructureForShare(context.getCurrentQueryId()); properties.columns = as_storage->getColumns(); /// Secondary indices make sense only for MergeTree family of storage engines. diff --git a/dbms/src/Interpreters/InterpreterDescribeQuery.cpp b/dbms/src/Interpreters/InterpreterDescribeQuery.cpp index 1353c01ebf6..cf7bb0458e9 100644 --- a/dbms/src/Interpreters/InterpreterDescribeQuery.cpp +++ b/dbms/src/Interpreters/InterpreterDescribeQuery.cpp @@ -89,7 +89,7 @@ BlockInputStreamPtr InterpreterDescribeQuery::executeImpl() table = DatabaseCatalog::instance().getTable(table_id); } - auto table_lock = table->lockStructureForShare(false, context.getInitialQueryId()); + auto table_lock = table->lockStructureForShare(context.getInitialQueryId()); columns = table->getColumns(); } diff --git a/dbms/src/Interpreters/InterpreterInsertQuery.cpp b/dbms/src/Interpreters/InterpreterInsertQuery.cpp index b4280ee20e6..f12ac68cede 100644 --- a/dbms/src/Interpreters/InterpreterInsertQuery.cpp +++ b/dbms/src/Interpreters/InterpreterInsertQuery.cpp @@ -109,7 +109,7 @@ BlockIO InterpreterInsertQuery::execute() BlockIO res; StoragePtr table = getTable(query); - auto table_lock = table->lockStructureForShare(true, context.getInitialQueryId()); + auto table_lock = table->lockStructureForShare(context.getInitialQueryId()); auto query_sample_block = getSampleBlock(query, table); if (!query.table_function) diff --git a/dbms/src/Interpreters/InterpreterSelectQuery.cpp b/dbms/src/Interpreters/InterpreterSelectQuery.cpp index 4fe83afa48d..6a6ee102e70 100644 --- a/dbms/src/Interpreters/InterpreterSelectQuery.cpp +++ b/dbms/src/Interpreters/InterpreterSelectQuery.cpp @@ -255,7 +255,7 @@ InterpreterSelectQuery::InterpreterSelectQuery( if (storage) { - table_lock = storage->lockStructureForShare(false, context->getInitialQueryId()); + table_lock = storage->lockStructureForShare(context->getInitialQueryId()); table_id = storage->getStorageID(); } @@ -301,6 +301,8 @@ InterpreterSelectQuery::InterpreterSelectQuery( source_header = interpreter_subquery->getSampleBlock(); } + joined_tables.rewriteDistributedInAndJoins(query_ptr); + max_streams = settings.max_threads; ASTSelectQuery & query = getSelectQuery(); @@ -508,7 +510,7 @@ Block InterpreterSelectQuery::getSampleBlockImpl(bool try_move_to_prewhere) } if (storage && !options.only_analyze) - from_stage = storage->getQueryProcessingStage(*context); + from_stage = storage->getQueryProcessingStage(*context, query_ptr); /// Do I need to perform the first part of the pipeline - running on remote servers during distributed processing. bool first_stage = from_stage < QueryProcessingStage::WithMergeableState @@ -1062,7 +1064,7 @@ void InterpreterSelectQuery::executeFetchColumns( auto check_trivial_count_query = [&]() -> std::optional { if (!settings.optimize_trivial_count_query || !syntax_analyzer_result->maybe_optimize_trivial_count || !storage - || query.sampleSize() || query.sampleOffset() || query.final() || query.prewhere() || query.where() + || query.sampleSize() || query.sampleOffset() || query.final() || query.prewhere() || query.where() || query.groupBy() || !query_analyzer->hasAggregation() || processing_stage != QueryProcessingStage::FetchColumns) return {}; diff --git a/dbms/src/Interpreters/JoinedTables.cpp b/dbms/src/Interpreters/JoinedTables.cpp index beec338f9bf..48e763ffb19 100644 --- a/dbms/src/Interpreters/JoinedTables.cpp +++ b/dbms/src/Interpreters/JoinedTables.cpp @@ -1,12 +1,18 @@ #include #include #include +#include +#include +#include #include #include #include #include #include +#include #include +#include +#include namespace DB { @@ -14,6 +20,7 @@ namespace DB namespace ErrorCodes { extern const int ALIAS_REQUIRED; + extern const int AMBIGUOUS_COLUMN_NAME; } namespace @@ -32,6 +39,71 @@ void checkTablesWithColumns(const std::vector & tables_with_columns, const Co } } +class RenameQualifiedIdentifiersMatcher +{ +public: + using Data = const std::vector; + + static void visit(ASTPtr & ast, Data & data) + { + if (auto * t = ast->as()) + visit(*t, ast, data); + if (auto * node = ast->as()) + visit(*node, ast, data); + } + + static bool needChildVisit(ASTPtr & node, const ASTPtr & child) + { + if (node->as() || + node->as() || + child->as()) + return false; // NOLINT + return true; + } + +private: + static void visit(ASTIdentifier & identifier, ASTPtr &, Data & data) + { + if (identifier.isShort()) + return; + + bool rewritten = false; + for (auto & table : data) + { + /// Table has an alias. We do not need to rewrite qualified names with table alias (match == ColumnMatch::TableName). + auto match = IdentifierSemantic::canReferColumnToTable(identifier, table); + if (match == IdentifierSemantic::ColumnMatch::AliasedTableName || + match == IdentifierSemantic::ColumnMatch::DbAndTable) + { + if (rewritten) + throw Exception("Failed to rewrite distributed table names. Ambiguous column '" + identifier.name + "'", + ErrorCodes::AMBIGUOUS_COLUMN_NAME); + /// Table has an alias. So we set a new name qualified by table alias. + IdentifierSemantic::setColumnLongName(identifier, table); + rewritten = true; + } + } + } + + static void visit(const ASTQualifiedAsterisk & node, const ASTPtr &, Data & data) + { + ASTIdentifier & identifier = *node.children[0]->as(); + bool rewritten = false; + for (auto & table : data) + { + if (identifier.name == table.table) + { + if (rewritten) + throw Exception("Failed to rewrite distributed table. Ambiguous column '" + identifier.name + "'", + ErrorCodes::AMBIGUOUS_COLUMN_NAME); + identifier.setShortName(table.alias); + rewritten = true; + } + } + } +}; +using RenameQualifiedIdentifiersVisitor = InDepthNodeVisitor; + } JoinedTables::JoinedTables(Context && context_, const ASTSelectQuery & select_query) @@ -114,4 +186,27 @@ void JoinedTables::makeFakeTable(StoragePtr storage, const Block & source_header tables_with_columns.emplace_back(DatabaseAndTableWithAlias{}, source_header.getNamesAndTypesList()); } +void JoinedTables::rewriteDistributedInAndJoins(ASTPtr & query) +{ + /// Rewrite IN and/or JOIN for distributed tables according to distributed_product_mode setting. + InJoinSubqueriesPreprocessor::SubqueryTables renamed_tables; + InJoinSubqueriesPreprocessor(context, renamed_tables).visit(query); + + String database; + if (!renamed_tables.empty()) + database = context.getCurrentDatabase(); + + for (auto & [subquery, ast_tables] : renamed_tables) + { + std::vector renamed; + renamed.reserve(ast_tables.size()); + for (auto & ast : ast_tables) + renamed.emplace_back(DatabaseAndTableWithAlias(*ast->as(), database)); + + /// Change qualified column names in distributed subqueries using table aliases. + RenameQualifiedIdentifiersVisitor::Data data(renamed); + RenameQualifiedIdentifiersVisitor(data).visit(subquery); + } +} + } diff --git a/dbms/src/Interpreters/JoinedTables.h b/dbms/src/Interpreters/JoinedTables.h index f1940366ef5..66b3c8de609 100644 --- a/dbms/src/Interpreters/JoinedTables.h +++ b/dbms/src/Interpreters/JoinedTables.h @@ -37,6 +37,8 @@ public: const StorageID & leftTableID() const { return table_id; } + void rewriteDistributedInAndJoins(ASTPtr & query); + std::unique_ptr makeLeftTableSubquery(const SelectQueryOptions & select_options); private: diff --git a/dbms/src/Interpreters/MutationsInterpreter.cpp b/dbms/src/Interpreters/MutationsInterpreter.cpp index 311165066c9..669b72c6317 100644 --- a/dbms/src/Interpreters/MutationsInterpreter.cpp +++ b/dbms/src/Interpreters/MutationsInterpreter.cpp @@ -558,6 +558,10 @@ ASTPtr MutationsInterpreter::prepareInterpreterSelectQuery(std::vector & all_asts->children.push_back(std::make_shared(column)); auto syntax_result = SyntaxAnalyzer(context).analyze(all_asts, all_columns); + if (context.hasQueryContext()) + for (const auto & it : syntax_result->getScalars()) + context.getQueryContext().addScalar(it.first, it.second); + stage.analyzer = std::make_unique(all_asts, syntax_result, context); ExpressionActionsChain & actions_chain = stage.expressions_chain; diff --git a/dbms/src/Interpreters/MutationsInterpreter.h b/dbms/src/Interpreters/MutationsInterpreter.h index a36430e201b..9b12ce79e91 100644 --- a/dbms/src/Interpreters/MutationsInterpreter.h +++ b/dbms/src/Interpreters/MutationsInterpreter.h @@ -47,7 +47,7 @@ private: StoragePtr storage; MutationCommands commands; - const Context & context; + Context context; bool can_execute; ASTPtr mutation_ast; diff --git a/dbms/src/Interpreters/SyntaxAnalyzer.cpp b/dbms/src/Interpreters/SyntaxAnalyzer.cpp index 7338487c5e8..f93d11fa1da 100644 --- a/dbms/src/Interpreters/SyntaxAnalyzer.cpp +++ b/dbms/src/Interpreters/SyntaxAnalyzer.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -819,9 +818,6 @@ SyntaxAnalyzerResultPtr SyntaxAnalyzer::analyzeSelect( translateQualifiedNames(query, *select_query, source_columns_set, tables_with_column_names); - /// Rewrite IN and/or JOIN for distributed tables according to distributed_product_mode setting. - InJoinSubqueriesPreprocessor(context).visit(query); - /// Optimizes logical expressions. LogicalExpressionsOptimizer(select_query, settings.optimize_min_equality_disjunction_chain_length.value).perform(); diff --git a/dbms/src/Interpreters/SystemLog.cpp b/dbms/src/Interpreters/SystemLog.cpp index e307394e361..a78342f8b17 100644 --- a/dbms/src/Interpreters/SystemLog.cpp +++ b/dbms/src/Interpreters/SystemLog.cpp @@ -57,7 +57,8 @@ std::shared_ptr createSystemLog( else { String partition_by = config.getString(config_prefix + ".partition_by", "toYYYYMM(event_date)"); - engine = "ENGINE = MergeTree PARTITION BY (" + partition_by + ") ORDER BY (event_date, event_time) SETTINGS index_granularity = 1024"; + engine = "ENGINE = MergeTree PARTITION BY (" + partition_by + ") ORDER BY (event_date, event_time)" + "SETTINGS min_bytes_for_wide_part = '10M'"; /// Use polymorphic parts for log tables by default } size_t flush_interval_milliseconds = config.getUInt64(config_prefix + ".flush_interval_milliseconds", DEFAULT_SYSTEM_LOG_FLUSH_INTERVAL_MILLISECONDS); diff --git a/dbms/src/Interpreters/evaluateConstantExpression.cpp b/dbms/src/Interpreters/evaluateConstantExpression.cpp index 2372c247072..417dccadb3d 100644 --- a/dbms/src/Interpreters/evaluateConstantExpression.cpp +++ b/dbms/src/Interpreters/evaluateConstantExpression.cpp @@ -101,9 +101,9 @@ namespace using Conjunction = ColumnsWithTypeAndName; using Disjunction = std::vector; - Disjunction analyzeEquals(const ASTIdentifier * identifier, const ASTLiteral * literal, const ExpressionActionsPtr & expr) + Disjunction analyzeEquals(const ASTIdentifier * identifier, const Field & value, const ExpressionActionsPtr & expr) { - if (!identifier || !literal) + if (!identifier || value.isNull()) { return {}; } @@ -116,10 +116,10 @@ namespace if (name == identifier->name) { ColumnWithTypeAndName column; - Field value = convertFieldToType(literal->value, *type); - if (!literal->value.isNull() && value.isNull()) + Field converted = convertFieldToType(value, *type); + if (converted.isNull()) return {}; - column.column = type->createColumnConst(1, value); + column.column = type->createColumnConst(1, converted); column.name = name; column.type = type; return {{std::move(column)}}; @@ -129,6 +129,16 @@ namespace return {}; } + Disjunction analyzeEquals(const ASTIdentifier * identifier, const ASTLiteral * literal, const ExpressionActionsPtr & expr) + { + if (!identifier || !literal) + { + return {}; + } + + return analyzeEquals(identifier, literal->value, expr); + } + Disjunction andDNF(const Disjunction & left, const Disjunction & right) { if (left.empty()) @@ -174,33 +184,44 @@ namespace const auto * left = fn->arguments->children.front().get(); const auto * right = fn->arguments->children.back().get(); const auto * identifier = left->as(); - const auto * inner_fn = right->as(); - - if (!inner_fn) - { - return {}; - } - - const auto * tuple = inner_fn->children.front()->as(); - - if (!tuple) - { - return {}; - } Disjunction result; - for (const auto & child : tuple->children) + if (const auto * tuple_func = right->as(); tuple_func && tuple_func->name == "tuple") { - const auto * literal = child->as(); - const auto dnf = analyzeEquals(identifier, literal, expr); - - if (dnf.empty()) + const auto * tuple_elements = tuple_func->children.front()->as(); + for (const auto & child : tuple_elements->children) { - return {}; - } + const auto * literal = child->as(); + const auto dnf = analyzeEquals(identifier, literal, expr); - result.insert(result.end(), dnf.begin(), dnf.end()); + if (dnf.empty()) + { + return {}; + } + + result.insert(result.end(), dnf.begin(), dnf.end()); + } + } + else if (const auto * tuple_literal = right->as(); + tuple_literal && tuple_literal->value.getType() == Field::Types::Tuple) + { + const auto & tuple = tuple_literal->value.get(); + for (const auto & child : tuple) + { + const auto dnf = analyzeEquals(identifier, child, expr); + + if (dnf.empty()) + { + return {}; + } + + result.insert(result.end(), dnf.begin(), dnf.end()); + } + } + else + { + return {}; } return result; diff --git a/dbms/src/Interpreters/executeQuery.cpp b/dbms/src/Interpreters/executeQuery.cpp index 4adbbf85e42..c9c66832f08 100644 --- a/dbms/src/Interpreters/executeQuery.cpp +++ b/dbms/src/Interpreters/executeQuery.cpp @@ -41,6 +41,7 @@ #include #include + namespace ProfileEvents { extern const Event QueryMaskingRulesMatch; diff --git a/dbms/src/Interpreters/executeQuery.h b/dbms/src/Interpreters/executeQuery.h index 64d055486aa..b6cb56b9e24 100644 --- a/dbms/src/Interpreters/executeQuery.h +++ b/dbms/src/Interpreters/executeQuery.h @@ -38,7 +38,7 @@ void executeQuery( /// Correctly formatting the results (according to INTO OUTFILE and FORMAT sections) /// must be done separately. BlockIO executeQuery( - const String & query, /// Query text without INSERT data. The latter must be written to BlockIO::out. + const String & query, /// Query text without INSERT data. The latter must be written to BlockIO::out. Context & context, /// DB, tables, data types, storage engines, functions, aggregate functions... bool internal = false, /// If true, this query is caused by another query and thus needn't be registered in the ProcessList. QueryProcessingStage::Enum stage = QueryProcessingStage::Complete, /// To which stage the query must be executed. @@ -48,7 +48,7 @@ BlockIO executeQuery( QueryPipeline executeQueryWithProcessors( - const String & query, /// Query text without INSERT data. The latter must be written to BlockIO::out. + const String & query, /// Query text without INSERT data. The latter must be written to BlockIO::out. Context & context, /// DB, tables, data types, storage engines, functions, aggregate functions... bool internal = false, /// If true, this query is caused by another query and thus needn't be registered in the ProcessList. QueryProcessingStage::Enum stage = QueryProcessingStage::Complete, /// To which stage the query must be executed. diff --git a/dbms/src/Interpreters/tests/in_join_subqueries_preprocessor.cpp b/dbms/src/Interpreters/tests/in_join_subqueries_preprocessor.cpp index 9a6d7ca4162..9a17f03f32a 100644 --- a/dbms/src/Interpreters/tests/in_join_subqueries_preprocessor.cpp +++ b/dbms/src/Interpreters/tests/in_join_subqueries_preprocessor.cpp @@ -1181,7 +1181,8 @@ TestResult check(const TestEntry & entry) try { - DB::InJoinSubqueriesPreprocessor(context, std::make_unique()).visit(ast_input); + DB::InJoinSubqueriesPreprocessor::SubqueryTables renamed; + DB::InJoinSubqueriesPreprocessor(context, renamed, std::make_unique()).visit(ast_input); } catch (const DB::Exception & ex) { diff --git a/dbms/src/Parsers/ASTLiteral.cpp b/dbms/src/Parsers/ASTLiteral.cpp index 04504fb3594..92d57687426 100644 --- a/dbms/src/Parsers/ASTLiteral.cpp +++ b/dbms/src/Parsers/ASTLiteral.cpp @@ -16,17 +16,21 @@ void ASTLiteral::updateTreeHashImpl(SipHash & hash_state) const void ASTLiteral::appendColumnNameImpl(WriteBuffer & ostr) const { - /// Special case for very large arrays. Instead of listing all elements, will use hash of them. + /// 100 - just arbitrary value. + constexpr auto min_elements_for_hashing = 100; + + /// Special case for very large arrays and tuples. Instead of listing all elements, will use hash of them. /// (Otherwise column name will be too long, that will lead to significant slowdown of expression analysis.) - if (value.getType() == Field::Types::Array - && value.get().size() > 100) /// 100 - just arbitrary value. + auto type = value.getType(); + if ((type == Field::Types::Array && value.get().size() > min_elements_for_hashing) + || (type == Field::Types::Tuple && value.get().size() > min_elements_for_hashing)) { SipHash hash; applyVisitor(FieldVisitorHash(hash), value); UInt64 low, high; hash.get128(low, high); - writeCString("__array_", ostr); + writeCString(type == Field::Types::Array ? "__array_" : "__tuple_", ostr); writeText(low, ostr); ostr.write('_'); writeText(high, ostr); diff --git a/dbms/src/Parsers/ExpressionElementParsers.cpp b/dbms/src/Parsers/ExpressionElementParsers.cpp index 111ada2411e..f79193b5a28 100644 --- a/dbms/src/Parsers/ExpressionElementParsers.cpp +++ b/dbms/src/Parsers/ExpressionElementParsers.cpp @@ -1026,27 +1026,31 @@ bool ParserStringLiteral::parseImpl(Pos & pos, ASTPtr & node, Expected & expecte return true; } - -bool ParserArrayOfLiterals::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) +template +bool ParserCollectionOfLiterals::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { - if (pos->type != TokenType::OpeningSquareBracket) + if (pos->type != opening_bracket) return false; Pos literal_begin = pos; - Array arr; - + Collection arr; ParserLiteral literal_p; ++pos; - while (pos.isValid()) { if (!arr.empty()) { - if (pos->type == TokenType::ClosingSquareBracket) + if (pos->type == closing_bracket) { - auto literal = std::make_shared(arr); + std::shared_ptr literal; + + /// Parse one-element tuples (e.g. (1)) later as single values for backward compatibility. + if (std::is_same_v && arr.size() == 1) + return false; + + literal = std::make_shared(arr); literal->begin = literal_begin; literal->end = ++pos; node = literal; @@ -1058,7 +1062,8 @@ bool ParserArrayOfLiterals::parseImpl(Pos & pos, ASTPtr & node, Expected & expec } else { - expected.add(pos, "comma or closing square bracket"); + String message = String("comma or ") + getTokenName(closing_bracket); + expected.add(pos, message.c_str()); return false; } } @@ -1070,7 +1075,7 @@ bool ParserArrayOfLiterals::parseImpl(Pos & pos, ASTPtr & node, Expected & expec arr.push_back(literal_node->as().value); } - expected.add(pos, "closing square bracket"); + expected.add(pos, getTokenName(closing_bracket)); return false; } @@ -1271,6 +1276,7 @@ bool ParserSubstitution::parseImpl(Pos & pos, ASTPtr & node, Expected & expected bool ParserExpressionElement::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { return ParserSubquery().parse(pos, node, expected) + || ParserTupleOfLiterals().parse(pos, node, expected) || ParserParenthesisExpression().parse(pos, node, expected) || ParserArrayOfLiterals().parse(pos, node, expected) || ParserArray().parse(pos, node, expected) diff --git a/dbms/src/Parsers/ExpressionElementParsers.h b/dbms/src/Parsers/ExpressionElementParsers.h index 9cdfea5d1a4..34680012808 100644 --- a/dbms/src/Parsers/ExpressionElementParsers.h +++ b/dbms/src/Parsers/ExpressionElementParsers.h @@ -1,5 +1,6 @@ #pragma once +#include #include @@ -223,17 +224,50 @@ protected: }; -/** An array of literals. - * Arrays can also be parsed as an application of [] operator. - * But parsing the whole array as a whole constant seriously speeds up the analysis of expressions in the case of very large arrays. - * We try to parse the array as an array of literals first (fast path), - * and if it did not work out (when the array consists of complex expressions) - parse as an application of [] operator (slow path). +/** An array or tuple of literals. + * Arrays can also be parsed as an application of [] operator and tuples as an application of 'tuple' function. + * But parsing the whole array/tuple as a whole constant seriously speeds up the analysis of expressions in the case of very large collection. + * We try to parse the array or tuple as a collection of literals first (fast path), + * and if it did not work out (when the collection consists of complex expressions) - + * parse as an application of [] operator or 'tuple' function (slow path). */ +template +class ParserCollectionOfLiterals : public IParserBase +{ +public: + ParserCollectionOfLiterals(TokenType opening_bracket_, TokenType closing_bracket_) + : opening_bracket(opening_bracket_), closing_bracket(closing_bracket_) {} +protected: + const char * getName() const override { return "collection of literals"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; +private: + TokenType opening_bracket; + TokenType closing_bracket; +}; + +/// A tuple of literals with same type. +class ParserTupleOfLiterals : public IParserBase +{ +public: + ParserCollectionOfLiterals tuple_parser{TokenType::OpeningRoundBracket, TokenType::ClosingRoundBracket}; +protected: + const char * getName() const override { return "tuple"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override + { + return tuple_parser.parse(pos, node, expected); + } +}; + class ParserArrayOfLiterals : public IParserBase { +public: + ParserCollectionOfLiterals array_parser{TokenType::OpeningSquareBracket, TokenType::ClosingSquareBracket}; protected: const char * getName() const override { return "array"; } - bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override + { + return array_parser.parse(pos, node, expected); + } }; diff --git a/dbms/src/Parsers/ParserCreateUserQuery.cpp b/dbms/src/Parsers/ParserCreateUserQuery.cpp index a7cc6550644..57f50c34116 100644 --- a/dbms/src/Parsers/ParserCreateUserQuery.cpp +++ b/dbms/src/Parsers/ParserCreateUserQuery.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -168,34 +169,38 @@ namespace else if (ParserKeyword{"NAME REGEXP"}.ignore(pos, expected)) { ASTPtr ast; - if (!ParserStringLiteral{}.parse(pos, ast, expected)) + if (!ParserList{std::make_unique(), std::make_unique(TokenType::Comma), false}.parse(pos, ast, expected)) return false; - new_hosts.addNameRegexp(ast->as().value.safeGet()); + for (const auto & name_regexp_ast : ast->children) + new_hosts.addNameRegexp(name_regexp_ast->as().value.safeGet()); } else if (ParserKeyword{"NAME"}.ignore(pos, expected)) { ASTPtr ast; - if (!ParserStringLiteral{}.parse(pos, ast, expected)) + if (!ParserList{std::make_unique(), std::make_unique(TokenType::Comma), false}.parse(pos, ast, expected)) return false; - new_hosts.addName(ast->as().value.safeGet()); + for (const auto & name_ast : ast->children) + new_hosts.addName(name_ast->as().value.safeGet()); } else if (ParserKeyword{"IP"}.ignore(pos, expected)) { ASTPtr ast; - if (!ParserStringLiteral{}.parse(pos, ast, expected)) + if (!ParserList{std::make_unique(), std::make_unique(TokenType::Comma), false}.parse(pos, ast, expected)) return false; - new_hosts.addSubnet(ast->as().value.safeGet()); + for (const auto & subnet_ast : ast->children) + new_hosts.addSubnet(subnet_ast->as().value.safeGet()); } else if (ParserKeyword{"LIKE"}.ignore(pos, expected)) { ASTPtr ast; - if (!ParserStringLiteral{}.parse(pos, ast, expected)) + if (!ParserList{std::make_unique(), std::make_unique(TokenType::Comma), false}.parse(pos, ast, expected)) return false; - new_hosts.addLikePattern(ast->as().value.safeGet()); + for (const auto & pattern_ast : ast->children) + new_hosts.addLikePattern(pattern_ast->as().value.safeGet()); } else return false; diff --git a/dbms/src/Parsers/ParserPartition.cpp b/dbms/src/Parsers/ParserPartition.cpp index 511db9a53b3..d5ba5739ab1 100644 --- a/dbms/src/Parsers/ParserPartition.cpp +++ b/dbms/src/Parsers/ParserPartition.cpp @@ -38,14 +38,34 @@ bool ParserPartition::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) String fields_str; const auto * tuple_ast = value->as(); + bool surrounded_by_parens = false; if (tuple_ast && tuple_ast->name == "tuple") { + surrounded_by_parens = true; const auto * arguments_ast = tuple_ast->arguments->as(); if (arguments_ast) fields_count = arguments_ast->children.size(); else fields_count = 0; + } + else if (auto literal = value->as()) + { + if (literal->value.getType() == Field::Types::Tuple) + { + surrounded_by_parens = true; + fields_count = literal->value.get().size(); + } + else + { + fields_count = 1; + fields_str = String(begin->begin, pos->begin - begin->begin); + } + } + else + return false; + if (surrounded_by_parens) + { Pos left_paren = begin; Pos right_paren = pos; @@ -61,13 +81,6 @@ bool ParserPartition::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) fields_str = String(left_paren->end, right_paren->begin - left_paren->end); } - else if (value->as()) - { - fields_count = 1; - fields_str = String(begin->begin, pos->begin - begin->begin); - } - else - return false; partition->value = value; partition->children.push_back(value); diff --git a/dbms/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp b/dbms/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp index 42f3eb3f94e..99369ffa26b 100644 --- a/dbms/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp +++ b/dbms/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp @@ -30,13 +30,27 @@ namespace ErrorCodes extern const int SYNTAX_ERROR; } + struct SpecialParserType { - bool is_array = false; - bool is_nullable = false; - Field::Types::Which nested_type = Field::Types::Which::String; + SpecialParserType() = default; + explicit SpecialParserType(Field::Types::Which main_type_) : main_type(main_type_) {} - bool useDefaultParser() const { return nested_type == Field::Types::Which::String; } + Field::Types::Which main_type = Field::Types::String; + bool is_nullable = false; + bool is_array = false; + bool is_tuple = false; + /// Type and nullability + std::vector> nested_types; + + bool useDefaultParser() const + { + return main_type == Field::Types::String || (!nested_types.empty() + && std::all_of( + nested_types.begin(), + nested_types.end(), + [](const auto & type) { return type.first == Field::Types::String; })); + } }; struct LiteralInfo @@ -54,6 +68,54 @@ struct LiteralInfo SpecialParserType special_parser; }; +static void fillLiteralInfo(DataTypes & nested_types, LiteralInfo & info) +{ + size_t elements_num = nested_types.size(); + info.special_parser.nested_types.reserve(elements_num); + + for (auto nested_type : nested_types) + { + /// It can be Array(Nullable(nested_type)) or Tuple(..., Nullable(nested_type), ...) + bool is_nullable = false; + if (auto nullable = dynamic_cast(nested_type.get())) + { + nested_type = nullable->getNestedType(); + is_nullable = true; + } + + WhichDataType type_info{nested_type}; + Field::Types::Which field_type; + + /// Promote integers to 64 bit types + if (type_info.isNativeUInt()) + { + nested_type = std::make_shared(); + field_type = Field::Types::UInt64; + } + else if (type_info.isNativeInt()) + { + nested_type = std::make_shared(); + field_type = Field::Types::Int64; + } + else if (type_info.isFloat64()) + { + field_type = Field::Types::Float64; + } + else if (type_info.isString()) + { + field_type = Field::Types::String; + } + else + throw Exception("Unexpected literal type inside Array: " + nested_type->getName() + ". It's a bug", + ErrorCodes::LOGICAL_ERROR); + + if (is_nullable) + nested_type = std::make_shared(nested_type); + + info.special_parser.nested_types.emplace_back(field_type, is_nullable); + } +} + /// Extracts ASTLiterals from expression, replaces them with ASTIdentifiers where needed /// and deduces data types for dummy columns by field type of literal class ReplaceLiteralsVisitor @@ -137,7 +199,7 @@ private: /// We have to use ParserNumber instead of type->deserializeAsTextQuoted() for arithmetic types /// to check actual type of literal and avoid possible overflow and precision issues. - info.special_parser = SpecialParserType{false, false, field_type}; + info.special_parser = SpecialParserType(field_type); /// Do not use 8, 16 and 32 bit types, so template will match all integers if (field_type == Field::Types::UInt64) @@ -152,47 +214,17 @@ private: { info.special_parser.is_array = true; info.type = applyVisitor(FieldToDataType(), info.literal->value); - auto nested_type = assert_cast(*info.type).getNestedType(); - - /// It can be Array(Nullable(nested_type)) - bool array_of_nullable = false; - if (auto nullable = dynamic_cast(nested_type.get())) - { - nested_type = nullable->getNestedType(); - array_of_nullable = true; - } - - WhichDataType type_info{nested_type}; - /// Promote integers to 64 bit types - if (type_info.isNativeUInt()) - { - nested_type = std::make_shared(); - info.special_parser.nested_type = Field::Types::UInt64; - } - else if (type_info.isNativeInt()) - { - nested_type = std::make_shared(); - info.special_parser.nested_type = Field::Types::Int64; - } - else if (type_info.isFloat64()) - { - info.special_parser.nested_type = Field::Types::Float64; - } - else if (type_info.isString()) - { - info.special_parser.nested_type = Field::Types::String; - } - else - throw Exception("Unexpected literal type inside Array: " + nested_type->getName() + ". It's a bug", - ErrorCodes::LOGICAL_ERROR); - - if (array_of_nullable) - { - nested_type = std::make_shared(nested_type); - info.special_parser.is_nullable = true; - } - - info.type = std::make_shared(nested_type); + DataTypes nested_types = { assert_cast(*info.type).getNestedType() }; + fillLiteralInfo(nested_types, info); + info.type = std::make_shared(nested_types[0]); + } + else if (field_type == Field::Types::Tuple) + { + info.special_parser.is_tuple = true; + info.type = applyVisitor(FieldToDataType(), info.literal->value); + auto nested_types = assert_cast(*info.type).getElements(); + fillLiteralInfo(nested_types, info); + info.type = std::make_shared(nested_types); } else throw Exception(String("Unexpected literal type ") + info.literal->value.getTypeName() + ". It's a bug", @@ -404,36 +436,50 @@ bool ConstantExpressionTemplate::parseLiteralAndAssertType(ReadBuffer & istr, co /// If literal does not fit entirely in the buffer, parsing error will happen. /// However, it's possible to deduce new template (or use template from cache) after error like it was template mismatch. - if (type_info.is_array) + if (type_info.is_array || type_info.is_tuple) { /// TODO faster way to check types without using Parsers ParserArrayOfLiterals parser_array; + ParserTupleOfLiterals parser_tuple; + Tokens tokens_number(istr.position(), istr.buffer().end()); IParser::Pos iterator(tokens_number, settings.max_parser_depth); Expected expected; ASTPtr ast; - - if (!parser_array.parse(iterator, ast, expected)) + if (!parser_array.parse(iterator, ast, expected) && !parser_tuple.parse(iterator, ast, expected)) return false; + istr.position() = const_cast(iterator->begin); - const Field & array = ast->as().value; - auto array_type = applyVisitor(FieldToDataType(), array); - auto nested_type = assert_cast(*array_type).getNestedType(); - if (type_info.is_nullable) - if (auto nullable = dynamic_cast(nested_type.get())) - nested_type = nullable->getNestedType(); + const Field & collection = ast->as().value; + auto collection_type = applyVisitor(FieldToDataType(), collection); - WhichDataType nested_type_info(nested_type); - if ((nested_type_info.isNativeUInt() && type_info.nested_type == Type::UInt64) || - (nested_type_info.isNativeInt() && type_info.nested_type == Type::Int64) || - (nested_type_info.isFloat64() && type_info.nested_type == Type::Float64)) + DataTypes nested_types; + if (type_info.is_array) + nested_types = { assert_cast(*collection_type).getNestedType() }; + else + nested_types = assert_cast(*collection_type).getElements(); + + for (size_t i = 0; i < nested_types.size(); ++i) { - Field array_same_types = convertFieldToType(array, *complex_type, nullptr); - columns[column_idx]->insert(array_same_types); - return true; + const auto & [nested_field_type, is_nullable] = type_info.nested_types[i]; + if (is_nullable) + if (auto nullable = dynamic_cast(nested_types[i].get())) + nested_types[i] = nullable->getNestedType(); + + WhichDataType nested_type_info(nested_types[i]); + bool are_types_compatible = + (nested_type_info.isNativeUInt() && nested_field_type == Type::UInt64) || + (nested_type_info.isNativeInt() && nested_field_type == Type::Int64) || + (nested_type_info.isFloat64() && nested_field_type == Type::Float64); + + if (!are_types_compatible) + return false; } - return false; + + Field array_same_types = convertFieldToType(collection, *complex_type, nullptr); + columns[column_idx]->insert(array_same_types); + return true; } else { @@ -470,14 +516,14 @@ bool ConstantExpressionTemplate::parseLiteralAndAssertType(ReadBuffer & istr, co if (pos_integer == pos_double && errno != ERANGE && (!negative || uint_value <= (1ULL << 63))) { istr.position() += pos_integer - buf; - if (negative && type_info.nested_type == Type::Int64) + if (negative && type_info.main_type == Type::Int64) number = static_cast(-uint_value); - else if (!negative && type_info.nested_type == Type::UInt64) + else if (!negative && type_info.main_type == Type::UInt64) number = uint_value; else return false; } - else if (type_info.nested_type == Type::Float64) + else if (type_info.main_type == Type::Float64) { istr.position() += pos_double - buf; number = float_value; diff --git a/dbms/src/Processors/Formats/Impl/RegexpRowInputFormat.cpp b/dbms/src/Processors/Formats/Impl/RegexpRowInputFormat.cpp new file mode 100644 index 00000000000..899630410a4 --- /dev/null +++ b/dbms/src/Processors/Formats/Impl/RegexpRowInputFormat.cpp @@ -0,0 +1,195 @@ +#include +#include +#include +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int INCORRECT_DATA; + extern const int BAD_ARGUMENTS; +} + +RegexpRowInputFormat::RegexpRowInputFormat( + ReadBuffer & in_, const Block & header_, Params params_, const FormatSettings & format_settings_) + : IRowInputFormat(header_, in_, std::move(params_)), buf(in_), format_settings(format_settings_), regexp(format_settings_.regexp.regexp) +{ + size_t fields_count = regexp.NumberOfCapturingGroups(); + matched_fields.resize(fields_count); + re2_arguments.resize(fields_count); + re2_arguments_ptrs.resize(fields_count); + for (size_t i = 0; i != fields_count; ++i) + { + // Bind an argument to a matched field. + re2_arguments[i] = &matched_fields[i]; + // Save pointer to argument. + re2_arguments_ptrs[i] = &re2_arguments[i]; + } + + field_format = stringToFormat(format_settings_.regexp.escaping_rule); +} + +RegexpRowInputFormat::ColumnFormat RegexpRowInputFormat::stringToFormat(const String & format) +{ + if (format == "Escaped") + return ColumnFormat::Escaped; + if (format == "Quoted") + return ColumnFormat::Quoted; + if (format == "CSV") + return ColumnFormat::Csv; + if (format == "JSON") + return ColumnFormat::Json; + throw Exception("Unsupported column format \"" + format + "\".", ErrorCodes::BAD_ARGUMENTS); +} + +bool RegexpRowInputFormat::readField(size_t index, MutableColumns & columns) +{ + const auto & type = getPort().getHeader().getByPosition(index).type; + bool parse_as_nullable = format_settings.null_as_default && !type->isNullable(); + bool read = true; + ReadBuffer field_buf(const_cast(matched_fields[index].data()), matched_fields[index].size(), 0); + try + { + switch (field_format) + { + case ColumnFormat::Escaped: + if (parse_as_nullable) + read = DataTypeNullable::deserializeTextEscaped(*columns[index], field_buf, format_settings, type); + else + type->deserializeAsTextEscaped(*columns[index], field_buf, format_settings); + break; + case ColumnFormat::Quoted: + if (parse_as_nullable) + read = DataTypeNullable::deserializeTextQuoted(*columns[index], field_buf, format_settings, type); + else + type->deserializeAsTextQuoted(*columns[index], field_buf, format_settings); + break; + case ColumnFormat::Csv: + if (parse_as_nullable) + read = DataTypeNullable::deserializeTextCSV(*columns[index], field_buf, format_settings, type); + else + type->deserializeAsTextCSV(*columns[index], field_buf, format_settings); + break; + case ColumnFormat::Json: + if (parse_as_nullable) + read = DataTypeNullable::deserializeTextJSON(*columns[index], field_buf, format_settings, type); + else + type->deserializeAsTextJSON(*columns[index], field_buf, format_settings); + break; + default: + break; + } + } + catch (Exception & e) + { + e.addMessage("(while read the value of column " + getPort().getHeader().getByPosition(index).name + ")"); + throw; + } + return read; +} + +void RegexpRowInputFormat::readFieldsFromMatch(MutableColumns & columns, RowReadExtension & ext) +{ + if (matched_fields.size() != columns.size()) + throw Exception("The number of matched fields in line doesn't match the number of columns.", ErrorCodes::INCORRECT_DATA); + + ext.read_columns.assign(columns.size(), false); + for (size_t columns_index = 0; columns_index < columns.size(); ++columns_index) + { + ext.read_columns[columns_index] = readField(columns_index, columns); + } +} + +bool RegexpRowInputFormat::readRow(MutableColumns & columns, RowReadExtension & ext) +{ + if (buf.eof()) + return false; + + PeekableReadBufferCheckpoint checkpoint{buf}; + + size_t line_size = 0; + + do + { + char * pos = find_first_symbols<'\n', '\r'>(buf.position(), buf.buffer().end()); + line_size += pos - buf.position(); + buf.position() = pos; + } while (buf.position() == buf.buffer().end() && !buf.eof()); + + buf.makeContinuousMemoryFromCheckpointToPos(); + buf.rollbackToCheckpoint(); + + bool match = RE2::FullMatchN(re2::StringPiece(buf.position(), line_size), regexp, re2_arguments_ptrs.data(), re2_arguments_ptrs.size()); + bool read_line = true; + + if (!match) + { + if (!format_settings.regexp.skip_unmatched) + throw Exception("Line \"" + std::string(buf.position(), line_size) + "\" doesn't match the regexp.", ErrorCodes::INCORRECT_DATA); + read_line = false; + } + + if (read_line) + readFieldsFromMatch(columns, ext); + + buf.position() += line_size; + + checkChar('\r', buf); + if (!buf.eof() && !checkChar('\n', buf)) + throw Exception("No \\n after \\r at the end of line.", ErrorCodes::INCORRECT_DATA); + + return true; +} + +void registerInputFormatProcessorRegexp(FormatFactory & factory) +{ + factory.registerInputFormatProcessor("Regexp", []( + ReadBuffer & buf, + const Block & sample, + IRowInputFormat::Params params, + const FormatSettings & settings) + { + return std::make_shared(buf, sample, std::move(params), settings); + }); +} + +static bool fileSegmentationEngineRegexpImpl(ReadBuffer & in, DB::Memory<> & memory, size_t min_chunk_size) +{ + char * pos = in.position(); + bool need_more_data = true; + + while (loadAtPosition(in, memory, pos) && need_more_data) + { + pos = find_first_symbols<'\n', '\r'>(pos, in.buffer().end()); + if (pos == in.buffer().end()) + continue; + + // Support DOS-style newline ("\r\n") + if (*pos == '\r') + { + ++pos; + if (pos == in.buffer().end()) + loadAtPosition(in, memory, pos); + } + + if (memory.size() + static_cast(pos - in.position()) >= min_chunk_size) + need_more_data = false; + + ++pos; + + } + + saveUpToPosition(in, memory, pos); + + return loadAtPosition(in, memory, pos); +} + +void registerFileSegmentationEngineRegexp(FormatFactory & factory) +{ + factory.registerFileSegmentationEngine("Regexp", &fileSegmentationEngineRegexpImpl); +} + +} diff --git a/dbms/src/Processors/Formats/Impl/RegexpRowInputFormat.h b/dbms/src/Processors/Formats/Impl/RegexpRowInputFormat.h new file mode 100644 index 00000000000..8f9ecdc1349 --- /dev/null +++ b/dbms/src/Processors/Formats/Impl/RegexpRowInputFormat.h @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace DB +{ + +class ReadBuffer; + +/// Regexp input format. +/// This format applies regular expression from format_regexp setting for every line of file +/// (the lines must be separated by newline character ('\n') or DOS-style newline ("\r\n")). +/// Every matched subpattern will be parsed with the method of corresponding data type +/// (according to format_regexp_escaping_rule setting). If the regexp did not match the line, +/// if format_regexp_skip_unmatched is 1, the line is silently skipped, if the setting is 0, exception will be thrown. + +class RegexpRowInputFormat : public IRowInputFormat +{ + using ColumnFormat = ParsedTemplateFormatString::ColumnFormat; +public: + RegexpRowInputFormat(ReadBuffer & in_, const Block & header_, Params params_, const FormatSettings & format_settings_); + + String getName() const override { return "RegexpRowInputFormat"; } + + bool readRow(MutableColumns & columns, RowReadExtension & ext) override; + +private: + bool readField(size_t index, MutableColumns & columns); + void readFieldsFromMatch(MutableColumns & columns, RowReadExtension & ext); + static ColumnFormat stringToFormat(const String & format); + + PeekableReadBuffer buf; + const FormatSettings format_settings; + ColumnFormat field_format; + + RE2 regexp; + // The vector of fields extracted from line using regexp. + std::vector matched_fields; + // These two vectors are needed to use RE2::FullMatchN (function for extracting fields). + std::vector re2_arguments; + std::vector re2_arguments_ptrs; +}; + +} diff --git a/dbms/src/Storages/IStorage.cpp b/dbms/src/Storages/IStorage.cpp index 5db5b8de2d0..cd2b4e6e5a9 100644 --- a/dbms/src/Storages/IStorage.cpp +++ b/dbms/src/Storages/IStorage.cpp @@ -314,11 +314,9 @@ bool IStorage::isVirtualColumn(const String & column_name) const return getColumns().get(column_name).is_virtual; } -TableStructureReadLockHolder IStorage::lockStructureForShare(bool will_add_new_data, const String & query_id) +TableStructureReadLockHolder IStorage::lockStructureForShare(const String & query_id) { TableStructureReadLockHolder result; - if (will_add_new_data) - result.new_data_structure_lock = new_data_structure_lock->getLock(RWLockImpl::Read, query_id); result.structure_lock = structure_lock->getLock(RWLockImpl::Read, query_id); if (is_dropped) @@ -326,43 +324,32 @@ TableStructureReadLockHolder IStorage::lockStructureForShare(bool will_add_new_d return result; } -TableStructureWriteLockHolder IStorage::lockAlterIntention(const String & query_id) +TableStructureWriteLockHolder IStorage::lockAlterIntention() { TableStructureWriteLockHolder result; - result.alter_intention_lock = alter_intention_lock->getLock(RWLockImpl::Write, query_id); + result.alter_lock = std::unique_lock(alter_lock); if (is_dropped) throw Exception("Table is dropped", ErrorCodes::TABLE_IS_DROPPED); return result; } -void IStorage::lockNewDataStructureExclusively(TableStructureWriteLockHolder & lock_holder, const String & query_id) -{ - if (!lock_holder.alter_intention_lock) - throw Exception("Alter intention lock for table " + getStorageID().getNameForLogs() + " was not taken. This is a bug.", ErrorCodes::LOGICAL_ERROR); - - lock_holder.new_data_structure_lock = new_data_structure_lock->getLock(RWLockImpl::Write, query_id); -} - void IStorage::lockStructureExclusively(TableStructureWriteLockHolder & lock_holder, const String & query_id) { - if (!lock_holder.alter_intention_lock) + if (!lock_holder.alter_lock) throw Exception("Alter intention lock for table " + getStorageID().getNameForLogs() + " was not taken. This is a bug.", ErrorCodes::LOGICAL_ERROR); - if (!lock_holder.new_data_structure_lock) - lock_holder.new_data_structure_lock = new_data_structure_lock->getLock(RWLockImpl::Write, query_id); lock_holder.structure_lock = structure_lock->getLock(RWLockImpl::Write, query_id); } TableStructureWriteLockHolder IStorage::lockExclusively(const String & query_id) { TableStructureWriteLockHolder result; - result.alter_intention_lock = alter_intention_lock->getLock(RWLockImpl::Write, query_id); + result.alter_lock = std::unique_lock(alter_lock); if (is_dropped) throw Exception("Table is dropped", ErrorCodes::TABLE_IS_DROPPED); - result.new_data_structure_lock = new_data_structure_lock->getLock(RWLockImpl::Write, query_id); result.structure_lock = structure_lock->getLock(RWLockImpl::Write, query_id); return result; diff --git a/dbms/src/Storages/IStorage.h b/dbms/src/Storages/IStorage.h index 296052047e7..ecb137ba220 100644 --- a/dbms/src/Storages/IStorage.h +++ b/dbms/src/Storages/IStorage.h @@ -203,16 +203,11 @@ public: /// Acquire this lock if you need the table structure to remain constant during the execution of /// the query. If will_add_new_data is true, this means that the query will add new data to the table /// (INSERT or a parts merge). - TableStructureReadLockHolder lockStructureForShare(bool will_add_new_data, const String & query_id); + TableStructureReadLockHolder lockStructureForShare(const String & query_id); /// Acquire this lock at the start of ALTER to lock out other ALTERs and make sure that only you /// can modify the table structure. It can later be upgraded to the exclusive lock. - TableStructureWriteLockHolder lockAlterIntention(const String & query_id); - - /// Upgrade alter intention lock and make sure that no new data is inserted into the table. - /// This is used by the ALTER MODIFY of the MergeTree storage to consistently determine - /// the set of parts that needs to be altered. - void lockNewDataStructureExclusively(TableStructureWriteLockHolder & lock_holder, const String & query_id); + TableStructureWriteLockHolder lockAlterIntention(); /// Upgrade alter intention lock to the full exclusive structure lock. This is done by ALTER queries /// to ensure that no other query uses the table structure and it can be safely changed. @@ -224,8 +219,12 @@ public: /** Returns stage to which query is going to be processed in read() function. * (Normally, the function only reads the columns from the list, but in other cases, * for example, the request can be partially processed on a remote server.) + * + * SelectQueryInfo is required since the stage can depends on the query + * (see Distributed() engine and optimize_skip_unused_shards). */ - virtual QueryProcessingStage::Enum getQueryProcessingStage(const Context &) const { return QueryProcessingStage::FetchColumns; } + QueryProcessingStage::Enum getQueryProcessingStage(const Context & context) const { return getQueryProcessingStage(context, {}); } + virtual QueryProcessingStage::Enum getQueryProcessingStage(const Context &, const ASTPtr &) const { return QueryProcessingStage::FetchColumns; } /** Watch live changes to the table. * Accepts a list of columns to read, as well as a description of the query, @@ -465,25 +464,38 @@ public: /// Returns storage policy if storage supports it virtual StoragePolicyPtr getStoragePolicy() const { return {}; } - /** If it is possible to quickly determine exact number of rows in the table at this moment of time, then return it. - */ + /// If it is possible to quickly determine exact number of rows in the table at this moment of time, then return it. + /// Used for: + /// - Simple count() opimization + /// - For total_rows column in system.tables + /// + /// Does takes underlying Storage (if any) into account. virtual std::optional totalRows() const { return {}; } + /// If it is possible to quickly determine exact number of bytes for the table on storage: + /// - memory (approximated) + /// - disk (compressed) + /// + /// Used for: + /// - For total_bytes column in system.tables + // + /// Does not takes underlying Storage (if any) into account + /// (since for Buffer we still need to know how much bytes it uses). + virtual std::optional totalBytes() const + { + return {}; + } + private: /// You always need to take the next three locks in this order. /// If you hold this lock exclusively, you can be sure that no other structure modifying queries /// (e.g. ALTER, DROP) are concurrently executing. But queries that only read table structure /// (e.g. SELECT, INSERT) can continue to execute. - mutable RWLock alter_intention_lock = RWLockImpl::create(); - - /// It is taken for share for the entire INSERT query and the entire merge of the parts (for MergeTree). - /// ALTER COLUMN queries acquire an exclusive lock to ensure that no new parts with the old structure - /// are added to the table and thus the set of parts to modify doesn't change. - mutable RWLock new_data_structure_lock = RWLockImpl::create(); + mutable std::mutex alter_lock; /// Lock for the table column structure (names, types, etc.) and data path. /// It is taken in exclusive mode by queries that modify them (e.g. RENAME, ALTER and DROP) diff --git a/dbms/src/Storages/LiveView/StorageBlocks.h b/dbms/src/Storages/LiveView/StorageBlocks.h index e2c3a8b10f4..fd856e27718 100644 --- a/dbms/src/Storages/LiveView/StorageBlocks.h +++ b/dbms/src/Storages/LiveView/StorageBlocks.h @@ -26,7 +26,7 @@ public: return std::make_shared(table_id, columns, std::move(pipes), to_stage); } std::string getName() const override { return "Blocks"; } - QueryProcessingStage::Enum getQueryProcessingStage(const Context & /*context*/) const override { return to_stage; } + QueryProcessingStage::Enum getQueryProcessingStage(const Context &, const ASTPtr &) const override { return to_stage; } Pipes read( const Names & /*column_names*/, diff --git a/dbms/src/Storages/LiveView/StorageLiveView.cpp b/dbms/src/Storages/LiveView/StorageLiveView.cpp index 1f9a40d2893..9ebb9509885 100644 --- a/dbms/src/Storages/LiveView/StorageLiveView.cpp +++ b/dbms/src/Storages/LiveView/StorageLiveView.cpp @@ -518,14 +518,11 @@ void StorageLiveView::drop() condition.notify_all(); } -void StorageLiveView::refresh(const Context & context) +void StorageLiveView::refresh() { - auto alter_lock = lockAlterIntention(context.getCurrentQueryId()); - { - std::lock_guard lock(mutex); - if (getNewBlocks()) - condition.notify_all(); - } + std::lock_guard lock(mutex); + if (getNewBlocks()) + condition.notify_all(); } Pipes StorageLiveView::read( diff --git a/dbms/src/Storages/LiveView/StorageLiveView.h b/dbms/src/Storages/LiveView/StorageLiveView.h index 56dd30af429..d60433a767c 100644 --- a/dbms/src/Storages/LiveView/StorageLiveView.h +++ b/dbms/src/Storages/LiveView/StorageLiveView.h @@ -123,7 +123,7 @@ public: void startup() override; void shutdown() override; - void refresh(const Context & context); + void refresh(); Pipes read( const Names & column_names, diff --git a/dbms/src/Storages/MergeTree/DataPartsExchange.cpp b/dbms/src/Storages/MergeTree/DataPartsExchange.cpp index 6373c85a15d..1b216e8bec3 100644 --- a/dbms/src/Storages/MergeTree/DataPartsExchange.cpp +++ b/dbms/src/Storages/MergeTree/DataPartsExchange.cpp @@ -85,7 +85,7 @@ void Service::processQuery(const Poco::Net::HTMLForm & params, ReadBuffer & /*bo try { - auto storage_lock = data.lockStructureForShare(false, RWLockImpl::NO_QUERY); + auto storage_lock = data.lockStructureForShare(RWLockImpl::NO_QUERY); MergeTreeData::DataPartPtr part = findPart(part_name); diff --git a/dbms/src/Storages/MergeTree/IMergeTreeDataPart.cpp b/dbms/src/Storages/MergeTree/IMergeTreeDataPart.cpp index ac1df5c9ff8..79e4de3c9b0 100644 --- a/dbms/src/Storages/MergeTree/IMergeTreeDataPart.cpp +++ b/dbms/src/Storages/MergeTree/IMergeTreeDataPart.cpp @@ -406,8 +406,8 @@ void IMergeTreeDataPart::loadColumnsChecksumsIndexes(bool require_columns_checks loadColumns(require_columns_checksums); loadChecksums(require_columns_checksums); - calculateColumnsSizesOnDisk(); loadIndexGranularity(); + calculateColumnsSizesOnDisk(); loadIndex(); /// Must be called after loadIndexGranularity as it uses the value of `index_granularity` loadRowsCount(); /// Must be called after loadIndex() as it uses the value of `index_granularity`. loadPartitionAndMinMaxIndex(); diff --git a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp index 77a5bca7a92..27ad6871573 100644 --- a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp +++ b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp @@ -57,7 +57,7 @@ void ReplicatedMergeTreeCleanupThread::iterate() { /// TODO: Implement tryLockStructureForShare. - auto lock = storage.lockStructureForShare(false, ""); + auto lock = storage.lockStructureForShare(""); storage.clearOldTemporaryDirectories(); } diff --git a/dbms/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp b/dbms/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp index 17b716d14c2..5c8f878503a 100644 --- a/dbms/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp +++ b/dbms/src/Storages/MergeTree/ReplicatedMergeTreePartCheckThread.cpp @@ -203,7 +203,7 @@ CheckResult ReplicatedMergeTreePartCheckThread::checkPart(const String & part_na else if (part->name == part_name) { auto zookeeper = storage.getZooKeeper(); - auto table_lock = storage.lockStructureForShare(false, RWLockImpl::NO_QUERY); + auto table_lock = storage.lockStructureForShare(RWLockImpl::NO_QUERY); auto local_part_header = ReplicatedMergeTreePartHeader::fromColumnsAndChecksums( part->getColumns(), part->checksums); diff --git a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp index 73ea2098c71..c0749818ebf 100644 --- a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp +++ b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp @@ -1549,6 +1549,10 @@ std::vector ReplicatedMergeTreeQueue::getMutationsStatu return result; } +ReplicatedMergeTreeQueue::QueueLocks ReplicatedMergeTreeQueue::lockQueue() +{ + return QueueLocks(state_mutex, pull_logs_to_queue_mutex, update_mutations_mutex); +} ReplicatedMergeTreeMergePredicate::ReplicatedMergeTreeMergePredicate( ReplicatedMergeTreeQueue & queue_, zkutil::ZooKeeperPtr & zookeeper) diff --git a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h index 22d198b9f19..534978873c2 100644 --- a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h +++ b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h @@ -384,6 +384,15 @@ public: std::vector getMutationsStatus() const; void removeCurrentPartsFromMutations(); + + using QueueLocks = std::scoped_lock; + + /// This method locks all important queue mutexes: state_mutex, + /// pull_logs_to_queue and update_mutations_mutex. It should be used only + /// once while we want to shutdown our queue and remove it's task from pool. + /// It's needed because queue itself can trigger it's task handler and in + /// this case race condition is possible. + QueueLocks lockQueue(); }; class ReplicatedMergeTreeMergePredicate diff --git a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp index 37b428e1e47..cd82a865827 100644 --- a/dbms/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp +++ b/dbms/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp @@ -334,7 +334,6 @@ void ReplicatedMergeTreeRestartingThread::partialShutdown() storage.partial_shutdown_called = true; storage.partial_shutdown_event.set(); - storage.alter_query_event->set(); storage.replica_is_active_node = nullptr; LOG_TRACE(log, "Waiting for threads to finish"); diff --git a/dbms/src/Storages/StorageBuffer.cpp b/dbms/src/Storages/StorageBuffer.cpp index 6fba8d46646..1d619c275c2 100644 --- a/dbms/src/Storages/StorageBuffer.cpp +++ b/dbms/src/Storages/StorageBuffer.cpp @@ -135,7 +135,7 @@ private: }; -QueryProcessingStage::Enum StorageBuffer::getQueryProcessingStage(const Context & context) const +QueryProcessingStage::Enum StorageBuffer::getQueryProcessingStage(const Context & context, const ASTPtr & query_ptr) const { if (destination_id) { @@ -144,7 +144,7 @@ QueryProcessingStage::Enum StorageBuffer::getQueryProcessingStage(const Context if (destination.get() == this) throw Exception("Destination table is myself. Read will cause infinite loop.", ErrorCodes::INFINITE_LOOP); - return destination->getQueryProcessingStage(context); + return destination->getQueryProcessingStage(context, query_ptr); } return QueryProcessingStage::FetchColumns; @@ -168,7 +168,7 @@ Pipes StorageBuffer::read( if (destination.get() == this) throw Exception("Destination table is myself. Read will cause infinite loop.", ErrorCodes::INFINITE_LOOP); - auto destination_lock = destination->lockStructureForShare(false, context.getCurrentQueryId()); + auto destination_lock = destination->lockStructureForShare(context.getCurrentQueryId()); const bool dst_has_same_structure = std::all_of(column_names.begin(), column_names.end(), [this, destination](const String& column_name) { @@ -725,6 +725,35 @@ void StorageBuffer::checkAlterIsPossible(const AlterCommands & commands, const S } } +std::optional StorageBuffer::totalRows() const +{ + std::optional underlying_rows; + auto underlying = DatabaseCatalog::instance().tryGetTable(destination_id); + + if (underlying) + underlying_rows = underlying->totalRows(); + if (!underlying_rows) + return underlying_rows; + + UInt64 rows = 0; + for (auto & buffer : buffers) + { + std::lock_guard lock(buffer.mutex); + rows += buffer.data.rows(); + } + return rows + *underlying_rows; +} + +std::optional StorageBuffer::totalBytes() const +{ + UInt64 bytes = 0; + for (auto & buffer : buffers) + { + std::lock_guard lock(buffer.mutex); + bytes += buffer.data.bytes(); + } + return bytes; +} void StorageBuffer::alter(const AlterCommands & params, const Context & context, TableStructureWriteLockHolder & table_lock_holder) { diff --git a/dbms/src/Storages/StorageBuffer.h b/dbms/src/Storages/StorageBuffer.h index d4c6f3e6078..7a3d907ae76 100644 --- a/dbms/src/Storages/StorageBuffer.h +++ b/dbms/src/Storages/StorageBuffer.h @@ -54,7 +54,7 @@ public: std::string getName() const override { return "Buffer"; } - QueryProcessingStage::Enum getQueryProcessingStage(const Context & context) const override; + QueryProcessingStage::Enum getQueryProcessingStage(const Context & context, const ASTPtr &) const override; Pipes read( const Names & column_names, @@ -88,8 +88,11 @@ public: void checkAlterIsPossible(const AlterCommands & commands, const Settings & /* settings */) override; - /// The structure of the subordinate table is not checked and does not change. - void alter(const AlterCommands & params, const Context & context, TableStructureWriteLockHolder & table_lock_holder) override; + /// The structure of the subordinate table is not checked and does not change. + void alter(const AlterCommands & params, const Context & context, TableStructureWriteLockHolder & table_lock_holder) override; + + std::optional totalRows() const override; + std::optional totalBytes() const override; ~StorageBuffer() override; @@ -100,7 +103,7 @@ private: { time_t first_write_time = 0; Block data; - std::mutex mutex; + mutable std::mutex mutex; }; /// There are `num_shards` of independent buffers. diff --git a/dbms/src/Storages/StorageDistributed.cpp b/dbms/src/Storages/StorageDistributed.cpp index d53f2bd6ecb..8aa7728a1cc 100644 --- a/dbms/src/Storages/StorageDistributed.cpp +++ b/dbms/src/Storages/StorageDistributed.cpp @@ -369,9 +369,9 @@ static QueryProcessingStage::Enum getQueryProcessingStageImpl(const Context & co : QueryProcessingStage::WithMergeableState; } -QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage(const Context & context) const +QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage(const Context & context, const ASTPtr & query_ptr) const { - auto cluster = getCluster(); + auto cluster = getOptimizedCluster(context, query_ptr); return getQueryProcessingStageImpl(context, cluster); } @@ -383,9 +383,7 @@ Pipes StorageDistributed::read( const size_t /*max_block_size*/, const unsigned /*num_streams*/) { - auto cluster = getCluster(); - - const Settings & settings = context.getSettingsRef(); + auto cluster = getOptimizedCluster(context, query_info.query); const auto & modified_query_ast = rewriteSelectQuery( query_info.query, remote_database, remote_table, remote_table_function_ptr); @@ -405,50 +403,8 @@ Pipes StorageDistributed::read( : ClusterProxy::SelectStreamFactory( header, processed_stage, StorageID{remote_database, remote_table}, scalars, has_virtual_shard_num_column, context.getExternalTables()); - UInt64 force = settings.force_optimize_skip_unused_shards; - if (settings.optimize_skip_unused_shards) - { - ClusterPtr smaller_cluster; - auto table_id = getStorageID(); - - if (has_sharding_key) - { - smaller_cluster = skipUnusedShards(cluster, query_info, context); - - if (smaller_cluster) - { - cluster = smaller_cluster; - LOG_DEBUG(log, "Reading from " << table_id.getNameForLogs() << ": " - "Skipping irrelevant shards - the query will be sent to the following shards of the cluster (shard numbers): " - " " << makeFormattedListOfShards(cluster)); - } - } - - if (!smaller_cluster) - { - LOG_DEBUG(log, "Reading from " << table_id.getNameForLogs() << - (has_sharding_key ? "" : " (no sharding key)") << ": " - "Unable to figure out irrelevant shards from WHERE/PREWHERE clauses - " - "the query will be sent to all shards of the cluster"); - - if (force) - { - std::stringstream exception_message; - if (!has_sharding_key) - exception_message << "No sharding key"; - else - exception_message << "Sharding key " << sharding_key_column_name << " is not used"; - - if (force == FORCE_OPTIMIZE_SKIP_UNUSED_SHARDS_ALWAYS) - throw Exception(exception_message.str(), ErrorCodes::UNABLE_TO_SKIP_UNUSED_SHARDS); - if (force == FORCE_OPTIMIZE_SKIP_UNUSED_SHARDS_HAS_SHARDING_KEY && has_sharding_key) - throw Exception(exception_message.str(), ErrorCodes::UNABLE_TO_SKIP_UNUSED_SHARDS); - } - } - } - return ClusterProxy::executeQuery( - select_stream_factory, cluster, modified_query_ast, context, settings, query_info); + select_stream_factory, cluster, modified_query_ast, context, context.getSettingsRef(), query_info); } @@ -574,6 +530,13 @@ namespace } +StoragePolicyPtr StorageDistributed::getStoragePolicy() const +{ + if (storage_policy.empty()) + return {}; + return global_context.getStoragePolicySelector()->get(storage_policy); +} + NameAndTypePair StorageDistributed::getColumn(const String & column_name) const { if (getColumns().hasPhysical(column_name)) @@ -631,6 +594,51 @@ ClusterPtr StorageDistributed::getCluster() const return owned_cluster ? owned_cluster : global_context.getCluster(cluster_name); } +ClusterPtr StorageDistributed::getOptimizedCluster(const Context & context, const ASTPtr & query_ptr) const +{ + ClusterPtr cluster = getCluster(); + const Settings & settings = context.getSettingsRef(); + auto table_id = getStorageID(); + + if (!settings.optimize_skip_unused_shards) + return cluster; + + if (has_sharding_key) + { + ClusterPtr optimized = skipUnusedShards(cluster, query_ptr, context); + + if (optimized) + { + LOG_DEBUG(log, "Reading from " << table_id.getNameForLogs() << ": " + "Skipping irrelevant shards - the query will be sent to the following shards of the cluster (shard numbers): " + " " << makeFormattedListOfShards(cluster)); + return optimized; + } + } + + LOG_DEBUG(log, "Reading from " << table_id.getNameForLogs() << + (has_sharding_key ? "" : " (no sharding key)") << ": " + "Unable to figure out irrelevant shards from WHERE/PREWHERE clauses - " + "the query will be sent to all shards of the cluster"); + + UInt64 force = settings.force_optimize_skip_unused_shards; + if (force) + { + std::stringstream exception_message; + if (!has_sharding_key) + exception_message << "No sharding key"; + else + exception_message << "Sharding key " << sharding_key_column_name << " is not used"; + + if (force == FORCE_OPTIMIZE_SKIP_UNUSED_SHARDS_ALWAYS) + throw Exception(exception_message.str(), ErrorCodes::UNABLE_TO_SKIP_UNUSED_SHARDS); + if (force == FORCE_OPTIMIZE_SKIP_UNUSED_SHARDS_HAS_SHARDING_KEY && has_sharding_key) + throw Exception(exception_message.str(), ErrorCodes::UNABLE_TO_SKIP_UNUSED_SHARDS); + } + + return cluster; +} + void StorageDistributed::ClusterNodeData::flushAllData() { directory_monitor->flushAllData(); @@ -643,9 +651,9 @@ void StorageDistributed::ClusterNodeData::shutdownAndDropAllData() /// Returns a new cluster with fewer shards if constant folding for `sharding_key_expr` is possible /// using constraints from "PREWHERE" and "WHERE" conditions, otherwise returns `nullptr` -ClusterPtr StorageDistributed::skipUnusedShards(ClusterPtr cluster, const SelectQueryInfo & query_info, const Context & context) +ClusterPtr StorageDistributed::skipUnusedShards(ClusterPtr cluster, const ASTPtr & query_ptr, const Context & context) const { - const auto & select = query_info.query->as(); + const auto & select = query_ptr->as(); if (!select.prewhere() && !select.where()) { diff --git a/dbms/src/Storages/StorageDistributed.h b/dbms/src/Storages/StorageDistributed.h index bfa03858afb..23f9f991dfe 100644 --- a/dbms/src/Storages/StorageDistributed.h +++ b/dbms/src/Storages/StorageDistributed.h @@ -60,13 +60,14 @@ public: bool supportsSampling() const override { return true; } bool supportsFinal() const override { return true; } bool supportsPrewhere() const override { return true; } + StoragePolicyPtr getStoragePolicy() const override; NameAndTypePair getColumn(const String & column_name) const override; bool hasColumn(const String & column_name) const override; bool isRemote() const override { return true; } - QueryProcessingStage::Enum getQueryProcessingStage(const Context & context) const override; + QueryProcessingStage::Enum getQueryProcessingStage(const Context & context, const ASTPtr &) const override; Pipes read( const Names & column_names, @@ -112,6 +113,12 @@ public: ClusterPtr getCluster() const; + /// Apply the following settings: + /// - optimize_skip_unused_shards + /// - force_optimize_skip_unused_shards + ClusterPtr getOptimizedCluster(const Context &, const ASTPtr & query_ptr) const; + ClusterPtr skipUnusedShards(ClusterPtr cluster, const ASTPtr & query_ptr, const Context & context) const; + ActionLock getActionLock(StorageActionBlockType type) override; String remote_database; @@ -162,8 +169,6 @@ protected: const String & relative_data_path_, bool attach); - ClusterPtr skipUnusedShards(ClusterPtr cluster, const SelectQueryInfo & query_info, const Context & context); - void createStorage(); String storage_policy; diff --git a/dbms/src/Storages/StorageJoin.cpp b/dbms/src/Storages/StorageJoin.cpp index f47cc9ae886..f5e88b193cd 100644 --- a/dbms/src/Storages/StorageJoin.cpp +++ b/dbms/src/Storages/StorageJoin.cpp @@ -43,7 +43,7 @@ StorageJoin::StorageJoin( ASTTableJoin::Strictness strictness_, const ColumnsDescription & columns_, const ConstraintsDescription & constraints_, - bool overwrite, + bool overwrite_, const Context & context_) : StorageSetOrJoinBase{relative_path_, table_id_, columns_, constraints_, context_} , key_names(key_names_) @@ -51,6 +51,7 @@ StorageJoin::StorageJoin( , limits(limits_) , kind(kind_) , strictness(strictness_) + , overwrite(overwrite_) { for (const auto & key : key_names) if (!getColumns().hasPhysical(key)) @@ -69,7 +70,7 @@ void StorageJoin::truncate(const ASTPtr &, const Context &, TableStructureWriteL Poco::File(path + "tmp/").createDirectories(); increment = 0; - join = std::make_shared(table_join, getSampleBlock().sortColumns()); + join = std::make_shared(table_join, getSampleBlock().sortColumns(), overwrite); } diff --git a/dbms/src/Storages/StorageJoin.h b/dbms/src/Storages/StorageJoin.h index 6ee941feaec..acfc8a8b4e7 100644 --- a/dbms/src/Storages/StorageJoin.h +++ b/dbms/src/Storages/StorageJoin.h @@ -51,6 +51,7 @@ private: SizeLimits limits; ASTTableJoin::Kind kind; /// LEFT | INNER ... ASTTableJoin::Strictness strictness; /// ANY | ALL + bool overwrite; std::shared_ptr table_join; HashJoinPtr join; diff --git a/dbms/src/Storages/StorageMaterializedView.cpp b/dbms/src/Storages/StorageMaterializedView.cpp index 3e2ddf3a962..5440cd661df 100644 --- a/dbms/src/Storages/StorageMaterializedView.cpp +++ b/dbms/src/Storages/StorageMaterializedView.cpp @@ -173,9 +173,9 @@ StorageInMemoryMetadata StorageMaterializedView::getInMemoryMetadata() const return result; } -QueryProcessingStage::Enum StorageMaterializedView::getQueryProcessingStage(const Context & context) const +QueryProcessingStage::Enum StorageMaterializedView::getQueryProcessingStage(const Context & context, const ASTPtr & query_ptr) const { - return getTargetTable()->getQueryProcessingStage(context); + return getTargetTable()->getQueryProcessingStage(context, query_ptr); } Pipes StorageMaterializedView::read( @@ -187,7 +187,7 @@ Pipes StorageMaterializedView::read( const unsigned num_streams) { auto storage = getTargetTable(); - auto lock = storage->lockStructureForShare(false, context.getCurrentQueryId()); + auto lock = storage->lockStructureForShare(context.getCurrentQueryId()); if (query_info.order_by_optimizer) query_info.input_sorting_info = query_info.order_by_optimizer->getInputOrder(storage); @@ -202,7 +202,7 @@ Pipes StorageMaterializedView::read( BlockOutputStreamPtr StorageMaterializedView::write(const ASTPtr & query, const Context & context) { auto storage = getTargetTable(); - auto lock = storage->lockStructureForShare(true, context.getCurrentQueryId()); + auto lock = storage->lockStructureForShare(context.getCurrentQueryId()); auto stream = storage->write(query, context); stream->addTableLock(lock); return stream; diff --git a/dbms/src/Storages/StorageMaterializedView.h b/dbms/src/Storages/StorageMaterializedView.h index 3ee9a6b28c1..3dc04900952 100644 --- a/dbms/src/Storages/StorageMaterializedView.h +++ b/dbms/src/Storages/StorageMaterializedView.h @@ -59,7 +59,7 @@ public: void checkTableCanBeDropped() const override; void checkPartitionCanBeDropped(const ASTPtr & partition) override; - QueryProcessingStage::Enum getQueryProcessingStage(const Context & context) const override; + QueryProcessingStage::Enum getQueryProcessingStage(const Context & context, const ASTPtr &) const override; StoragePtr getTargetTable() const; StoragePtr tryGetTargetTable() const; diff --git a/dbms/src/Storages/StorageMemory.cpp b/dbms/src/Storages/StorageMemory.cpp index e7e9ef89ed8..107c70b420d 100644 --- a/dbms/src/Storages/StorageMemory.cpp +++ b/dbms/src/Storages/StorageMemory.cpp @@ -136,6 +136,24 @@ void StorageMemory::truncate(const ASTPtr &, const Context &, TableStructureWrit data.clear(); } +std::optional StorageMemory::totalRows() const +{ + UInt64 rows = 0; + std::lock_guard lock(mutex); + for (auto & buffer : data) + rows += buffer.rows(); + return rows; +} + +std::optional StorageMemory::totalBytes() const +{ + UInt64 bytes = 0; + std::lock_guard lock(mutex); + for (auto & buffer : data) + bytes += buffer.bytes(); + return bytes; +} + void registerStorageMemory(StorageFactory & factory) { diff --git a/dbms/src/Storages/StorageMemory.h b/dbms/src/Storages/StorageMemory.h index 8877de9ea7b..5a79358d76d 100644 --- a/dbms/src/Storages/StorageMemory.h +++ b/dbms/src/Storages/StorageMemory.h @@ -42,11 +42,14 @@ public: void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; + std::optional totalRows() const override; + std::optional totalBytes() const override; + private: /// The data itself. `list` - so that when inserted to the end, the existing iterators are not invalidated. BlocksList data; - std::mutex mutex; + mutable std::mutex mutex; protected: StorageMemory(const StorageID & table_id_, ColumnsDescription columns_description_, ConstraintsDescription constraints_); diff --git a/dbms/src/Storages/StorageMerge.cpp b/dbms/src/Storages/StorageMerge.cpp index 80910793b40..657950c0bcb 100644 --- a/dbms/src/Storages/StorageMerge.cpp +++ b/dbms/src/Storages/StorageMerge.cpp @@ -136,7 +136,7 @@ bool StorageMerge::mayBenefitFromIndexForIn(const ASTPtr & left_in_operand, cons } -QueryProcessingStage::Enum StorageMerge::getQueryProcessingStage(const Context & context) const +QueryProcessingStage::Enum StorageMerge::getQueryProcessingStage(const Context & context, const ASTPtr & query_ptr) const { auto stage_in_source_tables = QueryProcessingStage::FetchColumns; @@ -150,7 +150,7 @@ QueryProcessingStage::Enum StorageMerge::getQueryProcessingStage(const Context & if (table.get() != this) { ++selected_table_size; - stage_in_source_tables = std::max(stage_in_source_tables, table->getQueryProcessingStage(context)); + stage_in_source_tables = std::max(stage_in_source_tables, table->getQueryProcessingStage(context, query_ptr)); } iterator->next(); @@ -287,7 +287,7 @@ Pipes StorageMerge::createSources(const SelectQueryInfo & query_info, const Quer return pipes; } - if (processed_stage <= storage->getQueryProcessingStage(*modified_context)) + if (processed_stage <= storage->getQueryProcessingStage(*modified_context, query_info.query)) { /// If there are only virtual columns in query, you must request at least one other column. if (real_column_names.empty()) @@ -295,7 +295,7 @@ Pipes StorageMerge::createSources(const SelectQueryInfo & query_info, const Quer pipes = storage->read(real_column_names, modified_query_info, *modified_context, processed_stage, max_block_size, UInt32(streams_num)); } - else if (processed_stage > storage->getQueryProcessingStage(*modified_context)) + else if (processed_stage > storage->getQueryProcessingStage(*modified_context, query_info.query)) { modified_query_info.query->as()->replaceDatabaseAndTable(source_database, table_name); @@ -364,7 +364,7 @@ StorageMerge::StorageListWithLocks StorageMerge::getSelectedTables(const String { auto & table = iterator->table(); if (table.get() != this) - selected_tables.emplace_back(table, table->lockStructureForShare(false, query_id), iterator->name()); + selected_tables.emplace_back(table, table->lockStructureForShare(query_id), iterator->name()); iterator->next(); } @@ -389,7 +389,7 @@ StorageMerge::StorageListWithLocks StorageMerge::getSelectedTables(const ASTPtr if (storage.get() != this) { - selected_tables.emplace_back(storage, storage->lockStructureForShare(false, query_id), iterator->name()); + selected_tables.emplace_back(storage, storage->lockStructureForShare(query_id), iterator->name()); virtual_column->insert(iterator->name()); } diff --git a/dbms/src/Storages/StorageMerge.h b/dbms/src/Storages/StorageMerge.h index 1b7bb2fabe8..1d2df3cb9ce 100644 --- a/dbms/src/Storages/StorageMerge.h +++ b/dbms/src/Storages/StorageMerge.h @@ -31,7 +31,7 @@ public: NameAndTypePair getColumn(const String & column_name) const override; bool hasColumn(const String & column_name) const override; - QueryProcessingStage::Enum getQueryProcessingStage(const Context &) const override; + QueryProcessingStage::Enum getQueryProcessingStage(const Context &, const ASTPtr &) const override; Pipes read( const Names & column_names, diff --git a/dbms/src/Storages/StorageMergeTree.cpp b/dbms/src/Storages/StorageMergeTree.cpp index 8a1ba4120a8..a1ac99d06b6 100644 --- a/dbms/src/Storages/StorageMergeTree.cpp +++ b/dbms/src/Storages/StorageMergeTree.cpp @@ -151,6 +151,11 @@ std::optional StorageMergeTree::totalRows() const return getTotalActiveSizeInRows(); } +std::optional StorageMergeTree::totalBytes() const +{ + return getTotalActiveSizeInBytes(); +} + BlockOutputStreamPtr StorageMergeTree::write(const ASTPtr & /*query*/, const Context & context) { return std::make_shared(*this, context.getSettingsRef().max_partitions_per_insert_block); @@ -236,9 +241,9 @@ void StorageMergeTree::alter( DatabaseCatalog::instance().getDatabase(table_id.database_name)->alterTable(context, table_id, metadata); - /// We release all locks except alter_intention_lock which allows + /// We release all locks except alter_lock which allows /// to execute alter queries sequentially - table_lock_holder.releaseAllExpectAlterIntention(); + table_lock_holder.releaseAllExceptAlterIntention(); /// Always execute required mutations synchronously, because alters /// should be executed in sequential order. @@ -532,7 +537,7 @@ bool StorageMergeTree::merge( bool deduplicate, String * out_disable_reason) { - auto table_lock_holder = lockStructureForShare(true, RWLockImpl::NO_QUERY); + auto table_lock_holder = lockStructureForShare(RWLockImpl::NO_QUERY); FutureMergedMutatedPart future_part; @@ -650,7 +655,7 @@ BackgroundProcessingPoolTaskResult StorageMergeTree::movePartsTask() bool StorageMergeTree::tryMutatePart() { - auto table_lock_holder = lockStructureForShare(true, RWLockImpl::NO_QUERY); + auto table_lock_holder = lockStructureForShare(RWLockImpl::NO_QUERY); size_t max_ast_elements = global_context.getSettingsRef().max_expanded_ast_elements; FutureMergedMutatedPart future_part; @@ -775,7 +780,7 @@ BackgroundProcessingPoolTaskResult StorageMergeTree::mergeMutateTask() { { /// TODO: Implement tryLockStructureForShare. - auto lock_structure = lockStructureForShare(false, ""); + auto lock_structure = lockStructureForShare(""); clearOldPartsFromFilesystem(); clearOldTemporaryDirectories(); } @@ -968,14 +973,14 @@ void StorageMergeTree::alterPartition(const ASTPtr & query, const PartitionComma case PartitionCommand::FREEZE_PARTITION: { - auto lock = lockStructureForShare(false, context.getCurrentQueryId()); + auto lock = lockStructureForShare(context.getCurrentQueryId()); freezePartition(command.partition, command.with_name, context, lock); } break; case PartitionCommand::FREEZE_ALL_PARTITIONS: { - auto lock = lockStructureForShare(false, context.getCurrentQueryId()); + auto lock = lockStructureForShare(context.getCurrentQueryId()); freezeAll(command.with_name, context, lock); } break; @@ -1040,8 +1045,8 @@ void StorageMergeTree::attachPartition(const ASTPtr & partition, bool attach_par void StorageMergeTree::replacePartitionFrom(const StoragePtr & source_table, const ASTPtr & partition, bool replace, const Context & context) { - auto lock1 = lockStructureForShare(false, context.getCurrentQueryId()); - auto lock2 = source_table->lockStructureForShare(false, context.getCurrentQueryId()); + auto lock1 = lockStructureForShare(context.getCurrentQueryId()); + auto lock2 = source_table->lockStructureForShare(context.getCurrentQueryId()); Stopwatch watch; MergeTreeData & src_data = checkStructureAndGetMergeTreeData(source_table); @@ -1111,8 +1116,8 @@ void StorageMergeTree::replacePartitionFrom(const StoragePtr & source_table, con void StorageMergeTree::movePartitionToTable(const StoragePtr & dest_table, const ASTPtr & partition, const Context & context) { - auto lock1 = lockStructureForShare(false, context.getCurrentQueryId()); - auto lock2 = dest_table->lockStructureForShare(false, context.getCurrentQueryId()); + auto lock1 = lockStructureForShare(context.getCurrentQueryId()); + auto lock2 = dest_table->lockStructureForShare(context.getCurrentQueryId()); auto dest_table_storage = std::dynamic_pointer_cast(dest_table); if (!dest_table_storage) diff --git a/dbms/src/Storages/StorageMergeTree.h b/dbms/src/Storages/StorageMergeTree.h index c236dc6da84..6a79ef88ca1 100644 --- a/dbms/src/Storages/StorageMergeTree.h +++ b/dbms/src/Storages/StorageMergeTree.h @@ -46,6 +46,7 @@ public: unsigned num_streams) override; std::optional totalRows() const override; + std::optional totalBytes() const override; BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; diff --git a/dbms/src/Storages/StorageNull.h b/dbms/src/Storages/StorageNull.h index f34b9479a03..d9aeb60c260 100644 --- a/dbms/src/Storages/StorageNull.h +++ b/dbms/src/Storages/StorageNull.h @@ -44,6 +44,15 @@ public: void alter(const AlterCommands & params, const Context & context, TableStructureWriteLockHolder & table_lock_holder) override; + std::optional totalRows() const override + { + return {0}; + } + std::optional totalBytes() const override + { + return {0}; + } + private: protected: diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index 23f2bcd970d..699f627b6d2 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -1025,7 +1025,7 @@ bool StorageReplicatedMergeTree::tryExecuteMerge(const LogEntry & entry) ReservationPtr reserved_space = reserveSpacePreferringTTLRules(estimated_space_for_merge, ttl_infos, time(nullptr), max_volume_index); - auto table_lock = lockStructureForShare(false, RWLockImpl::NO_QUERY); + auto table_lock = lockStructureForShare(RWLockImpl::NO_QUERY); FutureMergedMutatedPart future_merged_part(parts, entry.new_part_type); if (future_merged_part.name != entry.new_part_name) @@ -1160,7 +1160,7 @@ bool StorageReplicatedMergeTree::tryExecutePartMutation(const StorageReplicatedM /// Can throw an exception. ReservationPtr reserved_space = reserveSpace(estimated_space_for_result, source_part->disk); - auto table_lock = lockStructureForShare(false, RWLockImpl::NO_QUERY); + auto table_lock = lockStructureForShare(RWLockImpl::NO_QUERY); MutableDataPartPtr new_part; Transaction transaction(*this); @@ -1514,7 +1514,7 @@ bool StorageReplicatedMergeTree::executeReplaceRange(const LogEntry & entry) PartDescriptions parts_to_add; DataPartsVector parts_to_remove; - auto table_lock_holder_dst_table = lockStructureForShare(false, RWLockImpl::NO_QUERY); + auto table_lock_holder_dst_table = lockStructureForShare(RWLockImpl::NO_QUERY); for (size_t i = 0; i < entry_replace.new_part_names.size(); ++i) { @@ -1576,7 +1576,7 @@ bool StorageReplicatedMergeTree::executeReplaceRange(const LogEntry & entry) return 0; } - table_lock_holder_src_table = source_table->lockStructureForShare(false, RWLockImpl::NO_QUERY); + table_lock_holder_src_table = source_table->lockStructureForShare(RWLockImpl::NO_QUERY); DataPartStates valid_states{MergeTreeDataPartState::PreCommitted, MergeTreeDataPartState::Committed, MergeTreeDataPartState::Outdated}; @@ -2699,7 +2699,7 @@ bool StorageReplicatedMergeTree::fetchPart(const String & part_name, const Strin TableStructureReadLockHolder table_lock_holder; if (!to_detached) - table_lock_holder = lockStructureForShare(true, RWLockImpl::NO_QUERY); + table_lock_holder = lockStructureForShare(RWLockImpl::NO_QUERY); /// Logging Stopwatch stopwatch; @@ -2882,7 +2882,14 @@ void StorageReplicatedMergeTree::shutdown() if (queue_task_handle) global_context.getBackgroundPool().removeTask(queue_task_handle); - queue_task_handle.reset(); + + { + /// Queue can trigger queue_task_handle itself. So we ensure that all + /// queue processes finished and after that reset queue_task_handle. + auto lock = queue.lockQueue(); + queue_task_handle.reset(); + } + if (move_parts_task_handle) global_context.getBackgroundMovePool().removeTask(move_parts_task_handle); @@ -2988,9 +2995,9 @@ Pipes StorageReplicatedMergeTree::read( } -std::optional StorageReplicatedMergeTree::totalRows() const +template +void StorageReplicatedMergeTree::foreachCommittedParts(const Func & func) const { - size_t res = 0; auto max_added_blocks = getMaxAddedBlocks(); auto lock = lockParts(); for (auto & part : getDataPartsStateRange(DataPartState::Committed)) @@ -3002,8 +3009,21 @@ std::optional StorageReplicatedMergeTree::totalRows() const if (blocks_iterator == max_added_blocks.end() || part->info.max_block > blocks_iterator->second) continue; - res += part->rows_count; + func(part); } +} + +std::optional StorageReplicatedMergeTree::totalRows() const +{ + UInt64 res = 0; + foreachCommittedParts([&res](auto & part) { res += part->rows_count; }); + return res; +} + +std::optional StorageReplicatedMergeTree::totalBytes() const +{ + UInt64 res = 0; + foreachCommittedParts([&res](auto & part) { res += part->getBytesOnDisk(); }); return res; } @@ -3203,7 +3223,7 @@ void StorageReplicatedMergeTree::alter( alter_entry.emplace(); mutation_znode.reset(); - /// We can safely read structure, because we guarded with alter_intention_lock + /// We can safely read structure, because we guarded with alter_lock if (is_readonly) throw Exception("Can't ALTER readonly table", ErrorCodes::TABLE_IS_READ_ONLY); @@ -3408,14 +3428,14 @@ void StorageReplicatedMergeTree::alterPartition(const ASTPtr & query, const Part case PartitionCommand::FREEZE_PARTITION: { - auto lock = lockStructureForShare(false, query_context.getCurrentQueryId()); + auto lock = lockStructureForShare(query_context.getCurrentQueryId()); freezePartition(command.partition, command.with_name, query_context, lock); } break; case PartitionCommand::FREEZE_ALL_PARTITIONS: { - auto lock = lockStructureForShare(false, query_context.getCurrentQueryId()); + auto lock = lockStructureForShare(query_context.getCurrentQueryId()); freezeAll(command.with_name, query_context, lock); } break; @@ -4423,7 +4443,7 @@ void StorageReplicatedMergeTree::clearOldPartsAndRemoveFromZK() { /// Critical section is not required (since grabOldParts() returns unique part set on each call) - auto table_lock = lockStructureForShare(false, RWLockImpl::NO_QUERY); + auto table_lock = lockStructureForShare(RWLockImpl::NO_QUERY); auto zookeeper = getZooKeeper(); DataPartsVector parts = grabOldParts(); @@ -4717,8 +4737,9 @@ void StorageReplicatedMergeTree::clearBlocksInPartition( void StorageReplicatedMergeTree::replacePartitionFrom(const StoragePtr & source_table, const ASTPtr & partition, bool replace, const Context & context) { - auto lock1 = lockStructureForShare(false, context.getCurrentQueryId()); - auto lock2 = source_table->lockStructureForShare(false, context.getCurrentQueryId()); + /// First argument is true, because we possibly will add new data to current table. + auto lock1 = lockStructureForShare(context.getCurrentQueryId()); + auto lock2 = source_table->lockStructureForShare(context.getCurrentQueryId()); Stopwatch watch; MergeTreeData & src_data = checkStructureAndGetMergeTreeData(source_table); @@ -4774,6 +4795,9 @@ void StorageReplicatedMergeTree::replacePartitionFrom(const StoragePtr & source_ ErrorCodes::LOGICAL_ERROR); String hash_hex = src_part->checksums.getTotalChecksumHex(); + + LOG_INFO(log, "Trying to " << (replace ? "replace " : "attach ") << src_part->name << " with hash_hex " << hash_hex); + String block_id_path = replace ? "" : (zookeeper_path + "/blocks/" + partition_id + "_replace_from_" + hash_hex); auto lock = allocateBlockNumber(partition_id, zookeeper, block_id_path); @@ -4893,8 +4917,8 @@ void StorageReplicatedMergeTree::replacePartitionFrom(const StoragePtr & source_ void StorageReplicatedMergeTree::movePartitionToTable(const StoragePtr & dest_table, const ASTPtr & partition, const Context & context) { - auto lock1 = lockStructureForShare(false, context.getCurrentQueryId()); - auto lock2 = dest_table->lockStructureForShare(false, context.getCurrentQueryId()); + auto lock1 = lockStructureForShare(context.getCurrentQueryId()); + auto lock2 = dest_table->lockStructureForShare(context.getCurrentQueryId()); auto dest_table_storage = std::dynamic_pointer_cast(dest_table); if (!dest_table_storage) diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.h b/dbms/src/Storages/StorageReplicatedMergeTree.h index 868230effde..f635b4f7bc0 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.h +++ b/dbms/src/Storages/StorageReplicatedMergeTree.h @@ -96,6 +96,7 @@ public: unsigned num_streams) override; std::optional totalRows() const override; + std::optional totalBytes() const override; BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; @@ -284,12 +285,12 @@ private: /// A thread that processes reconnection to ZooKeeper when the session expires. ReplicatedMergeTreeRestartingThread restarting_thread; - /// An event that awakens `alter` method from waiting for the completion of the ALTER query. - zkutil::EventPtr alter_query_event = std::make_shared(); - /// True if replica was created for existing table with fixed granularity bool other_replicas_fixed_granularity = false; + template + void foreachCommittedParts(const Func & func) const; + /** Creates the minimum set of nodes in ZooKeeper. */ void createTableIfNotExists(); diff --git a/dbms/src/Storages/System/StorageSystemColumns.cpp b/dbms/src/Storages/System/StorageSystemColumns.cpp index cbf6ada9ed3..9af8904ab26 100644 --- a/dbms/src/Storages/System/StorageSystemColumns.cpp +++ b/dbms/src/Storages/System/StorageSystemColumns.cpp @@ -103,7 +103,7 @@ protected: try { - table_lock = storage->lockStructureForShare(false, query_id); + table_lock = storage->lockStructureForShare(query_id); } catch (const Exception & e) { diff --git a/dbms/src/Storages/System/StorageSystemMergeTreeSettings.cpp b/dbms/src/Storages/System/StorageSystemMergeTreeSettings.cpp index bb0918454ef..9d32ec74d51 100644 --- a/dbms/src/Storages/System/StorageSystemMergeTreeSettings.cpp +++ b/dbms/src/Storages/System/StorageSystemMergeTreeSettings.cpp @@ -14,6 +14,7 @@ NamesAndTypesList SystemMergeTreeSettings::getNamesAndTypes() {"value", std::make_shared()}, {"changed", std::make_shared()}, {"description", std::make_shared()}, + {"type", std::make_shared()}, }; } @@ -25,6 +26,7 @@ void SystemMergeTreeSettings::fillData(MutableColumns & res_columns, const Conte res_columns[1]->insert(setting.getValueAsString()); res_columns[2]->insert(setting.isChanged()); res_columns[3]->insert(setting.getDescription().toString()); + res_columns[4]->insert(setting.getType().toString()); } } diff --git a/dbms/src/Storages/System/StorageSystemPartsBase.cpp b/dbms/src/Storages/System/StorageSystemPartsBase.cpp index d8f564b0160..c212b30d268 100644 --- a/dbms/src/Storages/System/StorageSystemPartsBase.cpp +++ b/dbms/src/Storages/System/StorageSystemPartsBase.cpp @@ -192,7 +192,7 @@ StoragesInfo StoragesInfoStream::next() try { /// For table not to be dropped and set of columns to remain constant. - info.table_lock = info.storage->lockStructureForShare(false, query_id); + info.table_lock = info.storage->lockStructureForShare(query_id); } catch (const Exception & e) { diff --git a/dbms/src/Storages/System/StorageSystemSettings.cpp b/dbms/src/Storages/System/StorageSystemSettings.cpp index 0be7618922d..f0a3e47defb 100644 --- a/dbms/src/Storages/System/StorageSystemSettings.cpp +++ b/dbms/src/Storages/System/StorageSystemSettings.cpp @@ -17,7 +17,8 @@ NamesAndTypesList StorageSystemSettings::getNamesAndTypes() {"description", std::make_shared()}, {"min", std::make_shared(std::make_shared())}, {"max", std::make_shared(std::make_shared())}, - {"readonly", std::make_shared()} + {"readonly", std::make_shared()}, + {"type", std::make_shared()}, }; } @@ -59,6 +60,7 @@ void StorageSystemSettings::fillData(MutableColumns & res_columns, const Context res_columns[4]->insert(min); res_columns[5]->insert(max); res_columns[6]->insert(read_only); + res_columns[7]->insert(setting.getType().toString()); } } diff --git a/dbms/src/Storages/System/StorageSystemTables.cpp b/dbms/src/Storages/System/StorageSystemTables.cpp index bd19f7dd2a4..5d0aec921de 100644 --- a/dbms/src/Storages/System/StorageSystemTables.cpp +++ b/dbms/src/Storages/System/StorageSystemTables.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,8 @@ StorageSystemTables::StorageSystemTables(const std::string & name_) {"primary_key", std::make_shared()}, {"sampling_key", std::make_shared()}, {"storage_policy", std::make_shared()}, + {"total_rows", std::make_shared(std::make_shared())}, + {"total_bytes", std::make_shared(std::make_shared())}, })); } @@ -141,51 +144,75 @@ protected: size_t src_index = 0; size_t res_index = 0; + // database if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // name if (columns_mask[src_index++]) res_columns[res_index++]->insert(table.first); + // engine if (columns_mask[src_index++]) res_columns[res_index++]->insert(table.second->getName()); + // is_temporary if (columns_mask[src_index++]) res_columns[res_index++]->insert(1u); + // data_paths if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // metadata_path if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // metadata_modification_time if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // dependencies_database if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // dependencies_table if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // create_table_query if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // engine_full if (columns_mask[src_index++]) res_columns[res_index++]->insert(table.second->getName()); + // partition_key if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // sorting_key if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // primary_key if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // sampling_key if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); + // storage_policy + if (columns_mask[src_index++]) + res_columns[res_index++]->insertDefault(); + + // total_rows + if (columns_mask[src_index++]) + res_columns[res_index++]->insertDefault(); + + // total_bytes if (columns_mask[src_index++]) res_columns[res_index++]->insertDefault(); } @@ -217,7 +244,7 @@ protected: if (need_lock_structure) { table = tables_it->table(); - lock = table->lockStructureForShare(false, context.getCurrentQueryId()); + lock = table->lockStructureForShare(context.getCurrentQueryId()); } } catch (const Exception & e) @@ -363,6 +390,26 @@ protected: else res_columns[res_index++]->insertDefault(); } + + if (columns_mask[src_index++]) + { + assert(table != nullptr); + auto total_rows = table->totalRows(); + if (total_rows) + res_columns[res_index++]->insert(*total_rows); + else + res_columns[res_index++]->insertDefault(); + } + + if (columns_mask[src_index++]) + { + assert(table != nullptr); + auto total_bytes = table->totalBytes(); + if (total_bytes) + res_columns[res_index++]->insert(*total_bytes); + else + res_columns[res_index++]->insertDefault(); + } } } diff --git a/dbms/src/Storages/TableStructureLockHolder.h b/dbms/src/Storages/TableStructureLockHolder.h index c97d187d524..50f196517e3 100644 --- a/dbms/src/Storages/TableStructureLockHolder.h +++ b/dbms/src/Storages/TableStructureLockHolder.h @@ -12,12 +12,11 @@ struct TableStructureWriteLockHolder { void release() { - *this = TableStructureWriteLockHolder(); + *this = {}; } - void releaseAllExpectAlterIntention() + void releaseAllExceptAlterIntention() { - new_data_structure_lock.reset(); structure_lock.reset(); } @@ -25,8 +24,7 @@ private: friend class IStorage; /// Order is important. - RWLockImpl::LockHolder alter_intention_lock; - RWLockImpl::LockHolder new_data_structure_lock; + std::unique_lock alter_lock; RWLockImpl::LockHolder structure_lock; }; @@ -34,14 +32,13 @@ struct TableStructureReadLockHolder { void release() { - *this = TableStructureReadLockHolder(); + *this = {}; } private: friend class IStorage; /// Order is important. - RWLockImpl::LockHolder new_data_structure_lock; RWLockImpl::LockHolder structure_lock; }; diff --git a/dbms/tests/integration/helpers/cluster.py b/dbms/tests/integration/helpers/cluster.py index b9ebc5a4bcd..5dc93cb338a 100644 --- a/dbms/tests/integration/helpers/cluster.py +++ b/dbms/tests/integration/helpers/cluster.py @@ -10,6 +10,7 @@ import socket import subprocess import time import urllib +import httplib import xml.dom.minidom import logging import docker @@ -661,7 +662,7 @@ class ClickHouseInstance: return self.client.query_and_get_answer_with_error(sql, stdin, timeout, settings, user, password) # Connects to the instance via HTTP interface, sends a query and returns the answer - def http_query(self, sql, data=None, params=None, user=None, password=None): + def http_query(self, sql, data=None, params=None, user=None, password=None, expect_fail_and_get_error=False): if params is None: params = {} else: @@ -677,7 +678,23 @@ class ClickHouseInstance: url = "http://" + auth + self.ip_address + ":8123/?" + urllib.urlencode(params) - return urllib.urlopen(url, data).read() + open_result = urllib.urlopen(url, data) + + def http_code_and_message(): + return str(open_result.getcode()) + " " + httplib.responses[open_result.getcode()] + ": " + open_result.read() + + if expect_fail_and_get_error: + if open_result.getcode() == 200: + raise Exception("ClickHouse HTTP server is expected to fail, but succeeded: " + open_result.read()) + return http_code_and_message() + else: + if open_result.getcode() != 200: + raise Exception("ClickHouse HTTP server returned " + http_code_and_message()) + return open_result.read() + + # Connects to the instance via HTTP interface, sends a query, expects an error and return the error message + def http_query_and_get_error(self, sql, data=None, params=None, user=None, password=None): + return self.http_query(sql=sql, data=data, params=params, user=user, password=password, expect_fail_and_get_error=True) def kill_clickhouse(self, stop_start_wait_sec=5): pid = self.get_process_pid("clickhouse") diff --git a/dbms/tests/integration/test_cluster_copier/configs/conf.d/clusters.xml b/dbms/tests/integration/test_cluster_copier/configs/conf.d/clusters.xml index f00cf1cf351..54a8822fa98 100644 --- a/dbms/tests/integration/test_cluster_copier/configs/conf.d/clusters.xml +++ b/dbms/tests/integration/test_cluster_copier/configs/conf.d/clusters.xml @@ -57,5 +57,24 @@ + + + + s0_0_0 + 9000 + + + + + + + + + s1_0_0 + 9000 + + + + diff --git a/dbms/tests/integration/test_cluster_copier/task0_description.xml b/dbms/tests/integration/test_cluster_copier/task0_description.xml index e8e4df99254..6fa490cd02f 100644 --- a/dbms/tests/integration/test_cluster_copier/task0_description.xml +++ b/dbms/tests/integration/test_cluster_copier/task0_description.xml @@ -28,6 +28,8 @@ default hits + 2 + 3 4 5 6 1 2 0 diff --git a/dbms/tests/integration/test_cluster_copier/task_month_to_week_description.xml b/dbms/tests/integration/test_cluster_copier/task_month_to_week_description.xml index e212d1a3d04..ee134603310 100644 --- a/dbms/tests/integration/test_cluster_copier/task_month_to_week_description.xml +++ b/dbms/tests/integration/test_cluster_copier/task_month_to_week_description.xml @@ -30,6 +30,8 @@ --> + 2 + ENGINE= ReplicatedMergeTree('/clickhouse/tables/cluster{cluster}/{shard}/b', '{replica}') diff --git a/dbms/tests/integration/test_cluster_copier/task_trivial.xml b/dbms/tests/integration/test_cluster_copier/task_trivial.xml new file mode 100644 index 00000000000..c23b9322470 --- /dev/null +++ b/dbms/tests/integration/test_cluster_copier/task_trivial.xml @@ -0,0 +1,64 @@ + + + + 3 + + + + 1 + + + + + 0 + + + + + + + + + + source_trivial_cluster + default + trivial + + destination_trivial_cluster + default + trivial + + + ENGINE=ReplicatedMergeTree('/clickhouse/tables/cluster{cluster}/{shard}/hits', '{replica}') PARTITION BY d % 5 ORDER BY d SETTINGS index_granularity = 16 + + + d + 1 + + + d - d = 0 + + + + + + + + + s0_0_0 + 9000 + + + + + + + + + s1_0_0 + 9000 + + + + + + \ No newline at end of file diff --git a/dbms/tests/integration/test_cluster_copier/test.py b/dbms/tests/integration/test_cluster_copier/test.py index c223a73f59e..d411eba3974 100644 --- a/dbms/tests/integration/test_cluster_copier/test.py +++ b/dbms/tests/integration/test_cluster_copier/test.py @@ -15,6 +15,7 @@ from helpers.cluster import ClickHouseCluster from helpers.test_tools import TSV COPYING_FAIL_PROBABILITY = 0.33 +MOVING_FAIL_PROBABILITY = 0.33 cluster = None @@ -124,7 +125,6 @@ class Task2: instance.query("INSERT INTO a_all SELECT toDate(17581 + number) AS date, number AS d FROM system.numbers LIMIT 85", settings={"insert_distributed_sync": 1}) - def check(self): assert TSV(self.cluster.instances['s0_0_0'].query("SELECT count() FROM cluster(cluster0, default, a)")) == TSV("85\n") assert TSV(self.cluster.instances['s1_0_0'].query("SELECT count(), uniqExact(date) FROM cluster(cluster1, default, b)")) == TSV("85\t85\n") @@ -260,17 +260,23 @@ def execute_task(task, cmd_options): # Tests -def test_copy1_simple(started_cluster): +def test_copy_simple(started_cluster): execute_task(Task1(started_cluster), []) -def test_copy1_with_recovering(started_cluster): +def test_copy_with_recovering(started_cluster): execute_task(Task1(started_cluster), ['--copy-fault-probability', str(COPYING_FAIL_PROBABILITY)]) +def test_copy_with_recovering_after_move_faults(started_cluster): + execute_task(Task1(started_cluster), ['--move-fault-probability', str(MOVING_FAIL_PROBABILITY)]) + def test_copy_month_to_week_partition(started_cluster): execute_task(Task2(started_cluster), []) def test_copy_month_to_week_partition_with_recovering(started_cluster): - execute_task(Task2(started_cluster), ['--copy-fault-probability', str(0.3)]) + execute_task(Task2(started_cluster), ['--copy-fault-probability', str(COPYING_FAIL_PROBABILITY)]) + +def test_copy_month_to_week_partition_with_recovering_after_move_faults(started_cluster): + execute_task(Task2(started_cluster), ['--move-fault-probability', str(MOVING_FAIL_PROBABILITY)]) def test_block_size(started_cluster): execute_task(Task_test_block_size(started_cluster), []) diff --git a/dbms/tests/integration/test_cluster_copier/trivial_test.py b/dbms/tests/integration/test_cluster_copier/trivial_test.py new file mode 100644 index 00000000000..9b71b08674c --- /dev/null +++ b/dbms/tests/integration/test_cluster_copier/trivial_test.py @@ -0,0 +1,144 @@ +import os +import os.path as p +import sys +import time +import datetime +import pytest +from contextlib import contextmanager +import docker +from kazoo.client import KazooClient + + +CURRENT_TEST_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.dirname(CURRENT_TEST_DIR)) +from helpers.cluster import ClickHouseCluster +from helpers.test_tools import TSV + +COPYING_FAIL_PROBABILITY = 0.33 +MOVING_FAIL_PROBABILITY = 0.1 +cluster = None + +@pytest.fixture(scope="module") +def started_cluster(): + global cluster + try: + clusters_schema = { + "0" : {"0" : ["0"]}, + "1" : {"0" : ["0"]} + } + + cluster = ClickHouseCluster(__file__) + + for cluster_name, shards in clusters_schema.iteritems(): + for shard_name, replicas in shards.iteritems(): + for replica_name in replicas: + name = "s{}_{}_{}".format(cluster_name, shard_name, replica_name) + cluster.add_instance(name, + config_dir="configs", + macros={"cluster": cluster_name, "shard": shard_name, "replica": replica_name}, + with_zookeeper=True) + + cluster.start() + yield cluster + + finally: + pass + cluster.shutdown() + + +class TaskTrivial: + def __init__(self, cluster): + self.cluster = cluster + self.zk_task_path="/clickhouse-copier/task_trivial" + self.copier_task_config = open(os.path.join(CURRENT_TEST_DIR, 'task_trivial.xml'), 'r').read() + + + def start(self): + source = cluster.instances['s0_0_0'] + destination = cluster.instances['s1_0_0'] + + for node in [source, destination]: + node.query("DROP DATABASE IF EXISTS default") + node.query("CREATE DATABASE IF NOT EXISTS default") + + source.query("CREATE TABLE trivial (d UInt64, d1 UInt64 MATERIALIZED d+1) " + "ENGINE=ReplicatedMergeTree('/clickhouse/tables/source_trivial_cluster/1/trivial', '1') " + "PARTITION BY d % 5 ORDER BY d SETTINGS index_granularity = 16") + + source.query("INSERT INTO trivial SELECT * FROM system.numbers LIMIT 1002", settings={"insert_distributed_sync": 1}) + + + def check(self): + source = cluster.instances['s0_0_0'] + destination = cluster.instances['s1_0_0'] + + assert TSV(source.query("SELECT count() FROM trivial")) == TSV("1002\n") + assert TSV(destination.query("SELECT count() FROM trivial")) == TSV("1002\n") + + for node in [source, destination]: + node.query("DROP TABLE trivial") + + +def execute_task(task, cmd_options): + task.start() + + zk = cluster.get_kazoo_client('zoo1') + print "Use ZooKeeper server: {}:{}".format(zk.hosts[0][0], zk.hosts[0][1]) + + zk_task_path = task.zk_task_path + zk.ensure_path(zk_task_path) + zk.create(zk_task_path + "/description", task.copier_task_config) + + # Run cluster-copier processes on each node + docker_api = docker.from_env().api + copiers_exec_ids = [] + + cmd = ['/usr/bin/clickhouse', 'copier', + '--config', '/etc/clickhouse-server/config-copier.xml', + '--task-path', zk_task_path, + '--base-dir', '/var/log/clickhouse-server/copier'] + cmd += cmd_options + + print(cmd) + + for instance_name, instance in cluster.instances.iteritems(): + container = instance.get_docker_handle() + exec_id = docker_api.exec_create(container.id, cmd, stderr=True) + docker_api.exec_start(exec_id, detach=True) + + copiers_exec_ids.append(exec_id) + print "Copier for {} ({}) has started".format(instance.name, instance.ip_address) + + # Wait for copiers stopping and check their return codes + for exec_id, instance in zip(copiers_exec_ids, cluster.instances.itervalues()): + while True: + res = docker_api.exec_inspect(exec_id) + if not res['Running']: + break + time.sleep(1) + + assert res['ExitCode'] == 0, "Instance: {} ({}). Info: {}".format(instance.name, instance.ip_address, repr(res)) + + try: + task.check() + finally: + zk.delete(zk_task_path, recursive=True) + + +# Tests + +def test_trivial_copy(started_cluster): + execute_task(TaskTrivial(started_cluster), []) + +def test_trivial_copy_with_copy_fault(started_cluster): + execute_task(TaskTrivial(started_cluster), ['--copy-fault-probability', str(COPYING_FAIL_PROBABILITY)]) + +def test_trivial_copy_with_move_fault(started_cluster): + execute_task(TaskTrivial(started_cluster), ['--move-fault-probability', str(MOVING_FAIL_PROBABILITY)]) + + +if __name__ == '__main__': + with contextmanager(started_cluster)() as cluster: + for name, instance in cluster.instances.items(): + print name, instance.ip_address + raw_input("Cluster created, press any key to destroy...") \ No newline at end of file diff --git a/dbms/tests/integration/test_http_and_readonly/__init__.py b/dbms/tests/integration/test_http_and_readonly/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/dbms/tests/integration/test_http_and_readonly/test.py b/dbms/tests/integration/test_http_and_readonly/test.py new file mode 100644 index 00000000000..ea25b787a67 --- /dev/null +++ b/dbms/tests/integration/test_http_and_readonly/test.py @@ -0,0 +1,20 @@ +import pytest +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) +instance = cluster.add_instance('instance') + + +@pytest.fixture(scope="module", autouse=True) +def setup_nodes(): + try: + cluster.start() + yield cluster + + finally: + cluster.shutdown() + + +def test_http_get_is_readonly(): + assert "Cannot execute query in readonly mode" in instance.http_query_and_get_error("CREATE TABLE xxx (a Date) ENGINE = MergeTree(a, a, 256)") + assert "Cannot modify 'readonly' setting in readonly mode" in instance.http_query_and_get_error("CREATE TABLE xxx (a Date) ENGINE = MergeTree(a, a, 256)", params={"readonly": 0}) diff --git a/dbms/tests/integration/test_random_inserts/__init__.py b/dbms/tests/integration/test_random_inserts/__init__.py new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/dbms/tests/integration/test_random_inserts/__init__.py @@ -0,0 +1 @@ + diff --git a/dbms/tests/performance/array_reduce.xml b/dbms/tests/performance/array_reduce.xml new file mode 100644 index 00000000000..7488199c149 --- /dev/null +++ b/dbms/tests/performance/array_reduce.xml @@ -0,0 +1,16 @@ + + + + + 10000 + + + + + SELECT arrayReduce('count', range(100000000)) + SELECT arrayReduce('sum', range(100000000)) + SELECT arrayReduceInRanges('count', [(1, 100000000)], range(100000000)) + SELECT arrayReduceInRanges('sum', [(1, 100000000)], range(100000000)) + SELECT arrayReduceInRanges('count', arrayZip(range(1000000), range(1000000)), range(100000000))[123456] + SELECT arrayReduceInRanges('sum', arrayZip(range(1000000), range(1000000)), range(100000000))[123456] + diff --git a/dbms/tests/performance/set_index.xml b/dbms/tests/performance/set_index.xml index e5848b08124..090d8ac8c08 100644 --- a/dbms/tests/performance/set_index.xml +++ b/dbms/tests/performance/set_index.xml @@ -13,8 +13,19 @@ - + SELECT count() FROM test_in WHERE a IN (SELECT rand(1) FROM zeros(100000)) SETTINGS max_rows_to_read = 1, read_overflow_mode = 'break' + + SELECT count() FROM numbers(1000) WHERE toString(number) IN ('41577', '83972', '51697', '50014', '37553', '93459', '87438', '95971', '83186', '74326', '67871', '50406', '83678', '29655', '18580', '83905', '61518', '29059', '56700', '82787', '98672', '30884', '81822', '39850', '80852', '57627', '91346', '64522', '17781', '49467', '41099', '41929', '85618', '91389', '68564', '91769', '81219', '52218', '37220', '97097', '2129', '9886', '52049', '34847', '25364', '36429', '76897', '71868', '58121', '71199', '84819', '69991', '34046', '64507', '34892', '24228', '36986', '28588', '51159', '53444', '80531', '9941', '20256', '48103', '32565', '62890', '5379', '60302', '46434', '3205', '18821', '31030', '19794', '71557', '71703', '15024', '14004', '82164', '95659', '40227', '83358', '24395', '9610', '19814', '48491', '66412', '16012', '71586', '42143', '51103', '24463', '89949', '35694', '39193', '63904', '40489', '77144', '94014', '84836', '9980', '46554', '43905', '25588', '25205', '72624', '10249', '35888', '98478', '99030', '26834', '31', '81499', '14847', '82997', '92357', '92893', '17426', '56630', '22252', '68119', '62710', '8740', '82144', '79916', '23391', '30192', '99271', '96435', '44237', '98327', '69481', '16691', '13643', '84554', '38571', '70926', '99283', '79000', '20926', '86495', '4834', '1222', '39486', '57697', '58002', '40790', '15623', '3999', '31515', '12694', '26143', '35951', '54085', '97534', '35329', '73535', '88715', '29572', '75799', '45166', '32066', '48023', '69523', '93150', '8740', '96790', '15534', '63252', '5142', '67045', '93992', '16663', '292', '63924', '6588', '12190', '31506', '69590', '35394', '55168', '65223', '79183', '32600', '69676', '28316', '72111', '53531', '15073', '41127', '73451', '24725', '61647', '65315', '41143', '26493', '95608', '34407', '76098', '53105', '83691', '48755', '35696', '62587', '81826', '3963', '45766', '82751', '12430', '97685', '29919', '78155', '71636', '50215', '89734', '9892', '47151', '54855', '3428', '9712', '52592', '2403', '79602', '81243', '79859', '57361', '82000', '42107', '28860', '99591', '28296', '57337', '64969', '32332', '25535', '30924', '21313', '32554', '17342', '87311', '19825', '24898', '61323', '83209', '79322', '79009', '50746', '33396', '62033', '16548', '17427', '24073', '34640', '52368', '4724', '80408', '40', '33787', '16666', '19665', '86751', '27264', '2241', '88134', '53566', '10589', '79711', '92823', '58972', '91767', '60885', '51659', '7867', '96849', '30360', '20914', '9584', '1250', '22871', '23282', '99312', '4683', '33429', '68361', '82614', '81440', '47863', '69790', '11968', '75210', '66854', '37002', '61142', '71514', '1588', '42336', '11069', '26291', '2261', '71056', '13492', '9133', '91216', '72207', '71586', '86535', '83898', '24392', '45384', '48545', '61972', '503', '80180', '35834', '97025', '70411', '55039', '35430', '27631', '82533', '96831', '74077', '42533', '14451', '26943', '53783', '69489', '71969', '8432', '37230', '61348', '19472', '59115', '9886', '50951', '57109', '7141', '1902', '84130', '4323', '55889', '47784', '2220', '75988', '66988', '63721', '8131', '95601', '95207', '2311', '26541', '50991', '6717', '2969', '71857', '51034', '65958', '94716', '90275', '21012', '46859', '7984', '31131', '46457', '69578', '44540', '7294', '80117', '9925', '60155', '90608', '82684', '32193', '87071', '28006', '87604', '24501', '79087', '2848', '29237', '11221', '81319', '40966', '87641', '35325', '78705', '88636', '78717', '62831', '56390', '99271', '43821', '14453', '17923', '62695', '77322', '21038', '67677', '41271', '4376', '65426', '46091', '19887', '97251', '55583', '58763', '3826', '35037', '73533', '64267', '82319', '9836', '42622', '96829', '16363', '10455', '49290', '99992', '98229', '66356', '59087', '73998', '25986', '4279', '56790', '69540', '588', '36620', '60358', '45056', '89297', '42740', '8323', '19245', '82417', '41431', '699', '11554', '73910', '44491', '56019', '68901', '45816', '68126', '89379', '23885', '13263', '56395', '73130', '19089', '23771', '10335', '48547', '16903', '6453', '33560', '89668', '38159', '43177', '90655', '49712', '62', '66920', '34180', '12150', '48564', '39538', '85026', '87195', '14928', '8956', '71157', '53287', '39161', '67583', '83309', '92054', '86977', '56188', '15229', '88170', '60894', '58497', '89254', '40082', '86890', '60161', '97291', '45878', '23368', '14577', '92870', '37017', '97356', '99426', '76061', '89186', '99751', '85153', '61580', '39360', '90107', '25603', '26798', '76224', '6469', '7912', '69838', '16404', '67497', '28965', '80836', '80365', '91249', '48713', '17113', '33090', '40793', '70450', '66689', '83698', '17802', '43869', '13355', '18959', '79411', '87930', '9265', '37504', '44876', '97234', '94149', '35040', '22049', '49248', '6535', '36080', '28346', '94437', '78319', '17961', '89056', '56161', '35810', '41632', '45494', '53351', '89729', '99510', '51584', '59688', '6193', '70809', '51093', '92589', '90247', '34910', '78235', '17362', '49423', '63324', '525', '37638', '72325', '89356', '15298', '59116', '17848', '65429', '27029', '84781', '70247', '8825', '35082', '70451', '22522', '58125', '91879', '90531', '2478', '463', '37902', '54405', '87267', '72688', '22803', '33134', '35177', '84551', '44974', '88375', '76407', '27774', '33849', '19915', '82014', '80434', '26380', '48777', '53811', '14838', '26829', '56441', '99869', '49574', '85476', '19723', '16907', '4018', '37338', '78510', '47912', '13030', '65277', '95716', '67363', '21393', '89887', '78842', '81650', '903', '17436', '30704', '49223', '27198', '25500', '52214', '54258', '70082', '53950', '49312', '43615', '99473', '94348', '53661', '96213', '96346', '62010', '38268', '32861', '75660', '10392', '89491', '68335', '29817', '88706', '24184', '36298', '43440', '21626', '26535', '44560', '46363', '12534', '99070', '95606', '33714', '73070', '8303', '29853', '23014', '99982', '4530', '14955', '45803', '50', '90750', '30394', '81276', '95563', '47314', '58520', '91299', '88944', '54402', '67405', '29253', '47079', '71734', '99728', '17652', '13307', '35556', '18962', '26780', '17771', '53712', '60055', '37628', '35830', '90739', '61151', '41309', '27652', '3051', '53167', '98417', '19382', '36833', '75085', '65374', '87732', '30352', '31776', '32765', '97565', '92199', '49050', '29503', '51024', '18834', '8515', '24069', '96216', '10777', '90680', '18974', '68884', '85305', '36007', '56707', '4212', '47352', '34426', '13185', '92939', '95782', '70577', '58080', '98279', '3906', '5065', '56896', '16382', '31273', '17117', '98602', '12786', '24086', '63970', '72756', '35798', '82367', '7356', '53398', '68503', '2962', '16425', '67334', '68461', '65439', '15620', '70906', '29649', '46461', '74602', '38012', '71714', '16825', '89480', '53386', '88532', '35104', '28556', '82120', '23155', '23347', '24797', '60061', '54962', '99427', '82248', '82447', '39968', '63727', '27431', '81511', '91168', '71425', '80740', '84127', '40717', '15503', '15419', '46594', '61263', '19212', '53175', '70724', '74445', '23034', '71818', '40246', '18886', '53066', '4880', '83701', '86107', '87862', '44751', '392', '73440', '90291', '93395', '20894', '38463', '32664', '55158', '20090', '50004', '79070', '98471', '85478', '96615', '68149', '78334', '97752', '73207', '71678', '91238', '96757', '82598', '194', '35797', '45120', '60782', '28721', '17676', '78066', '60957', '11826', '51563', '50516', '16485', '47053', '31738', '48923', '23554', '96850', '42033', '73701', '78607', '45979', '54571', '12415', '31693', '15356', '36902', '9126', '3767', '3295', '90402', '24005', '95350', '67033', '49137', '72606', '51899', '17522', '31957', '44641', '53982', '23767', '68257', '15766', '19995', '2107', '48788', '11765', '91055', '46576', '54651', '50381', '62827', '73636', '46606', '98753', '37631', '70441', '87916', '66983', '33870', '31125', '12904', '57040', '4874', '58632', '42037', '18782', '5998', '18974', '57949', '81010', '90407', '99874', '20462', '89949', '10952', '71454', '95130', '46115', '3518', '13384', '69039', '79482', '22076', '59782', '32042', '40930', '60243', '29298', '6790', '46985', '44398', '85631', '14380', '66179', '2629', '32126', '49833', '14118', '58492', '31493', '81172', '96638', '8745', '89663', '76842', '78633', '41373', '83721', '42886', '11123', '32739', '11051', '1303', '92314', '83324', '85600', '44276', '69064', '56125', '84650', '31028', '12628', '14502', '64764', '39405', '44855', '79046', '51716', '46824', '83389', '1941', '1257', '9280', '73176', '84729', '2579', '63366', '22606', '35541', '51096', '13447', '18355', '68037', '28436', '94116', '81070', '78355', '67897', '5296', '32742', '77645', '91853', '18767', '67949', '40963', '5792', '17278', '25597', '41884', '80829', '7099', '18645', '60295', '12082', '81800', '78415', '18082', '38789', '16295', '72377', '74949', '55583', '66853', '15402', '72977', '15123', '99434', '34999', '21687', '76049', '42987', '83748', '88256', '66688', '21766', '20304', '29271', '10069', '19822', '11792', '42526', '74143', '17289', '30253', '6367', '20888', '12975', '94073', '98639', '30134', '26320', '65507', '69002', '53120', '4550', '38893', '18954', '38283', '54863', '17698', '99670', '10521', '92467', '60994', '18052', '48673', '35811', '87282', '62706', '16061', '53112', '22652', '37780', '55662', '26331', '49410', '79074', '10623', '69577', '79613', '9491', '31229', '43922', '84231', '58409', '36386', '46875', '74431', '76735', '38776', '23350', '7314', '9079', '51519', '98544', '70216', '63380', '90381', '1295', '46901', '58225', '55339', '89918', '75522', '35431', '89460', '49552', '89302', '23068', '28493', '3042', '25194', '59520', '9810', '95706', '81297', '89638', '54794', '94527', '45262', '97932', '78685', '6947', '22818', '48700', '9153', '12289', '22011', '58825', '93854', '65438', '4509', '33741', '28208', '69061', '48578', '40247', '77725', '31837', '39003', '69363', '78113', '76398', '97262', '67795', + '68446', '58896', '60969', '19849', '6722', '91854', '49519', '13949', '67109', '48824', '31723', '75554', '69575', '94986', '75350', '18628', '15284', '41943', '15433', '52607', '41', '22340', '29528', '24059', '34145', '72517', '46316', '10667', '54510', '19882', '47764', '69124', '41963', '84350', '48420', '4646', '24958', '69020', '97121', '26178', '62664', '50622', '32554', '49655', '45398', '11267', '72222', '73363', '89554', '89046', '57384', '29259', '37888', '24850', '74353', '57343', '34762', '2900', '11393', '42154', '94306', '70552', '75265', '921', '26003', '64352', '89857', '83171', '58249', '48940', '53512', '66335', '44865', '68729', '19299', '58003', '39854', '99122', '3860', '80173', '52242', '90966', '53183', '71982', '82325', '87842', '15000', '55627', '71132', '6354', '42402', '91719', '91644', '94533', '74925', '66278', '66911', '85576', '40495', '70919', '71797', '87835', '29845', '71832', '3390', '7994', '33499', '70715', '54897', '82710', '63077', '78105', '24758', '89585', '84607', '46477', '78618', '10989', '39222', '98749', '51685', '94664', '31008', '32823', '89521', '72160', '26952', '4001', '21421', '5737', '74027', '88179', '45553', '83743', '19913', '49435', '65616', '82641', '5149', '76959', '40681', '73023', '2670', '30845', '18863', '35094', '88400', '80963', '9154', '16571', '64192', '59694', '41317', '59942', '58856', '99281', '67260', '66971', '22716', '76089', '58047', '67071', '53707', '462', '52518', '72277', '10681', '69', '98855', '12593', '88842', '67242', '73543', '37439', '18413', '67211', '93495', '45576', '70614', '27988', '53210', '18618', '21318', '68059', '25518', '55917', '56522', '16548', '2404', '93538', '61452', '66358', '3709', '23914', '92426', '81439', '38070', '28988', '29939', '2948', '85720', '45628', '51101', '89431', '86365', '17571', '50987', '83849', '11015', '83812', '66187', '26362', '66786', '22024', '93866', '36161', '90080', '64874', '37294', '83860', '73821', '80279', '36766', '73117', '44620', '84556', '42070', '90383', '27862', '20665', '67576', '34997', '57958', '80638', '84351', '63961', '1362', '14338', '80377', '24192', '41294', '57368', '51189', '27287', '45764', '86289', '65600', '708', '84090', '96005', '55676', '84855', '72385', '70018', '9336', '82701', '3710', '52083', '74045', '96454', '30956', '67369', '78941', '81810', '71906', '23194', '33042', '50794', '61256', '24449', '48639', '22916', '78303', '13666', '40762', '43942', '51075', '89783', '95786', '90462', '6181', '36482', '40675', '4970', '6388', '91849', '72579', '94983', '86084', '20140', '68427', '48123', '43122', '98066', '37560', '6927', '72803', '5546', '62259', '98439', '6457', '98568', '70499', '33022', '28226', '29675', '20917', '75365', '20900', '8190', '56736', '99153', '77779', '49333', '50293', '97650', '4067', '47278', '42761', '71875', '13966', '11223', '46783', '18059', '61355', '29638', '75681', '24466', '89634', '20759', '83252', '37780', '15931', '74893', '6703', '64524', '80656', '85990', '78427', '18411', '20696', '86432', '93176', '69889', '15072', '15180', '9935', '10467', '60248', '42430', '62590', '89596', '27743', '26398', '79912', '60048', '50943', '38870', '69383', '72261', '98059', '55242', '74905', '5667', '54321', '70415', '39903', '49711', '85318', '79979', '59262', '82321', '15263', '17416', '74554', '94733', '72112', '49872', '54849', '73883', '78250', '74935', '68559', '57564', '50541', '45730', '41595', '5588', '83723', '42891', '11898', '14348', '99732', '14481', '85233', '21277', '94508', '52551', '74187', '7634', '42912', '25100', '43536', '35798', '48190', '86477', '22680', '48148', '59501', '56563', '16802', '81496', '97568', '68657', '51462', '67953', '99660', '39002', '54170', '57190', '68086', '52700', '6487', '55709', '70418', '62629', '70420', '35695', '36152', '45360', '53503', '46623', '76000', '50648', '97876', '44815', '29163', '1356', '64123', '71388', '17658', '99084', '58727', '59437', '38773', '71254', '81286', '97545', '18786', '56834', '20346', '36401', '62316', '58082', '67959', '99876', '69895', '80099', '62747', '20517', '99777', '6472', '49189', '31321', '39992', '68073', '13378', '51806', '21776', '52060', '96983', '25754', '93709', '96627', '8644', '93726', '14002', '37716', '87620', '34507', '76339', '24491', '5849', '44110', '522', '66521', '12776', '44887', '80535', '14548', '75248', '671', '73071', '35715', '59474', '7061', '82243', '56170', '20179', '59717', '1725', '24634', '11270', '77023', '63840', '46608', '44667', '22422', '59771', '94768', '73033', '82905', '16463', '40971', '22204', '58366', '28721', '14907', '76468', '81872', '38418', '36989', '61439', '10610', '131', '44296', '35453', '10117', '75856', '94603', '99602', '68075', '35949', '13599', '50030', '69633', '55956', '85465', '16429', '86081', '11145', '6195', '82207', '90598', '92814', '23725', '83204', '80346', '71542', '46634', '15820', '54123', '45397', '15322', '61743', '9273', '71347', '6835', '64006', '91718', '43677', '32923', '21486', '17098', '61694', '43347', '40019', '4071', '52443', '42386', '56839', '83514', '27633', '40780', '51749', '92101', '62384', '92206', '56044', '66174', '11137', '73966', '78471', '30468', '31643', '33197', '6888', '8066', '86603', '74383', '6098', '54411', '98819', '89862', '88639', '94422', '89371', '80526', '91747', '91220', '64944', '76658', '42046', '58518', '27249', '6646', '3028', '1346', '33763', '9734', '31737', '65527', '5892', '60813', '3410', '35464', '43009', '98382', '70580', '93898', '56404', '32995', '62771', '71556', '40538', '55612', '45656', '10758', '20268', '33603', '38310', '14242', '74397', '10722', '71575', '22590', '49043', '91439', '9055', '23668', '9101', '5268', '64133', '77501', '64684', '11337', '47575', '50732', '88680', '93730', '46785', '17589', '3520', '57595', '71241', '34994', '8753', '36147', '88844', '41914', '11250', '94632', '71927', '4624', '86279', '7664', '2659', '94853', '65386', '30438', '86005', '92883', '84629', '59910', '44484', '1306', '8404', '56962', '29990', '38445', '96191', '73013', '66590', '40951', '24712', '18825', '37268', '87843', '18972', '12154', '7779', '52149', '76152', '65799', '86011', '35475', '78083', '88232', '91551', '65532', '93516', '73827', '24227', '44687', '55759', '83819', '45088', '10856', '60488', '39051', '14103', '76650', '81181', '46731', '737', '58788', '78945', '42096', '66731', '66740', '72273', '88969', '5655', '86590', '41096', '80038', '32430', '51877', '23970', '91900', '13082', '45880', '94367', '19739', '61998', '71665', '16083', '57035', '26916', '10166', '18834', '46798', '66881', '28444', '68840', '10459', '81087', '4728', '76224', '39257', '23470', '93524', '37345', '30074', '49856', '22022', '55279', '5159', '5193', '58030', '57539', '12514', '49759', '96222', '52597', '67192', '88187', '53614', '16084', '79915', '28212', '79334', '85283', '32306', '31058', '43113', '74707', '74869', '2213', '32134', '6379', '85426', '87098', '35984', '51105', '69287', '16803', '83337', '14913', '62531', '58098', '7914', '20105', '28850', '1384', '43173', '62983', '87113', '76066', '86320', '77684', '45191', '95225', '41503', '36713', '48404', '91228', '53865', '98981', '59161', '61237', '84561', '17455', '14379', '57789', '80895', '99260', '84595', '72942', '53220', '84448', '81332', '49437', '83086', '93414', '54519', '52288', '74772', '22460', '49324', '11168', '96071', '61985', '38284', '6405', '54698', '71727', '60093', '37340', '87884', '83403', '4542', '94949', '19636', '15855', '39105', '10424', '67418', '91022', '69254', '8481', '38411', '3832', '44354', '93548', '57172', '28481', '372', '81497', '52179', '41060', '72141', '41396', '65590', '70432', '82819', '93814', '26118', '84780', '88485', '70821', '8222', '83000', '47067', '38516', '33347', '47681', '48202', '60749', '52112', '7937', '28105', '11394', '45746', '43252', '34494', '2979', '69715', '42486', '82315', '71760', '97413', '66137', '94487', '7429', '74434', '22964', '55251', '3448', '53534', '2574', '9693', '96157', '2955', '4348', '19566', '56930', '83319', '31310', '53905', '1148', '41726', '22233', '76045', '37351', '10545', '17581', '28047', '30199', '4741', '58111', '33497', '67796', '67730', '31247', '43772', '29461', '45970', '73353', '22534', '53962', '32147', '71392', '62579', '66345', '58246', '33442', '9581', '29705', '14058', '86471', '76125', '59363', '94982', '74810', '89149', '20066', '3366', '3568', '25752', '80036', '64119', '27270', '40061', '91052', '69022', '9852', '77112', '83075', '43924', '61661', '56133', '96652', '57944', '72576', '82170', '79236', '55745', '15309', '88878', '72761', '37647', '67465', '12777', '97309', '93202', '41470', '8787', '64920', '48514', '18917', '35157', '59151', '4640', '5317', '38134', '76548', '82788', '9214', '58418', '73185', '90554', '10543', '47182', '62936', '91765', '89751', '68931', '48865', '64607', '7150', '77862', '14297', '14828', '33013', '91698', '67593', '98096', '16595', '51639', '86531', '24719', '1703', '78788', '43810', '38918', '95491', '99903', '82671', '8291', '68288', '31224', '39863', '4265', '77798', '7698', '33804', '92286', '4744', '37038', '44203', '98212', '17369', '77442', '62879', '4145', '96881', '15646', '36824', '19959', '45451', '76049', '54272', '97577', '95298', '81115', '30204', '82041', '8037', '10052', '8756', '76833', '82851', '24276', '75574', '36037', '78079', '92807', '29064', '90000', '84150', '17102', '75092', '49424', '35597', '4693', '82853', '42511', '16119', '23478', '65240', '55585', '91762', '71671', '46682', '72479', '97696', '24615', '12579', '30274', '48255', '2336', '90202', '5808', '45426', '76308', '74639', '31245', '99894', '89638', '6233', '33893', '71899', '85273', '89429', '29761', '50231', '57249', '99347', '22642', '66972', '86221', '47514', '88274', '10819', '73150', '53754', '13304', '20478', '38099', '619', '14669', '8011', '97657', '26569', '65430', '13467', '38180', '23675', '72350', '42257', '39875', '23529', '53407', '11833', + '29599', '95621', '7727', '59527', '86846', '22860', '5358', '3730', '87555', '362', '95755', '54565', '29935', '68950', '52349', '98344', '86576', '7420', '12236', '15844', '48099', '97535', '97081', '50261', '31187', '60496', '24123', '24042', '6376', '6679', '99806', '20306', '60676', '36881', '77309', '5247', '96569', '53417', '73252', '64179', '35318', '75732', '65119', '32621', '40464', '22887', '96152', '65161', '83381', '8915', '68142', '7328', '85031', '15688', '72519', '93992', '86927', '75538', '38205', '50877', '70039', '97538', '94822', '52131', '49643', '85206', '1347', '14574', '88736', '53442', '49991', '64925', '72283', '82213', '60905', '36118', '62963', '16983', '79185', '15111', '26059', '17792', '98218', '33214', '1094', '41754', '77275', '65173', '13190', '91004', '90422', '44387', '92672', '98641', '54609', '83295', '37395', '70104', '32986', '72524', '82478', '5837', '83916', '52736', '57112', '55985', '42642', '42136', '89642', '35712', '49489', '19726', '65824', '24384', '48112', '15366', '99206', '68384', '51389', '529', '21475', '75749', '95182', '60110', '70571', '74174', '38105', '78107', '4101', '8982', '11215', '23987', '3303', '28706', '54629', '98000', '67510', '30036', '99140', '48896', '40971', '7735', '79984', '50134', '94928', '57023', '52880', '83067', '41940', '62994', '89213', '38593', '19283', '68206', '22234', '19245', '26266', '32403', '65889', '17022', '64280', '42797', '27161', '57675', '42313', '93606', '93082', '20659', '90824', '1226', '66266', '12503', '57104', '15247', '51160', '92398', '71967', '59476', '44465', '35765', '10787', '47737', '45792', '2292', '47599', '89612', '8162', '87622', '69410', '45727', '31158', '99791', '89544', '27214', '99588', '40516', '75616', '36505', '46079', '95448', '97999', '47462', '47799', '82729', '34038', '60789', '96938', '22682', '79062', '93307', '36038', '49016', '90983', '48219', '50889', '32517', '72219', '71229', '82643', '1195', '70543', '17', '22178', '23544', '72371', '1163', '28527', '7336', '39846', '31956', '80963', '41804', '59791', '41831', '1940', '52377', '79494', '12531', '81112', '44320', '18746', '5774', '63869', '4085', '59922', '12751', '99443', '13530', '23872', '36026', '83360', '32711', '92980', '11140', '99323', '57263', '98149', '29265', '25548', '65995', '4818', '15593', '8535', '37863', '12217', '14474', '66584', '89272', '86690', '58777', '39666', '44756', '18442', '52586', '98030', '40850', '38708', '49304', '68923', '65008', '84388', '83639', '29866', '63675', '26793', '49227', '82099', '24090', '57535', '24201', '65776', '74054', '89833', '62979', '26613', '5851', '99766', '63484', '66605', '37179', '90760', '59336', '58390', '93239', '84578', '11396', '93994', '73818', '23972', '37720', '72369', '25063', '32952', '71036', '76612', '31285', '34090', '19136', '53783', '66436', '61478', '96749', '43658', '7399', '31574', '67073', '40480', '20727', '70993', '65549', '30800', '21507', '53785', '89574', '86381', '56492', '62603', '44856', '68687', '63794', '70996', '7475', '84238', '71939', '86886', '94792', '15036', '36936', '95722', '17771', '67850', '33371', '49314', '40744', '5432', '81057', '41201', '75986', '22961', '15323', '1570', '18657', '95219', '19130', '53127', '15867', '81135', '73206', '76668', '36386', '48828', '31417', '56916', '70891', '60534', '95777', '10022', '94053', '2928', '56326', '16559', '79656', '6414', '81247', '78270', '55687', '19151', '61597', '99857', '81142', '27725', '53493', '12185', '1455', '48501', '59425', '20591', '24900', '66079', '84889', '32024', '18919', '2043', '7076', '71201', '88258', '86521', '93348', '26395', '39646', '44145', '33911', '46231', '67054', '39979', '11630', '23020', '76278', '88056', '11480', '4723', '78612', '70211', '60622', '84687', '59092', '65675', '38479', '64399', '64699', '95964', '42764', '69060', '28189', '4193', '95805', '75462', '17245', '59640', '94773', '84292', '53092', '98507', '61353', '32483', '53027', '48912', '87221', '47788', '59263', '65196', '35567', '17494', '64253', '50223', '7057', '87467', '62414', '2523', '50910', '72353', '78986', '78104', '47719', '29108', '12957', '5114', '64435', '66707', '37449', '70399', '45334', '71606', '55338', '55072', '58765', '12151', '22012', '16954', '87366', '14240', '98041', '72296', '47408', '56879', '99584', '63172', '92316', '28071', '29880', '19608', '13839', '87484', '56541', '88662', '87098', '72124', '78282', '27653', '38993', '31870', '67239', '99445', '7376', '78487', '98880', '12180', '86773', '67773', '15416', '58172', '13075', '67559', '97510', '29705', '86985', '57024', '11827', '31236', '91920', '26116', '94614', '14486', '46252', '78847', '43786', '70048', '96739', '35240', '39933', '58209', '27852', '65669', '47323', '58150', '84444', '44344', '95882', '41258', '31314', '69060', '19916', '6979', '19436', '45572', '16259', '74566', '6306', '24705', '53422', '593', '97031', '22308', '26875', '23042', '78035', '34229', '61976', '23175', '50072', '90896', '50810', '71730', '86468', '94807', '8218', '36032', '58628', '60560', '51206', '37943', '27987', '15014', '49905', '70018', '66799', '80851', '23594', '29982', '6438', '97381', '47715', '96294', '17985', '48545', '12672', '5250', '9988', '24601', '3736', '97815', '54363', '64703', '44167', '68376', '16595', '38073', '29630', '59630', '1858', '71823', '75580', '70083', '14493', '93821', '93394', '85369', '3818', '8435', '59988', '43966', '13961', '15855', '83332', '80312', '27299', '88840', '76964', '56173', '62794', '79389', '82642', '85843', '47116', '43064', '16061', '28905', '54415', '72832', '91252', '93488', '79457', '99336', '70744', '80432', '6487', '880', '87701', '154', '86574', '86677', '17892', '81488', '95260', '12515', '43189', '9211', '55403', '41417', '60046', '54785', '83655', '28274', '65745', '63062', '44549', '36391', '48051', '7328', '3572', '33226', '49177', '25123', '59065', '19691', '15109', '10172', '95578', '29497', '48152', '20276', '36270', '78866', '48309', '53209', '55475', '30073', '19717', '16004', '45692', '83430', '9291', '45935', '57030', '92613', '91656', '67697', '34915', '28156', '56594', '3273', '11194', '98270', '34370', '2621', '66679', '97451', '97717', '87923', '48310', '37725', '69743', '75103', '84956', '75163', '16069', '65304', '19397', '18071', '27273', '49823', '57595', '98324', '82174', '10293', '80943', '64184', '19472', '4198', '9410', '25927', '65961', '33155', '95168', '33692', '61712', '69877', '13308', '17415', '10022', '2491', '67310', '96140', '68050', '76272', '17143', '76805', '57176', '7539', '22690', '95483', '87592', '27221', '90821', '51154', '99828', '68998', '54581', '74222', '10269', '65057', '45467', '96089', '55058', '89779', '60837', '74122', '52886', '58055', '14880', '93208', '66652', '68830', '24121', '62407', '87257', '18802', '14925', '45423', '98624', '55195', '59072', '41414', '77840', '66075', '62705', '26549', '19063', '57552', '2507', '52069', '57620', '66688', '14833', '33700', '90666', '98052', '5367', '2268', '43093', '69063', '22030', '85564', '92258', '1847', '24446', '65835', '38660', '91899', '87732', '52396', '31952', '36000', '86944', '16109', '80729', '53757', '60226', '59103', '84187', '36674', '72823', '29884', '4654', '69139', '20440', '57413', '3651', '39639', '44564', '57492', '84159', '751', '99748', '9659', '72661', '39220', '99742', '74734', '75729', '38071', '69934', '73640', '65294', '54524', '64372', '37927', '17187', '7863', '12732', '40296', '36197', '15821', '76831', '4400', '71933', '4040', '22072', '33064', '25702', '13324', '91275', '27388', '97729', '14620', '45989', '80737', '17934', '4219', '3032', '43457', '31051', '24469', '67041', '29328', '75499', '80951', '88212', '92595', '49969', '24612', '58732', '2718', '3805', '50918', '99426', '8614', '35580', '93273', '989', '24385', '41185', '25687', '47146', '25227', '95839', '56355', '98536', '79824', '31725', '46447', '26690', '68418', '47783', '33725', '21729', '70797', '59038', '60376', '25087', '68332', '67950', '12411', '95918', '64736', '65336', '74947', '64605', '4106', '42712', '96640', '28492', '28648', '42429', '821', '24333', '69677', '38959', '23484', '92005', '29352', '29159', '52873', '99947', '21834', '85347', '93479', '28298', '55608', '3226', '69714', '80283', '6577', '18849', '44605', '75286', '28139', '26541', '12867', '57500', '86617', '33005', '57498', '60223', '74954', '51401', '55246', '5648', '16513', '40930', '43821', '32090', '66002', '65530', '76083', '6047', '6879', '94987', '80787', '11688', '77161', '92670', '6696', '400', '28572', '47234', '51375', '88518', '762', '92617', '54260', '7560', '60180', '43331', '64059', '27616', '75839', '21392', '47756', '46254', '19486', '88533', '30130', '93694', '8557', '66534', '94447', '16910', '6480', '77440', '24366', '6195', '48946', '28597', '44429', '50300', '73556', '40638', '98709', '94413', '15987', '43860', '64871', '93953', '34506', '7296', '31753', '30626', '77510', '39829', '25696', '39776', '69185', '36540', '65413', '31528', '43446', '73532', '49776', '30282', '30004', '26725', '15200', '33958', '90320', '71836', '48051', '31970', '5326', '96194', '69695', '60898', '60945', '18271', '50868', '61468', '23593', '68985', '20628', '58044', '8942', '34849', '7384', '50500', '62895', '78780', '48946', '65278', '4067', '973', '34761', '15512', '73739', '23138', '47322', '55568', '32259', '71816', '49277', '75218', '76104', '19579', '68312', '67904', '33886', '53888', '26421', '43859', '40291', '39068', '31711', '36542', '10195', '39781', '72352', '13188', '34113', '9428', '60443', '4987', '13783', '80744', '63483', '18266', '11961', '87167', '46987', '28480', '74214', '39191', '8146', '38090', '75727', '79245', '47720', '52547', '45321', '4972', '49701', '74354', '69672', '63455', '41902', '5667', '54166', '4962', '25873', '44509', '73332', '73383', '29438', '21455', '12320', '11997', '16921', '49379', '63027', '86175', '8110', '76149', '2520', '11256', '25863', '50518', '69001', + '79113', '9447', '91840', '5242', '10998', '46496', '2448', '56058', '20970', '10517', '17783', '25723', '97137', '62840', '1264', '78691', '81020', '55335', '48524', '2088', '90413', '76651', '26855', '16177', '14954', '62914', '21344', '5708', '75560', '39311', '95865', '28783', '64902', '95657', '46276', '33426', '4799', '11588', '57513', '73689', '77677', '63011', '97795', '34954', '76866', '32043', '32697', '26643', '36890', '53476', '3011', '13963', '49551', '87671', '67761', '17488', '94770', '50599', '33272', '23091', '38079', '41177', '22395', '91656', '79679', '38687', '57384', '80118', '42507', '4098', '78949', '45669', '48802', '83915', '78292', '4369', '57657', '49146', '45192', '98491', '72457', '46331', '207', '81601', '7409', '70856', '91605', '70295', '9171', '72293', '32997', '78025', '16795', '73534', '68780', '21284', '31767', '94381', '86439', '12420', '53285', '99563', '60502', '67954', '55012', '99809', '5431', '69978', '99712', '14401', '79498', '4495', '3045', '528', '72542', '91604', '72725', '39378', '80378', '41996', '20138', '54545', '59730', '36951', '45157', '37964', '97690', '12184', '4944', '53803', '93605', '60851', '68938', '46285', '89663', '90309', '6907', '87239', '81791', '83292', '90013', '68927', '14725', '81840', '63836', '52068', '43830', '4794', '931', '59255', '8263', '99057', '94401', '69033', '7437', '20364', '92884', '28193', '43932', '37629', '59426', '18891', '8583', '79551', '87242', '1483', '6725', '65786', '16844', '12650', '99305', '42841', '9811', '18800', '39313', '51373', '31874', '84558', '27831', '48614', '48975', '55509', '83363', '31854', '64001', '94028', '76125', '79314', '24893', '81132', '9441', '86015', '28356', '40358', '10160', '23328', '7330', '76538', '37611', '89351', '84132', '97047', '26109', '95222', '35130', '75600', '88602', '15073', '87835', '71649', '28948', '81615', '37498', '28674', '59776', '44095', '65924', '64368', '94536', '12518', '61711', '55619', '82949', '4114', '21540', '70544', '28022', '79983', '28781', '7749', '97873', '4951', '50076', '47611', '99522', '56820', '38653', '49047', '36283', '83908', '72452', '85625', '10811', '36998', '44083', '34864', '44975', '39057', '4551', '68450', '24781', '1503', '9871', '46885', '11424', '21259', '54900', '97669', '85669', '6015', '2521', '37661', '14915', '57423', '91903', '94789', '32059', '64972', '4600', '61465', '27118', '79785', '13547', '49766', '38410', '68860', '63756', '23621', '64387', '46255', '63408', '11297', '41081', '56326', '58349', '98703', '72268', '73574', '32098', '42534', '91502', '38083', '11241', '56828', '12098', '25377', '37054', '56328', '30034', '26922', '68401', '93478', '63275', '62650', '81407', '773', '79499', '14970', '47217', '1187', '57428', '69980', '77764', '74791', '22107', '54363', '39247', '56028', '56982', '84244', '21464', '18716', '25533', '94589', '94768', '21537', '18436', '81135', '27654', '79713', '56630', '61571', '58453', '26758', '68450', '68449', '2994', '15347', '83954', '71823', '6428', '44210', '79597', '95144', '32871', '1991', '320', '77157', '63607', '31154', '48846', '71125', '61750', '59608', '33038', '35733', '68915', '94127', '50383', '64242', '49708', '57270', '65019', '8581', '12111', '18487', '50013', '58664', '22214', '19033', '33681', '44754', '28830', '10381', '52318', '34959', '20682', '55453', '53800', '65774', '99164', '72102', '36986', '44157', '56716', '7974', '81475', '25926', '39402', '33688', '99671', '95312', '42268', '26536', '14482', '67377', '57993', '89147', '15834', '64995', '4700', '18714', '30221', '39095', '32749', '69257', '55204', '30497', '31839', '63045', '30009', '62683', '31232', '77680', '93551', '63589', '6989', '77246', '42169', '46117', '73226', '37427', '1858', '83649', '37410', '86369', '4641', '74481', '66168', '48041', '22597', '14670', '27464', '57165', '20939', '36282', '76940', '73358', '50521', '69603', '8895', '81793', '57743', '81903', '64025', '91641', '25276', '34040', '62642', '64015', '57657', '84890', '73832', '782', '60160', '16998', '40023', '24590', '88613', '76640', '53091', '67600', '80183', '45674', '64464', '25163', '42384', '66972', '13953', '41966', '66048', '15135', '73745', '19466', '53657', '34619', '13462', '15905', '48257', '73297', '238', '93525', '80556', '5942', '5411', '66169', '9090', '95130', '74316', '57321', '48083', '62355', '68113', '15239', '36644', '80326', '65817', '54428', '61955', '58849', '77206', '16073', '98261', '92091', '39178', '35464', '85109', '85452', '21128', '25665', '81860', '44664', '24024', '56960', '95124', '39786', '18836', '11121', '44163', '81074', '79064', '46219', '94694', '44233', '81469', '24642', '15030', '21995', '13587', '40755', '6669', '81093', '74305', '1881', '55649', '37273', '80827', '98643', '46694', '59281', '79231', '42813', '84984', '7052', '98113', '17296', '84434', '31205', '46894', '71219', '74530', '44686', '70744', '91388', '20692', '96853', '73803', '15836', '18126', '49686', '4179', '47588', '87892', '65425', '68012', '97468', '92510', '99271', '58694', '11918', '37051', '18644', '57228', '14265', '57572', '57022', '52186', '30193', '93570', '87872', '5257', '26784', '6476', '61746', '68559', '1720', '26202', '16519', '27688', '10645', '87174', '60845', '73385', '82075', '6933', '98828', '56895', '17344', '84253', '36561', '51648', '24939', '63470', '31034', '95052', '51090', '51465', '87979', '68650', '30181', '29598', '19137', '43221', '81353', '90170', '96985', '61115', '17385', '92314', '80650', '55821', '17874', '84333', '93272', '48260', '87272', '22764', '59957', '51870', '85988', '39222', '77241', '62535', '28344', '6011', '80831', '64551', '46299', '75195', '71177', '8660', '58943', '57003', '3306', '74413', '74068', '15073', '89016', '93140', '13911', '57170', '19880', '41870', '9131', '57495', '73032', '86979', '60094', '87026', '30880', '4736', '86301', '92707', '21689', '83565', '71275', '47665', '65687', '71184', '89897', '32490', '97577', '38723', '79113', '37531', '97500', '94450', '15699', '58019', '84423', '27057', '56017', '97148', '47365', '30669', '33818', '80406', '99690', '33012', '95178', '46809', '48448', '79350', '9146', '99701', '98976', '71197', '44161', '75069', '36602', '79650', '97301', '12020', '56658', '25701', '46392', '78609', '63073', '69419', '57736', '20102', '42415', '79044', '20277', '56280', '47903', '94311', '25558', '40336', '91305', '90505', '66769', '64562', '83737', '62892', '10375', '71024', '19988', '56946', '76110', '21847', '43162', '50578', '46086', '54167', '61722', '53463', '63134', '69288', '12838', '14116', '71687', '50846', '59810', '24826', '84138', '82885', '91496', '98600', '82769', '40049', '4125', '50694', '1294', '2805', '29691', '82321', '76462', '85945', '115', '29188', '66918', '71340', '31585', '61638', '95472', '52978', '50622', '81990', '60955', '70519', '22270', '35610', '95871', '89222', '41038', '52546', '1163', '67943', '1793', '92010', '35755', '74509', '66665', '95759', '8568', '44299', '67822', '5806', '85839', '13895', '87675', '31357', '88014', '40026', '53050', '28951', '31992', '42495', '82892', '51567', '2869', '45808', '20238', '20781', '56098', '66307', '95701', '614', '60833', '3091', '81339', '24195', '65639', '85976', '28116', '66224', '51502', '73637', '13207', '88302', '36488', '65518', '98187', '26', '74367', '64706', '53943', '86760', '25783', '82112', '34958', '86621', '20848', '63459', '14049', '84943', '91873', '50238', '77773', '64109', '8602', '87934', '47583', '66053', '30287', '5507', '80312', '37464', '57457', '86200', '17806', '16522', '38843', '94334', '59958', '63864', '53427', '74506', '33980', '90449', '30842', '53616', '36738', '52', '13595', '53051', '13174', '60163', '71420', '73835', '67119', '79018', '42782', '45059', '952', '46360', '85879', '71552', '84741', '29746', '32577', '10041', '7208', '97528', '51256', '916', '55973', '17684', '99046', '38782', '58660', '97798', '66032', '48339', '51329', '12532', '97904', '95454', '42737', '62541', '96702', '82953', '94610', '26645', '86813', '25480', '99713', '26078', '23028', '93056', '21445', '73209', '89318', '69987', '34705', '30064', '17094', '51135', '54141', '26625', '1086', '13082', '30843', '98672', '56864', '42605', '5833', '60850', '69366', '27351', '16456', '92609', '48030', '54322', '69891', '46502', '34578', '77918', '63276', '75958', '42519', '60266', '85576', '4855', '14258', '67017', '10545', '35078', '53012', '71922', '85784', '73402', '74363', '58457', '94102', '23510', '51559', '39482', '87057', '9377', '10106', '82985', '33931', '16523', '6484', '97749', '83172', '53753', '27466', '23073', '96083', '67302', '57465', '21877', '18013', '99804', '32873', '43123', '72365', '53197', '80578', '69770', '97471', '86954', '67183', '98497', '78474', '28450', '63183', '98699', '42738', '61433', '3491', '27304', '49311', '94980', '92740', '43272', '86549', '11406', '79636', '85582', '38086', '657', '2354', '26567', '77450', '42086', '21600', '49011', '44059', '47872', '75761', '96577', '11642', '83471', '79616', '23749', '77082', '96876', '65302', '84027', '48955', '59887', '20657', '75090', '9058', '50347', '66088', '70745', '76342', '58026', '95568', '61504', '93473', '84590', '47089', '74717', '93090', '46334', '68273', '59500', '54345', '72608', '54048', '86156', '40296', '74046', '6813', '36369', '74543', '18305', '85236', '31316', '37061', '96893', '23112', '5529', '10166', '19037', '1467', '70810', '30932', '18410', '92837', '81324', '12268', '54705', '25207', '90366', '56528', '3392', '88747', '39951', '97957', '99404', '23685', '13533', '15640', '11434', '66516', '71025', '65770', '88000', '52232', '32360', '10787', '37438', '2264', '94460', '80214', '42288', '59062', '29010', '64093', '21225', '22297', '36935', '19202', '5925', '85373', '27414', '28991', '9191', '42273', '56587', '89719', '77191', '64334', '61542', '28763', '28978', '79184', '59815', '95200', '30246', '54022', '287', '91808', '66347', '50833', '15356', '78614', + '65087', '9664', '67555', '58222', '20787', '72382', '83712', '15858', '72040', '59451', '7428', '47586', '83509', '45969', '28759', '94033', '88618', '46', '1753', '28290', '71934', '99070', '52517', '65865', '15904', '68134', '87595', '39779', '99174', '13366', '50847', '69037', '77911', '19709', '84404', '24370', '18920', '1746', '28059', '4653', '6892', '25496', '48810', '82943', '7069', '44018', '1617', '56497', '27582', '29576', '47883', '8385', '54975', '96245', '77257', '31194', '34512', '19198', '50926', '50886', '91577', '49260', '49604', '58464', '18198', '90887', '15379', '74883', '36644', '63967', '34545', '20539', '12884', '6010', '98636', '94832', '47702', '98318', '6078', '42517', '97030', '93707', '39286', '10245', '66230', '99574', '74563', '81937', '22153', '10659', '67579', '85147', '69686', '32017', '8199', '20027', '64266', '60707', '55426', '22027', '13823', '81404', '86757', '3754', '197', '45469', '68736', '17656', '92453', '6784', '35531', '33538', '27558', '35825', '13471', '16377', '66978', '44601', '69943', '84635', '7335', '67725', '88064', '78201', '64380', '66771', '62221', '60427', '32028', '37857', '5491', '2757', '10537', '2199', '60244', '14726', '29734', '34433', '81241', '39778', '65831', '56153', '81696', '25113', '17371', '79022', '3587', '60439', '96582', '37801', '82496', '68242', '19561', '53140', '17171', '13165', '58750', '80612', '19818', '16753', '70009', '75290', '48846', '89851', '25190', '35525', '84348', '65298', '23161', '60583', '89611', '18798', '85422', '60713', '17660', '41915', '65757', '4781', '48374', '10712', '40330', '2409', '41020', '28042', '51857', '81224', '93917', '90366', '58848', '8012', '92070', '75349', '80066', '83228', '55170', '78376', '94127', '29418', '58660', '74006', '63909', '59502', '63255', '32318', '28904', '26117', '88103', '50656', '58517', '16372', '43392', '77876', '65997', '63501', '45927', '17444', '84021', '54886', '57082', '47456', '73816', '66900', '82958', '49722', '95843', '23458', '4560', '67276', '59080', '81486', '2967', '26133', '87694', '74183', '22100', '45306', '33895', '26512', '71426', '54994', '47367', '10171', '45681', '36268', '3166', '2179', '64197', '90037', '4641', '96073', '72989', '55123', '48825', '2862', '66974', '30115', '41554', '26727', '54025', '69504', '38284', '7816', '36370', '75764', '69774', '43208', '43598', '39461', '21655', '12169', '77790', '44578', '70959', '13500', '40823', '52952', '88095', '82193', '66424', '79814', '25651', '58125', '42724', '11752', '64533', '34827', '72755', '96727', '82066', '60268', '55535', '4230', '73018', '69602', '16912', '66088', '21859', '38654', '38638', '51444', '37999', '18595', '15209', '21801', '21130', '53741', '54954', '91590', '83660', '74071', '82627', '4311', '45268', '94735', '65747', '72428', '22621', '70828', '64394', '647', '23570', '17677', '84377', '63993', '10268', '47426', '72750', '83772', '29090', '73284', '36683', '91143', '64546', '99836', '21999', '61793', '41557', '16714', '20586', '14251', '56633', '46146', '84730', '5445', '8367', '52621', '79252', '89737', '18431', '32134', '86975', '58939', '63385', '8504', '25998', '79549', '70558', '4870', '57604', '48374', '32388', '97871', '75590', '10919', '43825', '82858', '25807', '50366', '2841', '2716', '51315', '79719', '33159', '63382', '11327', '65184', '87243', '17850', '40149', '12171', '48486', '26380', '85432', '35427', '59256', '57601', '29529', '20553', '3006', '69997', '87919', '47626', '96026', '37445', '51735', '89296', '26702', '22837', '61279', '85193', '30624', '10676', '83075', '21477', '54708', '47485', '80297', '86204', '25192', '55197', '81177', '70551', '11003', '7001', '55017', '487', '40926', '99463', '79514', '69697', '52854', '88640', '44464', '66314', '48240', '49787', '81333', '14914', '12919', '51037', '88609', '25572', '61019', '85184', '12051', '61246', '52108', '98895', '24549', '86944', '73303', '9012', '25151', '97424', '43531', '44790', '63034', '86713', '76483', '17499', '86891', '3267', '45091', '39126', '94419', '35750', '35239', '49413', '62381', '92010', '7246', '26997', '47446', '26930', '22668', '43961', '51741', '63058', '41977', '62933', '9197', '94303', '29044', '53755', '22391', '85373', '66572', '74650', '7824', '49712', '40021', '99958', '60404', '37370', '89264', '52343', '90901', '44730', '4252', '5811', '22283', '25102', '86636', '75509', '47088', '62971', '85519', '7495', '16798', '25708', '59258', '89361', '43455', '86768', '29961', '4362', '60956', '81059', '87604', '46241', '98362', '21030', '76182', '83545', '59150', '99333', '68271', '32629', '3364', '96467', '40427', '307', '84267', '239', '11711', '40933', '24518', '33854', '60291', '94179', '5564', '33196', '73818', '22201', '97078', '69360', '94513', '42623', '6510', '67378', '79468', '10394', '96430', '87701', '2667', '64162', '93266', '48941', '55345', '56127', '22704', '8793', '57008', '36920', '80845', '81203', '98715', '84158', '49194', '72718', '52919', '4951', '8715', '82384', '8570', '26733', '62399', '27297', '79038', '57916', '46155', '82381', '1027', '20541', '40580', '44836', '17336', '55548', '87454', '63549', '61401', '88819', '23326', '37546', '49089', '50707', '23099', '20724', '67184', '3394', '95941', '76045', '20523', '30393', '14157', '69381', '94104', '15406', '46707', '36234', '9136', '96805', '4904', '20310', '77164', '15400', '87198', '48310', '59729', '35230', '61503', '42015', '86910', '23264', '23542', '49105', '58334', '52855', '78865', '73516', '43820', '96593', '33168', '26170', '88241', '4016', '79862', '39617', '95329', '57881', '71750', '89690', '22519', '59367', '19825', '12638', '36100', '14355', '79540', '8411', '94571', '80462', '11953', '55629', '14598', '81066', '48968', '74149', '36938', '4564', '59157', '75517', '14309', '64905', '59893', '62803', '6968', '33003', '40894', '48816', '77710', '16692', '19135', '98381', '49397', '24048', '17804', '26829', '24046', '44546', '28174', '2639', '27957', '38625', '85902', '9908', '77666', '14096', '89851', '23600', '20717', '32860', '44070', '67853', '85907', '23761', '789', '73370', '15649', '26472', '9174', '20081', '49415', '97463', '14565', '19834', '94738', '68045', '67542', '3552', '77093', '99071', '16832', '95177', '49571', '85821', '9368', '85170', '58449', '89633', '99302', '94158', '50274', '50223', '51128', '52847', '53598', '47826', '2883', '28192', '84324', '9530', '14385', '37292', '74795', '16821', '5010', '77101', '96596', '72384', '41399', '83046', '37927', '48213', '84574', '55438', '79315', '71005', '45190', '56133', '14016', '92180', '28365', '34307', '90665', '74758', '45080', '38017', '80599', '91174', '47907', '19299', '9707', '92260', '36784', '55855', '25939', '74472', '47402', '12352', '75591', '31459', '76711', '57940', '95535', '55231', '80645', '84613', '90280', '3500', '83695', '42992', '77226', '25326', '8093', '49838', '6457', '44814', '82819', '94986', '81818', '65186', '21378', '49711', '66248', '72391', '65826', '21284', '41399', '72858', '32223', '35915', '45221', '36871', '16193', '2522', '52963', '24506', '98239', '56752', '15192', '8451', '62802', '54777', '67983', '82177', '7303', '71445', '40559', '58655', '73468', '40491', '52864', '81558', '36789', '53134', '38801', '90600', '36385', '90996', '20526', '13627', '62253', '96989', '88864', '11928', '14681', '77082', '95659', '47182', '16085', '26894', '39758', '32803', '26458', '65779', '66110', '38888', '15490', '48120', '90238', '8736', '233', '76851', '86938', '8873', '95387', '33400', '50788', '13568', '43139', '29821', '70427', '21022', '93285', '57243', '51675', '77459', '33170', '81485', '85303', '44133', '203', '44175', '89151', '26705', '32990', '10885', '10208', '58477', '97729', '699', '40581', '8065', '95864', '89797', '47506', '19160', '85728', '58599', '96271', '75849', '30736', '18808', '25828', '52011', '66179', '70244', '81312', '19570', '14287', '61078', '81922', '63361', '80858', '306', '22156', '82923', '53176', '24864', '49193', '2961', '96536', '62449', '13213', '85347', '11442', '76615', '43037', '86122', '99676', '74309', '46017', '16175', '12685', '53550', '19080', '37283', '44921', '34991', '4433', '99561', '38215', '35662', '13892', '7814', '41718', '41231', '85589', '74048', '72169', '26946', '61732', '9135', '39009', '63534', '4114', '40417', '83412', '22562', '65546', '720', '90064', '73027', '50736', '71086', '12445', '3681', '65140', '56291', '47452', '48916', '65136', '53941', '15484', '21038', '47251', '78461', '31031', '4838', '87483', '732', '16111', '68263', '4811', '65979', '44283', '51659', '29997', '11280', '3880', '12399', '63450', '93862', '50981', '62790', '76784', '76696', '40906', '49261', '35863', '43747', '65954', '36125', '73713', '98678', '13409', '38773', '59417', '9763', '429', '66203', '7350', '32754', '36079', '72447', '63925', '12958', '65292', '80270', '78432', '50925', '74946', '7649', '13689', '68001', '52318', '5804', '51584', '63637', '85697', '50929', '25279', '20963', '83038', '31199', '64189', '17152', '20459', '66108', '66005', '53159', '53971', '32528', '77145', '52981', '88941', '68593', '86343', '97770', '25625', '17598', '55249', '89640', '94162', '65874', '36511', '21906', '70401', '30914', '24085', '42945', '55597', '78393', '98120', '38283', '44967', '76077', '45739', '92432', '11846', '59131', '26322', '82651', '94792', '37726', '23301', '11275', '98813', '34229', '65440', '51369', '55580', '35207', '84314', '35696', '50231', '9399', '18679', '27219', '22519', '26725', '63451', '79357', '55915', '77027', '30354', '45890', '10745', '60035', '7914', '43562', '12219', '30220', '29382', '72520', '87475', '83634', '15163', '32468', '72904', '18200', '84666', '43560', '58483', '64613', '52170', '55490', '45954', '99323', '26401', '61210', '10450', '70360', '42906', '32851', '70022', '49966', '62331', '84249', '98093', '62146', '88171', '73246', '48314', '45730', '56348', '59081', '16642', '57872', '81564', '32305', '4158', '47263', + '97234', '74415', '36159', '30014', '22241', '77574', '27990', '67395', '81471', '18512', '47546', '23386', '6156', '72893', '15332', '57667', '92657', '35148', '45316', '90482', '93819', '38065', '74899', '10850', '63285', '50968', '88081', '42486', '56089', '43288', '11239', '55127', '26637', '85974', '93879', '78540', '42451', '35082', '93809', '63793', '51039', '13518', '20239', '26933', '19322', '26648', '83711', '93163', '95951', '77389', '43771', '36873', '66976', '38082', '59476', '53984', '6951', '42615', '80733', '1120', '80595', '10500', '67420', '38885', '8892', '36205', '17170', '46564', '66415', '36372', '68305', '41470', '38699', '60900', '23468', '6927', '498', '55896', '4005', '50692', '67984', '91012', '97314', '94177', '57676', '36734', '32671', '44733', '34981', '52186', '15599', '75642', '82652', '22773', '97106', '20691', '38085', '50368', '74916', '76281', '54002', '85721', '99186', '78438', '27865', '34827', '61315', '8817', '93105', '71539', '35484', '58033', '17540', '32806', '87253', '15780', '80123', '34241', '70383', '95515', '27998', '47682', '32682', '93658', '15116', '93030', '71866', '35516', '70161', '7556', '64122', '54622', '14312', '64375', '28863', '27886', '34040', '10010', '1460', '58765', '71496', '37785', '5616', '84850', '2194', '55514', '33636', '7138', '36937', '44763', '61308', '63574', '8069', '24109', '17821', '82144', '53309', '26183', '84238', '36684', '45285', '41353', '29380', '93726', '59560', '96422', '34218', '66851', '49001', '4855', '46849', '19877', '76540', '61415', '32053', '38801', '74623', '92808', '6660', '85031', '97706', '34417', '51085', '72292', '30903', '45126', '69978', '11572', '68622', '64123', '59344', '67118', '46014', '59248', '69321', '31897', '72232', '48016', '36455', '87125', '85356', '96888', '28316', '23149', '34823', '29944', '18522', '14045', '973', '49472', '89165', '84112', '94087', '47881', '87600', '86330', '13384', '4528', '94572', '30634', '86728', '48525', '53243', '35911', '96382', '22525', '89914', '52213', '23007', '54827', '35721', '49121', '40203', '99040', '55039', '94543', '85440', '75098', '12566', '15579', '40603', '51321', '28805', '46550', '42499', '69794', '51322', '37286', '72035', '15494', '39787', '97639', '24343', '36299', '72759', '96672', '58801', '57467', '97185', '19493', '4431', '33940', '950', '46713', '12503', '35185', '31106', '93821', '1086', '31767', '17484', '52751', '70411', '12196', '502', '45391', '70720', '27507', '1282', '18633', '45031', '10475', '83570', '29539', '16753', '63494', '17010', '76069', '38913', '53948', '34175', '36761', '37575', '73655', '76272', '1069', '74456', '10440', '65502', '95286', '39384', '83461', '76477', '4167', '46503', '22373', '24523', '46024', '28959', '83219', '27807', '80905', '88626', '70234', '86888', '60954', '95397', '47973', '47944', '30154', '42698', '15144', '53223', '21123', '19281', '62933', '24952', '84744', '58456', '38446', '26768', '40797', '107', '52101', '8348', '8531', '17772', '97826', '34009', '15825', '48977', '54939', '78886', '31784', '42842', '22773', '9095', '25113', '65362', '83953', '55921', '92797', '26776', '59312', '56428', '52218', '50141', '52535', '22564', '50708', '50384', '16261', '529', '31406', '46452', '30954', '5385', '60190', '38790', '65440', '11891', '2196', '83560', '68884', '72400', '47795', '7501', '8916', '63267', '35567', '39889', '61818', '94343', '46612', '75029', '46988', '12411', '6123', '60904', '43704', '31143', '72544', '45919', '67953', '97776', '49517', '60476', '54437', '46261', '99778', '18541', '77626', '12537', '68459', '12688', '36284', '54901', '89375', '10538', '38415', '33160', '78777', '33532', '82538', '21329', '34359', '29544', '57035', '61945', '49098', '32484', '68236', '11088', '57533', '11044', '96786', '58861', '51390', '9582', '24229', '32604', '66195', '7311', '46441', '73383', '58033', '41866', '19293', '73085', '50627', '19818', '40498', '56436', '99865', '55516', '38917', '89889', '49571', '99408', '20144', '76122', '49593', '47906', '94763', '26488', '86343', '98334', '70112', '85244', '45622', '47828', '35306', '86838', '57186', '69907', '90594', '68206', '25118', '75445', '71715', '15800', '67558', '17783', '56525', '22970', '17354', '17139', '76827', '50325', '95314', '65432', '44045', '57928', '66247', '10673', '69744', '99485', '57467', '66889', '55246', '15095', '23540', '32890', '22959', '59472', '62237', '6956', '34669', '16547', '54868', '22598', '65120', '48525', '72750', '70559', '75706', '61831', '14032', '36146', '90211', '36082', '79712', '43018', '53903', '82490', '45698', '54202', '83079', '4867', '18044', '55144', '49189', '33278', '48387', '68822', '73057', '58118', '89796', '47318', '98383', '58759', '172', '56627', '79861', '86734', '25758', '80779', '55741', '40924', '24568', '23090', '62934', '94264', '58331', '18747', '15802', '81585', '92542', '97426', '18205', '11820', '62702', '16439', '18613', '45918', '47584', '98743', '39808', '33357', '16033', '87378', '87036', '88920', '99300', '89343', '7384', '36867', '36712', '96947', '92141', '85779', '81735', '86121', '19511', '70519', '62537', '10398', '99308', '63922', '45419', '17708', '2093', '85127', '55753', '97149', '82877', '64642', '30417', '151', '75464', '75992', '99440', '58040', '32083', '90604', '47830', '40087', '78899', '43638', '59066', '46579', '44828', '35130', '10670', '62051', '94127', '32024', '85455', '80408', '18295', '8106', '89380', '90499', '3196', '3826', '63462', '64317', '55570', '77162', '48564', '59842', '80241', '76221', '57327', '48049', '74336', '43168', '19559', '32059', '99226', '46384', '48111', '56013', '58953', '68426', '22', '72641', '16207', '595', '71706', '61213', '65921', '67517', '92618', '57660', '76414', '60998', '1829', '90176', '62932', '15052', '94997', '41', '58848', '56411', '18129', '86542', '16330', '2803', '5651', '47351', '57866', '3560', '97530', '8338', '59434', '50183', '39076', '2516', '16293', '6559', '31189', '83713', '58214', '32016', '56581', '46226', '74599', '33513', '51530', '20163', '56512', '1694', '8165', '17370', '2510', '46015', '80417', '77195', '69062', '717', '33699', '37638', '82238', '5436', '67991', '98554', '26668', '19565', '26500', '30133', '54349', '36668', '56773', '55187', '25458', '54126', '11833', '32007', '38881', '20038', '42186', '67850', '12001', '96089', '63397', '75035', '16744', '45208', '84186', '82044', '34818', '55858', '1623', '41600', '34753', '92242', '16416', '49800', '45309', '56520', '38893', '42865', '37476', '78860', '32503', '18086', '55004', '65795', '82926', '75725', '52917', '75463', '82202', '35158', '67065', '38454', '90106', '79681', '57317', '68357', '66487', '99640', '13182', '68684', '96739', '89887', '54307', '98357', '4597', '47645', '38560', '17334', '46291', '91096', '22675', '12995', '35767', '76173', '54754', '75206', '13345', '78860', '19929', '12740', '13007', '69737', '52454', '6784', '77198', '59565', '44548', '22924', '38773', '9522', '59392', '45244', '64754', '39640', '75795', '22725', '78314', '24738', '83167', '31049', '92122', '62117', '47314', '34032', '76951', '63164', '22515', '46057', '81625', '72164', '60013', '26171', '55608', '50486', '51422', '18277', '13682', '70130', '49689', '32278', '25430', '84394', '57371', '93398', '14139', '461', '37302', '25705', '25642', '70311', '81778', '66948', '51187', '99649', '44509', '12753', '39827', '57393', '40288', '26496', '1500', '32979', '62062', '5170', '25273', '26343', '21058', '66749', '52257', '26335', '4347', '82427', '51381', '66857', '58330', '15097', '23881', '93865', '97929', '11233', '67910', '22731', '70911', '93941', '46169', '31920', '16027', '1635', '16338', '49712', '29345', '26316', '15221', '54771', '34715', '35399', '80287', '90881', '33758', '46569', '52450', '40564', '34885', '5679', '53232', '85632', '87510', '4008', '87014', '49611', '94569', '96432', '57394', '66064', '34144', '67269', '83546', '5901', '25386', '57588', '55055', '6940', '8414', '31432', '75407', '86922', '33925', '24600', '48261', '94439', '34234', '69028', '37145', '32386', '68275', '13237', '3521', '57395', '55029', '16426', '87797', '18559', '72744', '1155', '30384', '19799', '50001', '85831', '19583', '83898', '13465', '58160', '51160', '89216', '90725', '37151', '32241', '6319', '95146', '10376', '55137', '64094', '14990', '19747', '85852', '50692', '63214', '53123', '97058', '60203', '29272', '14439', '69712', '13023', '75808', '67150', '76276', '54521', '46621', '78807', '89302', '30273', '85103', '63180', '75468', '98474', '37749', '66275', '61712', '39381', '2740', '83025', '18083', '42030', '3391', '56204', '3960', '34780', '22476', '50074', '79854', '89447', '3695', '2986', '85090', '71529', '77995', '51572', '60278', '69314', '70777', '46754', '22085', '94517', '98052', '5700', '43157', '12345', '34663', '40350', '5739', '84384', '8354', '81566', '75500', '88934', '67062', '52877', '30428', '95593', '13288', '51836', '25264', '19278', '81290', '47555', '7606', '46694', '29735', '25723', '81597', '26221', '24545', '98576', '63395', '36061', '58752', '8486', '97817', '27235', '18579', '2387', '88017', '42855', '5111', '49094', '28448', '82227', '63436', '89135', '86591', '2922', '72163', '83000', '14378', '81829', '5610', '93513', '78135', '55292', '80776', '21212', '40604', '44442', '50505', '22750', '47985', '19367', '63494', '4363', '64500', '79444', '36504', '43418', '72523', '85981', '13740', '302', '76267', '14962', '79643', '26144', '27125', '13364', '82935', '8936', '8340', '38025', '80742', '42829', '95357', '11131', '6806', '10497', '70527', '3004', '54217', '51051', '34722', '57348', '50489', '76514', '76546', '29498', '40587', '52697', '37808', '32509', '68927', '68051', '53328', '41926', '9344', '67795', '98626', '44058', '46817', '95773', '57539', '13352', '96292', '72647', '47111', '48595', '82684', '43566', '93381', '3081', '27653', '25045', '34753', '80870', '92013', '21935', '89454', '14127', '73278', '87015', + '65232', '97216', '26840', '21272', '8226', '42347', '44358', '26715', '7860', '31989', '14091', '15648', '85801', '20463', '85221', '77969', '87196', '28563', '69663', '55169', '11372', '38915', '74678', '1183', '14845', '85696', '54995', '62342', '83227', '73536', '64251', '46556', '78421', '89058', '41036', '79746', '42148', '77720', '33923', '24979', '98428', '80202', '36845', '20584', '13506', '97375', '48434', '14863', '29237', '99014', '20650', '48496', '61825', '89100', '51501', '22632', '89030', '22901', '54072', '68093', '98140', '1631', '43266', '34532', '35780', '17763', '41731', '19580', '72266', '66530', '55650', '51506', '92256', '5332', '85143', '65002', '30530', '21358', '88420', '81349', '94086', '68143', '95343', '30490', '61605', '40296', '61665', '21032', '498', '67165', '3151', '94788', '36502', '77434', '88776', '67565', '4404', '51177', '49030', '88502', '92552', '31170', '92051', '79960', '43784', '17864', '54179', '91590', '39153', '75017', '11161', '31100', '27964', '30263', '54908', '57991', '89272', '14642', '40576', '20224', '48887', '93479', '87862', '19858', '78238', '4113', '32369', '70072', '82752', '85122', '72450', '53113', '53806', '45347', '55032', '77242', '70401', '83685', '41229', '47489', '36964', '40556', '2619', '64080', '7354', '10159', '74827', '11846', '64587', '88667', '20940', '93594', '43669', '38592', '20211', '96055', '65995', '89957', '18941', '82750', '90753', '49989', '63331', '52911', '1675', '98447', '35516', '28539', '91592', '80615', '68066', '63922', '52509', '26025', '14634', '69439', '19820', '89983', '38306', '84048', '66264', '26855', '3634', '92094', '61088', '28293', '11428', '68748', '10665', '27114', '20151', '65883', '86423', '77069', '74997', '147', '41427', '26124', '22163', '82452', '61186', '89370', '58583', '2692', '54969', '84679', '26237', '46229', '16041', '28473', '38684', '43587', '37886', '68790', '92030', '85066', '13673', '30280', '91844', '43115', '10005', '1481', '84393', '10008', '60291', '90687', '99338', '95570', '39916', '68643', '41309', '24724', '57188', '75473', '21647', '50206', '6820', '73756', '51102', '76169', '99840', '32863', '17306', '43063', '90483', '15894', '59042', '53797', '93961', '12248', '12125', '39393', '17056', '11576', '6145', '43960', '74245', '86805', '95665', '58855', '50039', '14867', '85076', '3939', '55501', '18184', '62019', '16312', '37518', '18544', '67431', '68250', '70766', '74635', '41835', '74538', '77822', '47918', '90863', '17526', '78930', '47473', '67945', '70385', '19404', '45030', '13476', '46186', '28191', '22019', '18700', '90915', '41408', '63333', '52902', '87336', '72833', '47707', '46692', '47873', '82012', '22597', '46379', '69109', '72108', '47439', '51130', '41894', '29827', '88403', '75040', '37504', '69925', '19034', '57998', '46633', '1021', '48358', '55923', '3536', '26350', '36696', '29658', '25247', '65614', '19042', '34463', '85938', '26155', '49801', '74604', '17581', '91632', '12935', '97966', '14947', '71196', '32270', '51915', '41692', '83274', '6608', '37190', '35363', '85313', '97545', '5696', '23700', '39334', '38434', '20192', '27349', '71340', '19732', '96142', '17152', '32995', '34829', '71157', '36376', '11522', '26646', '19239', '34033', '4200', '39023', '64291', '7931', '42807', '2800', '75490', '4515', '84571', '59557', '13421', '69465', '69121', '82358', '18134', '18536', '74294', '24013', '43777', '94192', '77031', '33341', '98070', '27534', '34419', '40107', '17826', '48196', '82843', '37592', '40484', '49019', '59822', '26118', '89788', '5990', '99595', '35178', '49473', '54699', '81618', '23497', '87025', '29421', '1685', '31406', '54115', '25193', '44525', '44886', '4885', '74482', '63280', '57532', '29773', '83104', '5354', '35313', '12558', '16165', '52712', '82282', '73541', '97334', '7283', '29405', '87694', '64717', '98840', '2868', '17727', '61847', '32417', '91009', '12117', '35077', '36279', '87552', '12441', '70576', '505', '57332', '56191', '33846', '78645', '58506', '48692', '27712', '86722', '46677', '81512', '14807', '30337', '7863', '457', '71893', '32256', '21897', '95811', '73552', '24929', '4893', '49448', '33836', '24781', '43236', '30853', '81985', '60625', '20087', '30674', '39280', '10779', '97785', '11298', '65057', '17589', '44085', '10126', '72351', '4165', '30539', '97124', '20545', '50087', '13490', '4055', '62365', '24046', '63110', '99045', '47122', '74389', '29843', '89082', '71686', '40321', '15789', '63062', '23403', '27718', '72550', '36098', '47309', '60568', '22266', '20542', '59018', '76386', '89381', '9164', '42093', '19931', '90426', '73695', '26948', '17363', '15727', '75439', '45425', '42518', '32966', '80703', '4659', '74566', '22464', '49383', '53167', '80720', '45464', '179', '29789', '19444', '97663', '6466', '51290', '56374', '17869', '97520', '45148', '92149', '54757', '94455', '80125', '98584', '70174', '77708', '59260', '50275', '49211', '60730', '29875', '90935', '29676', '95390', '18263', '73189', '41364', '39707', '75110', '59156', '11770', '38655', '55173', '62547', '16328', '70585', '81958', '61191', '90906', '45978', '59134', '24609', '32956', '30518', '27341', '84512', '24987', '65295', '75210', '97931', '56717', '6751', '83338', '82808', '96570', '27038', '93274', '399', '9330', '54319', '24848', '39269', '92692', '50625', '52306', '93262', '48756', '66694', '50517', '41763', '42231', '8589', '41923', '87839', '9579', '5104', '41634', '63030', '15100', '59593', '38288', '88852', '81957', '84267', '56380', '89329', '74372', '16026', '15795', '29456', '93173', '76367', '37598', '68153', '72405', '55181', '77543', '30730', '27564', '98764', '48711', '22180', '51352', '80150', '50091', '19481', '97962', '74879', '75369', '84410', '54712', '68399', '60910', '57922', '8896', '94118', '5276', '54049', '11614', '98854', '65979', '75156', '39456', '30226', '27357', '71087', '30814', '6416', '56480', '70259', '56525', '69945', '63874', '87262', '97398', '77972', '76745', '97191', '26739', '10957', '48743', '18175', '74688', '49853', '83675', '79232', '72211', '77255', '44445', '81053', '5506', '21366', '99015', '57598', '9467', '65131', '73794', '25679', '3609', '70041', '14653', '93792', '7076', '87326', '12978', '20886', '24089', '82187', '55203', '96649', '51205', '26250', '98219', '64275', '18634', '94004', '50999', '99611', '72380', '28685', '33246', '49116', '44972', '44273', '26558', '84799', '51310', '39480', '16713', '34371', '94308', '38743', '14592', '47430', '74505', '38866', '69596', '84705', '20236', '49353', '28259', '16255', '27665', '94271', '98652', '18279', '4805', '57471', '7944', '72567', '55603', '47327', '32268', '1256', '47608', '80225', '15744', '75492', '74652', '96812', '77976', '72595', '86791', '97736', '83149', '57030', '58553', '7121', '53544', '94894', '57236', '55850', '52762', '36303', '97740', '25314', '43196', '74248', '52320', '60448', '10606', '7010', '21765', '20357', '61825', '34331', '15898', '67485', '70353', '41657', '49212', '21628', '11783', '90514', '33883', '85668', '73432', '55374', '53880', '864', '66975', '51190', '18268', '45344', '99680', '91098', '3893', '90773', '55611', '5914', '14977', '29463', '38339', '94390', '15379', '74717', '78721', '10689', '90966', '33191', '32384', '4363', '61992', '37456', '28402', '51633', '14358', '99226', '23024', '22114', '86438', '70682', '27242', '46237', '92467', '83997', '71994', '59256', '44728', '51372', '50328', '66925', '16487', '7348', '69501', '23328', '55945', '98064', '92561', '5275', '67097', '37616', '8561', '14378', '83858', '44306', '60514', '89238', '28781', '11864', '31540', '3809', '16629', '4336', '70961', '10787', '58719', '39587', '46840', '48993', '18578', '30890', '71438', '29672', '54785', '77570', '25012', '70696', '25935', '279', '74327', '33944', '55060', '72194', '28269', '47600', '2132', '56618', '77029', '26410', '25682', '13744', '31968', '27115', '57065', '49313', '31237', '70475', '38549', '33723', '66622', '19646', '93518', '4052', '29390', '10163', '19879', '10765', '71024', '71339', '69114', '78385', '64440', '79577', '48109', '81114', '4708', '44863', '72410', '71161', '55491', '3433', '88675', '48496', '97875', '17184', '840', '16960', '32880', '48533', '82430', '44005', '36654', '96011', '16158', '21530', '88485', '91231', '77831', '39266', '9833', '96154', '89200', '2021', '57813', '897', '27643', '65750', '27447', '29043', '50691', '74683', '78027', '99590', '6052', '22867', '4567', '3918', '27143', '77750', '32003', '14011', '59006', '33140', '12165', '72413', '89931', '59389', '45281', '52596', '31993', '88613', '85332', '8016', '34419', '80901', '76317', '34932', '71099', '23354', '19296', '42671', '12646', '47189', '67982', '79803', '28449', '6229', '44873', '48970', '10012', '6871', '88240', '1277', '71039', '47959', '45051', '74358', '68394', '49093', '78063', '26981', '8704', '18470', '14458', '38195', '75691', '64683', '44910', '93423', '67591', '36833', '63204', '29507', '38894', '59524', '12141', '36543', '86914', '91250', '45459', '30156', '119', '95390', '75872', '28827', '67609', '99869', '91237', '70358', '60292', '3499', '3133', '45478', '5800', '47576', '50558', '71500', '65579', '84252', '68999', '59495', '79395', '28634', '44121', '26503', '11922', '22058', '34164', '32668', '10422', '62793', '41303', '2030', '76875', '17151', '42101', '22133', '82998', '19499', '14247', '95259', '746', '38449', '72450', '99138', '61259', '65623', '13439', '45597', '55234', '19347', '70266', '4828', '79316', '16983', '49723', '95468', '9747', '81126', '31999', '33796', '15270', '60644', '61048', '98848', '26685', '40980', '23733', '13676', '98363', '17970', '76451', '42657', '13165', '27870', '49193', '56279', '34647', '1652', '47674', '95555', '80556', '52419', '61110', '26124', '49097', '90600', '53605', '97544', '8694', '94739', '59652', '41807', '87155', '83539', '61468', '20614', '12652', '86562', '82894', '94360', '56182', '30513', '65379', '6522', '86486', + '37674', '44977', '54370', '97381', '60218', '2423', '99591', '69913', '26507', '19708', '6279', '58955', '20126', '1495', '57894', '7638', '38700', '77148', '36844', '7539', '91452', '6914', '74349', '66850', '49104', '6516', '58535', '20851', '27859', '32881', '72919', '28203', '32882', '2419', '77583', '63822', '37703', '66793', '65784', '62281', '55867', '70703', '89344', '1498', '33770', '87176', '95636', '64891', '90736', '95521', '10989', '5237', '99010', '21106', '11422', '1831', '67239', '52557', '36468', '71713', '39637', '49574', '50455', '14953', '96900', '70852', '96982', '4341', '44585', '95651', '79669', '29652', '87294', '74692', '16221', '768', '35380', '21352', '50907', '27259', '11718', '5017', '55964', '94137', '52347', '10595', '12968', '85602', '97965', '18836', '90511', '70960', '97336', '44575', '23791', '42195', '64776', '29363', '42379', '1805', '28919', '6772', '78143', '54797', '27362', '56149', '59048', '38567', '6339', '27787', '42167', '45990', '95532', '54839', '26572', '38496', '89797', '6634', '16468', '24898', '66814', '98126', '31762', '36133', '64539', '43167', '87022', '61295', '30364', '89249', '25756', '63570', '91484', '10564', '79648', '5756', '41376', '61897', '40388', '88927', '62891', '79708', '25495', '22204', '33892', '36871', '19879', '58646', '57061', '73100', '75831', '20029', '67462', '54675', '7766', '2409', '24506', '7877', '11720', '86252', '9897', '8080', '70684', '74497', '2242', '24604', '31969', '83999', '56635', '5283', '64971', '79152', '27470', '89042', '22835', '21476', '50292', '56081', '96342', '32763', '84487', '64856', '79152', '64656', '72169', '69971', '93094', '52804', '80917', '53152', '56016', '28496', '79110', '17133', '12581', '91742', '78929', '2676', '46700', '59528', '93808', '4535', '54035', '40161', '62796', '3598', '97088', '13599', '36337', '73395', '17494', '86275', '62058', '61937', '87747', '94883', '90677', '88544', '72553', '50210', '75481', '64378', '74464', '21659', '30970', '71989', '84846', '72289', '88716', '39143', '8487', '4912', '91013', '18623', '19122', '36507', '76438', '7516', '67970', '72350', '69873', '33635', '55983', '69008', '49545', '3134', '60056', '52509', '63304', '15560', '23651', '81090', '7027', '8317', '33060', '37295', '51961', '53037', '97431', '40512', '23536', '25168', '78455', '85613', '12304', '40733', '99890', '51238', '55439', '96201', '73559', '92533', '90173', '16721', '6078', '29854', '38894', '31117', '63040', '86795', '81786', '21149', '38998', '61811', '48622', '73019', '59296', '13576', '92559', '36300', '77294', '26794', '50912', '98380', '13176', '57746', '75286', '15330', '40921', '7337', '4664', '20384', '4674', '44516', '27633', '31950', '88210', '54536', '9839', '80137', '77491', '18434', '45152', '96942', '41005', '76103', '34825', '86869', '14772', '13384', '21051', '37348', '34434', '97210', '54960', '26598', '60981', '41889', '6446', '64492', '95310', '86236', '81885', '35684', '16539', '98476', '32028', '96470', '6318', '99576', '93935', '48609', '86090', '2476', '65576', '80636', '44817', '99646', '98963', '20486', '26261', '27334', '72946', '82023', '33506', '80193', '13762', '98133', '21134', '33268', '63477', '74609', '30454', '51477', '93391', '96805', '68653', '2714', '63642', '51520', '22972', '13305', '96058', '42336', '74461', '31597', '12050', '81712', '37977', '25718', '4834', '56608', '75731', '406', '28585', '63924', '23702', '29849', '16941', '91921', '65842', '76525', '68534', '50902', '17609', '23852', '53703', '31286', '58526', '9633', '87596', '10654', '2085', '52766', '22135', '76524', '32295', '90072', '70078', '77786', '93741', '87320', '70309', '44024', '95286', '12361', '29682', '59766', '26685', '90686', '81691', '49704', '23431', '53955', '39023', '47261', '1530', '58265', '80065', '95620', '90621', '63760', '90676', '81653', '36397', '20252', '81754', '20256', '67098', '7838', '49408', '88400', '87941', '84533', '6570', '22567', '18850', '55472', '40129', '48425', '23497', '39308', '34698', '53092', '89480', '47785', '57282', '25508', '19006', '50604', '86917', '9436', '88921', '3168', '70537', '3185', '34988', '5462', '69482', '45768', '91955', '56898', '15307', '99731', '89292', '19356', '20646', '66712', '7281', '12856', '31174', '19577', '8726', '62971', '33008', '37118', '59055', '84101', '68445', '91957', '47526', '15627', '79914', '20013', '26147', '80821', '56372', '74205', '28531', '25352', '51775', '93948', '55212', '17863', '91521', '74911', '88160', '2360', '98260', '18294', '62402', '84268', '9580', '42668', '1467', '40059', '5221', '4216', '9917', '35420', '16496', '34369', '50253', '95234', '95114', '84193', '28322', '37031', '81284', '88628', '36782', '42572', '73347', '66188', '43342', '77285', '16513', '89064', '63066', '72645', '67075', '48208', '18181', '77898', '65795', '53707', '39856', '92883', '92567', '49733', '30236', '10273', '53029', '69773', '78379', '72108', '47696', '97557', '95184', '14688', '29853', '62694', '70431', '88435', '58799', '21883', '99866', '69178', '55870', '14414', '85274', '27321', '55555', '613', '15067', '88217', '73655', '99548', '13631', '78789', '36690', '7952', '60830', '77438', '40059', '95602', '43097', '3429', '93731', '90537', '2932', '35702', '16125', '6652', '39632', '39349', '9910', '38103', '78608', '73565', '48556', '28978', '7128', '82326', '53980', '28059', '28212', '87101', '77752', '99170', '56753', '30484', '71470', '32607', '24674', '32687', '25098', '94712', '64024', '48239', '90408', '17316', '99243', '3656', '67402', '48009', '98427', '52800', '56024', '4417', '89747', '93338', '18758', '56411', '44810', '82456', '30808', '75470', '67115', '66876', '53906', '78403', '56059', '34383', '60056', '89136', '7237', '11129', '21351', '78662', '43606', '37454', '45465', '9292', '38099', '81699', '50195', '49368', '47503', '44605', '6523', '81478', '37910', '397', '20256', '6835', '2787', '80383', '4241', '65986', '83870', '21205', '10879', '26593', '44357', '72604', '56131', '43423', '80206', '26240', '87198', '99445', '53504', '10632', '2465', '31793', '89575', '64184', '39988', '60049', '87100', '37151', '61585', '82180', '52065', '72519', '72935', '3201', '5862', '20560', '95339', '21661', '17533', '17182', '71189', '91564', '57999', '35490', '94773', '95056', '51583', '59394', '10727', '8655', '48123', '10701', '25314', '20100', '6533', '46435', '43188', '23001', '23018', '76637', '32018', '36603', '18701', '9550', '61550', '47541', '36500', '67507', '81574', '95490', '69169', '32584', '30045', '64699', '83539', '89396', '42517', '61979', '41528', '8271', '88377', '61423', '1158', '89724', '70789', '14886', '64823', '56675', '97747', '23990', '58495', '82064', '17062', '90258', '86854', '93304', '12925', '49975', '45074', '87155', '72223', '67344', '42733', '42516', '40110', '15444', '88285', '39371', '23198', '61544', '90205', '6192', '15718', '19803', '92712', '20081', '31397', '5555', '70463', '19521', '80401', '74097', '32060', '26495', '20507', '40473', '1449', '57215', '46142', '39303', '50359', '35898', '46908', '90752', '7823', '27416', '73770', '98790', '17907', '29999', '76417', '49926', '76752', '21608', '26524', '88209', '6000', '88897', '19541', '41451', '59538', '56560', '1456', '67828', '82407', '45722', '93344', '54279', '78594', '38354', '93807', '10929', '91560', '60681', '70615', '32527', '10108', '48303', '63134', '28500', '18257', '57081', '24801', '99077', '52197', '15390', '52300', '57116', '417', '7503', '20054', '75315', '81359', '69091', '18853', '2465', '25600', '13522', '74575', '12661', '83071', '15191', '27543', '21730', '60853', '18961', '14773', '89185', '33694', '51143', '1449', '68831', '78062', '65173', '32697', '41674', '9429', '22156', '96022', '46305', '97534', '5685', '48870', '89988', '20686', '66705', '6865', '94250', '16872', '13178', '7420', '73531', '92723', '60620', '48843', '74207', '60016', '50943', '62699', '63507', '76537', '87066', '76922', '24711', '34809', '5021', '31293', '53854', '77607', '52322', '10934', '50284', '87804', '36730', '86946', '80749', '43325', '97958', '7362', '39582', '10042', '42053', '66236', '69931', '23463', '87996', '33563', '4468', '32905', '50815', '79478', '28658', '46018', '23186', '26080', '13494', '6237', '42762', '86440', '77407', '10426', '62902', '73251', '36861', '92357', '98754', '1839', '46391', '11420', '27132', '93028', '39609', '42015', '68218', '54228', '5456', '38705', '64307', '49483', '878', '54360', '54480', '66684', '55089', '4537', '82073', '72602', '96238', '56708', '58625', '32991', '74205', '72868', '79086', '64250', '56376', '10621', '76607', '47706', '72760', '70303', '60715', '14644', '44186', '36264', '29489', '14184', '62699', '30567', '16700', '31222', '15650', '1500', '22950', '54628', '41004', '96094', '70028', '74178', '65328', '26605', '63076', '75271', '79285', '8151', '42101', '56362', '25961', '87864', '972', '29510', '2747', '8877', '9780', '61052', '84105', '15573', '27475', '44570', '25334', '18517', '44237', '84094', '67524', '76761', '65678', '79284', '2462', '42631', '22696', '19223', '29728', '67742', '11883', '59027', '12377', '80538', '2165', '17377', '15030', '49838', '23920', '26025', '68179', '75894', '43783', '97106', '75558', '35528', '52081', '16951', '68855', '402', '21459', '97550', '16948', '5369', '4641', '2663', '15233', '79974', '71093', '15234', '42690', '22322', '54282', '95845', '90010', '40530', '88298', '41885', '7079', '6098', '72786', '36603', '77378', '48393', '45723', '41996', '96025', '89297', '75586', '8422', '24360', '170', '46036', '46725', '67944', '74029', '73069', '45371', '99916', '71085', '42608', '89904', '6393', '51274', '42729', '58924', '82497', '64143', '88622', '18818', '89041', '56090', '21369', '78224', '90450', '45488', '58830', '4133', '98062', '81113', '11285', '51457', '3183', '38800', '65278', '42169', '28602', '52648', '44683', '75647', '11778', '32151', '33528', '23773', '68268', '23367', '70964', '23548', + '35575', '67570', '77681', '74158', '25374', '62714', '43100', '4977', '51678', '83460', '29755', '15890', '64626', '54044', '14793', '64339', '94008', '97126', '49202', '33889', '12601', '12275', '56123', '94557', '68226', '67200', '9374', '70687', '29211', '8039', '14598', '74548', '37433', '98991', '29933', '37203', '23973', '96482', '64774', '58350', '61781', '31824', '57193', '26476', '21814', '32297', '32627', '44277', '33876', '55468', '81715', '82505', '61462', '20324', '84293', '40116', '51087', '43594', '6854', '59077', '39841', '26023', '22777', '66859', '82460', '89515', '41712', '33711', '71875', '10685', '12655', '50138', '31063', '37040', '95819', '38919', '27391', '29833', '34350', '65646', '7697', '2688', '41146', '13241', '50305', '86568', '24487', '78741', '96370', '21015', '31719', '39750', '25014', '72415', '8486', '90668', '51143', '49488', '21057', '92803', '53528', '39550', '76039', '44185', '32404', '30217', '19796', '38084', '49161', '80140', '20241', '39357', '68908', '93083', '77231', '6952', '36322', '50790', '623', '29730', '13616', '57546', '17434', '93811', '35148', '81419', '40250', '40329', '89126', '72402', '16053', '27107', '28919', '16829', '96582', '65057', '28416', '30801', '77742', '27420', '73118', '89352', '54706', '23035', '88413', '64608', '61930', '15037', '47327', '59596', '18700', '57576', '63628', '56823', '60091', '68209', '21001', '14962', '72257', '83802', '33721', '86343', '11133', '65737', '68477', '90725', '86869', '98403', '47393', '25356', '61372', '8873', '19888', '48836', '66005', '23531', '72520', '26461', '78508', '28213', '96394', '22983', '37856', '71814', '27425', '72753', '27511', '65471', '38592', '3683', '24652', '64505', '92543', '53201', '40639', '99542', '53425', '35321', '47669', '14134', '47727', '48202', '71931', '32119', '50086', '50266', '67159', '89317', '81905', '30315', '49154', '8690', '69365', '56881', '46473', '64100', '38365', '59377', '65630', '54871', '52745', '91536', '16106', '70066', '62063', '84530', '88103', '33599', '51063', '87299', '41880', '25335', '51252', '42788', '13568', '1721', '62424', '83308', '36787', '91536', '92555', '27600', '24030', '12267', '66336', '30242', '7183', '67624', '28471', '48593', '79766', '31178', '47818', '94522', '88855', '45262', '43670', '18065', '25062', '44558', '37189', '69225', '35216', '42683', '26289', '72816', '31947', '65871', '45715', '59452', '22014', '56669', '60331', '33450', '60601', '95047', '30789', '90107', '81565', '32266', '3252', '5446', '58756', '55370', '34034', '81071', '2560', '39054', '39564', '15010', '5389', '60002', '53320', '49545', '48444', '31415', '39278', '79879', '30148', '10186', '60358', '29011', '14419', '95159', '94815', '55251', '90910', '80582', '92304', '11697', '60061', '38577', '84439', '76196', '34542', '50963', '36294', '11123', '59763', '29873', '47383', '12979', '22119', '21723', '64725', '48377', '77132', '9817', '79920', '47653', '60069', '12924', '53808', '55962', '66969', '13757', '60615', '10994', '9138', '34119', '58436', '64407', '75170', '73524', '51864', '94183', '86847', '15585', '57616', '96267', '5340', '52929', '49096', '50291', '5559', '32382', '84077', '6598', '87921', '59719', '31726', '44772', '63373', '75420', '66829', '47275', '98264', '61387', '94945', '44540', '50098', '13078', '44729', '95332', '63555', '30782', '63203', '15071', '60996', '72812', '17418', '80215', '37610', '30670', '44674', '74822', '15471', '25236', '16266', '76213', '35820', '19567', '8715', '72003', '90606', '1434', '53545', '88170', '75014', '62287', '35436', '38669', '12927', '83877', '38622', '28313', '82884', '73969', '38671', '10450', '24158', '22941', '73162', '86548', '42482', '95315', '92016', '96156', '44012', '35962', '6366', '3881', '74300', '26248', '30182', '19164', '67105', '66771', '52587', '69894', '61820', '16551', '50743', '10096', '69030', '24451', '89165', '23929', '96291', '30685', '64413', '19913', '9049', '71383', '61684', '45384', '45927', '81840', '49521', '89594', '30055', '83430', '14930', '60316', '86585', '99375', '80170', '14207', '19584', '20067', '82874', '30159', '46647', '6942', '66777', '32638', '55662', '75470', '77622', '26893', '96149', '14373', '33252', '50574', '7945', '20696', '56662', '94348', '3384', '20956', '89668', '99052', '65131', '56847', '17589', '16419', '2670', '10705', '59587', '92902', '92424', '48570', '11034', '69149', '35733', '17315', '84966', '69353', '69590', '52834', '32561', '6049', '50156', '71676', '76423', '32361', '61509', '8845', '75709', '35956', '21912', '31188', '59083', '43459', '38614', '92206', '55645', '38737', '34193', '6451', '94163', '24326', '49976', '71600', '58024', '67160', '4365', '38270', '59558', '80834', '60739', '54318', '19738', '42196', '43191', '13463', '88914', '99239', '66869', '75691', '33085', '4323', '7170', '46184', '41423', '89835', '46877', '20349', '14365', '32727', '35322', '841', '23597', '43370', '57527', '73250', '32553', '71489', '44617', '98323', '37672', '59549', '96023', '63176', '13524', '15621', '30448', '28136', '45549', '3513', '64153', '19839', '24219', '41987', '51083', '90268', '52052', '31430', '4727', '99409', '43595', '82374', '61251', '51470', '66562', '98724', '23529', '53895', '67562', '87573', '89964', '30821', '15733', '33062', '86963', '33450', '75338', '32570', '14453', '38080', '36335', '84226', '52790', '42883', '61156', '42789', '57846', '60096', '29946', '80178', '15882', '1971', '60722', '62458', '8754', '59991', '89321', '584', '70565', '36458', '21226', '23561', '9837', '39364', '23065', '30675', '9306', '40085', '52082', '89976', '73283', '77851', '36174', '54470', '63250', '72111', '70853', '26723', '42590', '91230', '47512', '13983', '70898', '70927', '40721', '30642', '41628', '90010', '27306', '1933', '43304', '44499', '87890', '22201', '89249', '63935', '48438', '58588', '1061', '70061', '63075', '9676', '65820', '82156', '82668', '111', '54350', '10328', '23466', '98936', '18285', '53919', '32422', '84859', '58387', '24022', '32423', '6010', '56417', '49452', '69999', '14885', '47102', '59577', '24999', '75984', '96464', '59088', '85987', '71442', '88789', '4753', '8229', '76883', '15284', '90610', '40507', '78882', '55575', '25315', '7214', '70602', '4796', '35767', '54657', '42153', '16050', '93607', '99249', '77236', '59949', '52871', '47837', '33534', '30023', '89137', '99938', '35824', '50775', '30282', '82798', '53312', '65277', '68375', '91445', '58166', '43344', '6589', '82515', '34632', '78588', '152', '67554', '15877', '74334', '32783', '45147', '39483', '92067', '59029', '38298', '55229', '28268', '85140', '33451', '15424', '46695', '23201', '83329', '28372', '19518', '89198', '33305', '43892', '470', '37662', '9407', '14376', '80310', '21459', '72381', '80414', '88305', '69073', '63101', '91054', '47190', '48595', '24696', '41426', '35133', '94399', '21790', '55040', '73279', '20809', '67805', '94115', '58633', '78053', '89444', '4112', '8', '34517', '22106', '85934', '86814', '53333', '93437', '85062', '32791', '72744', '99843', '51161', '22730', '34908', '82918', '92566', '22467', '41226', '98518', '29235', '94042', '84371', '79100', '25214', '7764', '59427', '47891', '61092', '23775', '13641', '30837', '77377', '43032', '38441', '29462', '20300', '19070', '20982', '73987', '87836', '68062', '6419', '51563', '40084', '85694', '86677', '47142', '27222', '17844', '19158', '45120', '88524', '74724', '73229', '42470', '38751', '1132', '28603', '61188', '55021', '88825', '58005', '62411', '8843', '94852', '93664', '39253', '27473', '247', '43824', '1804', '8905', '11509', '95659', '7811', '80691', '15779', '49794', '8991', '76099', '29223', '36060', '85399', '41369', '22885', '38473', '22376', '50446', '89578', '25818', '61333', '78787', '47605', '83654', '99068', '52120', '48367', '86381', '19803', '72600', '31998', '37755', '88031', '83969', '42319', '27974', '35780', '93662', '46808', '60529', '15491', '10447', '48829', '33886', '68333', '44855', '86554', '64794', '66376', '58222', '14021', '52043', '56375', '1300', '38105', '89159', '97456', '26800', '93124', '3673', '32279', '30658', '84475', '3708', '93952', '39245', '91980', '55333', '79440', '64407', '46559', '60759', '10688', '49872', '45810', '87405', '66932', '56530', '57751', '9619', '27361', '6356', '65848', '7524', '20273', '22362', '20504', '28042', '39475', '51677', '85733', '32426', '54558', '17222', '56485', '34928', '90917', '70528', '51732', '61014', '98420', '67265', '41383', '3883', '47642', '53324', '93679', '93088', '57534', '44449', '46779', '81482', '54279', '80135', '11216', '92545', '18426', '96005', '57801', '21898', '5104', '83467', '72015', '43783', '89674', '57468', '96686', '95167', '38507', '95187', '64923', '71214', '42834', '93219', '47342', '24476', '84834', '29080', '86533', '30687', '68400', '26933', '37396', '65169', '89767', '20642', '53843', '85167', '77306', '46723', '68501', '4243', '35044', '15950', '40388', '53630', '76125', '10816', '83285', '4120', '11402', '91344', '95169') + DROP TABLE IF EXISTS test_in diff --git a/dbms/tests/queries/0_stateless/00693_max_block_size_system_tables_columns.reference b/dbms/tests/queries/0_stateless/00693_max_block_size_system_tables_columns.reference index 702b59b8258..b674529e010 100644 --- a/dbms/tests/queries/0_stateless/00693_max_block_size_system_tables_columns.reference +++ b/dbms/tests/queries/0_stateless/00693_max_block_size_system_tables_columns.reference @@ -2,7 +2,7 @@ 1 1 1 - t_00693 Memory 1 [] 0000-00-00 00:00:00 [] [] Memory + t_00693 Memory 1 [] 0000-00-00 00:00:00 [] [] Memory \N \N 1 1 1 diff --git a/dbms/tests/queries/0_stateless/00726_materialized_view_concurrent.sql b/dbms/tests/queries/0_stateless/00726_materialized_view_concurrent.sql index c737642f4b7..3c03f97cfe9 100644 --- a/dbms/tests/queries/0_stateless/00726_materialized_view_concurrent.sql +++ b/dbms/tests/queries/0_stateless/00726_materialized_view_concurrent.sql @@ -1,20 +1,20 @@ -DROP TABLE IF EXISTS src; -DROP TABLE IF EXISTS mv1; -DROP TABLE IF EXISTS mv2; +DROP TABLE IF EXISTS src_00726; +DROP TABLE IF EXISTS mv1_00726; +DROP TABLE IF EXISTS mv2_00726; -CREATE TABLE src (x UInt8) ENGINE = Null; -CREATE MATERIALIZED VIEW mv1 ENGINE = Memory AS SELECT x FROM src WHERE x % 2 = 0; -CREATE MATERIALIZED VIEW mv2 ENGINE = Memory AS SELECT x FROM src WHERE x % 2 = 1; +CREATE TABLE src_00726 (x UInt8) ENGINE = Null; +CREATE MATERIALIZED VIEW mv1_00726 ENGINE = Memory AS SELECT x FROM src_00726 WHERE x % 2 = 0; +CREATE MATERIALIZED VIEW mv2_00726 ENGINE = Memory AS SELECT x FROM src_00726 WHERE x % 2 = 1; SET parallel_view_processing = 1; -INSERT INTO src VALUES (1), (2); +INSERT INTO src_00726 VALUES (1), (2); SET parallel_view_processing = 0; -INSERT INTO src VALUES (3), (4); +INSERT INTO src_00726 VALUES (3), (4); -SELECT * FROM mv1 ORDER BY x; -SELECT * FROM mv2 ORDER BY x; +SELECT * FROM mv1_00726 ORDER BY x; +SELECT * FROM mv2_00726 ORDER BY x; -DROP TABLE mv1; -DROP TABLE mv2; -DROP TABLE src; +DROP TABLE mv1_00726; +DROP TABLE mv2_00726; +DROP TABLE src_00726; diff --git a/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.reference b/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.reference index 6868492f7b0..e84e610bb93 100644 --- a/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.reference +++ b/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.reference @@ -1,11 +1,12 @@ -┌─name────────────────┬─partition_key─┬─sorting_key─┬─primary_key─┬─sampling_key─┐ -│ check_system_tables │ name2 │ name1 │ name1 │ name1 │ -└─────────────────────┴───────────────┴─────────────┴─────────────┴──────────────┘ +┌─name────────────────┬─partition_key─┬─sorting_key─┬─primary_key─┬─sampling_key─┬─storage_policy─┬─total_rows─┐ +│ check_system_tables │ name2 │ name1 │ name1 │ name1 │ default │ 0 │ +└─────────────────────┴───────────────┴─────────────┴─────────────┴──────────────┴────────────────┴────────────┘ ┌─name──┬─is_in_partition_key─┬─is_in_sorting_key─┬─is_in_primary_key─┬─is_in_sampling_key─┐ │ name1 │ 0 │ 1 │ 1 │ 1 │ │ name2 │ 1 │ 0 │ 0 │ 0 │ │ name3 │ 0 │ 0 │ 0 │ 0 │ └───────┴─────────────────────┴───────────────────┴───────────────────┴────────────────────┘ +231 1 ┌─name────────────────┬─partition_key─┬─sorting_key───┬─primary_key─┬─sampling_key─┐ │ check_system_tables │ date │ date, version │ date │ │ └─────────────────────┴───────────────┴───────────────┴─────────────┴──────────────┘ @@ -23,3 +24,12 @@ │ UserId │ 0 │ 1 │ 1 │ 1 │ │ Counter │ 0 │ 1 │ 1 │ 0 │ └─────────┴─────────────────────┴───────────────────┴───────────────────┴────────────────────┘ +Check total_bytes/total_rows for TinyLog +\N \N +\N \N +Check total_bytes/total_rows for Memory +0 0 +2 1 +Check total_bytes/total_rows for Buffer +0 0 +100 50 diff --git a/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.sql b/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.sql index 666f9c6c3f6..7c17657afb6 100644 --- a/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.sql +++ b/dbms/tests/queries/0_stateless/00753_system_columns_and_system_tables.sql @@ -11,7 +11,7 @@ CREATE TABLE check_system_tables PARTITION BY name2 SAMPLE BY name1; -SELECT name, partition_key, sorting_key, primary_key, sampling_key +SELECT name, partition_key, sorting_key, primary_key, sampling_key, storage_policy, total_rows FROM system.tables WHERE name = 'check_system_tables' FORMAT PrettyCompactNoEscapes; @@ -21,6 +21,9 @@ FROM system.columns WHERE table = 'check_system_tables' FORMAT PrettyCompactNoEscapes; +INSERT INTO check_system_tables VALUES (1, 1, 1); +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'check_system_tables'; + DROP TABLE IF EXISTS check_system_tables; -- Check VersionedCollapsingMergeTree @@ -65,3 +68,33 @@ WHERE table = 'check_system_tables' FORMAT PrettyCompactNoEscapes; DROP TABLE IF EXISTS check_system_tables; + +SELECT 'Check total_bytes/total_rows for TinyLog'; +CREATE TABLE check_system_tables (key UInt8) ENGINE = TinyLog(); +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'check_system_tables'; +INSERT INTO check_system_tables VALUES (1); +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'check_system_tables'; +DROP TABLE check_system_tables; + +SELECT 'Check total_bytes/total_rows for Memory'; +CREATE TABLE check_system_tables (key UInt16) ENGINE = Memory(); +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'check_system_tables'; +INSERT INTO check_system_tables VALUES (1); +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'check_system_tables'; +DROP TABLE check_system_tables; + +SELECT 'Check total_bytes/total_rows for Buffer'; +CREATE TABLE check_system_tables_null (key UInt16) ENGINE = Null(); +CREATE TABLE check_system_tables (key UInt16) ENGINE = Buffer( + currentDatabase(), + check_system_tables_null, + 2, + 0, 100, /* min_time /max_time */ + 100, 100, /* min_rows /max_rows */ + 0, 1e6 /* min_bytes/max_bytes */ +); +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'check_system_tables'; +INSERT INTO check_system_tables SELECT * FROM numbers_mt(50); +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'check_system_tables'; +DROP TABLE check_system_tables; +DROP TABLE check_system_tables_null; diff --git a/dbms/tests/queries/0_stateless/00942_mv_rename_table.sql b/dbms/tests/queries/0_stateless/00942_mv_rename_table.sql index 168af02e4e3..c0531d98b67 100644 --- a/dbms/tests/queries/0_stateless/00942_mv_rename_table.sql +++ b/dbms/tests/queries/0_stateless/00942_mv_rename_table.sql @@ -1,19 +1,19 @@ -DROP TABLE IF EXISTS src; -DROP TABLE IF EXISTS view_table; -DROP TABLE IF EXISTS new_view_table; +DROP TABLE IF EXISTS src_00942; +DROP TABLE IF EXISTS view_table_00942; +DROP TABLE IF EXISTS new_view_table_00942; -CREATE TABLE src (x UInt8) ENGINE = Null; +CREATE TABLE src_00942 (x UInt8) ENGINE = Null; -CREATE MATERIALIZED VIEW view_table Engine = Memory AS SELECT * FROM src; +CREATE MATERIALIZED VIEW view_table_00942 Engine = Memory AS SELECT * FROM src_00942; -INSERT INTO src VALUES (1), (2), (3); -SELECT * FROM view_table ORDER BY x; +INSERT INTO src_00942 VALUES (1), (2), (3); +SELECT * FROM view_table_00942 ORDER BY x; --Check if we can rename the view and if we can still fetch datas -RENAME TABLE view_table TO new_view_table; -SELECT * FROM new_view_table ORDER BY x; +RENAME TABLE view_table_00942 TO new_view_table_00942; +SELECT * FROM new_view_table_00942 ORDER BY x; -DROP TABLE src; -DROP TABLE IF EXISTS view_table; -DROP TABLE IF EXISTS new_view_table; +DROP TABLE src_00942; +DROP TABLE IF EXISTS view_table_00942; +DROP TABLE IF EXISTS new_view_table_00942; diff --git a/dbms/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper.sh b/dbms/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper.sh index 7dbfda90e41..846156f5b6d 100755 --- a/dbms/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper.sh +++ b/dbms/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper.sh @@ -9,8 +9,8 @@ $CLICKHOUSE_CLIENT -n -q " DROP TABLE IF EXISTS alter_table; DROP TABLE IF EXISTS alter_table2; - CREATE TABLE alter_table (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_DATABASE.alter_table', 'r1') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1; - CREATE TABLE alter_table2 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_DATABASE.alter_table', 'r2') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1 + CREATE TABLE alter_table (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_DATABASE.alter_table', 'r1') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0; + CREATE TABLE alter_table2 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_DATABASE.alter_table', 'r2') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0 " function thread1() diff --git a/dbms/tests/queries/0_stateless/01019_alter_materialized_view_query.sql b/dbms/tests/queries/0_stateless/01019_alter_materialized_view_query.sql index d6a40671dc4..0011f5be522 100644 --- a/dbms/tests/queries/0_stateless/01019_alter_materialized_view_query.sql +++ b/dbms/tests/queries/0_stateless/01019_alter_materialized_view_query.sql @@ -1,35 +1,35 @@ -DROP TABLE IF EXISTS src; -DROP TABLE IF EXISTS dest; -DROP TABLE IF EXISTS pipe; +DROP TABLE IF EXISTS src_01019; +DROP TABLE IF EXISTS dest_01019; +DROP TABLE IF EXISTS pipe_01019; -CREATE TABLE src(v UInt64) ENGINE = Null; -CREATE TABLE dest(v UInt64) Engine = MergeTree() ORDER BY v; +CREATE TABLE src_01019(v UInt64) ENGINE = Null; +CREATE TABLE dest_01019(v UInt64) Engine = MergeTree() ORDER BY v; -CREATE MATERIALIZED VIEW pipe TO dest AS -SELECT v FROM src; +CREATE MATERIALIZED VIEW pipe_01019 TO dest_01019 AS +SELECT v FROM src_01019; -INSERT INTO src VALUES (1), (2), (3); +INSERT INTO src_01019 VALUES (1), (2), (3); SET allow_experimental_alter_materialized_view_structure = 1; -- Live alter which changes query logic and adds an extra column. -ALTER TABLE pipe +ALTER TABLE pipe_01019 MODIFY QUERY SELECT v * 2 as v, 1 as v2 - FROM src; + FROM src_01019; -INSERT INTO src VALUES (1), (2), (3); +INSERT INTO src_01019 VALUES (1), (2), (3); -SELECT * FROM dest ORDER BY v; +SELECT * FROM dest_01019 ORDER BY v; -ALTER TABLE dest +ALTER TABLE dest_01019 ADD COLUMN v2 UInt64; -INSERT INTO src VALUES (42); -SELECT * FROM dest ORDER BY v; +INSERT INTO src_01019 VALUES (42); +SELECT * FROM dest_01019 ORDER BY v; -DROP TABLE src; -DROP TABLE dest; -DROP TABLE pipe; +DROP TABLE src_01019; +DROP TABLE dest_01019; +DROP TABLE pipe_01019; diff --git a/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.reference b/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.reference index dadef736cce..0082653059c 100644 --- a/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.reference +++ b/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.reference @@ -9,6 +9,9 @@ CREATE USER test_user_01075 HOST LOCAL CREATE USER test_user_01075 HOST NONE CREATE USER test_user_01075 HOST LIKE \'@.somesite.com\' CREATE USER test_user_01075 HOST NAME REGEXP \'.*.anothersite.com\' +CREATE USER test_user_01075 HOST NAME REGEXP \'.*.anothersite.com\', \'.*.anothersite.org\' +CREATE USER test_user_01075 HOST NAME REGEXP \'.*.anothersite2.com\', \'.*.anothersite2.org\' +CREATE USER test_user_01075 HOST NAME REGEXP \'.*.anothersite3.com\', \'.*.anothersite3.org\' CREATE USER `test_user_01075_x@localhost` HOST LOCAL CREATE USER test_user_01075_x CREATE USER `test_user_01075_x@192.168.23.15` HOST LIKE \'192.168.23.15\' diff --git a/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.sql b/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.sql index 6ffd8caf746..77a16a9f62a 100644 --- a/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.sql +++ b/dbms/tests/queries/0_stateless/01075_allowed_client_hosts.sql @@ -33,6 +33,15 @@ SHOW CREATE USER test_user_01075; ALTER USER test_user_01075 HOST NAME REGEXP '.*\.anothersite\.com'; SHOW CREATE USER test_user_01075; +ALTER USER test_user_01075 HOST NAME REGEXP '.*\.anothersite\.com', '.*\.anothersite\.org'; +SHOW CREATE USER test_user_01075; + +ALTER USER test_user_01075 HOST NAME REGEXP '.*\.anothersite2\.com', NAME REGEXP '.*\.anothersite2\.org'; +SHOW CREATE USER test_user_01075; + +ALTER USER test_user_01075 HOST NAME REGEXP '.*\.anothersite3\.com' HOST NAME REGEXP '.*\.anothersite3\.org'; +SHOW CREATE USER test_user_01075; + DROP USER test_user_01075; CREATE USER test_user_01075_x@localhost; diff --git a/dbms/tests/queries/0_stateless/01085_regexp_input_format.reference b/dbms/tests/queries/0_stateless/01085_regexp_input_format.reference new file mode 100644 index 00000000000..61435bccefc --- /dev/null +++ b/dbms/tests/queries/0_stateless/01085_regexp_input_format.reference @@ -0,0 +1,12 @@ +1 [1,2,3] str1 2020-01-01 +2 [1,2,3] str2 2020-01-02 +3 [1,2,3] str3 2020-01-03 +4 [1,2,3] str4 2020-01-04 +5 [1,2,3] str5 2020-01-05 +6 [1,2,3] str6 2020-01-06 +7 [1,2,3] str7 2020-01-07 +8 [1,2,3] str8 2020-01-08 +9 [1,2,3] str9 2020-01-09 +10 [1,2,3] str10 2020-01-10 +11 [1,2,3] str11 2020-01-11 +12 [1,2,3] str12 2020-01-12 diff --git a/dbms/tests/queries/0_stateless/01085_regexp_input_format.sh b/dbms/tests/queries/0_stateless/01085_regexp_input_format.sh new file mode 100755 index 00000000000..81ccf35e678 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01085_regexp_input_format.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. $CURDIR/../shell_config.sh + +$CLICKHOUSE_CLIENT --query="DROP TABLE IF EXISTS regexp"; +$CLICKHOUSE_CLIENT --query="CREATE TABLE regexp (id UInt32, array Array(UInt32), string String, date Date) ENGINE = Memory"; + +echo 'id: 1 array: [1,2,3] string: str1 date: 2020-01-01 +id: 2 array: [1,2,3] string: str2 date: 2020-01-02 +id: 3 array: [1,2,3] string: str3 date: 2020-01-03' | $CLICKHOUSE_CLIENT --query="INSERT INTO regexp FORMAT Regexp SETTINGS format_regexp='id: (.+?) array: (.+?) string: (.+?) date: (.+?)', format_regexp_escaping_rule='Escaped'"; + +echo 'id: 4 array: "[1,2,3]" string: "str4" date: "2020-01-04" +id: 5 array: "[1,2,3]" string: "str5" date: "2020-01-05" +id: 6 array: "[1,2,3]" string: "str6" date: "2020-01-06"' | $CLICKHOUSE_CLIENT --query="INSERT INTO regexp FORMAT Regexp SETTINGS format_regexp='id: (.+?) array: (.+?) string: (.+?) date: (.+?)', format_regexp_escaping_rule='CSV'"; + +echo "id: 7 array: [1,2,3] string: 'str7' date: '2020-01-07' +id: 8 array: [1,2,3] string: 'str8' date: '2020-01-08' +id: 9 array: [1,2,3] string: 'str9' date: '2020-01-09'" | $CLICKHOUSE_CLIENT --query="INSERT INTO regexp FORMAT Regexp SETTINGS format_regexp='id: (.+?) array: (.+?) string: (.+?) date: (.+?)', format_regexp_escaping_rule='Quoted'"; + +echo 'id: 10 array: [1,2,3] string: "str10" date: "2020-01-10" +id: 11 array: [1,2,3] string: "str11" date: "2020-01-11" +id: 12 array: [1,2,3] string: "str12" date: "2020-01-12"' | $CLICKHOUSE_CLIENT --query="INSERT INTO regexp FORMAT Regexp SETTINGS format_regexp='id: (.+?) array: (.+?) string: (.+?) date: (.+?)', format_regexp_escaping_rule='JSON'"; + +$CLICKHOUSE_CLIENT --query="SELECT * FROM regexp ORDER BY id"; +$CLICKHOUSE_CLIENT --query="DROP TABLE regexp"; + diff --git a/dbms/tests/queries/0_stateless/01086_regexp_input_format_skip_unmatched.reference b/dbms/tests/queries/0_stateless/01086_regexp_input_format_skip_unmatched.reference new file mode 100644 index 00000000000..ff57df7316e --- /dev/null +++ b/dbms/tests/queries/0_stateless/01086_regexp_input_format_skip_unmatched.reference @@ -0,0 +1,3 @@ +1 str1 +2 str2 +4 str4 diff --git a/dbms/tests/queries/0_stateless/01086_regexp_input_format_skip_unmatched.sh b/dbms/tests/queries/0_stateless/01086_regexp_input_format_skip_unmatched.sh new file mode 100755 index 00000000000..f46a6239795 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01086_regexp_input_format_skip_unmatched.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. $CURDIR/../shell_config.sh + +$CLICKHOUSE_CLIENT --query="DROP TABLE IF EXISTS regexp"; +$CLICKHOUSE_CLIENT --query="CREATE TABLE regexp (id UInt32, string String) ENGINE = Memory"; + +echo 'id: 1 string: str1 +id: 2 string: str2 +id=3, string=str3 +id: 4 string: str4' | $CLICKHOUSE_CLIENT --query="INSERT INTO regexp FORMAT Regexp SETTINGS format_regexp='id: (.+?) string: (.+?)', format_regexp_escaping_rule='Escaped', format_regexp_skip_unmatched=1"; + +$CLICKHOUSE_CLIENT --query="SELECT * FROM regexp"; +$CLICKHOUSE_CLIENT --query="DROP TABLE regexp"; + diff --git a/dbms/tests/queries/0_stateless/01096_array_reduce_in_ranges.reference b/dbms/tests/queries/0_stateless/01096_array_reduce_in_ranges.reference new file mode 100644 index 00000000000..b74faffa6b3 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01096_array_reduce_in_ranges.reference @@ -0,0 +1,22 @@ +[['a','b','c'],['b','c','d'],['c','d','e']] +[0,0,0,0,0,0,0,100,300,0,200,400,0,300,700,0,500,400,0,600,700,0,900,400] +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/dbms/tests/queries/0_stateless/01096_array_reduce_in_ranges.sql b/dbms/tests/queries/0_stateless/01096_array_reduce_in_ranges.sql new file mode 100644 index 00000000000..051eaf7ca2f --- /dev/null +++ b/dbms/tests/queries/0_stateless/01096_array_reduce_in_ranges.sql @@ -0,0 +1,32 @@ +SELECT + arrayReduceInRanges( + 'groupArray', + [(1, 3), (2, 3), (3, 3)], + ['a', 'b', 'c', 'd', 'e'] + ); + +SELECT + arrayReduceInRanges( + 'sum', + [ + (-6, 0), (-4, 0), (-2, 0), (0, 0), (2, 0), (4, 0), + (-6, 1), (-4, 1), (-2, 1), (0, 1), (2, 1), (4, 1), + (-6, 2), (-4, 2), (-2, 2), (0, 2), (2, 2), (4, 2), + (-6, 3), (-4, 3), (-2, 3), (0, 3), (2, 3), (4, 3) + ], + [100, 200, 300, 400] + ); + +WITH + arrayMap(x -> x + 1, range(50)) as data +SELECT + arrayReduceInRanges('groupArray', [(a, c), (b, d)], data) = + [arraySlice(data, a, c), arraySlice(data, b, d)] +FROM ( + SELECT + cityHash64(number + 100) % 40 as a, + cityHash64(number + 200) % 60 as b, + cityHash64(number + 300) % 20 as c, + cityHash64(number + 400) % 30 as d + FROM numbers(20) +); diff --git a/dbms/tests/queries/0_stateless/01103_check_cpu_instructions_at_startup.reference b/dbms/tests/queries/0_stateless/01103_check_cpu_instructions_at_startup.reference new file mode 100644 index 00000000000..59c88f013dd --- /dev/null +++ b/dbms/tests/queries/0_stateless/01103_check_cpu_instructions_at_startup.reference @@ -0,0 +1,4 @@ +Instruction check fail. The CPU does not support SSSE3 instruction set. +Instruction check fail. The CPU does not support SSE4.1 instruction set. +Instruction check fail. The CPU does not support SSE4.2 instruction set. +1 diff --git a/dbms/tests/queries/0_stateless/01103_check_cpu_instructions_at_startup.sh b/dbms/tests/queries/0_stateless/01103_check_cpu_instructions_at_startup.sh new file mode 100755 index 00000000000..4338e3e9ed5 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01103_check_cpu_instructions_at_startup.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. $CURDIR/../shell_config.sh + +command=$(command -v ${CLICKHOUSE_LOCAL}) + +qemu-x86_64-static -cpu qemu64 $command --query "SELECT 1" 2>&1 | grep -v -F "warning: TCG doesn't support requested feature" ||: +qemu-x86_64-static -cpu qemu64,+ssse3 $command --query "SELECT 1" 2>&1 | grep -v -F "warning: TCG doesn't support requested feature" ||: +qemu-x86_64-static -cpu qemu64,+ssse3,+sse4.1 $command --query "SELECT 1" 2>&1 | grep -v -F "warning: TCG doesn't support requested feature" ||: +qemu-x86_64-static -cpu qemu64,+ssse3,+sse4.1,+sse4.2 $command --query "SELECT 1" 2>&1 | grep -v -F "warning: TCG doesn't support requested feature" ||: + diff --git a/dbms/tests/queries/0_stateless/01103_distributed_product_mode_local_column_renames.reference b/dbms/tests/queries/0_stateless/01103_distributed_product_mode_local_column_renames.reference new file mode 100644 index 00000000000..53f7332cffb --- /dev/null +++ b/dbms/tests/queries/0_stateless/01103_distributed_product_mode_local_column_renames.reference @@ -0,0 +1,12 @@ +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 diff --git a/dbms/tests/queries/0_stateless/01103_distributed_product_mode_local_column_renames.sql b/dbms/tests/queries/0_stateless/01103_distributed_product_mode_local_column_renames.sql new file mode 100644 index 00000000000..32655420a27 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01103_distributed_product_mode_local_column_renames.sql @@ -0,0 +1,87 @@ +CREATE DATABASE IF NOT EXISTS test_01103; +USE test_01103; + +DROP TABLE IF EXISTS t1_shard; +DROP TABLE IF EXISTS t2_shard; +DROP TABLE IF EXISTS t1_distr; +DROP TABLE IF EXISTS t2_distr; + +create table t1_shard (id Int32) engine MergeTree order by id; +create table t2_shard (id Int32) engine MergeTree order by id; + +create table t1_distr as t1_shard engine Distributed(test_cluster_two_shards_localhost, test_01103, t1_shard, id); +create table t2_distr as t2_shard engine Distributed(test_cluster_two_shards_localhost, test_01103, t2_shard, id); + +insert into t1_shard values (42); +insert into t2_shard values (42); + +SET distributed_product_mode = 'local'; + +select d0.id +from t1_distr d0 +where d0.id in +( + select d1.id + from t1_distr as d1 + inner join t2_distr as d2 on d1.id = d2.id + where d1.id > 0 + order by d1.id +); + +select t1_distr.id +from t1_distr +where t1_distr.id in +( + select t1_distr.id + from t1_distr as d1 + inner join t2_distr as d2 on t1_distr.id = t2_distr.id + where t1_distr.id > 0 + order by t1_distr.id +); + +select test_01103.t1_distr.id +from test_01103.t1_distr +where test_01103.t1_distr.id in +( + select test_01103.t1_distr.id + from test_01103.t1_distr as d1 + inner join test_01103.t2_distr as d2 on test_01103.t1_distr.id = test_01103.t2_distr.id + where test_01103.t1_distr.id > 0 + order by test_01103.t1_distr.id +); + +select d0.id +from t1_distr d0 +join ( + select d1.id + from t1_distr as d1 + inner join t2_distr as d2 on d1.id = d2.id + where d1.id > 0 + order by d1.id +) s0 using id; + +select t1_distr.id +from t1_distr +join ( + select t1_distr.id + from t1_distr as d1 + inner join t2_distr as d2 on t1_distr.id = t2_distr.id + where t1_distr.id > 0 + order by t1_distr.id +) s0 using id; + +select test_01103.t1_distr.id +from test_01103.t1_distr +join ( + select test_01103.t1_distr.id + from test_01103.t1_distr as d1 + inner join test_01103.t2_distr as d2 on test_01103.t1_distr.id = test_01103.t2_distr.id + where test_01103.t1_distr.id > 0 + order by test_01103.t1_distr.id +) s0 using id; + +DROP TABLE t1_shard; +DROP TABLE t2_shard; +DROP TABLE t1_distr; +DROP TABLE t2_distr; +DROP DATABASE test_01103; diff --git a/dbms/tests/queries/0_stateless/01103_optimize_drop_race_zookeeper.reference b/dbms/tests/queries/0_stateless/01103_optimize_drop_race_zookeeper.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/dbms/tests/queries/0_stateless/01103_optimize_drop_race_zookeeper.sh b/dbms/tests/queries/0_stateless/01103_optimize_drop_race_zookeeper.sh new file mode 100755 index 00000000000..82df41d6223 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01103_optimize_drop_race_zookeeper.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. $CURDIR/../shell_config.sh + +set -e + +function thread1() +{ + while true; do + $CLICKHOUSE_CLIENT -q "INSERT INTO concurrent_optimize_table SELECT rand(1), rand(2), 1 / rand(3), toString(rand(4)), [rand(5), rand(6)], rand(7) % 2 ? NULL : generateUUIDv4(), (rand(8), rand(9)) FROM numbers(10000)"; + done +} + + +function thread2() +{ + while true; do + $CLICKHOUSE_CLIENT -q "OPTIMIZE TABLE concurrent_optimize_table FINAL"; + sleep 0.$RANDOM; + done +} + +function thread3() +{ + while true; do + $CLICKHOUSE_CLIENT -n -q "DROP TABLE IF EXISTS concurrent_optimize_table; + CREATE TABLE concurrent_optimize_table (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/concurrent_optimize_table', '1') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 0, cleanup_delay_period_random_add = 0;"; + sleep 0.$RANDOM; + sleep 0.$RANDOM; + sleep 0.$RANDOM; + done +} + + +export -f thread1; +export -f thread2; +export -f thread3; + + +TIMEOUT=15 + +timeout $TIMEOUT bash -c thread1 2> /dev/null & +timeout $TIMEOUT bash -c thread2 2> /dev/null & +timeout $TIMEOUT bash -c thread3 2> /dev/null & + +timeout $TIMEOUT bash -c thread1 2> /dev/null & +timeout $TIMEOUT bash -c thread2 2> /dev/null & +timeout $TIMEOUT bash -c thread3 2> /dev/null & + +timeout $TIMEOUT bash -c thread1 2> /dev/null & +timeout $TIMEOUT bash -c thread2 2> /dev/null & +timeout $TIMEOUT bash -c thread3 2> /dev/null & + +timeout $TIMEOUT bash -c thread1 2> /dev/null & +timeout $TIMEOUT bash -c thread2 2> /dev/null & +timeout $TIMEOUT bash -c thread3 2> /dev/null & + +wait + +$CLICKHOUSE_CLIENT --query "DROP TABLE IF EXISTS concurrent_optimize_table" diff --git a/dbms/tests/queries/0_stateless/01104_distributed_numbers_test.reference b/dbms/tests/queries/0_stateless/01104_distributed_numbers_test.reference new file mode 100644 index 00000000000..c5079fa2cfd --- /dev/null +++ b/dbms/tests/queries/0_stateless/01104_distributed_numbers_test.reference @@ -0,0 +1,4 @@ +100 +100 +100 +100 diff --git a/dbms/tests/queries/0_stateless/01104_distributed_numbers_test.sql b/dbms/tests/queries/0_stateless/01104_distributed_numbers_test.sql new file mode 100644 index 00000000000..b301c0ac00f --- /dev/null +++ b/dbms/tests/queries/0_stateless/01104_distributed_numbers_test.sql @@ -0,0 +1,12 @@ +DROP TABLE IF EXISTS d_numbers; +CREATE TABLE d_numbers (number UInt32) ENGINE = Distributed(test_cluster_two_shards_localhost, system, numbers, rand()); + +SET experimental_use_processors = 1; + +SELECT '100' AS number FROM d_numbers AS n WHERE n.number = 100 LIMIT 2; + +SET distributed_product_mode = 'local'; + +SELECT '100' AS number FROM d_numbers AS n WHERE n.number = 100 LIMIT 2; + +DROP TABLE d_numbers; diff --git a/dbms/tests/queries/0_stateless/01104_distributed_one_test.reference b/dbms/tests/queries/0_stateless/01104_distributed_one_test.reference new file mode 100644 index 00000000000..929dd64ae90 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01104_distributed_one_test.reference @@ -0,0 +1,6 @@ +local_0 1 +distributed_0 1 1 +distributed_0 2 1 +local_0 1 +distributed_0 1 1 +distributed_0 2 1 diff --git a/dbms/tests/queries/0_stateless/01104_distributed_one_test.sql b/dbms/tests/queries/0_stateless/01104_distributed_one_test.sql new file mode 100644 index 00000000000..92b4a83ebf3 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01104_distributed_one_test.sql @@ -0,0 +1,18 @@ +DROP TABLE IF EXISTS d_one; +CREATE TABLE d_one (dummy UInt8) ENGINE = Distributed(test_cluster_two_shards_localhost, system, one, rand()); + +SELECT 'local_0', toUInt8(1) AS dummy FROM system.one AS o WHERE o.dummy = 0; +SELECT 'local_1', toUInt8(1) AS dummy FROM system.one AS o WHERE o.dummy = 1; + +SELECT 'distributed_0', _shard_num, toUInt8(1) AS dummy FROM d_one AS o WHERE o.dummy = 0 ORDER BY _shard_num; +SELECT 'distributed_1', _shard_num, toUInt8(1) AS dummy FROM d_one AS o WHERE o.dummy = 1 ORDER BY _shard_num; + +SET distributed_product_mode = 'local'; + +SELECT 'local_0', toUInt8(1) AS dummy FROM system.one AS o WHERE o.dummy = 0; +SELECT 'local_1', toUInt8(1) AS dummy FROM system.one AS o WHERE o.dummy = 1; + +SELECT 'distributed_0', _shard_num, toUInt8(1) AS dummy FROM d_one AS o WHERE o.dummy = 0 ORDER BY _shard_num; +SELECT 'distributed_1', _shard_num, toUInt8(1) AS dummy FROM d_one AS o WHERE o.dummy = 1 ORDER BY _shard_num; + +DROP TABLE d_one; diff --git a/dbms/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.reference b/dbms/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.reference new file mode 100644 index 00000000000..4ade9cd9c5d --- /dev/null +++ b/dbms/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.reference @@ -0,0 +1,8 @@ +distributed_group_by_no_merge +1 +1 +optimize_skip_unused_shards +1 +optimize_skip_unused_shards lack of WHERE +0 +1 diff --git a/dbms/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.sql b/dbms/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.sql new file mode 100644 index 00000000000..5b45bea9046 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01213_optimize_skip_unused_shards_DISTINCT.sql @@ -0,0 +1,19 @@ +CREATE TABLE IF NOT EXISTS local_01213 (id Int) ENGINE = MergeTree ORDER BY tuple(); +CREATE TABLE IF NOT EXISTS dist_01213 AS local_01213 ENGINE = Distributed(test_cluster_two_shards_localhost, currentDatabase(), local_01213, id); + +-- at least two parts +INSERT INTO local_01213 SELECT toString(number) FROM numbers(2); +INSERT INTO local_01213 SELECT toString(number) FROM numbers(2); + +-- check that without merge we will have two rows +SELECT 'distributed_group_by_no_merge'; +SELECT DISTINCT id FROM dist_01213 WHERE id = 1 SETTINGS distributed_group_by_no_merge=1; +-- check that with merge there will be only one +SELECT 'optimize_skip_unused_shards'; +SELECT DISTINCT id FROM dist_01213 WHERE id = 1 SETTINGS optimize_skip_unused_shards=1; +-- check that querying all shards is ok +SELECT 'optimize_skip_unused_shards lack of WHERE'; +SELECT DISTINCT id FROM dist_01213 SETTINGS optimize_skip_unused_shards=1; + +DROP TABLE local_01213; +DROP TABLE dist_01213; diff --git a/dbms/tests/queries/0_stateless/01220_scalar_optimization_in_alter.reference b/dbms/tests/queries/0_stateless/01220_scalar_optimization_in_alter.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/dbms/tests/queries/0_stateless/01220_scalar_optimization_in_alter.sql b/dbms/tests/queries/0_stateless/01220_scalar_optimization_in_alter.sql new file mode 100644 index 00000000000..de92b29ce5d --- /dev/null +++ b/dbms/tests/queries/0_stateless/01220_scalar_optimization_in_alter.sql @@ -0,0 +1,9 @@ +drop table if exists cdp_segments; +drop table if exists cdp_customers; + +create table cdp_segments (seg_id String, mid_seqs AggregateFunction(groupBitmap, UInt32)) engine=ReplacingMergeTree() order by (seg_id); +create table cdp_customers (mid String, mid_seq UInt32) engine=ReplacingMergeTree() order by (mid_seq); +alter table cdp_segments update mid_seqs = bitmapOr(mid_seqs, (select groupBitmapState(mid_seq) from cdp_customers where mid in ('6bf3c2ee-2b33-3030-9dc2-25c6c618d141'))) where seg_id = '1234567890'; + +drop table cdp_segments; +drop table cdp_customers; diff --git a/dbms/tests/queries/0_stateless/01221_system_settings.reference b/dbms/tests/queries/0_stateless/01221_system_settings.reference new file mode 100644 index 00000000000..83c2c258c6e --- /dev/null +++ b/dbms/tests/queries/0_stateless/01221_system_settings.reference @@ -0,0 +1,4 @@ +send_timeout 300 0 \N \N 0 SettingSeconds +replicated_max_parallel_sends 0 0 Limit parallel sends. SettingUInt64 +1 +1 diff --git a/dbms/tests/queries/0_stateless/01221_system_settings.sql b/dbms/tests/queries/0_stateless/01221_system_settings.sql new file mode 100644 index 00000000000..5f4755add61 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01221_system_settings.sql @@ -0,0 +1,34 @@ +select * from system.settings where name = 'send_timeout'; +select * from system.merge_tree_settings order by length(description) limit 1; + +with [ + 'SettingSeconds', + 'SettingBool', + 'SettingInt64', + 'SettingString', + 'SettingChar', + 'SettingLogsLevel', + 'SettingURI', + 'SettingFloat', + 'SettingUInt64', + 'SettingMaxThreads', + 'SettingMilliseconds', + 'SettingJoinStrictness', + 'SettingJoinAlgorithm', + 'SettingOverflowMode', + 'SettingTotalsMode', + 'SettingLoadBalancing', + 'SettingOverflowModeGroupBy', + 'SettingDateTimeInputFormat', + 'SettingDistributedProductMode' +] as types select hasAll(arrayDistinct(groupArray(type)), types) from system.settings; + +with [ + 'SettingSeconds', + 'SettingBool', + 'SettingInt64', + 'SettingString', + 'SettingFloat', + 'SettingUInt64', + 'SettingMaxThreads' +] as types select hasAll(arrayDistinct(groupArray(type)), types) from system.merge_tree_settings; diff --git a/dbms/tests/queries/0_stateless/01230_join_get_truncate.reference b/dbms/tests/queries/0_stateless/01230_join_get_truncate.reference new file mode 100644 index 00000000000..d6dfd285646 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01230_join_get_truncate.reference @@ -0,0 +1,3 @@ +500 +1000 +1000 diff --git a/dbms/tests/queries/0_stateless/01230_join_get_truncate.sql b/dbms/tests/queries/0_stateless/01230_join_get_truncate.sql new file mode 100644 index 00000000000..b9c58fc5173 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01230_join_get_truncate.sql @@ -0,0 +1,27 @@ +DROP TABLE IF EXISTS join_test; + +CREATE TABLE join_test (id UInt16, num UInt16) engine = Join(ANY, LEFT, id) settings join_any_take_last_row = 1; + +INSERT INTO join_test (id, num) SELECT number, number FROM system.numbers LIMIT 1000; + +SELECT joinGet('join_test', 'num', 500); + +-- joinGet('join_test', 'num', 500) will be 500 and it is fine +-- replace all the values + +INSERT INTO join_test (id, num) SELECT number, number * 2 FROM system.numbers LIMIT 1000; + +SELECT joinGet ('join_test', 'num', 500); + +-- joinGet('join_test', 'num', 500) will be 1000 and it is fine + +TRUNCATE TABLE join_test; + +INSERT INTO join_test (id, num) SELECT number, number FROM system.numbers LIMIT 1000; + +INSERT INTO join_test (id, num) SELECT number, number * 2 FROM system.numbers LIMIT 1000; + +SELECT joinGet('join_test', 'num', 500); + +-- joinGet('join_test', 'num', 500) will be 1000 and it is not fine +DROP TABLE join_test; diff --git a/docker/test/stateless/Dockerfile b/docker/test/stateless/Dockerfile index b5604855b38..2d2025de58b 100644 --- a/docker/test/stateless/Dockerfile +++ b/docker/test/stateless/Dockerfile @@ -30,7 +30,8 @@ RUN apt-get update -y \ lsof \ llvm-9 \ unixodbc \ - wget + wget \ + qemu-user-static RUN mkdir -p /tmp/clickhouse-odbc-tmp \ && wget --quiet -O - ${odbc_driver_url} | tar --strip-components=1 -xz -C /tmp/clickhouse-odbc-tmp \ diff --git a/docker/test/stateless_with_coverage/Dockerfile b/docker/test/stateless_with_coverage/Dockerfile index 4da82c67c40..f872f87b3f4 100644 --- a/docker/test/stateless_with_coverage/Dockerfile +++ b/docker/test/stateless_with_coverage/Dockerfile @@ -33,7 +33,8 @@ RUN apt-get update -y \ lsof \ llvm-9 \ unixodbc \ - wget + wget \ + qemu-user-static RUN mkdir -p /tmp/clickhouse-odbc-tmp \ && wget --quiet -O - ${odbc_driver_url} | tar --strip-components=1 -xz -C /tmp/clickhouse-odbc-tmp \ diff --git a/docker/test/stress/Dockerfile b/docker/test/stress/Dockerfile index 116f4ec03f2..4d983ec4695 100644 --- a/docker/test/stress/Dockerfile +++ b/docker/test/stress/Dockerfile @@ -19,7 +19,7 @@ RUN apt-get update -y \ openssl \ netcat-openbsd \ telnet \ - llvm-8 \ + llvm-9 \ brotli COPY ./stress /stress @@ -33,7 +33,7 @@ CMD dpkg -i package_folder/clickhouse-common-static_*.deb; \ dpkg -i package_folder/clickhouse-test_*.deb; \ ln -s /usr/share/clickhouse-test/config/log_queries.xml /etc/clickhouse-server/users.d/; \ ln -s /usr/share/clickhouse-test/config/part_log.xml /etc/clickhouse-server/config.d/; \ - ln -s /usr/lib/llvm-8/bin/llvm-symbolizer /usr/bin/llvm-symbolizer; \ + ln -s /usr/lib/llvm-9/bin/llvm-symbolizer /usr/bin/llvm-symbolizer; \ echo "TSAN_OPTIONS='halt_on_error=1 history_size=7 ignore_noninstrumented_modules=1 verbosity=1'" >> /etc/environment; \ echo "UBSAN_OPTIONS='print_stacktrace=1'" >> /etc/environment; \ service clickhouse-server start && sleep 5 \ diff --git a/docs/en/operations/system_tables.md b/docs/en/operations/system_tables.md index 4280c4c0ea7..1ef90001ae1 100644 --- a/docs/en/operations/system_tables.md +++ b/docs/en/operations/system_tables.md @@ -841,25 +841,42 @@ Columns: - `name` (String) — Setting name. - `value` (String) — Setting value. +- `description` (String) — Setting description. +- `type` (String) — Setting type (implementation specific string value). - `changed` (UInt8) — Whether the setting was explicitly defined in the config or explicitly changed. +- `min` (Nullable(String)) — Get minimum allowed value (if any is set via [constraints](settings/constraints_on_settings.md#constraints-on-settings)). +- `max` (Nullable(String)) — Get maximum allowed value (if any is set via [constraints](settings/constraints_on_settings.md#constraints-on-settings)). +- `readonly` (UInt8) — Can user change this setting (for more info, look into [constraints](settings/constraints_on_settings.md#constraints-on-settings)). Example: ``` sql -SELECT * +SELECT name, value FROM system.settings WHERE changed ``` ``` text -┌─name───────────────────┬─value───────┬─changed─┐ -│ max_threads │ 8 │ 1 │ -│ use_uncompressed_cache │ 0 │ 1 │ -│ load_balancing │ random │ 1 │ -│ max_memory_usage │ 10000000000 │ 1 │ -└────────────────────────┴─────────────┴─────────┘ +┌─name───────────────────┬─value───────┐ +│ max_threads │ 8 │ +│ use_uncompressed_cache │ 0 │ +│ load_balancing │ random │ +│ max_memory_usage │ 10000000000 │ +└────────────────────────┴─────────────┘ ``` +## system.merge\_tree\_settings {#system-merge_tree_settings} + +Contains information about settings for `MergeTree` tables. + +Columns: + +- `name` (String) — Setting name. +- `value` (String) — Setting value. +- `description` (String) — Setting description. +- `type` (String) — Setting type (implementation specific string value). +- `changed` (UInt8) — Whether the setting was explicitly defined in the config or explicitly changed. + ## system.table\_engines {#system-table-engines} Contains description of table engines supported by server and their feature support information. @@ -917,6 +934,16 @@ This table contains the following columns (the column type is shown in brackets) - `sorting_key` (String) - The sorting key expression specified in the table. - `primary_key` (String) - The primary key expression specified in the table. - `sampling_key` (String) - The sampling key expression specified in the table. +- `storage_policy` (String) - The storage policy: + + - [MergeTree](table_engines/mergetree.md#table_engine-mergetree-multiple-volumes) + - [Distributed](table_engines/distributed.md#distributed) + +- `total_rows` (Nullable(UInt64)) - Total number of rows, if it is possible to quickly determine exact number of rows in the table, otherwise `Null` (including underying `Buffer` table). +- `total_bytes` (Nullable(UInt64)) - Total number of bytes, if it is possible to quickly determine exact number of bytes for the table on storage, otherwise `Null` (**does not** includes any underlying storage). + + - If the table stores data on disk, returns used space on disk (i.e. compressed). + - If the table stores data in memory, returns approximated number of used bytes in memory. The `system.tables` table is used in `SHOW TABLES` query implementation. diff --git a/docs/en/operations/tips.md b/docs/en/operations/tips.md index 01d322c325d..b18ee5384bd 100644 --- a/docs/en/operations/tips.md +++ b/docs/en/operations/tips.md @@ -241,4 +241,4 @@ script end script ``` -[Original article](https://clickhouse.tech/docs/en/operations/tips/) +{## [Original article](https://clickhouse.tech/docs/en/operations/tips/) ##} diff --git a/docs/en/query_language/functions/array_functions.md b/docs/en/query_language/functions/array_functions.md index 315b523054a..663b096fc3d 100644 --- a/docs/en/query_language/functions/array_functions.md +++ b/docs/en/query_language/functions/array_functions.md @@ -804,17 +804,30 @@ SELECT └──────────────┴───────────┘ ``` -## arrayReduce(agg\_func, arr1, …) {#array-functions-arrayreduce} +## arrayReduce {#arrayreduce} Applies an aggregate function to array elements and returns its result. The name of the aggregation function is passed as a string in single quotes `'max'`, `'sum'`. When using parametric aggregate functions, the parameter is indicated after the function name in parentheses `'uniqUpTo(6)'`. -Example: +**Syntax** -``` sql +```sql +arrayReduce(agg_func, arr1, arr2, ..., arrN) +``` + +**Parameters** + +* `agg_func` — The name of an aggregate function which should be a constant [string](../../data_types/string.md). +* `arr` — Any number of [array](../../data_types/array.md) type columns as the parameters of the aggregation function. + +**Returned value** + +**Example** + +```sql SELECT arrayReduce('max', [1, 2, 3]) ``` -``` text +```text ┌─arrayReduce('max', [1, 2, 3])─┐ │ 3 │ └───────────────────────────────┘ @@ -822,13 +835,11 @@ SELECT arrayReduce('max', [1, 2, 3]) If an aggregate function takes multiple arguments, then this function must be applied to multiple arrays of the same size. -Example: - -``` sql +```sql SELECT arrayReduce('maxIf', [3, 5], [1, 0]) ``` -``` text +```text ┌─arrayReduce('maxIf', [3, 5], [1, 0])─┐ │ 3 │ └──────────────────────────────────────┘ @@ -836,17 +847,51 @@ SELECT arrayReduce('maxIf', [3, 5], [1, 0]) Example with a parametric aggregate function: -``` sql +```sql SELECT arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) ``` -``` text +```text ┌─arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])─┐ │ 4 │ └─────────────────────────────────────────────────────────────┘ ``` -## arrayReverse(arr) {#array_functions-arrayreverse} +## arrayReduceInRanges {#arrayreduceinranges} + +Applies an aggregate function to array elements in given ranges and returns an array containing the result corresponding to each range. The function will return the same result as multiple `arrayReduce(agg_func, arraySlice(arr1, index, length), ...)`. + +**Syntax** + +```sql +arrayReduceInRanges(agg_func, ranges, arr1, arr2, ..., arrN) +``` + +**Parameters** + +* `agg_func` — The name of an aggregate function which should be a constant [string](../../data_types/string.md). +* `ranges` — The ranges to aggretate which should be an [array](../../data_types/array.md) of [tuples](../../data_types/tuple.md) which containing the index and the length of each range. +* `arr` — Any number of [array](../../data_types/array.md) type columns as the parameters of the aggregation function. + +**Returned value** + +**Example** + +```sql +SELECT arrayReduceInRanges( + 'sum', + [(1, 5), (2, 3), (3, 4), (4, 4)], + [1000000, 200000, 30000, 4000, 500, 60, 7] +) AS res +``` + +```text +┌─res─────────────────────────┐ +│ [1234500,234000,34560,4567] │ +└─────────────────────────────┘ +``` + +## arrayReverse(arr) {#arrayreverse} Returns an array of the same size as the original array containing the elements in reverse order. diff --git a/docs/en/query_language/functions/comparison_functions.md b/docs/en/query_language/functions/comparison_functions.md index 4505cc8cbf1..6865fce5ef0 100644 --- a/docs/en/query_language/functions/comparison_functions.md +++ b/docs/en/query_language/functions/comparison_functions.md @@ -15,18 +15,16 @@ For example, you can’t compare a date with a string. You have to use a functio Strings are compared by bytes. A shorter string is smaller than all strings that start with it and that contain at least one more character. -Note. Up until version 1.1.54134, signed and unsigned numbers were compared the same way as in C++. In other words, you could get an incorrect result in cases like SELECT 9223372036854775807 \> -1. This behavior changed in version 1.1.54134 and is now mathematically correct. - ## equals, a = b and a == b operator {#function-equals} -## notEquals, a ! operator= b and a `<>` b {#function-notequals} +## notEquals, a ! operator= b and a <> b {#function-notequals} -## less, `< operator` {#function-less} +## less, < operator {#function-less} -## greater, `> operator` {#function-greater} +## greater, > operator {#function-greater} -## lessOrEquals, `<= operator` {#function-lessorequals} +## lessOrEquals, <= operator {#function-lessorequals} -## greaterOrEquals, `>= operator` {#function-greaterorequals} +## greaterOrEquals, >= operator {#function-greaterorequals} [Original article](https://clickhouse.tech/docs/en/query_language/functions/comparison_functions/) diff --git a/docs/es/changelog/2017.md b/docs/es/changelog/2017.md index 1f443076151..b80e820169d 100644 --- a/docs/es/changelog/2017.md +++ b/docs/es/changelog/2017.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + ### Lanzamiento de ClickHouse 1.1.54327, 2017-12-21 {#clickhouse-release-1-1-54327-2017-12-21} Esta versión contiene correcciones de errores para la versión anterior 1.1.54318: diff --git a/docs/es/changelog/2018.md b/docs/es/changelog/2018.md deleted file mode 120000 index 20799251f43..00000000000 --- a/docs/es/changelog/2018.md +++ /dev/null @@ -1 +0,0 @@ -../../en/changelog/2018.md \ No newline at end of file diff --git a/docs/es/changelog/2018.md b/docs/es/changelog/2018.md new file mode 100644 index 00000000000..7aa67e7934e --- /dev/null +++ b/docs/es/changelog/2018.md @@ -0,0 +1,1058 @@ +--- +machine_translated: true +--- + +## Lanzamiento de ClickHouse 18.16 {#clickhouse-release-18-16} + +### Lanzamiento de ClickHouse 18.16.1, 2018-12-21 {#clickhouse-release-18-16-1-2018-12-21} + +#### Corrección de errores: {#bug-fixes} + +- Se corrigió un error que provocaba problemas con la actualización de diccionarios con el origen ODBC. [\#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [\#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- La compilación JIT de funciones agregadas ahora funciona con columnas LowCardinality. [\#3838](https://github.com/ClickHouse/ClickHouse/issues/3838) + +#### Mejora: {#improvements} + +- Se agregó el `low_cardinality_allow_in_native_format` configuración (habilitada por defecto). Cuando se deshabilita, las columnas LowCardinality se convertirán en columnas ordinarias para las consultas SELECT y se esperarán columnas ordinarias para las consultas INSERT. [\#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) + +#### Mejoras de construcción: {#build-improvements} + +- Correcciones para compilaciones en macOS y ARM. + +### Lanzamiento de ClickHouse 18.16.0, 2018-12-14 {#clickhouse-release-18-16-0-2018-12-14} + +#### Novedad: {#new-features} + +- `DEFAULT` Las expresiones se evalúan en busca de campos faltantes al cargar datos en formatos de entrada semiestructurados (`JSONEachRow`, `TSKV`). La función está habilitada con `insert_sample_with_metadata` configuración. [\#3555](https://github.com/ClickHouse/ClickHouse/pull/3555) +- El `ALTER TABLE` consulta ahora tiene el `MODIFY ORDER BY` acción para cambiar la clave de ordenación al agregar o eliminar una columna de tabla. Esto es útil para las tablas `MergeTree` familia que realizan tareas adicionales al fusionarse basándose en esta clave de ordenación, como `SummingMergeTree`, `AggregatingMergeTree` y así sucesivamente. [\#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) [\#3755](https://github.com/ClickHouse/ClickHouse/pull/3755) +- Para las tablas en el `MergeTree` familia, ahora puede especificar una clave de clasificación diferente (`ORDER BY`) e índice (`PRIMARY KEY`). La clave de ordenación puede ser más larga que el índice. [\#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) +- Se agregó el `hdfs` función de la tabla y el `HDFS` para importar y exportar datos a HDFS. [Más información](https://github.com/ClickHouse/ClickHouse/pull/3617) +- Funciones añadidas para trabajar con base64: `base64Encode`, `base64Decode`, `tryBase64Decode`. [Alejandro Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3350) +- Ahora puede usar un parámetro para configurar la precisión del `uniqCombined` función de agregado (seleccione el número de celdas HyperLogLog). [\#3406](https://github.com/ClickHouse/ClickHouse/pull/3406) +- Se agregó el `system.contributors` tabla que contiene los nombres de todos los que hicieron compromete en ClickHouse. [\#3452](https://github.com/ClickHouse/ClickHouse/pull/3452) +- Se agregó la capacidad de omitir la partición para el `ALTER TABLE ... FREEZE` consulta para hacer una copia de seguridad de todas las particiones a la vez. [\#3514](https://github.com/ClickHouse/ClickHouse/pull/3514) +- Añadir `dictGet` y `dictGetOrDefault` funciones que no requieren especificar el tipo de valor de retorno. El tipo se determina automáticamente a partir de la descripción del diccionario. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3564) +- Ahora puede especificar comentarios para una columna en la descripción de la tabla y cambiarla usando `ALTER`. [\#3377](https://github.com/ClickHouse/ClickHouse/pull/3377) +- La lectura es compatible para `Join` tablas de escribir con teclas simples. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Ahora puede especificar las opciones `join_use_nulls`, `max_rows_in_join`, `max_bytes_in_join`, y `join_overflow_mode` al crear un `Join` tabla de tipo. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Se agregó el `joinGet` función que le permite utilizar un `Join` tipo de tabla como un diccionario. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Se agregó el `partition_key`, `sorting_key`, `primary_key`, y `sampling_key` columnas a la `system.tables` tabla con el fin de proporcionar información sobre las claves de la tabla. [\#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Se agregó el `is_in_partition_key`, `is_in_sorting_key`, `is_in_primary_key`, y `is_in_sampling_key` columnas a la `system.columns` tabla. [\#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Se agregó el `min_time` y `max_time` columnas a la `system.parts` tabla. Estas columnas se rellenan cuando la clave de partición es una expresión que consiste en `DateTime` columna. [Emmanuel Donin de Rosière](https://github.com/ClickHouse/ClickHouse/pull/3800) + +#### Corrección de errores: {#bug-fixes-1} + +- Correcciones y mejoras de rendimiento para el `LowCardinality` tipo de datos. `GROUP BY` utilizar `LowCardinality(Nullable(...))`. Obtener los valores de `extremes`. Procesamiento de funciones de orden superior. `LEFT ARRAY JOIN`. Distribuido `GROUP BY`. Funciones que devuelven `Array`. Ejecución de `ORDER BY`. Escribir a `Distributed` tablas (nicelulu). Compatibilidad con versiones anteriores para `INSERT` consultas de clientes antiguos que implementan el `Native` protocolo. Soporte para `LowCardinality` para `JOIN`. Rendimiento mejorado cuando se trabaja en un solo flujo. [\#3823](https://github.com/ClickHouse/ClickHouse/pull/3823) [\#3803](https://github.com/ClickHouse/ClickHouse/pull/3803) [\#3799](https://github.com/ClickHouse/ClickHouse/pull/3799) [\#3769](https://github.com/ClickHouse/ClickHouse/pull/3769) [\#3744](https://github.com/ClickHouse/ClickHouse/pull/3744) [\#3681](https://github.com/ClickHouse/ClickHouse/pull/3681) [\#3651](https://github.com/ClickHouse/ClickHouse/pull/3651) [\#3649](https://github.com/ClickHouse/ClickHouse/pull/3649) [\#3641](https://github.com/ClickHouse/ClickHouse/pull/3641) [\#3632](https://github.com/ClickHouse/ClickHouse/pull/3632) [\#3568](https://github.com/ClickHouse/ClickHouse/pull/3568) [\#3523](https://github.com/ClickHouse/ClickHouse/pull/3523) [\#3518](https://github.com/ClickHouse/ClickHouse/pull/3518) +- Corregido cómo el `select_sequential_consistency` opción funciona. Anteriormente, cuando se habilitaba esta configuración, a veces se devolvía un resultado incompleto después de comenzar a escribir en una nueva partición. [\#2863](https://github.com/ClickHouse/ClickHouse/pull/2863) +- Las bases de datos se especifican correctamente al ejecutar DDL `ON CLUSTER` consultas y `ALTER UPDATE/DELETE`. [\#3772](https://github.com/ClickHouse/ClickHouse/pull/3772) [\#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Las bases de datos se especifican correctamente para las subconsultas dentro de una VIEW. [\#3521](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Se ha corregido un error en `PREWHERE` con `FINAL` para `VersionedCollapsingMergeTree`. [7167bfd7](https://github.com/ClickHouse/ClickHouse/commit/7167bfd7b365538f7a91c4307ad77e552ab4e8c1) +- Ahora puedes usar `KILL QUERY` para cancelar consultas que aún no se han iniciado porque están esperando a que se bloquee la tabla. [\#3517](https://github.com/ClickHouse/ClickHouse/pull/3517) +- Se corrigieron los cálculos de fecha y hora si los relojes se movían hacia atrás a la medianoche (esto sucede en Irán, y sucedió en Moscú de 1981 a 1983). Anteriormente, esto llevaba a que la hora se restableciera un día antes de lo necesario, y también causaba un formato incorrecto de la fecha y la hora en formato de texto. [\#3819](https://github.com/ClickHouse/ClickHouse/pull/3819) +- Se corrigieron errores en algunos casos de `VIEW` y subconsultas que omiten la base de datos. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Se corrigió una condición de carrera al leer simultáneamente desde un `MATERIALIZED VIEW` y eliminar un `MATERIALIZED VIEW` debido a no bloquear el interior `MATERIALIZED VIEW`. [\#3404](https://github.com/ClickHouse/ClickHouse/pull/3404) [\#3694](https://github.com/ClickHouse/ClickHouse/pull/3694) +- Corregido el error `Lock handler cannot be nullptr.` [\#3689](https://github.com/ClickHouse/ClickHouse/pull/3689) +- Procesamiento de consultas fijo cuando el `compile_expressions` la opción está habilitada (está habilitada por defecto). Expresiones constantes no deterministas como el `now` función ya no están desplegados. [\#3457](https://github.com/ClickHouse/ClickHouse/pull/3457) +- Se corrigió un bloqueo al especificar un argumento de escala no constante en `toDecimal32/64/128` función. +- Se corrigió un error al intentar insertar una matriz con `NULL` elementos en el `Values` formato en una columna de tipo `Array` sin `Nullable` (si `input_format_values_interpret_expressions` = 1). [\#3487](https://github.com/ClickHouse/ClickHouse/pull/3487) [\#3503](https://github.com/ClickHouse/ClickHouse/pull/3503) +- Se corrigió el registro continuo de errores en `DDLWorker` si ZooKeeper no está disponible. [8f50c620](https://github.com/ClickHouse/ClickHouse/commit/8f50c620334988b28018213ec0092fe6423847e2) +- Se corrigió el tipo de retorno para `quantile*` funciones de `Date` y `DateTime` de argumentos. [\#3580](https://github.com/ClickHouse/ClickHouse/pull/3580) +- Se corrigió el `WITH` cláusula si especifica un alias simple sin expresiones. [\#3570](https://github.com/ClickHouse/ClickHouse/pull/3570) +- Se corrigió el procesamiento de consultas con subconsultas con nombre y nombres de columna calificados cuando `enable_optimize_predicate_expression` está habilitado. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3588) +- Corregido el error `Attempt to attach to nullptr thread group` cuando se trabaja con vistas materializadas. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3623) +- Se corrigió un bloqueo al pasar ciertos argumentos incorrectos a la `arrayReverse` función. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Se corrigió el desbordamiento del búfer en el `extractURLParameter` función. Rendimiento mejorado. Se agregó el procesamiento correcto de cadenas que contienen cero bytes. [Método de codificación de datos:](https://github.com/ClickHouse/ClickHouse/commit/141e9799e49201d84ea8e951d1bed4fb6d3dacb5) +- Desbordamiento de búfer fijo en el `lowerUTF8` y `upperUTF8` función. Se eliminó la capacidad de ejecutar estas funciones sobre `FixedString` argumentos de tipo. [\#3662](https://github.com/ClickHouse/ClickHouse/pull/3662) +- Se corrigió una rara condición de carrera al eliminar `MergeTree` tabla. [\#3680](https://github.com/ClickHouse/ClickHouse/pull/3680) +- Se corrigió una condición de carrera al leer desde `Buffer` tablas y realizar simultáneamente `ALTER` o `DROP` en las tablas de destino. [\#3719](https://github.com/ClickHouse/ClickHouse/pull/3719) +- Se corrigió una segfault si el `max_temporary_non_const_columns` se excedió el límite. [\#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Mejora: {#improvements-1} + +- El servidor no escribe los archivos de configuración procesados `/etc/clickhouse-server/` directorio. En su lugar, los guarda en el `preprocessed_configs` directorio dentro `path`. Esto significa que el `/etc/clickhouse-server/` directorio no tiene acceso de escritura para el `clickhouse` usuario, lo que mejora la seguridad. [\#2443](https://github.com/ClickHouse/ClickHouse/pull/2443) +- El `min_merge_bytes_to_use_direct_io` La opción está establecida en 10 GiB de forma predeterminada. Una combinación que forma partes grandes de tablas de la familia MergeTree se realizará en `O_DIRECT` modo, que evita el desalojo excesivo de la caché de la página. [\#3504](https://github.com/ClickHouse/ClickHouse/pull/3504) +- Se inicia el servidor acelerado cuando hay un gran número de tablas. [\#3398](https://github.com/ClickHouse/ClickHouse/pull/3398) +- Se agregó un grupo de conexiones y HTTP `Keep-Alive` para conexiones entre réplicas. [\#3594](https://github.com/ClickHouse/ClickHouse/pull/3594) +- Si la sintaxis de la consulta no es válida, `400 Bad Request` el código se devuelve en el `HTTP` interfaz (500 se devolvió anteriormente). [31bc680a](https://github.com/ClickHouse/ClickHouse/commit/31bc680ac5f4bb1d0360a8ba4696fa84bb47d6ab) +- El `join_default_strictness` opción se establece en `ALL` por defecto para la compatibilidad. [120e2cbe](https://github.com/ClickHouse/ClickHouse/commit/120e2cbe2ff4fbad626c28042d9b28781c805afe) +- Se eliminó el registro a `stderr` de la `re2` biblioteca para expresiones regulares no válidas o complejas. [\#3723](https://github.com/ClickHouse/ClickHouse/pull/3723) +- Añadido para el `Kafka` motor de tabla: comprueba si hay suscripciones antes de comenzar a leer de Kafka; la configuración kafka\_max\_block\_size para la tabla. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3396) +- El `cityHash64`, `farmHash64`, `metroHash64`, `sipHash64`, `halfMD5`, `murmurHash2_32`, `murmurHash2_64`, `murmurHash3_32`, y `murmurHash3_64` funciones ahora funcionan para cualquier número de argumentos y para argumentos en forma de tuplas. [\#3451](https://github.com/ClickHouse/ClickHouse/pull/3451) [\#3519](https://github.com/ClickHouse/ClickHouse/pull/3519) +- El `arrayReverse` función ahora funciona con cualquier tipo de matrices. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Se ha añadido un parámetro opcional: el tamaño de la ranura `timeSlots` función. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3724) +- Para `FULL` y `RIGHT JOIN`, el `max_block_size` configuración se utiliza para un flujo de datos no unidos de la tabla de la derecha. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3699) +- Se agregó el `--secure` parámetro de línea de comandos en `clickhouse-benchmark` y `clickhouse-performance-test` para habilitar TLS. [\#3688](https://github.com/ClickHouse/ClickHouse/pull/3688) [\#3690](https://github.com/ClickHouse/ClickHouse/pull/3690) +- Conversión de tipo cuando la estructura de un `Buffer` type table no coincide con la estructura de la tabla de destino. [Vitaly Baranov](https://github.com/ClickHouse/ClickHouse/pull/3603) +- Se agregó el `tcp_keep_alive_timeout` opción para habilitar los paquetes keep-alive después de la inactividad durante el intervalo de tiempo especificado. [\#3441](https://github.com/ClickHouse/ClickHouse/pull/3441) +- Eliminado cotización innecesaria de valores para la clave de partición en el `system.parts` tabla si consiste en una sola columna. [\#3652](https://github.com/ClickHouse/ClickHouse/pull/3652) +- La función de módulo funciona para `Date` y `DateTime` tipos de datos. [\#3385](https://github.com/ClickHouse/ClickHouse/pull/3385) +- Sinónimos añadidos para el `POWER`, `LN`, `LCASE`, `UCASE`, `REPLACE`, `LOCATE`, `SUBSTR`, y `MID` función. [\#3774](https://github.com/ClickHouse/ClickHouse/pull/3774) [\#3763](https://github.com/ClickHouse/ClickHouse/pull/3763) Algunos nombres de funciones no distinguen entre mayúsculas y minúsculas por su compatibilidad con el estándar SQL. Azúcar sintáctico añadido `SUBSTRING(expr FROM start FOR length)` por compatibilidad con SQL. [\#3804](https://github.com/ClickHouse/ClickHouse/pull/3804) +- Se agregó la capacidad de `mlock` páginas de memoria correspondientes a `clickhouse-server` código ejecutable para evitar que se vea obligado a salir de la memoria. Esta función está deshabilitada de forma predeterminada. [\#3553](https://github.com/ClickHouse/ClickHouse/pull/3553) +- Rendimiento mejorado al leer desde `O_DIRECT` (con el `min_bytes_to_use_direct_io` opción activada). [\#3405](https://github.com/ClickHouse/ClickHouse/pull/3405) +- Rendimiento mejorado del `dictGet...OrDefault` función para un argumento de clave constante y un argumento predeterminado no constante. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3563) +- El `firstSignificantSubdomain` función ahora procesa los dominios `gov`, `mil`, y `edu`. [Igor Hatarist](https://github.com/ClickHouse/ClickHouse/pull/3601) Rendimiento mejorado. [\#3628](https://github.com/ClickHouse/ClickHouse/pull/3628) +- Posibilidad de especificar variables de entorno personalizadas para iniciar `clickhouse-server` utilizando el `SYS-V init.d` secuencia de comandos definiendo `CLICKHOUSE_PROGRAM_ENV` en `/etc/default/clickhouse`. + [Pavlo Bashynskyi](https://github.com/ClickHouse/ClickHouse/pull/3612) +- Corrija el código de retorno para el script init de clickhouse-server. [\#3516](https://github.com/ClickHouse/ClickHouse/pull/3516) +- El `system.metrics` ahora tiene el `VersionInteger` métrica, y `system.build_options` tiene la línea añadida `VERSION_INTEGER`, que contiene la forma numérica de la versión de ClickHouse, como `18016000`. [\#3644](https://github.com/ClickHouse/ClickHouse/pull/3644) +- Eliminado la capacidad de comparar el `Date` escriba con un número para evitar posibles errores como `date = 2018-12-17`, donde las comillas alrededor de la fecha se omiten por error. [\#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) +- Se corrigió el comportamiento de las funciones con estado como `rowNumberInAllBlocks`. Anteriormente generaron un resultado que era un número mayor debido al inicio durante el análisis de consultas. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3729) +- Si el `force_restore_data` no se puede eliminar, se muestra un mensaje de error. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3794) + +#### Mejoras de construcción: {#build-improvements-1} + +- Actualizado el `jemalloc` biblioteca, que corrige una posible pérdida de memoria. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3557) +- Perfilado con `jemalloc` está habilitado de forma predeterminada para depurar compilaciones. [2cc82f5c](https://github.com/ClickHouse/ClickHouse/commit/2cc82f5cbe266421cd4c1165286c2c47e5ffcb15) +- Se agregó la capacidad de ejecutar pruebas de integración cuando solo `Docker` está instalado en el sistema. [\#3650](https://github.com/ClickHouse/ClickHouse/pull/3650) +- Se agregó la prueba de expresión fuzz en consultas SELECT. [\#3442](https://github.com/ClickHouse/ClickHouse/pull/3442) +- Se agregó una prueba de esfuerzo para confirmaciones, que realiza pruebas funcionales en paralelo y en orden aleatorio para detectar más condiciones de carrera. [\#3438](https://github.com/ClickHouse/ClickHouse/pull/3438) +- Se mejoró el método para iniciar clickhouse-server en una imagen de Docker. [Método de codificación de datos:](https://github.com/ClickHouse/ClickHouse/pull/3663) +- Para una imagen de Docker, se agregó soporte para inicializar bases de datos utilizando `/docker-entrypoint-initdb.d` directorio. [Konstantin Lebedev](https://github.com/ClickHouse/ClickHouse/pull/3695) +- Correcciones para construye en ARM. [\#3709](https://github.com/ClickHouse/ClickHouse/pull/3709) + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes} + +- Eliminado la capacidad de comparar el `Date` escriba con un número. En lugar de `toDate('2018-12-18') = 17883`, debe usar la conversión de tipo explícita `= toDate(17883)` [\#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) + +## Lanzamiento de ClickHouse 18.14 {#clickhouse-release-18-14} + +### Lanzamiento de ClickHouse 18.14.19, 2018-12-19 {#clickhouse-release-18-14-19-2018-12-19} + +#### Corrección de errores: {#bug-fixes-2} + +- Se corrigió un error que provocaba problemas con la actualización de diccionarios con el origen ODBC. [\#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [\#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- Las bases de datos se especifican correctamente al ejecutar DDL `ON CLUSTER` consulta. [\#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Se corrigió una segfault si el `max_temporary_non_const_columns` se excedió el límite. [\#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Mejoras de construcción: {#build-improvements-2} + +- Correcciones para construye en ARM. + +### Lanzamiento de ClickHouse 18.14.18, 2018-12-04 {#clickhouse-release-18-14-18-2018-12-04} + +#### Corrección de errores: {#bug-fixes-3} + +- Corregido el error en `dictGet...` función para diccionarios de tipo `range`, si uno de los argumentos es constante y otro no lo es. [\#3751](https://github.com/ClickHouse/ClickHouse/pull/3751) +- Se corrigió el error que causaba mensajes `netlink: '...': attribute type 1 has an invalid length` para imprimirse en el registro del kernel de Linux, eso estaba sucediendo solo en versiones suficientemente frescas del kernel de Linux. [\#3749](https://github.com/ClickHouse/ClickHouse/pull/3749) +- Segfault fijo en la función `empty` para argumento de `FixedString` tipo. [Método de codificación de datos:](https://github.com/ClickHouse/ClickHouse/pull/3703) +- Se corrigió la asignación excesiva de memoria al usar un gran valor de `max_query_size` configuración (un fragmento de memoria de `max_query_size` bytes fue preasignado a la vez). [\#3720](https://github.com/ClickHouse/ClickHouse/pull/3720) + +#### Crear cambios: {#build-changes} + +- Compilación fija con las bibliotecas LLVM / Clang de la versión 7 de los paquetes del sistema operativo (estas bibliotecas se utilizan para la compilación de consultas en tiempo de ejecución). [\#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### Lanzamiento de ClickHouse 18.14.17, 2018-11-30 {#clickhouse-release-18-14-17-2018-11-30} + +#### Corrección de errores: {#bug-fixes-4} + +- Se corrigieron casos en los que el proceso de puente ODBC no terminaba con el proceso del servidor principal. [\#3642](https://github.com/ClickHouse/ClickHouse/pull/3642) +- Inserción síncrona fija en el `Distributed` tabla con una lista de columnas que difiere de la lista de columnas de la tabla remota. [\#3673](https://github.com/ClickHouse/ClickHouse/pull/3673) +- Se corrigió una rara condición de carrera que podía provocar un bloqueo al soltar una tabla MergeTree. [\#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Se corrigió un punto muerto de consulta en caso de que la creación del hilo de consulta fallara con el `Resource temporarily unavailable` error. [\#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Análisis fijo del `ENGINE` cláusula cuando el `CREATE AS table` se utilizó la sintaxis y el `ENGINE` cláusula se especificó antes de la `AS table` (el error resultó en ignorar el motor especificado). [\#3692](https://github.com/ClickHouse/ClickHouse/pull/3692) + +### Lanzamiento de ClickHouse 18.14.15, 2018-11-21 {#clickhouse-release-18-14-15-2018-11-21} + +#### Corrección de errores: {#bug-fixes-5} + +- El tamaño del fragmento de memoria se sobreestimó al deserializar la columna de tipo `Array(String)` que conduce a “Memory limit exceeded” error. El problema apareció en la versión 18.12.13. [\#3589](https://github.com/ClickHouse/ClickHouse/issues/3589) + +### Lanzamiento de ClickHouse 18.14.14, 2018-11-20 {#clickhouse-release-18-14-14-2018-11-20} + +#### Corrección de errores: {#bug-fixes-6} + +- Fijo `ON CLUSTER` consultas cuando el clúster está configurado como seguro (indicador ``). [\#3599](https://github.com/ClickHouse/ClickHouse/pull/3599) + +#### Crear cambios: {#build-changes-1} + +- Problemas solucionados (llvm-7 del sistema, macos) [\#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### Lanzamiento de ClickHouse 18.14.13, 2018-11-08 {#clickhouse-release-18-14-13-2018-11-08} + +#### Corrección de errores: {#bug-fixes-7} + +- Se corrigió el `Block structure mismatch in MergingSorted stream` error. [\#3162](https://github.com/ClickHouse/ClickHouse/issues/3162) +- Fijo `ON CLUSTER` consultas en caso de que se hayan activado las conexiones seguras en la configuración del clúster (el `` bandera). [\#3465](https://github.com/ClickHouse/ClickHouse/pull/3465) +- Se corrigió un error en las consultas que utilizaban `SAMPLE`, `PREWHERE` y columnas de alias. [\#3543](https://github.com/ClickHouse/ClickHouse/pull/3543) +- Se corrigió un raro `unknown compression method` error cuando el `min_bytes_to_use_direct_io` se habilitó la configuración. [3544](https://github.com/ClickHouse/ClickHouse/pull/3544) + +#### Mejoras de rendimiento: {#performance-improvements} + +- Regresión de rendimiento fija de consultas con `GROUP BY` de columnas de tipo UInt16 o Date cuando se ejecuta en procesadores AMD EPYC. [Igor Lapko](https://github.com/ClickHouse/ClickHouse/pull/3512) +- Regresión de rendimiento fija de las consultas que procesan cadenas largas. [\#3530](https://github.com/ClickHouse/ClickHouse/pull/3530) + +#### Mejoras de construcción: {#build-improvements-3} + +- Mejoras para simplificar la compilación de Arcadia. [\#3475](https://github.com/ClickHouse/ClickHouse/pull/3475), [\#3535](https://github.com/ClickHouse/ClickHouse/pull/3535) + +### Lanzamiento de ClickHouse 18.14.12, 2018-11-02 {#clickhouse-release-18-14-12-2018-11-02} + +#### Corrección de errores: {#bug-fixes-8} + +- Se corrigió un bloqueo al unir dos subconsultas sin nombre. [\#3505](https://github.com/ClickHouse/ClickHouse/pull/3505) +- Se corrigió la generación de consultas incorrectas (con un vacío `WHERE` cláusula) al consultar bases de datos externas. [hotid](https://github.com/ClickHouse/ClickHouse/pull/3477) +- Se corrigió usando un valor de tiempo de espera incorrecto en los diccionarios ODBC. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3511) + +### Lanzamiento de ClickHouse 18.14.11, 2018-10-29 {#clickhouse-release-18-14-11-2018-10-29} + +#### Corrección de errores: {#bug-fixes-9} + +- Corregido el error `Block structure mismatch in UNION stream: different number of columns` en consultas LIMIT. [\#2156](https://github.com/ClickHouse/ClickHouse/issues/2156) +- Se corrigieron errores al fusionar datos en tablas que contienen matrices dentro de estructuras anidadas. [\#3397](https://github.com/ClickHouse/ClickHouse/pull/3397) +- Se corrigieron los resultados de la consulta incorrecta si el `merge_tree_uniform_read_distribution` la configuración está deshabilitada (está habilitada por defecto). [\#3429](https://github.com/ClickHouse/ClickHouse/pull/3429) +- Se corrigió un error en las inserciones en una tabla distribuida en formato nativo. [\#3411](https://github.com/ClickHouse/ClickHouse/issues/3411) + +### Lanzamiento de ClickHouse 18.14.10, 2018-10-23 {#clickhouse-release-18-14-10-2018-10-23} + +- El `compile_expressions` configuración (compilación JIT de expresiones) está deshabilitada de forma predeterminada. [\#3410](https://github.com/ClickHouse/ClickHouse/pull/3410) +- El `enable_optimize_predicate_expression` configuración está deshabilitada de forma predeterminada. + +### Lanzamiento de ClickHouse 18.14.9, 2018-10-16 {#clickhouse-release-18-14-9-2018-10-16} + +#### Novedad: {#new-features-1} + +- El `WITH CUBE` modificador para `GROUP BY` (la sintaxis alternativa `GROUP BY CUBE(...)` también está disponible). [\#3172](https://github.com/ClickHouse/ClickHouse/pull/3172) +- Se agregó el `formatDateTime` función. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2770) +- Se agregó el `JDBC` motor de mesa y `jdbc` función de tabla (requiere la instalación de clickhouse-jdbc-bridge). [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- Funciones añadidas para trabajar con el número de semana ISO: `toISOWeek`, `toISOYear`, `toStartOfISOYear`, y `toDayOfYear`. [\#3146](https://github.com/ClickHouse/ClickHouse/pull/3146) +- Ahora puedes usar `Nullable` de columnas para `MySQL` y `ODBC` tabla. [\#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Las estructuras de datos anidadas se pueden leer como objetos anidados en `JSONEachRow` formato. Se agregó el `input_format_import_nested_json` configuración. [Veloman Yunkan](https://github.com/ClickHouse/ClickHouse/pull/3144) +- El procesamiento paralelo está disponible para muchos `MATERIALIZED VIEW`s al insertar datos. Ver el `parallel_view_processing` configuración. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3208) +- Se agregó el `SYSTEM FLUSH LOGS` consulta (vacíos de registro forzados a tablas del sistema como `query_log`) [\#3321](https://github.com/ClickHouse/ClickHouse/pull/3321) +- Ahora puedes usar predefinidos `database` y `table` macros al declarar `Replicated` tabla. [\#3251](https://github.com/ClickHouse/ClickHouse/pull/3251) +- Se agregó la capacidad de leer `Decimal` valores de tipo en notación de ingeniería (indicando potencias de diez). [\#3153](https://github.com/ClickHouse/ClickHouse/pull/3153) + +#### Experimental características: {#experimental-features} + +- Optimización de la cláusula GROUP BY para `LowCardinality data types.` [\#3138](https://github.com/ClickHouse/ClickHouse/pull/3138) +- Cálculo optimizado de expresiones para `LowCardinality data types.` [\#3200](https://github.com/ClickHouse/ClickHouse/pull/3200) + +#### Mejora: {#improvements-2} + +- Consumo de memoria significativamente reducido para consultas con `ORDER BY` y `LIMIT`. Ver el `max_bytes_before_remerge_sort` configuración. [\#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- En ausencia de `JOIN` (`LEFT`, `INNER`, …), `INNER JOIN` se supone. [\#3147](https://github.com/ClickHouse/ClickHouse/pull/3147) +- Los asteriscos calificados funcionan correctamente en consultas con `JOIN`. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3202) +- El `ODBC` El motor de tabla elige correctamente el método para citar identificadores en el dialecto SQL de una base de datos remota. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- El `compile_expressions` configuración (compilación JIT de expresiones) está habilitada de forma predeterminada. +- Comportamiento fijo para DROP DATABASE / TABLA SI EXISTE simultáneamente y CREATE DATABASE / TABLA SI NO EXISTE. Anteriormente, un `CREATE DATABASE ... IF NOT EXISTS` consulta podría devolver el mensaje de error “File … already exists” y el `CREATE TABLE ... IF NOT EXISTS` y `DROP TABLE IF EXISTS` las consultas podrían volver `Table ... is creating or attaching right now`. [\#3101](https://github.com/ClickHouse/ClickHouse/pull/3101) +- Las expresiones LIKE e IN con una mitad derecha constante se pasan al servidor remoto al realizar consultas desde tablas MySQL u ODBC. [\#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Las comparaciones con expresiones constantes en una cláusula WHERE se pasan al servidor remoto al realizar consultas desde tablas MySQL y ODBC. Anteriormente, solo se pasaban las comparaciones con constantes. [\#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Cálculo correcto del ancho de fila en el terminal para `Pretty` formatos, incluyendo cadenas con jeroglíficos. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/3257). +- `ON CLUSTER` se puede especificar para `ALTER UPDATE` consulta. +- Rendimiento mejorado para leer datos en `JSONEachRow` formato. [\#3332](https://github.com/ClickHouse/ClickHouse/pull/3332) +- Sinónimos añadidos para el `LENGTH` y `CHARACTER_LENGTH` funciones de compatibilidad. El `CONCAT` la función ya no distingue entre mayúsculas y minúsculas. [\#3306](https://github.com/ClickHouse/ClickHouse/pull/3306) +- Se agregó el `TIMESTAMP` sinónimo de la `DateTime` tipo. [\#3390](https://github.com/ClickHouse/ClickHouse/pull/3390) +- Siempre hay espacio reservado para query\_id en los registros del servidor, incluso si la línea de registro no está relacionada con una consulta. Esto hace que sea más fácil analizar los registros de texto del servidor con herramientas de terceros. +- El consumo de memoria de una consulta se registra cuando supera el siguiente nivel de un número entero de gigabytes. [\#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- Se agregó el modo de compatibilidad para el caso cuando la biblioteca cliente que usa el protocolo nativo envía menos columnas por error de lo que el servidor espera para la consulta INSERT. Este escenario fue posible cuando se utiliza la biblioteca clickhouse-cpp. Anteriormente, este escenario hacía que el servidor se bloqueara. [\#3171](https://github.com/ClickHouse/ClickHouse/pull/3171) +- En una expresión WHERE definida por el usuario en `clickhouse-copier`, ahora puede usar un `partition_key` alias (para filtrado adicional por partición de tabla de origen). Esto es útil si el esquema de partición cambia durante la copia, pero solo cambia ligeramente. [\#3166](https://github.com/ClickHouse/ClickHouse/pull/3166) +- El flujo de trabajo del `Kafka` el motor se ha movido a un grupo de subprocesos en segundo plano para reducir automáticamente la velocidad de lectura de datos a altas cargas. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- Soporte para lectura `Tuple` y `Nested` de estructuras como `struct` en el `Cap'n'Proto format`. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3216) +- La lista de dominios de nivel superior `firstSignificantSubdomain` función ahora incluye el dominio `biz`. [disminución](https://github.com/ClickHouse/ClickHouse/pull/3219) +- En la configuración de diccionarios externos, `null_value` se interpreta como el valor del tipo de datos predeterminado. [\#3330](https://github.com/ClickHouse/ClickHouse/pull/3330) +- Soporte para el `intDiv` y `intDivOrZero` funciones para `Decimal`. [b48402e8](https://github.com/ClickHouse/ClickHouse/commit/b48402e8712e2b9b151e0eef8193811d433a1264) +- Soporte para el `Date`, `DateTime`, `UUID`, y `Decimal` tipos como una clave para el `sumMap` función de agregado. [\#3281](https://github.com/ClickHouse/ClickHouse/pull/3281) +- Soporte para el `Decimal` tipo de datos en diccionarios externos. [\#3324](https://github.com/ClickHouse/ClickHouse/pull/3324) +- Soporte para el `Decimal` tipo de datos en `SummingMergeTree` tabla. [\#3348](https://github.com/ClickHouse/ClickHouse/pull/3348) +- Añadido especializaciones para `UUID` en `if`. [\#3366](https://github.com/ClickHouse/ClickHouse/pull/3366) +- Reducido el número de `open` y `close` llamadas al sistema al leer desde un `MergeTree table`. [\#3283](https://github.com/ClickHouse/ClickHouse/pull/3283) +- A `TRUNCATE TABLE` consulta se puede ejecutar en cualquier réplica (la consulta se pasa a la réplica líder). [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3375) + +#### Corrección de errores: {#bug-fixes-10} + +- Se corrigió un problema con `Dictionary` tablas para `range_hashed` diccionario. Este error se produjo en la versión 18.12.17. [\#1702](https://github.com/ClickHouse/ClickHouse/pull/1702) +- Se corrigió un error al cargar `range_hashed` diccionarios (el mensaje `Unsupported type Nullable (...)`). Este error se produjo en la versión 18.12.17. [\#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Se corrigieron errores en el `pointInPolygon` función debido a la acumulación de cálculos inexactos para polígonos con un gran número de vértices ubicados cerca uno del otro. [\#3331](https://github.com/ClickHouse/ClickHouse/pull/3331) [\#3341](https://github.com/ClickHouse/ClickHouse/pull/3341) +- Si después de fusionar partes de datos, la suma de comprobación de la parte resultante difiere del resultado de la misma fusión en otra réplica, el resultado de la fusión se elimina y la parte de datos se descarga de la otra réplica (este es el comportamiento correcto). Pero después de descargar la parte de datos, no se pudo agregar al conjunto de trabajo debido a un error de que la parte ya existe (porque la parte de datos se eliminó con cierto retraso después de la fusión). Esto llevó a intentos cíclicos de descargar los mismos datos. [\#3194](https://github.com/ClickHouse/ClickHouse/pull/3194) +- Se corrigió el cálculo incorrecto del consumo total de memoria por consultas (debido a un cálculo incorrecto, el `max_memory_usage_for_all_queries` la configuración funcionó incorrectamente y el `MemoryTracking` métrica tenía un valor incorrecto). Este error se produjo en la versión 18.12.13. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3344) +- Se corrigió la funcionalidad de `CREATE TABLE ... ON CLUSTER ... AS SELECT ...` Este error se produjo en la versión 18.12.13. [\#3247](https://github.com/ClickHouse/ClickHouse/pull/3247) +- Se corrigió la preparación innecesaria de estructuras de datos para `JOIN`s en el servidor que inicia la consulta si `JOIN` sólo se realiza en servidores remotos. [\#3340](https://github.com/ClickHouse/ClickHouse/pull/3340) +- Se corrigieron errores en el `Kafka` engine: interbloqueos después de las excepciones al comenzar a leer datos, y se bloquea al finalizar [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- Para `Kafka` mesas, el opcional `schema` no se aprobó el parámetro (el esquema del `Cap'n'Proto` formato). [Vojtech Splichal](https://github.com/ClickHouse/ClickHouse/pull/3150) +- Si el conjunto de servidores ZooKeeper tiene servidores que aceptan la conexión pero luego la cierran inmediatamente en lugar de responder al protocolo de enlace, ClickHouse elige conectar otro servidor. Anteriormente, esto produjo el error `Cannot read all data. Bytes read: 0. Bytes expected: 4.` y el servidor no pudo iniciarse. [Nombre de la red inalámbrica (SSID):](https://github.com/ClickHouse/ClickHouse/commit/8218cf3a5f39a43401953769d6d12a0bb8d29da9) +- Si el conjunto de servidores ZooKeeper contiene servidores para los que la consulta DNS devuelve un error, estos servidores se ignoran. [17b8e209](https://github.com/ClickHouse/ClickHouse/commit/17b8e209221061325ad7ba0539f03c6e65f87f29) +- Conversión de tipo fijo entre `Date` y `DateTime` al insertar datos en el `VALUES` formato (si `input_format_values_interpret_expressions = 1`). Anteriormente, la conversión se realizaba entre el valor numérico del número de días en tiempo de Época Unix y la marca de tiempo Unix, lo que dio lugar a resultados inesperados. [\#3229](https://github.com/ClickHouse/ClickHouse/pull/3229) +- Conversión de tipo corregida entre `Decimal` y números enteros. [\#3211](https://github.com/ClickHouse/ClickHouse/pull/3211) +- Se corrigieron errores en el `enable_optimize_predicate_expression` configuración. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3231) +- Se ha corregido un error de análisis en formato CSV con números de coma flotante si se utiliza un separador CSV no predeterminado, como por ejemplo `;` [\#3155](https://github.com/ClickHouse/ClickHouse/pull/3155) +- Se corrigió el `arrayCumSumNonNegative` (no acumula valores negativos si el acumulador es menor que cero). [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/3163) +- Corregido cómo `Merge` las tablas funcionan encima de `Distributed` cuando se utiliza `PREWHERE`. [\#3165](https://github.com/ClickHouse/ClickHouse/pull/3165) +- Corrección de errores en el `ALTER UPDATE` consulta. +- Se corrigieron errores en el `odbc` función de tabla que apareció en la versión 18.12. [\#3197](https://github.com/ClickHouse/ClickHouse/pull/3197) +- Se corrigió el funcionamiento de las funciones agregadas con `StateArray` combinadores. [\#3188](https://github.com/ClickHouse/ClickHouse/pull/3188) +- Se corrigió un bloqueo al dividir un `Decimal` valor por cero. [Método de codificación de datos:](https://github.com/ClickHouse/ClickHouse/commit/69dd6609193beb4e7acd3e6ad216eca0ccfb8179) +- Salida fija de tipos para operaciones usando `Decimal` y argumentos enteros. [\#3224](https://github.com/ClickHouse/ClickHouse/pull/3224) +- Corregido el segfault durante `GROUP BY` en `Decimal128`. [Método de codificación de datos:](https://github.com/ClickHouse/ClickHouse/commit/3359ba06c39fcd05bfdb87d6c64154819621e13a) +- El `log_query_threads` configuración (información de registro sobre cada subproceso de ejecución de la consulta) ahora sólo tiene efecto si `log_queries` opción (información de registro sobre consultas) se establece en 1. Desde el `log_query_threads` la opción está habilitada de forma predeterminada, la información sobre los subprocesos se registró previamente incluso si el registro de consultas estaba deshabilitado. [\#3241](https://github.com/ClickHouse/ClickHouse/pull/3241) +- Se corrigió un error en la operación distribuida de la función de agregado de cuantiles (el mensaje de error `Not found column quantile...`). [Método de codificación de datos:](https://github.com/ClickHouse/ClickHouse/commit/292a885533b8e3b41ce8993867069d14cbd5a664) +- Se corrigió el problema de compatibilidad al trabajar en un clúster de servidores de la versión 18.12.17 y servidores anteriores al mismo tiempo. Para consultas distribuidas con claves GROUP BY de longitud fija y no fija, si había una gran cantidad de datos para agregar, los datos devueltos no siempre se agregaron completamente (dos filas diferentes contenían las mismas claves de agregación). [\#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) +- Manejo fijo de sustituciones en `clickhouse-performance-test`, si la consulta contiene sólo una parte de las sustituciones declaradas en la prueba. [\#3263](https://github.com/ClickHouse/ClickHouse/pull/3263) +- Se corrigió un error al usar `FINAL` con `PREWHERE`. [\#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Se corrigió un error al usar `PREWHERE` sobre las columnas que se agregaron durante `ALTER`. [\#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Se agregó un cheque por la ausencia de `arrayJoin` para `DEFAULT` y `MATERIALIZED` expresiones. Previamente, `arrayJoin` llevado a un error al insertar datos. [\#3337](https://github.com/ClickHouse/ClickHouse/pull/3337) +- Se agregó un cheque por la ausencia de `arrayJoin` en una `PREWHERE` clausula. Anteriormente, esto llevó a mensajes como `Size ... doesn't match` o `Unknown compression method` al ejecutar consultas. [\#3357](https://github.com/ClickHouse/ClickHouse/pull/3357) +- Se corrigió el segfault que podía ocurrir en casos raros después de la optimización que reemplazaba las cadenas AND de las evaluaciones de igualdad con la expresión IN correspondiente. [Bienvenido a WordPress.](https://github.com/ClickHouse/ClickHouse/pull/3339) +- Correcciones menores a `clickhouse-benchmark`: anteriormente, la información del cliente no se enviaba al servidor; ahora el número de consultas ejecutadas se calcula con mayor precisión al apagar y para limitar el número de iteraciones. [\#3351](https://github.com/ClickHouse/ClickHouse/pull/3351) [\#3352](https://github.com/ClickHouse/ClickHouse/pull/3352) + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-1} + +- Eliminado el `allow_experimental_decimal_type` opcion. El `Decimal` tipo de datos está disponible para su uso predeterminado. [\#3329](https://github.com/ClickHouse/ClickHouse/pull/3329) + +## Lanzamiento de ClickHouse 18.12 {#clickhouse-release-18-12} + +### Lanzamiento de ClickHouse 18.12.17, 2018-09-16 {#clickhouse-release-18-12-17-2018-09-16} + +#### Novedad: {#new-features-2} + +- `invalidate_query` (la capacidad de especificar una consulta para comprobar si es necesario actualizar un diccionario externo) `clickhouse` fuente. [\#3126](https://github.com/ClickHouse/ClickHouse/pull/3126) +- Se agregó la capacidad de usar `UInt*`, `Int*`, y `DateTime` tipos de datos (junto con el `Date` tipo) como un `range_hashed` clave de diccionario externa que define los límites de los rangos. Ahora `NULL` se puede utilizar para designar un rango abierto. [Vasily Nemkov](https://github.com/ClickHouse/ClickHouse/pull/3123) +- El `Decimal` tipo ahora soporta `var*` y `stddev*` funciones agregadas. [\#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- El `Decimal` tipo ahora soporta funciones matemáticas (`exp`, `sin` y así sucesivamente.) [\#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- El `system.part_log` ahora tiene el `partition_id` columna. [\#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Corrección de errores: {#bug-fixes-11} + +- `Merge` ahora funciona correctamente en `Distributed` tabla. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3159) +- Incompatibilidad fija (dependencia innecesaria del `glibc` versión) que hizo imposible ejecutar ClickHouse en `Ubuntu Precise` y versiones anteriores. La incompatibilidad surgió en la versión 18.12.13. [\#3130](https://github.com/ClickHouse/ClickHouse/pull/3130) +- Se corrigieron errores en el `enable_optimize_predicate_expression` configuración. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) +- Se corrigió un problema menor con compatibilidad con versiones anteriores que aparecía al trabajar con un clúster de réplicas en versiones anteriores a 18.12.13 y al mismo tiempo crear una nueva réplica de una tabla en un servidor con una versión más reciente (que se muestra en el mensaje `Can not clone replica, because the ... updated to new ClickHouse version`, lo cual es lógico, pero no debería suceder). [\#3122](https://github.com/ClickHouse/ClickHouse/pull/3122) + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-2} + +- El `enable_optimize_predicate_expression` opción está habilitada por defecto (que es bastante optimista). Si se producen errores de análisis de consultas relacionados con la búsqueda de los nombres de columna, establezca `enable_optimize_predicate_expression` a 0. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) + +### Lanzamiento de ClickHouse 18.12.14, 2018-09-13 {#clickhouse-release-18-12-14-2018-09-13} + +#### Novedad: {#new-features-3} + +- Añadido soporte para `ALTER UPDATE` consulta. [\#3035](https://github.com/ClickHouse/ClickHouse/pull/3035) +- Se agregó el `allow_ddl` opción, que restringe el acceso del usuario a consultas DDL. [\#3104](https://github.com/ClickHouse/ClickHouse/pull/3104) +- Se agregó el `min_merge_bytes_to_use_direct_io` opción para `MergeTree` los motores, que le permite establecer un umbral para el tamaño total de la fusión (cuando está por encima del umbral, los archivos de partes de datos se manejarán usando O\_DIRECT). [\#3117](https://github.com/ClickHouse/ClickHouse/pull/3117) +- El `system.merges` tabla del sistema ahora contiene el `partition_id` columna. [\#3099](https://github.com/ClickHouse/ClickHouse/pull/3099) + +#### Mejora {#improvements-3} + +- Si una parte de datos permanece sin cambios durante la mutación, no se descarga mediante réplicas. [\#3103](https://github.com/ClickHouse/ClickHouse/pull/3103) +- Autocompletar está disponible para nombres de configuraciones cuando se trabaja con `clickhouse-client`. [\#3106](https://github.com/ClickHouse/ClickHouse/pull/3106) + +#### Corrección de errores: {#bug-fixes-12} + +- Se agregó una verificación para los tamaños de las matrices que son elementos de `Nested` escriba campos al insertar. [\#3118](https://github.com/ClickHouse/ClickHouse/pull/3118) +- Se corrigió un error al actualizar los diccionarios externos con el `ODBC` fuente y `hashed` almacenamiento. Este error se produjo en la versión 18.12.13. +- Se corrigió un bloqueo al crear una tabla temporal a partir de una consulta con un `IN` condición. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3098) +- Se corrigió un error en las funciones agregadas para matrices que pueden tener `NULL` elemento. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/3097) + +### Lanzamiento de ClickHouse 18.12.13, 2018-09-10 {#clickhouse-release-18-12-13-2018-09-10} + +#### Novedad: {#new-features-4} + +- Se agregó el `DECIMAL(digits, scale)` tipo de datos (`Decimal32(scale)`, `Decimal64(scale)`, `Decimal128(scale)`). Para habilitarlo, use la configuración `allow_experimental_decimal_type`. [\#2846](https://github.com/ClickHouse/ClickHouse/pull/2846) [\#2970](https://github.com/ClickHouse/ClickHouse/pull/2970) [\#3008](https://github.com/ClickHouse/ClickHouse/pull/3008) [\#3047](https://github.com/ClickHouse/ClickHouse/pull/3047) +- Nuevo `WITH ROLLUP` modificador para `GROUP BY` (sintaxis alternativa: `GROUP BY ROLLUP(...)`). [\#2948](https://github.com/ClickHouse/ClickHouse/pull/2948) +- En consultas con JOIN, el carácter estrella se expande a una lista de columnas en todas las tablas, de acuerdo con el estándar SQL. Puede restaurar el comportamiento anterior configurando `asterisk_left_columns_only` a 1 en el nivel de configuración del usuario. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2787) +- Se agregó soporte para JOIN con funciones de tabla. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Autocompletar presionando Tab en clickhouse-cliente. [Sergey Shcherbin](https://github.com/ClickHouse/ClickHouse/pull/2447) +- Ctrl + C en clickhouse-client borra una consulta que se ingresó. [\#2877](https://github.com/ClickHouse/ClickHouse/pull/2877) +- Se agregó el `join_default_strictness` ajuste (valores: `"`, `'any'`, `'all'`). Esto le permite no especificar `ANY` o `ALL` para `JOIN`. [\#2982](https://github.com/ClickHouse/ClickHouse/pull/2982) +- Cada línea del registro del servidor relacionada con el procesamiento de consultas muestra el ID de consulta. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Ahora puede obtener registros de ejecución de consultas en clickhouse-client (use el `send_logs_level` configuración). Con el procesamiento de consultas distribuidas, los registros se conectan en cascada desde todos los servidores. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- El `system.query_log` y `system.processes` (`SHOW PROCESSLIST`) las tablas ahora tienen información sobre todas las configuraciones modificadas al ejecutar una consulta (la estructura anidada `Settings` datos). Se agregó el `log_query_settings` configuración. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- El `system.query_log` y `system.processes` las tablas ahora muestran información sobre el número de subprocesos que participan en la ejecución de la consulta (consulte `thread_numbers` columna). [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Añadir `ProfileEvents` contadores que miden el tiempo dedicado a leer y escribir a través de la red y a leer y escribir en el disco, el número de errores de red y el tiempo dedicado a esperar cuando el ancho de banda de la red es limitado. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Añadir `ProfileEvents`contadores que contienen las métricas del sistema de rusage (puede usarlas para obtener información sobre el uso de CPU en el espacio de usuario y el kernel, errores de página y modificadores de contexto), así como métricas de taskstats (utilícelas para obtener información sobre el tiempo de espera de E / S, el tiempo de espera de CPU y la cantidad de datos leídos [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- El `ProfileEvents` los contadores se aplican globalmente y para cada consulta, así como para cada subproceso de ejecución de consulta, lo que le permite perfilar el consumo de recursos por consulta en detalle. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Se agregó el `system.query_thread_log` tabla, que contiene información sobre cada subproceso de ejecución de consultas. Se agregó el `log_query_threads` configuración. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- El `system.metrics` y `system.events` las tablas ahora tienen documentación incorporada. [\#3016](https://github.com/ClickHouse/ClickHouse/pull/3016) +- Se agregó el `arrayEnumerateDense` función. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2975) +- Se agregó el `arrayCumSumNonNegative` y `arrayDifference` función. [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/2942) +- Se agregó el `retention` función de agregado. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2887) +- Ahora puede agregar (fusionar) estados de funciones agregadas utilizando el operador más y multiplicar los estados de funciones agregadas por una constante no negativa. [\#3062](https://github.com/ClickHouse/ClickHouse/pull/3062) [\#3034](https://github.com/ClickHouse/ClickHouse/pull/3034) +- Las tablas de la familia MergeTree ahora tienen la columna virtual `_partition_id`. [\#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Experimental características: {#experimental-features-1} + +- Se agregó el `LowCardinality(T)` tipo de datos. Este tipo de datos crea automáticamente un diccionario local de valores y permite el procesamiento de datos sin desempaquetar el diccionario. [\#2830](https://github.com/ClickHouse/ClickHouse/pull/2830) +- Se agregó un caché de funciones compiladas por JIT y un contador para el número de usos antes de compilar. Para compilar expresiones JIT, habilite la `compile_expressions` configuración. [\#2990](https://github.com/ClickHouse/ClickHouse/pull/2990) [\#3077](https://github.com/ClickHouse/ClickHouse/pull/3077) + +#### Mejora: {#improvements-4} + +- Se ha solucionado el problema con la acumulación ilimitada del registro de replicación cuando hay réplicas abandonadas. Se agregó un modo de recuperación efectivo para réplicas con un largo retraso. +- Rendimiento mejorado de `GROUP BY` con múltiples campos de agregación cuando uno de ellos es cadena y los otros son de longitud fija. +- Rendimiento mejorado al usar `PREWHERE` y con transferencia implícita de expresiones en `PREWHERE`. +- Rendimiento de análisis mejorado para formatos de texto (`CSV`, `TSV`). [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2977) [\#2980](https://github.com/ClickHouse/ClickHouse/pull/2980) +- Mejora del rendimiento de las cadenas de lectura y matrices en formatos binarios. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2955) +- Mayor rendimiento y menor consumo de memoria para consultas a `system.tables` y `system.columns` cuando hay un gran número de tablas en un solo servidor. [\#2953](https://github.com/ClickHouse/ClickHouse/pull/2953) +- Se corrigió un problema de rendimiento en el caso de una gran secuencia de consultas que resultaban en un error (el `_dl_addr` la función es visible en `perf top`, pero el servidor no está usando mucha CPU). [\#2938](https://github.com/ClickHouse/ClickHouse/pull/2938) +- Las condiciones se lanzan a la vista (cuando `enable_optimize_predicate_expression` está habilitado). [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Mejoras en la funcionalidad del `UUID` tipo de datos. [\#3074](https://github.com/ClickHouse/ClickHouse/pull/3074) [\#2985](https://github.com/ClickHouse/ClickHouse/pull/2985) +- El `UUID` tipo de datos es compatible con los diccionarios de The-Alchemist. [\#2822](https://github.com/ClickHouse/ClickHouse/pull/2822) +- El `visitParamExtractRaw` funciona correctamente con estructuras anidadas. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2974) +- Cuando el `input_format_skip_unknown_fields` la configuración está habilitada, los campos de objeto `JSONEachRow` se omiten correctamente. [BlahGeek](https://github.com/ClickHouse/ClickHouse/pull/2958) +- Para un `CASE` expresión con condiciones, ahora puede omitir `ELSE`, que es equivalente a `ELSE NULL`. [\#2920](https://github.com/ClickHouse/ClickHouse/pull/2920) +- El tiempo de espera de la operación ahora se puede configurar cuando se trabaja con ZooKeeper. [urykhy](https://github.com/ClickHouse/ClickHouse/pull/2971) +- Puede especificar un desplazamiento para `LIMIT n, m` como `LIMIT n OFFSET m`. [\#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- Puede usar el `SELECT TOP n` sintaxis como una alternativa para `LIMIT`. [\#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- Aumentó el tamaño de la cola para escribir en las tablas del sistema, por lo que `SystemLog parameter queue is full` el error no ocurre tan a menudo. +- El `windowFunnel` La función de agregado ahora admite eventos que cumplen múltiples condiciones. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2801) +- Las columnas duplicadas se pueden usar en un `USING` cláusula para `JOIN`. [\#3006](https://github.com/ClickHouse/ClickHouse/pull/3006) +- `Pretty` los formatos ahora tienen un límite en la alineación de columnas por ancho. Utilice el `output_format_pretty_max_column_pad_width` configuración. Si un valor es más amplio, aún se mostrará en su totalidad, pero las otras celdas de la tabla no serán demasiado anchas. [\#3003](https://github.com/ClickHouse/ClickHouse/pull/3003) +- El `odbc` función de tabla ahora le permite especificar el nombre de la base de datos / esquema. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2885) +- Se agregó la capacidad de usar un nombre de usuario especificado en el `clickhouse-client` archivo de configuración. [Vladimir Kozbin](https://github.com/ClickHouse/ClickHouse/pull/2909) +- El `ZooKeeperExceptions` se ha dividido en tres contadores: `ZooKeeperUserExceptions`, `ZooKeeperHardwareExceptions`, y `ZooKeeperOtherExceptions`. +- `ALTER DELETE` las consultas funcionan para vistas materializadas. +- Se agregó aleatorización al ejecutar el hilo de limpieza periódicamente para `ReplicatedMergeTree` para evitar picos de carga periódicos cuando hay un gran número de `ReplicatedMergeTree` tabla. +- Soporte para `ATTACH TABLE ... ON CLUSTER` consulta. [\#3025](https://github.com/ClickHouse/ClickHouse/pull/3025) + +#### Corrección de errores: {#bug-fixes-13} + +- Se corrigió un problema con `Dictionary` tablas (lanza el `Size of offsets doesn't match size of column` o `Unknown compression method` salvedad). Este error apareció en la versión 18.10.3. [\#2913](https://github.com/ClickHouse/ClickHouse/issues/2913) +- Se ha corregido un error al fusionar `CollapsingMergeTree` tablas si una de las partes de datos está vacía (estas partes se forman durante la fusión o `ALTER DELETE` si se han eliminado todos los datos), y `vertical` se utilizó el algoritmo para la fusión. [\#3049](https://github.com/ClickHouse/ClickHouse/pull/3049) +- Se corrigió una condición de carrera durante `DROP` o `TRUNCATE` para `Memory` tablas con una simultánea `SELECT`, lo que podría conducir a bloqueos del servidor. Este error apareció en la versión 1.1.54388. [\#3038](https://github.com/ClickHouse/ClickHouse/pull/3038) +- Se corrigió la posibilidad de pérdida de datos al insertar en `Replicated` tablas si el `Session is expired` se devuelve un error (la pérdida de datos puede ser detectada por el `ReplicatedDataLoss` métrica). Este error se produjo en la versión 1.1.54378. [\#2939](https://github.com/ClickHouse/ClickHouse/pull/2939) [\#2949](https://github.com/ClickHouse/ClickHouse/pull/2949) [\#2964](https://github.com/ClickHouse/ClickHouse/pull/2964) +- Se corrigió una falla seg durante `JOIN ... ON`. [\#3000](https://github.com/ClickHouse/ClickHouse/pull/3000) +- Se corrigió el error de búsqueda de nombres de columna cuando el `WHERE` la expresión consiste completamente en un nombre de columna completo, como `WHERE table.column`. [\#2994](https://github.com/ClickHouse/ClickHouse/pull/2994) +- Se corrigió el “Not found column” error que se produjo al ejecutar consultas distribuidas si se solicita una sola columna que consta de una expresión IN con una subconsulta desde un servidor remoto. [\#3087](https://github.com/ClickHouse/ClickHouse/pull/3087) +- Se corrigió el `Block structure mismatch in UNION stream: different number of columns` error que se produjo para las consultas distribuidas si uno de los fragmentos es local y el otro no, y la optimización del movimiento a `PREWHERE` se activa. [\#2226](https://github.com/ClickHouse/ClickHouse/pull/2226) [\#3037](https://github.com/ClickHouse/ClickHouse/pull/3037) [\#3055](https://github.com/ClickHouse/ClickHouse/pull/3055) [\#3065](https://github.com/ClickHouse/ClickHouse/pull/3065) [\#3073](https://github.com/ClickHouse/ClickHouse/pull/3073) [\#3090](https://github.com/ClickHouse/ClickHouse/pull/3090) [\#3093](https://github.com/ClickHouse/ClickHouse/pull/3093) +- Se corrigió el `pointInPolygon` función para ciertos casos de polígonos no convexos. [\#2910](https://github.com/ClickHouse/ClickHouse/pull/2910) +- Se corrigió el resultado incorrecto al comparar `nan` con enteros. [\#3024](https://github.com/ClickHouse/ClickHouse/pull/3024) +- Se corrigió un error en el `zlib-ng` biblioteca que podría conducir a segfault en casos raros. [\#2854](https://github.com/ClickHouse/ClickHouse/pull/2854) +- Se corrigió una pérdida de memoria al insertar en una tabla con `AggregateFunction` columnas, si el estado de la función agregada no es simple (asigna memoria por separado), y si una sola solicitud de inserción da como resultado múltiples bloques pequeños. [\#3084](https://github.com/ClickHouse/ClickHouse/pull/3084) +- Se corrigió una condición de carrera al crear y eliminar la misma `Buffer` o `MergeTree` mesa simultáneamente. +- Se corrigió la posibilidad de una segfault al comparar tuplas formadas por ciertos tipos no triviales, como tuplas. [\#2989](https://github.com/ClickHouse/ClickHouse/pull/2989) +- Se corrigió la posibilidad de un segfault al ejecutar ciertos `ON CLUSTER` consulta. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2960) +- Se corrigió un error en el `arrayDistinct` función para `Nullable` elementos de matriz. [\#2845](https://github.com/ClickHouse/ClickHouse/pull/2845) [\#2937](https://github.com/ClickHouse/ClickHouse/pull/2937) +- El `enable_optimize_predicate_expression` opción ahora soporta correctamente casos con `SELECT *`. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2929) +- Se corrigió el segfault al reinicializar la sesión de ZooKeeper. [\#2917](https://github.com/ClickHouse/ClickHouse/pull/2917) +- Se corrigió el bloqueo de potencial cuando se trabajaba con ZooKeeper. +- Se corrigió el código incorrecto para agregar estructuras de datos anidadas en un `SummingMergeTree`. +- Al asignar memoria para estados de funciones agregadas, la alineación se tiene en cuenta correctamente, lo que permite utilizar operaciones que requieren alineación al implementar estados de funciones agregadas. [Más información](https://github.com/ClickHouse/ClickHouse/pull/2808) + +#### Solución de seguridad: {#security-fix} + +- Uso seguro de las fuentes de datos ODBC. La interacción con los controladores ODBC utiliza un `clickhouse-odbc-bridge` proceso. Los errores en los controladores ODBC de terceros ya no causan problemas con la estabilidad del servidor o vulnerabilidades. [\#2828](https://github.com/ClickHouse/ClickHouse/pull/2828) [\#2879](https://github.com/ClickHouse/ClickHouse/pull/2879) [\#2886](https://github.com/ClickHouse/ClickHouse/pull/2886) [\#2893](https://github.com/ClickHouse/ClickHouse/pull/2893) [\#2921](https://github.com/ClickHouse/ClickHouse/pull/2921) +- Se corrigió la validación incorrecta de la ruta del archivo en el `catBoostPool` función de la tabla. [\#2894](https://github.com/ClickHouse/ClickHouse/pull/2894) +- El contenido de las tablas del sistema (`tables`, `databases`, `parts`, `columns`, `parts_columns`, `merges`, `mutations`, `replicas`, y `replication_queue`) se filtran de acuerdo con el acceso configurado por el usuario a las bases de datos (`allow_databases`). [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2856) + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-3} + +- En consultas con JOIN, el carácter estrella se expande a una lista de columnas en todas las tablas, de acuerdo con el estándar SQL. Puede restaurar el comportamiento anterior configurando `asterisk_left_columns_only` a 1 en el nivel de configuración del usuario. + +#### Crear cambios: {#build-changes-2} + +- La mayoría de las pruebas de integración ahora se pueden ejecutar mediante confirmación. +- Las comprobaciones de estilo de código también se pueden ejecutar mediante confirmación. +- El `memcpy` la implementación se elige correctamente cuando se construye en CentOS7 / Fedora. [Etienne Champetier](https://github.com/ClickHouse/ClickHouse/pull/2912) +- Al usar clang para compilar, algunas advertencias de `-Weverything` se han añadido, además de la `-Wall-Wextra -Werror`. [\#2957](https://github.com/ClickHouse/ClickHouse/pull/2957) +- La depuración de la compilación utiliza el `jemalloc` opción de depuración. +- La interfaz de la biblioteca para interactuar con ZooKeeper se declara abstracta. [\#2950](https://github.com/ClickHouse/ClickHouse/pull/2950) + +## Lanzamiento de ClickHouse 18.10 {#clickhouse-release-18-10} + +### Lanzamiento de ClickHouse 18.10.3, 2018-08-13 {#clickhouse-release-18-10-3-2018-08-13} + +#### Novedad: {#new-features-5} + +- HTTPS se puede utilizar para la replicación. [\#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) +- Se agregaron las funciones `murmurHash2_64`, `murmurHash3_32`, `murmurHash3_64`, y `murmurHash3_128` además de la existente `murmurHash2_32`. [\#2791](https://github.com/ClickHouse/ClickHouse/pull/2791) +- Compatibilidad con tipos Nullable en el controlador ODBC de ClickHouse (`ODBCDriver2` formato de salida). [\#2834](https://github.com/ClickHouse/ClickHouse/pull/2834) +- Soporte para `UUID` en las columnas clave. + +#### Mejora: {#improvements-5} + +- Los clústeres se pueden quitar sin reiniciar el servidor cuando se eliminan de los archivos de configuración. [\#2777](https://github.com/ClickHouse/ClickHouse/pull/2777) +- Los diccionarios externos se pueden quitar sin reiniciar el servidor cuando se eliminan de los archivos de configuración. [\#2779](https://github.com/ClickHouse/ClickHouse/pull/2779) +- Añadir `SETTINGS` soporte para el `Kafka` motor de mesa. [Alejandro Marshalov](https://github.com/ClickHouse/ClickHouse/pull/2781) +- Mejoras para el `UUID` tipo de datos (aún no completo). [\#2618](https://github.com/ClickHouse/ClickHouse/pull/2618) +- Soporte para piezas vacías después de fusiones en el `SummingMergeTree`, `CollapsingMergeTree` y `VersionedCollapsingMergeTree` motor. [\#2815](https://github.com/ClickHouse/ClickHouse/pull/2815) +- Se eliminan los registros antiguos de mutaciones completadas (`ALTER DELETE`). [\#2784](https://github.com/ClickHouse/ClickHouse/pull/2784) +- Se agregó el `system.merge_tree_settings` tabla. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/2841) +- El `system.tables` la tabla ahora tiene columnas de dependencia: `dependencies_database` y `dependencies_table`. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2851) +- Se agregó el `max_partition_size_to_drop` opción de configuración. [\#2782](https://github.com/ClickHouse/ClickHouse/pull/2782) +- Se agregó el `output_format_json_escape_forward_slashes` opcion. [Alejandro Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2812) +- Se agregó el `max_fetch_partition_retries_count` configuración. [\#2831](https://github.com/ClickHouse/ClickHouse/pull/2831) +- Se agregó el `prefer_localhost_replica` configuración para deshabilitar la preferencia de una réplica local e ir a una réplica local sin interacción entre procesos. [\#2832](https://github.com/ClickHouse/ClickHouse/pull/2832) +- El `quantileExact` devoluciones de la función agregada `nan` en el caso de la agregación en un vacío `Float32` o `Float64` establecer. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2855) + +#### Corrección de errores: {#bug-fixes-14} + +- Se eliminó el escape innecesario de los parámetros de cadena de conexión para ODBC, lo que hizo imposible establecer una conexión. Este error se produjo en la versión 18.6.0. +- Se corrigió la lógica para el procesamiento `REPLACE PARTITION` comandos en la cola de replicación. Si hay dos `REPLACE` comandos para la misma partición, la lógica incorrecta podría hacer que uno de ellos permanezca en la cola de replicación y no se ejecute. [\#2814](https://github.com/ClickHouse/ClickHouse/pull/2814) +- Se corrigió un error de fusión cuando todas las partes de datos estaban vacías (partes que se formaron a partir de una fusión o de `ALTER DELETE` si se han eliminado todos los datos). Este error apareció en la versión 18.1.0. [\#2930](https://github.com/ClickHouse/ClickHouse/pull/2930) +- Se corrigió un error para concurrente `Set` o `Join`. [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2823) +- Se corrigió el `Block structure mismatch in UNION stream: different number of columns` error que ocurrió para `UNION ALL` consultas dentro de una subconsulta si una de las `SELECT` queries contiene nombres de columna duplicados. [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2094) +- Se corrigió una pérdida de memoria si se producía una excepción al conectarse a un servidor MySQL. +- Se corrigió el código de respuesta incorrecto de clickhouse-cliente en caso de un error de consulta. +- Se corrigió el comportamiento incorrecto de las vistas materializadas que contenían DISTINCT. [\#2795](https://github.com/ClickHouse/ClickHouse/issues/2795) + +#### Cambios incompatibles hacia atrás {#backward-incompatible-changes-4} + +- Se ha eliminado el soporte para consultas CHECK TABLE para tablas distribuidas. + +#### Crear cambios: {#build-changes-3} + +- El asignador ha sido reemplazado: `jemalloc` ahora se utiliza en lugar de `tcmalloc`. En algunos escenarios, esto aumenta la velocidad hasta un 20%. Sin embargo, hay consultas que se han ralentizado hasta en un 20%. El consumo de memoria se ha reducido en aproximadamente un 10% en algunos escenarios, con una estabilidad mejorada. Con cargas altamente competitivas, el uso de CPU en el espacio de usuario y en el sistema muestra solo un ligero aumento. [\#2773](https://github.com/ClickHouse/ClickHouse/pull/2773) +- Uso de libressl desde un submódulo. [\#1983](https://github.com/ClickHouse/ClickHouse/pull/1983) [\#2807](https://github.com/ClickHouse/ClickHouse/pull/2807) +- Uso de unixodbc desde un submódulo. [\#2789](https://github.com/ClickHouse/ClickHouse/pull/2789) +- Uso de mariadb-connector-c desde un submódulo. [\#2785](https://github.com/ClickHouse/ClickHouse/pull/2785) +- Se agregaron archivos de prueba funcionales al repositorio que dependen de la disponibilidad de los datos de prueba (por el momento, sin los datos de prueba en sí). + +## Lanzamiento de ClickHouse 18.6 {#clickhouse-release-18-6} + +### Lanzamiento de ClickHouse 18.6.0, 2018-08-02 {#clickhouse-release-18-6-0-2018-08-02} + +#### Novedad: {#new-features-6} + +- Se agregó soporte para expresiones ON para la sintaxis JOIN ON: + `JOIN ON Expr([table.]column ...) = Expr([table.]column, ...) [AND Expr([table.]column, ...) = Expr([table.]column, ...) ...]` + La expresión debe ser una cadena de igualdad unida por el operador AND. Cada lado de la igualdad puede ser una expresión arbitraria sobre las columnas de una de las tablas. Se admite el uso de nombres de columna completos (`table.name`, `database.table.name`, `table_alias.name`, `subquery_alias.name`) para la tabla correcta. [\#2742](https://github.com/ClickHouse/ClickHouse/pull/2742) +- HTTPS se puede habilitar para la replicación. [\#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) + +#### Mejora: {#improvements-6} + +- El servidor pasa el componente de parche de su versión al cliente. Los datos sobre el componente de la versión del parche se encuentran en `system.processes` y `query_log`. [\#2646](https://github.com/ClickHouse/ClickHouse/pull/2646) + +## Lanzamiento de ClickHouse 18.5 {#clickhouse-release-18-5} + +### Lanzamiento de ClickHouse 18.5.1, 2018-07-31 {#clickhouse-release-18-5-1-2018-07-31} + +#### Novedad: {#new-features-7} + +- Se agregó la función hash `murmurHash2_32` [\#2756](https://github.com/ClickHouse/ClickHouse/pull/2756). + +#### Mejora: {#improvements-7} + +- Ahora puedes usar el `from_env` [\#2741](https://github.com/ClickHouse/ClickHouse/pull/2741) atributo para establecer valores en archivos de configuración a partir de variables de entorno. +- Se agregaron versiones que no distinguen entre mayúsculas y minúsculas del `coalesce`, `ifNull`, y `nullIf functions` [\#2752](https://github.com/ClickHouse/ClickHouse/pull/2752). + +#### Corrección de errores: {#bug-fixes-15} + +- Se corrigió un posible error al iniciar una réplica [\#2759](https://github.com/ClickHouse/ClickHouse/pull/2759). + +## Lanzamiento de ClickHouse 18.4 {#clickhouse-release-18-4} + +### Lanzamiento de ClickHouse 18.4.0, 2018-07-28 {#clickhouse-release-18-4-0-2018-07-28} + +#### Novedad: {#new-features-8} + +- Tablas de sistema añadidas: `formats`, `data_type_families`, `aggregate_function_combinators`, `table_functions`, `table_engines`, `collations` [\#2721](https://github.com/ClickHouse/ClickHouse/pull/2721). +- Se agregó la capacidad de usar una función de tabla en lugar de una tabla como argumento de un `remote` o `cluster table function` [\#2708](https://github.com/ClickHouse/ClickHouse/pull/2708). +- Soporte para `HTTP Basic` autenticación en el protocolo de replicación [\#2727](https://github.com/ClickHouse/ClickHouse/pull/2727). +- El `has` función ahora permite buscar un valor numérico en una matriz de `Enum` valor [Maxim Khrisanfov](https://github.com/ClickHouse/ClickHouse/pull/2699). +- Soporte para agregar separadores de mensajes arbitrarios al leer desde `Kafka` [Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2701). + +#### Mejora: {#improvements-8} + +- El `ALTER TABLE t DELETE WHERE` La consulta no reescribe partes de datos que no se vieron afectadas por la condición WHERE [\#2694](https://github.com/ClickHouse/ClickHouse/pull/2694). +- El `use_minimalistic_checksums_in_zookeeper` opción para `ReplicatedMergeTree` tables está habilitada de forma predeterminada. Esta configuración se agregó en la versión 1.1.54378, 16-04-2018. Las versiones que son anteriores a 1.1.54378 ya no se pueden instalar. +- Soporte para correr `KILL` y `OPTIMIZE` consultas que especifican `ON CLUSTER` [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2689). + +#### Corrección de errores: {#bug-fixes-16} + +- Corregido el error `Column ... is not under an aggregate function and not in GROUP BY` para la agregación con una expresión IN. Este error apareció en la versión 18.1.0. ([bbdd780b](https://github.com/ClickHouse/ClickHouse/commit/bbdd780be0be06a0f336775941cdd536878dd2c2)) +- Se ha corregido un error en el `windowFunnel aggregate function` [Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2735). +- Se ha corregido un error en el `anyHeavy` función agregada ([a2101df2](https://github.com/ClickHouse/ClickHouse/commit/a2101df25a6a0fba99aa71f8793d762af2b801ee)) +- Se corrigió el bloqueo del servidor al usar el `countArray()` función de agregado. + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-5} + +- Parámetros para `Kafka` el motor fue cambiado de `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_schema, kafka_num_consumers])` a `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_row_delimiter, kafka_schema, kafka_num_consumers])`. Si sus tablas usan `kafka_schema` o `kafka_num_consumers` parámetros, debe editar manualmente los archivos de metadatos `path/metadata/database/table.sql` y añadir `kafka_row_delimiter` parámetro con `''` valor. + +## Lanzamiento de ClickHouse 18.1 {#clickhouse-release-18-1} + +### Lanzamiento de ClickHouse 18.1.0, 2018-07-23 {#clickhouse-release-18-1-0-2018-07-23} + +#### Novedad: {#new-features-9} + +- Soporte para el `ALTER TABLE t DELETE WHERE` consulta para tablas MergeTree no replicadas ([\#2634](https://github.com/ClickHouse/ClickHouse/pull/2634)). +- Soporte para tipos arbitrarios para el `uniq*` familia de funciones agregadas ([\#2010](https://github.com/ClickHouse/ClickHouse/issues/2010)). +- Soporte para tipos arbitrarios en operadores de comparación ([\#2026](https://github.com/ClickHouse/ClickHouse/issues/2026)). +- El `users.xml` archivo permite establecer una máscara de subred en el formato `10.0.0.1/255.255.255.0`. Esto es necesario para usar máscaras para redes IPv6 con ceros en el medio ([\#2637](https://github.com/ClickHouse/ClickHouse/pull/2637)). +- Se agregó el `arrayDistinct` función ([\#2670](https://github.com/ClickHouse/ClickHouse/pull/2670)). +- El motor SummingMergeTree ahora puede funcionar con columnas de tipo AggregateFunction ([Constantin S. Pan](https://github.com/ClickHouse/ClickHouse/pull/2566)). + +#### Mejora: {#improvements-9} + +- Se ha cambiado el esquema de numeración para las versiones de lanzamiento. Ahora la primera parte contiene el año de lanzamiento (A.D., zona horaria de Moscú, menos 2000), la segunda parte contiene el número de cambios importantes (aumentos para la mayoría de las versiones) y la tercera parte es la versión del parche. Las versiones siguen siendo compatibles con versiones anteriores, a menos que se indique lo contrario en el registro de cambios. +- Conversiones más rápidas de números de coma flotante a una cadena ([Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2664)). +- Si se omitieron algunas filas durante una inserción debido a errores de análisis (esto es posible con el `input_allow_errors_num` y `input_allow_errors_ratio` configuración activada), el número de filas omitidas ahora se escribe en el registro del servidor ([Leonardo Cecchi](https://github.com/ClickHouse/ClickHouse/pull/2669)). + +#### Corrección de errores: {#bug-fixes-17} + +- Se corrigió el comando TRUNCATE para tablas temporales ([Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2624)). +- Se corrigió un punto muerto raro en la biblioteca de cliente ZooKeeper que se producía cuando había un error de red al leer la respuesta ([c315200](https://github.com/ClickHouse/ClickHouse/commit/c315200e64b87e44bdf740707fc857d1fdf7e947)). +- Se corrigió un error durante un CAST a Nullable tipos ([\#1322](https://github.com/ClickHouse/ClickHouse/issues/1322)). +- Se corrigió el resultado incorrecto de la `maxIntersection()` función cuando los límites de los intervalos coincidieron ([Miguel Furmur](https://github.com/ClickHouse/ClickHouse/pull/2657)). +- Se corrigió la transformación incorrecta de la cadena de expresión OR en un argumento de función ([Más información](https://github.com/ClickHouse/ClickHouse/pull/2663)). +- Se corrigió la degradación del rendimiento para las consultas que contenían `IN (subquery)` expresiones dentro de otra subconsulta ([\#2571](https://github.com/ClickHouse/ClickHouse/issues/2571)). +- Se corrigió la incompatibilidad entre servidores con diferentes versiones en consultas distribuidas `CAST` función que no está en letras mayúsculas ([fe8c4d6](https://github.com/ClickHouse/ClickHouse/commit/fe8c4d64e434cacd4ceef34faa9005129f2190a5)). +- Se agregaron citas faltantes de identificadores para consultas a un DBMS externo ([\#2635](https://github.com/ClickHouse/ClickHouse/issues/2635)). + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-6} + +- La conversión de una cadena que contiene el número cero a DateTime no funciona. Ejemplo: `SELECT toDateTime('0')`. Esta es también la razón por la que `DateTime DEFAULT '0'` no funciona en tablas, así como `0` en los diccionarios. Solución: reemplazar `0` con `0000-00-00 00:00:00`. + +## Lanzamiento de ClickHouse 1.1 {#clickhouse-release-1-1} + +### Lanzamiento de ClickHouse 1.1.54394, 2018-07-12 {#clickhouse-release-1-1-54394-2018-07-12} + +#### Novedad: {#new-features-10} + +- Se agregó el `histogram` función agregada ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2521)). +- Ahora `OPTIMIZE TABLE ... FINAL` se puede utilizar sin especificar particiones para `ReplicatedMergeTree` ([Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2600)). + +#### Corrección de errores: {#bug-fixes-18} + +- Se corrigió un problema con un tiempo de espera muy pequeño para los sockets (un segundo) para leer y escribir al enviar y descargar datos replicados, lo que hacía imposible descargar partes más grandes si hay una carga en la red o el disco (resultó en intentos cíclicos para descargar partes). Este error se produjo en la versión 1.1.54388. +- Se corrigieron problemas al usar chroot en ZooKeeper si insertaba bloques de datos duplicados en la tabla. +- El `has` la función ahora funciona correctamente para una matriz con elementos Nullable ([\#2115](https://github.com/ClickHouse/ClickHouse/issues/2115)). +- El `system.tables` la tabla ahora funciona correctamente cuando se usa en consultas distribuidas. El `metadata_modification_time` y `engine_full` Las columnas ahora no son virtuales. Se corrigió un error que se producía si solo se consultaban estas columnas desde la tabla. +- Se corrigió cómo un vacío `TinyLog` la tabla funciona después de insertar un bloque de datos vacío ([\#2563](https://github.com/ClickHouse/ClickHouse/issues/2563)). +- El `system.zookeeper` table funciona si el valor del nodo en ZooKeeper es NULL. + +### Lanzamiento de ClickHouse 1.1.54390, 2018-07-06 {#clickhouse-release-1-1-54390-2018-07-06} + +#### Novedad: {#new-features-11} + +- Las consultas se pueden enviar en `multipart/form-data` formato (en el `query` campo), que es útil si también se envían datos externos para el procesamiento de consultas ([Olga Hvostikova](https://github.com/ClickHouse/ClickHouse/pull/2490)). +- Se agregó la capacidad de habilitar o deshabilitar el procesamiento de comillas simples o dobles al leer datos en formato CSV. Puede configurar esto en el `format_csv_allow_single_quotes` y `format_csv_allow_double_quotes` configuración ([Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2574)). +- Ahora `OPTIMIZE TABLE ... FINAL` se puede utilizar sin especificar la partición para variantes no replicadas de `MergeTree` ([Amos pájaro](https://github.com/ClickHouse/ClickHouse/pull/2599)). + +#### Mejora: {#improvements-10} + +- Rendimiento mejorado, consumo de memoria reducido y seguimiento correcto del consumo de memoria con el uso del operador IN cuando se podría usar un índice de tabla ([\#2584](https://github.com/ClickHouse/ClickHouse/pull/2584)). +- Se eliminó la comprobación redundante de las sumas de comprobación al agregar una parte de datos. Esto es importante cuando hay un gran número de réplicas, porque en estos casos el número total de comprobaciones fue igual a N^2. +- Añadido soporte para `Array(Tuple(...))` los argumentos para el `arrayEnumerateUniq` función ([\#2573](https://github.com/ClickHouse/ClickHouse/pull/2573)). +- Añadir `Nullable` soporte para el `runningDifference` función ([\#2594](https://github.com/ClickHouse/ClickHouse/pull/2594)). +- Mejora del rendimiento del análisis de consultas cuando hay un gran número de expresiones ([\#2572](https://github.com/ClickHouse/ClickHouse/pull/2572)). +- Selección más rápida de partes de datos para la fusión en `ReplicatedMergeTree` tabla. Recuperación más rápida de la sesión ZooKeeper ([\#2597](https://github.com/ClickHouse/ClickHouse/pull/2597)). +- El `format_version.txt` archivo para `MergeTree` tables se vuelve a crear si falta, lo que tiene sentido si ClickHouse se inicia después de copiar la estructura de directorios sin archivos ([Películas De Sexo](https://github.com/ClickHouse/ClickHouse/pull/2593)). + +#### Corrección de errores: {#bug-fixes-19} + +- Se corrigió un error al trabajar con ZooKeeper que podría hacer imposible recuperar la sesión y los estados de solo lectura de las tablas antes de reiniciar el servidor. +- Se ha corregido un error al trabajar con ZooKeeper que podría hacer que los nodos antiguos no se eliminen si se interrumpe la sesión. +- Se corrigió un error en el `quantileTDigest` función para argumentos Float (este error se introdujo en la versión 1.1.54388) ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2553)). +- Se corrigió un error en el índice de las tablas MergeTree si la columna de clave principal se encuentra dentro de la función para convertir tipos entre enteros con signo y sin signo del mismo tamaño ([\#2603](https://github.com/ClickHouse/ClickHouse/pull/2603)). +- Segfault fijo si `macros` se usan pero no están en el archivo de configuración ([\#2570](https://github.com/ClickHouse/ClickHouse/pull/2570)). +- Se corrigió el cambio a la base de datos predeterminada al volver a conectar el cliente ([\#2583](https://github.com/ClickHouse/ClickHouse/pull/2583)). +- Se corrigió un error que ocurría cuando el `use_index_for_in_with_subqueries` la configuración estaba deshabilitada. + +#### Solución de seguridad: {#security-fix-1} + +- El envío de archivos ya no es posible cuando se conecta a MySQL (`LOAD DATA LOCAL INFILE`). + +### Lanzamiento de ClickHouse 1.1.54388, 2018-06-28 {#clickhouse-release-1-1-54388-2018-06-28} + +#### Novedad: {#new-features-12} + +- Soporte para el `ALTER TABLE t DELETE WHERE` consulta para tablas replicadas. Se agregó el `system.mutations` para realizar un seguimiento del progreso de este tipo de consultas. +- Soporte para el `ALTER TABLE t [REPLACE|ATTACH] PARTITION` consulta para tablas \*MergeTree. +- Soporte para el `TRUNCATE TABLE` consulta ([Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2260)) +- Varios nuevos `SYSTEM` consultas para tablas replicadas (`RESTART REPLICAS`, `SYNC REPLICA`, `[STOP|START] [MERGES|FETCHES|SENDS REPLICATED|REPLICATION QUEUES]`). +- Se agregó la capacidad de escribir en una tabla con el motor MySQL y la función de tabla correspondiente ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2294)). +- Se agregó el `url()` función de la tabla y el `URL` motor de mesa ([Alejandro Sapin](https://github.com/ClickHouse/ClickHouse/pull/2501)). +- Se agregó el `windowFunnel` función agregada ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2352)). +- Nuevo `startsWith` y `endsWith` funciones para cadenas ([Vadim Plakhtinsky](https://github.com/ClickHouse/ClickHouse/pull/2429)). +- El `numbers()` función de tabla ahora le permite especificar el desplazamiento ([Invierno Zhang](https://github.com/ClickHouse/ClickHouse/pull/2535)). +- La contraseña para `clickhouse-client` se puede introducir de forma interactiva. +- Los registros del servidor ahora se pueden enviar a syslog ([Alejandro Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2459)). +- Compatibilidad con el inicio de sesión en diccionarios con una fuente de biblioteca compartida ([Alejandro Sapin](https://github.com/ClickHouse/ClickHouse/pull/2472)). +- Soporte para delimitadores CSV personalizados ([Ivan Zhukov](https://github.com/ClickHouse/ClickHouse/pull/2263)) +- Se agregó el `date_time_input_format` configuración. Si cambia esta configuración a `'best_effort'`, DateTime valores se leerán en una amplia gama de formatos. +- Se agregó el `clickhouse-obfuscator` utilidad para la ofuscación de datos. Ejemplo de uso: publicación de datos utilizados en pruebas de rendimiento. + +#### Experimental características: {#experimental-features-2} + +- Se agregó la capacidad de calcular `and` solo donde se necesitan ([Anastasia Tsarkova](https://github.com/ClickHouse/ClickHouse/pull/2272)) +- La compilación JIT a código nativo ya está disponible para algunas expresiones ([pyos](https://github.com/ClickHouse/ClickHouse/pull/2277)). + +#### Corrección de errores: {#bug-fixes-20} + +- Los duplicados ya no aparecen para una consulta con `DISTINCT` y `ORDER BY`. +- Consultas con `ARRAY JOIN` y `arrayFilter` ya no devuelve un resultado incorrecto. +- Se corrigió un error al leer una columna de matriz desde una estructura anidada ([\#2066](https://github.com/ClickHouse/ClickHouse/issues/2066)). +- Se corrigió un error al analizar consultas con una cláusula HAVING como `HAVING tuple IN (...)`. +- Se ha corregido un error al analizar consultas con alias recursivos. +- Se corrigió un error al leer desde ReplacingMergeTree con una condición en PREWHERE que filtra todas las filas ([\#2525](https://github.com/ClickHouse/ClickHouse/issues/2525)). +- La configuración del perfil de usuario no se aplicó al usar sesiones en la interfaz HTTP. +- Se corrigió cómo se aplican los ajustes desde los parámetros de línea de comandos en clickhouse-local. +- La biblioteca de cliente ZooKeeper ahora usa el tiempo de espera de sesión recibido del servidor. +- Se ha corregido un error en la biblioteca de cliente ZooKeeper cuando el cliente esperaba la respuesta del servidor más tiempo que el tiempo de espera. +- Poda fija de piezas para consultas con condiciones en columnas de clave de partición ([\#2342](https://github.com/ClickHouse/ClickHouse/issues/2342)). +- Las fusiones ahora son posibles después `CLEAR COLUMN IN PARTITION` ([\#2315](https://github.com/ClickHouse/ClickHouse/issues/2315)). +- Se ha corregido la asignación de tipos en la función de tabla ODBC ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2268)). +- Las comparaciones de tipos se han fijado para `DateTime` con y sin la zona horaria ([Alejandro Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2400)). +- Análisis sintáctico fijo y formato del `CAST` operador. +- Inserción fija en una vista materializada para el motor de tabla distribuida ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2411)). +- Se corrigió una condición de carrera al escribir datos desde el `Kafka` motor a vistas materializadas ([Información adicional](https://github.com/ClickHouse/ClickHouse/pull/2448)). +- SSRF fijo en la función de tabla remota (). +- Comportamiento de salida fijo de `clickhouse-client` en modo multilínea ([\#2510](https://github.com/ClickHouse/ClickHouse/issues/2510)). + +#### Mejora: {#improvements-11} + +- Las tareas en segundo plano de las tablas replicadas ahora se realizan en un grupo de subprocesos en lugar de en subprocesos separados ([Silviu Caragea](https://github.com/ClickHouse/ClickHouse/pull/1722)). +- Mejora del rendimiento de compresión LZ4. +- Análisis más rápido para consultas con un gran número de JOIN y subconsultas. +- La caché DNS ahora se actualiza automáticamente cuando hay demasiados errores de red. +- Las inserciones de tabla ya no se producen si la inserción en una de las vistas materializadas no es posible porque tiene demasiadas partes. +- Se ha corregido la discrepancia en los contadores de eventos `Query`, `SelectQuery`, y `InsertQuery`. +- Expresiones como `tuple IN (SELECT tuple)` se permiten si los tipos de tupla coinciden. +- Un servidor con tablas replicadas puede iniciarse incluso si no ha configurado ZooKeeper. +- Al calcular el número de núcleos de CPU disponibles, ahora se tienen en cuenta los límites en cgroups ([Más información](https://github.com/ClickHouse/ClickHouse/pull/2325)). +- Se agregó chown para los directorios de configuración en el archivo de configuración systemd ([Mikhail Shiryaev](https://github.com/ClickHouse/ClickHouse/pull/2421)). + +#### Crear cambios: {#build-changes-4} + +- El compilador gcc8 se puede usar para compilaciones. +- Se agregó la capacidad de construir llvm desde el submódulo. +- La versión de la biblioteca librdkafka se ha actualizado a v0.11.4. +- Se agregó la capacidad de usar la biblioteca libcpuid del sistema. La versión de la biblioteca se ha actualizado a 0.4.0. +- Se corrigió la compilación usando la biblioteca vectorclass ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2274)). +- Cmake ahora genera archivos para ninja de forma predeterminada (como cuando se usa `-G Ninja`). +- Se agregó la capacidad de usar la biblioteca libtinfo en lugar de libtermcap ([Nuestros Servicios](https://github.com/ClickHouse/ClickHouse/pull/2519)). +- Se corrigió un conflicto de archivos de encabezado en Fedora Rawhide ([\#2520](https://github.com/ClickHouse/ClickHouse/issues/2520)). + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-7} + +- Eliminado escapar en `Vertical` y `Pretty*` formatea y elimina el `VerticalRaw` formato. +- Si los servidores con la versión 1.1.54388 (o posterior) y los servidores con una versión anterior se utilizan simultáneamente en una consulta distribuida y la consulta tiene `cast(x, 'Type')` expresión sin `AS` palabra clave y no tiene la palabra `cast` en mayúsculas, se lanzará una excepción con un mensaje como `Not found column cast(0, 'UInt8') in block`. Solución: actualice el servidor en todo el clúster. + +### Lanzamiento de ClickHouse 1.1.54385, 2018-06-01 {#clickhouse-release-1-1-54385-2018-06-01} + +#### Corrección de errores: {#bug-fixes-21} + +- Se corrigió un error que en algunos casos causaba que las operaciones de ZooKeeper se bloquearan. + +### Lanzamiento de ClickHouse 1.1.54383, 2018-05-22 {#clickhouse-release-1-1-54383-2018-05-22} + +#### Corrección de errores: {#bug-fixes-22} + +- Se corrigió una desaceleración de la cola de replicación si una tabla tiene muchas réplicas. + +### Lanzamiento de ClickHouse 1.1.54381, 2018-05-14 {#clickhouse-release-1-1-54381-2018-05-14} + +#### Corrección de errores: {#bug-fixes-23} + +- Se corrigió una fuga de nodos en ZooKeeper cuando ClickHouse pierde la conexión con el servidor ZooKeeper. + +### Lanzamiento de ClickHouse 1.1.54380, 2018-04-21 {#clickhouse-release-1-1-54380-2018-04-21} + +#### Novedad: {#new-features-13} + +- Se agregó la función de tabla `file(path, format, structure)`. Un ejemplo de lectura de bytes de `/dev/urandom`: ``` ln -s /dev/urandom /var/lib/clickhouse/user_files/random``clickhouse-client -q "SELECT * FROM file('random', 'RowBinary', 'd UInt8') LIMIT 10" ```. + +#### Mejora: {#improvements-12} + +- Las subconsultas se pueden envolver en `()` para mejorar la legibilidad de las consultas. Por ejemplo: `(SELECT 1) UNION ALL (SELECT 1)`. +- Simple `SELECT` consultas de la `system.processes` no están incluidos en el `max_concurrent_queries` limite. + +#### Corrección de errores: {#bug-fixes-24} + +- Corregido el comportamiento incorrecto del `IN` operador cuando seleccione de `MATERIALIZED VIEW`. +- Se corrigió el filtrado incorrecto por índice de partición en expresiones como `partition_key_column IN (...)`. +- Se corrigió la imposibilidad de ejecutar `OPTIMIZE` consulta sobre réplica no líder si `REANAME` se realizó sobre la mesa. +- Se corrigió el error de autorización al ejecutar `OPTIMIZE` o `ALTER` consultas en una réplica que no sea de líder. +- Congelación fija de `KILL QUERY`. +- Se corrigió un error en la biblioteca de cliente ZooKeeper que provocaba la pérdida de observaciones, la congelación de la cola DDL distribuida y ralentizaciones en la cola de replicación si no estaba vacía `chroot` prefijo se utiliza en la configuración ZooKeeper. + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-8} + +- Se eliminó el soporte para expresiones como `(a, b) IN (SELECT (a, b))` (puede usar la expresión equivalente `(a, b) IN (SELECT a, b)`). En versiones anteriores, estas expresiones conducían a `WHERE` filtrado o errores causados. + +### Lanzamiento de ClickHouse 1.1.54378, 2018-04-16 {#clickhouse-release-1-1-54378-2018-04-16} + +#### Novedad: {#new-features-14} + +- El nivel de registro se puede cambiar sin reiniciar el servidor. +- Se agregó el `SHOW CREATE DATABASE` consulta. +- El `query_id` se puede pasar a `clickhouse-client` (elBroom). +- Nueva configuración: `max_network_bandwidth_for_all_users`. +- Añadido soporte para `ALTER TABLE ... PARTITION ...` para `MATERIALIZED VIEW`. +- Se agregó información sobre el tamaño de las partes de datos en forma sin comprimir en la tabla del sistema. +- Soporte de cifrado de servidor a servidor para tablas distribuidas (`1` en la configuración de réplica en ``). +- Configuración del nivel de tabla para el `ReplicatedMergeTree` familia con el fin de minimizar la cantidad de datos almacenados en Zookeeper: : `use_minimalistic_checksums_in_zookeeper = 1` +- Configuración del `clickhouse-client` pedir. De forma predeterminada, los nombres de servidor ahora se envían al mensaje. El nombre para mostrar del servidor se puede cambiar. También se envía en el `X-ClickHouse-Display-Name` Encabezado HTTP (Kirill Shvakov). +- Múltiples separados por comas `topics` se puede especificar para el `Kafka` motor (Tobias Adamson) +- Cuando una consulta es detenida por `KILL QUERY` o `replace_running_query` el cliente recibe el `Query was canceled` excepción en lugar de un resultado incompleto. + +#### Mejora: {#improvements-13} + +- `ALTER TABLE ... DROP/DETACH PARTITION` las consultas se ejecutan en la parte frontal de la cola de replicación. +- `SELECT ... FINAL` y `OPTIMIZE ... FINAL` se puede utilizar incluso cuando la tabla tiene una única parte de datos. +- A `query_log` se recrea sobre la marcha si se eliminó manualmente (Kirill Shvakov). +- El `lengthUTF8` funciona más rápido (zhang2014). +- Rendimiento mejorado de los insertos síncronos en `Distributed` tabla (`insert_distributed_sync = 1`) cuando hay una gran cantidad de fragmentos. +- El servidor acepta el `send_timeout` y `receive_timeout` configuraciones del cliente y las aplica cuando se conecta al cliente (se aplican en orden inverso: el socket del servidor `send_timeout` se establece en el `receive_timeout` valor recibido del cliente, y viceversa). +- Recuperación de bloqueos más robusta para la inserción asincrónica en `Distributed` tabla. +- El tipo de devolución del `countEqual` función cambiada de `UInt32` a `UInt64` (谢磊). + +#### Corrección de errores: {#bug-fixes-25} + +- Se corrigió un error con `IN` cuando el lado izquierdo de la expresión es `Nullable`. +- Ahora se devuelven los resultados correctos cuando se usan tuplas con `IN` cuando algunos de los componentes de la tupla están en el índice de la tabla. +- El `max_execution_time` limit ahora funciona correctamente con consultas distribuidas. +- Se corrigieron errores al calcular el tamaño de las columnas compuestas en el `system.columns` tabla. +- Se corrigió un error al crear una tabla temporal `CREATE TEMPORARY TABLE IF NOT EXISTS.` +- Corregidos errores en `StorageKafka` (\#\#2075) +- Se corrigieron fallos del servidor por argumentos no válidos de ciertas funciones agregadas. +- Se corrigió el error que impedía el `DETACH DATABASE` consulta de detener las tareas en segundo plano para `ReplicatedMergeTree` tabla. +- `Too many parts` es menos probable que ocurra al insertar en vistas materializadas agregadas (\#\# 2084). +- Se corrigió el manejo recursivo de sustituciones en la configuración si una sustitución debe ir seguida de otra sustitución en el mismo nivel. +- Se ha corregido la sintaxis en el archivo de metadatos al crear un `VIEW` que usa una consulta con `UNION ALL`. +- `SummingMergeTree` ahora funciona correctamente para la suma de estructuras de datos anidadas con una clave compuesta. +- Se corrigió la posibilidad de una condición de carrera al elegir el líder para `ReplicatedMergeTree` tabla. + +#### Crear cambios: {#build-changes-5} + +- La compilación admite `ninja` en lugar de `make` y usos `ninja` de forma predeterminada para la creación de versiones. +- Paquetes renombrados: `clickhouse-server-base` en `clickhouse-common-static`; `clickhouse-server-common` en `clickhouse-server`; `clickhouse-common-dbg` en `clickhouse-common-static-dbg`. Para instalar, utilice `clickhouse-server clickhouse-client`. Los paquetes con los nombres antiguos aún se cargarán en los repositorios por compatibilidad con versiones anteriores. + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-9} + +- Se eliminó la interpretación especial de una expresión IN si se especifica una matriz en el lado izquierdo. Anteriormente, la expresión `arr IN (set)` se interpretó como “at least one `arr` element belongs to the `set`”. Para obtener el mismo comportamiento en la nueva versión, escriba `arrayExists(x -> x IN (set), arr)`. +- Deshabilitado el uso incorrecto de la opción de socket `SO_REUSEPORT`, que se habilitó incorrectamente de forma predeterminada en la biblioteca Poco. Tenga en cuenta que en Linux ya no hay ninguna razón para especificar simultáneamente las direcciones `::` y `0.0.0.0` for listen – use just `::`, que permite escuchar la conexión tanto a través de IPv4 como IPv6 (con los ajustes de configuración predeterminados del kernel). También puede volver al comportamiento de versiones anteriores especificando `1` en la configuración. + +### Lanzamiento de ClickHouse 1.1.54370, 2018-03-16 {#clickhouse-release-1-1-54370-2018-03-16} + +#### Novedad: {#new-features-15} + +- Se agregó el `system.macros` tabla y actualización automática de macros cuando se cambia el archivo de configuración. +- Se agregó el `SYSTEM RELOAD CONFIG` consulta. +- Se agregó el `maxIntersections(left_col, right_col)` función de agregado, que devuelve el número máximo de intervalos de intersección simultáneamente `[left; right]`. El `maxIntersectionsPosition(left, right)` función devuelve el comienzo de la “maximum” intervalo. ([Miguel Furmur](https://github.com/ClickHouse/ClickHouse/pull/2012)). + +#### Mejora: {#improvements-14} + +- Al insertar datos en un `Replicated` se hacen menos solicitudes para `ZooKeeper` (y la mayoría de los errores de nivel de usuario han desaparecido del `ZooKeeper` registro). +- Se agregó la capacidad de crear alias para conjuntos de datos. Ejemplo: `WITH (1, 2, 3) AS set SELECT number IN set FROM system.numbers LIMIT 10`. + +#### Corrección de errores: {#bug-fixes-26} + +- Se corrigió el `Illegal PREWHERE` error al leer de las tablas Merge para `Distributed`tabla. +- Se agregaron correcciones que le permiten iniciar clickhouse-server en contenedores Docker solo para IPv4. +- Se corrigió una condición de carrera al leer desde el sistema `system.parts_columns tables.` +- Se eliminó el doble almacenamiento en búfer durante una inserción síncrona en un `Distributed` tabla, lo que podría haber causado que la conexión agotara el tiempo de espera. +- Se corrigió un error que causaba esperas excesivamente largas para una réplica no disponible antes de comenzar un `SELECT` consulta. +- Se corrigieron fechas incorrectas en el `system.parts` tabla. +- Se corrigió un error que hacía imposible insertar datos en un `Replicated` mesa si `chroot` no estaba vacío en la configuración del `ZooKeeper` Cluster. +- Se corrigió el algoritmo de fusión vertical para un vacío `ORDER BY` tabla. +- Se restauró la capacidad de usar diccionarios en consultas a tablas remotas, incluso si estos diccionarios no están presentes en el servidor del solicitante. Esta funcionalidad se perdió en la versión 1.1.54362. +- Restauró el comportamiento para consultas como `SELECT * FROM remote('server2', default.table) WHERE col IN (SELECT col2 FROM default.table)` cuando el lado derecho de la `IN` debe utilizar un control remoto `default.table` en lugar de uno local. Este comportamiento se rompió en la versión 1.1.54358. +- Se eliminó el registro de nivel de error extraño de `Not found column ... in block`. + +### ¿Qué puedes encontrar en Neodigit {#clickhouse-release-1-1-54362-2018-03-11} + +#### Novedad: {#new-features-16} + +- Agregación sin `GROUP BY` para un conjunto vacío (como `SELECT count(*) FROM table WHERE 0`) ahora devuelve un resultado con una fila con valores nulos para funciones agregadas, de acuerdo con el estándar SQL. Para restaurar el comportamiento anterior (devolver un resultado vacío), establezca `empty_result_for_aggregation_by_empty_set` a 1. +- Añadido tipo de conversión para `UNION ALL`. Se permiten diferentes nombres de alias en `SELECT` posiciones en `UNION ALL`, de acuerdo con el estándar SQL. +- Las expresiones arbitrarias se admiten en `LIMIT BY` clausula. Anteriormente, solo era posible usar columnas resultantes de `SELECT`. +- Un índice de `MergeTree` se utiliza cuando `IN` se aplica a una tupla de expresiones de las columnas de la clave principal. Ejemplo: `WHERE (UserID, EventDate) IN ((123, '2000-01-01'), ...)` (Anastasiya Tsarkova). +- Se agregó el `clickhouse-copier` herramienta para copiar entre clústeres y resharding datos (beta). +- Se agregaron funciones hash consistentes: `yandexConsistentHash`, `jumpConsistentHash`, `sumburConsistentHash`. Se pueden usar como una clave de fragmentación para reducir la cantidad de tráfico de red durante los subsiguientes reshardings. +- Funciones añadidas: `arrayAny`, `arrayAll`, `hasAny`, `hasAll`, `arrayIntersect`, `arrayResize`. +- Se agregó el `arrayCumSum` (Javi Santana). +- Se agregó el `parseDateTimeBestEffort`, `parseDateTimeBestEffortOrZero`, y `parseDateTimeBestEffortOrNull` funciones para leer el DateTime de una cadena que contiene texto en una amplia variedad de formatos posibles. +- Los datos se pueden volver a cargar parcialmente de diccionarios externos durante la actualización (cargar sólo los registros en los que el valor del campo especificado mayor que en la descarga anterior) (Arsen Hakobyan). +- Se agregó el `cluster` función de la tabla. Ejemplo: `cluster(cluster_name, db, table)`. El `remote` función de tabla puede aceptar el nombre del clúster como el primer argumento, si se especifica como un identificador. +- El `remote` y `cluster` las funciones de la tabla se pueden utilizar en `INSERT` consulta. +- Se agregó el `create_table_query` y `engine_full` columnas virtuales a la `system.tables`tabla . El `metadata_modification_time` columna es virtual. +- Se agregó el `data_path` y `metadata_path` columnas a `system.tables`y`system.databases` tablas, y añadió el `path` columna a la `system.parts` y `system.parts_columns` tabla. +- Se agregó información adicional sobre fusiones en el `system.part_log` tabla. +- Se puede utilizar una clave de partición arbitraria para `system.query_log` (Kirill Shvakov). +- El `SHOW TABLES` consulta ahora también muestra tablas temporales. Se agregaron tablas temporales y el `is_temporary` columna a `system.tables` (zhang2014). +- Añadir `DROP TEMPORARY TABLE` y `EXISTS TEMPORARY TABLE` consultas (zhang2014). +- Soporte para `SHOW CREATE TABLE` para tablas temporales (zhang2014). +- Se agregó el `system_profile` parámetro de configuración para los ajustes utilizados por los procesos internos. +- Soporte para carga `object_id` como un atributo en `MongoDB` diccionarios (Pavel Litvinenko). +- Lectura `null` como el valor predeterminado al cargar datos para un diccionario externo con el `MongoDB` fuente (Pavel Litvinenko). +- Lectura `DateTime` valores en el `Values` formato de una marca de tiempo Unix sin comillas simples. +- La conmutación por error se admite en `remote` funciones de tabla para los casos en que a algunas de las réplicas les falta la tabla solicitada. +- Los valores de configuración se pueden anular en la línea de comandos al ejecutar `clickhouse-server`. Ejemplo: `clickhouse-server -- --logger.level=information`. +- Implementado el `empty` función de un `FixedString` argumento: la función devuelve 1 si la cadena consta completamente de bytes nulos (zhang2014). +- Se agregó el `listen_try`parámetro de configuración para escuchar al menos una de las direcciones de escucha sin salir, si algunas de las direcciones no se pueden escuchar (útil para sistemas con soporte deshabilitado para IPv4 o IPv6). +- Se agregó el `VersionedCollapsingMergeTree` motor de mesa. +- Soporte para filas y tipos numéricos arbitrarios para el `library` fuente del diccionario. +- `MergeTree` las tablas se pueden usar sin una clave principal (debe especificar `ORDER BY tuple()`). +- A `Nullable` tipo puede ser `CAST` a un no-`Nullable` escriba si el argumento no es `NULL`. +- `RENAME TABLE` se puede realizar para `VIEW`. +- Se agregó el `throwIf` función. +- Se agregó el `odbc_default_field_size` opción, que le permite extender el tamaño máximo del valor cargado desde una fuente ODBC (por defecto, es 1024). +- El `system.processes` mesa y `SHOW PROCESSLIST` ahora tienen el `is_cancelled` y `peak_memory_usage` columna. + +#### Mejora: {#improvements-15} + +- Los límites y las cuotas sobre el resultado ya no se aplican a los datos intermedios para `INSERT SELECT` consultas o para `SELECT` subconsultas. +- Menos desencadenantes falsos de `force_restore_data` al comprobar el estado de `Replicated` cuando se inicia el servidor. +- Se agregó el `allow_distributed_ddl` opcion. +- Las funciones no deterministas no están permitidas en expresiones para `MergeTree` teclas de mesa. +- Archivos con sustituciones de `config.d` los directorios se cargan en orden alfabético. +- Rendimiento mejorado del `arrayElement` función en el caso de una matriz multidimensional constante con una matriz vacía como uno de los elementos. Ejemplo: `[[1], []][x]`. +- El servidor se inicia más rápido ahora cuando se utilizan archivos de configuración con sustituciones muy grandes (por ejemplo, listas muy grandes de redes IP). +- Al ejecutar una consulta, las funciones de valor de tabla se ejecutan una vez. Previamente, `remote` y `mysql` las funciones de valor de tabla realizaron la misma consulta dos veces para recuperar la estructura de tabla de un servidor remoto. +- El `MkDocs` se utiliza el generador de documentación. +- Cuando intenta eliminar una columna de tabla que `DEFAULT`/`MATERIALIZED` expresiones de otras columnas dependen, se lanza una excepción (zhang2014). +- Se agregó la capacidad de analizar una línea vacía en formatos de texto como el número 0 para `Float` tipos de datos. Esta característica estaba disponible anteriormente, pero se perdió en la versión 1.1.54342. +- `Enum` se pueden utilizar en `min`, `max`, `sum` y algunas otras funciones. En estos casos, utiliza los valores numéricos correspondientes. Esta característica estaba disponible anteriormente, pero se perdió en la versión 1.1.54337. +- Añadir `max_expanded_ast_elements` para restringir el tamaño del AST después de expandir recursivamente los alias. + +#### Corrección de errores: {#bug-fixes-27} + +- Fijo casos innecesarios columnas fueron retirados de las subconsultas en error, o no se quitan de subconsultas que contiene `UNION ALL`. +- Se corrigió un error en las fusiones para `ReplacingMergeTree` tabla. +- Inserciones síncronas fijas en `Distributed` tabla (`insert_distributed_sync = 1`). +- Segfault fijo para ciertos usos de `FULL` y `RIGHT JOIN` con columnas duplicadas en subconsultas. +- Segfault fijo para ciertos usos de `replace_running_query` y `KILL QUERY`. +- Se corrigió el orden de la `source` y `last_exception` columnas en el `system.dictionaries` tabla. +- Se corrigió un error cuando el `DROP DATABASE` la consulta no eliminó el archivo con metadatos. +- Se corrigió el `DROP DATABASE` consulta para `Dictionary` base. +- Se corrigió la baja precisión de `uniqHLL12` y `uniqCombined` funciones para cardinalidades superiores a 100 millones de artículos (Alex Bocharov). +- Se corrigió el cálculo de valores predeterminados implícitos cuando era necesario para calcular simultáneamente expresiones explícitas predeterminadas en `INSERT` consultas (zhang2014). +- Se corrigió un caso raro cuando una consulta a un `MergeTree` la tabla no pudo terminar (chenxing-xc). +- Se corrigió un bloqueo que se produjo al ejecutar un `CHECK` consulta para `Distributed` tablas si todos los fragmentos son locales (chenxing.xc). +- Se corrigió una ligera regresión de rendimiento con funciones que usan expresiones regulares. +- Se corrigió una regresión de rendimiento al crear matrices multidimensionales a partir de expresiones complejas. +- Se corrigió un error que podía causar un extra `FORMAT` sección para aparecer en una `.sql` archivo con metadatos. +- Se corrigió un error que causaba la `max_table_size_to_drop` límite para aplicar cuando se intenta eliminar un `MATERIALIZED VIEW` mirando una tabla explícitamente especificada. +- Se corrigió la incompatibilidad con clientes antiguos (a los clientes antiguos a veces se enviaban datos con el `DateTime('timezone')` tipo, que no entienden). +- Se ha corregido un error al leer `Nested` elementos de columna de estructuras que se agregaron usando `ALTER` pero que están vacíos para las particiones antiguas, cuando las condiciones para estas columnas se movieron a `PREWHERE`. +- Se corrigió un error al filtrar tablas por virtual `_table` columnas en consultas a `Merge` tabla. +- Se corrigió un error al usar `ALIAS` columnas en `Distributed` tabla. +- Se corrigió un error que hacía imposible la compilación dinámica para consultas con funciones agregadas del `quantile` familia. +- Se corrigió una condición de carrera en la canalización de ejecución de consultas que ocurría en casos muy raros al usar `Merge` con un gran número de tablas, y cuando se utiliza `GLOBAL` subconsultas. +- Se corrigió un bloqueo al pasar matrices de diferentes tamaños a un `arrayReduce` función cuando se utilizan funciones agregadas de múltiples argumentos. +- Prohibido el uso de consultas con `UNION ALL` en una `MATERIALIZED VIEW`. +- Se corrigió un error durante la inicialización del `part_log` tabla del sistema cuando se inicia el servidor (de forma predeterminada, `part_log` está deshabilitado). + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-10} + +- Eliminado el `distributed_ddl_allow_replicated_alter` opcion. Este comportamiento está habilitado de forma predeterminada. +- Eliminado el `strict_insert_defaults` configuración. Si estaba utilizando esta funcionalidad, escriba en `clickhouse-feedback@yandex-team.com`. +- Eliminado el `UnsortedMergeTree` motor. + +### ¿Qué puedes encontrar en Neodigit {#clickhouse-release-1-1-54343-2018-02-05} + +- Se agregó soporte de macros para definir nombres de clúster en consultas DDL distribuidas y constructores de tablas distribuidas: `CREATE TABLE distr ON CLUSTER '{cluster}' (...) ENGINE = Distributed('{cluster}', 'db', 'table')`. +- Ahora consultas como `SELECT ... FROM table WHERE expr IN (subquery)` se procesan utilizando el `table` Indice. +- Se ha mejorado el procesamiento de duplicados al insertar en tablas replicadas, por lo que ya no ralentizan la ejecución de la cola de replicación. + +### ¿Qué puedes encontrar en Neodigit {#clickhouse-release-1-1-54342-2018-01-22} + +Esta versión contiene correcciones de errores para la versión anterior 1.1.54337: + +- Se corrigió una regresión en 1.1.54337: si el usuario predeterminado tiene acceso de solo lectura, entonces el servidor se niega a iniciar con el mensaje `Cannot create database in readonly mode`. +- Se corrigió una regresión en 1.1.54337: en sistemas con systemd, los registros siempre se escriben en syslog independientemente de la configuración; el script de vigilancia todavía usa init .d. +- Se corrigió una regresión en 1.1.54337: configuración predeterminada incorrecta en la imagen de Docker. +- Comportamiento no determinista fijo de GraphiteMergeTree (se puede ver en los mensajes de registro `Data after merge is not byte-identical to the data on another replicas`). +- Se corrigió un error que podía provocar fusiones inconsistentes después de OPTIMIZE consulta a tablas replicadas (es posible que lo vea en los mensajes de registro `Part ... intersects the previous part`). +- Las tablas de búfer ahora funcionan correctamente cuando las columnas MATERIALIZED están presentes en la tabla de destino (por zhang2014). +- Se corrigió un error en la implementación de NULL. + +### ¿Qué puedes encontrar en Neodigit {#clickhouse-release-1-1-54337-2018-01-18} + +#### Novedad: {#new-features-17} + +- Se agregó soporte para el almacenamiento de matrices multidimensionales y tuplas (`Tuple` tipo de datos) en las tablas. +- Soporte para funciones de mesa para `DESCRIBE` y `INSERT` consulta. Se agregó soporte para subconsultas en `DESCRIBE`. Ejemplos: `DESC TABLE remote('host', default.hits)`; `DESC TABLE (SELECT 1)`; `INSERT INTO TABLE FUNCTION remote('host', default.hits)`. Soporte para `INSERT INTO TABLE` además de `INSERT INTO`. +- Soporte mejorado para zonas horarias. El `DateTime` tipo de datos se puede anotar con la zona horaria que se utiliza para el análisis y el formato en formatos de texto. Ejemplo: `DateTime('Europe/Moscow')`. Cuando las zonas horarias se especifican en `DateTime` argumentos, el tipo de devolución rastreará la zona horaria y el valor se mostrará como se esperaba. +- Se agregaron las funciones `toTimeZone`, `timeDiff`, `toQuarter`, `toRelativeQuarterNum`. El `toRelativeHour`/`Minute`/`Second` funciones pueden tomar un valor de tipo `Date` como argumento. El `now` nombre de la función distingue entre mayúsculas y minúsculas. +- Se agregó el `toStartOfFifteenMinutes` (Kirill Shvakov). +- Se agregó el `clickhouse format` herramienta para formatear consultas. +- Se agregó el `format_schema_path` configuration parameter (Marek Vavruşa). It is used for specifying a schema in `Cap'n Proto` formato. Los archivos de esquema solo se pueden ubicar en el directorio especificado. +- Se agregó soporte para sustituciones de configuración (`incl` y `conf.d`) para la configuración de diccionarios y modelos externos (Pavel Yakunin). +- Se agregó una columna con documentación para el `system.settings` (Kirill Shvakov). +- Se agregó el `system.parts_columns` tabla con información sobre los tamaños de columna en cada parte de datos `MergeTree` tabla. +- Se agregó el `system.models` tabla con información sobre `CatBoost` modelos de aprendizaje automático. +- Se agregó el `mysql` y `odbc` función de la tabla y correspondiente `MySQL` y `ODBC` para acceder a bases de datos remotas. Esta funcionalidad se encuentra en la fase beta. +- Se agregó la posibilidad de pasar un argumento de tipo `AggregateFunction` para el `groupArray` función agregada (para que pueda crear una matriz de estados de alguna función agregada). +- Se eliminaron restricciones en varias combinaciones de combinadores de funciones agregadas. Por ejemplo, puede usar `avgForEachIf` así como `avgIfForEach` funciones agregadas, que tienen diferentes comportamientos. +- El `-ForEach` el combinador de funciones agregadas se extiende para el caso de funciones agregadas de múltiples argumentos. +- Se agregó soporte para funciones agregadas de `Nullable` argumentos incluso para los casos en que la función devuelve un no-`Nullable` resultado (añadido con la contribución de Silviu Caragea). Ejemplo: `groupArray`, `groupUniqArray`, `topK`. +- Se agregó el `max_client_network_bandwidth` para `clickhouse-client` (Kirill Shvakov). +- Los usuarios con `readonly = 2` setting are allowed to work with TEMPORARY tables (CREATE, DROP, INSERT…) (Kirill Shvakov). +- Se agregó soporte para el uso de múltiples consumidores con el `Kafka` motor. Opciones de configuración ampliadas para `Kafka` (Marek Vavruša). +- Se agregó el `intExp3` y `intExp4` función. +- Se agregó el `sumKahan` función de agregado. +- Se agregaron las funciones \* Number\* OrNull, donde \* Number\* es un tipo numérico. +- Añadido soporte para `WITH` para una `INSERT SELECT` consulta (autor: zhang2014). +- Configuración añadida: `http_connection_timeout`, `http_send_timeout`, `http_receive_timeout`. En particular, estos valores se utilizan para descargar partes de datos para la replicación. Cambiar esta configuración permite una conmutación por error más rápida si la red está sobrecargada. +- Añadido soporte para `ALTER` para tablas de tipo `Null` (Anastasiya Tsarkova). +- El `reinterpretAsString` se extiende para todos los tipos de datos que se almacenan contiguamente en la memoria. +- Se agregó el `--silent` opción para el `clickhouse-local` herramienta. Suprime la información de ejecución de consultas de impresión en stderr. +- Se agregó soporte para leer valores de tipo `Date` de texto en un formato donde el mes y / o día del mes se especifica utilizando un solo dígito en lugar de dos dígitos (Amos Bird). + +#### Optimizaciones de rendimiento: {#performance-optimizations} + +- Rendimiento mejorado de las funciones agregadas `min`, `max`, `any`, `anyLast`, `anyHeavy`, `argMin`, `argMax` de argumentos de cadena. +- Mejora del rendimiento de las funciones `isInfinite`, `isFinite`, `isNaN`, `roundToExp2`. +- Rendimiento mejorado del análisis y el formato `Date` y `DateTime` valores de tipo en formato de texto. +- Mejora del rendimiento y la precisión del análisis de números de coma flotante. +- Menor uso de memoria para `JOIN` en el caso cuando las partes izquierda y derecha tienen columnas con nombres idénticos que no están contenidos en `USING` . +- Rendimiento mejorado de las funciones agregadas `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr` reduciendo la estabilidad computacional. Las funciones antiguas están disponibles bajo los nombres `varSampStable`, `varPopStable`, `stddevSampStable`, `stddevPopStable`, `covarSampStable`, `covarPopStable`, `corrStable`. + +#### Corrección de errores: {#bug-fixes-28} + +- Deduplicación de datos fija después de ejecutar un `DROP` o `DETACH PARTITION` consulta. En la versión anterior, soltar una partición e insertar los mismos datos de nuevo no funcionaba porque los bloques insertados se consideraban duplicados. +- Se corrigió un error que podía conducir a una interpretación incorrecta de la `WHERE` cláusula para `CREATE MATERIALIZED VIEW` consultas con `POPULATE` . +- Se corrigió un error al usar el `root_path` parámetro en el `zookeeper_servers` configuración. +- Se corrigieron los resultados inesperados de pasar el `Date` argumento a `toStartOfDay` . +- Se corrigió el `addMonths` y `subtractMonths` funciones y la aritmética para `INTERVAL n MONTH` en los casos en que el resultado tiene el año anterior. +- Se agregó soporte faltante para el `UUID` tipo de datos para `DISTINCT` , `JOIN` , y `uniq` funciones agregadas y diccionarios externos (Evgeniy Ivanov). Soporte para `UUID` todavía está incompleto. +- Fijo `SummingMergeTree` comportamiento en los casos en que las filas suman a cero. +- Varias correcciones para el `Kafka` engine (Marek Vavruša). +- Corregido el comportamiento incorrecto del `Join` motor de mesa (Amos Bird). +- Se corrigió el comportamiento incorrecto del asignador en FreeBSD y OS X. +- El `extractAll` la función ahora admite coincidencias vacías. +- Se corrigió un error que bloqueaba el uso de `libressl` en lugar de `openssl` . +- Se corrigió el `CREATE TABLE AS SELECT` consulta de tablas temporales. +- Se corrigió la no anatomía de la actualización de la cola de replicación. Esto podría provocar que las réplicas no estén sincronizadas hasta que se reinicie el servidor. +- Posible desbordamiento fijo en `gcd` , `lcm` y `modulo` (`%` (Maks Skorokhod). +- `-preprocessed` los archivos ahora se crean después de cambiar `umask` (`umask` se puede cambiar en la configuración). +- Se corrigió un error en la verificación de antecedentes de las piezas (`MergeTreePartChecker` ) cuando se utiliza una clave de partición personalizada. +- Análisis fijo de tuplas (valores de la `Tuple` tipo de datos) en formatos de texto. +- Mensajes de error mejorados sobre tipos incompatibles pasados a `multiIf` , `array` y algunas otras funciones. +- Soporte rediseñado para `Nullable` tipo. Se corrigieron errores que podían provocar un bloqueo del servidor. Se corrigieron casi todos los demás errores relacionados con `NULL` soporte: conversiones de tipo incorrectas en INSERT SELECT, soporte insuficiente para Nullable en HAVING y PREWHERE, `join_use_nulls` modo, tipos anulables como argumentos de `OR` operador, etc. +- Se corrigieron varios errores relacionados con la semántica interna de los tipos de datos. Ejemplos: suma innecesaria de `Enum` campos de tipo en `SummingMergeTree` ; alineación de `Enum` tipos en `Pretty` formatos, etc. +- Comprueba más estrictamente las combinaciones permitidas de columnas compuestas. +- Se corrigió el desbordamiento al especificar un parámetro muy grande para el `FixedString` tipo de datos. +- Se ha corregido un error en el `topK` función de agregado en un caso genérico. +- Se agregó la verificación faltante de igualdad de tamaños de matriz en argumentos de variantes narias de funciones agregadas con un `-Array` combinador. +- Se ha corregido un error en `--pager` para `clickhouse-client` (autor: ks1322). +- Se corrigió la precisión del `exp10` función. +- Se corrigió el comportamiento del `visitParamExtract` función para un mejor cumplimiento de la documentación. +- Se corrigió el bloqueo cuando se especifican tipos de datos incorrectos. +- Se corrigió el comportamiento de `DISTINCT` en el caso cuando todas las columnas son constantes. +- Se corrigió el formato de consulta en el caso de usar el `tupleElement` función con una expresión constante compleja como el índice del elemento de tupla. +- Se ha corregido un error en `Dictionary` tablas para `range_hashed` diccionario. +- Se corrigió un error que provocaba filas excesivas en el resultado de `FULL` y `RIGHT JOIN` (Amós De Aves). +- Se corrigió un bloqueo del servidor al crear y eliminar archivos temporales en `config.d` directorios durante la recarga de configuración. +- Se corrigió el `SYSTEM DROP DNS CACHE` consulta: la memoria caché se vació pero las direcciones de los nodos del clúster no se actualizaron. +- Se corrigió el comportamiento de `MATERIALIZED VIEW` después de ejecutar `DETACH TABLE` for the table under the view (Marek Vavruša). + +#### Mejoras de construcción: {#build-improvements-4} + +- El `pbuilder` herramienta se utiliza para compilaciones. El proceso de compilación es casi completamente independiente del entorno de host de compilación. +- Una sola compilación se utiliza para diferentes versiones del sistema operativo. Los paquetes y binarios se han hecho compatibles con una amplia gama de sistemas Linux. +- Se agregó el `clickhouse-test` paquete. Se puede usar para ejecutar pruebas funcionales. +- El archivo tarball de origen ahora se puede publicar en el repositorio. Se puede usar para reproducir la compilación sin usar GitHub. +- Se agregó una integración limitada con Travis CI. Debido a los límites en el tiempo de compilación en Travis, solo se prueba la compilación de depuración y se ejecuta un subconjunto limitado de pruebas. +- Añadido soporte para `Cap'n'Proto` en la compilación predeterminada. +- Se ha cambiado el formato de las fuentes de documentación de `Restricted Text` a `Markdown`. +- Añadido soporte para `systemd` (Vladimir Smirnov). Está deshabilitado por defecto debido a la incompatibilidad con algunas imágenes del sistema operativo y se puede habilitar manualmente. +- Para la generación de código dinámico, `clang` y `lld` están incrustados en el `clickhouse` binario. También se pueden invocar como `clickhouse clang` y `clickhouse lld` . +- Se eliminó el uso de extensiones GNU del código. Habilitado el `-Wextra` opcion. Al construir con `clang` el valor predeterminado es `libc++` en lugar de `libstdc++`. +- Extraer `clickhouse_parsers` y `clickhouse_common_io` bibliotecas para acelerar las compilaciones de varias herramientas. + +#### Cambios incompatibles hacia atrás: {#backward-incompatible-changes-11} + +- El formato de las marcas en `Log` tablas de tipos que contienen `Nullable` columnas se cambió de una manera incompatible con versiones anteriores. Si tiene estas tablas, debe convertirlas a la `TinyLog` escriba antes de iniciar la nueva versión del servidor. Para hacer esto, reemplace `ENGINE = Log` con `ENGINE = TinyLog` en el correspondiente `.sql` archivo en el `metadata` directorio. Si su tabla no tiene `Nullable` o si el tipo de su tabla no es `Log`, entonces usted no tiene que hacer nada. +- Eliminado el `experimental_allow_extended_storage_definition_syntax` configuración. Ahora esta característica está habilitada de forma predeterminada. +- El `runningIncome` función fue renombrada a `runningDifferenceStartingWithFirstvalue` para evitar confusiones. +- Eliminado el `FROM ARRAY JOIN arr` sintaxis cuando ARRAY JOIN se especifica directamente después de FROM sin tabla (Amos Bird). +- Eliminado el `BlockTabSeparated` formato que se utilizó únicamente con fines de demostración. +- Se ha cambiado el formato de estado para las funciones agregadas `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. Si ha almacenado estados de estas funciones agregadas en tablas (utilizando `AggregateFunction` tipo de datos o vistas materializadas con los estados correspondientes), por favor escriba a clickhouse-feedback@yandex-team.com. +- En versiones anteriores del servidor había una característica no documentada: si una función agregada depende de parámetros, aún puede especificarla sin parámetros en el tipo de datos AggregateFunction . Ejemplo: `AggregateFunction(quantiles, UInt64)` en lugar de `AggregateFunction(quantiles(0.5, 0.9), UInt64)`. Esta característica se perdió. Aunque no estaba documentado, planeamos apoyarlo nuevamente en futuras versiones. +- Los tipos de datos de enumeración no se pueden usar en funciones de agregado mínimo / máximo. Esta habilidad se devolverá en la próxima versión. + +#### Tenga en cuenta al actualizar: {#please-note-when-upgrading} + +- Al realizar una actualización continua en un clúster, en el momento en que algunas de las réplicas ejecutan la versión anterior de ClickHouse y otras ejecutan la nueva versión, la replicación se detiene temporalmente y el mensaje `unknown parameter 'shard'` aparece en el registro. La replicación continuará después de que se actualicen todas las réplicas del clúster. +- Si se están ejecutando diferentes versiones de ClickHouse en los servidores de clúster, es posible que las consultas distribuidas que utilizan las siguientes funciones tengan resultados incorrectos: `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. Debe actualizar todos los nodos del clúster. diff --git a/docs/es/changelog/2019.md b/docs/es/changelog/2019.md deleted file mode 120000 index 105ca144fca..00000000000 --- a/docs/es/changelog/2019.md +++ /dev/null @@ -1 +0,0 @@ -../../en/changelog/2019.md \ No newline at end of file diff --git a/docs/es/changelog/2019.md b/docs/es/changelog/2019.md new file mode 100644 index 00000000000..3acb9db1997 --- /dev/null +++ b/docs/es/changelog/2019.md @@ -0,0 +1,2065 @@ +--- +machine_translated: true +--- + +## ClickHouse de liberación de la v19.17 {#clickhouse-release-v19-17} + +### Lanzamiento de ClickHouse v19.17.6.36, 2019-12-27 {#clickhouse-release-v19-17-6-36-2019-12-27} + +#### Corrección de errores {#bug-fix} + +- Desbordamiento de búfer potencial fijo en descomprimir. El usuario malintencionado puede pasar datos comprimidos fabricados que podrían causar lectura después del búfer. Este problema fue encontrado por Eldar Zaitov del equipo de seguridad de la información de Yandex. [\#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió un posible bloqueo del servidor (`std::terminate`) cuando el servidor no puede enviar o escribir datos en formato JSON o XML con valores de tipo de datos String (que requieren validación UTF-8) o al comprimir datos de resultados con el algoritmo Brotli o en algunos otros casos raros. [\#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Diccionarios fijos con fuente de un clickhouse `VIEW`, ahora leer tales diccionarios no causa el error `There is no query`. [\#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Se corrigió la comprobación de si un host cliente está permitido por host\_regexp especificado en los usuarios.XML. [\#8241](https://github.com/ClickHouse/ClickHouse/pull/8241), [\#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) +- `RENAME TABLE` para una tabla distribuida ahora cambia el nombre de la carpeta que contiene los datos insertados antes de enviarlos a los fragmentos. Esto soluciona un problema con los cambios de nombre sucesivos `tableA->tableB`, `tableC->tableA`. [\#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([Tavplubix](https://github.com/tavplubix)) +- `range_hashed` Los diccionarios externos creados por consultas DDL ahora permiten rangos de tipos numéricos arbitrarios. [\#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) +- Fijo `INSERT INTO table SELECT ... FROM mysql(...)` función de la tabla. [\#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([Tavplubix](https://github.com/tavplubix)) +- Segfault fijo en `INSERT INTO TABLE FUNCTION file()` mientras se inserta en un archivo que no existe. Ahora, en este caso, se crearía un archivo y luego se procesaría la inserción. [\#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) +- Se corrigió el error bitmapAnd al intersecar un mapa de bits agregado y un mapa de bits escalar. [\#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) +- Segfault fijo cuando `EXISTS` consulta se utilizó sin `TABLE` o `DICTIONARY` calificador, al igual que `EXISTS t`. [\#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Tipo de retorno fijo para funciones `rand` y `randConstant` en caso de argumento anulable. Ahora las funciones siempre regresan `UInt32` y nunca `Nullable(UInt32)`. [\#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fijo `DROP DICTIONARY IF EXISTS db.dict`, ahora no lanza la excepción si `db` no existe. [\#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) +- Si una tabla no se eliminó por completo debido a un bloqueo del servidor, el servidor intentará restaurarla y cargarla [\#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([Tavplubix](https://github.com/tavplubix)) +- Se corrigió una consulta de recuento trivial para una tabla distribuida si hay más de dos tablas locales de fragmentos. [\#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) +- Se corrigió un error que conducía a una carrera de datos en DB :: BlockStreamProfileInfo :: calculateRowsBeforeLimit() [\#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alejandro Kazakov](https://github.com/Akazz)) +- Fijo `ALTER table MOVE part` se ejecuta inmediatamente después de fusionar la parte especificada, lo que podría provocar el movimiento de una parte en la que la parte especificada se fusionó. Ahora mueve correctamente la parte especificada. [\#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Las expresiones para los diccionarios se pueden especificar como cadenas ahora. Esto es útil para el cálculo de atributos al extraer datos de fuentes que no son de ClickHouse porque permite usar la sintaxis que no son de ClickHouse para esas expresiones. [\#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) +- Se corrigió una carrera muy rara en `clickhouse-copier` debido a un desbordamiento en ZXid. [\#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Más información](https://github.com/dingxiangfei2009)) +- Se corrigió el error cuando después de la consulta falló (debido a “Too many simultaneous queries” por ejemplo) no leería información de tablas externas, y el + La siguiente solicitud interpretaría esta información como el comienzo de la siguiente consulta causando un error como `Unknown packet from client`. [\#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) +- Evite la desreferencia nula después de “Unknown packet X from server” [\#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) +- Restaure el soporte de todas las configuraciones regionales de la UCI, agregue la capacidad de aplicar intercalaciones para expresiones constantes y agregue el nombre del idioma al sistema.mesa de colaciones. [\#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) +- Número de secuencias para leer desde `StorageFile` y `StorageHDFS` ahora está limitado, para evitar exceder el límite de memoria. [\#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) +- Fijo `CHECK TABLE` consulta para `*MergeTree` mesas sin llave. [\#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) +- Eliminado el número de mutación de un nombre de pieza en caso de que no hubiera mutaciones. Esta eliminación mejoró la compatibilidad con versiones anteriores. [\#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) +- Se corrigió el error de que las mutaciones se omiten para algunas partes adjuntas debido a que su versión de datos son más grandes que la versión de mutación de la tabla. [\#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) +- Permita iniciar el servidor con copias redundantes de piezas después de moverlas a otro dispositivo. [\#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Corregido el error “Sizes of columns doesn’t match” que pueden aparecer al usar columnas de función agregadas. [\#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) +- Ahora se lanzará una excepción en caso de usar WITH TIES junto con LIMIT BY. Y ahora es posible usar TOP con LIMIT BY. [\#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Repara la recarga del diccionario si tiene `invalidate_query`, que detuvo las actualizaciones y alguna excepción en los intentos de actualización anteriores. [\#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) + +### Lanzamiento de ClickHouse v19.17.4.11, 2019-11-22 {#clickhouse-release-v19-17-4-11-2019-11-22} + +#### Cambio incompatible hacia atrás {#backward-incompatible-change} + +- Usar column en lugar de AST para almacenar resultados de subconsultas escalares para un mejor rendimiento. Configuración `enable_scalar_subquery_optimization` se agregó en 19.17 y se habilitó de forma predeterminada. Conduce a errores como [este](https://github.com/ClickHouse/ClickHouse/issues/7851) durante la actualización a 19.17.2 o 19.17.3 de versiones anteriores. Esta configuración estaba deshabilitada de forma predeterminada en 19.17.4, para hacer posible la actualización desde 19.16 y versiones anteriores sin errores. [\#7392](https://github.com/ClickHouse/ClickHouse/pull/7392) ([Amos pájaro](https://github.com/amosbird)) + +#### Novedad {#new-feature} + +- Agregue la capacidad de crear diccionarios con consultas DDL. [\#7360](https://github.com/ClickHouse/ClickHouse/pull/7360) ([alesapin](https://github.com/alesapin)) +- Hacer `bloom_filter` tipo de índice de apoyo `LowCardinality` y `Nullable` [\#7363](https://github.com/ClickHouse/ClickHouse/issues/7363) [\#7561](https://github.com/ClickHouse/ClickHouse/pull/7561) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Añadir función `isValidJSON` para verificar que la cadena pasada sea un json válido. [\#5910](https://github.com/ClickHouse/ClickHouse/issues/5910) [\#7293](https://github.com/ClickHouse/ClickHouse/pull/7293) ([Vdimir](https://github.com/Vdimir)) +- Implementar `arrayCompact` función [\#7328](https://github.com/ClickHouse/ClickHouse/pull/7328) ([Memo](https://github.com/Joeywzr)) +- Función creada `hex` para números decimales. Funciona como `hex(reinterpretAsString())`, pero no elimina los últimos cero bytes. [\#7355](https://github.com/ClickHouse/ClickHouse/pull/7355) ([Mikhail Korotov](https://github.com/millb)) +- Añadir `arrayFill` y `arrayReverseFill` funciones, que reemplazan elementos por otros elementos delante / detrás de ellos en la matriz. [\#7380](https://github.com/ClickHouse/ClickHouse/pull/7380) ([Hcz](https://github.com/hczhcz)) +- Añadir `CRC32IEEE()`/`CRC64()` apoyo [\#7480](https://github.com/ClickHouse/ClickHouse/pull/7480) ([Azat Khuzhin](https://github.com/azat)) +- Implementar `char` función similar a uno en [mysql](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_char) [\#7486](https://github.com/ClickHouse/ClickHouse/pull/7486) ([Sundyli](https://github.com/sundy-li)) +- Añadir `bitmapTransform` función. Transforma una matriz de valores en un mapa de bits a otra matriz de valores, el resultado es un nuevo mapa de bits [\#7598](https://github.com/ClickHouse/ClickHouse/pull/7598) ([Zhichang Yu](https://github.com/yuzhichang)) +- Aplicado `javaHashUTF16LE()` función [\#7651](https://github.com/ClickHouse/ClickHouse/pull/7651) ([chimbab](https://github.com/achimbab)) +- Añadir `_shard_num` columna virtual para el motor distribuido [\#7624](https://github.com/ClickHouse/ClickHouse/pull/7624) ([Azat Khuzhin](https://github.com/azat)) + +#### Característica Experimental {#experimental-feature} + +- Soporte para procesadores (nueva canalización de ejecución de consultas) en `MergeTree`. [\#7181](https://github.com/ClickHouse/ClickHouse/pull/7181) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Corrección de errores {#bug-fix-1} + +- Corregir el análisis flotante incorrecto en `Values` [\#7817](https://github.com/ClickHouse/ClickHouse/issues/7817) [\#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([Tavplubix](https://github.com/tavplubix)) +- Soluciona un punto muerto raro que puede ocurrir cuando trace\_log está habilitado. [\#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) +- Evitar la duplicación de mensajes al producir la tabla Kafka tiene cualquier MV seleccionando de ella [\#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) +- Soporte para `Array(LowCardinality(Nullable(String)))` en `IN`. Resolver [\#7364](https://github.com/ClickHouse/ClickHouse/issues/7364) [\#7366](https://github.com/ClickHouse/ClickHouse/pull/7366) ([chimbab](https://github.com/achimbab)) +- Añadir manejo de `SQL_TINYINT` y `SQL_BIGINT`, y fijar el manejo de `SQL_FLOAT` tipos de origen de datos en ODBC Bridge. [\#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) +- Corregir la agregación (`avg` y quantiles) sobre columnas decimales vacías [\#7431](https://github.com/ClickHouse/ClickHouse/pull/7431) ([Andrey Konyaev](https://github.com/akonyaev90)) +- Fijar `INSERT` en Distribuido con `MATERIALIZED` columna [\#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) +- Hacer `MOVE PARTITION` funciona si algunas partes de la partición ya están en el disco o volumen de destino [\#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Se corrigió un error con los enlaces duros que no se creaban durante las mutaciones en `ReplicatedMergeTree` en configuraciones de varios discos. [\#7558](https://github.com/ClickHouse/ClickHouse/pull/7558) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Se corrigió un error con una mutación en un MergeTree cuando toda la parte permanece sin cambios y el mejor espacio se encuentra en otro disco [\#7602](https://github.com/ClickHouse/ClickHouse/pull/7602) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Corregido error con `keep_free_space_ratio` no se lee desde la configuración de discos [\#7645](https://github.com/ClickHouse/ClickHouse/pull/7645) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Corregir error con la tabla solo contiene `Tuple` columnas o columnas con rutas complejas. Fijar [7541](https://github.com/ClickHouse/ClickHouse/issues/7541). [\#7545](https://github.com/ClickHouse/ClickHouse/pull/7545) ([alesapin](https://github.com/alesapin)) +- No tener en cuenta la memoria para el motor de búfer en el límite de max\_memory\_usage [\#7552](https://github.com/ClickHouse/ClickHouse/pull/7552) ([Azat Khuzhin](https://github.com/azat)) +- Corregir el uso de marcas final en `MergeTree` ordenadas por `tuple()`. En casos raros podría conducir a `Can't adjust last granule` error mientras selecciona. [\#7639](https://github.com/ClickHouse/ClickHouse/pull/7639) ([Anton Popov](https://github.com/CurtizJ)) +- Corregir errores en mutaciones que tienen predicados con acciones que requieren contexto (por ejemplo, funciones para json), lo que puede provocar bloqueos o excepciones extrañas. [\#7664](https://github.com/ClickHouse/ClickHouse/pull/7664) ([alesapin](https://github.com/alesapin)) +- Corregir la falta de coincidencia de los nombres de bases de datos y tablas que se escapan en `data/` y `shadow/` Directory [\#7575](https://github.com/ClickHouse/ClickHouse/pull/7575) ([Alejandro Burmak](https://github.com/Alex-Burmak)) +- Support duplicated keys in RIGHT\|FULL JOINs, e.g. `ON t.x = u.x AND t.x = u.y`. Corregir el bloqueo en este caso. [\#7586](https://github.com/ClickHouse/ClickHouse/pull/7586) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijar `Not found column in block` al unirse en la expresión con RIGHT o FULL JOIN. [\#7641](https://github.com/ClickHouse/ClickHouse/pull/7641) ([Artem Zuikov](https://github.com/4ertus2)) +- Un intento más de arreglar bucle infinito en `PrettySpace` formato [\#7591](https://github.com/ClickHouse/ClickHouse/pull/7591) ([Olga Khvostikova](https://github.com/stavrolia)) +- Corregir error en `concat` función cuando todos los argumentos fueron `FixedString` del mismo tamaño. [\#7635](https://github.com/ClickHouse/ClickHouse/pull/7635) ([alesapin](https://github.com/alesapin)) +- Se corrigió la excepción en caso de usar 1 argumento al definir almacenes S3, URL y HDFS. [\#7618](https://github.com/ClickHouse/ClickHouse/pull/7618) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Corregir el alcance de InterpreterSelectQuery para vistas con consulta [\#7601](https://github.com/ClickHouse/ClickHouse/pull/7601) ([Azat Khuzhin](https://github.com/azat)) + +#### Mejora {#improvement} + +- `Nullable` columnas reconocidas y valores NULL manejados correctamente por ODBC-bridge [\#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) +- Escribir el lote actual para el envío distribuido atómicamente [\#7600](https://github.com/ClickHouse/ClickHouse/pull/7600) ([Azat Khuzhin](https://github.com/azat)) +- Lance una excepción si no podemos detectar la tabla para el nombre de la columna en la consulta. [\#7358](https://github.com/ClickHouse/ClickHouse/pull/7358) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir `merge_max_block_size` ajuste a `MergeTreeSettings` [\#7412](https://github.com/ClickHouse/ClickHouse/pull/7412) ([Artem Zuikov](https://github.com/4ertus2)) +- Consultas con `HAVING` y sin `GROUP BY` asumir grupo por constante. Tan, `SELECT 1 HAVING 1` ahora devuelve un resultado. [\#7496](https://github.com/ClickHouse/ClickHouse/pull/7496) ([Amos pájaro](https://github.com/amosbird)) +- Soporte de análisis `(X,)` como tupla similar a python. [\#7501](https://github.com/ClickHouse/ClickHouse/pull/7501), [\#7562](https://github.com/ClickHouse/ClickHouse/pull/7562) ([Amos pájaro](https://github.com/amosbird)) +- Hacer `range` comportamientos de función casi como uno pitónico. [\#7518](https://github.com/ClickHouse/ClickHouse/pull/7518) ([Sundyli](https://github.com/sundy-li)) +- Añadir `constraints` columnas a la mesa `system.settings` [\#7553](https://github.com/ClickHouse/ClickHouse/pull/7553) ([Vitaly Baranov](https://github.com/vitlibar)) +- Mejor formato nulo para el controlador tcp, por lo que es posible usar `select ignore() from table format Null` para la medida de perf a través de clickhouse-client [\#7606](https://github.com/ClickHouse/ClickHouse/pull/7606) ([Amos pájaro](https://github.com/amosbird)) +- Consultas como `CREATE TABLE ... AS (SELECT (1, 2))` se analizan correctamente [\#7542](https://github.com/ClickHouse/ClickHouse/pull/7542) ([Hcz](https://github.com/hczhcz)) + +#### Mejora del rendimiento {#performance-improvement} + +- Se mejora el rendimiento de la agregación sobre claves de cadena cortas. [\#6243](https://github.com/ClickHouse/ClickHouse/pull/6243) ([Alejandro Kuzmenkov](https://github.com/akuzm), [Amos pájaro](https://github.com/amosbird)) +- Ejecute otra pasada de análisis de sintaxis / expresión para obtener optimizaciones potenciales después de que se plieguen los predicados constantes. [\#7497](https://github.com/ClickHouse/ClickHouse/pull/7497) ([Amos pájaro](https://github.com/amosbird)) +- Use metainformación de almacenamiento para evaluar trivial `SELECT count() FROM table;` [\#7510](https://github.com/ClickHouse/ClickHouse/pull/7510) ([Amos pájaro](https://github.com/amosbird), [alexey-milovidov](https://github.com/alexey-milovidov)) +- Vectorizar el procesamiento `arrayReduce` similar a Aggregator `addBatch`. [\#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos pájaro](https://github.com/amosbird)) +- Mejoras menores en el rendimiento de `Kafka` consumo [\#7475](https://github.com/ClickHouse/ClickHouse/pull/7475) ([Ivan](https://github.com/abyss7)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement} + +- Agregue soporte para la compilación cruzada a la arquitectura de CPU AARCH64. Refactorizar la secuencia de comandos del empaquetador. [\#7370](https://github.com/ClickHouse/ClickHouse/pull/7370) [\#7539](https://github.com/ClickHouse/ClickHouse/pull/7539) ([Ivan](https://github.com/abyss7)) +- Desempaquete las cadenas de herramientas darwin-x86\_64 y linux-aarch64 en el volumen Docker montado al crear paquetes [\#7534](https://github.com/ClickHouse/ClickHouse/pull/7534) ([Ivan](https://github.com/abyss7)) +- Actualizar la imagen de Docker para Binary Packager [\#7474](https://github.com/ClickHouse/ClickHouse/pull/7474) ([Ivan](https://github.com/abyss7)) +- Se corrigieron errores de compilación en MacOS Catalina [\#7585](https://github.com/ClickHouse/ClickHouse/pull/7585) ([Ernest Poletaev](https://github.com/ernestp)) +- Algunas refactorizaciones en la lógica de análisis de consultas: dividir la clase compleja en varias simples. [\#7454](https://github.com/ClickHouse/ClickHouse/pull/7454) ([Artem Zuikov](https://github.com/4ertus2)) +- Reparar la compilación sin submódulos [\#7295](https://github.com/ClickHouse/ClickHouse/pull/7295) ([propulsor](https://github.com/proller)) +- Mejor `add_globs` en archivos CMake [\#7418](https://github.com/ClickHouse/ClickHouse/pull/7418) ([Amos pájaro](https://github.com/amosbird)) +- Eliminar rutas codificadas en `unwind` objetivo [\#7460](https://github.com/ClickHouse/ClickHouse/pull/7460) ([Konstantin Podshumok](https://github.com/podshumok)) +- Permitir usar el formato mysql sin ssl [\#7524](https://github.com/ClickHouse/ClickHouse/pull/7524) ([propulsor](https://github.com/proller)) + +#### Otro {#other} + +- Añadido gramática ANTLR4 para ClickHouse SQL dialecto [\#7595](https://github.com/ClickHouse/ClickHouse/issues/7595) [\#7596](https://github.com/ClickHouse/ClickHouse/pull/7596) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## ClickHouse de liberación de la v19.16 {#clickhouse-release-v19-16} + +#### Todos los derechos reservados. {#clickhouse-release-v19-16-14-65-2020-03-05} + +- Corregir la incompatibilidad de subconsultas distribuidas con versiones anteriores de CH. Fijar [\#7851](https://github.com/ClickHouse/ClickHouse/issues/7851) + [(tabplubix)](https://github.com/tavplubix) +- Al ejecutar `CREATE` consulta, doblar expresiones constantes en argumentos del motor de almacenamiento. Reemplace el nombre de la base de datos vacía con la base de datos actual. Fijar [\#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [\#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). También corrige la verificación de la dirección local en `ClickHouseDictionarySource`. + [\#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) +- Ahora el fondo se fusiona en `*MergeTree` familia de motores de mesa preservar el orden de volumen de políticas de almacenamiento con mayor precisión. + [\#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Evitar la pérdida de datos en `Kafka` en casos raros cuando la excepción ocurre después de leer el sufijo pero antes de confirmar. Fijar [\#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Relacionados: [\#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) + [\#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) +- Corregir un error que conduce a la terminación del servidor al intentar usar / soltar `Kafka` tabla creada con parámetros incorrectos. Fijar [\#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporar [\#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). + [\#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) +- Permitir usar `MaterializedView` con subconsultas anteriores `Kafka` tabla. + [\#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) + +#### Novedad {#new-feature-1} + +- Añadir `deduplicate_blocks_in_dependent_materialized_views` opción para controlar el comportamiento de las inserciones idempotentes en tablas con vistas materializadas. Esta nueva característica se agregó a la versión de corrección de errores mediante una solicitud especial de Altinity. + [\#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) + +### Lanzamiento de ClickHouse v19.16.2.2, 2019-10-30 {#clickhouse-release-v19-16-2-2-2019-10-30} + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-1} + +- Agregue la validación de arity faltante para count/counIf . + [\#7095](https://github.com/ClickHouse/ClickHouse/issues/7095) + [\#7298](https://github.com/ClickHouse/ClickHouse/pull/7298) ([Vdimir](https://github.com/Vdimir)) +- Eliminar heredado `asterisk_left_columns_only` configuración (que estaba deshabilitado por defecto). + [\#7335](https://github.com/ClickHouse/ClickHouse/pull/7335) ([Artem + Zuikov](https://github.com/4ertus2)) +- Las cadenas de formato para el formato de datos de la plantilla ahora se especifican en los archivos. + [\#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) + ([Tavplubix](https://github.com/tavplubix)) + +#### Novedad {#new-feature-2} + +- Introduzca uniqCombined64() para calcular la cardinalidad mayor que UINT\_MAX. + [\#7213](https://github.com/ClickHouse/ClickHouse/pull/7213), + [\#7222](https://github.com/ClickHouse/ClickHouse/pull/7222) ([Azat + Khuzhin](https://github.com/azat)) +- Admite índices de filtro Bloom en columnas de matriz. + [\#6984](https://github.com/ClickHouse/ClickHouse/pull/6984) + ([chimbab](https://github.com/achimbab)) +- Agregar una función `getMacro(name)` que devuelve String con el valor de `` + desde la configuración del servidor. [\#7240](https://github.com/ClickHouse/ClickHouse/pull/7240) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Establezca dos opciones de configuración para un diccionario basado en un origen HTTP: `credentials` y + `http-headers`. [\#7092](https://github.com/ClickHouse/ClickHouse/pull/7092) ([Guillaume + Tassery](https://github.com/YiuRULE)) +- Agregar un nuevo ProfileEvent `Merge` que cuenta el número de fusiones de fondo lanzadas. + [\#7093](https://github.com/ClickHouse/ClickHouse/pull/7093) ([Mijaíl + Korotov](https://github.com/millb)) +- Agregue la función fullHostName que devuelve un nombre de dominio completo. + [\#7263](https://github.com/ClickHouse/ClickHouse/issues/7263) + [\#7291](https://github.com/ClickHouse/ClickHouse/pull/7291) ([Sundyli](https://github.com/sundy-li)) +- Añadir función `arraySplit` y `arrayReverseSplit` que dividió una matriz por “cut off” + condición. Son útiles en el manejo de secuencias de tiempo. + [\#7294](https://github.com/ClickHouse/ClickHouse/pull/7294) ([Hcz](https://github.com/hczhcz)) +- Agregue nuevas funciones que devuelvan la matriz de todos los índices coincidentes en la familia de funciones multiMatch. + [\#7299](https://github.com/ClickHouse/ClickHouse/pull/7299) ([Danila + Kutenin](https://github.com/danlark1)) +- Agregar un nuevo motor de base de datos `Lazy` que está optimizado para almacenar un gran número de pequeños -Log + tabla. [\#7171](https://github.com/ClickHouse/ClickHouse/pull/7171) ([Nosotros + Vasilev](https://github.com/nikvas0)) +- Agregue funciones agregadas groupBitmapAnd, -Or, -Xor para columnas de mapa de bits. [\#7109](https://github.com/ClickHouse/ClickHouse/pull/7109) ([Zhichang + Yu](https://github.com/yuzhichang)) +- Agregue los combinadores de funciones agregadas -OrNull y -OrDefault , que devuelven null + o valores predeterminados cuando no hay nada que agregar. + [\#7331](https://github.com/ClickHouse/ClickHouse/pull/7331) + ([Hcz](https://github.com/hczhcz)) +- Introduzca el formato de datos CustomSeparated que admite el escape personalizado y + reglas delimitador. [\#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) + ([Tavplubix](https://github.com/tavplubix)) +- Soporte Redis como fuente de diccionario externo. [\#4361](https://github.com/ClickHouse/ClickHouse/pull/4361) [\#6962](https://github.com/ClickHouse/ClickHouse/pull/6962) ([comunodi](https://github.com/comunodi), [Anton + Popov](https://github.com/CurtizJ)) + +#### Corrección de errores {#bug-fix-2} + +- Repara el resultado de la consulta incorrecta si tiene `WHERE IN (SELECT ...)` sección y `optimize_read_in_order` ser + utilizar. [\#7371](https://github.com/ClickHouse/ClickHouse/pull/7371) ([Anton + Popov](https://github.com/CurtizJ)) +- Complemento de autenticación MariaDB deshabilitado, que depende de archivos fuera del proyecto. + [\#7140](https://github.com/ClickHouse/ClickHouse/pull/7140) ([Yuriy + Baranov](https://github.com/yurriy)) +- Solucionar excepción `Cannot convert column ... because it is constant but values of constants are different in source and result` que rara vez podría suceder cuando funciones `now()`, `today()`, + `yesterday()`, `randConstant()` se utilizan. + [\#7156](https://github.com/ClickHouse/ClickHouse/pull/7156) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Solucionado el problema de usar HTTP keep alive timeout en lugar de TCP keep alive timeout. + [\#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily + Nemkov](https://github.com/Enmk)) +- Se corrigió un error de segmentación en groupBitmapOr (problema [\#7109](https://github.com/ClickHouse/ClickHouse/issues/7109)). + [\#7289](https://github.com/ClickHouse/ClickHouse/pull/7289) ([Zhichang + Yu](https://github.com/yuzhichang)) +- Para las vistas materializadas, se llama a la confirmación para Kafka después de que se escribieron todos los datos. + [\#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) +- Corregido mal `duration_ms` valor en `system.part_log` tabla. Fue diez veces fuera. + [\#7172](https://github.com/ClickHouse/ClickHouse/pull/7172) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- Una solución rápida para resolver el bloqueo en la tabla LIVE VIEW y volver a habilitar todas las pruebas LIVE VIEW. + [\#7201](https://github.com/ClickHouse/ClickHouse/pull/7201) + ([vzakaznikov](https://github.com/vzakaznikov)) +- Serialice los valores NULL correctamente en los índices mínimos / máximos de las partes MergeTree. + [\#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alejandro + Kuzmenkov](https://github.com/akuzm)) +- No coloque columnas virtuales en .sql cuando la tabla se crea como `CREATE TABLE AS`. + [\#7183](https://github.com/ClickHouse/ClickHouse/pull/7183) ([Ivan](https://github.com/abyss7)) +- Fijar falla de segmentación en `ATTACH PART` consulta. + [\#7185](https://github.com/ClickHouse/ClickHouse/pull/7185) + ([alesapin](https://github.com/alesapin)) +- Corrija el resultado incorrecto para algunas consultas dadas por la optimización de las subconsultas IN vacías y vacías + INNER/RIGHT JOIN. [\#7284](https://github.com/ClickHouse/ClickHouse/pull/7284) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Reparación del error AddressSanitizer en el método LIVE VIEW getHeader (). + [\#7271](https://github.com/ClickHouse/ClickHouse/pull/7271) + ([vzakaznikov](https://github.com/vzakaznikov)) + +#### Mejora {#improvement-1} + +- Añadir un mensaje en caso de queue\_wait\_max\_ms espera se lleva a cabo. + [\#7390](https://github.com/ClickHouse/ClickHouse/pull/7390) ([Azat + Khuzhin](https://github.com/azat)) +- Ajuste hecho `s3_min_upload_part_size` a nivel de mesa. + [\#7059](https://github.com/ClickHouse/ClickHouse/pull/7059) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- Compruebe TTL en StorageFactory. [\#7304](https://github.com/ClickHouse/ClickHouse/pull/7304) + ([Sundyli](https://github.com/sundy-li)) +- Squash bloques de la izquierda en combinación de fusión parcial (optimización). + [\#7122](https://github.com/ClickHouse/ClickHouse/pull/7122) ([Artem + Zuikov](https://github.com/4ertus2)) +- No permita funciones no deterministas en mutaciones de motores de tabla replicados, porque esto + puede introducir inconsistencias entre réplicas. + [\#7247](https://github.com/ClickHouse/ClickHouse/pull/7247) ([Alejandro + Kazakov](https://github.com/Akazz)) +- Deshabilite el rastreador de memoria mientras convierte el seguimiento de la pila de excepciones en cadena. Puede prevenir la pérdida + de mensajes de error de tipo `Memory limit exceeded` en el servidor, lo que `Attempt to read after eof` excepción en el cliente. [\#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) + ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Mejoras de formato varios. Resolver + [\#6033](https://github.com/ClickHouse/ClickHouse/issues/6033), + [\#2633](https://github.com/ClickHouse/ClickHouse/issues/2633), + [\#6611](https://github.com/ClickHouse/ClickHouse/issues/6611), + [\#6742](https://github.com/ClickHouse/ClickHouse/issues/6742) + [\#7215](https://github.com/ClickHouse/ClickHouse/pull/7215) + ([Tavplubix](https://github.com/tavplubix)) +- ClickHouse ignora los valores en el lado derecho del operador IN que no son convertibles a la izquierda + side type. Make it work properly for compound types – Array and Tuple. + [\#7283](https://github.com/ClickHouse/ClickHouse/pull/7283) ([Alejandro + Kuzmenkov](https://github.com/akuzm)) +- Apoyar las desigualdades que faltan para ASOF JOIN. Es posible unir una variante menor o igual y estricta + mayores y menos variantes para la columna ASOF en la sintaxis ON. + [\#7282](https://github.com/ClickHouse/ClickHouse/pull/7282) ([Artem + Zuikov](https://github.com/4ertus2)) +- Optimizar la combinación de fusión parcial. [\#7070](https://github.com/ClickHouse/ClickHouse/pull/7070) + ([Artem Zuikov](https://github.com/4ertus2)) +- No utilice más de 98K de memoria en funciones uniqCombined. + [\#7236](https://github.com/ClickHouse/ClickHouse/pull/7236), + [\#7270](https://github.com/ClickHouse/ClickHouse/pull/7270) ([Azat + Khuzhin](https://github.com/azat)) +- Enjuague las partes de la tabla de unión de la derecha en el disco en PartialMergeJoin (si no hay suficiente + memoria). Cargue los datos cuando sea necesario. [\#7186](https://github.com/ClickHouse/ClickHouse/pull/7186) + ([Artem Zuikov](https://github.com/4ertus2)) + +#### Mejora del rendimiento {#performance-improvement-1} + +- Acelere joinGet con argumentos const evitando la duplicación de datos. + [\#7359](https://github.com/ClickHouse/ClickHouse/pull/7359) ([Amos + Ave](https://github.com/amosbird)) +- Regrese temprano si la subconsulta está vacía. + [\#7007](https://github.com/ClickHouse/ClickHouse/pull/7007) ([小路](https://github.com/nicelulu)) +- Optimizar el análisis de la expresión SQL en Valores. + [\#6781](https://github.com/ClickHouse/ClickHouse/pull/6781) + ([Tavplubix](https://github.com/tavplubix)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-1} + +- Deshabilite algunas contribuciones para la compilación cruzada en Mac OS. + [\#7101](https://github.com/ClickHouse/ClickHouse/pull/7101) ([Ivan](https://github.com/abyss7)) +- Agregue enlaces faltantes con PocoXML para clickhouse\_common\_io. + [\#7200](https://github.com/ClickHouse/ClickHouse/pull/7200) ([Azat + Khuzhin](https://github.com/azat)) +- Acepte varios argumentos de filtro de prueba en clickhouse-test. + [\#7226](https://github.com/ClickHouse/ClickHouse/pull/7226) ([Alejandro + Kuzmenkov](https://github.com/akuzm)) +- Habilitar musl y jemalloc para ARM. [\#7300](https://github.com/ClickHouse/ClickHouse/pull/7300) + ([Amos pájaro](https://github.com/amosbird)) +- Añadir `--client-option` parámetro para `clickhouse-test` para pasar parámetros adicionales al cliente. + [\#7277](https://github.com/ClickHouse/ClickHouse/pull/7277) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Conservar las configuraciones existentes en la actualización del paquete rpm. + [\#7103](https://github.com/ClickHouse/ClickHouse/pull/7103) + ([filimonov](https://github.com/filimonov)) +- Corregir errores detectados por PVS. [\#7153](https://github.com/ClickHouse/ClickHouse/pull/7153) ([Artem + Zuikov](https://github.com/4ertus2)) +- Corregir la compilación para Darwin. [\#7149](https://github.com/ClickHouse/ClickHouse/pull/7149) + ([Ivan](https://github.com/abyss7)) +- glibc 2.29 compatibilidad. [\#7142](https://github.com/ClickHouse/ClickHouse/pull/7142) ([Amos + Ave](https://github.com/amosbird)) +- Asegúrese de que dh\_clean no toque los archivos fuente potenciales. + [\#7205](https://github.com/ClickHouse/ClickHouse/pull/7205) ([Amos + Ave](https://github.com/amosbird)) +- Intente evitar conflictos al actualizar desde rpm de altinidad: tiene un archivo de configuración empaquetado por separado + en clickhouse-server-common. [\#7073](https://github.com/ClickHouse/ClickHouse/pull/7073) + ([filimonov](https://github.com/filimonov)) +- Optimice algunos archivos de encabezado para reconstrucciones más rápidas. + [\#7212](https://github.com/ClickHouse/ClickHouse/pull/7212), + [\#7231](https://github.com/ClickHouse/ClickHouse/pull/7231) ([Alejandro + Kuzmenkov](https://github.com/akuzm)) +- Agregue pruebas de rendimiento para Date y DateTime. [\#7332](https://github.com/ClickHouse/ClickHouse/pull/7332) ([Vasily + Nemkov](https://github.com/Enmk)) +- Corregir algunas pruebas que contenían mutaciones no deterministas. + [\#7132](https://github.com/ClickHouse/ClickHouse/pull/7132) ([Alejandro + Kazakov](https://github.com/Akazz)) +- Agregue compilación con MemorySanitizer a CI. [\#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) + ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Evite el uso de valores no inicializados en MetricsTransmitter. + [\#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat + Khuzhin](https://github.com/azat)) +- Solucionar algunos problemas en los campos encontrados por MemorySanitizer. + [\#7135](https://github.com/ClickHouse/ClickHouse/pull/7135), + [\#7179](https://github.com/ClickHouse/ClickHouse/pull/7179) ([Alejandro + Kuzmenkov](https://github.com/akuzm)), [\#7376](https://github.com/ClickHouse/ClickHouse/pull/7376) + ([Amos pájaro](https://github.com/amosbird)) +- Corrige el comportamiento indefinido en murmurhash32. [\#7388](https://github.com/ClickHouse/ClickHouse/pull/7388) ([Amos + Ave](https://github.com/amosbird)) +- Corrige el comportamiento indefinido en StoragesInfoStream. [\#7384](https://github.com/ClickHouse/ClickHouse/pull/7384) + ([Tavplubix](https://github.com/tavplubix)) +- Se corrigieron expresiones constantes plegables para motores de bases de datos externas (MySQL, ODBC, JDBC). En anteriores + versiones no funcionaba para múltiples expresiones constantes y no funcionaba en absoluto para Date, + DateTime y UUID. Esto corrige [\#7245](https://github.com/ClickHouse/ClickHouse/issues/7245) + [\#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reparación del error de carrera de datos ThreadSanitizer en LIVE VIEW al acceder a la variable no\_users\_thread. + [\#7353](https://github.com/ClickHouse/ClickHouse/pull/7353) + ([vzakaznikov](https://github.com/vzakaznikov)) +- Deshacerse de los símbolos malloc en libcommon + [\#7134](https://github.com/ClickHouse/ClickHouse/pull/7134), + [\#7065](https://github.com/ClickHouse/ClickHouse/pull/7065) ([Amos + Ave](https://github.com/amosbird)) +- Agregue el indicador global ENABLE\_LIBRARIES para deshabilitar todas las bibliotecas. + [\#7063](https://github.com/ClickHouse/ClickHouse/pull/7063) + ([propulsor](https://github.com/proller)) + +#### Limpieza de código {#code-cleanup} + +- Generalice el repositorio de configuración para prepararse para DDL para diccionarios. [\#7155](https://github.com/ClickHouse/ClickHouse/pull/7155) + ([alesapin](https://github.com/alesapin)) +- Analizador de diccionarios DDL sin ninguna semántica. + [\#7209](https://github.com/ClickHouse/ClickHouse/pull/7209) + ([alesapin](https://github.com/alesapin)) +- Divida ParserCreateQuery en diferentes analizadores más pequeños. + [\#7253](https://github.com/ClickHouse/ClickHouse/pull/7253) + ([alesapin](https://github.com/alesapin)) +- Pequeña refactorización y cambio de nombre cerca de diccionarios externos. + [\#7111](https://github.com/ClickHouse/ClickHouse/pull/7111) + ([alesapin](https://github.com/alesapin)) +- Refactorizar el código para prepararse para el papel de control de acceso basado. [\#7235](https://github.com/ClickHouse/ClickHouse/pull/7235) ([Vitaly + Baranov](https://github.com/vitlibar)) +- Algunas mejoras en el código DatabaseOrdinary. + [\#7086](https://github.com/ClickHouse/ClickHouse/pull/7086) ([Nosotros + Vasilev](https://github.com/nikvas0)) +- No use iteradores en los métodos find() y emplace() de tablas hash. + [\#7026](https://github.com/ClickHouse/ClickHouse/pull/7026) ([Alejandro + Kuzmenkov](https://github.com/akuzm)) +- Repare getMultipleValuesFromConfig en caso de que la raíz del parámetro no esté vacía. [\#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) + ([Mikhail Korotov](https://github.com/millb)) +- Eliminar algunos copiar y pegar (TemporaryFile y TemporaryFileStream) + [\#7166](https://github.com/ClickHouse/ClickHouse/pull/7166) ([Artem + Zuikov](https://github.com/4ertus2)) +- Mejora de la legibilidad del código un poco (`MergeTreeData::getActiveContainingPart`). + [\#7361](https://github.com/ClickHouse/ClickHouse/pull/7361) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- Espere a que todos los trabajos programados, que utilizan objetos locales, si `ThreadPool::schedule(...)` lanzar + salvedad. Cambiar nombre `ThreadPool::schedule(...)` a `ThreadPool::scheduleOrThrowOnError(...)` y + corregir los comentarios para hacer obvio que puede lanzar. + [\#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) + ([Tavplubix](https://github.com/tavplubix)) + +## Lanzamiento de ClickHouse 19.15 {#clickhouse-release-19-15} + +### Lanzamiento de ClickHouse 19.15.4.10, 31.10.2019 {#clickhouse-release-19-15-4-10-2019-10-31} + +#### Corrección de errores {#bug-fix-3} + +- Se agregó el manejo de SQL\_TINYINT y SQL\_BIGINT, y el manejo de correcciones de los tipos de origen de datos SQL\_FLOAT en ODBC Bridge. + [\#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) +- Se permite tener algunas partes en el disco de destino o el volumen en MOVE PARTITION. + [\#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Se corrigieron valores NULL en columnas anulables a través del puente ODBC. + [\#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) +- Se corrigió INSERT en el nodo distribuido no local con columnas MATERIALIZED. + [\#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) +- Función fija getMultipleValuesFromConfig. + [\#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) ([Mikhail Korotov](https://github.com/millb)) +- Solucionado el problema de usar HTTP keep alive timeout en lugar de TCP keep alive timeout. + [\#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily Nemkov](https://github.com/Enmk)) +- Espere a que todos los trabajos finalicen con excepción (corrige fallas raras). + [\#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) ([Tavplubix](https://github.com/tavplubix)) +- No presione a MVs cuando inserte en la tabla Kafka. + [\#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) +- Deshabilitar el rastreador de memoria para la pila de excepciones. + [\#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Se corrigió el código incorrecto en la transformación de la consulta para la base de datos externa. + [\#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evite el uso de valores no inicializados en MetricsTransmitter. + [\#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat Khuzhin](https://github.com/azat)) +- Se agregó configuración de ejemplo con macros para pruebas ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.15.3.6, 2019-10-09 {#clickhouse-release-19-15-3-6-2019-10-09} + +#### Corrección de errores {#bug-fix-4} + +- Se corrigió bad\_variant en el diccionario hash. + ([alesapin](https://github.com/alesapin)) +- Se corrigió un error con un error de segmentación en la consulta ATTACH PART. + ([alesapin](https://github.com/alesapin)) +- Cálculo de tiempo fijo en `MergeTreeData`. + ([Vladimir Chebotarev](https://github.com/excitoon)) +- Comprometerse con Kafka explícitamente después de finalizar la escritura. + [\#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) +- Serialice los valores NULL correctamente en los índices mínimos / máximos de las partes MergeTree. + [\#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alejandro Kuzmenkov](https://github.com/akuzm)) + +### Lanzamiento de ClickHouse 19.15.2.2, 2019-10-01 {#clickhouse-release-19-15-2-2-2019-10-01} + +#### Novedad {#new-feature-3} + +- Almacenamiento por niveles: admite el uso de múltiples volúmenes de almacenamiento para tablas con el motor MergeTree. Es posible almacenar datos nuevos en SSD y mover automáticamente datos antiguos a HDD. ([ejemplo](https://clickhouse.github.io/clickhouse-presentations/meetup30/new_features/#12)). [\#4918](https://github.com/ClickHouse/ClickHouse/pull/4918) ([Igr](https://github.com/ObjatieGroba)) [\#6489](https://github.com/ClickHouse/ClickHouse/pull/6489) ([alesapin](https://github.com/alesapin)) +- Agregar función de tabla `input` para leer los datos entrantes en `INSERT SELECT` consulta. [\#5450](https://github.com/ClickHouse/ClickHouse/pull/5450) ([Palasonic1](https://github.com/palasonic1)) [\#6832](https://github.com/ClickHouse/ClickHouse/pull/6832) ([Anton Popov](https://github.com/CurtizJ)) +- Añadir un `sparse_hashed` diccionario, que es funcionalmente equivalente al `hashed` diseño, pero es más eficiente en la memoria. Utiliza aproximadamente el doble de menos memoria a costa de una recuperación de valor más lenta. [\#6894](https://github.com/ClickHouse/ClickHouse/pull/6894) ([Azat Khuzhin](https://github.com/azat)) +- Implementar la capacidad de definir la lista de usuarios para el acceso a los diccionarios. Sólo la base de datos conectada actual utilizando. [\#6907](https://github.com/ClickHouse/ClickHouse/pull/6907) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Añadir `LIMIT` opción para `SHOW` consulta. [\#6944](https://github.com/ClickHouse/ClickHouse/pull/6944) ([Filipina Malkovsky](https://github.com/malkfilipp)) +- Añadir `bitmapSubsetLimit(bitmap, range_start, limit)` función, que devuelve subconjunto de la más pequeña `limit` valores en el conjunto que no es menor que `range_start`. [\#6957](https://github.com/ClickHouse/ClickHouse/pull/6957) ([Zhichang Yu](https://github.com/yuzhichang)) +- Añadir `bitmapMin` y `bitmapMax` función. [\#6970](https://github.com/ClickHouse/ClickHouse/pull/6970) ([Zhichang Yu](https://github.com/yuzhichang)) +- Añadir función `repeat` relacionado con [Información detallada](https://github.com/ClickHouse/ClickHouse/issues/6648) [\#6999](https://github.com/ClickHouse/ClickHouse/pull/6999) ([Más información](https://github.com/ucasFL)) + +#### Característica Experimental {#experimental-feature-1} + +- Implementar (en memoria) Combinar unir variante que no cambia la canalización actual. El resultado está parcialmente ordenado por clave de combinación. Establecer `partial_merge_join = 1` para usar esta función. La combinación de combinación todavía está en desarrollo. [\#6940](https://github.com/ClickHouse/ClickHouse/pull/6940) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir `S3` función del motor y de la tabla. Todavía está en desarrollo (todavía no hay soporte de autenticación). [\#5596](https://github.com/ClickHouse/ClickHouse/pull/5596) ([Vladimir Chebotarev](https://github.com/excitoon)) + +#### Mejora {#improvement-2} + +- Cada mensaje leído de Kafka se inserta atómicamente. Esto resuelve casi todos los problemas conocidos con el motor Kafka. [\#6950](https://github.com/ClickHouse/ClickHouse/pull/6950) ([Ivan](https://github.com/abyss7)) +- Mejoras para la conmutación por error de consultas distribuidas. Acortar el tiempo de recuperación, también ahora es configurable y se puede ver en `system.clusters`. [\#6399](https://github.com/ClickHouse/ClickHouse/pull/6399) ([Vasily Nemkov](https://github.com/Enmk)) +- Soporta valores numéricos para enumeraciones directamente en `IN` apartado. \#6766 [\#6941](https://github.com/ClickHouse/ClickHouse/pull/6941) ([Dimarub2000](https://github.com/dimarub2000)) +- El soporte (opcional, deshabilitado de forma predeterminada) redirige el almacenamiento de URL. [\#6914](https://github.com/ClickHouse/ClickHouse/pull/6914) ([Más información](https://github.com/maqroll)) +- Agregue un mensaje de información cuando el cliente con una versión anterior se conecte a un servidor. [\#6893](https://github.com/ClickHouse/ClickHouse/pull/6893) ([Filipina Malkovsky](https://github.com/malkfilipp)) +- Eliminar el límite máximo de tiempo de suspensión de interrupción para el envío de datos en tablas distribuidas [\#6895](https://github.com/ClickHouse/ClickHouse/pull/6895) ([Azat Khuzhin](https://github.com/azat)) +- Agregue la capacidad de enviar eventos de perfil (contadores) con valores acumulativos al grafito. Se puede habilitar bajo `` en el servidor `config.xml`. [\#6969](https://github.com/ClickHouse/ClickHouse/pull/6969) ([Azat Khuzhin](https://github.com/azat)) +- Añadir tipo de fundición automática `T` a `LowCardinality(T)` mientras inserta datos en la columna de tipo `LowCardinality(T)` en formato nativo a través de HTTP. [\#6891](https://github.com/ClickHouse/ClickHouse/pull/6891) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Añadir la capacidad de utilizar la función `hex` sin usar `reinterpretAsString` para `Float32`, `Float64`. [\#7024](https://github.com/ClickHouse/ClickHouse/pull/7024) ([Mikhail Korotov](https://github.com/millb)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-2} + +- Agregue gdb-index al binario de clickhouse con información de depuración. Acelerará el tiempo de inicio de `gdb`. [\#6947](https://github.com/ClickHouse/ClickHouse/pull/6947) ([alesapin](https://github.com/alesapin)) +- Acelerar el embalaje deb con parcheado dpkg-deb que utiliza `pigz`. [\#6960](https://github.com/ClickHouse/ClickHouse/pull/6960) ([alesapin](https://github.com/alesapin)) +- Establecer `enable_fuzzing = 1` para habilitar la instrumentación libfuzzer de todo el código del proyecto. [\#7042](https://github.com/ClickHouse/ClickHouse/pull/7042) ([kyprizel](https://github.com/kyprizel)) +- Añadir prueba de humo de construcción dividida en CI. [\#7061](https://github.com/ClickHouse/ClickHouse/pull/7061) ([alesapin](https://github.com/alesapin)) +- Agregue compilación con MemorySanitizer a CI. [\#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Reemplazar `libsparsehash` con `sparsehash-c11` [\#6965](https://github.com/ClickHouse/ClickHouse/pull/6965) ([Azat Khuzhin](https://github.com/azat)) + +#### Corrección de errores {#bug-fix-5} + +- Se corrigió la degradación del rendimiento del análisis de índices en claves complejas en tablas grandes. Esto corrige \#6924. [\#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir el error lógico que causa segfaults al seleccionar el tema vacío de Kafka. [\#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) +- Arreglar la conexión MySQL demasiado pronto cerca `MySQLBlockInputStream.cpp`. [\#6882](https://github.com/ClickHouse/ClickHouse/pull/6882) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Soporte devuelto para núcleos Linux muy antiguos (solución [\#6841](https://github.com/ClickHouse/ClickHouse/issues/6841)) [\#6853](https://github.com/ClickHouse/ClickHouse/pull/6853) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Solucionar la posible pérdida de datos en `insert select` consulta en caso de bloque vacío en el flujo de entrada. \#6834 \#6862 [\#6911](https://github.com/ClickHouse/ClickHouse/pull/6911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Solución para la función `АrrayEnumerateUniqRanked` con matrices vacías en params [\#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([propulsor](https://github.com/proller)) +- Solucione consultas complejas con combinaciones de matriz y subconsultas globales. [\#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) +- Fijar `Unknown identifier` error en ORDER BY y GROUP BY con múltiples JOINs [\#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijo `MSan` advertencia al ejecutar la función con `LowCardinality` argumento. [\#7062](https://github.com/ClickHouse/ClickHouse/pull/7062) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-2} + +- Se ha cambiado el formato de serialización de los estados de la función agregada de mapa de bits \* para mejorar el rendimiento. No se pueden leer los estados serializados de bitmap\* de versiones anteriores. [\#6908](https://github.com/ClickHouse/ClickHouse/pull/6908) ([Zhichang Yu](https://github.com/yuzhichang)) + +## Lanzamiento de ClickHouse 19.14 {#clickhouse-release-19-14} + +### Lanzamiento de ClickHouse 19.14.7.15, 2019-10-02 {#clickhouse-release-19-14-7-15-2019-10-02} + +#### Corrección de errores {#bug-fix-6} + +- Esta versión también contiene todas las correcciones de errores de 19.11.12.69. +- Compatibilidad fija para consultas distribuidas entre 19.14 y versiones anteriores. Esto corrige [\#7068](https://github.com/ClickHouse/ClickHouse/issues/7068). [\#7069](https://github.com/ClickHouse/ClickHouse/pull/7069) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.14.6.12, 2019-09-19 {#clickhouse-release-19-14-6-12-2019-09-19} + +#### Corrección de errores {#bug-fix-7} + +- Solución para la función `АrrayEnumerateUniqRanked` con matrices vacías en params. [\#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([propulsor](https://github.com/proller)) +- Nombre de subconsulta fijo en consultas con `ARRAY JOIN` y `GLOBAL IN subquery` con alias. Utilice el alias de subconsulta para el nombre de tabla externo si se especifica. [\#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-3} + +- Fijar [aleteo](https://clickhouse-test-reports.s3.yandex.net/6944/aab95fd5175a513413c7395a73a82044bdafb906/functional_stateless_tests_(debug).html) prueba `00715_fetch_merged_or_mutated_part_zookeeper` reescribiéndolo en scripts de shell porque necesita esperar a que se apliquen las mutaciones. [\#6977](https://github.com/ClickHouse/ClickHouse/pull/6977) ([Alejandro Kazakov](https://github.com/Akazz)) +- Fijo UBSan y MemSan fallo en la función `groupUniqArray` con el argumento de matriz emtpy. Fue causado por la colocación de vacío `PaddedPODArray` en la celda cero de la tabla hash porque no se llamó al constructor para el valor de la celda cero. [\#6937](https://github.com/ClickHouse/ClickHouse/pull/6937) ([Amos pájaro](https://github.com/amosbird)) + +### Lanzamiento de ClickHouse 19.14.3.3, 2019-09-10 {#clickhouse-release-19-14-3-3-2019-09-10} + +#### Novedad {#new-feature-4} + +- `WITH FILL` modificador para `ORDER BY`. (continuación de [\#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [\#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) +- `WITH TIES` modificador para `LIMIT`. (continuación de [\#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [\#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) +- Analizar unquoted `NULL` literal como NULL (si establece `format_csv_unquoted_null_literal_as_null=1`). Inicialice los campos nulos con valores predeterminados si el tipo de datos de este campo no se puede anular (si `input_format_null_as_default=1`). [\#5990](https://github.com/ClickHouse/ClickHouse/issues/5990) [\#6055](https://github.com/ClickHouse/ClickHouse/pull/6055) ([Tavplubix](https://github.com/tavplubix)) +- Soporte para comodines en rutas de funciones de tabla `file` y `hdfs`. Si la ruta contiene comodines, la tabla será de solo lectura. Ejemplo de uso: `select * from hdfs('hdfs://hdfs1:9000/some_dir/another_dir/*/file{0..9}{0..9}')` y `select * from file('some_dir/{some_file,another_file,yet_another}.tsv', 'TSV', 'value UInt32')`. [\#6092](https://github.com/ClickHouse/ClickHouse/pull/6092) ([Olga Khvostikova](https://github.com/stavrolia)) +- Nuevo `system.metric_log` tabla que almacena los valores de `system.events` y `system.metrics` con el intervalo de tiempo especificado. [\#6363](https://github.com/ClickHouse/ClickHouse/issues/6363) [\#6467](https://github.com/ClickHouse/ClickHouse/pull/6467) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [\#6530](https://github.com/ClickHouse/ClickHouse/pull/6530) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Permitir escribir registros de texto de ClickHouse en `system.text_log` tabla. [\#6037](https://github.com/ClickHouse/ClickHouse/issues/6037) [\#6103](https://github.com/ClickHouse/ClickHouse/pull/6103) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [\#6164](https://github.com/ClickHouse/ClickHouse/pull/6164) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mostrar símbolos privados en trazas de pila (esto se hace mediante el análisis de tablas de símbolos de archivos ELF). Se agregó información sobre el archivo y el número de línea en los seguimientos de la pila si la información de depuración está presente. Búsqueda de nombre de símbolo de aceleración con símbolos de indexación presentes en el programa. Se agregaron nuevas funciones SQL para la introspección: `demangle` y `addressToLine`. Función renombrada `symbolizeAddress` a `addressToSymbol` para la consistencia. Función `addressToSymbol` devolverá el nombre destrozado por razones de rendimiento y debe aplicar `demangle`. Añadido `allow_introspection_functions` que está desactivado por defecto. [\#6201](https://github.com/ClickHouse/ClickHouse/pull/6201) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Función de la tabla `values` (el nombre no distingue entre mayúsculas y minúsculas). Permite leer de `VALUES` lista propuesta en [\#5984](https://github.com/ClickHouse/ClickHouse/issues/5984). Ejemplo: `SELECT * FROM VALUES('a UInt64, s String', (1, 'one'), (2, 'two'), (3, 'three'))`. [\#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [\#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([Dimarub2000](https://github.com/dimarub2000)) +- Se agregó la capacidad de alterar la configuración de almacenamiento. Sintaxis: `ALTER TABLE
MODIFY SETTING = `. [\#6366](https://github.com/ClickHouse/ClickHouse/pull/6366) [\#6669](https://github.com/ClickHouse/ClickHouse/pull/6669) [\#6685](https://github.com/ClickHouse/ClickHouse/pull/6685) ([alesapin](https://github.com/alesapin)) +- Soporte para la eliminación de piezas separadas. Sintaxis: `ALTER TABLE DROP DETACHED PART ''`. [\#6158](https://github.com/ClickHouse/ClickHouse/pull/6158) ([Tavplubix](https://github.com/tavplubix)) +- Restricciones de tabla. Permite agregar restricciones a la definición de la tabla que se verificará en la inserción. [\#5273](https://github.com/ClickHouse/ClickHouse/pull/5273) ([Gleb Novikov](https://github.com/NanoBjorn)) [\#6652](https://github.com/ClickHouse/ClickHouse/pull/6652) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Soporte para vistas materializadas en cascada. [\#6324](https://github.com/ClickHouse/ClickHouse/pull/6324) ([Amos pájaro](https://github.com/amosbird)) +- Active el generador de perfiles de consulta de forma predeterminada para muestrear cada subproceso de ejecución de consultas una vez por segundo. [\#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Formato de entrada `ORC`. [\#6454](https://github.com/ClickHouse/ClickHouse/pull/6454) [\#6703](https://github.com/ClickHouse/ClickHouse/pull/6703) ([akonyaev90](https://github.com/akonyaev90)) +- Se agregaron dos nuevas funciones: `sigmoid` y `tanh` (que son útiles para aplicaciones de aprendizaje automático). [\#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Función `hasToken(haystack, token)`, `hasTokenCaseInsensitive(haystack, token)` para verificar si el token dado está en pajar. Token es una subcadena de longitud máxima entre dos caracteres ASCII no alfanuméricos (o límites de pajar). Token debe ser una cadena constante. Apoyado por la especialización de índice tokenbf\_v1. [\#6596](https://github.com/ClickHouse/ClickHouse/pull/6596), [\#6662](https://github.com/ClickHouse/ClickHouse/pull/6662) ([Vasily Nemkov](https://github.com/Enmk)) +- Nueva función `neighbor(value, offset[, default_value])`. Permite alcanzar el valor prev / next dentro de la columna en un bloque de datos. [\#5925](https://github.com/ClickHouse/ClickHouse/pull/5925) ([Acerca de Nosotros](https://github.com/alex-krash)) [6685365ab8c5b74f9650492c88a012596eb1b0c6](https://github.com/ClickHouse/ClickHouse/commit/6685365ab8c5b74f9650492c88a012596eb1b0c6) [341e2e4587a18065c2da1ca888c73389f48ce36c](https://github.com/ClickHouse/ClickHouse/commit/341e2e4587a18065c2da1ca888c73389f48ce36c) [Alexey Milovidov](https://github.com/alexey-milovidov) +- Creó una función `currentUser()`, devolver el inicio de sesión del usuario autorizado. Alias agregado `user()` por compatibilidad con MySQL. [\#6470](https://github.com/ClickHouse/ClickHouse/pull/6470) ([Acerca de Nosotros](https://github.com/alex-krash)) +- Nuevas funciones agregadas `quantilesExactInclusive` y `quantilesExactExclusive` que fueron propuestos en [\#5885](https://github.com/ClickHouse/ClickHouse/issues/5885). [\#6477](https://github.com/ClickHouse/ClickHouse/pull/6477) ([Dimarub2000](https://github.com/dimarub2000)) +- Función `bitmapRange(bitmap, range_begin, range_end)` que devuelve un nuevo conjunto con el rango especificado (no incluye el `range_end`). [\#6314](https://github.com/ClickHouse/ClickHouse/pull/6314) ([Zhichang Yu](https://github.com/yuzhichang)) +- Función `geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)` que crea una matriz de cadenas de precisión de cajas geohash que cubren el área proporcionada. [\#6127](https://github.com/ClickHouse/ClickHouse/pull/6127) ([Vasily Nemkov](https://github.com/Enmk)) +- Implementar soporte para la consulta INSERT con `Kafka` tabla. [\#6012](https://github.com/ClickHouse/ClickHouse/pull/6012) ([Ivan](https://github.com/abyss7)) +- Añadido soporte para `_partition` y `_timestamp` columnas virtuales al motor Kafka. [\#6400](https://github.com/ClickHouse/ClickHouse/pull/6400) ([Ivan](https://github.com/abyss7)) +- Posibilidad de eliminar datos confidenciales de `query_log`, registros del servidor, lista de procesos con reglas basadas en expresiones regulares. [\#5710](https://github.com/ClickHouse/ClickHouse/pull/5710) ([filimonov](https://github.com/filimonov)) + +#### Característica Experimental {#experimental-feature-2} + +- Formato de datos de entrada y salida `Template`. Permite especificar cadena de formato personalizado para entrada y salida. [\#4354](https://github.com/ClickHouse/ClickHouse/issues/4354) [\#6727](https://github.com/ClickHouse/ClickHouse/pull/6727) ([Tavplubix](https://github.com/tavplubix)) +- Implementación de `LIVE VIEW` tablas que se propusieron originalmente en [\#2898](https://github.com/ClickHouse/ClickHouse/pull/2898) elaborado en [\#3925](https://github.com/ClickHouse/ClickHouse/issues/3925), y luego actualizado en [\#5541](https://github.com/ClickHouse/ClickHouse/issues/5541). Ver [\#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) para una descripción detallada. [\#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) ([vzakaznikov](https://github.com/vzakaznikov)) [\#6425](https://github.com/ClickHouse/ClickHouse/pull/6425) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [\#6656](https://github.com/ClickHouse/ClickHouse/pull/6656) ([vzakaznikov](https://github.com/vzakaznikov)) Tenga en cuenta que `LIVE VIEW` característica puede ser eliminado en las próximas versiones. + +#### Corrección de errores {#bug-fix-8} + +- Esta versión también contiene todas las correcciones de errores de 19.13 y 19.11. +- Corregir la falla de segmentación cuando la tabla tiene índices de omisión y se produce una fusión vertical. [\#6723](https://github.com/ClickHouse/ClickHouse/pull/6723) ([alesapin](https://github.com/alesapin)) +- Corregir TTL por columna con valores predeterminados de columna no triviales. Anteriormente en caso de fuerza TTL se fusionan con `OPTIMIZE ... FINAL` consulta, los valores caducados se reemplazaron por valores predeterminados de tipo en lugar de valores predeterminados de columna especificados por el usuario. [\#6796](https://github.com/ClickHouse/ClickHouse/pull/6796) ([Anton Popov](https://github.com/CurtizJ)) +- Solucione el problema de duplicación de mensajes de Kafka en el reinicio normal del servidor. [\#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) +- Se corrigió un bucle infinito al leer mensajes de Kafka. No pausar / reanudar el consumidor en la suscripción en absoluto; de lo contrario, puede pausarse indefinidamente en algunos escenarios. [\#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([Ivan](https://github.com/abyss7)) +- Fijar `Key expression contains comparison between inconvertible types` excepción en `bitmapContains` función. [\#6136](https://github.com/ClickHouse/ClickHouse/issues/6136) [\#6146](https://github.com/ClickHouse/ClickHouse/issues/6146) [\#6156](https://github.com/ClickHouse/ClickHouse/pull/6156) ([Dimarub2000](https://github.com/dimarub2000)) +- Reparar segfault con habilitado `optimize_skip_unused_shards` y falta la clave de fragmentación. [\#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([Anton Popov](https://github.com/CurtizJ)) +- Se corrigió el código incorrecto en las mutaciones que pueden conducir a la corrupción de la memoria. segfault fijo con lectura de la dirección `0x14c0` que puede happed debido a concurrente `DROP TABLE` y `SELECT` de `system.parts` o `system.parts_columns`. Condición de carrera fija en la preparación de consultas de mutación. Estancamiento fijo causado por `OPTIMIZE` de tablas replicadas y operaciones de modificación simultáneas como ALTERs. [\#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se eliminó el registro detallado adicional en la interfaz MySQL [\#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Devuelve la capacidad de analizar la configuración booleana de ‘true’ y ‘false’ en el archivo de configuración. [\#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) +- Fix crash en `quantile` y `median` función sobre `Nullable(Decimal128)`. [\#6378](https://github.com/ClickHouse/ClickHouse/pull/6378) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió el posible resultado incompleto devuelto por `SELECT` consulta con `WHERE` condición en la clave principal contenía conversión a tipo flotante. Fue causado por una comprobación incorrecta de la monotonía en `toFloat` función. [\#6248](https://github.com/ClickHouse/ClickHouse/issues/6248) [\#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([Dimarub2000](https://github.com/dimarub2000)) +- Comprobar `max_expanded_ast_elements` establecimiento de mutaciones. Mutaciones claras después de `TRUNCATE TABLE`. [\#6205](https://github.com/ClickHouse/ClickHouse/pull/6205) ([Invierno Zhang](https://github.com/zhang2014)) +- Repare los resultados de JOIN para las columnas clave cuando se usa con `join_use_nulls`. Adjunte valores nulos en lugar de valores predeterminados de columnas. [\#6249](https://github.com/ClickHouse/ClickHouse/pull/6249) ([Artem Zuikov](https://github.com/4ertus2)) +- Solución para índices de salto con combinación vertical y alteración. Solución para `Bad size of marks file` salvedad. [\#6594](https://github.com/ClickHouse/ClickHouse/issues/6594) [\#6713](https://github.com/ClickHouse/ClickHouse/pull/6713) ([alesapin](https://github.com/alesapin)) +- Arreglar accidente raro en `ALTER MODIFY COLUMN` y fusión vertical cuando una de las partes fusionadas / alteradas está vacía (0 filas) [\#6746](https://github.com/ClickHouse/ClickHouse/issues/6746) [\#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) +- Corregido error en la conversión de `LowCardinality` tipos en `AggregateFunctionFactory`. Esto corrige [\#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [\#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir el comportamiento incorrecto y posibles fallas en `topK` y `topKWeighted` funciones agregadas. [\#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([Anton Popov](https://github.com/CurtizJ)) +- Código inseguro fijo alrededor `getIdentifier` función. [\#6401](https://github.com/ClickHouse/ClickHouse/issues/6401) [\#6409](https://github.com/ClickHouse/ClickHouse/pull/6409) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió un error en el protocolo de cable MySQL (se usa mientras se conecta al cliente MySQL de ClickHouse). Causado por el desbordamiento del búfer de pila en `PacketPayloadWriteBuffer`. [\#6212](https://github.com/ClickHouse/ClickHouse/pull/6212) ([Yuriy Baranov](https://github.com/yurriy)) +- Pérdida de memoria fija en `bitmapSubsetInRange` función. [\#6819](https://github.com/ClickHouse/ClickHouse/pull/6819) ([Zhichang Yu](https://github.com/yuzhichang)) +- Corregir un error raro cuando la mutación se ejecuta después del cambio de granularidad. [\#6816](https://github.com/ClickHouse/ClickHouse/pull/6816) ([alesapin](https://github.com/alesapin)) +- Permitir mensaje protobuf con todos los campos de forma predeterminada. [\#6132](https://github.com/ClickHouse/ClickHouse/pull/6132) ([Vitaly Baranov](https://github.com/vitlibar)) +- Resolver un error con `nullIf` función cuando enviamos un `NULL` en el segundo argumento. [\#6446](https://github.com/ClickHouse/ClickHouse/pull/6446) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Corregir un error raro con la asignación / desasignación de memoria incorrecta en diccionarios complejos de caché de claves con campos de cadena que conduce a un consumo infinito de memoria (parece una pérdida de memoria). El error se reproduce cuando el tamaño de la cadena era una potencia de dos a partir de ocho (8, 16, 32, etc.). [\#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) +- Se corrigió la codificación Gorilla en pequeñas secuencias que causaron una excepción `Cannot write after end of buffer`. [\#6398](https://github.com/ClickHouse/ClickHouse/issues/6398) [\#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Vasily Nemkov](https://github.com/Enmk)) +- Permitir el uso de tipos no anulables en JOINs con `join_use_nulls` permitir. [\#6705](https://github.com/ClickHouse/ClickHouse/pull/6705) ([Artem Zuikov](https://github.com/4ertus2)) +- Desactivar `Poco::AbstractConfiguration` sustituciones en consulta en `clickhouse-client`. [\#6706](https://github.com/ClickHouse/ClickHouse/pull/6706) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evitar el punto muerto en `REPLACE PARTITION`. [\#6677](https://github.com/ClickHouse/ClickHouse/pull/6677) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Utilizar `arrayReduce` para argumentos constantes puede conducir a segfault. [\#6242](https://github.com/ClickHouse/ClickHouse/issues/6242) [\#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir partes inconsistentes que pueden aparecer si la réplica se restauró después de `DROP PARTITION`. [\#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [\#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([Tavplubix](https://github.com/tavplubix)) +- Cuelgue fijo adentro `JSONExtractRaw` función. [\#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [\#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir un error con la serialización y agregación de índices de omisión incorrectos con granularidad adaptativa. [\#6594](https://github.com/ClickHouse/ClickHouse/issues/6594). [\#6748](https://github.com/ClickHouse/ClickHouse/pull/6748) ([alesapin](https://github.com/alesapin)) +- Fijar `WITH ROLLUP` y `WITH CUBE` modificadores de `GROUP BY` con agregación de dos niveles. [\#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) +- Corregir un error al escribir marcas de índices secundarios con granularidad adaptativa. [\#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) +- Corregir el orden de inicialización durante el inicio del servidor. Ya `StorageMergeTree::background_task_handle` se inicializa en `startup()` el `MergeTreeBlockOutputStream::write()` puede intentar usarlo antes de la inicialización. Solo verifique si está inicializado. [\#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) +- Borrar el búfer de datos de la operación de lectura anterior que se completó con un error. [\#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/bopohaa)) +- Se corrigió un error al habilitar la granularidad adaptativa al crear una nueva réplica para la tabla Replicated\*MergeTree. [\#6394](https://github.com/ClickHouse/ClickHouse/issues/6394) [\#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) +- Se corrigió un posible bloqueo durante el inicio del servidor en caso de que ocurriera una excepción en `libunwind` durante la excepción en el acceso a `ThreadStatus` estructura. [\#6456](https://github.com/ClickHouse/ClickHouse/pull/6456) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Fix crash en `yandexConsistentHash` función. Encontrado por prueba de fuzz. [\#6304](https://github.com/ClickHouse/ClickHouse/issues/6304) [\#6305](https://github.com/ClickHouse/ClickHouse/pull/6305) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la posibilidad de colgar consultas cuando el servidor está sobrecargado y el grupo de subprocesos global está casi lleno. Esto tiene una mayor probabilidad de ocurrir en clústeres con una gran cantidad de fragmentos (cientos), porque las consultas distribuidas asignan un hilo por conexión a cada fragmento. Por ejemplo, este problema puede reproducirse si un clúster de 330 fragmentos está procesando 30 consultas distribuidas simultáneas. Este problema afecta a todas las versiones a partir de 19.2. [\#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Lógica fija de `arrayEnumerateUniqRanked` función. [\#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir segfault al decodificar la tabla de símbolos. [\#6603](https://github.com/ClickHouse/ClickHouse/pull/6603) ([Amos pájaro](https://github.com/amosbird)) +- Se corrigió una excepción irrelevante en el elenco de `LowCardinality(Nullable)` to not-Nullable column in case if it doesn't contain Nulls (e.g. in query like `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String)`. [\#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [\#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Se eliminó la cita adicional de la descripción en `system.settings` tabla. [\#6696](https://github.com/ClickHouse/ClickHouse/issues/6696) [\#6699](https://github.com/ClickHouse/ClickHouse/pull/6699) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evite un posible punto muerto en `TRUNCATE` de la tabla replicada. [\#6695](https://github.com/ClickHouse/ClickHouse/pull/6695) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir la lectura en orden de clave de clasificación. [\#6189](https://github.com/ClickHouse/ClickHouse/pull/6189) ([Anton Popov](https://github.com/CurtizJ)) +- Fijar `ALTER TABLE ... UPDATE` consulta para tablas con `enable_mixed_granularity_parts=1`. [\#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Corregir error abierto por [\#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) (desde 19.4.0). Se reproduce en consultas a tablas distribuidas sobre tablas MergeTree cuando no consultamos ninguna columnas (`SELECT 1`). [\#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) +- Se corrigió el desbordamiento en la división de enteros de tipo con signo a tipo sin signo. El comportamiento fue exactamente como en el lenguaje C o C ++ (reglas de promoción enteras) que puede ser sorprendente. Tenga en cuenta que el desbordamiento aún es posible cuando se divide un número firmado grande por un número sin signo grande o viceversa (pero ese caso es menos habitual). El problema existía en todas las versiones del servidor. [\#6214](https://github.com/ClickHouse/ClickHouse/issues/6214) [\#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Limite el tiempo máximo de suspensión para el estrangulamiento cuando `max_execution_speed` o `max_execution_speed_bytes` se establece. Se corrigieron errores falsos como `Estimated query execution time (inf seconds) is too long`. [\#5547](https://github.com/ClickHouse/ClickHouse/issues/5547) [\#6232](https://github.com/ClickHouse/ClickHouse/pull/6232) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigieron problemas sobre el uso `MATERIALIZED` columnas y alias en `MaterializedView`. [\#448](https://github.com/ClickHouse/ClickHouse/issues/448) [\#3484](https://github.com/ClickHouse/ClickHouse/issues/3484) [\#3450](https://github.com/ClickHouse/ClickHouse/issues/3450) [\#2878](https://github.com/ClickHouse/ClickHouse/issues/2878) [\#2285](https://github.com/ClickHouse/ClickHouse/issues/2285) [\#3796](https://github.com/ClickHouse/ClickHouse/pull/3796) ([Amos pájaro](https://github.com/amosbird)) [\#6316](https://github.com/ClickHouse/ClickHouse/pull/6316) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar `FormatFactory` comportamiento para flujos de entrada que no se implementan como procesador. [\#6495](https://github.com/ClickHouse/ClickHouse/pull/6495) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Error tipográfico fijo. [\#6631](https://github.com/ClickHouse/ClickHouse/pull/6631) ([Acerca de Nosotros](https://github.com/alexryndin)) +- Typo en el mensaje de error (es -\> are ). [\#6839](https://github.com/ClickHouse/ClickHouse/pull/6839) ([Denis Zhuravlev](https://github.com/den-crane)) +- Se corrigió el error al analizar la lista de columnas de la cadena si el tipo contenía una coma (este problema era relevante para `File`, `URL`, `HDFS` almacenamiento) [\#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [\#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([Dimarub2000](https://github.com/dimarub2000)) + +#### Corrección de seguridad {#security-fix} + +- Esta versión también contiene todas las correcciones de seguridad de errores de 19.13 y 19.11. +- Se corrigió la posibilidad de que una consulta fabricada causara un bloqueo del servidor debido al desbordamiento de la pila en el analizador SQL. Se corrigió la posibilidad de desbordamiento de pila en las tablas Merge y Distributed, las vistas materializadas y las condiciones para la seguridad a nivel de fila que implicaban subconsultas. [\#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejora {#improvement-3} + +- Correcta implementación de la lógica ternaria para `AND/OR`. [\#6048](https://github.com/ClickHouse/ClickHouse/pull/6048) ([Alejandro Kazakov](https://github.com/Akazz)) +- Ahora los valores y filas con TTL caducado se eliminarán después `OPTIMIZE ... FINAL` query from old parts without TTL infos or with outdated TTL infos, e.g. after `ALTER ... MODIFY TTL` consulta. Consultas añadidas `SYSTEM STOP/START TTL MERGES` para no permitir / permitir asignar fusiones con TTL y filtrar valores caducados en todas las fusiones. [\#6274](https://github.com/ClickHouse/ClickHouse/pull/6274) ([Anton Popov](https://github.com/CurtizJ)) +- Posibilidad de cambiar la ubicación del archivo de historial de ClickHouse para el cliente usando `CLICKHOUSE_HISTORY_FILE` envío. [\#6840](https://github.com/ClickHouse/ClickHouse/pull/6840) ([filimonov](https://github.com/filimonov)) +- Quitar `dry_run` bandera de `InterpreterSelectQuery`. … [\#6375](https://github.com/ClickHouse/ClickHouse/pull/6375) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Apoyo `ASOF JOIN` con `ON` apartado. [\#6211](https://github.com/ClickHouse/ClickHouse/pull/6211) ([Artem Zuikov](https://github.com/4ertus2)) +- Mejor soporte de índices de omisión para mutaciones y replicación. Soporte para `MATERIALIZE/CLEAR INDEX ... IN PARTITION` consulta. `UPDATE x = x` vuelve a calcular todos los índices que usan la columna `x`. [\#5053](https://github.com/ClickHouse/ClickHouse/pull/5053) ([Nikita Vasilev](https://github.com/nikvas0)) +- Permitir a `ATTACH` vistas en vivo (por ejemplo, al iniciar el servidor) independientemente de `allow_experimental_live_view` configuración. [\#6754](https://github.com/ClickHouse/ClickHouse/pull/6754) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Para los seguimientos de pila recopilados por el generador de perfiles de consultas, no incluya los marcos de pila generados por el propio generador de perfiles de consultas. [\#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora funciones de tabla `values`, `file`, `url`, `hdfs` tienen soporte para columnas ALIAS. [\#6255](https://github.com/ClickHouse/ClickHouse/pull/6255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Lance una excepción si `config.d` file no tiene el elemento raíz correspondiente como el archivo de configuración. [\#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([Dimarub2000](https://github.com/dimarub2000)) +- Imprimir información adicional en el mensaje de excepción para `no space left on device`. [\#6182](https://github.com/ClickHouse/ClickHouse/issues/6182), [\#6252](https://github.com/ClickHouse/ClickHouse/issues/6252) [\#6352](https://github.com/ClickHouse/ClickHouse/pull/6352) ([Tavplubix](https://github.com/tavplubix)) +- Al determinar fragmentos de un `Distributed` debe ser cubierto por una consulta de lectura (para `optimize_skip_unused_shards` = 1) ClickHouse ahora verifica las condiciones de ambos `prewhere` y `where` cláusulas de la instrucción select. [\#6521](https://github.com/ClickHouse/ClickHouse/pull/6521) ([Alejandro Kazakov](https://github.com/Akazz)) +- Permitir `SIMDJSON` para máquinas sin AVX2 pero con sistema de instrucciones SSE 4.2 y PCLMUL. [\#6285](https://github.com/ClickHouse/ClickHouse/issues/6285) [\#6320](https://github.com/ClickHouse/ClickHouse/pull/6320) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- ClickHouse puede funcionar en sistemas de archivos sin `O_DIRECT` soporte (como ZFS y BtrFS) sin afinación adicional. [\#4449](https://github.com/ClickHouse/ClickHouse/issues/4449) [\#6730](https://github.com/ClickHouse/ClickHouse/pull/6730) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Soporte push down predicado para la subconsulta final. [\#6120](https://github.com/ClickHouse/ClickHouse/pull/6120) ([Método de codificación de datos:](https://github.com/TCeason)) [\#6162](https://github.com/ClickHouse/ClickHouse/pull/6162) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejor `JOIN ON` extracción de llaves [\#6131](https://github.com/ClickHouse/ClickHouse/pull/6131) ([Artem Zuikov](https://github.com/4ertus2)) +- Se ha actualizado `SIMDJSON`. [\#6285](https://github.com/ClickHouse/ClickHouse/issues/6285). [\#6306](https://github.com/ClickHouse/ClickHouse/pull/6306) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Optimizar la selección de la columna más pequeña para `SELECT count()` consulta. [\#6344](https://github.com/ClickHouse/ClickHouse/pull/6344) ([Amos pájaro](https://github.com/amosbird)) +- Añadir `strict` parámetro en `windowFunnel()`. Cuando el `strict` se establece, el `windowFunnel()` aplica condiciones sólo para los valores únicos. [\#6548](https://github.com/ClickHouse/ClickHouse/pull/6548) ([chimbab](https://github.com/achimbab)) +- Interfaz más segura de `mysqlxx::Pool`. [\#6150](https://github.com/ClickHouse/ClickHouse/pull/6150) ([avasiliev](https://github.com/avasiliev)) +- Opciones de tamaño de línea al ejecutar con `--help` opción ahora se corresponde con el tamaño del terminal. [\#6590](https://github.com/ClickHouse/ClickHouse/pull/6590) ([Dimarub2000](https://github.com/dimarub2000)) +- Desactivar “read in order” optimización para la agregación sin claves. [\#6599](https://github.com/ClickHouse/ClickHouse/pull/6599) ([Anton Popov](https://github.com/CurtizJ)) +- Código de estado HTTP para `INCORRECT_DATA` y `TYPE_MISMATCH` los códigos de error se cambiaron de forma predeterminada `500 Internal Server Error` a `400 Bad Request`. [\#6271](https://github.com/ClickHouse/ClickHouse/pull/6271) ([Alejandro Rodin](https://github.com/a-rodin)) +- Mover un objeto de unión desde `ExpressionAction` en `AnalyzedJoin`. `ExpressionAnalyzer` y `ExpressionAction` no sé `Join` clase más. Su lógica está oculta por `AnalyzedJoin` iface. [\#6801](https://github.com/ClickHouse/ClickHouse/pull/6801) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió un posible interbloqueo de consultas distribuidas cuando uno de los fragmentos es localhost pero la consulta se envía a través de una conexión de red. [\#6759](https://github.com/ClickHouse/ClickHouse/pull/6759) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Semántica cambiada de varias tablas `RENAME` para evitar posibles interbloqueos. [\#6757](https://github.com/ClickHouse/ClickHouse/issues/6757). [\#6756](https://github.com/ClickHouse/ClickHouse/pull/6756) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Servidor de compatibilidad MySQL reescrito para evitar la carga completa de paquetes de carga en la memoria. Disminución del consumo de memoria para cada conexión a aproximadamente `2 * DBMS_DEFAULT_BUFFER_SIZE` (búferes de lectura/escritura). [\#5811](https://github.com/ClickHouse/ClickHouse/pull/5811) ([Yuriy Baranov](https://github.com/yurriy)) +- Mueva la lógica de interpretación de alias AST fuera del analizador que no tiene que saber nada sobre la semántica de consultas. [\#6108](https://github.com/ClickHouse/ClickHouse/pull/6108) ([Artem Zuikov](https://github.com/4ertus2)) +- Análisis ligeramente más seguro de `NamesAndTypesList`. [\#6408](https://github.com/ClickHouse/ClickHouse/issues/6408). [\#6410](https://github.com/ClickHouse/ClickHouse/pull/6410) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-copier`: Permitir el uso `where_condition` de configuración con `partition_key` alias en la consulta para verificar la existencia de la partición (Anteriormente se usaba solo para leer consultas de datos). [\#6577](https://github.com/ClickHouse/ClickHouse/pull/6577) ([propulsor](https://github.com/proller)) +- Añadido argumento de mensaje opcional en `throwIf`. ([\#5772](https://github.com/ClickHouse/ClickHouse/issues/5772)) [\#6329](https://github.com/ClickHouse/ClickHouse/pull/6329) ([Vdimir](https://github.com/Vdimir)) +- La excepción del servidor obtenida al enviar datos de inserción ahora también se está procesando en el cliente. [\#5891](https://github.com/ClickHouse/ClickHouse/issues/5891) [\#6711](https://github.com/ClickHouse/ClickHouse/pull/6711) ([Dimarub2000](https://github.com/dimarub2000)) +- Se agregó una métrica `DistributedFilesToInsert` que muestra el número total de archivos en el sistema de archivos que se seleccionan para enviar a servidores remotos mediante tablas distribuidas. El número se suma en todos los fragmentos. [\#6600](https://github.com/ClickHouse/ClickHouse/pull/6600) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mover la mayoría de JOINs preparar la lógica de `ExpressionAction/ExpressionAnalyzer` a `AnalyzedJoin`. [\#6785](https://github.com/ClickHouse/ClickHouse/pull/6785) ([Artem Zuikov](https://github.com/4ertus2)) +- Reparar TSan [advertencia](https://clickhouse-test-reports.s3.yandex.net/6399/c1c1d1daa98e199e620766f1bd06a5921050a00d/functional_stateful_tests_(thread).html) ‘lock-order-inversion’. [\#6740](https://github.com/ClickHouse/ClickHouse/pull/6740) ([Vasily Nemkov](https://github.com/Enmk)) +- Mejores mensajes de información sobre la falta de capacidades de Linux. Registro de errores fatales con “fatal” nivel, que hará que sea más fácil de encontrar en `system.text_log`. [\#6441](https://github.com/ClickHouse/ClickHouse/pull/6441) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cuando se habilita el volcado de datos temporales en el disco para restringir el uso de memoria durante `GROUP BY`, `ORDER BY`, no comprobó el espacio de disco libre. La corrección agrega una nueva configuración `min_free_disk_space`, cuando el espacio de disco libre es más pequeño que el umbral, la consulta se detendrá y lanzará `ErrorCodes::NOT_ENOUGH_SPACE`. [\#6678](https://github.com/ClickHouse/ClickHouse/pull/6678) ([Weiqing Xu](https://github.com/weiqxu)) [\#6691](https://github.com/ClickHouse/ClickHouse/pull/6691) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Eliminado rwlock recursivo por hilo. No tiene sentido, porque los hilos se reutilizan entre consultas. `SELECT` la consulta puede adquirir un bloqueo en un hilo, mantener un bloqueo de otro hilo y salir del primer hilo. Al mismo tiempo, el primer hilo puede ser reutilizado por `DROP` consulta. Esto conducirá a falso “Attempt to acquire exclusive lock recursively” mensaje. [\#6771](https://github.com/ClickHouse/ClickHouse/pull/6771) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Dividir `ExpressionAnalyzer.appendJoin()`. Preparar un lugar en `ExpressionAnalyzer` para `MergeJoin`. [\#6524](https://github.com/ClickHouse/ClickHouse/pull/6524) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir `mysql_native_password` complemento de autenticación al servidor de compatibilidad MySQL. [\#6194](https://github.com/ClickHouse/ClickHouse/pull/6194) ([Yuriy Baranov](https://github.com/yurriy)) +- Menos número de `clock_gettime` llamadas; compatibilidad ABI fija entre depuración / liberación en `Allocator` (problema insignificante). [\#6197](https://github.com/ClickHouse/ClickHouse/pull/6197) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mover `collectUsedColumns` de `ExpressionAnalyzer` a `SyntaxAnalyzer`. `SyntaxAnalyzer` hacer `required_source_columns` sí mismo ahora. [\#6416](https://github.com/ClickHouse/ClickHouse/pull/6416) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir ajuste `joined_subquery_requires_alias` para requerir alias para subselecciones y funciones de tabla en `FROM` that more than one table is present (i.e. queries with JOINs). [\#6733](https://github.com/ClickHouse/ClickHouse/pull/6733) ([Artem Zuikov](https://github.com/4ertus2)) +- Extraer `GetAggregatesVisitor` clase de `ExpressionAnalyzer`. [\#6458](https://github.com/ClickHouse/ClickHouse/pull/6458) ([Artem Zuikov](https://github.com/4ertus2)) +- `system.query_log`: cambiar el tipo de datos de `type` columna a `Enum`. [\#6265](https://github.com/ClickHouse/ClickHouse/pull/6265) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Enlace estático de `sha256_password` complemento de autenticación. [\#6512](https://github.com/ClickHouse/ClickHouse/pull/6512) ([Yuriy Baranov](https://github.com/yurriy)) +- Evite una dependencia adicional para la configuración `compile` trabajar. En versiones anteriores, el usuario puede obtener un error como `cannot open crti.o`, `unable to find library -lc` sucesivamente. [\#6309](https://github.com/ClickHouse/ClickHouse/pull/6309) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Más validación de la entrada que puede provenir de réplica maliciosa. [\#6303](https://github.com/ClickHouse/ClickHouse/pull/6303) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora `clickhouse-obfuscator` el archivo está disponible en `clickhouse-client` paquete. En versiones anteriores estaba disponible como `clickhouse obfuscator` (con espacios en blanco). [\#5816](https://github.com/ClickHouse/ClickHouse/issues/5816) [\#6609](https://github.com/ClickHouse/ClickHouse/pull/6609) ([Dimarub2000](https://github.com/dimarub2000)) +- Fijo interbloqueo cuando tenemos al menos dos consultas que leer al menos dos tablas en orden diferente y otra consulta que realiza DDL operación en una de las mesas. Se corrigió otro punto muerto muy raro. [\#6764](https://github.com/ClickHouse/ClickHouse/pull/6764) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `os_thread_ids` columna a `system.processes` y `system.query_log` para mejores posibilidades de depuración. [\#6763](https://github.com/ClickHouse/ClickHouse/pull/6763) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Una solución para los errores de extensión PHP mysqlnd que ocurren cuando `sha256_password` se utiliza como un complemento de autenticación predeterminado (descrito en [\#6031](https://github.com/ClickHouse/ClickHouse/issues/6031)). [\#6113](https://github.com/ClickHouse/ClickHouse/pull/6113) ([Yuriy Baranov](https://github.com/yurriy)) +- Elimine el lugar innecesario con columnas de nulabilidad modificadas. [\#6693](https://github.com/ClickHouse/ClickHouse/pull/6693) ([Artem Zuikov](https://github.com/4ertus2)) +- Establecer el valor predeterminado de `queue_max_wait_ms` a cero, porque el valor actual (cinco segundos) no tiene sentido. Hay raras circunstancias en las que esta configuración tiene algún uso. Configuración añadida `replace_running_query_max_wait_ms`, `kafka_max_wait_ms` y `connection_pool_max_wait_ms` para la desambiguación. [\#6692](https://github.com/ClickHouse/ClickHouse/pull/6692) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Extraer `SelectQueryExpressionAnalyzer` de `ExpressionAnalyzer`. Mantenga el último para consultas no seleccionadas. [\#6499](https://github.com/ClickHouse/ClickHouse/pull/6499) ([Artem Zuikov](https://github.com/4ertus2)) +- Se eliminó la duplicación de formatos de entrada y salida. [\#6239](https://github.com/ClickHouse/ClickHouse/pull/6239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Permitir al usuario anular `poll_interval` y `idle_connection_timeout` configuración en la conexión. [\#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `MergeTree` ahora tiene una opción adicional `ttl_only_drop_parts` (deshabilitado por defecto) para evitar la poda parcial de las piezas, de modo que se caigan completamente cuando todas las filas de una pieza hayan caducado. [\#6191](https://github.com/ClickHouse/ClickHouse/pull/6191) ([Sergi Vladykin](https://github.com/svladykin)) +- Comprobaciones de tipo para establecer funciones de índice. Lanzar excepción si la función tiene un tipo incorrecto. Esto corrige la prueba de fuzz con UBSan. [\#6511](https://github.com/ClickHouse/ClickHouse/pull/6511) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Mejora del rendimiento {#performance-improvement-2} + +- Optimice las consultas con `ORDER BY expressions` cláusula, donde `expressions` tiene prefijo coincidente con clave de clasificación en `MergeTree` tabla. Esta optimización está controlada por `optimize_read_in_order` configuración. [\#6054](https://github.com/ClickHouse/ClickHouse/pull/6054) [\#6629](https://github.com/ClickHouse/ClickHouse/pull/6629) ([Anton Popov](https://github.com/CurtizJ)) +- Permitir el uso de múltiples hilos durante la carga y eliminación de piezas. [\#6372](https://github.com/ClickHouse/ClickHouse/issues/6372) [\#6074](https://github.com/ClickHouse/ClickHouse/issues/6074) [\#6438](https://github.com/ClickHouse/ClickHouse/pull/6438) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Variante por lotes implementada de actualizar los estados de funciones agregadas. Puede conducir a beneficios de rendimiento. [\#6435](https://github.com/ClickHouse/ClickHouse/pull/6435) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Utilizar `FastOps` biblioteca para funciones `exp`, `log`, `sigmoid`, `tanh`. FastOps es una biblioteca matemática vectorial rápido de Michael Parakhin (Yandex CTO). Rendimiento mejorado de `exp` y `log` funciona más de 6 veces. Función `exp` y `log` de `Float32` el argumento volverá `Float32` (en versiones anteriores siempre regresan `Float64`). Ahora `exp(nan)` puede volver `inf`. El resultado de `exp` y `log` las funciones pueden no ser el número representable de la máquina más cercana a la respuesta verdadera. [\#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) Usando la variante Danila Kutenin para hacer fastops trabajando [\#6317](https://github.com/ClickHouse/ClickHouse/pull/6317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deshabilitar la optimización de claves consecutivas para `UInt8/16`. [\#6298](https://github.com/ClickHouse/ClickHouse/pull/6298) [\#6701](https://github.com/ClickHouse/ClickHouse/pull/6701) ([akuzm](https://github.com/akuzm)) +- Rendimiento mejorado de `simdjson` biblioteca al deshacerse de la asignación dinámica en `ParsedJson::Iterator`. [\#6479](https://github.com/ClickHouse/ClickHouse/pull/6479) ([Vitaly Baranov](https://github.com/vitlibar)) +- Páginas de error previo al asignar memoria con `mmap()`. [\#6667](https://github.com/ClickHouse/ClickHouse/pull/6667) ([akuzm](https://github.com/akuzm)) +- Corregir un error de rendimiento en `Decimal` comparación. [\#6380](https://github.com/ClickHouse/ClickHouse/pull/6380) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-4} + +- Elimine el compilador (creación de instancias de la plantilla de tiempo de ejecución) porque hemos ganado su rendimiento. [\#6646](https://github.com/ClickHouse/ClickHouse/pull/6646) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó una prueba de rendimiento para mostrar la degradación del rendimiento en gcc-9 de una manera más aislada. [\#6302](https://github.com/ClickHouse/ClickHouse/pull/6302) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Función de tabla añadida `numbers_mt`, que es la versión multiproceso de `numbers`. Pruebas de rendimiento actualizadas con funciones hash. [\#6554](https://github.com/ClickHouse/ClickHouse/pull/6554) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Modo de comparación en `clickhouse-benchmark` [\#6220](https://github.com/ClickHouse/ClickHouse/issues/6220) [\#6343](https://github.com/ClickHouse/ClickHouse/pull/6343) ([Dimarub2000](https://github.com/dimarub2000)) +- Mejor esfuerzo para imprimir rastros de pila. También añadido `SIGPROF` como una señal de depuración para imprimir el seguimiento de la pila de un hilo en ejecución. [\#6529](https://github.com/ClickHouse/ClickHouse/pull/6529) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cada función en su propio archivo, parte 10. [\#6321](https://github.com/ClickHouse/ClickHouse/pull/6321) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Eliminar doble const `TABLE_IS_READ_ONLY`. [\#6566](https://github.com/ClickHouse/ClickHouse/pull/6566) ([filimonov](https://github.com/filimonov)) +- Cambios de formato para `StringHashMap` PR [\#5417](https://github.com/ClickHouse/ClickHouse/issues/5417). [\#6700](https://github.com/ClickHouse/ClickHouse/pull/6700) ([akuzm](https://github.com/akuzm)) +- Mejor subconsulta para la creación de unión en `ExpressionAnalyzer`. [\#6824](https://github.com/ClickHouse/ClickHouse/pull/6824) ([Artem Zuikov](https://github.com/4ertus2)) +- Elimine una condición redundante (encontrada por PVS Studio). [\#6775](https://github.com/ClickHouse/ClickHouse/pull/6775) ([akuzm](https://github.com/akuzm)) +- Separe la interfaz de la tabla hash para `ReverseIndex`. [\#6672](https://github.com/ClickHouse/ClickHouse/pull/6672) ([akuzm](https://github.com/akuzm)) +- Refactorización de configuraciones. [\#6689](https://github.com/ClickHouse/ClickHouse/pull/6689) ([alesapin](https://github.com/alesapin)) +- Añadir comentarios para `set` funciones de índice. [\#6319](https://github.com/ClickHouse/ClickHouse/pull/6319) ([Nikita Vasilev](https://github.com/nikvas0)) +- Aumente la puntuación de OOM en la versión de depuración en Linux. [\#6152](https://github.com/ClickHouse/ClickHouse/pull/6152) ([akuzm](https://github.com/akuzm)) +- HDFS HA ahora funciona en la compilación de depuración. [\#6650](https://github.com/ClickHouse/ClickHouse/pull/6650) ([Weiqing Xu](https://github.com/weiqxu)) +- Se agregó una prueba a `transform_query_for_external_database`. [\#6388](https://github.com/ClickHouse/ClickHouse/pull/6388) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregue prueba para múltiples vistas materializadas para la tabla Kafka. [\#6509](https://github.com/ClickHouse/ClickHouse/pull/6509) ([Ivan](https://github.com/abyss7)) +- Hacer un mejor esquema de construcción. [\#6500](https://github.com/ClickHouse/ClickHouse/pull/6500) ([Ivan](https://github.com/abyss7)) +- Fijo `test_external_dictionaries` integración en caso de que se haya ejecutado bajo un usuario no root. [\#6507](https://github.com/ClickHouse/ClickHouse/pull/6507) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- El error se reproduce cuando el tamaño total de los paquetes escritos excede `DBMS_DEFAULT_BUFFER_SIZE`. [\#6204](https://github.com/ClickHouse/ClickHouse/pull/6204) ([Yuriy Baranov](https://github.com/yurriy)) +- Se agregó una prueba para `RENAME` condición de carrera de mesa [\#6752](https://github.com/ClickHouse/ClickHouse/pull/6752) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evitar la carrera de datos en Configuración en `KILL QUERY`. [\#6753](https://github.com/ClickHouse/ClickHouse/pull/6753) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir prueba de integración para el manejo de errores por un diccionario de caché. [\#6755](https://github.com/ClickHouse/ClickHouse/pull/6755) ([Vitaly Baranov](https://github.com/vitlibar)) +- Deshabilite el análisis de archivos de objetos ELF en Mac OS, porque no tiene sentido. [\#6578](https://github.com/ClickHouse/ClickHouse/pull/6578) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Intenta mejorar el generador de registro de cambios. [\#6327](https://github.com/ClickHouse/ClickHouse/pull/6327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `-Wshadow` cambiar al GCC. [\#6325](https://github.com/ClickHouse/ClickHouse/pull/6325) ([Método de codificación de datos:](https://github.com/kreuzerkrieg)) +- Eliminado el código obsoleto para `mimalloc` apoyo. [\#6715](https://github.com/ClickHouse/ClickHouse/pull/6715) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `zlib-ng` determina las capacidades de x86 y guarda esta información en variables globales. Esto se hace en la llamada defalteInit , que puede ser hecha por diferentes hilos simultáneamente. Para evitar escrituras multiproceso, hágalo al iniciar la biblioteca. [\#6141](https://github.com/ClickHouse/ClickHouse/pull/6141) ([akuzm](https://github.com/akuzm)) +- Prueba de regresión para un error que en join se corrigió en [\#5192](https://github.com/ClickHouse/ClickHouse/issues/5192). [\#6147](https://github.com/ClickHouse/ClickHouse/pull/6147) ([Bakhtiyor Ruziev](https://github.com/theruziev)) +- Informe MSan fijo. [\#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar aleteo prueba TTL. [\#6782](https://github.com/ClickHouse/ClickHouse/pull/6782) ([Anton Popov](https://github.com/CurtizJ)) +- Corregido carrera de datos falsos en `MergeTreeDataPart::is_frozen` campo. [\#6583](https://github.com/ClickHouse/ClickHouse/pull/6583) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigieron los tiempos de espera en la prueba de fuzz. En la versión anterior, se las arregló para encontrar falso bloqueo en la consulta `SELECT * FROM numbers_mt(gccMurmurHash(''))`. [\#6582](https://github.com/ClickHouse/ClickHouse/pull/6582) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregaron comprobaciones de depuración a `static_cast` de columnas. [\#6581](https://github.com/ClickHouse/ClickHouse/pull/6581) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Soporte para Oracle Linux en paquetes RPM oficiales. [\#6356](https://github.com/ClickHouse/ClickHouse/issues/6356) [\#6585](https://github.com/ClickHouse/ClickHouse/pull/6585) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cambiado json perftests de `once` a `loop` tipo. [\#6536](https://github.com/ClickHouse/ClickHouse/pull/6536) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- `odbc-bridge.cpp` definir `main()` por lo que no debe ser incluido en `clickhouse-lib`. [\#6538](https://github.com/ClickHouse/ClickHouse/pull/6538) ([Películas De Sexo](https://github.com/orivej)) +- Prueba de accidente en `FULL|RIGHT JOIN` con nulos en las claves de la tabla derecha. [\#6362](https://github.com/ClickHouse/ClickHouse/pull/6362) ([Artem Zuikov](https://github.com/4ertus2)) +- Se agregó una prueba para el límite de expansión de alias por si acaso. [\#6442](https://github.com/ClickHouse/ClickHouse/pull/6442) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cambiado de `boost::filesystem` a `std::filesystem` cuando sea apropiado. [\#6253](https://github.com/ClickHouse/ClickHouse/pull/6253) [\#6385](https://github.com/ClickHouse/ClickHouse/pull/6385) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregaron paquetes RPM al sitio web. [\#6251](https://github.com/ClickHouse/ClickHouse/pull/6251) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir una prueba para fijo `Unknown identifier` excepción en `IN` apartado. [\#6708](https://github.com/ClickHouse/ClickHouse/pull/6708) ([Artem Zuikov](https://github.com/4ertus2)) +- Simplificar `shared_ptr_helper` porque las personas que enfrentan dificultades para entenderlo. [\#6675](https://github.com/ClickHouse/ClickHouse/pull/6675) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregaron pruebas de rendimiento para el códec Gorilla y DoubleDelta fijo. [\#6179](https://github.com/ClickHouse/ClickHouse/pull/6179) ([Vasily Nemkov](https://github.com/Enmk)) +- Dividir la prueba de integración `test_dictionaries` en 4 pruebas separadas. [\#6776](https://github.com/ClickHouse/ClickHouse/pull/6776) ([Vitaly Baranov](https://github.com/vitlibar)) +- Repara la advertencia de PVS-Studio en `PipelineExecutor`. [\#6777](https://github.com/ClickHouse/ClickHouse/pull/6777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Permitir usar `library` fuente del diccionario con ASan. [\#6482](https://github.com/ClickHouse/ClickHouse/pull/6482) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó la opción para generar registro de cambios a partir de una lista de relaciones públicas. [\#6350](https://github.com/ClickHouse/ClickHouse/pull/6350) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Bloquee el `TinyLog` almacenamiento al leer. [\#6226](https://github.com/ClickHouse/ClickHouse/pull/6226) ([akuzm](https://github.com/akuzm)) +- Compruebe si hay enlaces simbólicos rotos en CI. [\#6634](https://github.com/ClickHouse/ClickHouse/pull/6634) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Aumentar el tiempo de espera para “stack overflow” prueba porque puede llevar mucho tiempo en la compilación de depuración. [\#6637](https://github.com/ClickHouse/ClickHouse/pull/6637) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó un cheque para espacios en blanco dobles. [\#6643](https://github.com/ClickHouse/ClickHouse/pull/6643) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar `new/delete` Seguimiento de memoria cuando se construye con desinfectantes. El seguimiento no está claro. Solo evita las excepciones de límite de memoria en las pruebas. [\#6450](https://github.com/ClickHouse/ClickHouse/pull/6450) ([Artem Zuikov](https://github.com/4ertus2)) +- Habilite la comprobación de símbolos indefinidos durante la vinculación. [\#6453](https://github.com/ClickHouse/ClickHouse/pull/6453) ([Ivan](https://github.com/abyss7)) +- Evitar la reconstrucción `hyperscan` todos los días. [\#6307](https://github.com/ClickHouse/ClickHouse/pull/6307) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Informe UBSan fijo en `ProtobufWriter`. [\#6163](https://github.com/ClickHouse/ClickHouse/pull/6163) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- No permita el uso del generador de perfiles de consultas con desinfectantes porque no es compatible. [\#6769](https://github.com/ClickHouse/ClickHouse/pull/6769) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregue prueba para recargar un diccionario después de fallar por temporizador. [\#6114](https://github.com/ClickHouse/ClickHouse/pull/6114) ([Vitaly Baranov](https://github.com/vitlibar)) +- Corregir inconsistencia en `PipelineExecutor::prepareProcessor` tipo de argumento. [\#6494](https://github.com/ClickHouse/ClickHouse/pull/6494) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Se agregó una prueba de URI malos. [\#6493](https://github.com/ClickHouse/ClickHouse/pull/6493) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregaron más cheques a `CAST` función. Esto debería obtener más información sobre la falla de segmentación en la prueba difusa. [\#6346](https://github.com/ClickHouse/ClickHouse/pull/6346) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Añadir `gcc-9` apoyo a `docker/builder` contenedor que construye la imagen localmente. [\#6333](https://github.com/ClickHouse/ClickHouse/pull/6333) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Prueba de clave primaria con `LowCardinality(String)`. [\#5044](https://github.com/ClickHouse/ClickHouse/issues/5044) [\#6219](https://github.com/ClickHouse/ClickHouse/pull/6219) ([Dimarub2000](https://github.com/dimarub2000)) +- Se corrigieron las pruebas afectadas por la impresión de rastros de pila lenta. [\#6315](https://github.com/ClickHouse/ClickHouse/pull/6315) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregue un caso de prueba para el bloqueo en `groupUniqArray` fijo en [\#6029](https://github.com/ClickHouse/ClickHouse/pull/6029). [\#4402](https://github.com/ClickHouse/ClickHouse/issues/4402) [\#6129](https://github.com/ClickHouse/ClickHouse/pull/6129) ([akuzm](https://github.com/akuzm)) +- Pruebas de mutaciones de índices fijos. [\#6645](https://github.com/ClickHouse/ClickHouse/pull/6645) ([Nikita Vasilev](https://github.com/nikvas0)) +- En la prueba de rendimiento, no lea el registro de consultas para las consultas que no ejecutamos. [\#6427](https://github.com/ClickHouse/ClickHouse/pull/6427) ([akuzm](https://github.com/akuzm)) +- La vista materializada ahora se puede crear con cualquier tipo de cardinalidad baja, independientemente de la configuración sobre tipos de cardinalidad baja sospechosos. [\#6428](https://github.com/ClickHouse/ClickHouse/pull/6428) ([Olga Khvostikova](https://github.com/stavrolia)) +- Pruebas actualizadas para `send_logs_level` configuración. [\#6207](https://github.com/ClickHouse/ClickHouse/pull/6207) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix build bajo gcc-8.2. [\#6196](https://github.com/ClickHouse/ClickHouse/pull/6196) ([Max Akhmedov](https://github.com/zlobober)) +- Corregir la compilación con libc ++ interno. [\#6724](https://github.com/ClickHouse/ClickHouse/pull/6724) ([Ivan](https://github.com/abyss7)) +- Reparar compilación compartida con `rdkafka` biblioteca [\#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) +- Correcciones para la compilación de Mac OS (incompleta). [\#6390](https://github.com/ClickHouse/ClickHouse/pull/6390) ([alexey-milovidov](https://github.com/alexey-milovidov)) [\#6429](https://github.com/ClickHouse/ClickHouse/pull/6429) ([Más información](https://github.com/alex-zaitsev)) +- Fijar “splitted” construir. [\#6618](https://github.com/ClickHouse/ClickHouse/pull/6618) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Otras correcciones de compilación: [\#6186](https://github.com/ClickHouse/ClickHouse/pull/6186) ([Amos pájaro](https://github.com/amosbird)) [\#6486](https://github.com/ClickHouse/ClickHouse/pull/6486) [\#6348](https://github.com/ClickHouse/ClickHouse/pull/6348) ([vxider](https://github.com/Vxider)) [\#6744](https://github.com/ClickHouse/ClickHouse/pull/6744) ([Ivan](https://github.com/abyss7)) [\#6016](https://github.com/ClickHouse/ClickHouse/pull/6016) [\#6421](https://github.com/ClickHouse/ClickHouse/pull/6421) [\#6491](https://github.com/ClickHouse/ClickHouse/pull/6491) ([propulsor](https://github.com/proller)) + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-3} + +- Se eliminó la función de tabla raramente utilizada `catBoostPool` y almacenamiento `CatBoostPool`. Si ha utilizado esta función de tabla, escriba un correo electrónico a `clickhouse-feedback@yandex-team.com`. Tenga en cuenta que la integración CatBoost sigue siendo y será compatible. [\#6279](https://github.com/ClickHouse/ClickHouse/pull/6279) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Desactivar `ANY RIGHT JOIN` y `ANY FULL JOIN` predeterminada. Establecer `any_join_distinct_right_table_keys` configuración para permitirles. [\#5126](https://github.com/ClickHouse/ClickHouse/issues/5126) [\#6351](https://github.com/ClickHouse/ClickHouse/pull/6351) ([Artem Zuikov](https://github.com/4ertus2)) + +## Lanzamiento de ClickHouse 19.13 {#clickhouse-release-19-13} + +### Lanzamiento de ClickHouse 19.13.6.51, 2019-10-02 {#clickhouse-release-19-13-6-51-2019-10-02} + +#### Corrección de errores {#bug-fix-9} + +- Esta versión también contiene todas las correcciones de errores de 19.11.12.69. + +### Lanzamiento de ClickHouse 19.13.5.44, 2019-09-20 {#clickhouse-release-19-13-5-44-2019-09-20} + +#### Corrección de errores {#bug-fix-10} + +- Esta versión también contiene todas las correcciones de errores de 19.14.6.12. +- Se corrigió el posible estado inconsistente de la tabla mientras se ejecutaba `DROP` consulta para la tabla replicada mientras que el zookeeper no es accesible. [\#6045](https://github.com/ClickHouse/ClickHouse/issues/6045) [\#6413](https://github.com/ClickHouse/ClickHouse/pull/6413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Solución para la carrera de datos en StorageMerge [\#6717](https://github.com/ClickHouse/ClickHouse/pull/6717) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir error introducido en el generador de perfiles de consultas que conduce a una recv interminable desde el socket. [\#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) ([alesapin](https://github.com/alesapin)) +- Corregir el uso excesivo de la CPU mientras se ejecuta `JSONExtractRaw` función sobre un valor booleano. [\#6208](https://github.com/ClickHouse/ClickHouse/pull/6208) ([Vitaly Baranov](https://github.com/vitlibar)) +- Corrige la regresión mientras presiona a la vista materializada. [\#6415](https://github.com/ClickHouse/ClickHouse/pull/6415) ([Ivan](https://github.com/abyss7)) +- Función de la tabla `url` la vulnerabilidad permitió al atacante inyectar encabezados HTTP arbitrarios en la solicitud. Este problema fue encontrado por [Nikita Tikhomirov](https://github.com/NSTikhomirov). [\#6466](https://github.com/ClickHouse/ClickHouse/pull/6466) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Arreglar inútil `AST` compruebe en Establecer índice. [\#6510](https://github.com/ClickHouse/ClickHouse/issues/6510) [\#6651](https://github.com/ClickHouse/ClickHouse/pull/6651) ([Nikita Vasilev](https://github.com/nikvas0)) +- Análisis fijo de `AggregateFunction` valores incrustados en la consulta. [\#6575](https://github.com/ClickHouse/ClickHouse/issues/6575) [\#6773](https://github.com/ClickHouse/ClickHouse/pull/6773) ([Zhichang Yu](https://github.com/yuzhichang)) +- Corregido el comportamiento incorrecto de `trim` funciones familiares. [\#6647](https://github.com/ClickHouse/ClickHouse/pull/6647) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.13.4.32, 2019-09-10 {#clickhouse-release-19-13-4-32-2019-09-10} + +#### Corrección de errores {#bug-fix-11} + +- Esta versión también contiene todas las correcciones de seguridad de errores de 19.11.9.52 y 19.11.10.54. +- Carrera de datos fija en `system.parts` mesa y `ALTER` consulta. [\#6245](https://github.com/ClickHouse/ClickHouse/issues/6245) [\#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el encabezado no coincidente en las secuencias en caso de leer desde una tabla distribuida vacía con sample y prewhere. [\#6167](https://github.com/ClickHouse/ClickHouse/issues/6167) ([Lixiang Qian](https://github.com/fancyqlx)) [\#6823](https://github.com/ClickHouse/ClickHouse/pull/6823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Se corrigió el fallo al usar `IN` cláusula con una subconsulta con una tupla. [\#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [\#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([Tavplubix](https://github.com/tavplubix)) +- Corregir el caso con los mismos nombres de columna en `GLOBAL JOIN ON` apartado. [\#6181](https://github.com/ClickHouse/ClickHouse/pull/6181) ([Artem Zuikov](https://github.com/4ertus2)) +- Corregir el bloqueo al lanzar tipos a `Decimal` que no lo soportan. Lanzar excepción en su lugar. [\#6297](https://github.com/ClickHouse/ClickHouse/pull/6297) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió el fallo en `extractAll()` función. [\#6644](https://github.com/ClickHouse/ClickHouse/pull/6644) ([Artem Zuikov](https://github.com/4ertus2)) +- Transformación de consultas para `MySQL`, `ODBC`, `JDBC` funciones de la tabla ahora funciona correctamente para `SELECT WHERE` consultas con múltiples `AND` expresiones. [\#6381](https://github.com/ClickHouse/ClickHouse/issues/6381) [\#6676](https://github.com/ClickHouse/ClickHouse/pull/6676) ([Dimarub2000](https://github.com/dimarub2000)) +- Se agregaron verificaciones de declaraciones anteriores para la integración de MySQL 8. [\#6569](https://github.com/ClickHouse/ClickHouse/pull/6569) ([Rafael David Tinoco](https://github.com/rafaeldtinoco)) + +#### Corrección de seguridad {#security-fix-1} + +- Corrige dos vulnerabilidades en los códecs en fase de descompresión (el usuario malicioso puede fabricar datos comprimidos que provocarán un desbordamiento del búfer en la descompresión). [\#6670](https://github.com/ClickHouse/ClickHouse/pull/6670) ([Artem Zuikov](https://github.com/4ertus2)) + +### Lanzamiento de ClickHouse 19.13.3.26, 2019-08-22 {#clickhouse-release-19-13-3-26-2019-08-22} + +#### Corrección de errores {#bug-fix-12} + +- Fijar `ALTER TABLE ... UPDATE` consulta para tablas con `enable_mixed_granularity_parts=1`. [\#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Repare NPE al usar la cláusula IN con una subconsulta con una tupla. [\#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [\#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([Tavplubix](https://github.com/tavplubix)) +- Se ha solucionado un problema por el que si una réplica obsoleta cobra vida, puede que aún tenga partes de datos eliminadas por DROP PARTITION. [\#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [\#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([Tavplubix](https://github.com/tavplubix)) +- Solucionado el problema con el análisis CSV [\#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [\#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([Tavplubix](https://github.com/tavplubix)) +- Carrera de datos fija en el sistema.tabla de piezas y consulta ALTER. Esto corrige [\#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [\#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el código incorrecto en las mutaciones que pueden conducir a la corrupción de la memoria. segfault fijo con lectura de la dirección `0x14c0` que puede happed debido a concurrente `DROP TABLE` y `SELECT` de `system.parts` o `system.parts_columns`. Condición de carrera fija en la preparación de consultas de mutación. Estancamiento fijo causado por `OPTIMIZE` de tablas replicadas y operaciones de modificación simultáneas como ALTERs. [\#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la posible pérdida de datos después de `ALTER DELETE` consulta en la tabla con índice de omisión. [\#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [\#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Corrección de seguridad {#security-fix-2} + +- Si el atacante tiene acceso de escritura a ZooKeeper y es capaz de ejecutar servidor personalizado disponible desde la red donde se ejecuta ClickHouse, puede crear servidor malicioso personalizado que actuará como réplica ClickHouse y registrarlo en ZooKeeper. Cuando otra réplica recuperará la parte de datos de una réplica maliciosa, puede forzar a clickhouse-server a escribir en una ruta arbitraria en el sistema de archivos. Encontrado por Eldar Zaitov, equipo de seguridad de la información en Yandex. [\#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.13.2.19, 2019-08-14 {#clickhouse-release-19-13-2-19-2019-08-14} + +#### Novedad {#new-feature-5} + +- Generador de perfiles de muestreo en el nivel de consulta. [Ejemplo](https://gist.github.com/alexey-milovidov/92758583dd41c24c360fdb8d6a4da194). [\#4247](https://github.com/ClickHouse/ClickHouse/issues/4247) ([laplab](https://github.com/laplab)) [\#6124](https://github.com/ClickHouse/ClickHouse/pull/6124) ([alexey-milovidov](https://github.com/alexey-milovidov)) [\#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) [\#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) [\#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) +- Permite especificar una lista de columnas con `COLUMNS('regexp')` expresión que funciona como una variante más sofisticada de `*` asterisco. [\#5951](https://github.com/ClickHouse/ClickHouse/pull/5951) ([Mfridental](https://github.com/mfridental)), ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `CREATE TABLE AS table_function()` es posible [\#6057](https://github.com/ClickHouse/ClickHouse/pull/6057) ([Dimarub2000](https://github.com/dimarub2000)) +- El optimizador de Adam para el descenso de gradiente estocástico se usa de forma predeterminada en `stochasticLinearRegression()` y `stochasticLogisticRegression()` funciones agregadas, porque muestra buena calidad sin casi ningún ajuste. [\#6000](https://github.com/ClickHouse/ClickHouse/pull/6000) ([Quid37](https://github.com/Quid37)) +- Added functions for working with the сustom week number [\#5212](https://github.com/ClickHouse/ClickHouse/pull/5212) ([Cristina Andrés](https://github.com/andyyzh)) +- `RENAME` las consultas ahora funcionan con todos los almacenes. [\#5953](https://github.com/ClickHouse/ClickHouse/pull/5953) ([Ivan](https://github.com/abyss7)) +- Ahora el cliente recibe registros del servidor con cualquier nivel deseado configurando `send_logs_level` independientemente del nivel de registro especificado en la configuración del servidor. [\#5964](https://github.com/ClickHouse/ClickHouse/pull/5964) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-4} + +- Configuración `input_format_defaults_for_omitted_fields` está habilitado de forma predeterminada. Las inserciones en las tablas distribuidas necesitan que esta configuración sea la misma en el clúster (debe configurarla antes de actualizar). Permite el cálculo de expresiones predeterminadas complejas para campos omitidos en `JSONEachRow` y `CSV*` formato. Debe ser el comportamiento esperado, pero puede conducir a una diferencia de rendimiento insignificante. [\#6043](https://github.com/ClickHouse/ClickHouse/pull/6043) ([Artem Zuikov](https://github.com/4ertus2)), [\#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) + +#### Experimental características {#experimental-features} + +- Nueva canalización de procesamiento de consultas. Utilizar `experimental_use_processors=1` opción para habilitarlo. Úselo para su propio problema. [\#4914](https://github.com/ClickHouse/ClickHouse/pull/4914) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Corrección de errores {#bug-fix-13} + +- Kafka integración se ha fijado en esta versión. +- Fijo `DoubleDelta` codificación de `Int64` para grandes `DoubleDelta` valores mejorados `DoubleDelta` codificación de datos aleatorios para `Int32`. [\#5998](https://github.com/ClickHouse/ClickHouse/pull/5998) ([Vasily Nemkov](https://github.com/Enmk)) +- Sobreestimación fija de `max_rows_to_read` si el ajuste `merge_tree_uniform_read_distribution` se establece en 0. [\#6019](https://github.com/ClickHouse/ClickHouse/pull/6019) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejora {#improvement-4} + +- Lanza una excepción si `config.d` el archivo no tiene el elemento raíz correspondiente como el archivo de configuración [\#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([Dimarub2000](https://github.com/dimarub2000)) + +#### Mejora del rendimiento {#performance-improvement-3} + +- Optimizar `count()`. Ahora usa la columna más pequeña (si es posible). [\#6028](https://github.com/ClickHouse/ClickHouse/pull/6028) ([Amos pájaro](https://github.com/amosbird)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-5} + +- Informe sobre el uso de memoria en las pruebas de rendimiento. [\#5899](https://github.com/ClickHouse/ClickHouse/pull/5899) ([akuzm](https://github.com/akuzm)) +- Corregir compilación con externo `libcxx` [\#6010](https://github.com/ClickHouse/ClickHouse/pull/6010) ([Ivan](https://github.com/abyss7)) +- Reparar compilación compartida con `rdkafka` biblioteca [\#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) + +## Lanzamiento de ClickHouse 19.11 {#clickhouse-release-19-11} + +### Lanzamiento de ClickHouse 19.11.13.74, 2019-11-01 {#clickhouse-release-19-11-13-74-2019-11-01} + +#### Corrección de errores {#bug-fix-14} + +- Se corrigió un accidente raro en `ALTER MODIFY COLUMN` y fusión vertical cuando una de las partes fusionadas / alteradas está vacía (0 filas). [\#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) +- Actualización manual de `SIMDJSON`. Esto corrige la posible inundación de archivos stderr con mensajes de diagnóstico json falsos. [\#7548](https://github.com/ClickHouse/ClickHouse/pull/7548) ([Alejandro Kazakov](https://github.com/Akazz)) +- Corregido error con `mrk` extensión de archivo para mutaciones ([alesapin](https://github.com/alesapin)) + +### Lanzamiento de ClickHouse 19.11.12.69, 2019-10-02 {#clickhouse-release-19-11-12-69-2019-10-02} + +#### Corrección de errores {#bug-fix-15} + +- Se corrigió la degradación del rendimiento del análisis de índices en claves complejas en tablas grandes. Esto corrige [\#6924](https://github.com/ClickHouse/ClickHouse/issues/6924). [\#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evite SIGSEGV raro al enviar datos en tablas con motor distribuido (`Failed to send batch: file with index XXXXX is absent`). [\#7032](https://github.com/ClickHouse/ClickHouse/pull/7032) ([Azat Khuzhin](https://github.com/azat)) +- Fijar `Unknown identifier` con múltiples uniones. Esto corrige [\#5254](https://github.com/ClickHouse/ClickHouse/issues/5254). [\#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) + +### Lanzamiento de ClickHouse 19.11.11.57, 2019-09-13 {#clickhouse-release-19-11-11-57-2019-09-13} + +- Corregir el error lógico que causa segfaults al seleccionar el tema vacío de Kafka. [\#6902](https://github.com/ClickHouse/ClickHouse/issues/6902) [\#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) +- Solución para la función `АrrayEnumerateUniqRanked` con matrices vacías en params. [\#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([propulsor](https://github.com/proller)) + +### Lanzamiento de ClickHouse 19.11.10.54, 2019-09-10 {#clickhouse-release-19-11-10-54-2019-09-10} + +#### Corrección de errores {#bug-fix-16} + +- Almacene los desplazamientos para los mensajes de Kafka manualmente para poder confirmarlos todos a la vez para todas las particiones. Corrige la duplicación potencial en “one consumer - many partitions” escenario. [\#6872](https://github.com/ClickHouse/ClickHouse/pull/6872) ([Ivan](https://github.com/abyss7)) + +### Lanzamiento de ClickHouse 19.11.9.52, 2019-09-6 {#clickhouse-release-19-11-9-52-2019-09-6} + +- Mejorar el manejo de errores en los diccionarios de caché. [\#6737](https://github.com/ClickHouse/ClickHouse/pull/6737) ([Vitaly Baranov](https://github.com/vitlibar)) +- Corregido error en la función `arrayEnumerateUniqRanked`. [\#6779](https://github.com/ClickHouse/ClickHouse/pull/6779) ([propulsor](https://github.com/proller)) +- Fijar `JSONExtract` función mientras se extrae un `Tuple` de JSON. [\#6718](https://github.com/ClickHouse/ClickHouse/pull/6718) ([Vitaly Baranov](https://github.com/vitlibar)) +- Se corrigió la posible pérdida de datos después de `ALTER DELETE` consulta en la tabla con índice de omisión. [\#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [\#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) +- Prueba de rendimiento fija. [\#6392](https://github.com/ClickHouse/ClickHouse/pull/6392) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Parquet: Fijar la lectura de columnas booleanos. [\#6579](https://github.com/ClickHouse/ClickHouse/pull/6579) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregido el comportamiento incorrecto de `nullIf` función de argumentos constantes. [\#6518](https://github.com/ClickHouse/ClickHouse/pull/6518) ([Guillaume Tassery](https://github.com/YiuRULE)) [\#6580](https://github.com/ClickHouse/ClickHouse/pull/6580) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Solucione el problema de duplicación de mensajes de Kafka en el reinicio normal del servidor. [\#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) +- Se ha corregido un problema durante mucho tiempo `ALTER UPDATE` o `ALTER DELETE` puede evitar que se ejecuten fusiones regulares. Evite que las mutaciones se ejecuten si no hay suficientes subprocesos libres disponibles. [\#6502](https://github.com/ClickHouse/ClickHouse/issues/6502) [\#6617](https://github.com/ClickHouse/ClickHouse/pull/6617) ([Tavplubix](https://github.com/tavplubix)) +- Corregido el error con el procesamiento “timezone” en el archivo de configuración del servidor. [\#6709](https://github.com/ClickHouse/ClickHouse/pull/6709) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Repara las pruebas de kafka. [\#6805](https://github.com/ClickHouse/ClickHouse/pull/6805) ([Ivan](https://github.com/abyss7)) + +#### Corrección de seguridad {#security-fix-3} + +- Si el atacante tiene acceso de escritura a ZooKeeper y es capaz de ejecutar servidor personalizado disponible desde la red donde se ejecuta ClickHouse, puede crear servidor malicioso personalizado que actuará como réplica ClickHouse y registrarlo en ZooKeeper. Cuando otra réplica recuperará la parte de datos de una réplica maliciosa, puede forzar a clickhouse-server a escribir en una ruta arbitraria en el sistema de archivos. Encontrado por Eldar Zaitov, equipo de seguridad de la información en Yandex. [\#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.11.8.46, 2019-08-22 {#clickhouse-release-19-11-8-46-2019-08-22} + +#### Corrección de errores {#bug-fix-17} + +- Fijar `ALTER TABLE ... UPDATE` consulta para tablas con `enable_mixed_granularity_parts=1`. [\#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Repare NPE al usar la cláusula IN con una subconsulta con una tupla. [\#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [\#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([Tavplubix](https://github.com/tavplubix)) +- Se ha solucionado un problema por el que si una réplica obsoleta cobra vida, puede que aún tenga partes de datos eliminadas por DROP PARTITION. [\#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [\#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([Tavplubix](https://github.com/tavplubix)) +- Solucionado el problema con el análisis CSV [\#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [\#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([Tavplubix](https://github.com/tavplubix)) +- Carrera de datos fija en el sistema.tabla de piezas y consulta ALTER. Esto corrige [\#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [\#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el código incorrecto en las mutaciones que pueden conducir a la corrupción de la memoria. segfault fijo con lectura de la dirección `0x14c0` que puede happed debido a concurrente `DROP TABLE` y `SELECT` de `system.parts` o `system.parts_columns`. Condición de carrera fija en la preparación de consultas de mutación. Estancamiento fijo causado por `OPTIMIZE` de tablas replicadas y operaciones de modificación simultáneas como ALTERs. [\#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.11.7.40, 2019-08-14 {#clickhouse-release-19-11-7-40-2019-08-14} + +#### Corrección de errores {#bug-fix-18} + +- Kafka integración se ha fijado en esta versión. +- Corregir segfault cuando se usa `arrayReduce` para argumentos constantes. [\#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijo `toFloat()` monotonicidad. [\#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([Dimarub2000](https://github.com/dimarub2000)) +- Reparar segfault con habilitado `optimize_skip_unused_shards` y falta la clave de fragmentación. [\#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([CurtizJ](https://github.com/CurtizJ)) +- Lógica fija de `arrayEnumerateUniqRanked` función. [\#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se eliminó el registro detallado adicional del controlador MySQL. [\#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir el comportamiento incorrecto y posibles fallas en `topK` y `topKWeighted` funciones agregadas. [\#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([CurtizJ](https://github.com/CurtizJ)) +- No exponga columnas virtuales en `system.columns` tabla. Esto es necesario para la compatibilidad con versiones anteriores. [\#6406](https://github.com/ClickHouse/ClickHouse/pull/6406) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir un error con la asignación de memoria para campos de cadena en el diccionario de caché de claves complejas. [\#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) +- Corregir un error al habilitar la granularidad adaptativa al crear una nueva réplica para `Replicated*MergeTree` tabla. [\#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) +- Corregir bucle infinito al leer los mensajes de Kafka. [\#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([abyss7](https://github.com/abyss7)) +- Se corrigió la posibilidad de que una consulta fabricada causara un bloqueo del servidor debido al desbordamiento de la pila en el analizador SQL y la posibilidad de desbordamiento de la pila en `Merge` y `Distributed` tabla [\#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregido el error de codificación Gorilla en pequeñas secuencias. [\#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Enmk](https://github.com/Enmk)) + +#### Mejora {#improvement-5} + +- Permitir al usuario anular `poll_interval` y `idle_connection_timeout` configuración en la conexión. [\#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.11.5.28, 2019-08-05 {#clickhouse-release-19-11-5-28-2019-08-05} + +#### Corrección de errores {#bug-fix-19} + +- Se corrigió la posibilidad de colgar consultas cuando el servidor está sobrecargado. [\#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reparar FPE en la función yandexConsistentHash. Esto corrige [\#6304](https://github.com/ClickHouse/ClickHouse/issues/6304). [\#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregido error en la conversión de `LowCardinality` tipos en `AggregateFunctionFactory`. Esto corrige [\#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [\#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir el análisis de `bool` ajustes de `true` y `false` en los archivos de configuración. [\#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) +- Corrige un error raro con encabezados de flujo incompatibles en consultas para `Distributed` mesa sobre `MergeTree` mesa cuando parte de `WHERE` se mueve a `PREWHERE`. [\#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) +- Se corrigió el desbordamiento en la división de enteros de tipo con signo a tipo sin signo. Esto corrige [\#6214](https://github.com/ClickHouse/ClickHouse/issues/6214). [\#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-5} + +- `Kafka` todavía roto. + +### Lanzamiento de ClickHouse 19.11.4.24, 2019-08-01 {#clickhouse-release-19-11-4-24-2019-08-01} + +#### Corrección de errores {#bug-fix-20} + +- Corregir un error al escribir marcas de índices secundarios con granularidad adaptativa. [\#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) +- Fijar `WITH ROLLUP` y `WITH CUBE` modificadores de `GROUP BY` con agregación de dos niveles. [\#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) +- Cuelgue fijo adentro `JSONExtractRaw` función. Fijo [\#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [\#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reparar segfault en ExternalLoader :: loadOutdated (). [\#6082](https://github.com/ClickHouse/ClickHouse/pull/6082) ([Vitaly Baranov](https://github.com/vitlibar)) +- Se corrigió el caso en el que el servidor podía cerrar sockets de escucha pero no apagar y continuar sirviendo las consultas restantes. Puede terminar con dos procesos de servidor de clickhouse en ejecución. A veces, el servidor puede devolver un error `bad_function_call` para las consultas restantes. [\#6231](https://github.com/ClickHouse/ClickHouse/pull/6231) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la condición inútil e incorrecta en el campo de actualización para la carga inicial de diccionarios externos a través de ODBC, MySQL, ClickHouse y HTTP. Esto corrige [\#6069](https://github.com/ClickHouse/ClickHouse/issues/6069) [\#6083](https://github.com/ClickHouse/ClickHouse/pull/6083) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió una excepción irrelevante en el elenco de `LowCardinality(Nullable)` to not-Nullable column in case if it doesn't contain Nulls (e.g. in query like `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String)`. [\#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [\#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fijar resultado no determinista de “uniq” función agregada en casos extremos raros. El error estaba presente en todas las versiones de ClickHouse. [\#6058](https://github.com/ClickHouse/ClickHouse/pull/6058) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Segfault cuando establecemos un CIDR demasiado alto en la función `IPv6CIDRToRange`. [\#6068](https://github.com/ClickHouse/ClickHouse/pull/6068) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Se corrigió una pequeña pérdida de memoria cuando el servidor lanzaba muchas excepciones de muchos contextos diferentes. [\#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Soluciona la situación cuando el consumidor se detuvo antes de la suscripción y no se reanudó después. [\#6075](https://github.com/ClickHouse/ClickHouse/pull/6075) ([Ivan](https://github.com/abyss7)) Tenga en cuenta que Kafka está roto en esta versión. +- Borrar el búfer de datos Kafka de la operación de lectura anterior que se completó con un error [\#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/bopohaa)) Tenga en cuenta que Kafka está roto en esta versión. +- Ya `StorageMergeTree::background_task_handle` se inicializa en `startup()` el `MergeTreeBlockOutputStream::write()` puede intentar usarlo antes de la inicialización. Solo verifique si está inicializado. [\#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-6} + +- Añadido oficial `rpm` paquete. [\#5740](https://github.com/ClickHouse/ClickHouse/pull/5740) ([propulsor](https://github.com/proller)) ([alesapin](https://github.com/alesapin)) +- Añadir una habilidad para construir `.rpm` y `.tgz` paquetes con `packager` script. [\#5769](https://github.com/ClickHouse/ClickHouse/pull/5769) ([alesapin](https://github.com/alesapin)) +- Correcciones para “Arcadia” sistema de construcción. [\#6223](https://github.com/ClickHouse/ClickHouse/pull/6223) ([propulsor](https://github.com/proller)) + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-6} + +- `Kafka` está roto en esta versión. + +### Lanzamiento de ClickHouse 19.11.3.11, 2019-07-18 {#clickhouse-release-19-11-3-11-2019-07-18} + +#### Novedad {#new-feature-6} + +- Se agregó soporte para declaraciones preparadas. [\#5331](https://github.com/ClickHouse/ClickHouse/pull/5331/) ([Alejandro](https://github.com/sanych73)) [\#5630](https://github.com/ClickHouse/ClickHouse/pull/5630) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `DoubleDelta` y `Gorilla` codecs de columna [\#5600](https://github.com/ClickHouse/ClickHouse/pull/5600) ([Vasily Nemkov](https://github.com/Enmk)) +- Añadir `os_thread_priority` ajuste que permite controlar el “nice” valor de los subprocesos de procesamiento de consultas que utiliza el sistema operativo para ajustar la prioridad de programación dinámica. Requiere `CAP_SYS_NICE` capacidades para trabajar. Esto implementa [\#5858](https://github.com/ClickHouse/ClickHouse/issues/5858) [\#5909](https://github.com/ClickHouse/ClickHouse/pull/5909) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implementar `_topic`, `_offset`, `_key` columnas para el motor Kafka [\#5382](https://github.com/ClickHouse/ClickHouse/pull/5382) ([Ivan](https://github.com/abyss7)) Tenga en cuenta que Kafka está roto en esta versión. +- Añadir combinador de funciones agregadas `-Resample` [\#5590](https://github.com/ClickHouse/ClickHouse/pull/5590) ([Hcz](https://github.com/hczhcz)) +- Funciones agregadas `groupArrayMovingSum(win_size)(x)` y `groupArrayMovingAvg(win_size)(x)`, que calculan la suma / avg en movimiento con o sin limitación de tamaño de ventana. [\#5595](https://github.com/ClickHouse/ClickHouse/pull/5595) ([Sistema abierto.](https://github.com/inv2004)) +- Agregar sinónimo `arrayFlatten` \<-\> `flatten` [\#5764](https://github.com/ClickHouse/ClickHouse/pull/5764) ([Hcz](https://github.com/hczhcz)) +- Función Intergate H3 `geoToH3` de Uber. [\#4724](https://github.com/ClickHouse/ClickHouse/pull/4724) ([Remen Ivan](https://github.com/BHYCHIK)) [\#5805](https://github.com/ClickHouse/ClickHouse/pull/5805) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Corrección de errores {#bug-fix-21} + +- Implementar caché DNS con actualización asincrónica. El subproceso separado resuelve todos los hosts y actualiza la caché DNS con el punto (configuración `dns_cache_update_period`). Debería ayudar, cuando la ip de los hosts cambia con frecuencia. [\#5857](https://github.com/ClickHouse/ClickHouse/pull/5857) ([Anton Popov](https://github.com/CurtizJ)) +- Arreglar segfault en `Delta` codec que afecta a columnas con valores de menos de 32 bits. El error llevó a la corrupción de memoria aleatoria. [\#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) +- Fix segfault en TTL se fusionan con columnas no físicas en el bloque. [\#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) +- Corregir un error raro en la comprobación de la parte con `LowCardinality` columna. Previamente `checkDataPart` siempre falla para parte con `LowCardinality` columna. [\#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) +- Evite colgar conexiones cuando el grupo de subprocesos del servidor esté lleno. Es importante para las conexiones desde `remote` función de tabla o conexiones a un fragmento sin réplicas cuando hay un tiempo de espera de conexión largo. Esto corrige [\#5878](https://github.com/ClickHouse/ClickHouse/issues/5878) [\#5881](https://github.com/ClickHouse/ClickHouse/pull/5881) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Soporte para argumentos constantes para `evalMLModel` función. Esto corrige [\#5817](https://github.com/ClickHouse/ClickHouse/issues/5817) [\#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se ha solucionado el problema cuando ClickHouse determina la zona horaria predeterminada como `UCT` en lugar de `UTC`. Esto corrige [\#5804](https://github.com/ClickHouse/ClickHouse/issues/5804). [\#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijo desbordamiento del búfer en `visitParamExtractRaw`. Esto corrige [\#5901](https://github.com/ClickHouse/ClickHouse/issues/5901) [\#5902](https://github.com/ClickHouse/ClickHouse/pull/5902) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora distribuido `DROP/ALTER/TRUNCATE/OPTIMIZE ON CLUSTER` las consultas se ejecutarán directamente en la réplica del líder. [\#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) +- Fijar `coalesce` para `ColumnConst` con `ColumnNullable` + cambios relacionados. [\#5755](https://github.com/ClickHouse/ClickHouse/pull/5755) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijar el `ReadBufferFromKafkaConsumer` para que siga leyendo nuevos mensajes después `commit()` incluso si estaba estancado antes [\#5852](https://github.com/ClickHouse/ClickHouse/pull/5852) ([Ivan](https://github.com/abyss7)) +- Fijar `FULL` y `RIGHT` Resultados de JOIN al unirse en `Nullable` teclas en la mesa derecha. [\#5859](https://github.com/ClickHouse/ClickHouse/pull/5859) ([Artem Zuikov](https://github.com/4ertus2)) +- Posible solución de sueño infinito de consultas de baja prioridad. [\#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir la condición de carrera, lo que hace que algunas consultas no aparezcan en query\_log después `SYSTEM FLUSH LOGS` consulta. [\#5456](https://github.com/ClickHouse/ClickHouse/issues/5456) [\#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) +- Fijo `heap-use-after-free` ASan advertencia en ClusterCopier causada por el reloj que intenta usar el objeto de copiadora ya eliminado. [\#5871](https://github.com/ClickHouse/ClickHouse/pull/5871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregido mal `StringRef` puntero devuelto por algunas implementaciones de `IColumn::deserializeAndInsertFromArena`. Este error afectó solo a las pruebas unitarias. [\#5973](https://github.com/ClickHouse/ClickHouse/pull/5973) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Evite que la matriz de origen y la matriz intermedia se unan a columnas de enmascaramiento de columnas del mismo nombre. [\#5941](https://github.com/ClickHouse/ClickHouse/pull/5941) ([Artem Zuikov](https://github.com/4ertus2)) +- Solucione la inserción y seleccione la consulta al motor MySQL con citas de identificador de estilo MySQL. [\#5704](https://github.com/ClickHouse/ClickHouse/pull/5704) ([Invierno Zhang](https://github.com/zhang2014)) +- Ahora `CHECK TABLE` consulta puede trabajar con la familia del motor MergeTree. Devuelve el estado de verificación y el mensaje si hay alguno para cada parte (o archivo en caso de motores más simples). Además, corrija el error en la búsqueda de una parte rota. [\#5865](https://github.com/ClickHouse/ClickHouse/pull/5865) ([alesapin](https://github.com/alesapin)) +- Reparar el tiempo de ejecución SPLIT\_SHARED\_LIBRARIES [\#5793](https://github.com/ClickHouse/ClickHouse/pull/5793) ([Más información](https://github.com/danlark1)) +- Inicialización de zona horaria fija cuando `/etc/localtime` es un enlace simbólico relativo como `../usr/share/zoneinfo/Europe/Moscow` [\#5922](https://github.com/ClickHouse/ClickHouse/pull/5922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- clickhouse-copiadora: Solucionar el uso-después de la libertad en el apagado [\#5752](https://github.com/ClickHouse/ClickHouse/pull/5752) ([propulsor](https://github.com/proller)) +- Actualizar `simdjson`. Se corrigió el problema de que algunos JSON no válidos con cero bytes analizaran correctamente. [\#5938](https://github.com/ClickHouse/ClickHouse/pull/5938) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reparar el cierre de SystemLogs [\#5802](https://github.com/ClickHouse/ClickHouse/pull/5802) ([Anton Popov](https://github.com/CurtizJ)) +- Arreglar colgando cuando la condición en invalidate\_query depende de un diccionario. [\#6011](https://github.com/ClickHouse/ClickHouse/pull/6011) ([Vitaly Baranov](https://github.com/vitlibar)) + +#### Mejora {#improvement-6} + +- Permitir direcciones no resolubles en la configuración del clúster. Se considerarán no disponibles y se intentarán resolver en cada intento de conexión. Esto es especialmente útil para Kubernetes. Esto corrige [\#5714](https://github.com/ClickHouse/ClickHouse/issues/5714) [\#5924](https://github.com/ClickHouse/ClickHouse/pull/5924) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cierre las conexiones TCP inactivas (con un tiempo de espera de una hora por defecto). Esto es especialmente importante para clústeres grandes con múltiples tablas distribuidas en cada servidor, ya que cada servidor puede mantener un grupo de conexiones con cualquier otro servidor, y después de la concurrencia de consultas pico, las conexiones se detendrán. Esto corrige [\#5879](https://github.com/ClickHouse/ClickHouse/issues/5879) [\#5880](https://github.com/ClickHouse/ClickHouse/pull/5880) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejor calidad de `topK` función. Se ha cambiado el comportamiento del conjunto SavingSpace para eliminar el último elemento si el nuevo elemento tiene un peso mayor. [\#5833](https://github.com/ClickHouse/ClickHouse/issues/5833) [\#5850](https://github.com/ClickHouse/ClickHouse/pull/5850) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Las funciones de URL para trabajar con dominios ahora pueden funcionar para URL incompletas sin esquema [\#5725](https://github.com/ClickHouse/ClickHouse/pull/5725) ([alesapin](https://github.com/alesapin)) +- Sumas de comprobación añadidas al `system.parts_columns` tabla. [\#5874](https://github.com/ClickHouse/ClickHouse/pull/5874) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Añadir `Enum` tipo de datos como un sinónimo para `Enum8` o `Enum16`. [\#5886](https://github.com/ClickHouse/ClickHouse/pull/5886) ([Dimarub2000](https://github.com/dimarub2000)) +- Variante de transposición de bits completa para `T64` códec. Podría conducir a una mejor compresión con `zstd`. [\#5742](https://github.com/ClickHouse/ClickHouse/pull/5742) ([Artem Zuikov](https://github.com/4ertus2)) +- Condición en `startsWith` la función ahora puede utilizar la clave principal. Esto corrige [\#5310](https://github.com/ClickHouse/ClickHouse/issues/5310) y [\#5882](https://github.com/ClickHouse/ClickHouse/issues/5882) [\#5919](https://github.com/ClickHouse/ClickHouse/pull/5919) ([Dimarub2000](https://github.com/dimarub2000)) +- Permitir usar `clickhouse-copier` con la topología de clúster de replicación cruzada permitiendo el nombre de base de datos vacío. [\#5745](https://github.com/ClickHouse/ClickHouse/pull/5745) ([Nombre de la red inalámbrica (SSID):](https://github.com/nvartolomei)) +- Utilizar `UTC` como zona horaria predeterminada en un sistema sin `tzdata` (e.g. bare Docker container). Before this patch, error message `Could not determine local time zone` se imprimió y el servidor o el cliente se negó a iniciar. [\#5827](https://github.com/ClickHouse/ClickHouse/pull/5827) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Soporte devuelto para argumento de coma flotante en función `quantileTiming` para la compatibilidad con versiones anteriores. [\#5911](https://github.com/ClickHouse/ClickHouse/pull/5911) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mostrar qué tabla falta la columna en los mensajes de error. [\#5768](https://github.com/ClickHouse/ClickHouse/pull/5768) ([Ivan](https://github.com/abyss7)) +- No permitir la consulta de ejecución con el mismo query\_id por varios usuarios [\#5430](https://github.com/ClickHouse/ClickHouse/pull/5430) ([propulsor](https://github.com/proller)) +- Código más robusto para enviar métricas a Graphite. Funcionará incluso durante largos múltiples `RENAME TABLE` operación. [\#5875](https://github.com/ClickHouse/ClickHouse/pull/5875) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se mostrarán mensajes de error más informativos cuando ThreadPool no pueda programar una tarea para su ejecución. Esto corrige [\#5305](https://github.com/ClickHouse/ClickHouse/issues/5305) [\#5801](https://github.com/ClickHouse/ClickHouse/pull/5801) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Invertir ngramSearch para que sea más intuitivo [\#5807](https://github.com/ClickHouse/ClickHouse/pull/5807) ([Más información](https://github.com/danlark1)) +- Agregar análisis de usuario en el generador de motor HDFS [\#5946](https://github.com/ClickHouse/ClickHouse/pull/5946) ([akonyaev90](https://github.com/akonyaev90)) +- Actualizar el valor predeterminado de `max_ast_elements parameter` [\#5933](https://github.com/ClickHouse/ClickHouse/pull/5933) ([Artem Konovalov](https://github.com/izebit)) +- Se agregó una noción de configuraciones obsoletas. La configuración obsoleta `allow_experimental_low_cardinality_type` se puede utilizar sin efecto. [0f15c01c6802f7ce1a1494c12c846be8c98944cd](https://github.com/ClickHouse/ClickHouse/commit/0f15c01c6802f7ce1a1494c12c846be8c98944cd) [Alexey Milovidov](https://github.com/alexey-milovidov) + +#### Mejora del rendimiento {#performance-improvement-4} + +- Aumente el número de secuencias a SELECT desde la tabla Merge para una distribución más uniforme de los subprocesos. Añadido `max_streams_multiplier_for_merge_tables`. Esto corrige [\#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [\#5915](https://github.com/ClickHouse/ClickHouse/pull/5915) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-7} + +- Agregue una prueba de compatibilidad con versiones anteriores para la interacción cliente-servidor con diferentes versiones de clickhouse. [\#5868](https://github.com/ClickHouse/ClickHouse/pull/5868) ([alesapin](https://github.com/alesapin)) +- Pruebe la información de cobertura en cada solicitud de confirmación y extracción. [\#5896](https://github.com/ClickHouse/ClickHouse/pull/5896) ([alesapin](https://github.com/alesapin)) +- Coopere con el desinfectante de direcciones para respaldar nuestros asignadores personalizados (`Arena` y `ArenaWithFreeLists`) para una mejor depuración de “use-after-free” error. [\#5728](https://github.com/ClickHouse/ClickHouse/pull/5728) ([akuzm](https://github.com/akuzm)) +- Cambiar a [Implementación de LLVM libunwind](https://github.com/llvm-mirror/libunwind) para el manejo de excepciones de C ++ y para la impresión de rastreos de pila [\#4828](https://github.com/ClickHouse/ClickHouse/pull/4828) ([Vídeos relacionados con nikita Lapkov](https://github.com/laplab)) +- Agregue dos advertencias más de -Weverything [\#5923](https://github.com/ClickHouse/ClickHouse/pull/5923) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Permitir construir ClickHouse con Memory Sanitizer. [\#3949](https://github.com/ClickHouse/ClickHouse/pull/3949) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Informe ubsan fijo sobre `bitTest` función en la prueba de fuzz. [\#5943](https://github.com/ClickHouse/ClickHouse/pull/5943) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Docker: se agregó la posibilidad de iniciar una instancia de ClickHouse que requiere autenticación. [\#5727](https://github.com/ClickHouse/ClickHouse/pull/5727) ([Korviakov Andrey](https://github.com/shurshun)) +- Actualizar librdkafka a la versión 1.1.0 [\#5872](https://github.com/ClickHouse/ClickHouse/pull/5872) ([Ivan](https://github.com/abyss7)) +- Agregue el tiempo de espera global para las pruebas de integración y deshabilite algunas de ellas en el código de pruebas. [\#5741](https://github.com/ClickHouse/ClickHouse/pull/5741) ([alesapin](https://github.com/alesapin)) +- Solucionar algunas fallas ThreadSanitizer. [\#5854](https://github.com/ClickHouse/ClickHouse/pull/5854) ([akuzm](https://github.com/akuzm)) +- El `--no-undefined` opción obliga al enlazador a verificar la existencia de todos los nombres externos mientras se vincula. Es muy útil rastrear dependencias reales entre bibliotecas en el modo de compilación dividida. [\#5855](https://github.com/ClickHouse/ClickHouse/pull/5855) ([Ivan](https://github.com/abyss7)) +- Prueba de rendimiento añadida para [\#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [\#5914](https://github.com/ClickHouse/ClickHouse/pull/5914) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Compatibilidad fija con gcc-7. [\#5840](https://github.com/ClickHouse/ClickHouse/pull/5840) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó soporte para gcc-9. Esto corrige [\#5717](https://github.com/ClickHouse/ClickHouse/issues/5717) [\#5774](https://github.com/ClickHouse/ClickHouse/pull/5774) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el error cuando libunwind se puede vincular incorrectamente. [\#5948](https://github.com/ClickHouse/ClickHouse/pull/5948) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigieron algunas advertencias encontradas por PVS-Studio. [\#5921](https://github.com/ClickHouse/ClickHouse/pull/5921) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó soporte inicial para `clang-tidy` analizador estático. [\#5806](https://github.com/ClickHouse/ClickHouse/pull/5806) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Convertir macros endian BSD/Linux( ‘be64toh’ y ‘htobe64’) a los equivalentes de Mac OS X [\#5785](https://github.com/ClickHouse/ClickHouse/pull/5785) ([Fuente Chen](https://github.com/fredchenbj)) +- Guía de pruebas de integración mejorada. [\#5796](https://github.com/ClickHouse/ClickHouse/pull/5796) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Reparación de compilación en macosx + gcc9 [\#5822](https://github.com/ClickHouse/ClickHouse/pull/5822) ([filimonov](https://github.com/filimonov)) +- Corrige un error tipográfico difícil de detectar: aggreAGte -\> agregado. [\#5753](https://github.com/ClickHouse/ClickHouse/pull/5753) ([akuzm](https://github.com/akuzm)) +- Arreglar la compilación freebsd [\#5760](https://github.com/ClickHouse/ClickHouse/pull/5760) ([propulsor](https://github.com/proller)) +- Añadir enlace al canal experimental de YouTube al sitio web [\#5845](https://github.com/ClickHouse/ClickHouse/pull/5845) ([Ivan Blinkov](https://github.com/blinkov)) +- CMake: agregar opción para indicadores de cobertura: WITH\_COVERAGE [\#5776](https://github.com/ClickHouse/ClickHouse/pull/5776) ([propulsor](https://github.com/proller)) +- Corrige el tamaño inicial de algunos PODArray en línea. [\#5787](https://github.com/ClickHouse/ClickHouse/pull/5787) ([akuzm](https://github.com/akuzm)) +- clickhouse-servidor.postinst: arreglar la detección del sistema operativo para centos 6 [\#5788](https://github.com/ClickHouse/ClickHouse/pull/5788) ([propulsor](https://github.com/proller)) +- Se agregó la generación de paquetes Arch Linux. [\#5719](https://github.com/ClickHouse/ClickHouse/pull/5719) ([Vladimir Chebotarev](https://github.com/excitoon)) +- División Común / config.h por libs (dbms) [\#5715](https://github.com/ClickHouse/ClickHouse/pull/5715) ([propulsor](https://github.com/proller)) +- Correcciones para “Arcadia” plataforma de construcción [\#5795](https://github.com/ClickHouse/ClickHouse/pull/5795) ([propulsor](https://github.com/proller)) +- Correcciones para construcción no convencional (gcc9, sin submódulos) [\#5792](https://github.com/ClickHouse/ClickHouse/pull/5792) ([propulsor](https://github.com/proller)) +- Requerir un tipo explícito en unignmentStore porque se demostró que era propenso a errores [\#5791](https://github.com/ClickHouse/ClickHouse/pull/5791) ([akuzm](https://github.com/akuzm)) +- Corrige la compilación de MacOS [\#5830](https://github.com/ClickHouse/ClickHouse/pull/5830) ([filimonov](https://github.com/filimonov)) +- Prueba de rendimiento relativa a la nueva característica JIT con un conjunto de datos más grande, como se solicita aquí [\#5263](https://github.com/ClickHouse/ClickHouse/issues/5263) [\#5887](https://github.com/ClickHouse/ClickHouse/pull/5887) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Ejecutar pruebas con estado en la prueba de esfuerzo [12693e568722f11e19859742f56428455501fd2a](https://github.com/ClickHouse/ClickHouse/commit/12693e568722f11e19859742f56428455501fd2a) ([alesapin](https://github.com/alesapin)) + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-7} + +- `Kafka` está roto en esta versión. +- Permitir `adaptive_index_granularity` = 10MB por defecto para nuevo `MergeTree` tabla. Si creó nuevas tablas MergeTree en la versión 19.11+, será imposible degradar a versiones anteriores a la 19.6. [\#5628](https://github.com/ClickHouse/ClickHouse/pull/5628) ([alesapin](https://github.com/alesapin)) +- Eliminado diccionarios incrustados no documentados obsoletos que fueron utilizados por Yandex.Métrica. Función `OSIn`, `SEIn`, `OSToRoot`, `SEToRoot`, `OSHierarchy`, `SEHierarchy` ya no están disponibles. Si está utilizando estas funciones, escriba un correo electrónico a clickhouse-feedback@yandex-team.com. Nota: en el último momento decidimos mantener estas funciones por un tiempo. [\#5780](https://github.com/ClickHouse/ClickHouse/pull/5780) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## Lanzamiento de ClickHouse 19.10 {#clickhouse-release-19-10} + +### Lanzamiento de ClickHouse 19.10.1.5, 2019-07-12 {#clickhouse-release-19-10-1-5-2019-07-12} + +#### Novedad {#new-feature-7} + +- Agregar nuevo códec de columna: `T64`. Hecho para columnas (U) IntX / EnumX / Data (Time) / DecimalX. Debería ser bueno para columnas con valores de rango constante o pequeño. Codec en sí permite ampliar o reducir el tipo de datos sin volver a comprimir. [\#5557](https://github.com/ClickHouse/ClickHouse/pull/5557) ([Artem Zuikov](https://github.com/4ertus2)) +- Agregar motor de base de datos `MySQL` que permiten ver todas las tablas en el servidor MySQL remoto [\#5599](https://github.com/ClickHouse/ClickHouse/pull/5599) ([Invierno Zhang](https://github.com/zhang2014)) +- `bitmapContains` aplicación. Es 2 veces más rápido que `bitmapHasAny` si el segundo mapa de bits contiene un elemento. [\#5535](https://github.com/ClickHouse/ClickHouse/pull/5535) ([Zhichang Yu](https://github.com/yuzhichang)) +- Soporte para `crc32` función (con comportamiento exactamente como en MySQL o PHP). No lo use si necesita una función hash. [\#5661](https://github.com/ClickHouse/ClickHouse/pull/5661) ([Remen Ivan](https://github.com/BHYCHIK)) +- Aplicado `SYSTEM START/STOP DISTRIBUTED SENDS` consultas para controlar inserciones asincrónicas en `Distributed` tabla. [\#4935](https://github.com/ClickHouse/ClickHouse/pull/4935) ([Invierno Zhang](https://github.com/zhang2014)) + +#### Corrección de errores {#bug-fix-22} + +- Ignore los límites de ejecución de consultas y el tamaño máximo de partes para los límites de combinación mientras ejecuta mutaciones. [\#5659](https://github.com/ClickHouse/ClickHouse/pull/5659) ([Anton Popov](https://github.com/CurtizJ)) +- Corregir un error que puede conducir a la desduplicación de bloques normales (extremadamente raros) y la inserción de bloques duplicados (más a menudo). [\#5549](https://github.com/ClickHouse/ClickHouse/pull/5549) ([alesapin](https://github.com/alesapin)) +- Fijación de la función `arrayEnumerateUniqRanked` para argumentos con matrices vacías [\#5559](https://github.com/ClickHouse/ClickHouse/pull/5559) ([propulsor](https://github.com/proller)) +- No se suscriba a los temas de Kafka sin la intención de sondear ningún mensaje. [\#5698](https://github.com/ClickHouse/ClickHouse/pull/5698) ([Ivan](https://github.com/abyss7)) +- Hacer configuración `join_use_nulls` no obtienen ningún efecto para los tipos que no pueden estar dentro de Nullable [\#5700](https://github.com/ClickHouse/ClickHouse/pull/5700) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fijo `Incorrect size of index granularity` error [\#5720](https://github.com/ClickHouse/ClickHouse/pull/5720) ([Coraxster](https://github.com/coraxster)) +- Repara el desbordamiento de conversión de flotador a decimal [\#5607](https://github.com/ClickHouse/ClickHouse/pull/5607) ([Coraxster](https://github.com/coraxster)) +- Búfer de descarga cuando `WriteBufferFromHDFS`se llama destructor. Esto corrige la escritura en `HDFS`. [\#5684](https://github.com/ClickHouse/ClickHouse/pull/5684) ([Xindong Peng](https://github.com/eejoin)) + +#### Mejora {#improvement-7} + +- Trate las celdas vacías en `CSV` como valores predeterminados cuando la configuración `input_format_defaults_for_omitted_fields` está habilitado. [\#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) +- Carga sin bloqueo de diccionarios externos. [\#5567](https://github.com/ClickHouse/ClickHouse/pull/5567) ([Vitaly Baranov](https://github.com/vitlibar)) +- Los tiempos de espera de red se pueden cambiar dinámicamente para las conexiones ya establecidas de acuerdo con la configuración. [\#4558](https://github.com/ClickHouse/ClickHouse/pull/4558) ([Konstantin Podshumok](https://github.com/podshumok)) +- Utilizar “public\_suffix\_list” para funciones `firstSignificantSubdomain`, `cutToFirstSignificantSubdomain`. Está usando una tabla hash perfecta generada por `gperf` con una lista generada a partir del archivo: https://publicsuffix.org/list/public\_suffix\_list.dat. (por ejemplo, ahora reconocemos el dominio `ac.uk` como no significativo). [\#5030](https://github.com/ClickHouse/ClickHouse/pull/5030) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Adoptar `IPv6` tipo de datos en las tablas del sistema; columnas de información de cliente unificadas en `system.processes` y `system.query_log` [\#5640](https://github.com/ClickHouse/ClickHouse/pull/5640) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Uso de sesiones para conexiones con el protocolo de compatibilidad MySQL. Acerca de nosotros [\#5646](https://github.com/ClickHouse/ClickHouse/pull/5646) ([Yuriy Baranov](https://github.com/yurriy)) +- Apoyo más `ALTER` consulta `ON CLUSTER`. [\#5593](https://github.com/ClickHouse/ClickHouse/pull/5593) [\#5613](https://github.com/ClickHouse/ClickHouse/pull/5613) ([Sundyli](https://github.com/sundy-li)) +- Apoyo `` sección en `clickhouse-local` archivo de configuración. [\#5540](https://github.com/ClickHouse/ClickHouse/pull/5540) ([propulsor](https://github.com/proller)) +- Permitir ejecutar consulta con `remote` función de la tabla en `clickhouse-local` [\#5627](https://github.com/ClickHouse/ClickHouse/pull/5627) ([propulsor](https://github.com/proller)) + +#### Mejora del rendimiento {#performance-improvement-5} + +- Agregue la posibilidad de escribir la marca final al final de las columnas MergeTree. Permite evitar lecturas inútiles para las claves que están fuera del rango de datos de la tabla. Está habilitado sólo si se está utilizando granularidad de índice adaptativo. [\#5624](https://github.com/ClickHouse/ClickHouse/pull/5624) ([alesapin](https://github.com/alesapin)) +- Mejora del rendimiento de las tablas MergeTree en sistemas de archivos muy lentos al reducir el número de `stat` syscalls. [\#5648](https://github.com/ClickHouse/ClickHouse/pull/5648) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la degradación del rendimiento en la lectura de las tablas MergeTree que se introdujo en la versión 19.6. Correcciones \#5631. [\#5633](https://github.com/ClickHouse/ClickHouse/pull/5633) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-8} + +- Aplicado `TestKeeper` como una implementación de la interfaz ZooKeeper utilizada para probar [\#5643](https://github.com/ClickHouse/ClickHouse/pull/5643) ([alexey-milovidov](https://github.com/alexey-milovidov)) ([levushkin aleksej](https://github.com/alexey-milovidov)) +- A partir de ahora `.sql` las pruebas se pueden ejecutar aisladas por el servidor, en paralelo, con una base de datos aleatoria. Permite ejecutarlos más rápido, agregar nuevas pruebas con configuraciones de servidor personalizadas y asegurarse de que las diferentes pruebas no se afecten entre sí. [\#5554](https://github.com/ClickHouse/ClickHouse/pull/5554) ([Ivan](https://github.com/abyss7)) +- Quitar `` y `` de pruebas de rendimiento [\#5672](https://github.com/ClickHouse/ClickHouse/pull/5672) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fijo “select\_format” prueba de rendimiento para `Pretty` formato [\#5642](https://github.com/ClickHouse/ClickHouse/pull/5642) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## Lanzamiento de ClickHouse 19.9 {#clickhouse-release-19-9} + +### Lanzamiento de ClickHouse 19.9.3.31, 2019-07-05 {#clickhouse-release-19-9-3-31-2019-07-05} + +#### Corrección de errores {#bug-fix-23} + +- Corregir segfault en el códec Delta que afecta a las columnas con valores de menos de 32 bits de tamaño. El error llevó a la corrupción de memoria aleatoria. [\#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) +- Corregir un error raro en la comprobación de la parte con la columna LowCardinality. [\#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) +- Fix segfault en TTL se fusionan con columnas no físicas en el bloque. [\#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) +- Repara el potencial de sueño infinito de consultas de baja prioridad. [\#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corrige cómo ClickHouse determina la zona horaria predeterminada como UCT en lugar de UTC. [\#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir un error sobre la ejecución de las consultas distribuidas DROP / ALTER / TRUNCATE / OPTIMIZE ON CLUSTER en la réplica de seguidor antes de la réplica de líder. Ahora se ejecutarán directamente en réplica líder. [\#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) +- Corregir la condición de carrera, lo que hace que algunas consultas no aparezcan en query\_log instantáneamente después de la consulta SYSTEM FLUSH LOGS. [\#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) +- Se agregó soporte faltante para argumentos constantes para `evalMLModel` función. [\#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.9.2.4, 2019-06-24 {#clickhouse-release-19-9-2-4-2019-06-24} + +#### Novedad {#new-feature-8} + +- Imprima información sobre piezas congeladas en `system.parts` tabla. [\#5471](https://github.com/ClickHouse/ClickHouse/pull/5471) ([propulsor](https://github.com/proller)) +- Pregunte la contraseña del cliente en clickhouse-client start en tty si no se establece en argumentos [\#5092](https://github.com/ClickHouse/ClickHouse/pull/5092) ([propulsor](https://github.com/proller)) +- Implementar `dictGet` y `dictGetOrDefault` funciones para los tipos Decimal. [\#5394](https://github.com/ClickHouse/ClickHouse/pull/5394) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Mejora {#improvement-8} + +- Debian init: Agregar tiempo de espera de parada de servicio [\#5522](https://github.com/ClickHouse/ClickHouse/pull/5522) ([propulsor](https://github.com/proller)) +- Agregar configuración prohibida de forma predeterminada para crear tabla con tipos sospechosos para LowCardinality [\#5448](https://github.com/ClickHouse/ClickHouse/pull/5448) ([Olga Khvostikova](https://github.com/stavrolia)) +- Las funciones de regresión devuelven pesos del modelo cuando no se usan como Estado en función `evalMLMethod`. [\#5411](https://github.com/ClickHouse/ClickHouse/pull/5411) ([Quid37](https://github.com/Quid37)) +- Cambiar el nombre y mejorar los métodos de regresión. [\#5492](https://github.com/ClickHouse/ClickHouse/pull/5492) ([Quid37](https://github.com/Quid37)) +- Interfaces más claras de los buscadores de cadenas. [\#5586](https://github.com/ClickHouse/ClickHouse/pull/5586) ([Más información](https://github.com/danlark1)) + +#### Corrección de errores {#bug-fix-24} + +- Corregir la posible pérdida de datos en Kafka [\#5445](https://github.com/ClickHouse/ClickHouse/pull/5445) ([Ivan](https://github.com/abyss7)) +- Repara el potencial bucle infinito en `PrettySpace` formato cuando se llama con cero columnas [\#5560](https://github.com/ClickHouse/ClickHouse/pull/5560) ([Olga Khvostikova](https://github.com/stavrolia)) +- Se corrigió el error de desbordamiento UInt32 en modelos lineales. Permitir modelo ML eval para argumento de modelo no const. [\#5516](https://github.com/ClickHouse/ClickHouse/pull/5516) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- `ALTER TABLE ... DROP INDEX IF EXISTS ...` no debe generar una excepción si el índice proporcionado no existe [\#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Reparar segfault con `bitmapHasAny` en subconsulta escalar [\#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) +- Se corrigió el error cuando el grupo de conexiones de replicación no vuelve a intentar resolver el host, incluso cuando se eliminó la caché DNS. [\#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) +- Fijo `ALTER ... MODIFY TTL` en ReplicatedMergeTree. [\#5539](https://github.com/ClickHouse/ClickHouse/pull/5539) ([Anton Popov](https://github.com/CurtizJ)) +- Repare INSERT en la tabla distribuida con la columna MATERIALIZED [\#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) +- Corregir la asignación incorrecta al truncar el almacenamiento de unión [\#5437](https://github.com/ClickHouse/ClickHouse/pull/5437) ([Método de codificación de datos:](https://github.com/TCeason)) +- En versiones recientes del paquete tzdata algunos de los archivos son enlaces simbólicos ahora. El mecanismo actual para detectar la zona horaria predeterminada se rompe y da nombres incorrectos para algunas zonas horarias. Ahora, al menos, forzamos el nombre de la zona horaria al contenido de TZ si se proporciona. [\#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) +- Solucione algunos casos extremadamente raros con el buscador MultiVolnitsky cuando las agujas constantes en suma tienen al menos 16 KB de largo. El algoritmo omitió o sobrescribió los resultados anteriores que pueden conducir al resultado incorrecto de `multiSearchAny`. [\#5588](https://github.com/ClickHouse/ClickHouse/pull/5588) ([Más información](https://github.com/danlark1)) +- Solucione el problema cuando la configuración de las solicitudes de ExternalData no podía usar la configuración de ClickHouse. Además, por ahora, configuración `date_time_input_format` y `low_cardinality_allow_in_native_format` no se puede usar debido a la ambigüedad de los nombres (en datos externos puede interpretarse como formato de tabla y en la consulta puede ser una configuración). [\#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Más información](https://github.com/danlark1)) +- Corregir un error cuando las piezas se eliminaron solo de FS sin dejarlas caer de Zookeeper. [\#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) +- Eliminar el registro de depuración del protocolo MySQL [\#5478](https://github.com/ClickHouse/ClickHouse/pull/5478) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Omitir ZNONODE durante el procesamiento de consultas DDL [\#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) +- Fijar la mezcla `UNION ALL` tipo de columna de resultado. Hubo casos con datos inconsistentes y tipos de columnas de columnas resultantes. [\#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) +- Lanzar una excepción en enteros incorrectos en `dictGetT` funciones en lugar de accidente. [\#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) +- Arregle element\_count y load\_factor incorrectos para el diccionario hash en `system.dictionaries` tabla. [\#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-9} + +- Construcción fija sin `Brotli` Soporte de compresión HTTP (`ENABLE_BROTLI=OFF` de la variable cmake). [\#5521](https://github.com/ClickHouse/ClickHouse/pull/5521) ([Anton Yuzhaninov](https://github.com/citrin)) +- Incluye rugido.h como rugiendo / rugiendo.h [\#5523](https://github.com/ClickHouse/ClickHouse/pull/5523) ([Películas De Sexo](https://github.com/orivej)) +- Corregir las advertencias de gcc9 en hyperscan (\# ¡la directiva de línea es malvada!) [\#5546](https://github.com/ClickHouse/ClickHouse/pull/5546) ([Más información](https://github.com/danlark1)) +- Corrige todas las advertencias al compilar con gcc-9. Soluciona algunos problemas de contribución. Repara gcc9 ICE y envíalo a bugzilla. [\#5498](https://github.com/ClickHouse/ClickHouse/pull/5498) ([Más información](https://github.com/danlark1)) +- Enlace fijo con lld [\#5477](https://github.com/ClickHouse/ClickHouse/pull/5477) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Eliminar especializaciones no utilizadas en diccionarios [\#5452](https://github.com/ClickHouse/ClickHouse/pull/5452) ([Artem Zuikov](https://github.com/4ertus2)) +- Pruebas de rendimiento de mejora para formatear y analizar tablas para diferentes tipos de archivos [\#5497](https://github.com/ClickHouse/ClickHouse/pull/5497) ([Olga Khvostikova](https://github.com/stavrolia)) +- Correcciones para la ejecución de pruebas en paralelo [\#5506](https://github.com/ClickHouse/ClickHouse/pull/5506) ([propulsor](https://github.com/proller)) +- Docker: use configuraciones de clickhouse-test [\#5531](https://github.com/ClickHouse/ClickHouse/pull/5531) ([propulsor](https://github.com/proller)) +- Solucionar compilación para FreeBSD [\#5447](https://github.com/ClickHouse/ClickHouse/pull/5447) ([propulsor](https://github.com/proller)) +- Impulso de actualización a 1.70 [\#5570](https://github.com/ClickHouse/ClickHouse/pull/5570) ([propulsor](https://github.com/proller)) +- Repara el clickhouse de compilación como submódulo [\#5574](https://github.com/ClickHouse/ClickHouse/pull/5574) ([propulsor](https://github.com/proller)) +- Mejorar las pruebas de rendimiento JSONExtract [\#5444](https://github.com/ClickHouse/ClickHouse/pull/5444) ([Vitaly Baranov](https://github.com/vitlibar)) + +## Lanzamiento de ClickHouse 19.8 {#clickhouse-release-19-8} + +### Lanzamiento de ClickHouse 19.8.3.8, 2019-06-11 {#clickhouse-release-19-8-3-8-2019-06-11} + +#### Novedad {#new-features} + +- Funciones añadidas para trabajar con JSON [\#4686](https://github.com/ClickHouse/ClickHouse/pull/4686) ([Hcz](https://github.com/hczhcz)) [\#5124](https://github.com/ClickHouse/ClickHouse/pull/5124). ([Vitaly Baranov](https://github.com/vitlibar)) +- Agregue una función basename, con un comportamiento similar a una función basename, que existe en muchos idiomas (`os.path.basename` en python, `basename` in PHP, etc…). Work with both an UNIX-like path or a Windows path. [\#5136](https://github.com/ClickHouse/ClickHouse/pull/5136) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Añadir `LIMIT n, m BY` o `LIMIT m OFFSET n BY` sintaxis para establecer el desplazamiento de n para la cláusula LIMIT BY. [\#5138](https://github.com/ClickHouse/ClickHouse/pull/5138) ([Anton Popov](https://github.com/CurtizJ)) +- Añadido nuevo tipo de datos `SimpleAggregateFunction`, lo que permite tener columnas con agregación de luz en un `AggregatingMergeTree`. Esto solo se puede usar con funciones simples como `any`, `anyLast`, `sum`, `min`, `max`. [\#4629](https://github.com/ClickHouse/ClickHouse/pull/4629) ([Boris Granveaud](https://github.com/bgranvea)) +- Se agregó soporte para argumentos no constantes en función `ngramDistance` [\#5198](https://github.com/ClickHouse/ClickHouse/pull/5198) ([Más información](https://github.com/danlark1)) +- Funciones añadidas `skewPop`, `skewSamp`, `kurtPop` y `kurtSamp` para calcular la asimetría de la secuencia, la asimetría de la muestra, la curtosis y la curtosis de la muestra, respectivamente. [\#5200](https://github.com/ClickHouse/ClickHouse/pull/5200) ([Hcz](https://github.com/hczhcz)) +- La ayuda cambia de nombre la operación para `MaterializeView` almacenamiento. [\#5209](https://github.com/ClickHouse/ClickHouse/pull/5209) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Se agregó un servidor que permite conectarse a ClickHouse usando el cliente MySQL. [\#4715](https://github.com/ClickHouse/ClickHouse/pull/4715) ([Yuriy Baranov](https://github.com/yurriy)) +- Añadir `toDecimal*OrZero` y `toDecimal*OrNull` función. [\#5291](https://github.com/ClickHouse/ClickHouse/pull/5291) ([Artem Zuikov](https://github.com/4ertus2)) +- Soporte tipos decimales en funciones: `quantile`, `quantiles`, `median`, `quantileExactWeighted`, `quantilesExactWeighted`, medianExactWeighted. [\#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir `toValidUTF8` function, which replaces all invalid UTF-8 characters by replacement character � (U+FFFD). [\#5322](https://github.com/ClickHouse/ClickHouse/pull/5322) ([Más información](https://github.com/danlark1)) +- Añadir `format` función. Formateo del patrón constante (patrón de formato Python simplificado) con las cadenas enumeradas en los argumentos. [\#5330](https://github.com/ClickHouse/ClickHouse/pull/5330) ([Más información](https://github.com/danlark1)) +- Añadir `system.detached_parts` que contiene información sobre las partes separadas de `MergeTree` tabla. [\#5353](https://github.com/ClickHouse/ClickHouse/pull/5353) ([akuzm](https://github.com/akuzm)) +- Añadir `ngramSearch` función para calcular la diferencia no simétrica entre la aguja y el pajar. [\#5418](https://github.com/ClickHouse/ClickHouse/pull/5418)[\#5422](https://github.com/ClickHouse/ClickHouse/pull/5422) ([Más información](https://github.com/danlark1)) +- Implementación de métodos básicos de aprendizaje automático (regresión lineal estocástica y regresión logística) utilizando la interfaz de funciones agregadas. Tiene diferentes estrategias para actualizar los pesos del modelo (descenso de gradiente simple, método de impulso, método Nesterov). También es compatible con mini lotes de tamaño personalizado. [\#4943](https://github.com/ClickHouse/ClickHouse/pull/4943) ([Quid37](https://github.com/Quid37)) +- Implementación de `geohashEncode` y `geohashDecode` función. [\#5003](https://github.com/ClickHouse/ClickHouse/pull/5003) ([Vasily Nemkov](https://github.com/Enmk)) +- Función agregada agregada `timeSeriesGroupSum`, que puede agregar diferentes series de tiempo que muestran la marca de tiempo no la alineación. Utilizará la interpolación lineal entre dos marcas de tiempo de muestra y luego sumará series temporales juntas. Función agregada agregada `timeSeriesGroupRateSum`, que calcula la tasa de series temporales y luego suma las tasas juntas. [\#4542](https://github.com/ClickHouse/ClickHouse/pull/4542) ([Información adicional](https://github.com/LiuYangkuan)) +- Funciones añadidas `IPv4CIDRtoIPv4Range` y `IPv6CIDRtoIPv6Range` para calcular los límites inferiores y superiores para una IP en la subred utilizando un CIDR. [\#5095](https://github.com/ClickHouse/ClickHouse/pull/5095) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Agregue un encabezado X-ClickHouse-Summary cuando enviamos una consulta usando HTTP con la configuración habilitada `send_progress_in_http_headers`. Devuelve la información habitual de X-ClickHouse-Progress, con información adicional como cuántas filas y bytes se insertaron en la consulta. [\#5116](https://github.com/ClickHouse/ClickHouse/pull/5116) ([Guillaume Tassery](https://github.com/YiuRULE)) + +#### Mejora {#improvements} + +- Añadir `max_parts_in_total` configuración para la familia de tablas MergeTree (predeterminado: 100 000) que evita la especificación insegura de la clave de partición \# 5166. [\#5171](https://github.com/ClickHouse/ClickHouse/pull/5171) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-obfuscator`: derivar la semilla para columnas individuales combinando la semilla inicial con el nombre de la columna, no la posición de la columna. Esto está destinado a transformar conjuntos de datos con varias tablas relacionadas, de modo que las tablas permanezcan JOINable después de la transformación. [\#5178](https://github.com/ClickHouse/ClickHouse/pull/5178) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Funciones añadidas `JSONExtractRaw`, `JSONExtractKeyAndValues`. Funciones renombradas `jsonExtract` a `JSONExtract`. Cuando algo sale mal, estas funciones devuelven los valores correspondientes, no `NULL`. Función modificada `JSONExtract`, ahora obtiene el tipo de devolución de su último parámetro y no inyecta nullables. Implementado de respaldo a RapidJSON en caso de que las instrucciones AVX2 no estén disponibles. Biblioteca Simdjson actualizado a una nueva versión. [\#5235](https://github.com/ClickHouse/ClickHouse/pull/5235) ([Vitaly Baranov](https://github.com/vitlibar)) +- Ahora `if` y `multiIf` funciones no dependen de la condición `Nullable`, pero confíe en las ramas para la compatibilidad sql. [\#5238](https://github.com/ClickHouse/ClickHouse/pull/5238) ([Jian Wu](https://github.com/janplus)) +- `In` predicado ahora genera `Null` resultado de `Null` entrada como el `Equal` función. [\#5152](https://github.com/ClickHouse/ClickHouse/pull/5152) ([Jian Wu](https://github.com/janplus)) +- Verifique el límite de tiempo cada (flush\_interval / poll\_timeout) número de filas de Kafka. Esto permite romper la lectura del consumidor de Kafka con más frecuencia y verificar los límites de tiempo para las transmisiones de nivel superior [\#5249](https://github.com/ClickHouse/ClickHouse/pull/5249) ([Ivan](https://github.com/abyss7)) +- Enlace rdkafka con SASL incluido. Debería permitir el uso de autenticación SASL SCRAM [\#5253](https://github.com/ClickHouse/ClickHouse/pull/5253) ([Ivan](https://github.com/abyss7)) +- Versión por lotes de RowRefList para TODAS LAS UNIONES. [\#5267](https://github.com/ClickHouse/ClickHouse/pull/5267) ([Artem Zuikov](https://github.com/4ertus2)) +- clickhouse-server: mensajes de error de escucha más informativos. [\#5268](https://github.com/ClickHouse/ClickHouse/pull/5268) ([propulsor](https://github.com/proller)) +- Diccionarios de soporte en clickhouse-copiadora para funciones en `` [\#5270](https://github.com/ClickHouse/ClickHouse/pull/5270) ([propulsor](https://github.com/proller)) +- Añadir nueva configuración `kafka_commit_every_batch` para regular Kafka cometer política. + Permite establecer el modo de confirmación: después de que se maneje cada lote de mensajes, o después de que se escriba todo el bloque en el almacenamiento. Es una compensación entre perder algunos mensajes o leerlos dos veces en algunas situaciones extremas. [\#5308](https://github.com/ClickHouse/ClickHouse/pull/5308) ([Ivan](https://github.com/abyss7)) +- Hacer `windowFunnel` soporta otros tipos de enteros sin firmar. [\#5320](https://github.com/ClickHouse/ClickHouse/pull/5320) ([Sundyli](https://github.com/sundy-li)) +- Permitir sombrear la columna virtual `_table` en el motor de fusión. [\#5325](https://github.com/ClickHouse/ClickHouse/pull/5325) ([Ivan](https://github.com/abyss7)) +- Hacer `sequenceMatch` Las funciones de agregado admiten otros tipos de enteros sin signo [\#5339](https://github.com/ClickHouse/ClickHouse/pull/5339) ([Sundyli](https://github.com/sundy-li)) +- Mejores mensajes de error si la suma de comprobación no coincide probablemente es causada por fallas de hardware. [\#5355](https://github.com/ClickHouse/ClickHouse/pull/5355) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Compruebe que las tablas subyacentes admiten `StorageMerge` [\#5366](https://github.com/ClickHouse/ClickHouse/pull/5366) ([Ivan](https://github.com/abyss7)) +- Сlose MySQL connections after their usage in external dictionaries. It is related to issue \#893. [\#5395](https://github.com/ClickHouse/ClickHouse/pull/5395) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Mejoras de MySQL Wire Protocol. Se ha cambiado el nombre del formato a MySQLWire. Usando RAII para llamar a RSA\_free. Deshabilitar SSL si no se puede crear contexto. [\#5419](https://github.com/ClickHouse/ClickHouse/pull/5419) ([Yuriy Baranov](https://github.com/yurriy)) +- clickhouse-client: allow to run with unaccessable history file (read-only, no disk space, file is directory, …). [\#5431](https://github.com/ClickHouse/ClickHouse/pull/5431) ([propulsor](https://github.com/proller)) +- Respete la configuración de consulta en INSERT asincrónicos en tablas distribuidas. [\#4936](https://github.com/ClickHouse/ClickHouse/pull/4936) ([Método de codificación de datos:](https://github.com/TCeason)) +- Funciones renombradas `leastSqr` a `simpleLinearRegression`, `LinearRegression` a `linearRegression`, `LogisticRegression` a `logisticRegression`. [\#5391](https://github.com/ClickHouse/ClickHouse/pull/5391) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Mejoras de rendimiento {#performance-improvements} + +- Paralelice el procesamiento de partes de tablas MergeTree no replicadas en la consulta ALTER MODIFY. [\#4639](https://github.com/ClickHouse/ClickHouse/pull/4639) ([Ivan Kush](https://github.com/IvanKush)) +- Optimizaciones en la extracción de expresiones regulares. [\#5193](https://github.com/ClickHouse/ClickHouse/pull/5193) [\#5191](https://github.com/ClickHouse/ClickHouse/pull/5191) ([Más información](https://github.com/danlark1)) +- No agregue la columna de clave de unión correcta para unir el resultado si solo se usa en la sección join on . [\#5260](https://github.com/ClickHouse/ClickHouse/pull/5260) ([Artem Zuikov](https://github.com/4ertus2)) +- Congele el búfer Kafka después de la primera respuesta vacía. Evita múltiples invocaciones de `ReadBuffer::next()` para el resultado vacío en algunas secuencias de análisis de filas. [\#5283](https://github.com/ClickHouse/ClickHouse/pull/5283) ([Ivan](https://github.com/abyss7)) +- `concat` optimización de funciones para múltiples argumentos. [\#5357](https://github.com/ClickHouse/ClickHouse/pull/5357) ([Más información](https://github.com/danlark1)) +- Query optimisation. Allow push down IN statement while rewriting commа/cross join into inner one. [\#5396](https://github.com/ClickHouse/ClickHouse/pull/5396) ([Artem Zuikov](https://github.com/4ertus2)) +- Actualice nuestra implementación LZ4 con la referencia uno para tener una descompresión más rápida. [\#5070](https://github.com/ClickHouse/ClickHouse/pull/5070) ([Más información](https://github.com/danlark1)) +- Implementado MSD radix ordenar (basado en kxsort), y la clasificación parcial. [\#5129](https://github.com/ClickHouse/ClickHouse/pull/5129) ([Evgenii Pravda](https://github.com/kvinty)) + +#### Corrección de errores {#bug-fixes} + +- Fix push requiere columnas con unión [\#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Invierno Zhang](https://github.com/zhang2014)) +- Corregido error, cuando ClickHouse es ejecutado por systemd, el comando `sudo service clickhouse-server forcerestart` no funcionaba como se esperaba. [\#5204](https://github.com/ClickHouse/ClickHouse/pull/5204) ([propulsor](https://github.com/proller)) +- Corregir los códigos de error http en DataPartsExchange (el servidor http deinterserver en el puerto 9009 siempre devolvió el código 200, incluso en errores). [\#5216](https://github.com/ClickHouse/ClickHouse/pull/5216) ([propulsor](https://github.com/proller)) +- Repara SimpleAggregateFunction para String más largo que MAX\_SMALL\_STRING\_SIZE [\#5311](https://github.com/ClickHouse/ClickHouse/pull/5311) ([Azat Khuzhin](https://github.com/azat)) +- Corregir error para `Decimal` a `Nullable(Decimal)` conversión en IN. Admite otras conversiones de decimales a decimales (incluidas diferentes escalas). [\#5350](https://github.com/ClickHouse/ClickHouse/pull/5350) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió el clobbering de FPU en la biblioteca simdjson que conducía a un cálculo incorrecto de `uniqHLL` y `uniqCombined` función agregada y funciones matemáticas tales como `log`. [\#5354](https://github.com/ClickHouse/ClickHouse/pull/5354) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el manejo de casos mixtos const / nonconst en funciones JSON. [\#5435](https://github.com/ClickHouse/ClickHouse/pull/5435) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fijar `retention` función. Ahora todas las condiciones que cumplen en una fila de datos se agregan al estado de datos. [\#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) +- Corregir el tipo de resultado para `quantileExact` con decimales. [\#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Documentación {#documentation} + +- Traducir documentación para `CollapsingMergeTree` a chino. [\#5168](https://github.com/ClickHouse/ClickHouse/pull/5168) ([张风啸](https://github.com/AlexZFX)) +- Traduzca alguna documentación sobre motores de mesa al chino. + [\#5134](https://github.com/ClickHouse/ClickHouse/pull/5134) + [\#5328](https://github.com/ClickHouse/ClickHouse/pull/5328) + ([nunca lee](https://github.com/neverlee)) + +#### Mejoras de compilación / prueba / empaquetado {#buildtestingpackaging-improvements} + +- Corrija algunos informes de desinfectantes que muestran un uso probable después de liberar.[\#5139](https://github.com/ClickHouse/ClickHouse/pull/5139) [\#5143](https://github.com/ClickHouse/ClickHouse/pull/5143) [\#5393](https://github.com/ClickHouse/ClickHouse/pull/5393) ([Ivan](https://github.com/abyss7)) +- Mueva las pruebas de rendimiento fuera de directorios separados para mayor comodidad. [\#5158](https://github.com/ClickHouse/ClickHouse/pull/5158) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir pruebas de rendimiento incorrectas. [\#5255](https://github.com/ClickHouse/ClickHouse/pull/5255) ([alesapin](https://github.com/alesapin)) +- Se agregó una herramienta para calcular las sumas de comprobación causadas por los saltos de bits para depurar problemas de hardware. [\#5334](https://github.com/ClickHouse/ClickHouse/pull/5334) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Hacer script corredor más utilizable. [\#5340](https://github.com/ClickHouse/ClickHouse/pull/5340)[\#5360](https://github.com/ClickHouse/ClickHouse/pull/5360) ([filimonov](https://github.com/filimonov)) +- Agregue pequeñas instrucciones sobre cómo escribir pruebas de rendimiento. [\#5408](https://github.com/ClickHouse/ClickHouse/pull/5408) ([alesapin](https://github.com/alesapin)) +- Añadir capacidad para hacer sustituciones en crear, llenar y soltar consulta en las pruebas de rendimiento [\#5367](https://github.com/ClickHouse/ClickHouse/pull/5367) ([Olga Khvostikova](https://github.com/stavrolia)) + +## Lanzamiento de ClickHouse 19.7 {#clickhouse-release-19-7} + +### Lanzamiento de ClickHouse 19.7.5.29, 2019-07-05 {#clickhouse-release-19-7-5-29-2019-07-05} + +#### Corrección de errores {#bug-fix-25} + +- Corregir la regresión de rendimiento en algunas consultas con JOIN. [\#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Invierno Zhang](https://github.com/zhang2014)) + +### Lanzamiento de ClickHouse 19.7.5.27, 2019-06-09 {#clickhouse-release-19-7-5-27-2019-06-09} + +#### Novedad {#new-features-1} + +- Se agregaron funciones relacionadas con el mapa de bits `bitmapHasAny` y `bitmapHasAll` análogo a `hasAny` y `hasAll` funciones para matrices. [\#5279](https://github.com/ClickHouse/ClickHouse/pull/5279) ([Sergi Vladykin](https://github.com/svladykin)) + +#### Corrección de errores {#bug-fixes-1} + +- Arreglar segfault en `minmax` ÍNDICE con valor nulo. [\#5246](https://github.com/ClickHouse/ClickHouse/pull/5246) ([Nikita Vasilev](https://github.com/nikvas0)) +- Marque todas las columnas de entrada en LIMIT BY como salida requerida. Se fija ‘Not found column’ error en algunas consultas distribuidas. [\#5407](https://github.com/ClickHouse/ClickHouse/pull/5407) ([Constantin S. Pan](https://github.com/kvap)) +- Fijar “Column ‘0’ already exists” error en `SELECT .. PREWHERE` en la columna con DEFAULT [\#5397](https://github.com/ClickHouse/ClickHouse/pull/5397) ([propulsor](https://github.com/proller)) +- Fijar `ALTER MODIFY TTL` consulta sobre `ReplicatedMergeTree`. [\#5539](https://github.com/ClickHouse/ClickHouse/pull/5539/commits) ([Anton Popov](https://github.com/CurtizJ)) +- No bloquee el servidor cuando los consumidores de Kafka no se hayan iniciado. [\#5285](https://github.com/ClickHouse/ClickHouse/pull/5285) ([Ivan](https://github.com/abyss7)) +- Las funciones de mapa de bits fijas producen un resultado incorrecto. [\#5359](https://github.com/ClickHouse/ClickHouse/pull/5359) ([Cristina Andrés](https://github.com/andyyzh)) +- Fix element\_count para el diccionario hash (no incluye duplicados) [\#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) +- Utilice el contenido de la variable de entorno TZ como el nombre de la zona horaria. Ayuda a detectar correctamente la zona horaria predeterminada en algunos casos.[\#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) +- No intente convertir enteros en `dictGetT` funciones, porque no funciona correctamente. Lanza una excepción en su lugar. [\#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) +- Corregir la configuración en la solicitud HTTP ExternalData. [\#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Danila + Kutenin](https://github.com/danlark1)) +- Corregir un error cuando las piezas se eliminaron solo de FS sin dejarlas caer de Zookeeper. [\#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) +- Fijar falla de segmentación en `bitmapHasAny` función. [\#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) +- Se corrigió el error cuando el grupo de conexiones de replicación no vuelve a intentar resolver el host, incluso cuando se eliminó la caché DNS. [\#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) +- Fijo `DROP INDEX IF EXISTS` consulta. Ahora `ALTER TABLE ... DROP INDEX IF EXISTS ...` query no genera una excepción si el índice proporcionado no existe. [\#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Corregir unión toda la columna de supertipo. Hubo casos con datos inconsistentes y tipos de columnas de columnas resultantes. [\#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) +- Omita ZNONODE durante el procesamiento de consultas DDL. Antes, si otro nodo elimina el znode en la cola de tareas, el que + no lo procesó, pero ya obtuvo la lista de hijos, terminará el hilo DDLWorker. [\#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) +- Fije INSERT en la tabla Distributed () con la columna MATERIALIZED. [\#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) + +### Lanzamiento de ClickHouse 19.7.3.9, 2019-05-30 {#clickhouse-release-19-7-3-9-2019-05-30} + +#### Novedad {#new-features-2} + +- Permite limitar el rango de una configuración que puede especificar el usuario. + Estas restricciones se pueden configurar en el perfil de configuración del usuario. + [\#4931](https://github.com/ClickHouse/ClickHouse/pull/4931) ([Vitaly + Baranov](https://github.com/vitlibar)) +- Añadir una segunda versión de la función `groupUniqArray` con una opción + `max_size` parámetro que limita el tamaño de la matriz resultante. Este + comportamiento es similar a `groupArray(max_size)(x)` función. + [\#5026](https://github.com/ClickHouse/ClickHouse/pull/5026) ([Guillaume + Tassery](https://github.com/YiuRULE)) +- Para los formatos de archivo de entrada TSVWithNames/CSVWithNames, el orden de columnas ahora puede ser + determinado a partir del encabezado del archivo. Esto es controlado por + `input_format_with_names_use_header` parámetro. + [\#5081](https://github.com/ClickHouse/ClickHouse/pull/5081) + ([Alejandro](https://github.com/Akazz)) + +#### Corrección de errores {#bug-fixes-2} + +- Bloqueo con sin comprimir\_cache + JOIN durante la fusión (\# 5197) + [\#5133](https://github.com/ClickHouse/ClickHouse/pull/5133) ([Danila + Kutenin](https://github.com/danlark1)) +- Error de segmentación en una consulta de clickhouse-cliente a tablas del sistema. Acerca de nosotros + [\#5127](https://github.com/ClickHouse/ClickHouse/pull/5127) + ([Ivan](https://github.com/abyss7)) +- Pérdida de datos en carga pesada a través de KafkaEngine (\#4736) + [\#5080](https://github.com/ClickHouse/ClickHouse/pull/5080) + ([Ivan](https://github.com/abyss7)) +- Se corrigió una condición de carrera de datos muy rara que podría ocurrir al ejecutar una consulta con UNION ALL que involucraba al menos dos SELECT del sistema.columnas, sistema.mesas, sistema.partes, sistema.parts\_tables o tablas de la familia Merge y realizar ALTER de columnas de las tablas relacionadas simultáneamente. [\#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejoras de rendimiento {#performance-improvements-1} + +- Utilice la clasificación de radix para ordenar por una sola columna numérica en `ORDER BY` sin + `LIMIT`. [\#5106](https://github.com/ClickHouse/ClickHouse/pull/5106), + [\#4439](https://github.com/ClickHouse/ClickHouse/pull/4439) + ([Evgenii Pravda](https://github.com/kvinty), + [alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Documentación {#documentation-1} + +- Traduzca la documentación de algunos motores de tabla al chino. + [\#5107](https://github.com/ClickHouse/ClickHouse/pull/5107), + [\#5094](https://github.com/ClickHouse/ClickHouse/pull/5094), + [\#5087](https://github.com/ClickHouse/ClickHouse/pull/5087) + ([张风啸](https://github.com/AlexZFX)), + [\#5068](https://github.com/ClickHouse/ClickHouse/pull/5068) ([nunca + Sotavento](https://github.com/neverlee)) + +#### Mejoras de compilación / prueba / empaquetado {#buildtestingpackaging-improvements-1} + +- Imprima los caracteres UTF-8 correctamente en `clickhouse-test`. + [\#5084](https://github.com/ClickHouse/ClickHouse/pull/5084) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregar parámetro de línea de comandos para clickhouse-cliente para cargar siempre la sugerencia + datos. [\#5102](https://github.com/ClickHouse/ClickHouse/pull/5102) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Resuelva algunas de las advertencias de PVS-Studio. + [\#5082](https://github.com/ClickHouse/ClickHouse/pull/5082) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualizar LZ4 [\#5040](https://github.com/ClickHouse/ClickHouse/pull/5040) ([Danila + Kutenin](https://github.com/danlark1)) +- Agregue gperf a los requisitos de compilación para la próxima solicitud de extracción \# 5030. + [\#5110](https://github.com/ClickHouse/ClickHouse/pull/5110) + ([propulsor](https://github.com/proller)) + +## Lanzamiento de ClickHouse 19.6 {#clickhouse-release-19-6} + +### Lanzamiento de ClickHouse 19.6.3.18, 2019-06-13 {#clickhouse-release-19-6-3-18-2019-06-13} + +#### Corrección de errores {#bug-fixes-3} + +- Fijo IN condición pushdown para consultas de funciones de tabla `mysql` y `odbc` y los correspondientes motores de mesa. Esto corrige \# 3540 y \# 2384. [\#5313](https://github.com/ClickHouse/ClickHouse/pull/5313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir el punto muerto en Zookeeper. [\#5297](https://github.com/ClickHouse/ClickHouse/pull/5297) ([github1youlc](https://github.com/github1youlc)) +- Permitir decimales citados en CSV. [\#5284](https://github.com/ClickHouse/ClickHouse/pull/5284) ([Artem Zuikov](https://github.com/4ertus2) +- No permitir la conversión de float Inf / NaN en Decimales (excepción de lanzamiento). [\#5282](https://github.com/ClickHouse/ClickHouse/pull/5282) ([Artem Zuikov](https://github.com/4ertus2)) +- Corregir la carrera de datos en la consulta de cambio de nombre. [\#5247](https://github.com/ClickHouse/ClickHouse/pull/5247) ([Invierno Zhang](https://github.com/zhang2014)) +- Deshabilitar temporalmente LFAlloc. El uso de LFAlloc puede conducir a una gran cantidad de MAP\_FAILED en la asignación de UncompressedCache y, como resultado, a bloqueos de consultas en servidores de alta carga. [cfdba93](https://github.com/ClickHouse/ClickHouse/commit/cfdba938ce22f16efeec504f7f90206a515b1280)([Más información](https://github.com/danlark1)) + +### Lanzamiento de ClickHouse 19.6.2.11, 2019-05-13 {#clickhouse-release-19-6-2-11-2019-05-13} + +#### Novedad {#new-features-3} + +- Expresiones TTL para columnas y tablas. [\#4212](https://github.com/ClickHouse/ClickHouse/pull/4212) ([Anton Popov](https://github.com/CurtizJ)) +- Añadido soporte para `brotli` compresión para respuestas HTTP (Accept-Encoding: br) [\#4388](https://github.com/ClickHouse/ClickHouse/pull/4388) ([Mijaíl](https://github.com/fandyushin)) +- Se agregó una nueva función `isValidUTF8` para verificar si un conjunto de bytes está codificado correctamente en utf-8. [\#4934](https://github.com/ClickHouse/ClickHouse/pull/4934) ([Más información](https://github.com/danlark1)) +- Agregar nueva directiva de equilibrio de carga `first_or_random` que envía consultas al primer host especificado y, si es inaccesible, envía consultas a hosts aleatorios de fragmento. Útil para configuraciones de topología de replicación cruzada. [\#5012](https://github.com/ClickHouse/ClickHouse/pull/5012) ([Nombre de la red inalámbrica (SSID):](https://github.com/nvartolomei)) + +#### Experimental Características {#experimental-features-1} + +- Añadir ajuste `index_granularity_bytes` (granularidad de índice adaptativo) para la familia de tablas MergeTree\*. [\#4826](https://github.com/ClickHouse/ClickHouse/pull/4826) ([alesapin](https://github.com/alesapin)) + +#### Mejora {#improvements-1} + +- Se agregó soporte para argumentos de tamaño y longitud no constantes y negativos para la función `substringUTF8`. [\#4989](https://github.com/ClickHouse/ClickHouse/pull/4989) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deshabilite el push-down a la tabla derecha en la unión izquierda, la tabla izquierda en la unión derecha y ambas tablas en unión completa. Esto corrige los resultados JOIN incorrectos en algunos casos. [\#4846](https://github.com/ClickHouse/ClickHouse/pull/4846) ([Ivan](https://github.com/abyss7)) +- `clickhouse-copier`: configuración de tareas de carga automática desde `--task-file` opcion [\#4876](https://github.com/ClickHouse/ClickHouse/pull/4876) ([propulsor](https://github.com/proller)) +- Se agregó el controlador de errores tipográficos para la fábrica de almacenamiento y la fábrica de funciones de tabla. [\#4891](https://github.com/ClickHouse/ClickHouse/pull/4891) ([Más información](https://github.com/danlark1)) +- Admite asteriscos y asteriscos calificados para combinaciones múltiples sin subconsultas [\#4898](https://github.com/ClickHouse/ClickHouse/pull/4898) ([Artem Zuikov](https://github.com/4ertus2)) +- Haga que el mensaje de error de columna faltante sea más fácil de usar. [\#4915](https://github.com/ClickHouse/ClickHouse/pull/4915) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Mejoras de rendimiento {#performance-improvements-2} + +- Aceleración significativa de ASOF JOIN [\#4924](https://github.com/ClickHouse/ClickHouse/pull/4924) ([Martijn Bakker](https://github.com/Gladdy)) + +#### Cambios incompatibles hacia atrás {#backward-incompatible-changes} + +- Encabezado HTTP `Query-Id` fue renombrado a `X-ClickHouse-Query-Id` para la consistencia. [\#4972](https://github.com/ClickHouse/ClickHouse/pull/4972) ([Mijaíl](https://github.com/fandyushin)) + +#### Corrección de errores {#bug-fixes-4} + +- Se corrigió la desreferencia del puntero nulo potencial en `clickhouse-copier`. [\#4900](https://github.com/ClickHouse/ClickHouse/pull/4900) ([propulsor](https://github.com/proller)) +- Se corrigió el error en la consulta con JOIN + ARRAY JOIN [\#4938](https://github.com/ClickHouse/ClickHouse/pull/4938) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió el inicio del servidor cuando un diccionario depende de otro diccionario a través de una base de datos con motor = Diccionario. [\#4962](https://github.com/ClickHouse/ClickHouse/pull/4962) ([Vitaly Baranov](https://github.com/vitlibar)) +- Partially fix distributed\_product\_mode = local. It's possible to allow columns of local tables in where/having/order by/… via table aliases. Throw exception if table does not have alias. There's not possible to access to the columns without table aliases yet. [\#4986](https://github.com/ClickHouse/ClickHouse/pull/4986) ([Artem Zuikov](https://github.com/4ertus2)) +- Repara el resultado potencialmente incorrecto para `SELECT DISTINCT` con `JOIN` [\#5001](https://github.com/ClickHouse/ClickHouse/pull/5001) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió una condición de carrera de datos muy rara que podría ocurrir al ejecutar una consulta con UNION ALL que involucraba al menos dos SELECT del sistema.columnas, sistema.mesas, sistema.partes, sistema.parts\_tables o tablas de la familia Merge y realizar ALTER de columnas de las tablas relacionadas simultáneamente. [\#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejoras de compilación / prueba / empaquetado {#buildtestingpackaging-improvements-2} + +- Se corrigieron errores de prueba al ejecutar clickhouse-server en un host diferente [\#4713](https://github.com/ClickHouse/ClickHouse/pull/4713) ([Vasily Nemkov](https://github.com/Enmk)) +- clickhouse-test: deshabilita las secuencias de control de color en un entorno no tty. [\#4937](https://github.com/ClickHouse/ClickHouse/pull/4937) ([alesapin](https://github.com/alesapin)) +- clickhouse-test: Permitir el uso de cualquier base de datos de prueba (eliminar `test.` calificación donde sea posible) [\#5008](https://github.com/ClickHouse/ClickHouse/pull/5008) ([propulsor](https://github.com/proller)) +- Corregir errores de ubsan [\#5037](https://github.com/ClickHouse/ClickHouse/pull/5037) ([Vitaly Baranov](https://github.com/vitlibar)) +- Yandex LFAlloc se agregó a ClickHouse para asignar datos de MarkCache y UncompressedCache de diferentes maneras para detectar segfaults más confiables [\#4995](https://github.com/ClickHouse/ClickHouse/pull/4995) ([Más información](https://github.com/danlark1)) +- Python utiliza para ayudar con backports y registros de cambios. [\#4949](https://github.com/ClickHouse/ClickHouse/pull/4949) ([Ivan](https://github.com/abyss7)) + +## Lanzamiento de ClickHouse 19.5 {#clickhouse-release-19-5} + +### Lanzamiento de ClickHouse 19.5.4.22, 2019-05-13 {#clickhouse-release-19-5-4-22-2019-05-13} + +#### Corrección de errores {#bug-fixes-5} + +- Se corrigió un posible bloqueo en las funciones de mapa de bits \* [\#5220](https://github.com/ClickHouse/ClickHouse/pull/5220) [\#5228](https://github.com/ClickHouse/ClickHouse/pull/5228) ([Cristina Andrés](https://github.com/andyyzh)) +- Se corrigió una condición de carrera de datos muy rara que podría ocurrir al ejecutar una consulta con UNION ALL que involucraba al menos dos SELECT del sistema.columnas, sistema.mesas, sistema.partes, sistema.parts\_tables o tablas de la familia Merge y realizar ALTER de columnas de las tablas relacionadas simultáneamente. [\#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Error fijo `Set for IN is not created yet in case of using single LowCardinality column in the left part of IN`. Este error ocurrió si la columna LowCardinality era la parte de la clave principal. \#5031 [\#5154](https://github.com/ClickHouse/ClickHouse/pull/5154) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Modificación de la función de retención: si una fila satisface la primera condición y la NTH, solo se agrega la primera condición satisfecha al estado de datos. Ahora todas las condiciones que cumplen en una fila de datos se agregan al estado de datos. [\#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) + +### Lanzamiento de ClickHouse 19.5.3.8, 2019-04-18 {#clickhouse-release-19-5-3-8-2019-04-18} + +#### Corrección de errores {#bug-fixes-6} + +- Tipo fijo de ajuste `max_partitions_per_insert_block` de booleano a UInt64. [\#5028](https://github.com/ClickHouse/ClickHouse/pull/5028) ([Más información](https://github.com/mhsekhavat)) + +### Lanzamiento de ClickHouse 19.5.2.6, 2019-04-15 {#clickhouse-release-19-5-2-6-2019-04-15} + +#### Novedad {#new-features-4} + +- [Hyperscan](https://github.com/intel/hyperscan) Se agregó múltiples coincidencias de expresiones regulares (funciones `multiMatchAny`, `multiMatchAnyIndex`, `multiFuzzyMatchAny`, `multiFuzzyMatchAnyIndex`). [\#4780](https://github.com/ClickHouse/ClickHouse/pull/4780), [\#4841](https://github.com/ClickHouse/ClickHouse/pull/4841) ([Más información](https://github.com/danlark1)) +- `multiSearchFirstPosition` se añadió la función. [\#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Más información](https://github.com/danlark1)) +- Implemente el filtro de expresión predefinido por fila para las tablas. [\#4792](https://github.com/ClickHouse/ClickHouse/pull/4792) ([Ivan](https://github.com/abyss7)) +- Un nuevo tipo de índices de omisión de datos basados en filtros de floración (se puede usar para `equal`, `in` y `like` función). [\#4499](https://github.com/ClickHouse/ClickHouse/pull/4499) ([Nikita Vasilev](https://github.com/nikvas0)) +- Añadir `ASOF JOIN` que permite ejecutar consultas que se unen al valor más reciente conocido. [\#4774](https://github.com/ClickHouse/ClickHouse/pull/4774) [\#4867](https://github.com/ClickHouse/ClickHouse/pull/4867) [\#4863](https://github.com/ClickHouse/ClickHouse/pull/4863) [\#4875](https://github.com/ClickHouse/ClickHouse/pull/4875) ([Martijn Bakker](https://github.com/Gladdy), [Artem Zuikov](https://github.com/4ertus2)) +- Reescribir múltiples `COMMA JOIN` a `CROSS JOIN`. Luego reescribirlos para `INNER JOIN` si es posible. [\#4661](https://github.com/ClickHouse/ClickHouse/pull/4661) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Mejora {#improvement-9} + +- `topK` y `topKWeighted` ahora soporta personalizado `loadFactor` (soluciona el problema [\#4252](https://github.com/ClickHouse/ClickHouse/issues/4252)). [\#4634](https://github.com/ClickHouse/ClickHouse/pull/4634) ([Kirill Danshin](https://github.com/kirillDanshin)) +- Permitir usar `parallel_replicas_count > 1` incluso para tablas sin muestreo (la configuración simplemente se ignora para ellas). En versiones anteriores fue conducido a la excepción. [\#4637](https://github.com/ClickHouse/ClickHouse/pull/4637) ([Alexey Elymanov](https://github.com/digitalist)) +- Soporte para `CREATE OR REPLACE VIEW`. Permite crear una vista o establecer una nueva definición en una sola instrucción. [\#4654](https://github.com/ClickHouse/ClickHouse/pull/4654) ([Boris Granveaud](https://github.com/bgranvea)) +- `Buffer` motor de mesa ahora soporta `PREWHERE`. [\#4671](https://github.com/ClickHouse/ClickHouse/pull/4671) ([Información adicional](https://github.com/LiuYangkuan)) +- Agregue la capacidad de iniciar una tabla replicada sin metadatos en zookeeper en `readonly` modo. [\#4691](https://github.com/ClickHouse/ClickHouse/pull/4691) ([alesapin](https://github.com/alesapin)) +- Parpadeo fijo de la barra de progreso en clickhouse-cliente. El problema fue más notable al usar `FORMAT Null` con consultas de streaming. [\#4811](https://github.com/ClickHouse/ClickHouse/pull/4811) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Permitir deshabilitar funciones con `hyperscan` biblioteca por usuario para limitar el uso de recursos potencialmente excesivo e incontrolado. [\#4816](https://github.com/ClickHouse/ClickHouse/pull/4816) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregue el registro del número de versión en todos los errores. [\#4824](https://github.com/ClickHouse/ClickHouse/pull/4824) ([propulsor](https://github.com/proller)) +- Se agregó restricción a la `multiMatch` funciones que requieren tamaño de cadena para encajar en `unsigned int`. También se agregó el número de límite de argumentos al `multiSearch` función. [\#4834](https://github.com/ClickHouse/ClickHouse/pull/4834) ([Más información](https://github.com/danlark1)) +- Uso mejorado del espacio de arañazos y manejo de errores en Hyperscan. [\#4866](https://github.com/ClickHouse/ClickHouse/pull/4866) ([Más información](https://github.com/danlark1)) +- Llenar `system.graphite_detentions` de una configuración de tabla de `*GraphiteMergeTree` mesas de motores. [\#4584](https://github.com/ClickHouse/ClickHouse/pull/4584) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Cambiar nombre `trigramDistance` función para `ngramDistance` y añadir más funciones con `CaseInsensitive` y `UTF`. [\#4602](https://github.com/ClickHouse/ClickHouse/pull/4602) ([Más información](https://github.com/danlark1)) +- Cálculo de índices de saltos de datos mejorado. [\#4640](https://github.com/ClickHouse/ClickHouse/pull/4640) ([Nikita Vasilev](https://github.com/nikvas0)) +- Mantener ordinario, `DEFAULT`, `MATERIALIZED` y `ALIAS` columnas en una sola lista (soluciona el problema [\#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [\#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Método de codificación de datos:](https://github.com/ztlpn)) + +#### Corrección de errores {#bug-fix-26} + +- Evitar `std::terminate` en caso de error de asignación de memoria. Ahora `std::bad_alloc` excepción se lanza como se esperaba. [\#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corrige la lectura de capnproto desde el búfer. A veces, los archivos no se cargaron correctamente por HTTP. [\#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) +- Corregir error `Unknown log entry type: 0` despues `OPTIMIZE TABLE FINAL` consulta. [\#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos pájaro](https://github.com/amosbird)) +- Argumentos erróneos para `hasAny` o `hasAll` funciones pueden conducir a segfault. [\#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Puede producirse un punto muerto durante la ejecución `DROP DATABASE dictionary` consulta. [\#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Repara el comportamiento indefinido en `median` y `quantile` función. [\#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([Hcz](https://github.com/hczhcz)) +- Corregir la detección de nivel de compresión cuando `network_compression_method` en minúsculas. Roto en v19.1. [\#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([propulsor](https://github.com/proller)) +- Se corrigió la ignorancia de `UTC` ajuste (soluciona el problema [\#4658](https://github.com/ClickHouse/ClickHouse/issues/4658)). [\#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([propulsor](https://github.com/proller)) +- Fijar `histogram` comportamiento de la función con `Distributed` tabla. [\#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([Olegkv](https://github.com/olegkv)) +- Informe tsan fijo `destroy of a locked mutex`. [\#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el informe de TSan sobre el cierre debido a la condición de carrera en el uso de registros del sistema. Se corrigió el uso potencial después de liberar al apagar cuando part\_log está habilitado. [\#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar las piezas de nuevo control en `ReplicatedMergeTreeAlterThread` en caso de error. [\#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Las operaciones aritméticas en estados de función de agregado intermedios no funcionaban para argumentos constantes (como los resultados de subconsulta). [\#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Siempre retroceda los nombres de las columnas en los metadatos. De lo contrario, es imposible crear una tabla con una columna llamada `index` (el servidor no se reiniciará debido a `ATTACH` consulta en metadatos). [\#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix crash en `ALTER ... MODIFY ORDER BY` en `Distributed` tabla. [\#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([Método de codificación de datos:](https://github.com/TCeason)) +- Arreglar segfault en `JOIN ON` con habilitado `enable_optimize_predicate_expression`. [\#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Invierno Zhang](https://github.com/zhang2014)) +- Corregir un error al agregar una fila extraña después de consumir un mensaje protobuf de Kafka. [\#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) +- Corregir el bloqueo de `JOIN` no aceptan vs columna que acepta valores null. Fijar `NULLs` en las teclas de la derecha en `ANY JOIN` + `join_use_nulls`. [\#4815](https://github.com/ClickHouse/ClickHouse/pull/4815) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijar falla de segmentación en `clickhouse-copier`. [\#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([propulsor](https://github.com/proller)) +- Condición de carrera fija en `SELECT` de `system.tables` si la tabla se cambia de nombre o se modifica simultáneamente. [\#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la carrera de datos al obtener una parte de datos que ya está obsoleta. [\#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la carrera de datos raros que puede ocurrir durante `RENAME` tabla de la familia MergeTree. [\#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fallo de segmentación fijo en la función `arrayIntersect`. La falla de segmentación podría ocurrir si se llamara a la función con argumentos constantes y ordinarios mixtos. [\#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) +- Lectura fija de `Array(LowCardinality)` columna en caso raro cuando la columna contenía una larga secuencia de matrices vacías. [\#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix crash en `FULL/RIGHT JOIN` cuando nos unimos en nullable vs no nullable. [\#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijar `No message received` excepción al recuperar partes entre réplicas. [\#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) +- Fijo `arrayIntersect` resultado incorrecto de la función en caso de varios valores repetidos en una sola matriz. [\#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir una condición de carrera durante `ALTER COLUMN` consultas que podrían provocar un bloqueo del servidor (soluciona el problema [\#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [\#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Corregir el resultado incorrecto en `FULL/RIGHT JOIN` con la columna const. [\#4723](https://github.com/ClickHouse/ClickHouse/pull/4723) ([Artem Zuikov](https://github.com/4ertus2)) +- Reparar duplicados en `GLOBAL JOIN` con asterisk. [\#4705](https://github.com/ClickHouse/ClickHouse/pull/4705) ([Artem Zuikov](https://github.com/4ertus2)) +- Corregir la deducción de parámetros en `ALTER MODIFY` de la columna `CODEC` cuando no se especifica el tipo de columna. [\#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) +- Función `cutQueryStringAndFragment()` y `queryStringAndFragment()` ahora funciona correctamente cuando `URL` contiene un fragmento y ninguna consulta. [\#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) +- Corregir un error raro al configurar `min_bytes_to_use_direct_io` es mayor que cero, lo que ocurre cuando el hilo tiene que buscar hacia atrás en el archivo de columna. [\#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) +- Corregir tipos de argumentos incorrectos para funciones agregadas con `LowCardinality` argumentos (soluciona el problema [\#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [\#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir la calificación de nombre incorrecto en `GLOBAL JOIN`. [\#4969](https://github.com/ClickHouse/ClickHouse/pull/4969) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijar la función `toISOWeek` resultado para el año 1970. [\#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar `DROP`, `TRUNCATE` y `OPTIMIZE` duplicación de consultas, cuando se ejecuta en `ON CLUSTER` para `ReplicatedMergeTree*` tablas de la familia. [\#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) + +#### Cambio incompatible hacia atrás {#backward-incompatible-change-8} + +- Cambiar el nombre de la configuración `insert_sample_with_metadata` establecer `input_format_defaults_for_omitted_fields`. [\#4771](https://github.com/ClickHouse/ClickHouse/pull/4771) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadido `max_partitions_per_insert_block` (con valor 100 por defecto). Si el bloque insertado contiene un mayor número de particiones, se lanza una excepción. Establezca en 0 si desea eliminar el límite (no recomendado). [\#4845](https://github.com/ClickHouse/ClickHouse/pull/4845) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se renombraron las funciones de búsqueda múltiple (`multiPosition` a `multiSearchAllPositions`, `multiSearch` a `multiSearchAny`, `firstMatch` a `multiSearchFirstIndex`). [\#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Más información](https://github.com/danlark1)) + +#### Mejora del rendimiento {#performance-improvement-6} + +- Optimice el buscador Volnitsky al alinear, dando aproximadamente un 5-10% de mejora de búsqueda para consultas con muchas agujas o muchos bigrams similares. [\#4862](https://github.com/ClickHouse/ClickHouse/pull/4862) ([Más información](https://github.com/danlark1)) +- Solucionar problema de rendimiento al configurar `use_uncompressed_cache` es mayor que cero, que apareció cuando todos los datos leídos contenidos en la memoria caché. [\#4913](https://github.com/ClickHouse/ClickHouse/pull/4913) ([alesapin](https://github.com/alesapin)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-10} + +- Endurecimiento de la compilación de depuración: más asignaciones de memoria granulares y ASLR; agregue protección de memoria para caché de marcas e índice. Esto permite encontrar más errores de memoria en caso de que ASan y MSan no puedan hacerlo. [\#4632](https://github.com/ClickHouse/ClickHouse/pull/4632) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir soporte para variables cmake `ENABLE_PROTOBUF`, `ENABLE_PARQUET` y `ENABLE_BROTLI` que permite habilitar / deshabilitar las características anteriores (lo mismo que podemos hacer para librdkafka, mysql, etc.). [\#4669](https://github.com/ClickHouse/ClickHouse/pull/4669) ([Silviu Caragea](https://github.com/silviucpp)) +- Agregue la capacidad de imprimir la lista de procesos y los rastros de pila de todos los hilos si algunas consultas se cuelgan después de la ejecución de la prueba. [\#4675](https://github.com/ClickHouse/ClickHouse/pull/4675) ([alesapin](https://github.com/alesapin)) +- Agregar reintentos en `Connection loss` error en `clickhouse-test`. [\#4682](https://github.com/ClickHouse/ClickHouse/pull/4682) ([alesapin](https://github.com/alesapin)) +- Agregue freebsd build con vagrant y compile con desinfectante de hilos al script del empaquetador. [\#4712](https://github.com/ClickHouse/ClickHouse/pull/4712) [\#4748](https://github.com/ClickHouse/ClickHouse/pull/4748) ([alesapin](https://github.com/alesapin)) +- Ahora el usuario pidió contraseña para el usuario `'default'` durante la instalación. [\#4725](https://github.com/ClickHouse/ClickHouse/pull/4725) ([propulsor](https://github.com/proller)) +- Suprimir advertencia en `rdkafka` biblioteca. [\#4740](https://github.com/ClickHouse/ClickHouse/pull/4740) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Permitir la capacidad de construir sin ssl. [\#4750](https://github.com/ClickHouse/ClickHouse/pull/4750) ([propulsor](https://github.com/proller)) +- Agregue una forma de iniciar una imagen de clickhouse-server desde un usuario personalizado. [\#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Actualice el impulso de contrib a 1.69. [\#4793](https://github.com/ClickHouse/ClickHouse/pull/4793) ([propulsor](https://github.com/proller)) +- Deshabilitar el uso de `mremap` cuando se compila con Thread Sanitizer. Sorprendentemente, TSan no intercepta `mremap` (aunque intercepta `mmap`, `munmap`) que conduce a falsos positivos. Informe TSan fijo en pruebas con estado. [\#4859](https://github.com/ClickHouse/ClickHouse/pull/4859) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregue comprobación de prueba usando el esquema de formato a través de la interfaz HTTP. [\#4864](https://github.com/ClickHouse/ClickHouse/pull/4864) ([Vitaly Baranov](https://github.com/vitlibar)) + +## Lanzamiento de ClickHouse 19.4 {#clickhouse-release-19-4} + +### Lanzamiento de ClickHouse 19.4.4.33, 2019-04-17 {#clickhouse-release-19-4-4-33-2019-04-17} + +#### Corrección de errores {#bug-fixes-7} + +- Evitar `std::terminate` en caso de error de asignación de memoria. Ahora `std::bad_alloc` excepción se lanza como se esperaba. [\#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corrige la lectura de capnproto desde el búfer. A veces, los archivos no se cargaron correctamente por HTTP. [\#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) +- Corregir error `Unknown log entry type: 0` despues `OPTIMIZE TABLE FINAL` consulta. [\#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos pájaro](https://github.com/amosbird)) +- Argumentos erróneos para `hasAny` o `hasAll` funciones pueden conducir a segfault. [\#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Puede producirse un punto muerto durante la ejecución `DROP DATABASE dictionary` consulta. [\#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Repara el comportamiento indefinido en `median` y `quantile` función. [\#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([Hcz](https://github.com/hczhcz)) +- Corregir la detección de nivel de compresión cuando `network_compression_method` en minúsculas. Roto en v19.1. [\#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([propulsor](https://github.com/proller)) +- Se corrigió la ignorancia de `UTC` ajuste (soluciona el problema [\#4658](https://github.com/ClickHouse/ClickHouse/issues/4658)). [\#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([propulsor](https://github.com/proller)) +- Fijar `histogram` comportamiento de la función con `Distributed` tabla. [\#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([Olegkv](https://github.com/olegkv)) +- Informe tsan fijo `destroy of a locked mutex`. [\#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el informe de TSan sobre el cierre debido a la condición de carrera en el uso de registros del sistema. Se corrigió el uso potencial después de liberar al apagar cuando part\_log está habilitado. [\#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar las piezas de nuevo control en `ReplicatedMergeTreeAlterThread` en caso de error. [\#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Las operaciones aritméticas en estados de función de agregado intermedios no funcionaban para argumentos constantes (como los resultados de subconsulta). [\#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Siempre retroceda los nombres de las columnas en los metadatos. De lo contrario, es imposible crear una tabla con una columna llamada `index` (el servidor no se reiniciará debido a `ATTACH` consulta en metadatos). [\#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix crash en `ALTER ... MODIFY ORDER BY` en `Distributed` tabla. [\#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([Método de codificación de datos:](https://github.com/TCeason)) +- Arreglar segfault en `JOIN ON` con habilitado `enable_optimize_predicate_expression`. [\#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Invierno Zhang](https://github.com/zhang2014)) +- Corregir un error al agregar una fila extraña después de consumir un mensaje protobuf de Kafka. [\#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fijar falla de segmentación en `clickhouse-copier`. [\#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([propulsor](https://github.com/proller)) +- Condición de carrera fija en `SELECT` de `system.tables` si la tabla se cambia de nombre o se modifica simultáneamente. [\#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la carrera de datos al obtener una parte de datos que ya está obsoleta. [\#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la carrera de datos raros que puede ocurrir durante `RENAME` tabla de la familia MergeTree. [\#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fallo de segmentación fijo en la función `arrayIntersect`. La falla de segmentación podría ocurrir si se llamara a la función con argumentos constantes y ordinarios mixtos. [\#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) +- Lectura fija de `Array(LowCardinality)` columna en caso raro cuando la columna contenía una larga secuencia de matrices vacías. [\#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fijar `No message received` excepción al recuperar partes entre réplicas. [\#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) +- Fijo `arrayIntersect` resultado incorrecto de la función en caso de varios valores repetidos en una sola matriz. [\#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir una condición de carrera durante `ALTER COLUMN` consultas que podrían provocar un bloqueo del servidor (soluciona el problema [\#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [\#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Corregir la deducción de parámetros en `ALTER MODIFY` de la columna `CODEC` cuando no se especifica el tipo de columna. [\#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) +- Función `cutQueryStringAndFragment()` y `queryStringAndFragment()` ahora funciona correctamente cuando `URL` contiene un fragmento y ninguna consulta. [\#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) +- Corregir un error raro al configurar `min_bytes_to_use_direct_io` es mayor que cero, lo que ocurre cuando el hilo tiene que buscar hacia atrás en el archivo de columna. [\#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) +- Corregir tipos de argumentos incorrectos para funciones agregadas con `LowCardinality` argumentos (soluciona el problema [\#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [\#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fijar la función `toISOWeek` resultado para el año 1970. [\#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar `DROP`, `TRUNCATE` y `OPTIMIZE` duplicación de consultas, cuando se ejecuta en `ON CLUSTER` para `ReplicatedMergeTree*` tablas de la familia. [\#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) + +#### Mejora {#improvements-2} + +- Mantener ordinario, `DEFAULT`, `MATERIALIZED` y `ALIAS` columnas en una sola lista (soluciona el problema [\#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [\#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Método de codificación de datos:](https://github.com/ztlpn)) + +### Lanzamiento de ClickHouse 19.4.3.11, 2019-04-02 {#clickhouse-release-19-4-3-11-2019-04-02} + +#### Corrección de errores {#bug-fixes-8} + +- Fix crash en `FULL/RIGHT JOIN` cuando nos unimos en nullable vs no nullable. [\#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijar falla de segmentación en `clickhouse-copier`. [\#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([propulsor](https://github.com/proller)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-11} + +- Agregue una forma de iniciar una imagen de clickhouse-server desde un usuario personalizado. [\#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) + +### Lanzamiento de ClickHouse 19.4.2.7, 2019-03-30 {#clickhouse-release-19-4-2-7-2019-03-30} + +#### Corrección de errores {#bug-fixes-9} + +- Lectura fija de `Array(LowCardinality)` columna en caso raro cuando la columna contenía una larga secuencia de matrices vacías. [\#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +### Lanzamiento de ClickHouse 19.4.1.3, 2019-03-19 {#clickhouse-release-19-4-1-3-2019-03-19} + +#### Corrección de errores {#bug-fixes-10} + +- Consultas remotas fijas que contienen ambos `LIMIT BY` y `LIMIT`. Anteriormente, si `LIMIT BY` y `LIMIT` se utilizaron para la consulta remota, `LIMIT` podría pasar antes `LIMIT BY`, cuál llevó al resultado demasiado filtrado. [\#4708](https://github.com/ClickHouse/ClickHouse/pull/4708) ([Constantin S. Pan](https://github.com/kvap)) + +### Lanzamiento de ClickHouse 19.4.0.49, 2019-03-09 {#clickhouse-release-19-4-0-49-2019-03-09} + +#### Novedad {#new-features-5} + +- Se agregó soporte completo para `Protobuf` formato (entrada y salida, estructuras de datos anidadas). [\#4174](https://github.com/ClickHouse/ClickHouse/pull/4174) [\#4493](https://github.com/ClickHouse/ClickHouse/pull/4493) ([Vitaly Baranov](https://github.com/vitlibar)) +- Se agregaron funciones de mapa de bits con mapas de bits rugientes. [\#4207](https://github.com/ClickHouse/ClickHouse/pull/4207) ([Cristina Andrés](https://github.com/andyyzh)) [\#4568](https://github.com/ClickHouse/ClickHouse/pull/4568) ([Vitaly Baranov](https://github.com/vitlibar)) +- Soporte de formato de parquet. [\#4448](https://github.com/ClickHouse/ClickHouse/pull/4448) ([propulsor](https://github.com/proller)) +- Se agregó una distancia de N-gramo para la comparación de cadenas difusas. Es similar a las métricas de q-gram en el lenguaje R. [\#4466](https://github.com/ClickHouse/ClickHouse/pull/4466) ([Más información](https://github.com/danlark1)) +- Combine reglas para el paquete acumulativo de grafito a partir de patrones de agregación y retención dedicados. [\#4426](https://github.com/ClickHouse/ClickHouse/pull/4426) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Añadir `max_execution_speed` y `max_execution_speed_bytes` para limitar el uso de recursos. Añadir `min_execution_speed_bytes` para complementar el `min_execution_speed`. [\#4430](https://github.com/ClickHouse/ClickHouse/pull/4430) ([Invierno Zhang](https://github.com/zhang2014)) +- Función implementada `flatten`. [\#4555](https://github.com/ClickHouse/ClickHouse/pull/4555) [\#4409](https://github.com/ClickHouse/ClickHouse/pull/4409) ([alexey-milovidov](https://github.com/alexey-milovidov), [Kzon](https://github.com/kzon)) +- Funciones añadidas `arrayEnumerateDenseRanked` y `arrayEnumerateUniqRanked` (es como `arrayEnumerateUniq` pero permite ajustar la profundidad de la matriz para mirar dentro de las matrices multidimensionales). [\#4475](https://github.com/ClickHouse/ClickHouse/pull/4475) ([propulsor](https://github.com/proller)) [\#4601](https://github.com/ClickHouse/ClickHouse/pull/4601) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Multiple JOINS with some restrictions: no asterisks, no complex aliases in ON/WHERE/GROUP BY/… [\#4462](https://github.com/ClickHouse/ClickHouse/pull/4462) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Corrección de errores {#bug-fixes-11} + +- Esta versión también contiene todas las correcciones de errores de 19.3 y 19.1. +- Se corrigió un error en los índices de omisión de datos: el orden de los gránulos después de INSERTAR era incorrecto. [\#4407](https://github.com/ClickHouse/ClickHouse/pull/4407) ([Nikita Vasilev](https://github.com/nikvas0)) +- Fijo `set` índice de `Nullable` y `LowCardinality` columna. Antes de eso, `set` índice con `Nullable` o `LowCardinality` columna llevó a error `Data type must be deserialized with multiple streams` mientras se selecciona. [\#4594](https://github.com/ClickHouse/ClickHouse/pull/4594) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Establecer correctamente update\_time en completo `executable` actualización del diccionario. [\#4551](https://github.com/ClickHouse/ClickHouse/pull/4551) ([Tema Novikov](https://github.com/temoon)) +- Arreglar la barra de progreso rota en 19.3. [\#4627](https://github.com/ClickHouse/ClickHouse/pull/4627) ([filimonov](https://github.com/filimonov)) +- Se corrigieron los valores inconsistentes de MemoryTracker cuando se redujo la región de la memoria, en ciertos casos. [\#4619](https://github.com/ClickHouse/ClickHouse/pull/4619) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Comportamiento indefinido fijo en ThreadPool. [\#4612](https://github.com/ClickHouse/ClickHouse/pull/4612) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió un accidente muy raro con el mensaje `mutex lock failed: Invalid argument` eso podría suceder cuando una tabla MergeTree se eliminó simultáneamente con un SELECT. [\#4608](https://github.com/ClickHouse/ClickHouse/pull/4608) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Compatibilidad del controlador ODBC con `LowCardinality` tipo de datos. [\#4381](https://github.com/ClickHouse/ClickHouse/pull/4381) ([propulsor](https://github.com/proller)) +- FreeBSD: Arreglo para `AIOcontextPool: Found io_event with unknown id 0` error. [\#4438](https://github.com/ClickHouse/ClickHouse/pull/4438) ([urgordeadbeef](https://github.com/urgordeadbeef)) +- `system.part_log` se creó independientemente de la configuración. [\#4483](https://github.com/ClickHouse/ClickHouse/pull/4483) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Repara el comportamiento indefinido en `dictIsIn` función para los diccionarios de caché. [\#4515](https://github.com/ClickHouse/ClickHouse/pull/4515) ([alesapin](https://github.com/alesapin)) +- Fixed a deadlock when a SELECT query locks the same table multiple times (e.g. from different threads or when executing multiple subqueries) and there is a concurrent DDL query. [\#4535](https://github.com/ClickHouse/ClickHouse/pull/4535) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Deshabilite compile\_expressions de forma predeterminada hasta que obtengamos el propio `llvm` contrib y puede probarlo con `clang` y `asan`. [\#4579](https://github.com/ClickHouse/ClickHouse/pull/4579) ([alesapin](https://github.com/alesapin)) +- Prevenir `std::terminate` cuando `invalidate_query` para `clickhouse` fuente de diccionario externo ha devuelto un conjunto de resultados incorrecto (vacío o más de una fila o más de una columna). Solucionado el problema cuando `invalidate_query` se realizó cada cinco segundos independientemente de la `lifetime`. [\#4583](https://github.com/ClickHouse/ClickHouse/pull/4583) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evite el punto muerto cuando `invalidate_query` para un diccionario con `clickhouse` fuente estaba involucrando `system.dictionaries` mesa o `Dictionaries` base de datos (caso raro). [\#4599](https://github.com/ClickHouse/ClickHouse/pull/4599) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Correcciones para CROSS JOIN con WHERE vacío. [\#4598](https://github.com/ClickHouse/ClickHouse/pull/4598) ([Artem Zuikov](https://github.com/4ertus2)) +- Segfault fijo en la función “replicate” cuando se pasa el argumento constante. [\#4603](https://github.com/ClickHouse/ClickHouse/pull/4603) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Repara la función lambda con el optimizador de predicados. [\#4408](https://github.com/ClickHouse/ClickHouse/pull/4408) ([Invierno Zhang](https://github.com/zhang2014)) +- Múltiples JOINs múltiples correcciones. [\#4595](https://github.com/ClickHouse/ClickHouse/pull/4595) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Mejora {#improvements-3} + +- Soporte alias en la sección JOIN ON para columnas de la tabla derecha. [\#4412](https://github.com/ClickHouse/ClickHouse/pull/4412) ([Artem Zuikov](https://github.com/4ertus2)) +- El resultado de múltiples JOIN necesita nombres de resultados correctos para ser utilizados en subselecciones. Reemplace los alias planos con nombres de origen en el resultado. [\#4474](https://github.com/ClickHouse/ClickHouse/pull/4474) ([Artem Zuikov](https://github.com/4ertus2)) +- Mejorar la lógica push-down para sentencias unidas. [\#4387](https://github.com/ClickHouse/ClickHouse/pull/4387) ([Ivan](https://github.com/abyss7)) + +#### Mejoras de rendimiento {#performance-improvements-3} + +- Heurística mejorada de “move to PREWHERE” optimización. [\#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Use tablas de búsqueda adecuadas que usen la API de HashTable para claves de 8 bits y 16 bits. [\#4536](https://github.com/ClickHouse/ClickHouse/pull/4536) ([Amos pájaro](https://github.com/amosbird)) +- Mejora del rendimiento de la comparación de cadenas. [\#4564](https://github.com/ClickHouse/ClickHouse/pull/4564) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Limpie la cola DDL distribuida en un subproceso separado para que no ralentice el bucle principal que procesa las tareas DDL distribuidas. [\#4502](https://github.com/ClickHouse/ClickHouse/pull/4502) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Cuando `min_bytes_to_use_direct_io` se establece en 1, no todos los archivos se abrieron con el modo O\_DIRECT porque el tamaño de los datos a leer a veces se subestimó por el tamaño de un bloque comprimido. [\#4526](https://github.com/ClickHouse/ClickHouse/pull/4526) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-12} + +- Se agregó soporte para clang-9 [\#4604](https://github.com/ClickHouse/ClickHouse/pull/4604) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Arreglar mal `__asm__` instrucciones (de nuevo) [\#4621](https://github.com/ClickHouse/ClickHouse/pull/4621) ([Konstantin Podshumok](https://github.com/podshumok)) +- Añadir capacidad para especificar la configuración para `clickhouse-performance-test` desde la línea de comandos. [\#4437](https://github.com/ClickHouse/ClickHouse/pull/4437) ([alesapin](https://github.com/alesapin)) +- Agregue pruebas de diccionarios a las pruebas de integración. [\#4477](https://github.com/ClickHouse/ClickHouse/pull/4477) ([alesapin](https://github.com/alesapin)) +- Se agregaron consultas desde el punto de referencia en el sitio web a pruebas de rendimiento automatizadas. [\#4496](https://github.com/ClickHouse/ClickHouse/pull/4496) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `xxhash.h` no existe en lz4 externo porque es un detalle de implementación y sus símbolos tienen un espacio de nombres con `XXH_NAMESPACE` macro. Cuando lz4 es externo, xxHash también tiene que ser externo, y los dependientes tienen que vincularlo. [\#4495](https://github.com/ClickHouse/ClickHouse/pull/4495) ([Películas De Sexo](https://github.com/orivej)) +- Se corrigió un caso cuando `quantileTiming` se puede llamar a la función de agregado con argumento de punto negativo o flotante (esto corrige la prueba de fuzz con un desinfectante de comportamiento indefinido). [\#4506](https://github.com/ClickHouse/ClickHouse/pull/4506) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corrección de errores de ortografía. [\#4531](https://github.com/ClickHouse/ClickHouse/pull/4531) ([sdk2](https://github.com/sdk2)) +- Corregir la compilación en Mac. [\#4371](https://github.com/ClickHouse/ClickHouse/pull/4371) ([Vitaly Baranov](https://github.com/vitlibar)) +- Construir correcciones para FreeBSD y varias configuraciones de compilación inusuales. [\#4444](https://github.com/ClickHouse/ClickHouse/pull/4444) ([propulsor](https://github.com/proller)) + +## Lanzamiento de ClickHouse 19.3 {#clickhouse-release-19-3} + +### Lanzamiento de ClickHouse 19.3.9.1, 2019-04-02 {#clickhouse-release-19-3-9-1-2019-04-02} + +#### Corrección de errores {#bug-fixes-12} + +- Fix crash en `FULL/RIGHT JOIN` cuando nos unimos en nullable vs no nullable. [\#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fijar falla de segmentación en `clickhouse-copier`. [\#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([propulsor](https://github.com/proller)) +- Lectura fija de `Array(LowCardinality)` columna en caso raro cuando la columna contenía una larga secuencia de matrices vacías. [\#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-13} + +- Agregue una forma de iniciar una imagen de clickhouse-server desde un usuario personalizado [\#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) + +### Lanzamiento de ClickHouse 19.3.7, 2019-03-12 {#clickhouse-release-19-3-7-2019-03-12} + +#### Corrección de errores {#bug-fixes-13} + +- Corregido el error en \# 3920. Este error se manifiesta como corrupción de caché aleatoria (mensajes `Unknown codec family code`, `Cannot seek through file`) y segfaults. Este error apareció por primera vez en la versión 19.1 y está presente en las versiones hasta 19.1.10 y 19.3.6. [\#4623](https://github.com/ClickHouse/ClickHouse/pull/4623) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.3.6, 2019-03-02 {#clickhouse-release-19-3-6-2019-03-02} + +#### Corrección de errores {#bug-fixes-14} + +- Cuando hay más de 1000 subprocesos en un grupo de subprocesos, `std::terminate` puede suceder en la salida del hilo. [Azat Khuzhin](https://github.com/azat) [\#4485](https://github.com/ClickHouse/ClickHouse/pull/4485) [\#4505](https://github.com/ClickHouse/ClickHouse/pull/4505) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora es posible crear `ReplicatedMergeTree*` tablas con comentarios sobre columnas sin valores predeterminados y tablas con códecs de columnas sin comentarios y valores predeterminados. También corrige la comparación de códecs. [\#4523](https://github.com/ClickHouse/ClickHouse/pull/4523) ([alesapin](https://github.com/alesapin)) +- Se corrigió el fallo en JOIN con matriz o tupla. [\#4552](https://github.com/ClickHouse/ClickHouse/pull/4552) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió el fallo en el clickhouse-copiadora con el mensaje `ThreadStatus not created`. [\#4540](https://github.com/ClickHouse/ClickHouse/pull/4540) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió el bloqueo en el cierre del servidor si se usaban DDL distribuidos. [\#4472](https://github.com/ClickHouse/ClickHouse/pull/4472) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Se imprimieron números de columna incorrectos en un mensaje de error sobre el análisis de formato de texto para columnas con un número mayor que 10. [\#4484](https://github.com/ClickHouse/ClickHouse/pull/4484) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejoras de compilación / prueba / empaquetado {#buildtestingpackaging-improvements-3} + +- Compilación fija con AVX habilitado. [\#4527](https://github.com/ClickHouse/ClickHouse/pull/4527) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Habilite la contabilidad extendida y la contabilidad IO basada en una versión buena conocida en lugar del kernel bajo el cual se compila. [\#4541](https://github.com/ClickHouse/ClickHouse/pull/4541) ([Nombre de la red inalámbrica (SSID):](https://github.com/nvartolomei)) +- Permitir omitir la configuración de core\_dump.size\_limit, advertencia en lugar de lanzar si el conjunto de límites falla. [\#4473](https://github.com/ClickHouse/ClickHouse/pull/4473) ([propulsor](https://github.com/proller)) +- Eliminado el `inline` etiquetas de `void readBinary(...)` en `Field.cpp`. También se fusionó redundante `namespace DB` bloque. [\#4530](https://github.com/ClickHouse/ClickHouse/pull/4530) ([Hcz](https://github.com/hczhcz)) + +### Lanzamiento de ClickHouse 19.3.5, 2019-02-21 {#clickhouse-release-19-3-5-2019-02-21} + +#### Corrección de errores {#bug-fixes-15} + +- Se corrigió un error con el procesamiento de grandes consultas de inserción http. [\#4454](https://github.com/ClickHouse/ClickHouse/pull/4454) ([alesapin](https://github.com/alesapin)) +- Se corrigió la incompatibilidad hacia atrás con versiones antiguas debido a una implementación incorrecta de `send_logs_level` configuración. [\#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Incompatibilidad hacia atrás fija de la función de la tabla `remote` introducido con comentarios de columna. [\#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.3.4, 2019-02-16 {#clickhouse-release-19-3-4-2019-02-16} + +#### Mejora {#improvements-4} + +- El tamaño del índice de tabla no se tiene en cuenta los límites de memoria al hacer `ATTACH TABLE` consulta. Evitó la posibilidad de que una tabla no se pueda adjuntar después de haber sido separada. [\#4396](https://github.com/ClickHouse/ClickHouse/pull/4396) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Levantó ligeramente el límite en el tamaño máximo de cadena y matriz recibido de ZooKeeper. Permite continuar trabajando con un mayor tamaño de `CLIENT_JVMFLAGS=-Djute.maxbuffer=...` en ZooKeeper. [\#4398](https://github.com/ClickHouse/ClickHouse/pull/4398) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Permitir reparar réplicas abandonadas incluso si ya tiene una gran cantidad de nodos en su cola. [\#4399](https://github.com/ClickHouse/ClickHouse/pull/4399) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregue un argumento requerido a `SET` índice (número máximo de filas almacenadas). [\#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Corrección de errores {#bug-fixes-16} + +- Fijo `WITH ROLLUP` resultado para grupo por solo `LowCardinality` clave. [\#4384](https://github.com/ClickHouse/ClickHouse/pull/4384) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Se corrigió un error en el índice establecido (dejando caer un gránulo si contiene más de `max_rows` filas). [\#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) +- Muchas correcciones de compilación de FreeBSD. [\#4397](https://github.com/ClickHouse/ClickHouse/pull/4397) ([propulsor](https://github.com/proller)) +- Se corrigió la sustitución de alias en consultas con subconsulta que contenía el mismo alias (problema [\#4110](https://github.com/ClickHouse/ClickHouse/issues/4110)). [\#4351](https://github.com/ClickHouse/ClickHouse/pull/4351) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Mejoras de compilación / prueba / empaquetado {#buildtestingpackaging-improvements-4} + +- Añadir capacidad de ejecutar `clickhouse-server` para pruebas sin estado en la imagen de la ventana acoplable. [\#4347](https://github.com/ClickHouse/ClickHouse/pull/4347) ([Vasily Nemkov](https://github.com/Enmk)) + +### Lanzamiento de ClickHouse 19.3.3, 2019-02-13 {#clickhouse-release-19-3-3-2019-02-13} + +#### Novedad {#new-features-6} + +- Se agregó el `KILL MUTATION` declaración que permite eliminar mutaciones que por alguna razón están atascadas. Añadir `latest_failed_part`, `latest_fail_time`, `latest_fail_reason` campos a la `system.mutations` mesa para una solución de problemas más fácil. [\#4287](https://github.com/ClickHouse/ClickHouse/pull/4287) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Función agregada agregada `entropy` que calcula la entropía de Shannon. [\#4238](https://github.com/ClickHouse/ClickHouse/pull/4238) ([Quid37](https://github.com/Quid37)) +- Añadida la capacidad de enviar consultas `INSERT INTO tbl VALUES (....` al servidor sin dividir en `query` y `data` parte. [\#4301](https://github.com/ClickHouse/ClickHouse/pull/4301) ([alesapin](https://github.com/alesapin)) +- Implementación genérica de `arrayWithConstant` se añadió la función. [\#4322](https://github.com/ClickHouse/ClickHouse/pull/4322) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Aplicado `NOT BETWEEN` operador de comparación. [\#4228](https://github.com/ClickHouse/ClickHouse/pull/4228) ([Dmitry Naumov](https://github.com/nezed)) +- Implementar `sumMapFiltered` para poder limitar el número de claves para las cuales los valores se sumarán por `sumMap`. [\#4129](https://github.com/ClickHouse/ClickHouse/pull/4129) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Se agregó soporte de `Nullable` tipos en `mysql` función de la tabla. [\#4198](https://github.com/ClickHouse/ClickHouse/pull/4198) ([Emmanuel Donin de Rosière](https://github.com/edonin)) +- Soporte para expresiones constantes arbitrarias en `LIMIT` clausula. [\#4246](https://github.com/ClickHouse/ClickHouse/pull/4246) ([K3box](https://github.com/k3box)) +- Añadir `topKWeighted` función de agregado que toma argumentos adicionales con peso (entero sin signo). [\#4245](https://github.com/ClickHouse/ClickHouse/pull/4245) ([Córdoba](https://github.com/andrewgolman)) +- `StorageJoin` ahora soporta `join_any_take_last_row` configuración que permite sobrescribir los valores existentes de la misma clave. [\#3973](https://github.com/ClickHouse/ClickHouse/pull/3973) ([Amos pájaro](https://github.com/amosbird) +- Función añadida `toStartOfInterval`. [\#4304](https://github.com/ClickHouse/ClickHouse/pull/4304) ([Vitaly Baranov](https://github.com/vitlibar)) +- Añadir `RowBinaryWithNamesAndTypes` formato. [\#4200](https://github.com/ClickHouse/ClickHouse/pull/4200) ([Oleg V. Kozlyuk](https://github.com/DarkWanderer)) +- Añadir `IPv4` y `IPv6` tipos de datos. Implementaciones más efectivas de `IPv*` función. [\#3669](https://github.com/ClickHouse/ClickHouse/pull/3669) ([Vasily Nemkov](https://github.com/Enmk)) +- Función añadida `toStartOfTenMinutes()`. [\#4298](https://github.com/ClickHouse/ClickHouse/pull/4298) ([Vitaly Baranov](https://github.com/vitlibar)) +- Añadir `Protobuf` formato de salida. [\#4005](https://github.com/ClickHouse/ClickHouse/pull/4005) [\#4158](https://github.com/ClickHouse/ClickHouse/pull/4158) ([Vitaly Baranov](https://github.com/vitlibar)) +- Añadido soporte brotli para la interfaz HTTP para la importación de datos (INSERTs). [\#4235](https://github.com/ClickHouse/ClickHouse/pull/4235) ([Mijaíl](https://github.com/fandyushin)) +- Se agregaron consejos mientras el usuario hace un error tipográfico en el nombre de la función o escribe el cliente de línea de comandos. [\#4239](https://github.com/ClickHouse/ClickHouse/pull/4239) ([Más información](https://github.com/danlark1)) +- Añadir `Query-Id` al encabezado de respuesta HTTP del servidor. [\#4231](https://github.com/ClickHouse/ClickHouse/pull/4231) ([Mijaíl](https://github.com/fandyushin)) + +#### Experimental características {#experimental-features-2} + +- Añadir `minmax` y `set` Índices de saltos de datos para la familia de motores de tablas MergeTree. [\#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) +- Añadido conversión de `CROSS JOIN` a `INNER JOIN` si es posible. [\#4221](https://github.com/ClickHouse/ClickHouse/pull/4221) [\#4266](https://github.com/ClickHouse/ClickHouse/pull/4266) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Corrección de errores {#bug-fixes-17} + +- Fijo `Not found column` para columnas duplicadas en `JOIN ON` apartado. [\#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) +- Hacer `START REPLICATED SENDS` comando iniciar envíos replicados. [\#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([Nombre de la red inalámbrica (SSID):](https://github.com/nvartolomei)) +- Ejecución de funciones agregadas fijas con `Array(LowCardinality)` argumento. [\#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Corregido el comportamiento incorrecto al hacer `INSERT ... SELECT ... FROM file(...)` consulta y archivo `CSVWithNames` o `TSVWIthNames` formato y falta la primera fila de datos. [\#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el fallo en la recarga del diccionario si el diccionario no está disponible. Este error apareció en 19.1.6. [\#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([propulsor](https://github.com/proller)) +- Fijo `ALL JOIN` con duplicados en la tabla derecha. [\#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) +- Fallo de segmentación fijo con `use_uncompressed_cache=1` y excepción con un tamaño incorrecto sin comprimir. Este error apareció en 19.1.6. [\#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) +- Fijo `compile_expressions` error con la comparación de fechas grandes (más que int16). [\#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) +- Bucle infinito fijo al seleccionar de la función de la tabla `numbers(0)`. [\#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deshabilitar temporalmente la optimización de predicados para `ORDER BY`. [\#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Invierno Zhang](https://github.com/zhang2014)) +- Fijo `Illegal instruction` error al usar funciones base64 en CPU antiguas. Este error se ha reproducido solo cuando ClickHouse se compiló con gcc-8. [\#4275](https://github.com/ClickHouse/ClickHouse/pull/4275) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijo `No message received` error al interactuar con PostgreSQL ODBC Driver a través de la conexión TLS. También corrige segfault cuando se utiliza MySQL ODBC Driver. [\#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el resultado incorrecto cuando `Date` y `DateTime` los argumentos se usan en ramas del operador condicional (función `if`). Añadido caso genérico para la función `if`. [\#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Los diccionarios de ClickHouse ahora se cargan dentro `clickhouse` proceso. [\#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el punto muerto cuando `SELECT` de una mesa con `File` el motor fue reintentado después `No such file or directory` error. [\#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Condición de carrera fija al seleccionar entre `system.tables` puede dar `table doesn't exist` error. [\#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-client` puede segfault al salir mientras carga datos para sugerencias de línea de comandos si se ejecutó en modo interactivo. [\#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se ha corregido un error cuando la ejecución de mutaciones que contienen `IN` Los operadores estaban produciendo resultados incorrectos. [\#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Error corregido: si hay una base de datos con `Dictionary` motor, todos los diccionarios obligados a cargar en el inicio del servidor, y si hay un diccionario con fuente ClickHouse de localhost, el diccionario no se puede cargar. [\#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el error cuando los registros del sistema se intentaban crear de nuevo al apagar el servidor. [\#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Devuelva correctamente el tipo correcto y maneje adecuadamente las cerraduras en `joinGet` función. [\#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos pájaro](https://github.com/amosbird)) +- Añadir `sumMapWithOverflow` función. [\#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Segfault fijo con `allow_experimental_multiple_joins_emulation`. [52de2c](https://github.com/ClickHouse/ClickHouse/commit/52de2cd927f7b5257dd67e175f0a5560a48840d0) ([Artem Zuikov](https://github.com/4ertus2)) +- Corregido error con incorrecto `Date` y `DateTime` comparación. [\#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([Valexey](https://github.com/valexey)) +- Prueba de fuzz fija bajo desinfectante de comportamiento indefinido: verificación de tipo de parámetro agregada para `quantile*Weighted` familia de funciones. [\#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la condición de carrera rara al eliminar las piezas de datos antiguas que pueden fallar con `File not found` error. [\#4378](https://github.com/ClickHouse/ClickHouse/pull/4378) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Arregle el paquete de instalación con /etc/clickhouse-server/config que falta.XML. [\#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([propulsor](https://github.com/proller)) + +#### Mejoras de compilación / prueba / empaquetado {#buildtestingpackaging-improvements-5} + +- Paquete de Debian: correcto /etc/clickhouse-server/preprocessed link según config. [\#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([propulsor](https://github.com/proller)) +- Varias correcciones de compilación para FreeBSD. [\#4225](https://github.com/ClickHouse/ClickHouse/pull/4225) ([propulsor](https://github.com/proller)) +- Se agregó la capacidad de crear, rellenar y soltar tablas en perftest. [\#4220](https://github.com/ClickHouse/ClickHouse/pull/4220) ([alesapin](https://github.com/alesapin)) +- Se ha añadido un script para comprobar si hay duplicados incluye. [\#4326](https://github.com/ClickHouse/ClickHouse/pull/4326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó la capacidad de ejecutar consultas por índice en la prueba de rendimiento. [\#4264](https://github.com/ClickHouse/ClickHouse/pull/4264) ([alesapin](https://github.com/alesapin)) +- Se sugiere instalar un paquete con símbolos de depuración. [\#4274](https://github.com/ClickHouse/ClickHouse/pull/4274) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Refactorización de pruebas de rendimiento. Mejor registro y manejo de señales. [\#4171](https://github.com/ClickHouse/ClickHouse/pull/4171) ([alesapin](https://github.com/alesapin)) +- Se agregaron documentos a Yandex anónimo.Conjuntos de datos Metrika. [\#4164](https://github.com/ClickHouse/ClickHouse/pull/4164) ([alesapin](https://github.com/alesapin)) +- Аdded tool for converting an old month-partitioned part to the custom-partitioned format. [\#4195](https://github.com/ClickHouse/ClickHouse/pull/4195) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Se agregaron documentos sobre dos conjuntos de datos en s3. [\#4144](https://github.com/ClickHouse/ClickHouse/pull/4144) ([alesapin](https://github.com/alesapin)) +- Se agregó un script que crea un registro de cambios a partir de la descripción de las solicitudes de extracción. [\#4169](https://github.com/ClickHouse/ClickHouse/pull/4169) [\#4173](https://github.com/ClickHouse/ClickHouse/pull/4173) ([KochetovNicolai](https://github.com/KochetovNicolai)) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Se agregó un módulo de marionetas para Clickhouse. [\#4182](https://github.com/ClickHouse/ClickHouse/pull/4182) ([Maxim Fedotov](https://github.com/MaxFedotov)) +- Se agregaron documentos para un grupo de funciones no documentadas. [\#4168](https://github.com/ClickHouse/ClickHouse/pull/4168) ([Invierno Zhang](https://github.com/zhang2014)) +- ARM correcciones de construcción. [\#4210](https://github.com/ClickHouse/ClickHouse/pull/4210)[\#4306](https://github.com/ClickHouse/ClickHouse/pull/4306) [\#4291](https://github.com/ClickHouse/ClickHouse/pull/4291) ([propulsor](https://github.com/proller)) ([propulsor](https://github.com/proller)) +- Las pruebas de diccionario ahora pueden ejecutarse desde `ctest`. [\#4189](https://github.com/ClickHouse/ClickHouse/pull/4189) ([propulsor](https://github.com/proller)) +- Ahora `/etc/ssl` se utiliza como directorio predeterminado con certificados SSL. [\#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó la comprobación de las instrucciones SSE y AVX al inicio. [\#4234](https://github.com/ClickHouse/ClickHouse/pull/4234) ([Igr](https://github.com/igron99)) +- La secuencia de comandos Init esperará el servidor hasta el inicio. [\#4281](https://github.com/ClickHouse/ClickHouse/pull/4281) ([propulsor](https://github.com/proller)) + +#### Cambios incompatibles hacia atrás {#backward-incompatible-changes-1} + +- Quitar `allow_experimental_low_cardinality_type` configuración. `LowCardinality` los tipos de datos están listos para la producción. [\#4323](https://github.com/ClickHouse/ClickHouse/pull/4323) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reduzca el tamaño de la caché de marca y el tamaño de la caché sin comprimir según la cantidad de memoria disponible. [\#4240](https://github.com/ClickHouse/ClickHouse/pull/4240) ([Lopatin Konstantin](https://github.com/k-lopatin) +- Palabra clave añadida `INDEX` en `CREATE TABLE` consulta. Una columna con nombre `index` debe citarse con retrocesos o comillas dobles: `` `index` ``. [\#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) +- `sumMap` ahora promueve el tipo de resultado en lugar de desbordamiento. Antiguo `sumMap` se puede obtener mediante el uso de `sumMapWithOverflow` función. [\#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) + +#### Mejoras de rendimiento {#performance-improvements-4} + +- `std::sort` sustituido por `pdqsort` para consultas sin `LIMIT`. [\#4236](https://github.com/ClickHouse/ClickHouse/pull/4236) ([Evgenii Pravda](https://github.com/kvinty)) +- Ahora el servidor reutiliza subprocesos del grupo de subprocesos global. Esto afecta el rendimiento en algunos casos de esquina. [\#4150](https://github.com/ClickHouse/ClickHouse/pull/4150) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejora {#improvements-5} + +- Implementado soporte AIO para FreeBSD. [\#4305](https://github.com/ClickHouse/ClickHouse/pull/4305) ([urgordeadbeef](https://github.com/urgordeadbeef)) +- `SELECT * FROM a JOIN b USING a, b` ahora volver `a` y `b` solo de la tabla de la izquierda. [\#4141](https://github.com/ClickHouse/ClickHouse/pull/4141) ([Artem Zuikov](https://github.com/4ertus2)) +- Permitir `-C` opción del cliente para trabajar como `-c` opcion. [\#4232](https://github.com/ClickHouse/ClickHouse/pull/4232) ([syominsergey](https://github.com/syominsergey)) +- Ahora opción `--password` utilizado sin valor requiere contraseña de stdin. [\#4230](https://github.com/ClickHouse/ClickHouse/pull/4230) ([BSD\_Conqueror](https://github.com/bsd-conqueror)) +- Se agregó resaltado de metacaracteres no escapados en literales de cadena que contienen `LIKE` expresiones o regex. [\#4327](https://github.com/ClickHouse/ClickHouse/pull/4327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó la cancelación de las consultas de solo lectura HTTP si el socket del cliente desaparece. [\#4213](https://github.com/ClickHouse/ClickHouse/pull/4213) ([Nombre de la red inalámbrica (SSID):](https://github.com/nvartolomei)) +- Ahora los informes del servidor progresan para mantener vivas las conexiones del cliente. [\#4215](https://github.com/ClickHouse/ClickHouse/pull/4215) ([Ivan](https://github.com/abyss7)) +- Mensaje ligeramente mejor con motivo para OPTIMIZE consulta con `optimize_throw_if_noop` configuración activada. [\#4294](https://github.com/ClickHouse/ClickHouse/pull/4294) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó soporte de `--version` opción para el servidor de clickhouse. [\#4251](https://github.com/ClickHouse/ClickHouse/pull/4251) ([Lopatin Konstantin](https://github.com/k-lopatin)) +- Añadir `--help/-h` opción para `clickhouse-server`. [\#4233](https://github.com/ClickHouse/ClickHouse/pull/4233) ([Yuriy Baranov](https://github.com/yurriy)) +- Se agregó soporte para subconsultas escalares con el resultado del estado de la función agregada. [\#4348](https://github.com/ClickHouse/ClickHouse/pull/4348) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Mejora del tiempo de apagado del servidor y ALTERa el tiempo de espera. [\#4372](https://github.com/ClickHouse/ClickHouse/pull/4372) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se ha añadido información sobre la configuración de la línea de replicado\_can\_become\_leader en el sistema.réplicas y agregue registro si la réplica no intenta convertirse en líder. [\#4379](https://github.com/ClickHouse/ClickHouse/pull/4379) ([Método de codificación de datos:](https://github.com/ztlpn)) + +## Lanzamiento de ClickHouse 19.1 {#clickhouse-release-19-1} + +### Lanzamiento de ClickHouse 19.1.14, 2019-03-14 {#clickhouse-release-19-1-14-2019-03-14} + +- Error fijo `Column ... queried more than once` que puede suceder si la configuración `asterisk_left_columns_only` se establece en 1 en caso de usar `GLOBAL JOIN` con `SELECT *` (caso raro). El problema no existe en 19.3 y posteriores. [6bac7d8d](https://github.com/ClickHouse/ClickHouse/pull/4692/commits/6bac7d8d11a9b0d6de0b32b53c47eb2f6f8e7062) ([Artem Zuikov](https://github.com/4ertus2)) + +### Lanzamiento de ClickHouse 19.1.13, 2019-03-12 {#clickhouse-release-19-1-13-2019-03-12} + +Esta versión contiene exactamente el mismo conjunto de parches que 19.3.7. + +### Lanzamiento de ClickHouse 19.1.10, 2019-03-03 {#clickhouse-release-19-1-10-2019-03-03} + +Esta versión contiene exactamente el mismo conjunto de parches que 19.3.6. + +## Lanzamiento de ClickHouse 19.1 {#clickhouse-release-19-1-1} + +### Lanzamiento de ClickHouse 19.1.9, 2019-02-21 {#clickhouse-release-19-1-9-2019-02-21} + +#### Corrección de errores {#bug-fixes-18} + +- Se corrigió la incompatibilidad hacia atrás con versiones antiguas debido a una implementación incorrecta de `send_logs_level` configuración. [\#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Incompatibilidad hacia atrás fija de la función de la tabla `remote` introducido con comentarios de columna. [\#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.1.8, 2019-02-16 {#clickhouse-release-19-1-8-2019-02-16} + +#### Corrección de errores {#bug-fixes-19} + +- Arregle el paquete de instalación con /etc/clickhouse-server/config que falta.XML. [\#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([propulsor](https://github.com/proller)) + +## Lanzamiento de ClickHouse 19.1 {#clickhouse-release-19-1-2} + +### Lanzamiento de ClickHouse 19.1.7, 2019-02-15 {#clickhouse-release-19-1-7-2019-02-15} + +#### Corrección de errores {#bug-fixes-20} + +- Devuelva correctamente el tipo correcto y maneje adecuadamente las cerraduras en `joinGet` función. [\#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos pájaro](https://github.com/amosbird)) +- Se corrigió el error cuando los registros del sistema se intentaban crear de nuevo al apagar el servidor. [\#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Error corregido: si hay una base de datos con `Dictionary` motor, todos los diccionarios obligados a cargar en el inicio del servidor, y si hay un diccionario con fuente ClickHouse de localhost, el diccionario no se puede cargar. [\#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se ha corregido un error cuando la ejecución de mutaciones que contienen `IN` Los operadores estaban produciendo resultados incorrectos. [\#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Método de codificación de datos:](https://github.com/ztlpn)) +- `clickhouse-client` puede segfault al salir mientras carga datos para sugerencias de línea de comandos si se ejecutó en modo interactivo. [\#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Condición de carrera fija al seleccionar entre `system.tables` puede dar `table doesn't exist` error. [\#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el punto muerto cuando `SELECT` de una mesa con `File` el motor fue reintentado después `No such file or directory` error. [\#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se ha solucionado un problema: los diccionarios locales de ClickHouse se cargan a través de TCP, pero deberían cargarse dentro del proceso. [\#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijo `No message received` error al interactuar con PostgreSQL ODBC Driver a través de la conexión TLS. También corrige segfault cuando se utiliza MySQL ODBC Driver. [\#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deshabilitar temporalmente la optimización de predicados para `ORDER BY`. [\#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Invierno Zhang](https://github.com/zhang2014)) +- Bucle infinito fijo al seleccionar de la función de la tabla `numbers(0)`. [\#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijo `compile_expressions` error con la comparación de fechas grandes (más que int16). [\#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) +- Fallo de segmentación fijo con `uncompressed_cache=1` y excepción con un tamaño incorrecto sin comprimir. [\#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) +- Fijo `ALL JOIN` con duplicados en la tabla derecha. [\#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) +- Corregido el comportamiento incorrecto al hacer `INSERT ... SELECT ... FROM file(...)` consulta y archivo `CSVWithNames` o `TSVWIthNames` formato y falta la primera fila de datos. [\#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ejecución de funciones agregadas fijas con `Array(LowCardinality)` argumento. [\#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Paquete de Debian: correcto /etc/clickhouse-server/preprocessed link según config. [\#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([propulsor](https://github.com/proller)) +- Prueba de fuzz fija bajo desinfectante de comportamiento indefinido: verificación de tipo de parámetro agregada para `quantile*Weighted` familia de funciones. [\#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Hacer `START REPLICATED SENDS` comando iniciar envíos replicados. [\#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([Nombre de la red inalámbrica (SSID):](https://github.com/nvartolomei)) +- Fijo `Not found column` para columnas duplicadas en la sección JOIN ON. [\#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) +- Ahora `/etc/ssl` se utiliza como directorio predeterminado con certificados SSL. [\#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el fallo en la recarga del diccionario si el diccionario no está disponible. [\#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([propulsor](https://github.com/proller)) +- Corregido error con incorrecto `Date` y `DateTime` comparación. [\#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([Valexey](https://github.com/valexey)) +- Se corrigió el resultado incorrecto cuando `Date` y `DateTime` los argumentos se usan en ramas del operador condicional (función `if`). Añadido caso genérico para la función `if`. [\#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Lanzamiento de ClickHouse 19.1.6, 2019-01-24 {#clickhouse-release-19-1-6-2019-01-24} + +#### Novedad {#new-features-7} + +- Códecs de compresión personalizados por columna para tablas. [\#3899](https://github.com/ClickHouse/ClickHouse/pull/3899) [\#4111](https://github.com/ClickHouse/ClickHouse/pull/4111) ([alesapin](https://github.com/alesapin), [Invierno Zhang](https://github.com/zhang2014), [Anatoly](https://github.com/Sindbag)) +- Añadido codec de compresión `Delta`. [\#4052](https://github.com/ClickHouse/ClickHouse/pull/4052) ([alesapin](https://github.com/alesapin)) +- Permitir a `ALTER` códecs de compresión. [\#4054](https://github.com/ClickHouse/ClickHouse/pull/4054) ([alesapin](https://github.com/alesapin)) +- Funciones añadidas `left`, `right`, `trim`, `ltrim`, `rtrim`, `timestampadd`, `timestampsub` para la compatibilidad estándar SQL. [\#3826](https://github.com/ClickHouse/ClickHouse/pull/3826) ([Ivan Blinkov](https://github.com/blinkov)) +- Soporte para escribir en `HDFS` mesas y `hdfs` función de la tabla. [\#4084](https://github.com/ClickHouse/ClickHouse/pull/4084) ([alesapin](https://github.com/alesapin)) +- Funciones añadidas para buscar múltiples cadenas constantes de gran pajar: `multiPosition`, `multiSearch` ,`firstMatch` también con `-UTF8`, `-CaseInsensitive`, y `-CaseInsensitiveUTF8` variante. [\#4053](https://github.com/ClickHouse/ClickHouse/pull/4053) ([Más información](https://github.com/danlark1)) +- Poda de fragmentos no utilizados si `SELECT` filtros de consulta por clave sharding (configuración `optimize_skip_unused_shards`). [\#3851](https://github.com/ClickHouse/ClickHouse/pull/3851) ([Gleb Kanterov](https://github.com/kanterov), [Ivan](https://github.com/abyss7)) +- Permitir `Kafka` para ignorar cierta cantidad de errores de análisis por bloque. [\#4094](https://github.com/ClickHouse/ClickHouse/pull/4094) ([Ivan](https://github.com/abyss7)) +- Añadido soporte para `CatBoost` evaluación de modelos multiclase. Función `modelEvaluate` devuelve tupla con predicciones sin procesar por clase para modelos multiclase. `libcatboostmodel.so` debe ser construido con [\#607](https://github.com/catboost/catboost/pull/607). [\#3959](https://github.com/ClickHouse/ClickHouse/pull/3959) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Funciones añadidas `filesystemAvailable`, `filesystemFree`, `filesystemCapacity`. [\#4097](https://github.com/ClickHouse/ClickHouse/pull/4097) ([Boris Granveaud](https://github.com/bgranvea)) +- Funciones hash añadidas `xxHash64` y `xxHash32`. [\#3905](https://github.com/ClickHouse/ClickHouse/pull/3905) ([filimonov](https://github.com/filimonov)) +- Añadir `gccMurmurHash` función de hash (hash de Murmur con sabor a GCC) que usa la misma semilla de hash que [Gcc](https://github.com/gcc-mirror/gcc/blob/41d6b10e96a1de98e90a7c0378437c3255814b16/libstdc%2B%2B-v3/include/bits/functional_hash.h#L191) [\#4000](https://github.com/ClickHouse/ClickHouse/pull/4000) ([Sundyli](https://github.com/sundy-li)) +- Funciones hash añadidas `javaHash`, `hiveHash`. [\#3811](https://github.com/ClickHouse/ClickHouse/pull/3811) ([shangshujie365](https://github.com/shangshujie365)) +- Función de tabla añadida `remoteSecure`. Funciona como `remote`, pero usa una conexión segura. [\#4088](https://github.com/ClickHouse/ClickHouse/pull/4088) ([propulsor](https://github.com/proller)) + +#### Experimental características {#experimental-features-3} + +- Se agregaron múltiples emulaciones JOINs (`allow_experimental_multiple_joins_emulation` configuración). [\#3946](https://github.com/ClickHouse/ClickHouse/pull/3946) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Corrección de errores {#bug-fixes-21} + +- Hacer `compiled_expression_cache_size` ajuste limitado por defecto para reducir el consumo de memoria. [\#4041](https://github.com/ClickHouse/ClickHouse/pull/4041) ([alesapin](https://github.com/alesapin)) +- Se corrigió un error que provocaba bloqueos en los subprocesos que realizaban ALTERs de tablas replicadas y en el subproceso que actualizaba la configuración de ZooKeeper. [\#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [\#3891](https://github.com/ClickHouse/ClickHouse/issues/3891) [\#3934](https://github.com/ClickHouse/ClickHouse/pull/3934) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Se corrigió una condición de carrera al ejecutar una tarea ALTER distribuida. La condición de carrera provocó que más de una réplica intentara ejecutar la tarea y todas las réplicas, excepto una que fallara con un error de ZooKeeper. [\#3904](https://github.com/ClickHouse/ClickHouse/pull/3904) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Corregir un error cuando `from_zk` Los elementos de configuración no se actualizaron después de que se agotó el tiempo de espera de una solicitud a ZooKeeper. [\#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [\#3947](https://github.com/ClickHouse/ClickHouse/pull/3947) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Corregir un error con el prefijo incorrecto para las máscaras de subred IPv4. [\#3945](https://github.com/ClickHouse/ClickHouse/pull/3945) ([alesapin](https://github.com/alesapin)) +- Se corrigió el fallo (`std::terminate`) en casos excepcionales cuando no se puede crear un nuevo subproceso debido a recursos agotados. [\#3956](https://github.com/ClickHouse/ClickHouse/pull/3956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir error cuando está en `remote` ejecución de la función de tabla cuando se usaron restricciones incorrectas para `getStructureOfRemoteTable`. [\#4009](https://github.com/ClickHouse/ClickHouse/pull/4009) ([alesapin](https://github.com/alesapin)) +- Corregir una fuga de enchufes netlink. Se colocaron en un grupo donde nunca se eliminaron y se crearon nuevos sockets al comienzo de un nuevo subproceso cuando todos los sockets actuales estaban en uso. [\#4017](https://github.com/ClickHouse/ClickHouse/pull/4017) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Corregir un error con el cierre `/proc/self/fd` directorio antes de todos los fds fueron leídos de `/proc` después de bifurcar `odbc-bridge` subproceso. [\#4120](https://github.com/ClickHouse/ClickHouse/pull/4120) ([alesapin](https://github.com/alesapin)) +- Conversión monótona de cadena a UInt fija en caso de uso de cadena en clave primaria. [\#3870](https://github.com/ClickHouse/ClickHouse/pull/3870) ([Invierno Zhang](https://github.com/zhang2014)) +- Se corrigió el error en el cálculo de la monotonía de la función de conversión de enteros. [\#3921](https://github.com/ClickHouse/ClickHouse/pull/3921) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Segfault fijo en `arrayEnumerateUniq`, `arrayEnumerateDense` funciones en caso de algunos argumentos no válidos. [\#3909](https://github.com/ClickHouse/ClickHouse/pull/3909) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reparar UB en StorageMerge. [\#3910](https://github.com/ClickHouse/ClickHouse/pull/3910) ([Amos pájaro](https://github.com/amosbird)) +- Segfault fijo en funciones `addDays`, `subtractDays`. [\#3913](https://github.com/ClickHouse/ClickHouse/pull/3913) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregido el error: funciones `round`, `floor`, `trunc`, `ceil` puede devolver un resultado falso cuando se ejecuta en un argumento entero y una gran escala negativa. [\#3914](https://github.com/ClickHouse/ClickHouse/pull/3914) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió un error inducido por ‘kill query sync’ lo que conduce a un volcado central. [\#3916](https://github.com/ClickHouse/ClickHouse/pull/3916) ([muVulDeePecker](https://github.com/fancyqlx)) +- Corregir un error con un largo retraso después de la cola de replicación vacía. [\#3928](https://github.com/ClickHouse/ClickHouse/pull/3928) [\#3932](https://github.com/ClickHouse/ClickHouse/pull/3932) ([alesapin](https://github.com/alesapin)) +- Se corrigió el uso excesivo de memoria en caso de insertar en la tabla con `LowCardinality` clave primaria. [\#3955](https://github.com/ClickHouse/ClickHouse/pull/3955) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fijo `LowCardinality` serialización para `Native` formato en caso de matrices vacías. [\#3907](https://github.com/ClickHouse/ClickHouse/issues/3907) [\#4011](https://github.com/ClickHouse/ClickHouse/pull/4011) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Se corrigió el resultado incorrecto al usar distinta por una sola columna numérica LowCardinality. [\#3895](https://github.com/ClickHouse/ClickHouse/issues/3895) [\#4012](https://github.com/ClickHouse/ClickHouse/pull/4012) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Se corrigió la agregación especializada con la clave LowCardinality (en caso de `compile` está habilitada la configuración). [\#3886](https://github.com/ClickHouse/ClickHouse/pull/3886) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Corregir el reenvío de usuarios y contraseñas para consultas de tablas replicadas. [\#3957](https://github.com/ClickHouse/ClickHouse/pull/3957) ([alesapin](https://github.com/alesapin)) ([小路](https://github.com/nicelulu)) +- Se corrigió una condición de carrera muy rara que puede ocurrir al enumerar tablas en la base de datos de diccionarios mientras recargaba diccionarios. [\#3970](https://github.com/ClickHouse/ClickHouse/pull/3970) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el resultado incorrecto cuando se usaba HAVING con ROLLUP o CUBE. [\#3756](https://github.com/ClickHouse/ClickHouse/issues/3756) [\#3837](https://github.com/ClickHouse/ClickHouse/pull/3837) ([Más información](https://github.com/reflection)) +- Se corrigieron alias de columna para consultas con `JOIN ON` sintaxis y tablas distribuidas. [\#3980](https://github.com/ClickHouse/ClickHouse/pull/3980) ([Invierno Zhang](https://github.com/zhang2014)) +- Se corrigió un error en la implementación interna de `quantileTDigest` (encontrado por Artem Vakhrushev). Este error nunca ocurre en ClickHouse y fue relevante solo para aquellos que usan la base de código ClickHouse como una biblioteca directamente. [\#3935](https://github.com/ClickHouse/ClickHouse/pull/3935) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Mejora {#improvements-6} + +- Soporte para `IF NOT EXISTS` en `ALTER TABLE ADD COLUMN` declaraciones junto con `IF EXISTS` en `DROP/MODIFY/CLEAR/COMMENT COLUMN`. [\#3900](https://github.com/ClickHouse/ClickHouse/pull/3900) ([Boris Granveaud](https://github.com/bgranvea)) +- Función `parseDateTimeBestEffort`: soporte para formatos `DD.MM.YYYY`, `DD.MM.YY`, `DD-MM-YYYY`, `DD-Mon-YYYY`, `DD/Month/YYYY` y similares. [\#3922](https://github.com/ClickHouse/ClickHouse/pull/3922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `CapnProtoInputStream` ahora soportan estructuras dentadas. [\#4063](https://github.com/ClickHouse/ClickHouse/pull/4063) ([Odin Hultgren Van Der Horst](https://github.com/Miniwoffer)) +- Mejora de la usabilidad: se agregó una verificación de que el proceso del servidor se inicia desde el propietario del directorio de datos. No permita iniciar el servidor desde la raíz si los datos pertenecen a un usuario no root. [\#3785](https://github.com/ClickHouse/ClickHouse/pull/3785) ([Más información](https://github.com/sergey-v-galtsev)) +- Mejor lógica de verificación de columnas requeridas durante el análisis de consultas con JOINs. [\#3930](https://github.com/ClickHouse/ClickHouse/pull/3930) ([Artem Zuikov](https://github.com/4ertus2)) +- Disminución del número de conexiones en caso de un gran número de tablas distribuidas en un único servidor. [\#3726](https://github.com/ClickHouse/ClickHouse/pull/3726) ([Invierno Zhang](https://github.com/zhang2014)) +- Fila de totales admitidos para `WITH TOTALS` consulta para el controlador ODBC. [\#3836](https://github.com/ClickHouse/ClickHouse/pull/3836) ([Maksim Koritckiy](https://github.com/nightweb)) +- Permitido utilizar `Enum`s como enteros dentro de la función if. [\#3875](https://github.com/ClickHouse/ClickHouse/pull/3875) ([Ivan](https://github.com/abyss7)) +- Añadir `low_cardinality_allow_in_native_format` configuración. Si está desactivado, no utilice `LowCadrinality` escriba en `Native` formato. [\#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Se eliminaron algunos objetos redundantes de la caché de expresiones compiladas para reducir el uso de memoria. [\#4042](https://github.com/ClickHouse/ClickHouse/pull/4042) ([alesapin](https://github.com/alesapin)) +- Añadir comprobar que `SET send_logs_level = 'value'` consulta acepta el valor apropiado. [\#3873](https://github.com/ClickHouse/ClickHouse/pull/3873) ([Sabyanin Maxim](https://github.com/s-mx)) +- Verificación de tipo de datos fijos en las funciones de conversión de tipo. [\#3896](https://github.com/ClickHouse/ClickHouse/pull/3896) ([Invierno Zhang](https://github.com/zhang2014)) + +#### Mejoras de rendimiento {#performance-improvements-5} + +- Agregar una configuración MergeTree `use_minimalistic_part_header_in_zookeeper`. Si está habilitada, las tablas replicadas almacenarán metadatos de piezas compactas en un único znode de piezas. Esto puede reducir drásticamente el tamaño de la instantánea ZooKeeper (especialmente si las tablas tienen muchas columnas). Tenga en cuenta que después de habilitar esta configuración, no podrá degradar a una versión que no la admita. [\#3960](https://github.com/ClickHouse/ClickHouse/pull/3960) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Agregar una implementación basada en DFA para funciones `sequenceMatch` y `sequenceCount` en caso de que el patrón no contenga tiempo. [\#4004](https://github.com/ClickHouse/ClickHouse/pull/4004) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Mejora del rendimiento para la serialización de números enteros. [\#3968](https://github.com/ClickHouse/ClickHouse/pull/3968) ([Amos pájaro](https://github.com/amosbird)) +- Cero a la izquierda relleno PODArray de modo que -1 elemento es siempre válido y puesto a cero. Se utiliza para el cálculo sin ramas de compensaciones. [\#3920](https://github.com/ClickHouse/ClickHouse/pull/3920) ([Amos pájaro](https://github.com/amosbird)) +- Revertir `jemalloc` versión que conducen a la degradación del rendimiento. [\#4018](https://github.com/ClickHouse/ClickHouse/pull/4018) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Cambios incompatibles hacia atrás {#backward-incompatible-changes-2} + +- Se eliminó la función no documentada `ALTER MODIFY PRIMARY KEY` porque fue reemplazado por el `ALTER MODIFY ORDER BY` comando. [\#3887](https://github.com/ClickHouse/ClickHouse/pull/3887) ([Método de codificación de datos:](https://github.com/ztlpn)) +- Función eliminada `shardByHash`. [\#3833](https://github.com/ClickHouse/ClickHouse/pull/3833) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Prohibir el uso de subconsultas escalares con el resultado del tipo `AggregateFunction`. [\#3865](https://github.com/ClickHouse/ClickHouse/pull/3865) ([Ivan](https://github.com/abyss7)) + +#### Mejoras de compilación / prueba / empaquetado {#buildtestingpackaging-improvements-6} + +- Añadido soporte para PowerPC (`ppc64le`) construir. [\#4132](https://github.com/ClickHouse/ClickHouse/pull/4132) ([Más información](https://github.com/danlark1)) +- Las pruebas funcionales con estado se ejecutan en el conjunto de datos público disponible. [\#3969](https://github.com/ClickHouse/ClickHouse/pull/3969) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el error cuando el servidor no puede comenzar con el `bash: /usr/bin/clickhouse-extract-from-config: Operation not permitted` mensaje dentro de Docker o systemd-nspawn. [\#4136](https://github.com/ClickHouse/ClickHouse/pull/4136) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualizar `rdkafka` Biblioteca a v1.0.0-RC5. Usado cppkafka en lugar de la interfaz C sin procesar. [\#4025](https://github.com/ClickHouse/ClickHouse/pull/4025) ([Ivan](https://github.com/abyss7)) +- Actualizar `mariadb-client` biblioteca. Se corrigió uno de los problemas encontrados por UBSan. [\#3924](https://github.com/ClickHouse/ClickHouse/pull/3924) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Algunas correcciones para compilaciones de UBSan. [\#3926](https://github.com/ClickHouse/ClickHouse/pull/3926) [\#3021](https://github.com/ClickHouse/ClickHouse/pull/3021) [\#3948](https://github.com/ClickHouse/ClickHouse/pull/3948) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregaron ejecuciones de pruebas por compromiso con la compilación de UBSan. +- Se agregaron ejecuciones por compromiso del analizador estático PVS-Studio. +- Corregidos errores encontrados por PVS-Studio. [\#4013](https://github.com/ClickHouse/ClickHouse/pull/4013) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigieron problemas de compatibilidad con glibc. [\#4100](https://github.com/ClickHouse/ClickHouse/pull/4100) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mueva las imágenes de Docker a 18.10 y agregue el archivo de compatibilidad para glibc\> = 2.28 [\#3965](https://github.com/ClickHouse/ClickHouse/pull/3965) ([alesapin](https://github.com/alesapin)) +- Agregue la variable env si el usuario no desea chown directorios en la imagen Docker del servidor. [\#3967](https://github.com/ClickHouse/ClickHouse/pull/3967) ([alesapin](https://github.com/alesapin)) +- Habilitado la mayoría de las advertencias de `-Weverything` en clang. Permitir `-Wpedantic`. [\#3986](https://github.com/ClickHouse/ClickHouse/pull/3986) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregaron algunas advertencias más que están disponibles solo en clang 8. [\#3993](https://github.com/ClickHouse/ClickHouse/pull/3993) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Enlace a `libLLVM` en lugar de a las librerías LLVM individuales cuando se usan enlaces compartidos. [\#3989](https://github.com/ClickHouse/ClickHouse/pull/3989) ([Películas De Sexo](https://github.com/orivej)) +- Se agregaron variables de desinfectante para imágenes de prueba. [\#4072](https://github.com/ClickHouse/ClickHouse/pull/4072) ([alesapin](https://github.com/alesapin)) +- `clickhouse-server` paquete debian recomendará `libcap2-bin` paquete a utilizar `setcap` herramienta para el establecimiento de capacidades. Esto es opcional. [\#4093](https://github.com/ClickHouse/ClickHouse/pull/4093) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejora del tiempo de compilación, fijo incluye. [\#3898](https://github.com/ClickHouse/ClickHouse/pull/3898) ([propulsor](https://github.com/proller)) +- Se agregaron pruebas de rendimiento para funciones hash. [\#3918](https://github.com/ClickHouse/ClickHouse/pull/3918) ([filimonov](https://github.com/filimonov)) +- Se corrigieron las dependencias de la biblioteca cíclica. [\#3958](https://github.com/ClickHouse/ClickHouse/pull/3958) ([propulsor](https://github.com/proller)) +- Compilación mejorada con poca memoria disponible. [\#4030](https://github.com/ClickHouse/ClickHouse/pull/4030) ([propulsor](https://github.com/proller)) +- Se agregó script de prueba para reproducir la degradación del rendimiento en `jemalloc`. [\#4036](https://github.com/ClickHouse/ClickHouse/pull/4036) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigieron errores ortográficos en comentarios y literales de cadena bajo `dbms`. [\#4122](https://github.com/ClickHouse/ClickHouse/pull/4122) ([maiha](https://github.com/maiha)) +- Se corrigieron errores tipográficos en los comentarios. [\#4089](https://github.com/ClickHouse/ClickHouse/pull/4089) ([Evgenii Pravda](https://github.com/kvinty)) diff --git a/docs/es/changelog/index.md b/docs/es/changelog/index.md deleted file mode 120000 index 79b747aee1b..00000000000 --- a/docs/es/changelog/index.md +++ /dev/null @@ -1 +0,0 @@ -../../../CHANGELOG.md \ No newline at end of file diff --git a/docs/es/changelog/index.md b/docs/es/changelog/index.md new file mode 100644 index 00000000000..4ee7c076082 --- /dev/null +++ b/docs/es/changelog/index.md @@ -0,0 +1,627 @@ +--- +machine_translated: true +--- + +## Lanzamiento de ClickHouse v20.3 {#clickhouse-release-v20-3} + +### Todos los derechos reservados. {#clickhouse-release-v20-3-3-6-2020-03-17} + +### Corrección de errores {#bug-fix} + +- Añadir ajuste `use_compact_format_in_distributed_parts_names` que permite escribir archivos para `INSERT` consultas en `Distributed` mesa con un formato más compacto. Esto corrige [\#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [\#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alesapin](https://github.com/alesapin)). Hace que la versión 20.3 sea compatible con versiones anteriores de nuevo. +- Corregir un error en una replicación que no permite que la replicación funcione si el usuario ha ejecutado mutaciones en la versión anterior. Esto corrige [\#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [\#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alesapin](https://github.com/alesapin)). Hace que la versión 20.3 sea compatible con versiones anteriores de nuevo. +- Se corrigieron los nombres de funciones internas incorrectos para `sumKahan` y `sumWithOverflow`. Conduzco a una excepción mientras uso estas funciones en consultas remotas. [\#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)). Este problema estaba en todas las versiones de ClickHouse. +- Se solucionó el problema: la zona horaria no se conservaba si escribía una expresión aritmética simple como `time + 1` (en contraste con una expresión como `time + INTERVAL 1 SECOND`). Esto corrige [\#5743](https://github.com/ClickHouse/ClickHouse/issues/5743). [\#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexey-milovidov](https://github.com/alexey-milovidov)). Este problema estaba en todas las versiones de ClickHouse. +- Corregir posibles excepciones `Size of filter doesn't match size of column` y `Invalid number of rows in Chunk` en `MergeTreeRangeReader`. Podrían aparecer mientras se ejecuta `PREWHERE` en algunos casos. Fijar [\#9132](https://github.com/ClickHouse/ClickHouse/issues/9132). [\#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) +- Permitir `ALTER ON CLUSTER` de `Distributed` tablas con replicación interna. Esto corrige [\#3268](https://github.com/ClickHouse/ClickHouse/issues/3268). [\#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)). Este problema estaba en todas las versiones de ClickHouse. + +### Todos los derechos reservados. {#clickhouse-release-v20-3-2-1-2020-03-12} + +### Cambio incompatible hacia atrás {#backward-incompatible-change} + +- Se ha solucionado el problema `file name too long` al enviar datos para `Distributed` para un gran número de réplicas. Se corrigió el problema de que las credenciales de réplica se expusieran en el registro del servidor. El formato del nombre del directorio en el disco se cambió a `[shard{shard_index}[_replica{replica_index}]]`. [\#8911](https://github.com/ClickHouse/ClickHouse/pull/8911) ([Mikhail Korotov](https://github.com/millb)) Después de actualizar a la nueva versión, no podrá degradar sin intervención manual, porque la versión anterior del servidor no reconoce el nuevo formato de directorio. Si desea degradar, debe cambiar el nombre manualmente de los directorios correspondientes al formato anterior. Este cambio sólo es relevante si ha utilizado `INSERT`s a `Distributed` tabla. En la versión 20.3.3 introduciremos una configuración que le permitirá habilitar el nuevo formato gradualmente. +- Se ha cambiado el formato de las entradas de registro de replicación para los comandos de mutación. Tienes que esperar a que las mutaciones antiguas se procesen antes de instalar la nueva versión. +- Implemente un generador de perfiles de memoria simple que vuelca stacktraces a `system.trace_log` cada N bytes sobre el límite de asignación suave [\#8765](https://github.com/ClickHouse/ClickHouse/pull/8765) ([Ivan](https://github.com/abyss7)) [\#9472](https://github.com/ClickHouse/ClickHouse/pull/9472) ([alexey-milovidov](https://github.com/alexey-milovidov)) La columna de `system.trace_log` fue renombrado desde `timer_type` a `trace_type`. Esto requerirá cambios en el análisis de rendimiento de terceros y herramientas de procesamiento de flamegraph. +- Use la identificación de subproceso del sistema operativo en todas partes en lugar del número de subproceso interno. Esto corrige [\#7477](https://github.com/ClickHouse/ClickHouse/issues/7477) Antiguo `clickhouse-client` no puede recibir registros que se envían desde el servidor cuando `send_logs_level` está habilitado, porque se han cambiado los nombres y tipos de los mensajes de registro estructurados. Por otro lado, diferentes versiones de servidor pueden enviar registros con diferentes tipos entre sí. Cuando usted no utiliza el `send_logs_level` ajuste, no debería importarle. [\#8954](https://github.com/ClickHouse/ClickHouse/pull/8954) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Quitar `indexHint` función [\#9542](https://github.com/ClickHouse/ClickHouse/pull/9542) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Quitar `findClusterIndex`, `findClusterValue` función. Esto corrige [\#8641](https://github.com/ClickHouse/ClickHouse/issues/8641). Si estaba utilizando estas funciones, envíe un correo electrónico a `clickhouse-feedback@yandex-team.com` [\#9543](https://github.com/ClickHouse/ClickHouse/pull/9543) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora no está permitido crear columnas o agregar columnas con `SELECT` subconsulta como expresión predeterminada. [\#9481](https://github.com/ClickHouse/ClickHouse/pull/9481) ([alesapin](https://github.com/alesapin)) +- Requiere alias para subconsultas en JOIN. [\#9274](https://github.com/ClickHouse/ClickHouse/pull/9274) ([Artem Zuikov](https://github.com/4ertus2)) +- Mejorar `ALTER MODIFY/ADD` consultas lógica. Ahora no puedes `ADD` sin tipo, `MODIFY` expresión predeterminada no cambia el tipo de columna y `MODIFY` type no pierde el valor de expresión predeterminado. Fijar [\#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). [\#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) ([alesapin](https://github.com/alesapin)) +- Requiere que el servidor se reinicie para aplicar los cambios en la configuración de registro. Esta es una solución temporal para evitar el error en el que el servidor inicia sesión en un archivo de registro eliminado (consulte [\#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [\#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Configuración `experimental_use_processors` está habilitado de forma predeterminada. Esta configuración permite el uso de la nueva canalización de consultas. Esto es refactorización interna y no esperamos cambios visibles. Si ves algún problema, configúralo en cero. [\#8768](https://github.com/ClickHouse/ClickHouse/pull/8768) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Novedad {#new-feature} + +- Añadir `Avro` y `AvroConfluent` Formatos de entrada/salida [\#8571](https://github.com/ClickHouse/ClickHouse/pull/8571) ([Andrés Onyshchuk](https://github.com/oandrew)) [\#8957](https://github.com/ClickHouse/ClickHouse/pull/8957) ([Andrés Onyshchuk](https://github.com/oandrew)) [\#8717](https://github.com/ClickHouse/ClickHouse/pull/8717) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualizaciones de subprocesos múltiples y sin bloqueo de claves caducadas en `cache` diccionarios (con permiso opcional para leer los antiguos). [\#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Agregar consulta `ALTER ... MATERIALIZE TTL`. Ejecuta la mutación que obliga a eliminar los datos caducados por TTL y recalcula la metainformación sobre TTL en todas las partes. [\#8775](https://github.com/ClickHouse/ClickHouse/pull/8775) ([Anton Popov](https://github.com/CurtizJ)) +- Cambie de HashJoin a MergeJoin (en el disco) si es necesario [\#9082](https://github.com/ClickHouse/ClickHouse/pull/9082) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir `MOVE PARTITION` comando para `ALTER TABLE` [\#4729](https://github.com/ClickHouse/ClickHouse/issues/4729) [\#6168](https://github.com/ClickHouse/ClickHouse/pull/6168) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Recarga de la configuración de almacenamiento desde el archivo de configuración sobre la marcha. [\#8594](https://github.com/ClickHouse/ClickHouse/pull/8594) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Permitido cambiar `storage_policy` a uno no menos rico. [\#8107](https://github.com/ClickHouse/ClickHouse/pull/8107) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Se agregó soporte para globs / wildcards para el almacenamiento S3 y la función de mesa. [\#8851](https://github.com/ClickHouse/ClickHouse/pull/8851) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Implementar `bitAnd`, `bitOr`, `bitXor`, `bitNot` para `FixedString(N)` Tipo de datos. [\#9091](https://github.com/ClickHouse/ClickHouse/pull/9091) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Función añadida `bitCount`. Esto corrige [\#8702](https://github.com/ClickHouse/ClickHouse/issues/8702). [\#8708](https://github.com/ClickHouse/ClickHouse/pull/8708) ([alexey-milovidov](https://github.com/alexey-milovidov)) [\#8749](https://github.com/ClickHouse/ClickHouse/pull/8749) ([kopylov](https://github.com/ikopylov)) +- Añadir `generateRandom` función de tabla para generar filas aleatorias con un esquema dado. Permite rellenar la tabla de prueba arbitraria con datos. [\#8994](https://github.com/ClickHouse/ClickHouse/pull/8994) ([Ilya Yatsishin](https://github.com/qoega)) +- `JSONEachRowFormat`: apoyar caso especial cuando los objetos encerrados en la matriz de nivel superior. [\#8860](https://github.com/ClickHouse/ClickHouse/pull/8860) ([Kruglov Pavel](https://github.com/Avogar)) +- Ahora es posible crear una columna con `DEFAULT` expresión que depende de una columna con el valor predeterminado `ALIAS` expresion. [\#9489](https://github.com/ClickHouse/ClickHouse/pull/9489) ([alesapin](https://github.com/alesapin)) +- Permitir especificar `--limit` más que el tamaño de los datos de origen en `clickhouse-obfuscator`. Los datos se repetirán con diferentes semillas aleatorias. [\#9155](https://github.com/ClickHouse/ClickHouse/pull/9155) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `groupArraySample` función (similar a `groupArray`) con algoritmo de muestreo de reservorio. [\#8286](https://github.com/ClickHouse/ClickHouse/pull/8286) ([Amos pájaro](https://github.com/amosbird)) +- Ahora puede controlar el tamaño de la cola de actualización en `cache`/`complex_key_cache` diccionarios a través de métricas del sistema. [\#9413](https://github.com/ClickHouse/ClickHouse/pull/9413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Permitir usar CRLF como separador de línea en formato de salida CSV con configuración `output_format_csv_crlf_end_of_line` se establece en 1 [\#8934](https://github.com/ClickHouse/ClickHouse/pull/8934) [\#8935](https://github.com/ClickHouse/ClickHouse/pull/8935) [\#8963](https://github.com/ClickHouse/ClickHouse/pull/8963) ([Mikhail Korotov](https://github.com/millb)) +- Implementar más funciones del [H3](https://github.com/uber/h3) API: `h3GetBaseCell`, `h3HexAreaM2`, `h3IndexesAreNeighbors`, `h3ToChildren`, `h3ToString` y `stringToH3` [\#8938](https://github.com/ClickHouse/ClickHouse/pull/8938) ([Nico Mandery](https://github.com/nmandery)) +- Nueva configuración introducida: `max_parser_depth` para controlar el tamaño máximo de la pila y permitir grandes consultas complejas. Esto corrige [\#6681](https://github.com/ClickHouse/ClickHouse/issues/6681) y [\#7668](https://github.com/ClickHouse/ClickHouse/issues/7668). [\#8647](https://github.com/ClickHouse/ClickHouse/pull/8647) ([Maxim Smirnov](https://github.com/qMBQx8GH)) +- Añadir una configuración `force_optimize_skip_unused_shards` configuración para lanzar si no es posible omitir fragmentos no utilizados [\#8805](https://github.com/ClickHouse/ClickHouse/pull/8805) ([Azat Khuzhin](https://github.com/azat)) +- Permitir configurar varios discos / volúmenes para almacenar datos para enviar `Distributed` motor [\#8756](https://github.com/ClickHouse/ClickHouse/pull/8756) ([Azat Khuzhin](https://github.com/azat)) +- Política de almacenamiento de soporte (``) para almacenar datos temporales. [\#8750](https://github.com/ClickHouse/ClickHouse/pull/8750) ([Azat Khuzhin](https://github.com/azat)) +- Añadir `X-ClickHouse-Exception-Code` Encabezado HTTP que se establece si se lanzó una excepción antes de enviar datos. Esto implementa [\#4971](https://github.com/ClickHouse/ClickHouse/issues/4971). [\#8786](https://github.com/ClickHouse/ClickHouse/pull/8786) ([Mikhail Korotov](https://github.com/millb)) +- Función añadida `ifNotFinite`. Es solo un azúcar sintáctico: `ifNotFinite(x, y) = isFinite(x) ? x : y`. [\#8710](https://github.com/ClickHouse/ClickHouse/pull/8710) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `last_successful_update_time` columna en `system.dictionaries` tabla [\#9394](https://github.com/ClickHouse/ClickHouse/pull/9394) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Añadir `blockSerializedSize` función (tamaño en disco sin compresión) [\#8952](https://github.com/ClickHouse/ClickHouse/pull/8952) ([Azat Khuzhin](https://github.com/azat)) +- Añadir función `moduloOrZero` [\#9358](https://github.com/ClickHouse/ClickHouse/pull/9358) ([Hcz](https://github.com/hczhcz)) +- Tablas de sistema añadidas `system.zeros` y `system.zeros_mt` así como funciones de cuento `zeros()` y `zeros_mt()`. Las tablas (y funciones de tabla) contienen una sola columna con nombre `zero` y tipo `UInt8`. Esta columna contiene ceros. Es necesario para fines de prueba como el método más rápido para generar muchas filas. Esto corrige [\#6604](https://github.com/ClickHouse/ClickHouse/issues/6604) [\#9593](https://github.com/ClickHouse/ClickHouse/pull/9593) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +### Característica Experimental {#experimental-feature} + +- Añadir nuevo formato compacto de piezas en `MergeTree`-family tablas en las que todas las columnas se almacenan en un archivo. Esto ayuda a aumentar el rendimiento de las inserciones pequeñas y frecuentes. El formato antiguo (un archivo por columna) ahora se llama ancho. El formato de almacenamiento de datos se controla mediante la configuración `min_bytes_for_wide_part` y `min_rows_for_wide_part`. [\#8290](https://github.com/ClickHouse/ClickHouse/pull/8290) ([Anton Popov](https://github.com/CurtizJ)) +- Soporte para almacenamiento S3 para `Log`, `TinyLog` y `StripeLog` tabla. [\#8862](https://github.com/ClickHouse/ClickHouse/pull/8862) ([Pavel Kovalenko](https://github.com/Jokser)) + +### Corrección de errores {#bug-fix-1} + +- Se corrigieron espacios en blanco inconsistentes en los mensajes de registro. [\#9322](https://github.com/ClickHouse/ClickHouse/pull/9322) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir un error en el que las matrices de tuplas sin nombre se aplanaban como estructuras anidadas en la creación de la tabla. [\#8866](https://github.com/ClickHouse/ClickHouse/pull/8866) ([achulkov2](https://github.com/achulkov2)) +- Se corrigió el problema cuando “Too many open files” puede ocurrir un error si hay demasiados archivos que coincidan con el patrón glob en `File` mesa o `file` función de la tabla. Ahora los archivos se abren perezosamente. Esto corrige [\#8857](https://github.com/ClickHouse/ClickHouse/issues/8857) [\#8861](https://github.com/ClickHouse/ClickHouse/pull/8861) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- DROP TEMPORARY TABLE ahora solo deja caer la tabla temporal. [\#8907](https://github.com/ClickHouse/ClickHouse/pull/8907) ([Vitaly Baranov](https://github.com/vitlibar)) +- Elimine la partición obsoleta cuando apagamos el servidor o DETACH / ATTACH una tabla. [\#8602](https://github.com/ClickHouse/ClickHouse/pull/8602) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Para saber cómo el disco predeterminado calcula el espacio libre de `data` subdirectorio. Se ha solucionado el problema cuando la cantidad de espacio libre no se calcula correctamente si el `data` el directorio está montado en un dispositivo separado (caso raro). Esto corrige [\#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) [\#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) ([Mikhail Korotov](https://github.com/millb)) +- Permitir coma (cruz) unirse con IN () dentro. [\#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) ([Artem Zuikov](https://github.com/4ertus2)) +- Permita reescribir CROSS a INNER JOIN si hay un operador \[NOT\] LIKE en la sección WHERE. [\#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) ([Artem Zuikov](https://github.com/4ertus2)) +- Corregir posible resultado incorrecto después `GROUP BY` con configuración habilitada `distributed_aggregation_memory_efficient`. Fijar [\#9134](https://github.com/ClickHouse/ClickHouse/issues/9134). [\#9289](https://github.com/ClickHouse/ClickHouse/pull/9289) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Las claves encontradas se contaron como perdidas en las métricas de los diccionarios de caché. [\#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Corregir la incompatibilidad del protocolo de replicación introducida en [\#8598](https://github.com/ClickHouse/ClickHouse/issues/8598). [\#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alesapin](https://github.com/alesapin)) +- Condición de carrera fija en `queue_task_handle` en el inicio de `ReplicatedMergeTree` tabla. [\#9552](https://github.com/ClickHouse/ClickHouse/pull/9552) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Token `NOT` no funcionó en `SHOW TABLES NOT LIKE` consulta [\#8727](https://github.com/ClickHouse/ClickHouse/issues/8727) [\#8940](https://github.com/ClickHouse/ClickHouse/pull/8940) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Comprobación de rango añadida para funcionar `h3EdgeLengthM`. Sin esta comprobación, el desbordamiento del búfer es posible. [\#8945](https://github.com/ClickHouse/ClickHouse/pull/8945) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió un error en los cálculos por lotes de OP lógicos ternarios en múltiples argumentos (más de 10). [\#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alejandro Kazakov](https://github.com/Akazz)) +- Corregir el error de optimización PREWHERE, que podría conducir a fallas según segfaults o `Inconsistent number of columns got from MergeTreeRangeReader` salvedad. [\#9024](https://github.com/ClickHouse/ClickHouse/pull/9024) ([Anton Popov](https://github.com/CurtizJ)) +- Arreglar inesperado `Timeout exceeded while reading from socket` excepción, que ocurre aleatoriamente en la conexión segura antes de que se exceda el tiempo de espera y cuando se habilita el generador de perfiles de consultas. También añadir `connect_timeout_with_failover_secure_ms` configuración (por defecto 100 ms), que es similar a `connect_timeout_with_failover_ms`, pero se usa para conexiones seguras (porque el protocolo de enlace SSL es más lento que la conexión TCP ordinaria) [\#9026](https://github.com/ClickHouse/ClickHouse/pull/9026) ([Tavplubix](https://github.com/tavplubix)) +- Corregir error con finalización de mutaciones, cuando la mutación puede colgarse en estado con `parts_to_do=0` y `is_done=0`. [\#9022](https://github.com/ClickHouse/ClickHouse/pull/9022) ([alesapin](https://github.com/alesapin)) +- Use la nueva lógica ANY JOIN con `partial_merge_join` configuración. Es posible hacer `ANY|ALL|SEMI LEFT` y `ALL INNER` se une con `partial_merge_join=1` ahora. [\#8932](https://github.com/ClickHouse/ClickHouse/pull/8932) ([Artem Zuikov](https://github.com/4ertus2)) +- Shard ahora sujeta la configuración obtenida del iniciador a los restos del fragmento en lugar de lanzar una excepción. Esta corrección permite enviar consultas a un fragmento con otras restricciones. [\#9447](https://github.com/ClickHouse/ClickHouse/pull/9447) ([Vitaly Baranov](https://github.com/vitlibar)) +- Se corrigió el problema de administración de memoria en `MergeTreeReadPool`. [\#8791](https://github.com/ClickHouse/ClickHouse/pull/8791) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fijar `toDecimal*OrNull()` familia de funciones cuando se llama con cadena `e`. Fijar [\#8312](https://github.com/ClickHouse/ClickHouse/issues/8312) [\#8764](https://github.com/ClickHouse/ClickHouse/pull/8764) ([Artem Zuikov](https://github.com/4ertus2)) +- Asegúrese de que `FORMAT Null` no envía datos al cliente. [\#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Corregir error en la marca de tiempo `LiveViewBlockInputStream` no se actualizará. `LIVE VIEW` es una característica experimental. [\#8644](https://github.com/ClickHouse/ClickHouse/pull/8644) ([vxider](https://github.com/Vxider)) [\#8625](https://github.com/ClickHouse/ClickHouse/pull/8625) ([vxider](https://github.com/Vxider)) +- Fijo `ALTER MODIFY TTL` comportamiento incorrecto que no permitía eliminar expresiones TTL antiguas. [\#8422](https://github.com/ClickHouse/ClickHouse/pull/8422) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Informe UBSan fijo en MergeTreeIndexSet. Esto corrige [\#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) [\#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió el comportamiento de `match` y `extract` funciona cuando haystack tiene cero bytes. El comportamiento era incorrecto cuando el pajar era constante. Esto corrige [\#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [\#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexey-milovidov](https://github.com/alexey-milovidov)) [\#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evite lanzar desde el destructor en la biblioteca Apache Avro de terceros. [\#9066](https://github.com/ClickHouse/ClickHouse/pull/9066) ([Andrés Onyshchuk](https://github.com/oandrew)) +- No confirmar un lote encuestado desde `Kafka` parcialmente, ya que puede conducir a agujeros en los datos. [\#8876](https://github.com/ClickHouse/ClickHouse/pull/8876) ([filimonov](https://github.com/filimonov)) +- Fijar `joinGet` con tipos de devolución anulables. https://github.com/ClickHouse/ClickHouse/issues/8919 [\#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) ([Amos pájaro](https://github.com/amosbird)) +- Corregir la incompatibilidad de datos cuando se comprime con `T64` códec. [\#9016](https://github.com/ClickHouse/ClickHouse/pull/9016) ([Artem Zuikov](https://github.com/4ertus2)) Fijar identificadores de tipo de datos en `T64` códec de compresión que conduce a una compresión incorrecta (de) en las versiones afectadas. [\#9033](https://github.com/ClickHouse/ClickHouse/pull/9033) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir ajuste `enable_early_constant_folding` y desactivarlo en algunos casos que conduce a errores. [\#9010](https://github.com/ClickHouse/ClickHouse/pull/9010) ([Artem Zuikov](https://github.com/4ertus2)) +- Repare el optimizador de predicados pushdown con VIEW y habilite la prueba [\#9011](https://github.com/ClickHouse/ClickHouse/pull/9011) ([Invierno Zhang](https://github.com/zhang2014)) +- Arreglar segfault en `Merge` tablas, que pueden suceder al leer de `File` almacenamiento [\#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) ([Tavplubix](https://github.com/tavplubix)) +- Se agregó una verificación de la política de almacenamiento en `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE`. De lo contrario, podría hacer que los datos de la parte sean inaccesibles después del reinicio y evitar que se inicie ClickHouse. [\#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix altera si hay TTL establecido para la tabla. [\#8800](https://github.com/ClickHouse/ClickHouse/pull/8800) ([Anton Popov](https://github.com/CurtizJ)) +- Corregir la condición de carrera que puede ocurrir cuando `SYSTEM RELOAD ALL DICTIONARIES` se ejecuta mientras se modifica / agrega / elimina algún diccionario. [\#8801](https://github.com/ClickHouse/ClickHouse/pull/8801) ([Vitaly Baranov](https://github.com/vitlibar)) +- En versiones anteriores `Memory` el motor de base de datos utiliza una ruta de datos vacía, por lo que las tablas se crean en `path` directory (e.g. `/var/lib/clickhouse/`), not in data directory of database (e.g. `/var/lib/clickhouse/db_name`). [\#8753](https://github.com/ClickHouse/ClickHouse/pull/8753) ([Tavplubix](https://github.com/tavplubix)) +- Se corrigieron los mensajes de registro incorrectos sobre la falta de disco o política predeterminada. [\#9530](https://github.com/ClickHouse/ClickHouse/pull/9530) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix not(has()) para el índice bloom\_filter de los tipos de matriz. [\#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([chimbab](https://github.com/achimbab)) +- Permitir las primeras columnas en una tabla con `Log` motor ser un alias [\#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) ([Ivan](https://github.com/abyss7)) +- Corregir el orden de los rangos mientras se lee desde `MergeTree` mesa en un hilo. Podría dar lugar a excepciones de `MergeTreeRangeReader` o resultados de consultas incorrectos. [\#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) ([Anton Popov](https://github.com/CurtizJ)) +- Hacer `reinterpretAsFixedString` devolver `FixedString` en lugar de `String`. [\#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) ([Andrés Onyshchuk](https://github.com/oandrew)) +- Evite casos extremadamente raros cuando el usuario puede obtener un mensaje de error incorrecto (`Success` en lugar de una descripción detallada del error). [\#9457](https://github.com/ClickHouse/ClickHouse/pull/9457) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- No se bloquee al usar `Template` formato con plantilla de fila vacía. [\#8785](https://github.com/ClickHouse/ClickHouse/pull/8785) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Los archivos de metadatos para las tablas del sistema se pueden crear en un lugar incorrecto [\#8653](https://github.com/ClickHouse/ClickHouse/pull/8653) ([Tavplubix](https://github.com/tavplubix)) Fijar [\#8581](https://github.com/ClickHouse/ClickHouse/issues/8581). +- Corregir la carrera de datos en exception\_ptr en el diccionario de caché [\#8303](https://github.com/ClickHouse/ClickHouse/issues/8303). [\#9379](https://github.com/ClickHouse/ClickHouse/pull/9379) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- No lanzar una excepción para la consulta `ATTACH TABLE IF NOT EXISTS`. Anteriormente se lanzaba si la tabla ya existe, a pesar de la `IF NOT EXISTS` clausula. [\#8967](https://github.com/ClickHouse/ClickHouse/pull/8967) ([Anton Popov](https://github.com/CurtizJ)) +- Se corrigió la falta de cierre de paren en el mensaje de excepción. [\#8811](https://github.com/ClickHouse/ClickHouse/pull/8811) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evitar el mensaje `Possible deadlock avoided` en el inicio de clickhouse-client en modo interactivo. [\#9455](https://github.com/ClickHouse/ClickHouse/pull/9455) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se solucionó el problema cuando el relleno al final del valor codificado en base64 puede estar mal formado. Actualización de la biblioteca base64. Esto corrige [\#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), cerca [\#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [\#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evitar la pérdida de datos en `Kafka` en casos raros cuando la excepción ocurre después de leer el sufijo pero antes de confirmar. Fijar [\#9378](https://github.com/ClickHouse/ClickHouse/issues/9378) [\#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) ([filimonov](https://github.com/filimonov)) +- Excepción fija en `DROP TABLE IF EXISTS` [\#8663](https://github.com/ClickHouse/ClickHouse/pull/8663) ([Nikita Vasilev](https://github.com/nikvas0)) +- Corregir el bloqueo cuando un usuario intenta `ALTER MODIFY SETTING` para viejos `MergeTree` familia de motores de mesa. [\#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alesapin](https://github.com/alesapin)) +- Compatibilidad con números UInt64 que no caben en Int64 en funciones relacionadas con JSON. Actualizar SIMDJSON a maestro. Esto corrige [\#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) [\#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la ejecución de predicados invertidos cuando se usa un índice funcional no estrictamente monotínico. [\#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) ([Alejandro Kazakov](https://github.com/Akazz)) +- No trate de doblar `IN` constante en `GROUP BY` [\#8868](https://github.com/ClickHouse/ClickHouse/pull/8868) ([Amos pájaro](https://github.com/amosbird)) +- Corregir error en `ALTER DELETE` mutaciones que conduce a la corrupción del índice. Esto corrige [\#9019](https://github.com/ClickHouse/ClickHouse/issues/9019) y [\#8982](https://github.com/ClickHouse/ClickHouse/issues/8982). Además arreglar condiciones de carrera extremadamente raras en `ReplicatedMergeTree` `ALTER` consulta. [\#9048](https://github.com/ClickHouse/ClickHouse/pull/9048) ([alesapin](https://github.com/alesapin)) +- Cuando el ajuste `compile_expressions` está habilitado, puede obtener `unexpected column` en `LLVMExecutableFunction` cuando usamos `Nullable` tipo [\#8910](https://github.com/ClickHouse/ClickHouse/pull/8910) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Múltiples correcciones para `Kafka` engine: 1) corrige los duplicados que aparecían durante el reequilibrio del grupo de consumidores. 2) Arreglar raro ‘holes’ apareció cuando los datos se sondearon de varias particiones con una encuesta y se confirmaron parcialmente (ahora siempre procesamos / confirmamos todo el bloque de mensajes sondeados). 3) Arregle los lavados por tamaño de bloque (antes de eso, solo el lavado por tiempo de espera funcionaba correctamente). 4) mejor procedimiento de suscripción (con retroalimentación de la asignación). 5) Haga que las pruebas funcionen más rápido (con intervalos y tiempos de espera predeterminados). Debido al hecho de que los datos no se enjuagaron por el tamaño del bloque antes (como debería según la documentación), ese PR puede conducir a una cierta degradación del rendimiento con la configuración predeterminada (debido a los sofocos más a menudo y más pequeños que son menos óptimos). Si encuentra el problema de rendimiento después de ese cambio, aumente `kafka_max_block_size` en la tabla al valor más grande (por ejemplo `CREATE TABLE ...Engine=Kafka ... SETTINGS ... kafka_max_block_size=524288`). Fijar [\#7259](https://github.com/ClickHouse/ClickHouse/issues/7259) [\#8917](https://github.com/ClickHouse/ClickHouse/pull/8917) ([filimonov](https://github.com/filimonov)) +- Fijar `Parameter out of bound` excepción en algunas consultas después de las optimizaciones PREWHERE. [\#8914](https://github.com/ClickHouse/ClickHouse/pull/8914) ([Fallecimiento](https://github.com/bgiard)) +- Se corrigió el caso de la constancia mixta de los argumentos de la función `arrayZip`. [\#8705](https://github.com/ClickHouse/ClickHouse/pull/8705) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Al ejecutar `CREATE` consulta, doblar expresiones constantes en argumentos del motor de almacenamiento. Reemplace el nombre de la base de datos vacía con la base de datos actual. Fijar [\#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [\#3492](https://github.com/ClickHouse/ClickHouse/issues/3492) [\#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) ([Tavplubix](https://github.com/tavplubix)) +- Ahora no es posible crear o agregar columnas con alias cíclicos simples como `a DEFAULT b, b DEFAULT a`. [\#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alesapin](https://github.com/alesapin)) +- Se ha corregido un error con doble movimiento que puede corromper parte original. Esto es relevante si usa `ALTER TABLE MOVE` [\#8680](https://github.com/ClickHouse/ClickHouse/pull/8680) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Permitir `interval` identificador para analizar correctamente sin retrocesos. Solucionado el problema cuando una consulta no se puede ejecutar incluso si el `interval` identifier está encerrado en backticks o comillas dobles. Esto corrige [\#9124](https://github.com/ClickHouse/ClickHouse/issues/9124). [\#9142](https://github.com/ClickHouse/ClickHouse/pull/9142) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Prueba de fuzz fija y comportamiento incorrecto de `bitTestAll`/`bitTestAny` función. [\#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir un posible bloqueo / número incorrecto de filas en `LIMIT n WITH TIES` cuando hay muchas filas iguales a n'th row. [\#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([Tavplubix](https://github.com/tavplubix)) +- Corregir mutaciones con partes escritas con habilitado `insert_quorum`. [\#9463](https://github.com/ClickHouse/ClickHouse/pull/9463) ([alesapin](https://github.com/alesapin)) +- Corregir la carrera de datos en la destrucción de `Poco::HTTPServer`. Podría suceder cuando el servidor se inicia y se apaga inmediatamente. [\#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) +- Corregir un error en el que se mostraba un mensaje de error engañoso cuando se ejecutaba `SHOW CREATE TABLE a_table_that_does_not_exist`. [\#8899](https://github.com/ClickHouse/ClickHouse/pull/8899) ([achulkov2](https://github.com/achulkov2)) +- Fijo `Parameters are out of bound` excepción en algunos casos raros cuando tenemos una constante en el `SELECT` cláusula cuando tenemos una `ORDER BY` y una `LIMIT` clausula. [\#8892](https://github.com/ClickHouse/ClickHouse/pull/8892) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Fijar mutaciones finalización, cuando ya hecho mutación puede tener estado `is_done=0`. [\#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) ([alesapin](https://github.com/alesapin)) +- Evitar la ejecución `ALTER ADD INDEX` para tablas MergeTree con sintaxis antigua, porque no funciona. [\#8822](https://github.com/ClickHouse/ClickHouse/pull/8822) ([Mikhail Korotov](https://github.com/millb)) +- Durante el inicio del servidor, no acceda a la tabla, que `LIVE VIEW` depende de, por lo que el servidor podrá comenzar. También eliminar `LIVE VIEW` dependencias al separar `LIVE VIEW`. `LIVE VIEW` es una característica experimental. [\#8824](https://github.com/ClickHouse/ClickHouse/pull/8824) ([Tavplubix](https://github.com/tavplubix)) +- Arreglar posible segfault en `MergeTreeRangeReader`, mientras se ejecuta `PREWHERE`. [\#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) ([Anton Popov](https://github.com/CurtizJ)) +- Corregir posibles sumas de comprobación no coincidentes con TTL de columna. [\#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) +- Se corrigió un error cuando las partes no se movían en segundo plano por las reglas TTL en caso de que solo haya un volumen. [\#8672](https://github.com/ClickHouse/ClickHouse/pull/8672) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Se ha solucionado el problema `Method createColumn() is not implemented for data type Set`. Esto corrige [\#7799](https://github.com/ClickHouse/ClickHouse/issues/7799). [\#8674](https://github.com/ClickHouse/ClickHouse/pull/8674) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora intentaremos finalizar las mutaciones con más frecuencia. [\#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alesapin](https://github.com/alesapin)) +- Fijar `intDiv` por menos una constante [\#9351](https://github.com/ClickHouse/ClickHouse/pull/9351) ([Hcz](https://github.com/hczhcz)) +- Corregir la posible condición de carrera en `BlockIO`. [\#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir un error que conduce a la terminación del servidor al intentar usar / soltar `Kafka` tabla creada con parámetros incorrectos. [\#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) ([filimonov](https://github.com/filimonov)) +- Solución alternativa agregada si el sistema operativo devuelve un resultado incorrecto para `timer_create` función. [\#8837](https://github.com/ClickHouse/ClickHouse/pull/8837) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregido el error en el uso de `min_marks_for_seek` parámetro. Se corrigió el mensaje de error cuando no hay una clave de fragmentación en la tabla distribuida e intentamos omitir fragmentos no utilizados. [\#8908](https://github.com/ClickHouse/ClickHouse/pull/8908) ([Azat Khuzhin](https://github.com/azat)) + +### Mejora {#improvement} + +- Implementar `ALTER MODIFY/DROP` encima de mutaciones para `ReplicatedMergeTree*` familia de motores. Ahora `ALTERS` bloquea solo en la etapa de actualización de metadatos, y no bloquea después de eso. [\#8701](https://github.com/ClickHouse/ClickHouse/pull/8701) ([alesapin](https://github.com/alesapin)) +- Agregue la capacidad de reescribir CROSS a INNER JOINs con `WHERE` sección que contiene nombres unqialified. [\#9512](https://github.com/ClickHouse/ClickHouse/pull/9512) ([Artem Zuikov](https://github.com/4ertus2)) +- Hacer `SHOW TABLES` y `SHOW DATABASES` las consultas apoyan el `WHERE` expresiones y `FROM`/`IN` [\#9076](https://github.com/ClickHouse/ClickHouse/pull/9076) ([Sundyli](https://github.com/sundy-li)) +- Añadido un ajuste `deduplicate_blocks_in_dependent_materialized_views`. [\#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) ([urykhy](https://github.com/urykhy)) +- Después de los cambios recientes, el cliente MySQL comenzó a imprimir cadenas binarias en hexadecimal, lo que las hizo no legibles ([\#9032](https://github.com/ClickHouse/ClickHouse/issues/9032)). La solución en ClickHouse es marcar las columnas de cadena como UTF-8, lo que no siempre es, pero generalmente el caso. [\#9079](https://github.com/ClickHouse/ClickHouse/pull/9079) ([Yuriy Baranov](https://github.com/yurriy)) +- Agregue soporte de las claves String y FixedString para `sumMap` [\#8903](https://github.com/ClickHouse/ClickHouse/pull/8903) ([Fallecimiento](https://github.com/bgiard)) +- Teclas de cadena de soporte en los mapas SummingMergeTree [\#8933](https://github.com/ClickHouse/ClickHouse/pull/8933) ([Fallecimiento](https://github.com/bgiard)) +- Terminación de la señal del subproceso al grupo de subprocesos incluso si el subproceso ha lanzado una excepción [\#8736](https://github.com/ClickHouse/ClickHouse/pull/8736) ([Más información](https://github.com/dingxiangfei2009)) +- Permitir establecer `query_id` en `clickhouse-benchmark` [\#9416](https://github.com/ClickHouse/ClickHouse/pull/9416) ([Anton Popov](https://github.com/CurtizJ)) +- No permita expresiones extrañas en `ALTER TABLE ... PARTITION partition` consulta. Esto aborda [\#7192](https://github.com/ClickHouse/ClickHouse/issues/7192) [\#8835](https://github.com/ClickHouse/ClickHouse/pull/8835) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Tabla `system.table_engines` ahora proporciona información sobre el soporte de características (como `supports_ttl` o `supports_sort_order`). [\#8830](https://github.com/ClickHouse/ClickHouse/pull/8830) ([Max Akhmedov](https://github.com/zlobober)) +- Permitir `system.metric_log` predeterminada. Contendrá filas con valores de ProfileEvents, CurrentMetrics recopilados con “collect\_interval\_milliseconds” intervalo (un segundo por defecto). La tabla es muy pequeña (generalmente en orden de megabytes) y la recopilación de estos datos por defecto es razonable. [\#9225](https://github.com/ClickHouse/ClickHouse/pull/9225) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries. Fixes [\#6964](https://github.com/ClickHouse/ClickHouse/issues/6964) [\#8874](https://github.com/ClickHouse/ClickHouse/pull/8874) ([Ivan](https://github.com/abyss7)) +- Ahora temporal `LIVE VIEW` es creado por `CREATE LIVE VIEW name WITH TIMEOUT [42] ...` en lugar de `CREATE TEMPORARY LIVE VIEW ...`, porque la sintaxis anterior no era consistente con `CREATE TEMPORARY TABLE ...` [\#9131](https://github.com/ClickHouse/ClickHouse/pull/9131) ([Tavplubix](https://github.com/tavplubix)) +- Agregar text\_log.parámetro de configuración de nivel para limitar las entradas `system.text_log` tabla [\#8809](https://github.com/ClickHouse/ClickHouse/pull/8809) ([Azat Khuzhin](https://github.com/azat)) +- Permitir colocar la parte descargada en discos / volúmenes de acuerdo con las reglas TTL [\#8598](https://github.com/ClickHouse/ClickHouse/pull/8598) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Para diccionarios MySQL externos, permita mutualizar el grupo de conexiones MySQL para “share” entre los diccionarios. Esta opción reduce significativamente el número de conexiones a los servidores MySQL. [\#9409](https://github.com/ClickHouse/ClickHouse/pull/9409) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Mostrar el tiempo de ejecución de consultas más cercano para los cuantiles en `clickhouse-benchmark` salida en lugar de valores interpolados. Es mejor mostrar valores que correspondan al tiempo de ejecución de algunas consultas. [\#8712](https://github.com/ClickHouse/ClickHouse/pull/8712) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Posibilidad de agregar clave y marca de tiempo para el mensaje al insertar datos en Kafka. Fijar [\#7198](https://github.com/ClickHouse/ClickHouse/issues/7198) [\#8969](https://github.com/ClickHouse/ClickHouse/pull/8969) ([filimonov](https://github.com/filimonov)) +- Si el servidor se ejecuta desde el terminal, resalte el número de hilo, el id de consulta y la prioridad de registro por colores. Esto es para mejorar la legibilidad de los mensajes de registro correlacionados para los desarrolladores. [\#8961](https://github.com/ClickHouse/ClickHouse/pull/8961) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejor mensaje de excepción al cargar tablas para `Ordinary` base. [\#9527](https://github.com/ClickHouse/ClickHouse/pull/9527) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implementar `arraySlice` para matrices con estados de función agregados. Esto corrige [\#9388](https://github.com/ClickHouse/ClickHouse/issues/9388) [\#9391](https://github.com/ClickHouse/ClickHouse/pull/9391) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Permita que las funciones constantes y las matrices constantes se utilicen en el lado derecho del operador IN. [\#8813](https://github.com/ClickHouse/ClickHouse/pull/8813) ([Anton Popov](https://github.com/CurtizJ)) +- Si la excepción del zookeeper ha ocurrido al obtener datos para el sistema.réplicas, mostrarlo en una columna separada. Esto implementa [\#9137](https://github.com/ClickHouse/ClickHouse/issues/9137) [\#9138](https://github.com/ClickHouse/ClickHouse/pull/9138) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Elimine atómicamente las partes de datos de MergeTree en destroy. [\#8402](https://github.com/ClickHouse/ClickHouse/pull/8402) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Soporte de seguridad a nivel de fila para tablas distribuidas. [\#8926](https://github.com/ClickHouse/ClickHouse/pull/8926) ([Ivan](https://github.com/abyss7)) +- Now we recognize suffix (like KB, KiB…) in settings values. [\#8072](https://github.com/ClickHouse/ClickHouse/pull/8072) ([Mikhail Korotov](https://github.com/millb)) +- Evitar la falta de memoria mientras se construye el resultado de una gran UNIÓN. [\#8637](https://github.com/ClickHouse/ClickHouse/pull/8637) ([Artem Zuikov](https://github.com/4ertus2)) +- Se agregaron nombres de clústeres a sugerencias en modo interactivo en `clickhouse-client`. [\#8709](https://github.com/ClickHouse/ClickHouse/pull/8709) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries [\#8820](https://github.com/ClickHouse/ClickHouse/pull/8820) ([Ivan](https://github.com/abyss7)) +- Columna añadida `exception_code` en `system.query_log` tabla. [\#8770](https://github.com/ClickHouse/ClickHouse/pull/8770) ([Mikhail Korotov](https://github.com/millb)) +- Servidor de compatibilidad MySQL habilitado en el puerto `9004` en el archivo de configuración del servidor predeterminado. Se corrigió el comando de generación de contraseñas en el ejemplo de configuración. [\#8771](https://github.com/ClickHouse/ClickHouse/pull/8771) ([Yuriy Baranov](https://github.com/yurriy)) +- Evite abortar al apagar si el sistema de archivos es de solo lectura. Esto corrige [\#9094](https://github.com/ClickHouse/ClickHouse/issues/9094) [\#9100](https://github.com/ClickHouse/ClickHouse/pull/9100) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejor mensaje de excepción cuando se requiere longitud en la consulta HTTP POST. [\#9453](https://github.com/ClickHouse/ClickHouse/pull/9453) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `_path` y `_file` columnas virtuales para `HDFS` y `File` motores y `hdfs` y `file` funciones de la tabla [\#8489](https://github.com/ClickHouse/ClickHouse/pull/8489) ([Olga Khvostikova](https://github.com/stavrolia)) +- Corregir error `Cannot find column` mientras se inserta en `MATERIALIZED VIEW` en caso de que se agregara una nueva columna a la tabla interna de la vista. [\#8766](https://github.com/ClickHouse/ClickHouse/pull/8766) [\#8788](https://github.com/ClickHouse/ClickHouse/pull/8788) ([vzakaznikov](https://github.com/vzakaznikov)) [\#8788](https://github.com/ClickHouse/ClickHouse/issues/8788) [\#8806](https://github.com/ClickHouse/ClickHouse/pull/8806) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [\#8803](https://github.com/ClickHouse/ClickHouse/pull/8803) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corrige el progreso sobre el protocolo cliente-servidor nativo, al enviar el progreso después de la actualización final (como los registros). Esto puede ser relevante solo para algunas herramientas de terceros que usan protocolo nativo. [\#9495](https://github.com/ClickHouse/ClickHouse/pull/9495) ([Azat Khuzhin](https://github.com/azat)) +- Agregue una métrica del sistema que rastree el número de conexiones de cliente utilizando el protocolo MySQL ([\#9013](https://github.com/ClickHouse/ClickHouse/issues/9013)). [\#9015](https://github.com/ClickHouse/ClickHouse/pull/9015) ([Eugene Klimov](https://github.com/Slach)) +- A partir de ahora, las respuestas HTTP tendrán `X-ClickHouse-Timezone` encabezado establecido en el mismo valor de zona horaria que `SELECT timezone()` informaría. [\#9493](https://github.com/ClickHouse/ClickHouse/pull/9493) ([Denis Glazachev](https://github.com/traceon)) + +### Mejora del rendimiento {#performance-improvement} + +- Mejorar el rendimiento del índice de análisis con IN [\#9261](https://github.com/ClickHouse/ClickHouse/pull/9261) ([Anton Popov](https://github.com/CurtizJ)) +- Código más simple y eficiente en funciones lógicas + limpiezas de código. Un seguimiento de [\#8718](https://github.com/ClickHouse/ClickHouse/issues/8718) [\#8728](https://github.com/ClickHouse/ClickHouse/pull/8728) ([Alejandro Kazakov](https://github.com/Akazz)) +- Mejora general del rendimiento (en el rango del 5%..200% para consultas afectadas) garantizando aliasing aún más estricto con las características de C ++ 20. [\#9304](https://github.com/ClickHouse/ClickHouse/pull/9304) ([Amos pájaro](https://github.com/amosbird)) +- Aliasing más estricto para bucles internos de funciones de comparación. [\#9327](https://github.com/ClickHouse/ClickHouse/pull/9327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Aliasing más estricto para bucles internos de funciones aritméticas. [\#9325](https://github.com/ClickHouse/ClickHouse/pull/9325) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Una implementación ~ 3 veces más rápida para ColumnVector::replicate() , a través de la cual se implementa ColumnConst::convertToFullColumn() . También será útil en pruebas al materializar constantes. [\#9293](https://github.com/ClickHouse/ClickHouse/pull/9293) ([Alejandro Kazakov](https://github.com/Akazz)) +- Otra mejora de rendimiento menor a `ColumnVector::replicate()` (esto acelera el `materialize` función y funciones de orden superior) una mejora aún más a [\#9293](https://github.com/ClickHouse/ClickHouse/issues/9293) [\#9442](https://github.com/ClickHouse/ClickHouse/pull/9442) ([Alejandro Kazakov](https://github.com/Akazz)) +- Rendimiento mejorado de `stochasticLinearRegression` función de agregado. Este parche es aportado por Intel. [\#8652](https://github.com/ClickHouse/ClickHouse/pull/8652) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejorar el rendimiento de `reinterpretAsFixedString` función. [\#9342](https://github.com/ClickHouse/ClickHouse/pull/9342) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- No envíe bloques al cliente para `Null` formato en la tubería de procesadores. [\#8797](https://github.com/ClickHouse/ClickHouse/pull/8797) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [\#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alejandro Kuzmenkov](https://github.com/akuzm)) + +### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement} + +- El manejo de excepciones ahora funciona correctamente en el subsistema Windows para Linux. Consulte https://github.com/ClickHouse-Extras/libunwind/pull/3 Esto corrige [\#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [\#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) +- Reemplazar `readline` con `replxx` para la edición de línea interactiva en `clickhouse-client` [\#8416](https://github.com/ClickHouse/ClickHouse/pull/8416) ([Ivan](https://github.com/abyss7)) +- Mejor tiempo de compilación y menos instancias de plantillas en FunctionsComparison. [\#9324](https://github.com/ClickHouse/ClickHouse/pull/9324) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Integración añadida con `clang-tidy` en CI. Ver también [\#6044](https://github.com/ClickHouse/ClickHouse/issues/6044) [\#9566](https://github.com/ClickHouse/ClickHouse/pull/9566) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora vinculamos ClickHouse en CI usando `lld` incluso para `gcc`. [\#9049](https://github.com/ClickHouse/ClickHouse/pull/9049) ([alesapin](https://github.com/alesapin)) +- Permitir aleatorizar la programación de subprocesos e insertar fallas cuando `THREAD_FUZZER_*` se establecen variables de entorno. Esto ayuda a las pruebas. [\#9459](https://github.com/ClickHouse/ClickHouse/pull/9459) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Habilitar sockets seguros en pruebas sin estado [\#9288](https://github.com/ClickHouse/ClickHouse/pull/9288) ([Tavplubix](https://github.com/tavplubix)) +- Hacer SPLIT\_SHARED\_LIBRARIES=OFF más robusto [\#9156](https://github.com/ClickHouse/ClickHouse/pull/9156) ([Azat Khuzhin](https://github.com/azat)) +- Hacer “performance\_introspection\_and\_logging” prueba confiable al servidor aleatorio atascado. Esto puede suceder en el entorno de CI. Ver también [\#9515](https://github.com/ClickHouse/ClickHouse/issues/9515) [\#9528](https://github.com/ClickHouse/ClickHouse/pull/9528) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Validar XML en la comprobación de estilo. [\#9550](https://github.com/ClickHouse/ClickHouse/pull/9550) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Condición de carrera fija en la prueba `00738_lock_for_inner_table`. Esta prueba se basó en el sueño. [\#9555](https://github.com/ClickHouse/ClickHouse/pull/9555) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Eliminar pruebas de rendimiento de tipo `once`. Esto es necesario para ejecutar todas las pruebas de rendimiento en modo de comparación estadística (más confiable). [\#9557](https://github.com/ClickHouse/ClickHouse/pull/9557) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Prueba de rendimiento agregada para funciones aritméticas. [\#9326](https://github.com/ClickHouse/ClickHouse/pull/9326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Prueba de rendimiento añadida para `sumMap` y `sumMapWithOverflow` funciones agregadas. Seguimiento de [\#8933](https://github.com/ClickHouse/ClickHouse/issues/8933) [\#8947](https://github.com/ClickHouse/ClickHouse/pull/8947) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Asegúrese de estilo de ErrorCodes por comprobación de estilo. [\#9370](https://github.com/ClickHouse/ClickHouse/pull/9370) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregar script para el historial de pruebas. [\#8796](https://github.com/ClickHouse/ClickHouse/pull/8796) ([alesapin](https://github.com/alesapin)) +- Añadir advertencia GCC `-Wsuggest-override` para localizar y arreglar todos los lugares donde `override` palabra clave debe ser utilizado. [\#8760](https://github.com/ClickHouse/ClickHouse/pull/8760) ([Método de codificación de datos:](https://github.com/kreuzerkrieg)) +- Ignore el símbolo débil en Mac OS X porque debe definirse [\#9538](https://github.com/ClickHouse/ClickHouse/pull/9538) ([Usuario eliminado](https://github.com/ghost)) +- Normalice el tiempo de ejecución de algunas consultas en las pruebas de rendimiento. Esto se hace en preparación para ejecutar todas las pruebas de rendimiento en modo de comparación. [\#9565](https://github.com/ClickHouse/ClickHouse/pull/9565) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Arregle algunas pruebas para admitir pytest con pruebas de consulta [\#9062](https://github.com/ClickHouse/ClickHouse/pull/9062) ([Ivan](https://github.com/abyss7)) +- Habilite SSL en compilación con MSan, por lo que el servidor no fallará al iniciarse al ejecutar pruebas sin estado [\#9531](https://github.com/ClickHouse/ClickHouse/pull/9531) ([Tavplubix](https://github.com/tavplubix)) +- Corregir la sustitución de la base de datos en los resultados de las pruebas [\#9384](https://github.com/ClickHouse/ClickHouse/pull/9384) ([Ilya Yatsishin](https://github.com/qoega)) +- Crear correcciones para plataformas diversas [\#9381](https://github.com/ClickHouse/ClickHouse/pull/9381) ([propulsor](https://github.com/proller)) [\#8755](https://github.com/ClickHouse/ClickHouse/pull/8755) ([propulsor](https://github.com/proller)) [\#8631](https://github.com/ClickHouse/ClickHouse/pull/8631) ([propulsor](https://github.com/proller)) +- Sección de discos agregada a la imagen de la ventana acoplable de prueba sin estado con cobertura [\#9213](https://github.com/ClickHouse/ClickHouse/pull/9213) ([Pavel Kovalenko](https://github.com/Jokser)) +- Deshágase de los archivos en el árbol de origen al compilar con GRPC [\#9588](https://github.com/ClickHouse/ClickHouse/pull/9588) ([Amos pájaro](https://github.com/amosbird)) +- Un tiempo de compilación ligeramente más rápido al eliminar SessionCleaner del contexto. Haga que el código de SessionCleaner sea más simple. [\#9232](https://github.com/ClickHouse/ClickHouse/pull/9232) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Comprobación actualizada de consultas colgadas en el script de prueba de clickhouse [\#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alejandro Kazakov](https://github.com/Akazz)) +- Se eliminaron algunos archivos inútiles del repositorio. [\#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Tipo cambiado de perftests matemáticos de `once` a `loop`. [\#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Agregue una imagen acoplable que permite construir un informe HTML del navegador de código interactivo para nuestra base de código. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) Ver [Navegador de código Woboq](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html) +- Suprima algunas fallas de prueba bajo MSan. [\#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Aceleración “exception while insert” prueba. Esta prueba a menudo se agota en la compilación de depuración con cobertura. [\#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualizar `libcxx` y `libcxxabi` dominar. En preparación para [\#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [\#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reparar la prueba de flacky `00910_zookeeper_test_alter_compression_codecs`. [\#9525](https://github.com/ClickHouse/ClickHouse/pull/9525) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Limpie las banderas duplicadas del vinculador. Asegúrese de que el enlazador no busque un símbolo inesperado. [\#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos pájaro](https://github.com/amosbird)) +- Añadir `clickhouse-odbc` conductor en imágenes de prueba. Esto permite probar la interacción de ClickHouse con ClickHouse a través de su propio controlador ODBC. [\#9348](https://github.com/ClickHouse/ClickHouse/pull/9348) ([filimonov](https://github.com/filimonov)) +- Corregir varios errores en las pruebas unitarias. [\#9047](https://github.com/ClickHouse/ClickHouse/pull/9047) ([alesapin](https://github.com/alesapin)) +- Permitir `-Wmissing-include-dirs` Advertencia de GCC para eliminar todas las incluidas no existentes, principalmente como resultado de errores de scripting de CMake [\#8704](https://github.com/ClickHouse/ClickHouse/pull/8704) ([Método de codificación de datos:](https://github.com/kreuzerkrieg)) +- Describa las razones si el generador de perfiles de consultas no puede funcionar. Esto está destinado a [\#9049](https://github.com/ClickHouse/ClickHouse/issues/9049) [\#9144](https://github.com/ClickHouse/ClickHouse/pull/9144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualice OpenSSL al maestro ascendente. Se ha solucionado el problema cuando las conexiones TLS pueden fallar con el mensaje `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error` y `SSL Exception: error:2400006E:random number generator::error retrieving entropy`. El problema estaba presente en la versión 20.1. [\#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualizar Dockerfile para el servidor [\#8893](https://github.com/ClickHouse/ClickHouse/pull/8893) ([Ilya Mazaev](https://github.com/ne-ray)) +- Correcciones menores en el script build-gcc-from-sources [\#8774](https://github.com/ClickHouse/ClickHouse/pull/8774) ([Michael Nacharov](https://github.com/mnach)) +- Reemplazar `numbers` a `zeros` en perftests donde `number` no se utiliza la columna. Esto conducirá a resultados de pruebas más limpios. [\#9600](https://github.com/ClickHouse/ClickHouse/pull/9600) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Solucione el problema de desbordamiento de pila al usar initializer\_list en los constructores de columnas. [\#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Usuario eliminado](https://github.com/ghost)) +- Actualizar librdkafka a v1.3.0. Habilitar incluido `rdkafka` y `gsasl` bibliotecas en Mac OS X. [\#9000](https://github.com/ClickHouse/ClickHouse/pull/9000) ([Andrés Onyshchuk](https://github.com/oandrew)) +- corrección de compilación en GCC 9.2.0 [\#9306](https://github.com/ClickHouse/ClickHouse/pull/9306) ([vxider](https://github.com/Vxider)) + +## Lanzamiento de ClickHouse v20.1 {#clickhouse-release-v20-1} + +### Todos los derechos reservados. {#clickhouse-release-v20-1-6-30-2020-03-05} + +#### Corrección de errores {#bug-fix-2} + +- Corregir la incompatibilidad de datos cuando se comprime con `T64` códec. + [\#9039](https://github.com/ClickHouse/ClickHouse/pull/9039) [(abyss7)](https://github.com/abyss7) +- Corregir el orden de los rangos mientras se lee de la tabla MergeTree en un hilo. Fijar [\#8964](https://github.com/ClickHouse/ClickHouse/issues/8964). + [\#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) [(CurtizJ)](https://github.com/CurtizJ) +- Arreglar posible segfault en `MergeTreeRangeReader`, mientras se ejecuta `PREWHERE`. Fijar [\#9064](https://github.com/ClickHouse/ClickHouse/issues/9064). + [\#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) [(CurtizJ)](https://github.com/CurtizJ) +- Fijar `reinterpretAsFixedString` devolver `FixedString` en lugar de `String`. + [\#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) [(oandrew)](https://github.com/oandrew) +- Fijar `joinGet` con tipos de devolución anulables. Fijar [\#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) + [\#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) [(amosbird)](https://github.com/amosbird) +- Repare la prueba de fuzz y el comportamiento incorrecto de las funciones bitTestAll / bitTestAny. + [\#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Corrige el comportamiento de las funciones de coincidencia y extracción cuando haystack tiene cero bytes. El comportamiento era incorrecto cuando el pajar era constante. Fijar [\#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) + [\#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Se corrigió la ejecución de predicados invertidos cuando se usa un índice funcional no estrictamente monotínico. Fijar [\#9034](https://github.com/ClickHouse/ClickHouse/issues/9034) + [\#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) [(Akazz))](https://github.com/Akazz) +- Permitir reescribir `CROSS` a `INNER JOIN` si hay `[NOT] LIKE` operador en `WHERE` apartado. Fijar [\#9191](https://github.com/ClickHouse/ClickHouse/issues/9191) + [\#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) [(4ertus2)](https://github.com/4ertus2) +- Permitir que las primeras columnas de una tabla con Log engine sean un alias. + [\#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) [(abyss7)](https://github.com/abyss7) +- Permitir la combinación de coma con `IN()` dentro. Fijar [\#7314](https://github.com/ClickHouse/ClickHouse/issues/7314). + [\#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) [(4ertus2)](https://github.com/4ertus2) +- Mejorar `ALTER MODIFY/ADD` consultas lógica. Ahora no puedes `ADD` sin tipo, `MODIFY` expresión predeterminada no cambia el tipo de columna y `MODIFY` type no pierde el valor de expresión predeterminado. Fijar [\#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). + [\#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) [(alesapin)](https://github.com/alesapin) +- Fijar la finalización de las mutaciones, cuando la mutación ya hecha puede tener el estado is\_done = 0. + [\#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) [(alesapin)](https://github.com/alesapin) +- Apoyo “Processors” tubería para el sistema.números y sistema.numbers\_mt. Esto también corrige el error cuando `max_execution_time` no se respeta. + [\#7796](https://github.com/ClickHouse/ClickHouse/pull/7796) [(KochetovNicolai)](https://github.com/KochetovNicolai) +- Corregir el conteo incorrecto de `DictCacheKeysRequestedFound` métrica. + [\#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) [(nikitamikhaylov)](https://github.com/nikitamikhaylov) +- Se agregó una verificación de la política de almacenamiento en `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE` que de lo contrario podría hacer que los datos de la parte sean inaccesibles después del reinicio y evitar que se inicie ClickHouse. + [\#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) [(excitoon)](https://github.com/excitoon) +- Informe UBSan fijo en `MergeTreeIndexSet`. Esto corrige [\#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) + [\#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Corrige un posible registro de datos en BlockIO. + [\#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) [(KochetovNicolai)](https://github.com/KochetovNicolai) +- Soporte para `UInt64` números que no caben en Int64 en funciones relacionadas con JSON. Actualizar `SIMDJSON` dominar. Esto corrige [\#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) + [\#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Solucione el problema cuando la cantidad de espacio libre no se calcula correctamente si el directorio de datos está montado en un dispositivo separado. Para el disco predeterminado, calcule el espacio libre del subdirectorio de datos. Esto corrige [\#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) + [\#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) [(millb)](https://github.com/millb) +- Solucione el problema cuando las conexiones TLS pueden fallar con el mensaje `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error and SSL Exception: error:2400006E:random number generator::error retrieving entropy.` Actualice OpenSSL al maestro ascendente. + [\#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Al ejecutar `CREATE` consulta, doblar expresiones constantes en argumentos del motor de almacenamiento. Reemplace el nombre de la base de datos vacía con la base de datos actual. Fijar [\#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [\#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). También corrija la comprobación de la dirección local en ClickHouseDictionarySource. + [\#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) +- Arreglar segfault en `StorageMerge`, que puede suceder al leer de StorageFile. + [\#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) [(tabplubix)](https://github.com/tavplubix) +- Evitar la pérdida de datos en `Kafka` en casos raros cuando la excepción ocurre después de leer el sufijo pero antes de confirmar. Fijar [\#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Relacionados: [\#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) + [\#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) +- Corregir un error que conduce a la terminación del servidor al intentar usar / soltar `Kafka` tabla creada con parámetros incorrectos. Fijar [\#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporar [\#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). + [\#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) + +#### Novedad {#new-feature-1} + +- Añadir `deduplicate_blocks_in_dependent_materialized_views` opción para controlar el comportamiento de las inserciones idempotentes en tablas con vistas materializadas. Esta nueva característica se agregó a la versión de corrección de errores mediante una solicitud especial de Altinity. + [\#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) + +### Todos los derechos reservados. {#clickhouse-release-v20-1-2-4-2020-01-22} + +### Cambio incompatible hacia atrás {#backward-incompatible-change-1} + +- Haga el ajuste `merge_tree_uniform_read_distribution` obsoleto. El servidor aún reconoce esta configuración, pero no tiene ningún efecto. [\#8308](https://github.com/ClickHouse/ClickHouse/pull/8308) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Tipo de retorno cambiado de la función `greatCircleDistance` a `Float32` porque ahora el resultado del cálculo es `Float32`. [\#7993](https://github.com/ClickHouse/ClickHouse/pull/7993) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora se espera que los parámetros de consulta estén representados en “escaped” formato. Por ejemplo, para pasar una cadena `ab` tienes que escribir `a\tb` o `a\b` y respectivamente, `a%5Ctb` o `a%5C%09b` en URL. Esto es necesario para agregar la posibilidad de pasar NULL como `\N`. Esto corrige [\#7488](https://github.com/ClickHouse/ClickHouse/issues/7488). [\#8517](https://github.com/ClickHouse/ClickHouse/pull/8517) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Permitir `use_minimalistic_part_header_in_zookeeper` establecimiento de `ReplicatedMergeTree` predeterminada. Esto reducirá significativamente la cantidad de datos almacenados en ZooKeeper. Esta configuración es compatible desde la versión 19.1 y ya la usamos en producción en múltiples servicios sin problemas durante más de medio año. Deshabilite esta configuración si tiene la posibilidad de cambiar a versiones anteriores a 19.1. [\#6850](https://github.com/ClickHouse/ClickHouse/pull/6850) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Los índices de omisión de datos están listos para producción y están habilitados de forma predeterminada. Configuración `allow_experimental_data_skipping_indices`, `allow_experimental_cross_to_join_conversion` y `allow_experimental_multiple_joins_emulation` ahora están obsoletos y no hacen nada. [\#7974](https://github.com/ClickHouse/ClickHouse/pull/7974) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir nuevo `ANY JOIN` lógica para `StorageJoin` consistente con `JOIN` operación. Para actualizar sin cambios en el comportamiento, necesita agregar `SETTINGS any_join_distinct_right_table_keys = 1` a Engine Unir metadatos de tablas o volver a crear estas tablas después de la actualización. [\#8400](https://github.com/ClickHouse/ClickHouse/pull/8400) ([Artem Zuikov](https://github.com/4ertus2)) +- Requiere que el servidor se reinicie para aplicar los cambios en la configuración de registro. Esta es una solución temporal para evitar el error en el que el servidor inicia sesión en un archivo de registro eliminado (consulte [\#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [\#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alejandro Kuzmenkov](https://github.com/akuzm)) + +### Novedad {#new-feature-2} + +- Se agregó información sobre las rutas de acceso de piezas a `system.merges`. [\#8043](https://github.com/ClickHouse/ClickHouse/pull/8043) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Añadir capacidad de ejecutar `SYSTEM RELOAD DICTIONARY` consulta en `ON CLUSTER` modo. [\#8288](https://github.com/ClickHouse/ClickHouse/pull/8288) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Añadir capacidad de ejecutar `CREATE DICTIONARY` consultas en `ON CLUSTER` modo. [\#8163](https://github.com/ClickHouse/ClickHouse/pull/8163) ([alesapin](https://github.com/alesapin)) +- Ahora el perfil del usuario en `users.xml` puede heredar varios perfiles. [\#8343](https://github.com/ClickHouse/ClickHouse/pull/8343) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Añadir `system.stack_trace` tabla que permite ver los rastros de pila de todos los hilos del servidor. Esto es útil para los desarrolladores para examinar el estado del servidor. Esto corrige [\#7576](https://github.com/ClickHouse/ClickHouse/issues/7576). [\#8344](https://github.com/ClickHouse/ClickHouse/pull/8344) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `DateTime64` tipo de datos con una precisión de subsegundo configurable. [\#7170](https://github.com/ClickHouse/ClickHouse/pull/7170) ([Vasily Nemkov](https://github.com/Enmk)) +- Agregar función de tabla `clusterAllReplicas` que permite consultar todos los nodos en el clúster. [\#8493](https://github.com/ClickHouse/ClickHouse/pull/8493) ([mujer madura](https://github.com/kiransunkari)) +- Agregar función agregada `categoricalInformationValue` que calcula el valor de información de una entidad discreta. [\#8117](https://github.com/ClickHouse/ClickHouse/pull/8117) ([Hcz](https://github.com/hczhcz)) +- Acelerar el análisis de archivos de datos en `CSV`, `TSV` y `JSONEachRow` formato haciéndolo en paralelo. [\#7780](https://github.com/ClickHouse/ClickHouse/pull/7780) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Añadir función `bankerRound` que realiza el redondeo del banquero. [\#8112](https://github.com/ClickHouse/ClickHouse/pull/8112) ([Hcz](https://github.com/hczhcz)) +- Soporta más idiomas en el diccionario incrustado para nombres de región: ‘ru’, ‘en’, ‘ua’, ‘uk’, ‘by’, ‘kz’, ‘tr’, ‘de’, ‘uz’, ‘lv’, ‘lt’, ‘et’, ‘pt’, ‘he’, ‘vi’. [\#8189](https://github.com/ClickHouse/ClickHouse/pull/8189) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejoras en la consistencia de `ANY JOIN` lógica. Ahora `t1 ANY LEFT JOIN t2` igual `t2 ANY RIGHT JOIN t1`. [\#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir ajuste `any_join_distinct_right_table_keys` que permite un comportamiento antiguo para `ANY INNER JOIN`. [\#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir nuevo `SEMI` y `ANTI JOIN`. Antiguo `ANY INNER JOIN` comportamiento ahora disponible como `SEMI LEFT JOIN`. [\#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir `Distributed` formato para `File` motor y `file` función de mesa que permite leer desde `.bin` archivos generados por inserciones asincrónicas en `Distributed` tabla. [\#8535](https://github.com/ClickHouse/ClickHouse/pull/8535) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Agregar argumento de columna de reinicio opcional para `runningAccumulate` que permite restablecer los resultados de agregación para cada nuevo valor clave. [\#8326](https://github.com/ClickHouse/ClickHouse/pull/8326) ([Sergey Kononenko](https://github.com/kononencheg)) +- Agregue la capacidad de usar ClickHouse como punto final Prometheus. [\#7900](https://github.com/ClickHouse/ClickHouse/pull/7900) ([vdimir](https://github.com/Vdimir)) +- Añadir sección `` en `config.xml` que restringe los hosts permitidos para motores de tabla remotos y funciones de tabla `URL`, `S3`, `HDFS`. [\#7154](https://github.com/ClickHouse/ClickHouse/pull/7154) ([Mikhail Korotov](https://github.com/millb)) +- Función añadida `greatCircleAngle` que calcula la distancia en una esfera en grados. [\#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se ha cambiado el radio de la Tierra para que sea consistente con la biblioteca H3. [\#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `JSONCompactEachRow` y `JSONCompactEachRowWithNamesAndTypes` Formatos de entrada y salida. [\#7841](https://github.com/ClickHouse/ClickHouse/pull/7841) ([Mikhail Korotov](https://github.com/millb)) +- Característica agregada para motores de tablas relacionados con archivos y funciones de tabla (`File`, `S3`, `URL`, `HDFS`) que permite leer y escribir `gzip` archivos basados en el parámetro del motor adicional o extensión de archivo. [\#7840](https://github.com/ClickHouse/ClickHouse/pull/7840) ([Andrey Bodrov](https://github.com/apbodrov)) +- Se agregó el `randomASCII(length)` función, generando una cadena con un conjunto aleatorio de [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) caracteres imprimibles. [\#8401](https://github.com/ClickHouse/ClickHouse/pull/8401) ([Bayoneta](https://github.com/BayoNet)) +- Función añadida `JSONExtractArrayRaw` que devuelve una matriz en elementos de matriz json no analizados de `JSON` cadena. [\#8081](https://github.com/ClickHouse/ClickHouse/pull/8081) ([Oleg Matrokhin](https://github.com/errx)) +- Añadir `arrayZip` función que permite combinar múltiples matrices de longitudes iguales en una matriz de tuplas. [\#8149](https://github.com/ClickHouse/ClickHouse/pull/8149) ([Invierno Zhang](https://github.com/zhang2014)) +- Agregue la capacidad de mover datos entre discos de acuerdo con la configuración `TTL`-expresiones para `*MergeTree` familia de motores de mesa. [\#8140](https://github.com/ClickHouse/ClickHouse/pull/8140) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Se agregó una nueva función de agregado `avgWeighted` que permite calcular el promedio ponderado. [\#7898](https://github.com/ClickHouse/ClickHouse/pull/7898) ([Andrey Bodrov](https://github.com/apbodrov)) +- Ahora el análisis paralelo está habilitado de forma predeterminada para `TSV`, `TSKV`, `CSV` y `JSONEachRow` formato. [\#7894](https://github.com/ClickHouse/ClickHouse/pull/7894) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Añadir varias funciones geográficas de `H3` biblioteca: `h3GetResolution`, `h3EdgeAngle`, `h3EdgeLength`, `h3IsValid` y `h3kRing`. [\#8034](https://github.com/ClickHouse/ClickHouse/pull/8034) ([Konstantin Malanchev](https://github.com/hombit)) +- Añadido soporte para brotli (`br`) compresión en almacenes relacionados con archivos y funciones de tabla. Esto corrige [\#8156](https://github.com/ClickHouse/ClickHouse/issues/8156). [\#8526](https://github.com/ClickHouse/ClickHouse/pull/8526) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Añadir `groupBit*` funciones para el `SimpleAggregationFunction` tipo. [\#8485](https://github.com/ClickHouse/ClickHouse/pull/8485) ([Guillaume Tassery](https://github.com/YiuRULE)) + +### Corrección de errores {#bug-fix-3} + +- Corregir el cambio de nombre de las tablas con `Distributed` motor. Soluciona el problema [\#7868](https://github.com/ClickHouse/ClickHouse/issues/7868). [\#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([Tavplubix](https://github.com/tavplubix)) +- Ahora diccionarios de apoyo `EXPRESSION` para atributos en cadena arbitraria en dialecto SQL no ClickHouse. [\#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) +- Arreglar roto `INSERT SELECT FROM mysql(...)` consulta. Esto corrige [\#8070](https://github.com/ClickHouse/ClickHouse/issues/8070) y [\#7960](https://github.com/ClickHouse/ClickHouse/issues/7960). [\#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([Tavplubix](https://github.com/tavplubix)) +- Corregir error “Mismatch column sizes” al insertar el valor predeterminado `Tuple` de `JSONEachRow`. Esto corrige [\#5653](https://github.com/ClickHouse/ClickHouse/issues/5653). [\#8606](https://github.com/ClickHouse/ClickHouse/pull/8606) ([Tavplubix](https://github.com/tavplubix)) +- Ahora se lanzará una excepción en caso de usar `WITH TIES` junto `LIMIT BY`. También agregue la capacidad de usar `TOP` con `LIMIT BY`. Esto corrige [\#7472](https://github.com/ClickHouse/ClickHouse/issues/7472). [\#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Repara la dependencia del superintendente de la nueva versión de glibc en `clickhouse-odbc-bridge` binario. [\#8046](https://github.com/ClickHouse/ClickHouse/pull/8046) ([Amos pájaro](https://github.com/amosbird)) +- Corregir error en la función de verificación de `*MergeTree` familia de motores. Ahora no falla en caso de que tengamos la misma cantidad de filas en el último gránulo y la última marca (no final). [\#8047](https://github.com/ClickHouse/ClickHouse/pull/8047) ([alesapin](https://github.com/alesapin)) +- Fijar el inserto en `Enum*` columnas después `ALTER` consulta, cuando el tipo numérico subyacente es igual al tipo especificado en la tabla. Esto corrige [\#7836](https://github.com/ClickHouse/ClickHouse/issues/7836). [\#7908](https://github.com/ClickHouse/ClickHouse/pull/7908) ([Anton Popov](https://github.com/CurtizJ)) +- Negativo no constante permitido “size” argumento para la función `substring`. No fue permitido por error. Esto corrige [\#4832](https://github.com/ClickHouse/ClickHouse/issues/4832). [\#7703](https://github.com/ClickHouse/ClickHouse/pull/7703) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir el error de análisis cuando se pasa un número incorrecto de argumentos a `(O|J)DBC` motor de mesa. [\#7709](https://github.com/ClickHouse/ClickHouse/pull/7709) ([alesapin](https://github.com/alesapin)) +- Usar el nombre de comando del proceso de clickhouse en ejecución al enviar registros a syslog. En versiones anteriores, se usaba una cadena vacía en lugar del nombre del comando. [\#8460](https://github.com/ClickHouse/ClickHouse/pull/8460) ([Michael Nacharov](https://github.com/mnach)) +- Corregir la comprobación de hosts permitidos para `localhost`. Este PR corrige la solución proporcionada en [\#8241](https://github.com/ClickHouse/ClickHouse/pull/8241). [\#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) +- Arreglar accidente raro en `argMin` y `argMax` funciones para argumentos de cadena larga, cuando el resultado se usa en `runningAccumulate` función. Esto corrige [\#8325](https://github.com/ClickHouse/ClickHouse/issues/8325) [\#8341](https://github.com/ClickHouse/ClickHouse/pull/8341) ([dinosaurio](https://github.com/769344359)) +- Repara el sobrecompromiso de memoria para tablas con `Buffer` motor. [\#8345](https://github.com/ClickHouse/ClickHouse/pull/8345) ([Azat Khuzhin](https://github.com/azat)) +- Se corrigió un error potencial en las funciones que pueden tomar `NULL` como uno de los argumentos y devuelve no NULL. [\#8196](https://github.com/ClickHouse/ClickHouse/pull/8196) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejores cálculos de métricas en el grupo de subprocesos para procesos en segundo plano para `MergeTree` motores de mesa. [\#8194](https://github.com/ClickHouse/ClickHouse/pull/8194) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fijar la función `IN` dentro `WHERE` declaración cuando el filtro de tabla de nivel de fila está presente. Fijar [\#6687](https://github.com/ClickHouse/ClickHouse/issues/6687) [\#8357](https://github.com/ClickHouse/ClickHouse/pull/8357) ([Ivan](https://github.com/abyss7)) +- Ahora se lanza una excepción si el valor integral no se analiza completamente para los valores de configuración. [\#7678](https://github.com/ClickHouse/ClickHouse/pull/7678) ([Mikhail Korotov](https://github.com/millb)) +- Solucionar la excepción cuando se utiliza la función de agregado en la consulta a la tabla distribuida con más de dos fragmentos locales. [\#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) +- Ahora el filtro bloom puede manejar matrices de longitud cero y no realiza cálculos redundantes. [\#8242](https://github.com/ClickHouse/ClickHouse/pull/8242) ([chimbab](https://github.com/achimbab)) +- Se corrigió la comprobación de si se permite un host cliente al hacer coincidir el host cliente con `host_regexp` especificado en `users.xml`. [\#8241](https://github.com/ClickHouse/ClickHouse/pull/8241) ([Vitaly Baranov](https://github.com/vitlibar)) +- Relax comprobación de columna ambigua que conduce a falsos positivos en múltiples `JOIN ON` apartado. [\#8385](https://github.com/ClickHouse/ClickHouse/pull/8385) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió un posible bloqueo del servidor (`std::terminate`) cuando el servidor no puede enviar o escribir datos en `JSON` o `XML` formato con valores de `String` (tipo de datos que requieren `UTF-8` validación) o al comprimir datos de resultados con el algoritmo Brotli o en algunos otros casos raros. Esto corrige [\#7603](https://github.com/ClickHouse/ClickHouse/issues/7603) [\#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir la condición de carrera en `StorageDistributedDirectoryMonitor` encontrado por CI. Esto corrige [\#8364](https://github.com/ClickHouse/ClickHouse/issues/8364). [\#8383](https://github.com/ClickHouse/ClickHouse/pull/8383) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ahora el fondo se fusiona en `*MergeTree` familia de motores de mesa preservar el orden de volumen de políticas de almacenamiento con mayor precisión. [\#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Ahora motor de mesa `Kafka` funciona correctamente con `Native` formato. Esto corrige [\#6731](https://github.com/ClickHouse/ClickHouse/issues/6731) [\#7337](https://github.com/ClickHouse/ClickHouse/issues/7337) [\#8003](https://github.com/ClickHouse/ClickHouse/issues/8003). [\#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +- Formatos fijos con encabezados (como `CSVWithNames`) que lanzaban una excepción sobre EOF para el motor de tabla `Kafka`. [\#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +- Se corrigió un error con la creación de conjunto de subconsulta en la parte derecha de `IN` apartado. Esto corrige [\#5767](https://github.com/ClickHouse/ClickHouse/issues/5767) y [\#2542](https://github.com/ClickHouse/ClickHouse/issues/2542). [\#7755](https://github.com/ClickHouse/ClickHouse/pull/7755) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Solucionar un posible bloqueo al leer desde el almacenamiento `File`. [\#7756](https://github.com/ClickHouse/ClickHouse/pull/7756) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Lectura fija de los archivos en `Parquet` formato que contiene columnas de tipo `list`. [\#8334](https://github.com/ClickHouse/ClickHouse/pull/8334) ([Más información](https://github.com/maxulan)) +- Corregir error `Not found column` para consultas distribuidas con `PREWHERE` condición depende de la clave de muestreo si `max_parallel_replicas > 1`. [\#7913](https://github.com/ClickHouse/ClickHouse/pull/7913) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir error `Not found column` si se utiliza la consulta `PREWHERE` depende del alias de la tabla y el conjunto de resultados estaba vacío debido a la condición de la clave principal. [\#7911](https://github.com/ClickHouse/ClickHouse/pull/7911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Tipo de retorno fijo para funciones `rand` y `randConstant` en caso de `Nullable` argumento. Ahora las funciones siempre regresan `UInt32` y nunca `Nullable(UInt32)`. [\#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Inversión de predicado deshabilitada para `WITH FILL` expresion. Esto corrige [\#7784](https://github.com/ClickHouse/ClickHouse/issues/7784). [\#7789](https://github.com/ClickHouse/ClickHouse/pull/7789) ([Invierno Zhang](https://github.com/zhang2014)) +- Corregido incorrecto `count()` resultado para `SummingMergeTree` cuando `FINAL` se utiliza la sección. [\#3280](https://github.com/ClickHouse/ClickHouse/issues/3280) [\#7786](https://github.com/ClickHouse/ClickHouse/pull/7786) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Corregir posible resultado incorrecto para funciones constantes de servidores remotos. Sucedió para consultas con funciones como `version()`, `uptime()`, sucesivamente. que devuelve diferentes valores constantes para diferentes servidores. Esto corrige [\#7666](https://github.com/ClickHouse/ClickHouse/issues/7666). [\#7689](https://github.com/ClickHouse/ClickHouse/pull/7689) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir un error complicado en la optimización de predicados push-down que conduce a resultados incorrectos. Esto soluciona muchos problemas en la optimización de predicados push-down. [\#8503](https://github.com/ClickHouse/ClickHouse/pull/8503) ([Invierno Zhang](https://github.com/zhang2014)) +- Fix crash en `CREATE TABLE .. AS dictionary` consulta. [\#8508](https://github.com/ClickHouse/ClickHouse/pull/8508) ([Azat Khuzhin](https://github.com/azat)) +- Varias mejoras en la gramática ClickHouse `.g4` file. [\#8294](https://github.com/ClickHouse/ClickHouse/pull/8294) ([taiyang-li](https://github.com/taiyang-li)) +- Corregir un error que conduce a bloqueos en `JOIN`s con mesas con motor `Join`. Esto corrige [\#7556](https://github.com/ClickHouse/ClickHouse/issues/7556) [\#8254](https://github.com/ClickHouse/ClickHouse/issues/8254) [\#7915](https://github.com/ClickHouse/ClickHouse/issues/7915) [\#8100](https://github.com/ClickHouse/ClickHouse/issues/8100). [\#8298](https://github.com/ClickHouse/ClickHouse/pull/8298) ([Artem Zuikov](https://github.com/4ertus2)) +- Repara la recarga de diccionarios redundantes en `CREATE DATABASE`. [\#7916](https://github.com/ClickHouse/ClickHouse/pull/7916) ([Azat Khuzhin](https://github.com/azat)) +- Limitar el número máximo de secuencias para leer desde `StorageFile` y `StorageHDFS`. Correcciones https://github.com/ClickHouse/ClickHouse/issues/7650. [\#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) +- Corregir error en `ALTER ... MODIFY ... CODEC` consulta, cuando el usuario especifica tanto la expresión predeterminada como el códec. Fijar [8593](https://github.com/ClickHouse/ClickHouse/issues/8593). [\#8614](https://github.com/ClickHouse/ClickHouse/pull/8614) ([alesapin](https://github.com/alesapin)) +- Corregir error en la fusión de fondo de columnas con `SimpleAggregateFunction(LowCardinality)` tipo. [\#8613](https://github.com/ClickHouse/ClickHouse/pull/8613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Tipo fijo comprobar en función `toDateTime64`. [\#8375](https://github.com/ClickHouse/ClickHouse/pull/8375) ([Vasily Nemkov](https://github.com/Enmk)) +- Ahora el servidor no se bloquea `LEFT` o `FULL JOIN` con y Unirse al motor y no soportado `join_use_nulls` configuración. [\#8479](https://github.com/ClickHouse/ClickHouse/pull/8479) ([Artem Zuikov](https://github.com/4ertus2)) +- Ahora `DROP DICTIONARY IF EXISTS db.dict` la consulta no arroja una excepción si `db` no existe. [\#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) +- Corregir posibles bloqueos en las funciones de la tabla (`file`, `mysql`, `remote`) causado por el uso de la referencia a eliminado `IStorage` objeto. Corregir el análisis incorrecto de las columnas especificadas en la inserción en la función de la tabla. [\#7762](https://github.com/ClickHouse/ClickHouse/pull/7762) ([Tavplubix](https://github.com/tavplubix)) +- Asegúrese de que la red esté activa antes de comenzar `clickhouse-server`. Esto corrige [\#7507](https://github.com/ClickHouse/ClickHouse/issues/7507). [\#8570](https://github.com/ClickHouse/ClickHouse/pull/8570) ([Zhichang Yu](https://github.com/yuzhichang)) +- Corregir el manejo de los tiempos de espera para conexiones seguras, por lo que las consultas no se cuelgan indefenitamente. Esto corrige [\#8126](https://github.com/ClickHouse/ClickHouse/issues/8126). [\#8128](https://github.com/ClickHouse/ClickHouse/pull/8128) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar `clickhouse-copier`contención despedida entre trabajadores concurrentes. [\#7816](https://github.com/ClickHouse/ClickHouse/pull/7816) ([Más información](https://github.com/dingxiangfei2009)) +- Ahora las mutaciones no omiten las partes adjuntas, incluso si su versión de mutación fuera más grande que la versión de mutación actual. [\#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) [\#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) +- Ignore copias redundantes de `*MergeTree` partes de datos después de pasar a otro disco y reiniciar el servidor. [\#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix crash en `FULL JOIN` con `LowCardinality` en `JOIN` clave. [\#8252](https://github.com/ClickHouse/ClickHouse/pull/8252) ([Artem Zuikov](https://github.com/4ertus2)) +- Prohibido usar el nombre de columna más de una vez en la consulta de inserción como `INSERT INTO tbl (x, y, x)`. Esto corrige [\#5465](https://github.com/ClickHouse/ClickHouse/issues/5465), [\#7681](https://github.com/ClickHouse/ClickHouse/issues/7681). [\#7685](https://github.com/ClickHouse/ClickHouse/pull/7685) ([alesapin](https://github.com/alesapin)) +- Se agregó respaldo para detectar el número de núcleos de CPU físicos para CPU desconocidas (usando el número de núcleos de CPU lógicos). Esto corrige [\#5239](https://github.com/ClickHouse/ClickHouse/issues/5239). [\#7726](https://github.com/ClickHouse/ClickHouse/pull/7726) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar `There's no column` error para columnas materializadas y alias. [\#8210](https://github.com/ClickHouse/ClickHouse/pull/8210) ([Artem Zuikov](https://github.com/4ertus2)) +- Se corrigió el bloqueo de corte cuando `EXISTS` consulta se utilizó sin `TABLE` o `DICTIONARY` calificador. Como `EXISTS t`. Esto corrige [\#8172](https://github.com/ClickHouse/ClickHouse/issues/8172). Este error se introdujo en la versión 19.17. [\#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir error raro con error `"Sizes of columns doesn't match"` que podrían aparecer al usar `SimpleAggregateFunction` columna. [\#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) +- Corregir error donde el usuario con vacío `allow_databases` obtuvo acceso a todas las bases de datos (y lo mismo para `allow_dictionaries`). [\#7793](https://github.com/ClickHouse/ClickHouse/pull/7793) ([DeifyTheGod](https://github.com/DeifyTheGod)) +- Solucionar el bloqueo del cliente cuando el servidor ya está desconectado del cliente. [\#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) +- Fijar `ORDER BY` comportamiento en caso de ordenar por prefijo de clave primaria y sufijo de clave no primaria. [\#7759](https://github.com/ClickHouse/ClickHouse/pull/7759) ([Anton Popov](https://github.com/CurtizJ)) +- Compruebe si la columna calificada está presente en la tabla. Esto corrige [\#6836](https://github.com/ClickHouse/ClickHouse/issues/6836). [\#7758](https://github.com/ClickHouse/ClickHouse/pull/7758) ([Artem Zuikov](https://github.com/4ertus2)) +- Comportamiento fijo con `ALTER MOVE` se ejecuta inmediatamente después de la fusión de acabado se mueve superparte de especificado. Fijar [\#8103](https://github.com/ClickHouse/ClickHouse/issues/8103). [\#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Solucionar un posible bloqueo del servidor mientras se usa `UNION` con diferente número de columnas. Fijar [\#7279](https://github.com/ClickHouse/ClickHouse/issues/7279). [\#7929](https://github.com/ClickHouse/ClickHouse/pull/7929) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir el tamaño de la subcadena de resultados para la función `substr` con tamaño negativo. [\#8589](https://github.com/ClickHouse/ClickHouse/pull/8589) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ahora el servidor no ejecuta la mutación de parte en `MergeTree` si no hay suficientes hilos libres en el grupo de fondo. [\#8588](https://github.com/ClickHouse/ClickHouse/pull/8588) ([Tavplubix](https://github.com/tavplubix)) +- Corregir un error tipográfico menor en el formato `UNION ALL` AST. [\#7999](https://github.com/ClickHouse/ClickHouse/pull/7999) ([Litao91](https://github.com/litao91)) +- Se corrigieron los resultados incorrectos del filtro de floración para los números negativos. Esto corrige [\#8317](https://github.com/ClickHouse/ClickHouse/issues/8317). [\#8566](https://github.com/ClickHouse/ClickHouse/pull/8566) ([Invierno Zhang](https://github.com/zhang2014)) +- Desbordamiento de búfer potencial fijo en descomprimir. El usuario malicioso puede pasar datos comprimidos fabricados que causarán lectura después del búfer. Este problema fue encontrado por Eldar Zaitov del equipo de seguridad de la información de Yandex. [\#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir el resultado incorrecto debido al desbordamiento de enteros en `arrayIntersect`. [\#7777](https://github.com/ClickHouse/ClickHouse/pull/7777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ahora `OPTIMIZE TABLE` La consulta no esperará a que las réplicas sin conexión realicen la operación. [\#8314](https://github.com/ClickHouse/ClickHouse/pull/8314) ([javi santana](https://github.com/javisantana)) +- Fijo `ALTER TTL` analizador para `Replicated*MergeTree` tabla. [\#8318](https://github.com/ClickHouse/ClickHouse/pull/8318) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Corrige la comunicación entre el servidor y el cliente, por lo que el servidor lee la información de las tablas temporales después de un error de consulta. [\#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) +- Fijar `bitmapAnd` error de función al intersecar un mapa de bits agregado y un mapa de bits escalar. [\#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) +- Refinar la definición de `ZXid` de acuerdo con la Guía del Programador ZooKeeper que corrige errores en `clickhouse-cluster-copier`. [\#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Más información](https://github.com/dingxiangfei2009)) +- `odbc` la función de la tabla ahora respeta `external_table_functions_use_nulls` configuración. [\#7506](https://github.com/ClickHouse/ClickHouse/pull/7506) ([Vasily Nemkov](https://github.com/Enmk)) +- Se corrigió un error que conducía a una rara carrera de datos. [\#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alejandro Kazakov](https://github.com/Akazz)) +- Ahora `SYSTEM RELOAD DICTIONARY` recarga un diccionario completamente, ignorando `update_field`. Esto corrige [\#7440](https://github.com/ClickHouse/ClickHouse/issues/7440). [\#8037](https://github.com/ClickHouse/ClickHouse/pull/8037) ([Vitaly Baranov](https://github.com/vitlibar)) +- Agregue la capacidad de verificar si el diccionario existe en la consulta de creación. [\#8032](https://github.com/ClickHouse/ClickHouse/pull/8032) ([alesapin](https://github.com/alesapin)) +- Fijar `Float*` análisis en `Values` formato. Esto corrige [\#7817](https://github.com/ClickHouse/ClickHouse/issues/7817). [\#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([Tavplubix](https://github.com/tavplubix)) +- Solucionar el bloqueo cuando no podemos reservar espacio en algunas operaciones en segundo plano de `*MergeTree` familia de motores de mesa. [\#7873](https://github.com/ClickHouse/ClickHouse/pull/7873) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Corregir el bloqueo de la operación de fusión cuando la tabla contiene `SimpleAggregateFunction(LowCardinality)` columna. Esto corrige [\#8515](https://github.com/ClickHouse/ClickHouse/issues/8515). [\#8522](https://github.com/ClickHouse/ClickHouse/pull/8522) ([Azat Khuzhin](https://github.com/azat)) +- Restaure el soporte de todas las configuraciones regionales de la UCI y agregue la capacidad de aplicar intercalaciones para expresiones constantes. También agregue el nombre del idioma a `system.collations` tabla. [\#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) +- Corregir un error cuando los diccionarios externos con una vida útil mínima cero (`LIFETIME(MIN 0 MAX N)`, `LIFETIME(N)`) no actualizar en segundo plano. [\#7983](https://github.com/ClickHouse/ClickHouse/pull/7983) ([alesapin](https://github.com/alesapin)) +- Solucionar el bloqueo cuando el diccionario externo con la fuente ClickHouse tiene una subconsulta en la consulta. [\#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Corregir el análisis incorrecto de la extensión de archivo en la tabla con el motor `URL`. Esto corrige [\#8157](https://github.com/ClickHouse/ClickHouse/issues/8157). [\#8419](https://github.com/ClickHouse/ClickHouse/pull/8419) ([Andrey Bodrov](https://github.com/apbodrov)) +- Fijar `CHECK TABLE` consulta para `*MergeTree` mesas sin llave. Fijar [\#7543](https://github.com/ClickHouse/ClickHouse/issues/7543). [\#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) +- Conversión fija de `Float64` al tipo de MySQL. [\#8079](https://github.com/ClickHouse/ClickHouse/pull/8079) ([Yuriy Baranov](https://github.com/yurriy)) +- Ahora, si la tabla no se eliminó por completo debido a un bloqueo del servidor, el servidor intentará restaurarla y cargarla. [\#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([Tavplubix](https://github.com/tavplubix)) +- Se corrigió el fallo en la función de la tabla `file` mientras se inserta en el archivo que no existe. Ahora, en este caso, se crearía un archivo y luego se procesaría la inserción. [\#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) +- Repara un punto muerto raro que puede ocurrir cuando `trace_log` está habilitado. [\#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) +- Añadir capacidad de trabajar con diferentes tipos además `Date` en `RangeHashed` diccionario externo creado a partir de consulta DDL. Fijar [7899](https://github.com/ClickHouse/ClickHouse/issues/7899). [\#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) +- Corrige el bloqueo cuando `now64()` se llama con el resultado de otra función. [\#8270](https://github.com/ClickHouse/ClickHouse/pull/8270) ([Vasily Nemkov](https://github.com/Enmk)) +- Se corrigió un error con la detección de IP del cliente para las conexiones a través del protocolo de cable mysql. [\#7743](https://github.com/ClickHouse/ClickHouse/pull/7743) ([Dmitry Muzyka](https://github.com/dmitriy-myz)) +- Repara el manejo de matrices vacías en `arraySplit` función. Esto corrige [\#7708](https://github.com/ClickHouse/ClickHouse/issues/7708). [\#7747](https://github.com/ClickHouse/ClickHouse/pull/7747) ([Hcz](https://github.com/hczhcz)) +- Se corrigió el problema cuando `pid-file` de otra carrera `clickhouse-server` puede ser eliminado. [\#8487](https://github.com/ClickHouse/ClickHouse/pull/8487) ([Weiqing Xu](https://github.com/weiqxu)) +- Repara la recarga del diccionario si tiene `invalidate_query`, que detuvo las actualizaciones y alguna excepción en los intentos de actualización anteriores. [\#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) +- Corregido el error en la función `arrayReduce` que puede conducir a “double free” y error en el combinador de funciones agregadas `Resample` que puede conducir a la pérdida de memoria. Función agregada agregada `aggThrow`. Esta función se puede utilizar para fines de prueba. [\#8446](https://github.com/ClickHouse/ClickHouse/pull/8446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Mejora {#improvement-1} + +- Registro mejorado cuando se trabaja con `S3` motor de mesa. [\#8251](https://github.com/ClickHouse/ClickHouse/pull/8251) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +- Mensaje de ayuda impreso cuando no se pasan argumentos al llamar `clickhouse-local`. Esto corrige [\#5335](https://github.com/ClickHouse/ClickHouse/issues/5335). [\#8230](https://github.com/ClickHouse/ClickHouse/pull/8230) ([Andrey Nagorny](https://github.com/Melancholic)) +- Añadir ajuste `mutations_sync` que permite esperar `ALTER UPDATE/DELETE` consultas sincrónicamente. [\#8237](https://github.com/ClickHouse/ClickHouse/pull/8237) ([alesapin](https://github.com/alesapin)) +- Permitir configurar relativo `user_files_path` en `config.xml` (en la forma similar a `format_schema_path`). [\#7632](https://github.com/ClickHouse/ClickHouse/pull/7632) ([Hcz](https://github.com/hczhcz)) +- Agregue una excepción para tipos ilegales para funciones de conversión con `-OrZero` postfix. [\#7880](https://github.com/ClickHouse/ClickHouse/pull/7880) ([Andrey Konyaev](https://github.com/akonyaev90)) +- Simplifique el formato del encabezado de los datos que se envían a un fragmento en una consulta distribuida. [\#8044](https://github.com/ClickHouse/ClickHouse/pull/8044) ([Vitaly Baranov](https://github.com/vitlibar)) +- `Live View` refactorización del motor de mesa. [\#8519](https://github.com/ClickHouse/ClickHouse/pull/8519) ([vzakaznikov](https://github.com/vzakaznikov)) +- Agregue comprobaciones adicionales para diccionarios externos creados a partir de consultas DDL. [\#8127](https://github.com/ClickHouse/ClickHouse/pull/8127) ([alesapin](https://github.com/alesapin)) +- Corregir error `Column ... already exists` mientras usa `FINAL` y `SAMPLE` together, e.g. `select count() from table final sample 1/2`. Fijar [\#5186](https://github.com/ClickHouse/ClickHouse/issues/5186). [\#7907](https://github.com/ClickHouse/ClickHouse/pull/7907) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ahora tabla el primer argumento de `joinGet` la función puede ser indentificador de tabla. [\#7707](https://github.com/ClickHouse/ClickHouse/pull/7707) ([Amos pájaro](https://github.com/amosbird)) +- Permitir usar `MaterializedView` con subconsultas anteriores `Kafka` tabla. [\#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) +- Ahora el fondo se mueve entre discos, ejecuta el grupo de subprocesos seprate. [\#7670](https://github.com/ClickHouse/ClickHouse/pull/7670) ([Vladimir Chebotarev](https://github.com/excitoon)) +- `SYSTEM RELOAD DICTIONARY` ahora se ejecuta sincrónicamente. [\#8240](https://github.com/ClickHouse/ClickHouse/pull/8240) ([Vitaly Baranov](https://github.com/vitlibar)) +- Los rastros de pila ahora muestran direcciones físicas (desconectados en el archivo de objeto) en lugar de direcciones de memoria virtual (donde se cargó el archivo de objeto). Eso permite el uso de `addr2line` cuando binary es independiente de la posición y ASLR está activo. Esto corrige [\#8360](https://github.com/ClickHouse/ClickHouse/issues/8360). [\#8387](https://github.com/ClickHouse/ClickHouse/pull/8387) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Soporte nueva sintaxis para filtros de seguridad de nivel de fila: `
`. Fijar [\#5779](https://github.com/ClickHouse/ClickHouse/issues/5779). [\#8381](https://github.com/ClickHouse/ClickHouse/pull/8381) ([Ivan](https://github.com/abyss7)) +- Ahora `cityHash` función puede trabajar con `Decimal` y `UUID` tipo. Fijar [\#5184](https://github.com/ClickHouse/ClickHouse/issues/5184). [\#7693](https://github.com/ClickHouse/ClickHouse/pull/7693) ([Mikhail Korotov](https://github.com/millb)) +- Se eliminó la granularidad de índice fijo (era 1024) de los registros del sistema porque está obsoleto después de la implementación de la granularidad adaptativa. [\#7698](https://github.com/ClickHouse/ClickHouse/pull/7698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Habilitado servidor de compatibilidad MySQL cuando ClickHouse se compila sin SSL. [\#7852](https://github.com/ClickHouse/ClickHouse/pull/7852) ([Yuriy Baranov](https://github.com/yurriy)) +- Ahora las sumas de comprobación del servidor distribuyen lotes, lo que da más errores detallados en caso de datos dañados en el lote. [\#7914](https://github.com/ClickHouse/ClickHouse/pull/7914) ([Azat Khuzhin](https://github.com/azat)) +- Apoyo `DROP DATABASE`, `DETACH TABLE`, `DROP TABLE` y `ATTACH TABLE` para `MySQL` motor de base de datos. [\#8202](https://github.com/ClickHouse/ClickHouse/pull/8202) ([Invierno Zhang](https://github.com/zhang2014)) +- Agregue autenticación en la función de tabla S3 y el motor de tabla. [\#7623](https://github.com/ClickHouse/ClickHouse/pull/7623) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Añadido cheque para piezas adicionales de `MergeTree` en diferentes discos, para no permitir perder partes de datos en discos indefinidos. [\#8118](https://github.com/ClickHouse/ClickHouse/pull/8118) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Habilite el soporte SSL para el cliente y el servidor de Mac. [\#8297](https://github.com/ClickHouse/ClickHouse/pull/8297) ([Ivan](https://github.com/abyss7)) +- Ahora ClickHouse puede funcionar como servidor federado de MySQL (consulte https://dev.mysql.com/doc/refman/5.7/en/federated-create-server.html ). [\#7717](https://github.com/ClickHouse/ClickHouse/pull/7717) ([Maxim Fedotov](https://github.com/MaxFedotov)) +- `clickhouse-client` ahora sólo habilitar `bracketed-paste` cuando multiquery está encendido y multilínea está apagado. Esto corrige (\#7757)\[https://github.com/ClickHouse/ClickHouse/issues/7757\]. [\#7761](https://github.com/ClickHouse/ClickHouse/pull/7761) ([Amos pájaro](https://github.com/amosbird)) +- Apoyo `Array(Decimal)` en `if` función. [\#7721](https://github.com/ClickHouse/ClickHouse/pull/7721) ([Artem Zuikov](https://github.com/4ertus2)) +- Decimales de apoyo en `arrayDifference`, `arrayCumSum` y `arrayCumSumNegative` función. [\#7724](https://github.com/ClickHouse/ClickHouse/pull/7724) ([Artem Zuikov](https://github.com/4ertus2)) +- Añadir `lifetime` columna a `system.dictionaries` tabla. [\#6820](https://github.com/ClickHouse/ClickHouse/issues/6820) [\#7727](https://github.com/ClickHouse/ClickHouse/pull/7727) ([kekekekule](https://github.com/kekekekule)) +- Comprobación mejorada de piezas existentes en diferentes discos para `*MergeTree` motores de mesa. Dirección [\#7660](https://github.com/ClickHouse/ClickHouse/issues/7660). [\#8440](https://github.com/ClickHouse/ClickHouse/pull/8440) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Integración con `AWS SDK` para `S3` interacciones que permite utilizar todas las características de S3 fuera de la caja. [\#8011](https://github.com/ClickHouse/ClickHouse/pull/8011) ([Pavel Kovalenko](https://github.com/Jokser)) +- Se agregó soporte para subconsultas en `Live View` tabla. [\#7792](https://github.com/ClickHouse/ClickHouse/pull/7792) ([vzakaznikov](https://github.com/vzakaznikov)) +- Compruebe si el uso `Date` o `DateTime` columna de `TTL` expresiones se eliminó. [\#7920](https://github.com/ClickHouse/ClickHouse/pull/7920) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Se agregó información sobre el disco a `system.detached_parts` tabla. [\#7833](https://github.com/ClickHouse/ClickHouse/pull/7833) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Ahora configuración `max_(table|partition)_size_to_drop` se puede cambiar sin reiniciar. [\#7779](https://github.com/ClickHouse/ClickHouse/pull/7779) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +- Ligeramente mejor usabilidad de los mensajes de error. Pida al usuario que no elimine las siguientes líneas `Stack trace:`. [\#7897](https://github.com/ClickHouse/ClickHouse/pull/7897) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejor lectura de mensajes de `Kafka` motor en varios formatos después de [\#7935](https://github.com/ClickHouse/ClickHouse/issues/7935). [\#8035](https://github.com/ClickHouse/ClickHouse/pull/8035) ([Ivan](https://github.com/abyss7)) +- Mejor compatibilidad con clientes MySQL que no admiten `sha2_password` complemento auth. [\#8036](https://github.com/ClickHouse/ClickHouse/pull/8036) ([Yuriy Baranov](https://github.com/yurriy)) +- Soporta más tipos de columnas en el servidor de compatibilidad MySQL. [\#7975](https://github.com/ClickHouse/ClickHouse/pull/7975) ([Yuriy Baranov](https://github.com/yurriy)) +- Implementar `ORDER BY` optimización para `Merge`, `Buffer` y `Materilized View` almacenamientos con subyacente `MergeTree` tabla. [\#8130](https://github.com/ClickHouse/ClickHouse/pull/8130) ([Anton Popov](https://github.com/CurtizJ)) +- Ahora siempre usamos la implementación POSIX de `getrandom` para tener una mejor compatibilidad con los núcleos antiguos (\<3.17). [\#7940](https://github.com/ClickHouse/ClickHouse/pull/7940) ([Amos pájaro](https://github.com/amosbird)) +- Es mejor comprobar si hay un destino válido en una regla TTL de movimiento. [\#8410](https://github.com/ClickHouse/ClickHouse/pull/8410) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Mejores controles de lotes de inserción rotos para `Distributed` motor de mesa. [\#7933](https://github.com/ClickHouse/ClickHouse/pull/7933) ([Azat Khuzhin](https://github.com/azat)) +- Agregue una columna con una matriz de nombres de partes para qué mutaciones deben procesar en el futuro `system.mutations` tabla. [\#8179](https://github.com/ClickHouse/ClickHouse/pull/8179) ([alesapin](https://github.com/alesapin)) +- Optimización de ordenación de combinación paralela para procesadores. [\#8552](https://github.com/ClickHouse/ClickHouse/pull/8552) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Configuración `mark_cache_min_lifetime` ahora está obsoleto y no hace nada. En versiones anteriores, la caché de marcas puede crecer en la memoria más grande que `mark_cache_size` para acomodar datos dentro de `mark_cache_min_lifetime` segundo. Eso provocó confusión y un mayor uso de memoria de lo esperado, lo que es especialmente malo en los sistemas con restricciones de memoria. Si observa una degradación del rendimiento después de instalar esta versión, debe aumentar la `mark_cache_size`. [\#8484](https://github.com/ClickHouse/ClickHouse/pull/8484) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Preparación para usar `tid` doquier. Esto es necesario para [\#7477](https://github.com/ClickHouse/ClickHouse/issues/7477). [\#8276](https://github.com/ClickHouse/ClickHouse/pull/8276) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### Mejora del rendimiento {#performance-improvement-1} + +- Optimizaciones de rendimiento en la canalización de procesadores. [\#7988](https://github.com/ClickHouse/ClickHouse/pull/7988) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Actualizaciones sin bloqueo de claves caducadas en diccionarios de caché (con permiso para leer las antiguas). [\#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Compilar ClickHouse sin `-fno-omit-frame-pointer` a nivel mundial para ahorrar un registro más. [\#8097](https://github.com/ClickHouse/ClickHouse/pull/8097) ([Amos pájaro](https://github.com/amosbird)) +- Aceleración `greatCircleDistance` función y añadir pruebas de rendimiento para ello. [\#7307](https://github.com/ClickHouse/ClickHouse/pull/7307) ([Olga Khvostikova](https://github.com/stavrolia)) +- Rendimiento mejorado de la función `roundDown`. [\#8465](https://github.com/ClickHouse/ClickHouse/pull/8465) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Rendimiento mejorado de `max`, `min`, `argMin`, `argMax` para `DateTime64` tipo de datos. [\#8199](https://github.com/ClickHouse/ClickHouse/pull/8199) ([Vasily Nemkov](https://github.com/Enmk)) +- Rendimiento mejorado de la clasificación sin límite o con límite grande y clasificación externa. [\#8545](https://github.com/ClickHouse/ClickHouse/pull/8545) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Rendimiento mejorado de formatear números de coma flotante hasta 6 veces. [\#8542](https://github.com/ClickHouse/ClickHouse/pull/8542) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Rendimiento mejorado de `modulo` función. [\#7750](https://github.com/ClickHouse/ClickHouse/pull/7750) ([Amos pájaro](https://github.com/amosbird)) +- Optimizar `ORDER BY` y fusionándose con la clave de una sola columna. [\#8335](https://github.com/ClickHouse/ClickHouse/pull/8335) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Mejor implementación para `arrayReduce`, `-Array` y `-State` combinadores. [\#7710](https://github.com/ClickHouse/ClickHouse/pull/7710) ([Amos pájaro](https://github.com/amosbird)) +- Ahora `PREWHERE` debe ser optimizado para ser al menos tan eficiente como `WHERE`. [\#7769](https://github.com/ClickHouse/ClickHouse/pull/7769) ([Amos pájaro](https://github.com/amosbird)) +- Mejorar el camino `round` y `roundBankers` manejo de números negativos. [\#8229](https://github.com/ClickHouse/ClickHouse/pull/8229) ([Hcz](https://github.com/hczhcz)) +- Rendimiento de decodificación mejorado de `DoubleDelta` y `Gorilla` códecs en aproximadamente un 30-40%. Esto corrige [\#7082](https://github.com/ClickHouse/ClickHouse/issues/7082). [\#8019](https://github.com/ClickHouse/ClickHouse/pull/8019) ([Vasily Nemkov](https://github.com/Enmk)) +- Rendimiento mejorado de `base64` funciones relacionadas. [\#8444](https://github.com/ClickHouse/ClickHouse/pull/8444) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se agregó una función `geoDistance`. Es similar a `greatCircleDistance` pero utiliza la aproximación al modelo elipsoide WGS-84. El rendimiento de ambas funciones son casi iguales. [\#8086](https://github.com/ClickHouse/ClickHouse/pull/8086) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Más rápido `min` y `max` funciones de agregación para `Decimal` tipo de datos. [\#8144](https://github.com/ClickHouse/ClickHouse/pull/8144) ([Artem Zuikov](https://github.com/4ertus2)) +- Vectorizar el procesamiento `arrayReduce`. [\#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos pájaro](https://github.com/amosbird)) +- `if` las cadenas ahora están optimizadas como `multiIf`. [\#8355](https://github.com/ClickHouse/ClickHouse/pull/8355) ([kamalov-ruslan](https://github.com/kamalov-ruslan)) +- Corregir la regresión de rendimiento de `Kafka` motor de mesa introducido en 19.15. Esto corrige [\#7261](https://github.com/ClickHouse/ClickHouse/issues/7261). [\#7935](https://github.com/ClickHouse/ClickHouse/pull/7935) ([filimonov](https://github.com/filimonov)) +- Quitar “pie” generación de código que `gcc` de paquetes Debian trae ocasionalmente por defecto. [\#8483](https://github.com/ClickHouse/ClickHouse/pull/8483) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Formatos de datos de análisis paralelo [\#6553](https://github.com/ClickHouse/ClickHouse/pull/6553) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Habilitar analizador optimizado de `Values` con expresiones por defecto (`input_format_values_deduce_templates_of_expressions=1`). [\#8231](https://github.com/ClickHouse/ClickHouse/pull/8231) ([Tavplubix](https://github.com/tavplubix)) + +### Mejora de la construcción/prueba/empaquetado {#buildtestingpackaging-improvement-1} + +- Construir correcciones para `ARM` y en modo mínimo. [\#8304](https://github.com/ClickHouse/ClickHouse/pull/8304) ([propulsor](https://github.com/proller)) +- Añadir archivo de cobertura al ras para `clickhouse-server` cuando std::atexit no se llama. También mejoró ligeramente el registro en pruebas sin estado con cobertura. [\#8267](https://github.com/ClickHouse/ClickHouse/pull/8267) ([alesapin](https://github.com/alesapin)) +- Actualizar la biblioteca LLVM en contrib. Evite usar LLVM de paquetes de sistema operativo. [\#8258](https://github.com/ClickHouse/ClickHouse/pull/8258) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Hacer incluido `curl` construir totalmente tranquilo. [\#8232](https://github.com/ClickHouse/ClickHouse/pull/8232) [\#8203](https://github.com/ClickHouse/ClickHouse/pull/8203) ([Pavel Kovalenko](https://github.com/Jokser)) +- Arreglar algunos `MemorySanitizer` advertencia. [\#8235](https://github.com/ClickHouse/ClickHouse/pull/8235) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Utilizar `add_warning` y `no_warning` macros en `CMakeLists.txt`. [\#8604](https://github.com/ClickHouse/ClickHouse/pull/8604) ([Ivan](https://github.com/abyss7)) +- Agregue soporte del objeto Compatible Minio S3 (https://min.io/) para mejores pruebas de integración. [\#7863](https://github.com/ClickHouse/ClickHouse/pull/7863) [\#7875](https://github.com/ClickHouse/ClickHouse/pull/7875) ([Pavel Kovalenko](https://github.com/Jokser)) +- Importar `libc` encabezados a contrib. Permite hacer que las compilaciones sean más consistentes en varios sistemas (solo para `x86_64-linux-gnu`). [\#5773](https://github.com/ClickHouse/ClickHouse/pull/5773) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Quitar `-fPIC` de algunas bibliotecas. [\#8464](https://github.com/ClickHouse/ClickHouse/pull/8464) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Limpiar `CMakeLists.txt` para el rizo. Ver https://github.com/ClickHouse/ClickHouse/pull/8011\#issuecomment-569478910 [\#8459](https://github.com/ClickHouse/ClickHouse/pull/8459) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Advertencias silenciosas en `CapNProto` biblioteca. [\#8220](https://github.com/ClickHouse/ClickHouse/pull/8220) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Agregue pruebas de rendimiento para tablas hash optimizadas de cadenas cortas. [\#7679](https://github.com/ClickHouse/ClickHouse/pull/7679) ([Amos pájaro](https://github.com/amosbird)) +- Ahora ClickHouse se basará en `AArch64` aunque `MADV_FREE` no está disponible. Esto corrige [\#8027](https://github.com/ClickHouse/ClickHouse/issues/8027). [\#8243](https://github.com/ClickHouse/ClickHouse/pull/8243) ([Amos pájaro](https://github.com/amosbird)) +- Actualizar `zlib-ng` para solucionar problemas de desinfectante de memoria. [\#7182](https://github.com/ClickHouse/ClickHouse/pull/7182) [\#8206](https://github.com/ClickHouse/ClickHouse/pull/8206) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Habilite la biblioteca MySQL interna en sistemas que no son Linux, porque el uso de paquetes de sistemas operativos es muy frágil y generalmente no funciona en absoluto. Esto corrige [\#5765](https://github.com/ClickHouse/ClickHouse/issues/5765). [\#8426](https://github.com/ClickHouse/ClickHouse/pull/8426) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se corrigió la compilación en algunos sistemas después de habilitar `libc++`. Esto reemplaza [\#8374](https://github.com/ClickHouse/ClickHouse/issues/8374). [\#8380](https://github.com/ClickHouse/ClickHouse/pull/8380) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Hacer `Field` métodos más seguros para encontrar más errores. [\#7386](https://github.com/ClickHouse/ClickHouse/pull/7386) [\#8209](https://github.com/ClickHouse/ClickHouse/pull/8209) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Añadido archivos que faltan a la `libc-headers` submódulo. [\#8507](https://github.com/ClickHouse/ClickHouse/pull/8507) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Arreglar mal `JSON` cita en la salida de prueba de rendimiento. [\#8497](https://github.com/ClickHouse/ClickHouse/pull/8497) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ahora se muestra el seguimiento de pila para `std::exception` y `Poco::Exception`. En versiones anteriores sólo estaba disponible para `DB::Exception`. Esto mejora el diagnóstico. [\#8501](https://github.com/ClickHouse/ClickHouse/pull/8501) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Portabilidad `clock_gettime` y `clock_nanosleep` para versiones glibc frescas. [\#8054](https://github.com/ClickHouse/ClickHouse/pull/8054) ([Amos pájaro](https://github.com/amosbird)) +- Permitir `part_log` en ejemplo config para desarrolladores. [\#8609](https://github.com/ClickHouse/ClickHouse/pull/8609) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Corregir la naturaleza asíncrona de la recarga en `01036_no_superfluous_dict_reload_on_create_database*`. [\#8111](https://github.com/ClickHouse/ClickHouse/pull/8111) ([Azat Khuzhin](https://github.com/azat)) +- Se corrigieron las pruebas de rendimiento del códec. [\#8615](https://github.com/ClickHouse/ClickHouse/pull/8615) ([Vasily Nemkov](https://github.com/Enmk)) +- Agregar scripts de instalación para `.tgz` y documentación para ellos. [\#8612](https://github.com/ClickHouse/ClickHouse/pull/8612) [\#8591](https://github.com/ClickHouse/ClickHouse/pull/8591) ([alesapin](https://github.com/alesapin)) +- Eliminado viejo `ZSTD` prueba (fue creado en el año 2016 para reproducir el error que ha tenido la versión pre 1.0 de ZSTD). Esto corrige [\#8618](https://github.com/ClickHouse/ClickHouse/issues/8618). [\#8619](https://github.com/ClickHouse/ClickHouse/pull/8619) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Estructura fija en Mac OS Catalina. [\#8600](https://github.com/ClickHouse/ClickHouse/pull/8600) ([meo](https://github.com/meob)) +- Mayor número de filas en las pruebas de rendimiento del códec para que los resultados se noten. [\#8574](https://github.com/ClickHouse/ClickHouse/pull/8574) ([Vasily Nemkov](https://github.com/Enmk)) +- En compilaciones de depuración, trate `LOGICAL_ERROR` excepciones como fallas de aserción, por lo que son más fáciles de notar. [\#8475](https://github.com/ClickHouse/ClickHouse/pull/8475) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Haga que la prueba de rendimiento relacionada con los formatos sea más determinista. [\#8477](https://github.com/ClickHouse/ClickHouse/pull/8477) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualizar `lz4` para solucionar un error de MemorySanitizer. [\#8181](https://github.com/ClickHouse/ClickHouse/pull/8181) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Suprima un falso positivo MemorySanitizer conocido en el control de excepciones. [\#8182](https://github.com/ClickHouse/ClickHouse/pull/8182) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Actualizar `gcc` y `g++` a la versión 9 en `build/docker/build.sh` [\#7766](https://github.com/ClickHouse/ClickHouse/pull/7766) ([TLightSky](https://github.com/tlightsky)) +- Agregue un caso de prueba de rendimiento para probar eso `PREWHERE` es peor que `WHERE`. [\#7768](https://github.com/ClickHouse/ClickHouse/pull/7768) ([Amos pájaro](https://github.com/amosbird)) +- Progreso hacia la fijación de una prueba flacky. [\#8621](https://github.com/ClickHouse/ClickHouse/pull/8621) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Evite el informe MemorySanitizer para los datos de `libunwind`. [\#8539](https://github.com/ClickHouse/ClickHouse/pull/8539) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Actualizar `libc++` a la última versión. [\#8324](https://github.com/ClickHouse/ClickHouse/pull/8324) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Construir la biblioteca de la UCI a partir de fuentes. Esto corrige [\#6460](https://github.com/ClickHouse/ClickHouse/issues/6460). [\#8219](https://github.com/ClickHouse/ClickHouse/pull/8219) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cambiado de `libressl` a `openssl`. ClickHouse debe admitir TLS 1.3 y SNI después de este cambio. Esto corrige [\#8171](https://github.com/ClickHouse/ClickHouse/issues/8171). [\#8218](https://github.com/ClickHouse/ClickHouse/pull/8218) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Informe UBSan fijo al usar `chacha20_poly1305` de SSL (sucede al conectarse a https://yandex.ru/). [\#8214](https://github.com/ClickHouse/ClickHouse/pull/8214) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Modo de reparación del archivo de contraseña predeterminado para `.deb` distribuciones de linux. [\#8075](https://github.com/ClickHouse/ClickHouse/pull/8075) ([propulsor](https://github.com/proller)) +- Expresión mejorada para obtener `clickhouse-server` PID en `clickhouse-test`. [\#8063](https://github.com/ClickHouse/ClickHouse/pull/8063) ([Alejandro Kazakov](https://github.com/Akazz)) +- Actualizado contrib / googletest a v1.10.0. [\#8587](https://github.com/ClickHouse/ClickHouse/pull/8587) ([Alejandro Burmak](https://github.com/Alex-Burmak)) +- Informe de ThreadSaninitizer fijo en `base64` biblioteca. También actualizó esta biblioteca a la última versión, pero no importa. Esto corrige [\#8397](https://github.com/ClickHouse/ClickHouse/issues/8397). [\#8403](https://github.com/ClickHouse/ClickHouse/pull/8403) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fijar `00600_replace_running_query` para procesadores. [\#8272](https://github.com/ClickHouse/ClickHouse/pull/8272) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Eliminar soporte para `tcmalloc` hacer `CMakeLists.txt` más simple. [\#8310](https://github.com/ClickHouse/ClickHouse/pull/8310) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Lanzamiento gcc construye ahora uso `libc++` en lugar de `libstdc++`. Recientemente `libc++` fue utilizado sólo con clang. Esto mejorará la coherencia de las configuraciones de compilación y la portabilidad. [\#8311](https://github.com/ClickHouse/ClickHouse/pull/8311) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Habilite la biblioteca de ICU para compilar con MemorySanitizer. [\#8222](https://github.com/ClickHouse/ClickHouse/pull/8222) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Suprimir advertencias de `CapNProto` biblioteca. [\#8224](https://github.com/ClickHouse/ClickHouse/pull/8224) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Se eliminaron casos especiales de código para `tcmalloc`, porque ya no es compatible. [\#8225](https://github.com/ClickHouse/ClickHouse/pull/8225) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- En la tarea de cobertura de CI, elimine el servidor con elegancia para permitirle guardar el informe de cobertura. Esto corrige los informes de cobertura incompletos que hemos estado viendo últimamente. [\#8142](https://github.com/ClickHouse/ClickHouse/pull/8142) ([alesapin](https://github.com/alesapin)) +- Pruebas de rendimiento para todos los códecs contra `Float64` y `UInt64` valor. [\#8349](https://github.com/ClickHouse/ClickHouse/pull/8349) ([Vasily Nemkov](https://github.com/Enmk)) +- `termcap` está muy en desuso y conduce a varios problemas (por ejemplo, falta “up” tapa y eco `^J` en lugar de la línea multi). Favor `terminfo` o empaquetado `ncurses`. [\#7737](https://github.com/ClickHouse/ClickHouse/pull/7737) ([Amos pájaro](https://github.com/amosbird)) +- Fijar `test_storage_s3` prueba de integración. [\#7734](https://github.com/ClickHouse/ClickHouse/pull/7734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Apoyo `StorageFile(, null)` para insertar el bloque en el archivo de formato dado sin realmente escribir en el disco. Esto es necesario para las pruebas de rendimiento. [\#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos pájaro](https://github.com/amosbird)) +- Argumento añadido `--print-time` a las pruebas funcionales que imprime el tiempo de ejecución por prueba. [\#8001](https://github.com/ClickHouse/ClickHouse/pull/8001) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Se agregaron afirmaciones a `KeyCondition` mientras evalúa RPN. Esto arreglará la advertencia de gcc-9. [\#8279](https://github.com/ClickHouse/ClickHouse/pull/8279) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Opciones de volcado cmake en compilaciones de CI. [\#8273](https://github.com/ClickHouse/ClickHouse/pull/8273) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- No genere información de depuración para algunas bibliotecas de grasa. [\#8271](https://github.com/ClickHouse/ClickHouse/pull/8271) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Hacer `log_to_console.xml` siempre inicie sesión en stderr, independientemente de si es interactivo o no. [\#8395](https://github.com/ClickHouse/ClickHouse/pull/8395) ([Alejandro Kuzmenkov](https://github.com/akuzm)) +- Se eliminaron algunas características no utilizadas de `clickhouse-performance-test` herramienta. [\#8555](https://github.com/ClickHouse/ClickHouse/pull/8555) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Ahora también buscaremos `lld-X` con la correspondiente `clang-X` versión. [\#8092](https://github.com/ClickHouse/ClickHouse/pull/8092) ([alesapin](https://github.com/alesapin)) +- Parquet construir mejora. [\#8421](https://github.com/ClickHouse/ClickHouse/pull/8421) ([Más información](https://github.com/maxulan)) +- Más advertencias de GCC [\#8221](https://github.com/ClickHouse/ClickHouse/pull/8221) ([Método de codificación de datos:](https://github.com/kreuzerkrieg)) +- Paquete para Arch Linux ahora permite ejecutar el servidor ClickHouse, y no sólo el cliente. [\#8534](https://github.com/ClickHouse/ClickHouse/pull/8534) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Prueba de reparación con procesadores. Pequeñas correcciones de rendimiento. [\#7672](https://github.com/ClickHouse/ClickHouse/pull/7672) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Actualizar contrib/protobuf. [\#8256](https://github.com/ClickHouse/ClickHouse/pull/8256) ([Matwey V. Kornilov](https://github.com/matwey)) +- En preparación para cambiar a c ++ 20 como una celebración de año nuevo. “May the C++ force be with ClickHouse.” [\#8447](https://github.com/ClickHouse/ClickHouse/pull/8447) ([Amos pájaro](https://github.com/amosbird)) + +### Característica Experimental {#experimental-feature-1} + +- Añadido ajuste experimental `min_bytes_to_use_mmap_io`. Permite leer archivos grandes sin copiar datos del kernel al espacio de usuario. La configuración está deshabilitada de forma predeterminada. El umbral recomendado es de aproximadamente 64 MB, porque mmap / munmap es lento. [\#8520](https://github.com/ClickHouse/ClickHouse/pull/8520) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cuotas reanudadas como parte del sistema de control de acceso. Añadido nueva tabla `system.quotas`, nuevas funciones `currentQuota`, `currentQuotaKey`, nueva sintaxis SQL `CREATE QUOTA`, `ALTER QUOTA`, `DROP QUOTA`, `SHOW QUOTA`. [\#7257](https://github.com/ClickHouse/ClickHouse/pull/7257) ([Vitaly Baranov](https://github.com/vitlibar)) +- Permitir omitir configuraciones desconocidas con advertencias en lugar de lanzar excepciones. [\#7653](https://github.com/ClickHouse/ClickHouse/pull/7653) ([Vitaly Baranov](https://github.com/vitlibar)) +- Se reanudaron las políticas de fila como parte del sistema de control de acceso. Añadido nueva tabla `system.row_policies`, nueva función `currentRowPolicies()`, nueva sintaxis SQL `CREATE POLICY`, `ALTER POLICY`, `DROP POLICY`, `SHOW CREATE POLICY`, `SHOW POLICIES`. [\#7808](https://github.com/ClickHouse/ClickHouse/pull/7808) ([Vitaly Baranov](https://github.com/vitlibar)) + +### Corrección de seguridad {#security-fix} + +- Se corrigió la posibilidad de leer la estructura de directorios en tablas con `File` motor de mesa. Esto corrige [\#8536](https://github.com/ClickHouse/ClickHouse/issues/8536). [\#8537](https://github.com/ClickHouse/ClickHouse/pull/8537) ([alexey-milovidov](https://github.com/alexey-milovidov)) diff --git a/docs/es/commercial/cloud.md b/docs/es/commercial/cloud.md index ee6a45fc851..f77f536341f 100644 --- a/docs/es/commercial/cloud.md +++ b/docs/es/commercial/cloud.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Proveedores de servicios en la nube de ClickHouse {#clickhouse-cloud-service-providers} !!! info "INFO" diff --git a/docs/es/data_types/array.md b/docs/es/data_types/array.md index 1650ab461b1..bd6fd4f65a7 100644 --- a/docs/es/data_types/array.md +++ b/docs/es/data_types/array.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Matriz (T) {#data-type-array} Matriz de `T`-tipo de artículos. diff --git a/docs/es/data_types/boolean.md b/docs/es/data_types/boolean.md index 3a49cbd7658..7f7d839dcdb 100644 --- a/docs/es/data_types/boolean.md +++ b/docs/es/data_types/boolean.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Valores booleanos {#boolean-values} No hay un tipo separado para los valores booleanos. Utilice el tipo UInt8, restringido a los valores 0 o 1. diff --git a/docs/es/data_types/date.md b/docs/es/data_types/date.md index 78d265ab604..3a4f5cfb5d9 100644 --- a/docs/es/data_types/date.md +++ b/docs/es/data_types/date.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Fecha {#date} Fecha. Almacenado en dos bytes como el número de días desde 1970-01-01 (sin signo). Permite almacenar valores desde justo después del comienzo de la Época Unix hasta el umbral superior definido por una constante en la etapa de compilación (actualmente, esto es hasta el año 2106, pero el último año totalmente soportado es 2105). diff --git a/docs/es/data_types/datetime.md b/docs/es/data_types/datetime.md index ab91a510cba..0f8e35634ca 100644 --- a/docs/es/data_types/datetime.md +++ b/docs/es/data_types/datetime.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # FechaHora {#data_type-datetime} Permite almacenar un instante en el tiempo, que se puede expresar como una fecha del calendario y una hora de un día. diff --git a/docs/es/data_types/datetime64.md b/docs/es/data_types/datetime64.md index 444a6357b07..e9a5245b146 100644 --- a/docs/es/data_types/datetime64.md +++ b/docs/es/data_types/datetime64.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # DateTime64 {#data_type-datetime64} Permite almacenar un instante en el tiempo, que se puede expresar como una fecha de calendario y una hora de un día, con una precisión de subsegundo definida diff --git a/docs/es/data_types/decimal.md b/docs/es/data_types/decimal.md index 2a355ed79a9..9e84975443e 100644 --- a/docs/es/data_types/decimal.md +++ b/docs/es/data_types/decimal.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S) {#decimalp-s-decimal32s-decimal64s-decimal128s} Números de punto fijo firmados que mantienen la precisión durante las operaciones de suma, resta y multiplicación. Para la división se descartan los dígitos menos significativos (no redondeados). diff --git a/docs/es/data_types/domains/ipv4.md b/docs/es/data_types/domains/ipv4.md index b2f56b15659..9e3dcbd5167 100644 --- a/docs/es/data_types/domains/ipv4.md +++ b/docs/es/data_types/domains/ipv4.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + ## IPv4 {#ipv4} `IPv4` es un dominio basado en `UInt32` tipo y sirve como reemplazo tipo para almacenar valores IPv4. Proporciona un almacenamiento compacto con un formato de entrada-salida amigable para los humanos e información de tipo de columna sobre la inspección. diff --git a/docs/es/data_types/domains/ipv6.md b/docs/es/data_types/domains/ipv6.md index f385774ee04..fa9bd746b30 100644 --- a/docs/es/data_types/domains/ipv6.md +++ b/docs/es/data_types/domains/ipv6.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + ## IPv6 {#ipv6} `IPv6` es un dominio basado en `FixedString(16)` tipo y sirve como reemplazo tipo para almacenar valores IPv6. Proporciona un almacenamiento compacto con un formato de entrada-salida amigable para los humanos e información de tipo de columna sobre la inspección. diff --git a/docs/es/data_types/domains/overview.md b/docs/es/data_types/domains/overview.md index 378b7b02997..2d662c4f62f 100644 --- a/docs/es/data_types/domains/overview.md +++ b/docs/es/data_types/domains/overview.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Dominio {#domains} Los dominios son tipos de propósito especial, que agregan algunas características adicionales encima del tipo base existente, dejando intacto el formato en cable y en disco de la tabla subyacente. Por el momento, ClickHouse no admite dominios definidos por el usuario. diff --git a/docs/es/data_types/enum.md b/docs/es/data_types/enum.md index 2c66fa20d31..dd6ff216a52 100644 --- a/docs/es/data_types/enum.md +++ b/docs/es/data_types/enum.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Enum {#enum} Tipo enumerado que consta de valores con nombre. diff --git a/docs/es/data_types/fixedstring.md b/docs/es/data_types/fixedstring.md index 7e02cf6eb48..51aa56239a5 100644 --- a/docs/es/data_types/fixedstring.md +++ b/docs/es/data_types/fixedstring.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cadena fija {#fixedstring} Una cadena de longitud fija de `N` bytes (ni caracteres ni puntos de código). diff --git a/docs/es/data_types/float.md b/docs/es/data_types/float.md index 58a42f8b56a..7ce233b612b 100644 --- a/docs/es/data_types/float.md +++ b/docs/es/data_types/float.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Descripción del producto {#float32-float64} [Números de punto flotante](https://en.wikipedia.org/wiki/IEEE_754). diff --git a/docs/es/data_types/index.md b/docs/es/data_types/index.md index 8df6bea6314..f787476f864 100644 --- a/docs/es/data_types/index.md +++ b/docs/es/data_types/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Tipos de datos {#data_types} ClickHouse puede almacenar varios tipos de datos en celdas de tabla. diff --git a/docs/es/data_types/int_uint.md b/docs/es/data_types/int_uint.md index 949b490fc99..ee64697f2ef 100644 --- a/docs/es/data_types/int_uint.md +++ b/docs/es/data_types/int_uint.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64 {#uint8-uint16-uint32-uint64-int8-int16-int32-int64} Enteros de longitud fija, con o sin signo. diff --git a/docs/es/data_types/nested_data_structures/aggregatefunction.md b/docs/es/data_types/nested_data_structures/aggregatefunction.md index 9c496b8ec1e..a5e2214853e 100644 --- a/docs/es/data_types/nested_data_structures/aggregatefunction.md +++ b/docs/es/data_types/nested_data_structures/aggregatefunction.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # AggregateFunction(name, types\_of\_arguments…) {#data-type-aggregatefunction} El estado intermedio de una función agregada. Para obtenerlo, use funciones agregadas con el `-State` sufijo. Para obtener datos agregados en el futuro, debe utilizar las mismas funciones agregadas con el `-Merge`sufijo. diff --git a/docs/es/data_types/nested_data_structures/index.md b/docs/es/data_types/nested_data_structures/index.md index dac0e7417c4..9e5e2ad5444 100644 --- a/docs/es/data_types/nested_data_structures/index.md +++ b/docs/es/data_types/nested_data_structures/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Estructuras de datos anidados {#nested-data-structures} [Artículo Original](https://clickhouse.tech/docs/es/data_types/nested_data_structures/) diff --git a/docs/es/data_types/nested_data_structures/nested.md b/docs/es/data_types/nested_data_structures/nested.md index 1ea1e777ade..b316a29584b 100644 --- a/docs/es/data_types/nested_data_structures/nested.md +++ b/docs/es/data_types/nested_data_structures/nested.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Nested(Name1 Type1, Name2 Type2, …) {#nestedname1-type1-name2-type2} A nested data structure is like a nested table. The parameters of a nested data structure – the column names and types – are specified the same way as in a CREATE query. Each table row can correspond to any number of rows in a nested data structure. diff --git a/docs/es/data_types/nullable.md b/docs/es/data_types/nullable.md index 327bb9d335a..9208ff90713 100644 --- a/docs/es/data_types/nullable.md +++ b/docs/es/data_types/nullable.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Nombre de tipo) {#data_type-nullable} Permite almacenar marcador especial ([NULO](../query_language/syntax.md)) que denota “missing value” con los valores normales permitidos por `TypeName`. Por ejemplo, un `Nullable(Int8)` Tipo columna puede almacenar `Int8` valores de tipo, y las filas que no tienen un valor almacenarán `NULL`. diff --git a/docs/es/data_types/special_data_types/expression.md b/docs/es/data_types/special_data_types/expression.md index c1da3d79455..bfdbf3ed0b1 100644 --- a/docs/es/data_types/special_data_types/expression.md +++ b/docs/es/data_types/special_data_types/expression.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Expresion {#expression} Se utiliza para representar expresiones lambda en funciones de orden superior. diff --git a/docs/es/data_types/special_data_types/index.md b/docs/es/data_types/special_data_types/index.md index 8c02cb2b23f..5915b7b3d86 100644 --- a/docs/es/data_types/special_data_types/index.md +++ b/docs/es/data_types/special_data_types/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Tipos de datos especiales {#special-data-types} Special data type values can’t be saved to a table or output in results, but can be used as the intermediate result when running a query. diff --git a/docs/es/data_types/special_data_types/interval.md b/docs/es/data_types/special_data_types/interval.md index a95bbacbd8b..099b3d064a5 100644 --- a/docs/es/data_types/special_data_types/interval.md +++ b/docs/es/data_types/special_data_types/interval.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Intervalo {#data-type-interval} La familia de tipos de datos que representan intervalos de fecha y hora. Los tipos resultantes del [INTERVALO](../../query_language/operators.md#operator-interval) operador. diff --git a/docs/es/data_types/special_data_types/nothing.md b/docs/es/data_types/special_data_types/nothing.md index 6f6c8e5f310..2f8b44e2c79 100644 --- a/docs/es/data_types/special_data_types/nothing.md +++ b/docs/es/data_types/special_data_types/nothing.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Nada {#nothing} El único propósito de este tipo de datos es representar casos en los que no se espera un valor. Entonces no puedes crear un `Nothing` valor de tipo. diff --git a/docs/es/data_types/special_data_types/set.md b/docs/es/data_types/special_data_types/set.md index 2e3112813f6..5557b20dde2 100644 --- a/docs/es/data_types/special_data_types/set.md +++ b/docs/es/data_types/special_data_types/set.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Establecer {#set} Utilizado para la mitad derecha de un [ES](../../query_language/select.md#select-in-operators) expresión. diff --git a/docs/es/data_types/string.md b/docs/es/data_types/string.md index e86e8fbdab7..238de32fa22 100644 --- a/docs/es/data_types/string.md +++ b/docs/es/data_types/string.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cadena {#string} Cuerdas de una longitud arbitraria. La longitud no está limitada. El valor puede contener un conjunto arbitrario de bytes, incluidos los bytes nulos. diff --git a/docs/es/data_types/tuple.md b/docs/es/data_types/tuple.md index 41121c4481c..68af5e5a77d 100644 --- a/docs/es/data_types/tuple.md +++ b/docs/es/data_types/tuple.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Tuple (T1, T2, …) {#tuplet1-t2} Una tupla de elementos, cada uno con un individuo [Tipo](index.md#data_types). diff --git a/docs/es/data_types/uuid.md b/docs/es/data_types/uuid.md index a847bb82eb6..1c1910edbf1 100644 --- a/docs/es/data_types/uuid.md +++ b/docs/es/data_types/uuid.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # UUID {#uuid-data-type} Un identificador único universal (UUID) es un número de 16 bytes utilizado para identificar registros. Para obtener información detallada sobre el UUID, consulte [Wikipedia](https://en.wikipedia.org/wiki/Universally_unique_identifier). diff --git a/docs/es/database_engines/index.md b/docs/es/database_engines/index.md index 635f19d7d66..55ae226a20d 100644 --- a/docs/es/database_engines/index.md +++ b/docs/es/database_engines/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Motores de base de datos {#database-engines} Los motores de bases de datos le permiten trabajar con tablas. diff --git a/docs/es/database_engines/lazy.md b/docs/es/database_engines/lazy.md index 4a39ad2cc8c..95f69695112 100644 --- a/docs/es/database_engines/lazy.md +++ b/docs/es/database_engines/lazy.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Perezoso {#lazy} Mantiene las tablas en RAM solamente `expiration_time_in_seconds` segundos después del último acceso. Solo se puede usar con tablas \*Log. diff --git a/docs/es/database_engines/mysql.md b/docs/es/database_engines/mysql.md index 9d61b8828ee..927eae65b77 100644 --- a/docs/es/database_engines/mysql.md +++ b/docs/es/database_engines/mysql.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # MySQL {#mysql} Permite conectarse a bases de datos en un servidor MySQL remoto y realizar `INSERT` y `SELECT` Consultas para intercambiar datos entre ClickHouse y MySQL. diff --git a/docs/es/development/architecture.md b/docs/es/development/architecture.md index a68ba02ab00..a6f41493f26 100644 --- a/docs/es/development/architecture.md +++ b/docs/es/development/architecture.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Descripción general de la arquitectura ClickHouse {#overview-of-clickhouse-architecture} ClickHouse es un verdadero DBMS orientado a columnas. Los datos se almacenan por columnas y durante la ejecución de matrices (vectores o fragmentos de columnas). Siempre que sea posible, las operaciones se envían en matrices, en lugar de en valores individuales. Esto se llama “vectorized query execution,” y ayuda a reducir el costo del procesamiento de datos real. diff --git a/docs/es/development/browse_code.md b/docs/es/development/browse_code.md index f292f0edf06..d3d4e54f264 100644 --- a/docs/es/development/browse_code.md +++ b/docs/es/development/browse_code.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Examinar el código fuente de ClickHouse {#browse-clickhouse-source-code} Usted puede utilizar **Woboq** navegador de código en línea disponible [aqui](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html). Proporciona navegación de código y resaltado semántico, búsqueda e indexación. La instantánea de código se actualiza diariamente. diff --git a/docs/es/development/build.md b/docs/es/development/build.md index 8ae379338a9..9e4ab7628f2 100644 --- a/docs/es/development/build.md +++ b/docs/es/development/build.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cómo construir ClickHouse para el desarrollo {#how-to-build-clickhouse-for-development} El siguiente tutorial se basa en el sistema Ubuntu Linux. diff --git a/docs/es/development/build_cross_arm.md b/docs/es/development/build_cross_arm.md index c09fd0bc151..c7e8da0d864 100644 --- a/docs/es/development/build_cross_arm.md +++ b/docs/es/development/build_cross_arm.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cómo construir ClickHouse en Linux para la arquitectura AARCH64 (ARM64 {#how-to-build-clickhouse-on-linux-for-aarch64-arm64-architecture} Esto es para el caso cuando tiene una máquina Linux y desea usarla para compilar `clickhouse` binario que se ejecutará en otra máquina Linux con arquitectura de CPU AARCH64. Esto está destinado a las comprobaciones de integración continua que se ejecutan en servidores Linux. diff --git a/docs/es/development/build_cross_osx.md b/docs/es/development/build_cross_osx.md index 062a049bd53..584b28caac7 100644 --- a/docs/es/development/build_cross_osx.md +++ b/docs/es/development/build_cross_osx.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cómo construir ClickHouse en Linux para Mac OS X {#how-to-build-clickhouse-on-linux-for-mac-os-x} Esto es para el caso cuando tiene una máquina Linux y desea usarla para compilar `clickhouse` Esto está destinado a las comprobaciones de integración continuas que se ejecutan en servidores Linux. Si desea crear ClickHouse directamente en Mac OS X, continúe con [otra instrucción](build_osx.md). diff --git a/docs/es/development/build_osx.md b/docs/es/development/build_osx.md index 653046fc221..d311411930e 100644 --- a/docs/es/development/build_osx.md +++ b/docs/es/development/build_osx.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cómo crear ClickHouse en Mac OS X {#how-to-build-clickhouse-on-mac-os-x} Build debería funcionar en Mac OS X 10.15 (Catalina) diff --git a/docs/es/development/contrib.md b/docs/es/development/contrib.md index 456a38fc1ca..d15168b93dd 100644 --- a/docs/es/development/contrib.md +++ b/docs/es/development/contrib.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Bibliotecas de terceros utilizadas {#third-party-libraries-used} | Biblioteca | Licencia | diff --git a/docs/es/development/developer_instruction.md b/docs/es/development/developer_instruction.md index 17fc8bb7d90..62d22eecb9e 100644 --- a/docs/es/development/developer_instruction.md +++ b/docs/es/development/developer_instruction.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + La construcción de ClickHouse es compatible con Linux, FreeBSD y Mac OS X. # Si utiliza Windows {#if-you-use-windows} diff --git a/docs/es/development/index.md b/docs/es/development/index.md index c7d13caf3cd..a905fc295b9 100644 --- a/docs/es/development/index.md +++ b/docs/es/development/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Desarrollo de ClickHouse {#clickhouse-development} [Artículo Original](https://clickhouse.tech/docs/es/development/) diff --git a/docs/es/development/style.md b/docs/es/development/style.md index 207ebe65f13..2ba57bc0f63 100644 --- a/docs/es/development/style.md +++ b/docs/es/development/style.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cómo escribir código C ++ {#how-to-write-c-code} ## Recomendaciones generales {#general-recommendations} diff --git a/docs/es/development/tests.md b/docs/es/development/tests.md index 9682682a9df..1cfd6d253c0 100644 --- a/docs/es/development/tests.md +++ b/docs/es/development/tests.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Pruebas de ClickHouse {#clickhouse-testing} ## Pruebas funcionales {#functional-tests} diff --git a/docs/es/faq/general.md b/docs/es/faq/general.md index 580ae7d1241..351b0f18ec0 100644 --- a/docs/es/faq/general.md +++ b/docs/es/faq/general.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Preguntas generales {#general-questions} ## ¿Por qué no usar algo como MapReduce? {#why-not-use-something-like-mapreduce} diff --git a/docs/es/getting_started/example_datasets/amplab_benchmark.md b/docs/es/getting_started/example_datasets/amplab_benchmark.md index 45dc417ae46..b59d3ff923d 100644 --- a/docs/es/getting_started/example_datasets/amplab_benchmark.md +++ b/docs/es/getting_started/example_datasets/amplab_benchmark.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Referencia de Big Data de AMPLab {#amplab-big-data-benchmark} Ver https://amplab.cs.berkeley.edu/benchmark/ diff --git a/docs/es/getting_started/example_datasets/criteo.md b/docs/es/getting_started/example_datasets/criteo.md index 89922f00679..37f4a5589b6 100644 --- a/docs/es/getting_started/example_datasets/criteo.md +++ b/docs/es/getting_started/example_datasets/criteo.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Terabyte de registros de clics de Criteo {#terabyte-of-click-logs-from-criteo} Descargue los datos de http://labs.criteo.com/downloads/download-terabyte-click-logs/ diff --git a/docs/es/getting_started/example_datasets/index.md b/docs/es/getting_started/example_datasets/index.md new file mode 120000 index 00000000000..c891314f915 --- /dev/null +++ b/docs/es/getting_started/example_datasets/index.md @@ -0,0 +1 @@ +../../../en/getting_started/example_datasets/index.md \ No newline at end of file diff --git a/docs/es/getting_started/example_datasets/metrica.md b/docs/es/getting_started/example_datasets/metrica.md index 187d0724862..d5d8067333c 100644 --- a/docs/es/getting_started/example_datasets/metrica.md +++ b/docs/es/getting_started/example_datasets/metrica.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Yandex anonimizado.Metrica Datos {#anonymized-yandex-metrica-data} El conjunto de datos consta de dos tablas que contienen datos anónimos sobre los hits (`hits_v1`) y visitas (`visits_v1`) el Yandex.Métrica. Puedes leer más sobre Yandex.Metrica en [Historial de ClickHouse](../../introduction/history.md) apartado. diff --git a/docs/es/getting_started/example_datasets/nyc_taxi.md b/docs/es/getting_started/example_datasets/nyc_taxi.md index 9d2499e2f42..a0fa9ba13cf 100644 --- a/docs/es/getting_started/example_datasets/nyc_taxi.md +++ b/docs/es/getting_started/example_datasets/nyc_taxi.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Datos de taxis de Nueva York {#new-york-taxi-data} Este conjunto de datos se puede obtener de dos maneras: diff --git a/docs/es/getting_started/example_datasets/ontime.md b/docs/es/getting_started/example_datasets/ontime.md index a3d22cf747a..671132dbed5 100644 --- a/docs/es/getting_started/example_datasets/ontime.md +++ b/docs/es/getting_started/example_datasets/ontime.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Un tiempo {#ontime} Este conjunto de datos se puede obtener de dos maneras: diff --git a/docs/es/getting_started/example_datasets/star_schema.md b/docs/es/getting_started/example_datasets/star_schema.md index 45a2d1a76e9..88339d02c6f 100644 --- a/docs/es/getting_started/example_datasets/star_schema.md +++ b/docs/es/getting_started/example_datasets/star_schema.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Estrella Schema Benchmark {#star-schema-benchmark} Compilación de dbgen: diff --git a/docs/es/getting_started/example_datasets/wikistat.md b/docs/es/getting_started/example_datasets/wikistat.md index 92ecf267a7b..c905dc9f742 100644 --- a/docs/es/getting_started/example_datasets/wikistat.md +++ b/docs/es/getting_started/example_datasets/wikistat.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Nombre de la red inalámbrica (SSID): {#wikistat} Ver: http://dumps.wikimedia.org/other/pagecounts-raw/ diff --git a/docs/es/getting_started/index.md b/docs/es/getting_started/index.md index 54db5af4ebf..11bc13f2bc6 100644 --- a/docs/es/getting_started/index.md +++ b/docs/es/getting_started/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Primeros pasos {#getting-started} Si eres nuevo en ClickHouse y quieres tener una sensación práctica de su rendimiento, antes que nada, debes pasar por el [proceso de instalación](install.md). Después de eso puedes: diff --git a/docs/es/getting_started/install.md b/docs/es/getting_started/install.md index 1b93e4ac93e..014afc99ce5 100644 --- a/docs/es/getting_started/install.md +++ b/docs/es/getting_started/install.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Instalación {#installation} ## Requisitos del sistema {#system-requirements} diff --git a/docs/es/getting_started/playground.md b/docs/es/getting_started/playground.md new file mode 120000 index 00000000000..de5b41f453e --- /dev/null +++ b/docs/es/getting_started/playground.md @@ -0,0 +1 @@ +../../en/getting_started/playground.md \ No newline at end of file diff --git a/docs/es/getting_started/tutorial.md b/docs/es/getting_started/tutorial.md index 28c31cc1214..3516b70ee8c 100644 --- a/docs/es/getting_started/tutorial.md +++ b/docs/es/getting_started/tutorial.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Tutorial de ClickHouse {#clickhouse-tutorial} ## Qué Esperar de Este Tutorial? {#what-to-expect-from-this-tutorial} diff --git a/docs/es/guides/apply_catboost_model.md b/docs/es/guides/apply_catboost_model.md index aa717e53da6..7c0e2677c82 100644 --- a/docs/es/guides/apply_catboost_model.md +++ b/docs/es/guides/apply_catboost_model.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Aplicación de un modelo Catboost en ClickHouse {#applying-catboost-model-in-clickhouse} [CatBoost](https://catboost.ai) es una biblioteca de impulso de gradiente libre y de código abierto desarrollada en [Yandex](https://yandex.com/company/) para el aprendizaje automático. diff --git a/docs/es/guides/index.md b/docs/es/guides/index.md index 953251d1b17..178e9562ab9 100644 --- a/docs/es/guides/index.md +++ b/docs/es/guides/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Guías de ClickHouse {#clickhouse-guides} Instrucciones detalladas paso a paso que lo ayudarán a resolver varias tareas usando ClickHouse. diff --git a/docs/es/index.md b/docs/es/index.md index b777996b67d..9f9165b446b 100644 --- a/docs/es/index.md +++ b/docs/es/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # ¿Qué es ClickHouse? {#what-is-clickhouse} ClickHouse es un sistema de gestión de bases de datos orientado a columnas (DBMS) para el procesamiento analítico en línea de consultas (OLAP). diff --git a/docs/es/interfaces/cli.md b/docs/es/interfaces/cli.md index 7f035970fac..a0dbd31824b 100644 --- a/docs/es/interfaces/cli.md +++ b/docs/es/interfaces/cli.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cliente de línea de comandos {#command-line-client} ClickHouse proporciona un cliente de línea de comandos nativo: `clickhouse-client`. El cliente admite opciones de línea de comandos y archivos de configuración. Para obtener más información, consulte [Configuración](#interfaces_cli_configuration). diff --git a/docs/es/interfaces/cpp.md b/docs/es/interfaces/cpp.md index 9de79433ba7..5fad7c315e5 100644 --- a/docs/es/interfaces/cpp.md +++ b/docs/es/interfaces/cpp.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Biblioteca de clientes de C++ {#c-client-library} Ver README en [Bienvenidos](https://github.com/ClickHouse/clickhouse-cpp) repositorio. diff --git a/docs/es/interfaces/formats.md b/docs/es/interfaces/formats.md deleted file mode 120000 index 41a65ebe579..00000000000 --- a/docs/es/interfaces/formats.md +++ /dev/null @@ -1 +0,0 @@ -../../en/interfaces/formats.md \ No newline at end of file diff --git a/docs/es/interfaces/formats.md b/docs/es/interfaces/formats.md new file mode 100644 index 00000000000..d78c81a2849 --- /dev/null +++ b/docs/es/interfaces/formats.md @@ -0,0 +1,1209 @@ +--- +machine_translated: true +--- + +# Formatos para datos de entrada y salida {#formats} + +ClickHouse puede aceptar y devolver datos en varios formatos. Se puede utilizar un formato admitido para la entrada para analizar los datos proporcionados a `INSERT`s, para llevar a cabo `SELECT`s de una tabla respaldada por archivos como File, URL o HDFS, o para leer un diccionario externo. Se puede utilizar un formato compatible con la salida para organizar el +resultados de un `SELECT`, y realizar `INSERT`s en una tabla respaldada por archivos. + +Los formatos soportados son: + +| Formato | Entrada | Salida | +|-----------------------------------------------------------------|---------|--------| +| [TabSeparated](#tabseparated) | ✔ | ✔ | +| [TabSeparatedRaw](#tabseparatedraw) | ✗ | ✔ | +| [TabSeparatedWithNames](#tabseparatedwithnames) | ✔ | ✔ | +| [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes) | ✔ | ✔ | +| [Plantilla](#format-template) | ✔ | ✔ | +| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ | +| [CSV](#csv) | ✔ | ✔ | +| [CSVWithNames](#csvwithnames) | ✔ | ✔ | +| [CustomSeparated](#format-customseparated) | ✔ | ✔ | +| [Valor](#data-format-values) | ✔ | ✔ | +| [Vertical](#vertical) | ✗ | ✔ | +| [VerticalRaw](#verticalraw) | ✗ | ✔ | +| [JSON](#json) | ✗ | ✔ | +| [JSONCompact](#jsoncompact) | ✗ | ✔ | +| [JSONEachRow](#jsoneachrow) | ✔ | ✔ | +| [TSKV](#tskv) | ✔ | ✔ | +| [Bastante](#pretty) | ✗ | ✔ | +| [PrettyCompact](#prettycompact) | ✗ | ✔ | +| [PrettyCompactMonoBlock](#prettycompactmonoblock) | ✗ | ✔ | +| [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | +| [Bienvenido a WordPress.](#prettyspace) | ✗ | ✔ | +| [Protobuf](#protobuf) | ✔ | ✔ | +| [Avro](#data-format-avro) | ✔ | ✔ | +| [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | +| [Parquet](#data-format-parquet) | ✔ | ✔ | +| [ORC](#data-format-orc) | ✔ | ✗ | +| [RowBinary](#rowbinary) | ✔ | ✔ | +| [RowBinaryWithNamesAndTypes](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [Nativo](#native) | ✔ | ✔ | +| [Nulo](#null) | ✗ | ✔ | +| [XML](#xml) | ✗ | ✔ | +| [CapnProto](#capnproto) | ✔ | ✗ | + +Puede controlar algunos parámetros de procesamiento de formato con la configuración de ClickHouse. Para obtener más información, lea el [Configuración](../operations/settings/settings.md) apartado. + +## TabSeparated {#tabseparated} + +En el formato TabSeparated, los datos se escriben por fila. Cada fila contiene valores separados por pestañas. Cada valor es seguido por una ficha, excepto el último valor de la fila, que es seguido por un avance de línea. Estrictamente las fuentes de línea Unix se asumen en todas partes. La última fila también debe contener un avance de línea al final. Los valores se escriben en formato de texto, sin incluir comillas y con caracteres especiales escapados. + +Este formato también está disponible bajo el nombre `TSV`. + +El `TabSeparated` es conveniente para procesar datos utilizando programas y scripts personalizados. Se usa de forma predeterminada en la interfaz HTTP y en el modo por lotes del cliente de línea de comandos. Este formato también permite transferir datos entre diferentes DBMS. Por ejemplo, puede obtener un volcado de MySQL y subirlo a ClickHouse, o viceversa. + +El `TabSeparated` el formato admite la salida de valores totales (cuando se usa WITH TOTALS) y valores extremos (cuando ‘extremes’ se establece en 1). En estos casos, los valores totales y los extremos se emiten después de los datos principales. El resultado principal, los valores totales y los extremos están separados entre sí por una línea vacía. Ejemplo: + +``` sql +SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT TabSeparated`` +``` + +``` text +2014-03-17 1406958 +2014-03-18 1383658 +2014-03-19 1405797 +2014-03-20 1353623 +2014-03-21 1245779 +2014-03-22 1031592 +2014-03-23 1046491 + +0000-00-00 8873898 + +2014-03-17 1031592 +2014-03-23 1406958 +``` + +### Formato de datos {#data-formatting} + +Los números enteros se escriben en forma decimal. Los números pueden contener un extra “+” carácter al principio (ignorado al analizar y no grabado al formatear). Los números no negativos no pueden contener el signo negativo. Al leer, se permite analizar una cadena vacía como cero, o (para tipos con signo) una cadena que consiste en solo un signo menos como cero. Los números que no encajan en el tipo de datos correspondiente se pueden analizar como un número diferente, sin un mensaje de error. + +Los números de punto flotante se escriben en forma decimal. El punto se usa como separador decimal. Las entradas exponenciales son compatibles, al igual que ‘inf’, ‘+inf’, ‘-inf’, y ‘nan’. Una entrada de números de coma flotante puede comenzar o terminar con un punto decimal. +Durante el formateo, la precisión puede perderse en los números de coma flotante. +Durante el análisis, no es estrictamente necesario leer el número representable de la máquina más cercano. + +Las fechas se escriben en formato AAAA-MM-DD y se analizan en el mismo formato, pero con los caracteres como separadores. +Las fechas con horas se escriben en el formato `YYYY-MM-DD hh:mm:ss` y analizado en el mismo formato, pero con cualquier carácter como separadores. +Todo esto ocurre en la zona horaria del sistema en el momento en que se inicia el cliente o servidor (dependiendo de cuál de ellos formatea los datos). Para fechas con horarios, no se especifica el horario de verano. Por lo tanto, si un volcado tiene tiempos durante el horario de verano, el volcado no coincide inequívocamente con los datos, y el análisis seleccionará una de las dos veces. +Durante una operación de lectura, las fechas incorrectas y las fechas con horas se pueden analizar con desbordamiento natural o como fechas y horas nulas, sin un mensaje de error. + +Como excepción, el análisis de fechas con horas también se admite en el formato de marca de tiempo Unix, si consta de exactamente 10 dígitos decimales. El resultado no depende de la zona horaria. Los formatos AAAA-MM-DD hh:mm:ss y NNNNNNNNNN se diferencian automáticamente. + +Las cadenas se generan con caracteres especiales de escape de barra invertida. Las siguientes secuencias de escape se utilizan para la salida: `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\'`, `\\`. El análisis también admite las secuencias `\a`, `\v`, y `\xHH` (secuencias de escape hexagonales) y cualquier `\c` secuencias, donde `c` es cualquier carácter (estas secuencias se convierten en `c`). Por lo tanto, la lectura de datos admite formatos donde un avance de línea se puede escribir como `\n` o `\` o como un avance de línea. Por ejemplo, la cadena `Hello world` con un avance de línea entre las palabras en lugar de espacio se puede analizar en cualquiera de las siguientes variaciones: + +``` text +Hello\nworld + +Hello\ +world +``` + +La segunda variante es compatible porque MySQL la usa al escribir volcados separados por tabuladores. + +El conjunto mínimo de caracteres que debe escapar al pasar datos en formato TabSeparated: tabulación, salto de línea (LF) y barra invertida. + +Solo se escapa un pequeño conjunto de símbolos. Puede tropezar fácilmente con un valor de cadena que su terminal arruinará en la salida. + +Las matrices se escriben como una lista de valores separados por comas entre corchetes. Los elementos numéricos de la matriz tienen el formato normal. `Date` y `DateTime` están escritos entre comillas simples. Las cadenas se escriben entre comillas simples con las mismas reglas de escape que las anteriores. + +[NULL](../query_language/syntax.md) se formatea como `\N`. + +Cada elemento de [Anidar](../data_types/nested_data_structures/nested.md) estructuras se representa como una matriz. + +Por ejemplo: + +``` sql +CREATE TABLE nestedt +( + `id` UInt8, + `aux` Nested( + a UInt8, + b String + ) +) +ENGINE = TinyLog +``` + +``` sql +INSERT INTO nestedt Values ( 1, [1], ['a']) +``` + +``` sql +SELECT * FROM nestedt FORMAT TSV +``` + +``` text +1 [1] ['a'] +``` + +## TabSeparatedRaw {#tabseparatedraw} + +Difiere de `TabSeparated` formato en que las filas se escriben sin escapar. +Este formato solo es apropiado para generar un resultado de consulta, pero no para analizar (recuperar datos para insertar en una tabla). + +Este formato también está disponible bajo el nombre `TSVRaw`. + +## TabSeparatedWithNames {#tabseparatedwithnames} + +Difiere de la `TabSeparated` formato en que los nombres de columna se escriben en la primera fila. +Durante el análisis, la primera fila se ignora por completo. No puede usar nombres de columna para determinar su posición o para comprobar su corrección. +(Se puede agregar soporte para analizar la fila de encabezado en el futuro.) + +Este formato también está disponible bajo el nombre `TSVWithNames`. + +## TabSeparatedWithNamesAndTypes {#tabseparatedwithnamesandtypes} + +Difiere de la `TabSeparated` formato en que los nombres de columna se escriben en la primera fila, mientras que los tipos de columna están en la segunda fila. +Durante el análisis, la primera y la segunda filas se ignoran por completo. + +Este formato también está disponible bajo el nombre `TSVWithNamesAndTypes`. + +## Plantilla {#format-template} + +Este formato permite especificar una cadena de formato personalizado con marcadores de posición para los valores con una regla de escape especificada. + +Utiliza la configuración `format_template_resultset`, `format_template_row`, `format_template_rows_between_delimiter` and some settings of other formats (e.g. `output_format_json_quote_64bit_integers` cuando se utiliza `JSON` escapar, ver más) + +Configuración `format_template_row` especifica la ruta de acceso al archivo, que contiene una cadena de formato para las filas con la siguiente sintaxis: + +`delimiter_1${column_1:serializeAs_1}delimiter_2${column_2:serializeAs_2} ... delimiter_N`, + +donde `delimiter_i` es un delimitador entre valores (`$` símbolo se puede escapar como `$$`), +`column_i` es un nombre o índice de una columna cuyos valores se deben seleccionar o insertar (si está vacío, se omitirá la columna), +`serializeAs_i` es una regla de escape para los valores de columna. Se admiten las siguientes reglas de escape: + +- `CSV`, `JSON`, `XML` (similar a los formatos de los mismos nombres) +- `Escaped` (similar a `TSV`) +- `Quoted` (similar a `Values`) +- `Raw` (sin escapar, de manera similar a `TSVRaw`) +- `None` (sin regla de escape, ver más) + +Si se omite una regla de escape, entonces `None` se utilizará. `XML` y `Raw` son adecuados sólo para la salida. + +Entonces, para la siguiente cadena de formato: + + `Search phrase: ${SearchPhrase:Quoted}, count: ${c:Escaped}, ad price: $$${price:JSON};` + +los valores de `SearchPhrase`, `c` y `price` columnas, que se escapan como `Quoted`, `Escaped` y `JSON` se imprimirá (para seleccionar) o se esperará (para insertar) entre `Search phrase:`, `, count:`, `, ad price: $` y `;` delimitadores respectivamente. Por ejemplo: + +`Search phrase: 'bathroom interior design', count: 2166, ad price: $3;` + +El `format_template_rows_between_delimiter` setting especifica el delimitador entre filas, que se imprime (o se espera) después de cada fila, excepto la última (`\n` predeterminada) + +Configuración `format_template_resultset` especifica la ruta al archivo, que contiene una cadena de formato para el conjunto de resultados. La cadena de formato para el conjunto de resultados tiene la misma sintaxis que una cadena de formato para la fila y permite especificar un prefijo, un sufijo y una forma de imprimir información adicional. Contiene los siguientes marcadores de posición en lugar de nombres de columna: + +- `data` son las filas con datos en `format_template_row` formato, separados por `format_template_rows_between_delimiter`. Este marcador de posición debe ser el primer marcador de posición en la cadena de formato. +- `totals` es la fila con valores totales en `format_template_row` formato (cuando se usa WITH TOTALS) +- `min` es la fila con valores mínimos en `format_template_row` formato (cuando los extremos se establecen en 1) +- `max` es la fila con valores máximos en `format_template_row` formato (cuando los extremos se establecen en 1) +- `rows` es el número total de filas de salida +- `rows_before_limit` es el número mínimo de filas que habría habido sin LIMIT. Salida solo si la consulta contiene LIMIT. Si la consulta contiene GROUP BY, rows\_before\_limit\_at\_least es el número exacto de filas que habría habido sin un LIMIT . +- `time` es el tiempo de ejecución de la solicitud en segundos +- `rows_read` es el número de filas que se ha leído +- `bytes_read` es el número de bytes (sin comprimir) que se ha leído + +Marcador `data`, `totals`, `min` y `max` no debe tener una regla de escape especificada (o `None` debe especificarse explícitamente). Los marcadores de posición restantes pueden tener cualquier regla de escape especificada. +Si el `format_template_resultset` valor es una cadena vacía, `${data}` se utiliza como valor predeterminado. +Para el formato de consultas de inserción permite omitir algunas columnas o algunos campos si prefijo o sufijo (ver ejemplo). + +Seleccionar ejemplo: + +``` sql +SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase ORDER BY c DESC LIMIT 5 FORMAT Template SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = '\n ' +``` + +`/some/path/resultset.format`: + +``` text + + Search phrases + + + + ${data} +
Search phrases
Search phrase Count
+ + ${max} +
Max
+ Processed ${rows_read:XML} rows in ${time:XML} sec + + +``` + +`/some/path/row.format`: + +``` text + ${0:XML} ${1:XML} +``` + +Resultado: + +``` html + + Search phrases + + + + + + + + +
Search phrases
Search phrase Count
8267016
bathroom interior design 2166
yandex 1655
spring 2014 fashion 1549
freeform photos 1480
+ + +
Max
8873898
+ Processed 3095973 rows in 0.1569913 sec + + +``` + +Insertar ejemplo: + +``` text +Some header +Page views: 5, User id: 4324182021466249494, Useless field: hello, Duration: 146, Sign: -1 +Page views: 6, User id: 4324182021466249494, Useless field: world, Duration: 185, Sign: 1 +Total rows: 2 +``` + +``` sql +INSERT INTO UserActivity FORMAT Template SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format' +``` + +`/some/path/resultset.format`: + +``` text +Some header\n${data}\nTotal rows: ${:CSV}\n +``` + +`/some/path/row.format`: + +``` text +Page views: ${PageViews:CSV}, User id: ${UserID:CSV}, Useless field: ${:CSV}, Duration: ${Duration:CSV}, Sign: ${Sign:CSV} +``` + +`PageViews`, `UserID`, `Duration` y `Sign` dentro de los marcadores de posición son nombres de columnas en la tabla. Valores después `Useless field` en filas y después `\nTotal rows:` en el sufijo será ignorado. +Todos los delimitadores de los datos de entrada deben ser estrictamente iguales a los delimitadores de las cadenas de formato especificadas. + +## TemplateIgnoreSpaces {#templateignorespaces} + +Este formato es adecuado sólo para la entrada. +Similar a `Template`, pero omite caracteres de espacio en blanco entre delimitadores y valores en la secuencia de entrada. Sin embargo, si las cadenas de formato contienen caracteres de espacio en blanco, se esperarán estos caracteres en la secuencia de entrada. También permite especificar marcadores de posición vacíos (`${}` o `${:None}`) para dividir algún delimitador en partes separadas para ignorar los espacios entre ellos. Dichos marcadores de posición se usan solo para omitir caracteres de espacio en blanco. +Es posible leer `JSON` usando este formato, si los valores de las columnas tienen el mismo orden en todas las filas. Por ejemplo, la siguiente solicitud se puede utilizar para insertar datos del ejemplo de salida de formato [JSON](#json): + +``` sql +INSERT INTO table_name FORMAT TemplateIgnoreSpaces SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = ',' +``` + +`/some/path/resultset.format`: + +``` text +{${}"meta"${}:${:JSON},${}"data"${}:${}[${data}]${},${}"totals"${}:${:JSON},${}"extremes"${}:${:JSON},${}"rows"${}:${:JSON},${}"rows_before_limit_at_least"${}:${:JSON}${}} +``` + +`/some/path/row.format`: + +``` text +{${}"SearchPhrase"${}:${}${phrase:JSON}${},${}"c"${}:${}${cnt:JSON}${}} +``` + +## TSKV {#tskv} + +Similar a TabSeparated , pero genera un valor en formato name=value . Los nombres se escapan de la misma manera que en el formato TabSeparated, y el símbolo = también se escapa. + +``` text +SearchPhrase= count()=8267016 +SearchPhrase=bathroom interior design count()=2166 +SearchPhrase=yandex count()=1655 +SearchPhrase=2014 spring fashion count()=1549 +SearchPhrase=freeform photos count()=1480 +SearchPhrase=angelina jolie count()=1245 +SearchPhrase=omsk count()=1112 +SearchPhrase=photos of dog breeds count()=1091 +SearchPhrase=curtain designs count()=1064 +SearchPhrase=baku count()=1000 +``` + +[NULL](../query_language/syntax.md) se formatea como `\N`. + +``` sql +SELECT * FROM t_null FORMAT TSKV +``` + +``` text +x=1 y=\N +``` + +Cuando hay una gran cantidad de columnas pequeñas, este formato no es efectivo y generalmente no hay razón para usarlo. Sin embargo, no es peor que JSONEachRow en términos de eficiencia. + +Both data output and parsing are supported in this format. For parsing, any order is supported for the values of different columns. It is acceptable for some values to be omitted – they are treated as equal to their default values. In this case, zeros and blank rows are used as default values. Complex values that could be specified in the table are not supported as defaults. + +El análisis permite la presencia del campo adicional `tskv` sin el signo igual o un valor. Este campo se ignora. + +## CSV {#csv} + +Formato de valores separados por comas ([RFC](https://tools.ietf.org/html/rfc4180)). + +Al formatear, las filas están encerradas en comillas dobles. Una comilla doble dentro de una cadena se genera como dos comillas dobles en una fila. No hay otras reglas para escapar de los personajes. Fecha y fecha-hora están encerrados en comillas dobles. Los números se emiten sin comillas. Los valores están separados por un carácter delimitador, que es `,` predeterminada. El carácter delimitador se define en la configuración [Formato\_csv\_delimiter](../operations/settings/settings.md#settings-format_csv_delimiter). Las filas se separan usando el avance de línea Unix (LF). Las matrices se serializan en CSV de la siguiente manera: primero, la matriz se serializa en una cadena como en el formato TabSeparated, y luego la cadena resultante se envía a CSV en comillas dobles. Las tuplas en formato CSV se serializan como columnas separadas (es decir, se pierde su anidamiento en la tupla). + +``` bash +$ clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FORMAT CSV" < data.csv +``` + +\*De forma predeterminada, el delimitador es `,`. Ver el [Formato\_csv\_delimiter](../operations/settings/settings.md#settings-format_csv_delimiter) para obtener más información. + +Al analizar, todos los valores se pueden analizar con o sin comillas. Ambas comillas dobles y simples son compatibles. Las filas también se pueden organizar sin comillas. En este caso, se analizan hasta el carácter delimitador o el avance de línea (CR o LF). En violación del RFC, al analizar filas sin comillas, se ignoran los espacios y pestañas iniciales y finales. Para el avance de línea, se admiten los tipos Unix (LF), Windows (CR LF) y Mac OS Classic (CR LF). + +Los valores de entrada vacíos sin comillas se sustituyen por valores predeterminados para las columnas respectivas, si +[Entrada\_format\_defaults\_for\_omitted\_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields) +está habilitado. + +`NULL` se formatea como `\N` o `NULL` o una cadena vacía sin comillas (consulte la configuración [input\_format\_csv\_unquoted\_null\_literal\_as\_null](../operations/settings/settings.md#settings-input_format_csv_unquoted_null_literal_as_null) y [Entrada\_format\_defaults\_for\_omitted\_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields)). + +El formato CSV admite la salida de totales y extremos de la misma manera que `TabSeparated`. + +## CSVWithNames {#csvwithnames} + +También imprime la fila del encabezado, similar a `TabSeparatedWithNames`. + +## CustomSeparated {#format-customseparated} + +Similar a [Plantilla](#format-template), pero imprime o lee todas las columnas y usa la regla de escape de la configuración `format_custom_escaping_rule` y delimitadores desde la configuración `format_custom_field_delimiter`, `format_custom_row_before_delimiter`, `format_custom_row_after_delimiter`, `format_custom_row_between_delimiter`, `format_custom_result_before_delimiter` y `format_custom_result_after_delimiter`, no de cadenas de formato. +También hay `CustomSeparatedIgnoreSpaces` formato, que es similar a `TemplateIgnoreSpaces`. + +## JSON {#json} + +Salida de datos en formato JSON. Además de las tablas de datos, también genera nombres y tipos de columnas, junto con información adicional: el número total de filas de salida y el número de filas que podrían haberse generado si no hubiera un LIMIT . Ejemplo: + +``` sql +SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase WITH TOTALS ORDER BY c DESC LIMIT 5 FORMAT JSON +``` + +``` json +{ + "meta": + [ + { + "name": "SearchPhrase", + "type": "String" + }, + { + "name": "c", + "type": "UInt64" + } + ], + + "data": + [ + { + "SearchPhrase": "", + "c": "8267016" + }, + { + "SearchPhrase": "bathroom interior design", + "c": "2166" + }, + { + "SearchPhrase": "yandex", + "c": "1655" + }, + { + "SearchPhrase": "spring 2014 fashion", + "c": "1549" + }, + { + "SearchPhrase": "freeform photos", + "c": "1480" + } + ], + + "totals": + { + "SearchPhrase": "", + "c": "8873898" + }, + + "extremes": + { + "min": + { + "SearchPhrase": "", + "c": "1480" + }, + "max": + { + "SearchPhrase": "", + "c": "8267016" + } + }, + + "rows": 5, + + "rows_before_limit_at_least": 141137 +} +``` + +El JSON es compatible con JavaScript. Para garantizar esto, algunos caracteres se escapan adicionalmente: la barra inclinada `/` se escapa como `\/`; saltos de línea alternativos `U+2028` y `U+2029`, que rompen algunos navegadores, se escapan como `\uXXXX`. Los caracteres de control ASCII se escapan: retroceso, avance de formulario, avance de línea, retorno de carro y tabulación horizontal se reemplazan con `\b`, `\f`, `\n`, `\r`, `\t` , así como los bytes restantes en el rango 00-1F usando `\uXXXX` sequences. Invalid UTF-8 sequences are changed to the replacement character � so the output text will consist of valid UTF-8 sequences. For compatibility with JavaScript, Int64 and UInt64 integers are enclosed in double-quotes by default. To remove the quotes, you can set the configuration parameter [output\_format\_json\_quote\_64bit\_integers](../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) a 0. + +`rows` – The total number of output rows. + +`rows_before_limit_at_least` El número mínimo de filas habría sido sin LIMIT . Salida solo si la consulta contiene LIMIT. +Si la consulta contiene GROUP BY, rows\_before\_limit\_at\_least es el número exacto de filas que habría habido sin un LIMIT . + +`totals` – Total values (when using WITH TOTALS). + +`extremes` – Extreme values (when extremes are set to 1). + +Este formato solo es apropiado para generar un resultado de consulta, pero no para analizar (recuperar datos para insertar en una tabla). + +Soporta ClickHouse [NULL](../query_language/syntax.md), que se muestra como `null` en la salida JSON. + +Ver también el [JSONEachRow](#jsoneachrow) formato. + +## JSONCompact {#jsoncompact} + +Difiere de JSON solo en que las filas de datos se generan en matrices, no en objetos. + +Ejemplo: + +``` json +{ + "meta": + [ + { + "name": "SearchPhrase", + "type": "String" + }, + { + "name": "c", + "type": "UInt64" + } + ], + + "data": + [ + ["", "8267016"], + ["bathroom interior design", "2166"], + ["yandex", "1655"], + ["fashion trends spring 2014", "1549"], + ["freeform photo", "1480"] + ], + + "totals": ["","8873898"], + + "extremes": + { + "min": ["","1480"], + "max": ["","8267016"] + }, + + "rows": 5, + + "rows_before_limit_at_least": 141137 +} +``` + +Este formato solo es apropiado para generar un resultado de consulta, pero no para analizar (recuperar datos para insertar en una tabla). +Ver también el `JSONEachRow` formato. + +## JSONEachRow {#jsoneachrow} + +Al usar este formato, ClickHouse genera filas como objetos JSON separados, delimitados por nuevas líneas, pero los datos en su conjunto no son JSON válidos. + +``` json +{"SearchPhrase":"curtain designs","count()":"1064"} +{"SearchPhrase":"baku","count()":"1000"} +{"SearchPhrase":"","count()":"8267016"} +``` + +Al insertar los datos, debe proporcionar un objeto JSON independiente para cada fila. + +### Insertar datos {#inserting-data} + +``` sql +INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1} +``` + +ClickHouse permite: + +- Cualquier orden de pares clave-valor en el objeto. +- Omitiendo algunos valores. + +ClickHouse ignora los espacios entre los elementos y las comas después de los objetos. Puede pasar todos los objetos en una línea. No tiene que separarlos con saltos de línea. + +**Procesamiento de valores omitidos** + +ClickHouse sustituye los valores omitidos por los valores predeterminados para el [tipos de datos](../data_types/index.md). + +Si `DEFAULT expr` se especifica, ClickHouse utiliza diferentes reglas de sustitución dependiendo de la [Entrada\_format\_defaults\_for\_omitted\_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields) configuración. + +Considere la siguiente tabla: + +``` sql +CREATE TABLE IF NOT EXISTS example_table +( + x UInt32, + a DEFAULT x * 2 +) ENGINE = Memory; +``` + +- Si `input_format_defaults_for_omitted_fields = 0`, entonces el valor predeterminado para `x` y `a` igual `0` (como el valor predeterminado para el `UInt32` tipo de datos). +- Si `input_format_defaults_for_omitted_fields = 1`, entonces el valor predeterminado para `x` igual `0` pero el valor predeterminado de `a` igual `x * 2`. + +!!! note "Advertencia" + Al insertar datos con `insert_sample_with_metadata = 1`, ClickHouse consume más recursos computacionales, en comparación con la inserción con `insert_sample_with_metadata = 0`. + +### Selección de datos {#selecting-data} + +Considere el `UserActivity` tabla como un ejemplo: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +Consulta `SELECT * FROM UserActivity FORMAT JSONEachRow` devoluciones: + +``` text +{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1} +{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1} +``` + +A diferencia de la [JSON](#json) formato, no hay sustitución de secuencias UTF-8 no válidas. Los valores se escapan de la misma manera que para `JSON`. + +!!! note "Nota" + Cualquier conjunto de bytes se puede generar en las cadenas. Utilice el `JSONEachRow` si está seguro de que los datos de la tabla se pueden formatear como JSON sin perder ninguna información. + +### Uso de estructuras anidadas {#jsoneachrow-nested} + +Si tienes una mesa con [Anidar](../data_types/nested_data_structures/nested.md) columnas de tipo de datos, puede insertar datos JSON con la misma estructura. Habilite esta función con el [Entrada\_format\_import\_nested\_json](../operations/settings/settings.md#settings-input_format_import_nested_json) configuración. + +Por ejemplo, considere la siguiente tabla: + +``` sql +CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory +``` + +Como se puede ver en el `Nested` descripción del tipo de datos, ClickHouse trata cada componente de la estructura anidada como una columna separada (`n.s` y `n.i` para nuestra mesa). Puede insertar datos de la siguiente manera: + +``` sql +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]} +``` + +Para insertar datos como un objeto JSON jerárquico, establezca [input\_format\_import\_nested\_json=1](../operations/settings/settings.md#settings-input_format_import_nested_json). + +``` json +{ + "n": { + "s": ["abc", "def"], + "i": [1, 23] + } +} +``` + +Sin esta configuración, ClickHouse produce una excepción. + +``` sql +SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json' +``` + +``` text +┌─name────────────────────────────┬─value─┐ +│ input_format_import_nested_json │ 0 │ +└─────────────────────────────────┴───────┘ +``` + +``` sql +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}} +``` + +``` text +Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1) +``` + +``` sql +SET input_format_import_nested_json=1 +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}} +SELECT * FROM json_each_row_nested +``` + +``` text +┌─n.s───────────┬─n.i────┐ +│ ['abc','def'] │ [1,23] │ +└───────────────┴────────┘ +``` + +## Nativo {#native} + +El formato más eficiente. Los datos son escritos y leídos por bloques en formato binario. Para cada bloque, el número de filas, número de columnas, nombres y tipos de columnas y partes de columnas de este bloque se registran una tras otra. En otras palabras, este formato es “columnar” – it doesn't convert columns to rows. This is the format used in the native interface for interaction between servers, for using the command-line client, and for C++ clients. + +Puede utilizar este formato para generar rápidamente volcados que sólo pueden ser leídos por el DBMS de ClickHouse. No tiene sentido trabajar con este formato usted mismo. + +## Nulo {#null} + +Nada es salida. Sin embargo, la consulta se procesa y, cuando se utiliza el cliente de línea de comandos, los datos se transmiten al cliente. Esto se usa para pruebas, incluidas las pruebas de rendimiento. +Obviamente, este formato solo es apropiado para la salida, no para el análisis. + +## Bastante {#pretty} + +Salidas de datos como tablas de arte Unicode, también utilizando secuencias de escape ANSI para establecer colores en el terminal. +Se dibuja una cuadrícula completa de la tabla, y cada fila ocupa dos líneas en la terminal. +Cada bloque de resultados se muestra como una tabla separada. Esto es necesario para que los bloques se puedan generar sin resultados de almacenamiento en búfer (el almacenamiento en búfer sería necesario para calcular previamente el ancho visible de todos los valores). + +[NULL](../query_language/syntax.md) se emite como `ᴺᵁᴸᴸ`. + +Ejemplo (mostrado para el [PrettyCompact](#prettycompact) formato): + +``` sql +SELECT * FROM t_null +``` + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +Las filas no se escapan en formatos Pretty \*. Se muestra un ejemplo para el [PrettyCompact](#prettycompact) formato: + +``` sql +SELECT 'String with \'quotes\' and \t character' AS Escaping_test +``` + +``` text +┌─Escaping_test────────────────────────┐ +│ String with 'quotes' and character │ +└──────────────────────────────────────┘ +``` + +Para evitar volcar demasiados datos al terminal, solo se imprimen las primeras 10.000 filas. Si el número de filas es mayor o igual que 10.000, el mensaje “Showed first 10 000” se imprime. +Este formato solo es apropiado para generar un resultado de consulta, pero no para analizar (recuperar datos para insertar en una tabla). + +El formato Pretty admite la salida de valores totales (cuando se usa WITH TOTALS) y extremos (cuando ‘extremes’ se establece en 1). En estos casos, los valores totales y los valores extremos se generan después de los datos principales, en tablas separadas. Ejemplo (mostrado para el [PrettyCompact](#prettycompact) formato): + +``` sql +SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT PrettyCompact +``` + +``` text +┌──EventDate─┬───────c─┐ +│ 2014-03-17 │ 1406958 │ +│ 2014-03-18 │ 1383658 │ +│ 2014-03-19 │ 1405797 │ +│ 2014-03-20 │ 1353623 │ +│ 2014-03-21 │ 1245779 │ +│ 2014-03-22 │ 1031592 │ +│ 2014-03-23 │ 1046491 │ +└────────────┴─────────┘ + +Totals: +┌──EventDate─┬───────c─┐ +│ 0000-00-00 │ 8873898 │ +└────────────┴─────────┘ + +Extremes: +┌──EventDate─┬───────c─┐ +│ 2014-03-17 │ 1031592 │ +│ 2014-03-23 │ 1406958 │ +└────────────┴─────────┘ +``` + +## PrettyCompact {#prettycompact} + +Difiere de [Bastante](#pretty) en que la cuadrícula se dibuja entre filas y el resultado es más compacto. +Este formato se usa de forma predeterminada en el cliente de línea de comandos en modo interactivo. + +## PrettyCompactMonoBlock {#prettycompactmonoblock} + +Difiere de [PrettyCompact](#prettycompact) en que hasta 10,000 filas se almacenan en búfer, luego se salen como una sola tabla, no por bloques. + +## PrettyNoEscapes {#prettynoescapes} + +Difiere de Pretty en que las secuencias de escape ANSI no se usan. Esto es necesario para mostrar este formato en un navegador, así como para usar el ‘watch’ utilidad de línea de comandos. + +Ejemplo: + +``` bash +$ watch -n1 "clickhouse-client --query='SELECT event, value FROM system.events FORMAT PrettyCompactNoEscapes'" +``` + +Puede usar la interfaz HTTP para mostrar en el navegador. + +### PrettyCompactNoEscapes {#prettycompactnoescapes} + +Lo mismo que el ajuste anterior. + +### PrettySpaceNoEscapes {#prettyspacenoescapes} + +Lo mismo que el ajuste anterior. + +## Bienvenido a WordPress. {#prettyspace} + +Difiere de [PrettyCompact](#prettycompact) en ese espacio en blanco (caracteres de espacio) se usa en lugar de la cuadrícula. + +## RowBinary {#rowbinary} + +Formatea y analiza datos por fila en formato binario. Las filas y los valores se enumeran consecutivamente, sin separadores. +Este formato es menos eficiente que el formato nativo, ya que está basado en filas. + +Los integradores usan una representación little-endian de longitud fija. Por ejemplo, UInt64 usa 8 bytes. +DateTime se representa como UInt32 que contiene la marca de tiempo Unix como el valor. +Date se representa como un objeto UInt16 que contiene el número de días desde 1970-01-01 como el valor. +La cadena se representa como una longitud varint (sin signo [LEB128](https://en.wikipedia.org/wiki/LEB128)), seguido de los bytes de la cadena. +FixedString se representa simplemente como una secuencia de bytes. + +La matriz se representa como una longitud varint (sin signo [LEB128](https://en.wikipedia.org/wiki/LEB128)), seguido de elementos sucesivos de la matriz. + +Para [NULL](../query_language/syntax.md#null-literal) soporte, se añade un byte adicional que contiene 1 o 0 antes de cada [NULL](../data_types/nullable.md) valor. Si 1, entonces el valor es `NULL` y este byte se interpreta como un valor separado. Si es 0, el valor después del byte no es `NULL`. + +## RowBinaryWithNamesAndTypes {#rowbinarywithnamesandtypes} + +Similar a [RowBinary](#rowbinary), pero con encabezado añadido: + +- [LEB128](https://en.wikipedia.org/wiki/LEB128)-número codificado de columnas (N) +- N `String`s especificando nombres de columna +- N `String`s especificando tipos de columna + +## Valor {#data-format-values} + +Imprime cada fila entre paréntesis. Las filas están separadas por comas. No hay coma después de la última fila. Los valores dentro de los corchetes también están separados por comas. Los números se emiten en formato decimal sin comillas. Las matrices se emiten entre corchetes. Las cadenas, fechas y fechas con horas se generan entre comillas. Las reglas de escape y el análisis son similares a las [TabSeparated](#tabseparated) formato. Durante el formateo, los espacios adicionales no se insertan, pero durante el análisis, se permiten y omiten (excepto los espacios dentro de los valores de la matriz, que no están permitidos). [NULL](../query_language/syntax.md) se representa como `NULL`. + +The minimum set of characters that you need to escape when passing data in Values ​​format: single quotes and backslashes. + +Este es el formato que se utiliza en `INSERT INTO t VALUES ...`, pero también puede usarlo para formatear los resultados de la consulta. + +Ver también: [input\_format\_values\_interpret\_expressions](../operations/settings/settings.md#settings-input_format_values_interpret_expressions) y [input\_format\_values\_deduce\_templates\_of\_expressions](../operations/settings/settings.md#settings-input_format_values_deduce_templates_of_expressions) configuración. + +## Vertical {#vertical} + +Imprime cada valor en una línea independiente con el nombre de columna especificado. Este formato es conveniente para imprimir solo una o varias filas si cada fila consta de un gran número de columnas. + +[NULL](../query_language/syntax.md) se emite como `ᴺᵁᴸᴸ`. + +Ejemplo: + +``` sql +SELECT * FROM t_null FORMAT Vertical +``` + +``` text +Row 1: +────── +x: 1 +y: ᴺᵁᴸᴸ +``` + +Las filas no se escapan en formato vertical: + +``` sql +SELECT 'string with \'quotes\' and \t with some special \n characters' AS test FORMAT Vertical +``` + +``` text +Row 1: +────── +test: string with 'quotes' and with some special + characters +``` + +Este formato solo es apropiado para generar un resultado de consulta, pero no para analizar (recuperar datos para insertar en una tabla). + +## VerticalRaw {#verticalraw} + +Similar a [Vertical](#vertical), pero con escapar deshabilitado. Este formato solo es adecuado para generar resultados de consultas, no para analizar (recibir datos e insertarlos en la tabla). + +## XML {#xml} + +El formato XML es adecuado solo para la salida, no para el análisis. Ejemplo: + +``` xml + + + + + + SearchPhrase + String + + + count() + UInt64 + + + + + + + 8267016 + + + bathroom interior design + 2166 + + + yandex + 1655 + + + 2014 spring fashion + 1549 + + + freeform photos + 1480 + + + angelina jolie + 1245 + + + omsk + 1112 + + + photos of dog breeds + 1091 + + + curtain designs + 1064 + + + baku + 1000 + + + 10 + 141137 + +``` + +Si el nombre de la columna no tiene un formato aceptable, simplemente ‘field’ se utiliza como el nombre del elemento. En general, la estructura XML sigue la estructura JSON. +Just as for JSON, invalid UTF-8 sequences are changed to the replacement character � so the output text will consist of valid UTF-8 sequences. + +En los valores de cadena, los caracteres `<` y `&` se escaparon como `<` y `&`. + +Las matrices se emiten como `HelloWorld...`y tuplas como `HelloWorld...`. + +## CapnProto {#capnproto} + +Cap'n Proto es un formato de mensaje binario similar a Protocol Buffers y Thrift, pero no como JSON o MessagePack. + +Los mensajes de Cap'n Proto están estrictamente escritos y no autodescribidos, lo que significa que necesitan una descripción de esquema externo. El esquema se aplica sobre la marcha y se almacena en caché para cada consulta. + +``` bash +$ cat capnproto_messages.bin | clickhouse-client --query "INSERT INTO test.hits FORMAT CapnProto SETTINGS format_schema='schema:Message'" +``` + +Donde `schema.capnp` se ve así: + +``` capnp +struct Message { + SearchPhrase @0 :Text; + c @1 :Uint64; +} +``` + +La deserialización es efectiva y generalmente no aumenta la carga del sistema. + +Ver también [Esquema de formato](#formatschema). + +## Protobuf {#protobuf} + +Protobuf - es un [Búferes de protocolo](https://developers.google.com/protocol-buffers/) formato. + +Este formato requiere un esquema de formato externo. El esquema se almacena en caché entre las consultas. +ClickHouse soporta ambos `proto2` y `proto3` sintaxis. Se admiten campos repetidos / opcionales / requeridos. + +Ejemplos de uso: + +``` sql +SELECT * FROM test.table FORMAT Protobuf SETTINGS format_schema = 'schemafile:MessageType' +``` + +``` bash +cat protobuf_messages.bin | clickhouse-client --query "INSERT INTO test.table FORMAT Protobuf SETTINGS format_schema='schemafile:MessageType'" +``` + +donde el archivo `schemafile.proto` se ve así: + +``` capnp +syntax = "proto3"; + +message MessageType { + string name = 1; + string surname = 2; + uint32 birthDate = 3; + repeated string phoneNumbers = 4; +}; +``` + +Para encontrar la correspondencia entre las columnas de la tabla y los campos del tipo de mensaje de Protocol Buffers, ClickHouse compara sus nombres. +Esta comparación no distingue entre mayúsculas y minúsculas y los caracteres `_` (subrayado) y `.` (punto) se consideran iguales. +Si los tipos de una columna y un campo del mensaje de Protocol Buffers son diferentes, se aplica la conversión necesaria. + +Los mensajes anidados son compatibles. Por ejemplo, para el campo `z` en el siguiente tipo de mensaje + +``` capnp +message MessageType { + message XType { + message YType { + int32 z; + }; + repeated YType y; + }; + XType x; +}; +``` + +ClickHouse intenta encontrar una columna llamada `x.y.z` (o `x_y_z` o `X.y_Z` y así sucesivamente). +Los mensajes anidados son adecuados para [estructuras de datos anidados](../data_types/nested_data_structures/nested.md). + +Valores predeterminados definidos en un esquema protobuf como este + +``` capnp +syntax = "proto2"; + +message MessageType { + optional int32 result_per_page = 3 [default = 10]; +} +``` + +no se aplican; el [valores predeterminados de la tabla](../query_language/create.md#create-default-values) se utilizan en lugar de ellos. + +ClickHouse entra y emite mensajes protobuf en el `length-delimited` formato. +Significa que antes de cada mensaje debe escribirse su longitud como un [varint](https://developers.google.com/protocol-buffers/docs/encoding#varints). +Ver también [cómo leer / escribir mensajes protobuf delimitados por longitud en idiomas populares](https://cwiki.apache.org/confluence/display/GEODE/Delimiting+Protobuf+Messages). + +## Avro {#data-format-avro} + +[Más información](http://avro.apache.org/) es un marco de serialización de datos orientado a filas desarrollado dentro del proyecto Hadoop de Apache. + +El formato ClickHouse Avro admite lectura y escritura [Archivos de datos Avro](http://avro.apache.org/docs/current/spec.html#Object+Container+Files). + +### Coincidencia de tipos de datos {#data_types-matching} + +La siguiente tabla muestra los tipos de datos admitidos y cómo coinciden con ClickHouse [tipos de datos](../data_types/index.md) en `INSERT` y `SELECT` consulta. + +| Tipo de datos Avro `INSERT` | Tipo de datos ClickHouse | Tipo de datos Avro `SELECT` | +|---------------------------------------------|---------------------------------------------------------------------------------------------|------------------------------| +| `boolean`, `int`, `long`, `float`, `double` | [¿Cómo funciona?)](../data_types/int_uint.md), [UInt(8\|16\|32)](../data_types/int_uint.md) | `int` | +| `boolean`, `int`, `long`, `float`, `double` | [Int64](../data_types/int_uint.md), [UInt64](../data_types/int_uint.md) | `long` | +| `boolean`, `int`, `long`, `float`, `double` | [Float32](../data_types/float.md) | `float` | +| `boolean`, `int`, `long`, `float`, `double` | [Float64](../data_types/float.md) | `double` | +| `bytes`, `string`, `fixed`, `enum` | [Cadena](../data_types/string.md) | `bytes` | +| `bytes`, `string`, `fixed` | [Cadena fija (N)](../data_types/fixedstring.md) | `fixed(N)` | +| `enum` | [Enum (8\|16)](../data_types/enum.md) | `enum` | +| `array(T)` | [Matriz (T)](../data_types/array.md) | `array(T)` | +| `union(null, T)`, `union(T, null)` | [Nivel de Cifrado WEP)](../data_types/date.md) | `union(null, T)` | +| `null` | [Nullable (nada)](../data_types/special_data_types/nothing.md) | `null` | +| `int (date)` \* | [Fecha](../data_types/date.md) | `int (date)` \* | +| `long (timestamp-millis)` \* | [¿Qué puedes encontrar en Neodigit)](../data_types/datetime.md) | `long (timestamp-millis)` \* | +| `long (timestamp-micros)` \* | [Cómo hacer esto?)](../data_types/datetime.md) | `long (timestamp-micros)` \* | + +\* [Tipos lógicos Avro](http://avro.apache.org/docs/current/spec.html#Logical+Types) + +Tipos de datos Avro no admitidos: `record` (no root), `map` + +Tipos de datos lógicos Avro no admitidos: `uuid`, `time-millis`, `time-micros`, `duration` + +### Insertar datos {#inserting-data-1} + +Para insertar datos de un archivo Avro en la tabla ClickHouse: + +``` bash +$ cat file.avro | clickhouse-client --query="INSERT INTO {some_table} FORMAT Avro" +``` + +El esquema raíz del archivo Avro de entrada debe ser de `record` tipo. + +Para encontrar la correspondencia entre las columnas de la tabla y los campos de Avro esquema ClickHouse compara sus nombres. Esta comparación distingue entre mayúsculas y minúsculas. +Los campos no utilizados se omiten. + +Los tipos de datos de las columnas de tabla ClickHouse pueden diferir de los campos correspondientes de los datos de Avro insertados. Al insertar datos, ClickHouse interpreta los tipos de datos de acuerdo con la tabla anterior y luego [elenco](../query_language/functions/type_conversion_functions/#type_conversion_function-cast) los datos al tipo de columna correspondiente. + +### Selección de datos {#selecting-data-1} + +Para seleccionar datos de la tabla ClickHouse en un archivo Avro: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Avro" > file.avro +``` + +Los nombres de columna deben: + +- comenzar con `[A-Za-z_]` +- posteriormente contienen sólo `[A-Za-z0-9_]` + +La compresión de archivos Avro de salida y el intervalo de sincronización se pueden configurar con [Sistema abierto.](../operations/settings/settings.md#settings-output_format_avro_codec) y [Sistema abierto.](../operations/settings/settings.md#settings-output_format_avro_sync_interval) respectivamente. + +## AvroConfluent {#data-format-avro-confluent} + +AvroConfluent admite la decodificación de mensajes Avro de un solo objeto comúnmente utilizados con [Kafka](https://kafka.apache.org/) y [Registro de Esquemas Confluentes](https://docs.confluent.io/current/schema-registry/index.html). + +Cada mensaje de Avro incrusta un id de esquema que se puede resolver en el esquema real con la ayuda del Registro de esquemas. + +Los esquemas se almacenan en caché una vez resueltos. + +La URL del registro de esquemas se configura con [Todos los derechos reservados.](../operations/settings/settings.md#settings-format_avro_schema_registry_url) + +### Coincidencia de tipos de datos {#data_types-matching-1} + +Lo mismo que [Avro](#data-format-avro) + +### Uso {#usage} + +Para verificar rápidamente la resolución del esquema, puede usar [Método de codificación de datos:](https://github.com/edenhill/kafkacat) con [Sistema abierto.](../operations/utils/clickhouse-local.md): + +``` bash +$ kafkacat -b kafka-broker -C -t topic1 -o beginning -f '%s' -c 3 | clickhouse-local --input-format AvroConfluent --format_avro_schema_registry_url 'http://schema-registry' -S "field1 Int64, field2 String" -q 'select * from table' +1 a +2 b +3 c +``` + +Utilizar `AvroConfluent` con [Kafka](../operations/table_engines/kafka.md): + +``` sql +CREATE TABLE topic1_stream +( + field1 String, + field2 String +) +ENGINE = Kafka() +SETTINGS +kafka_broker_list = 'kafka-broker', +kafka_topic_list = 'topic1', +kafka_group_name = 'group1', +kafka_format = 'AvroConfluent'; + +SET format_avro_schema_registry_url = 'http://schema-registry'; + +SELECT * FROM topic1_stream; +``` + +!!! note "Advertencia" + Configuración `format_avro_schema_registry_url` necesita ser configurado en `users.xml` para mantener su valor después de un reinicio. + +## Parquet {#data-format-parquet} + +[Apache Parquet](http://parquet.apache.org/) es un formato de almacenamiento columnar generalizado en el ecosistema Hadoop. ClickHouse admite operaciones de lectura y escritura para este formato. + +### Coincidencia de tipos de datos {#data_types-matching-2} + +La siguiente tabla muestra los tipos de datos admitidos y cómo coinciden con ClickHouse [tipos de datos](../data_types/index.md) en `INSERT` y `SELECT` consulta. + +| Tipo de datos de parquet (`INSERT`) | Tipo de datos ClickHouse | Tipo de datos de parquet (`SELECT`) | +|-------------------------------------|---------------------------------------------|-------------------------------------| +| `UINT8`, `BOOL` | [UInt8](../data_types/int_uint.md) | `UINT8` | +| `INT8` | [Int8](../data_types/int_uint.md) | `INT8` | +| `UINT16` | [UInt16](../data_types/int_uint.md) | `UINT16` | +| `INT16` | [Int16](../data_types/int_uint.md) | `INT16` | +| `UINT32` | [UInt32](../data_types/int_uint.md) | `UINT32` | +| `INT32` | [Int32](../data_types/int_uint.md) | `INT32` | +| `UINT64` | [UInt64](../data_types/int_uint.md) | `UINT64` | +| `INT64` | [Int64](../data_types/int_uint.md) | `INT64` | +| `FLOAT`, `HALF_FLOAT` | [Float32](../data_types/float.md) | `FLOAT` | +| `DOUBLE` | [Float64](../data_types/float.md) | `DOUBLE` | +| `DATE32` | [Fecha](../data_types/date.md) | `UINT16` | +| `DATE64`, `TIMESTAMP` | [FechaHora](../data_types/datetime.md) | `UINT32` | +| `STRING`, `BINARY` | [Cadena](../data_types/string.md) | `STRING` | +| — | [Cadena fija](../data_types/fixedstring.md) | `STRING` | +| `DECIMAL` | [Decimal](../data_types/decimal.md) | `DECIMAL` | + +ClickHouse admite una precisión configurable de `Decimal` tipo. El `INSERT` consulta trata el Parquet `DECIMAL` tipo como el ClickHouse `Decimal128` tipo. + +Tipos de datos de parquet no admitidos: `DATE32`, `TIME32`, `FIXED_SIZE_BINARY`, `JSON`, `UUID`, `ENUM`. + +Los tipos de datos de las columnas de tabla ClickHouse pueden diferir de los campos correspondientes de los datos de Parquet insertados. Al insertar datos, ClickHouse interpreta los tipos de datos de acuerdo con la tabla anterior y luego [elenco](../query_language/functions/type_conversion_functions/#type_conversion_function-cast) los datos de ese tipo de datos que se establece para la columna de tabla ClickHouse. + +### Insertar y seleccionar datos {#inserting-and-selecting-data} + +Puede insertar datos de Parquet desde un archivo en la tabla ClickHouse mediante el siguiente comando: + +``` bash +$ cat {filename} | clickhouse-client --query="INSERT INTO {some_table} FORMAT Parquet" +``` + +Puede seleccionar datos de una tabla ClickHouse y guardarlos en algún archivo en el formato Parquet mediante el siguiente comando: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Parquet" > {some_file.pq} +``` + +Para intercambiar datos con Hadoop, puede usar [Motor de mesa HDFS](../operations/table_engines/hdfs.md). + +## ORC {#data-format-orc} + +[Apache ORC](https://orc.apache.org/) es un formato de almacenamiento columnar generalizado en el ecosistema Hadoop. Solo puede insertar datos en este formato en ClickHouse. + +### Coincidencia de tipos de datos {#data_types-matching-3} + +La siguiente tabla muestra los tipos de datos admitidos y cómo coinciden con ClickHouse [tipos de datos](../data_types/index.md) en `INSERT` consulta. + +| Tipo de datos ORC (`INSERT`) | Tipo de datos ClickHouse | +|------------------------------|----------------------------------------| +| `UINT8`, `BOOL` | [UInt8](../data_types/int_uint.md) | +| `INT8` | [Int8](../data_types/int_uint.md) | +| `UINT16` | [UInt16](../data_types/int_uint.md) | +| `INT16` | [Int16](../data_types/int_uint.md) | +| `UINT32` | [UInt32](../data_types/int_uint.md) | +| `INT32` | [Int32](../data_types/int_uint.md) | +| `UINT64` | [UInt64](../data_types/int_uint.md) | +| `INT64` | [Int64](../data_types/int_uint.md) | +| `FLOAT`, `HALF_FLOAT` | [Float32](../data_types/float.md) | +| `DOUBLE` | [Float64](../data_types/float.md) | +| `DATE32` | [Fecha](../data_types/date.md) | +| `DATE64`, `TIMESTAMP` | [FechaHora](../data_types/datetime.md) | +| `STRING`, `BINARY` | [Cadena](../data_types/string.md) | +| `DECIMAL` | [Decimal](../data_types/decimal.md) | + +ClickHouse soporta la precisión configurable de la `Decimal` tipo. El `INSERT` consulta trata el ORC `DECIMAL` tipo como el ClickHouse `Decimal128` tipo. + +Tipos de datos ORC no admitidos: `DATE32`, `TIME32`, `FIXED_SIZE_BINARY`, `JSON`, `UUID`, `ENUM`. + +Los tipos de datos de las columnas de tabla ClickHouse no tienen que coincidir con los campos de datos ORC correspondientes. Al insertar datos, ClickHouse interpreta los tipos de datos de acuerdo con la tabla anterior y luego [elenco](../query_language/functions/type_conversion_functions/#type_conversion_function-cast) los datos al tipo de datos establecido para la columna de tabla ClickHouse. + +### Insertar datos {#inserting-data-2} + +Puede insertar datos ORC de un archivo en la tabla ClickHouse mediante el siguiente comando: + +``` bash +$ cat filename.orc | clickhouse-client --query="INSERT INTO some_table FORMAT ORC" +``` + +Para intercambiar datos con Hadoop, puede usar [Motor de mesa HDFS](../operations/table_engines/hdfs.md). + +## Esquema de formato {#formatschema} + +El valor establece el nombre de archivo que contiene el esquema de formato `format_schema`. +Es necesario establecer esta configuración cuando se utiliza uno de los formatos `Cap'n Proto` y `Protobuf`. +El esquema de formato es una combinación de un nombre de archivo y el nombre de un tipo de mensaje en este archivo, delimitado por dos puntos, +e.g. `schemafile.proto:MessageType`. +Si el archivo tiene la extensión estándar para el formato (por ejemplo, `.proto` para `Protobuf`), +se puede omitir y en este caso, el esquema de formato se ve así `schemafile:MessageType`. + +Si introduce o emite datos a través del [cliente](../interfaces/cli.md) en el [modo interactivo](../interfaces/cli.md#cli_usage), el nombre de archivo especificado en el esquema de formato +puede contener una ruta absoluta o una ruta relativa al directorio actual en el cliente. +Si utiliza el cliente en el [modo por lotes](../interfaces/cli.md#cli_usage), la ruta de acceso al esquema debe ser relativa por razones de seguridad. + +Si introduce o emite datos a través del [Interfaz HTTP](../interfaces/http.md) el nombre de archivo especificado en el esquema de formato +debe estar ubicado en el directorio especificado en [format\_schema\_path](../operations/server_settings/settings.md#server_settings-format_schema_path) +en la configuración del servidor. + +## Salto de errores {#skippingerrors} + +Algunos formatos como `CSV`, `TabSeparated`, `TSKV`, `JSONEachRow`, `Template`, `CustomSeparated` y `Protobuf` puede omitir la fila rota si se produjo un error de análisis y continuar el análisis desde el comienzo de la siguiente fila. Ver [Entrada\_format\_allow\_errors\_num](../operations/settings/settings.md#settings-input_format_allow_errors_num) y +[Entrada\_format\_allow\_errors\_ratio](../operations/settings/settings.md#settings-input_format_allow_errors_ratio) configuración. +Limitacion: +- En caso de error de análisis `JSONEachRow` omite todos los datos hasta la nueva línea (o EOF), por lo que las filas deben estar delimitadas por `\n` para contar los errores correctamente. +- `Template` y `CustomSeparated` use el delimitador después de la última columna y el delimitador entre filas para encontrar el comienzo de la siguiente fila, por lo que omitir errores solo funciona si al menos uno de ellos no está vacío. + +[Artículo Original](https://clickhouse.tech/docs/en/interfaces/formats/) diff --git a/docs/es/interfaces/http.md b/docs/es/interfaces/http.md index 5d45c3755e5..1097d787a51 100644 --- a/docs/es/interfaces/http.md +++ b/docs/es/interfaces/http.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Interfaz HTTP {#http-interface} La interfaz HTTP le permite usar ClickHouse en cualquier plataforma desde cualquier lenguaje de programación. Lo usamos para trabajar desde Java y Perl, así como scripts de shell. En otros departamentos, la interfaz HTTP se usa desde Perl, Python y Go. La interfaz HTTP es más limitada que la interfaz nativa, pero tiene una mejor compatibilidad. diff --git a/docs/es/interfaces/index.md b/docs/es/interfaces/index.md index e0b5257a280..2bc67a3425c 100644 --- a/docs/es/interfaces/index.md +++ b/docs/es/interfaces/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Interfaz {#interfaces} ClickHouse proporciona dos interfaces de red (ambas se pueden ajustar opcionalmente en TLS para mayor seguridad): diff --git a/docs/es/interfaces/jdbc.md b/docs/es/interfaces/jdbc.md index 3f155da865e..2069c78dff2 100644 --- a/docs/es/interfaces/jdbc.md +++ b/docs/es/interfaces/jdbc.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Controlador JDBC {#jdbc-driver} - **[Conductor oficial](https://github.com/ClickHouse/clickhouse-jdbc)** diff --git a/docs/es/interfaces/mysql.md b/docs/es/interfaces/mysql.md index cedbac38e4d..bd3e56cf61c 100644 --- a/docs/es/interfaces/mysql.md +++ b/docs/es/interfaces/mysql.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Interfaz de MySQL {#mysql-interface} ClickHouse soporta el protocolo de cable MySQL. Puede ser habilitado por [mysql\_port](../operations/server_settings/settings.md#server_settings-mysql_port) configuración en el archivo de configuración: diff --git a/docs/es/interfaces/odbc.md b/docs/es/interfaces/odbc.md index 8e221d4919c..e5ca03e61d2 100644 --- a/docs/es/interfaces/odbc.md +++ b/docs/es/interfaces/odbc.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Conductor ODBC {#odbc-driver} - [Conductor oficial](https://github.com/ClickHouse/clickhouse-odbc). diff --git a/docs/es/interfaces/tcp.md b/docs/es/interfaces/tcp.md index 87f91719463..660f506ee04 100644 --- a/docs/es/interfaces/tcp.md +++ b/docs/es/interfaces/tcp.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Interfaz nativa (TCP) {#native-interface-tcp} El protocolo nativo se utiliza en el [cliente de línea de comandos](cli.md), para la comunicación entre servidores durante el procesamiento de consultas distribuidas, y también en otros programas de C, Desafortunadamente, el protocolo nativo de ClickHouse aún no tiene especificaciones formales, pero puede ser diseñado de manera inversa desde el código fuente de ClickHouse (comenzando [por aquí](https://github.com/ClickHouse/ClickHouse/tree/master/dbms/src/Client)) y/o mediante la interceptación y el análisis del tráfico TCP. diff --git a/docs/es/interfaces/third-party/client_libraries.md b/docs/es/interfaces/third-party/client_libraries.md index ff66962f87b..96dd21d1f9d 100644 --- a/docs/es/interfaces/third-party/client_libraries.md +++ b/docs/es/interfaces/third-party/client_libraries.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Bibliotecas de clientes de desarrolladores de terceros {#client-libraries-from-third-party-developers} !!! warning "Descargo" diff --git a/docs/es/interfaces/third-party/gui.md b/docs/es/interfaces/third-party/gui.md index 1148825c0f9..909b078505d 100644 --- a/docs/es/interfaces/third-party/gui.md +++ b/docs/es/interfaces/third-party/gui.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Interfaces visuales de desarrolladores de terceros {#visual-interfaces-from-third-party-developers} ## De código abierto {#open-source} diff --git a/docs/es/interfaces/third-party/integrations.md b/docs/es/interfaces/third-party/integrations.md index 2a88fafa5be..2d6e525e0bf 100644 --- a/docs/es/interfaces/third-party/integrations.md +++ b/docs/es/interfaces/third-party/integrations.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Bibliotecas de integración de desarrolladores externos {#integration-libraries-from-third-party-developers} !!! warning "Descargo" diff --git a/docs/es/interfaces/third-party/proxy.md b/docs/es/interfaces/third-party/proxy.md index 49f165a4a09..29e0773e3d8 100644 --- a/docs/es/interfaces/third-party/proxy.md +++ b/docs/es/interfaces/third-party/proxy.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Servidores proxy de desarrolladores de terceros {#proxy-servers-from-third-party-developers} ## chproxy {#chproxy} diff --git a/docs/es/introduction/adopters.md b/docs/es/introduction/adopters.md index eab07cbe893..5d23e3f1017 100644 --- a/docs/es/introduction/adopters.md +++ b/docs/es/introduction/adopters.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Adoptadores de ClickHouse {#clickhouse-adopters} !!! warning "Descargo" diff --git a/docs/es/introduction/distinctive_features.md b/docs/es/introduction/distinctive_features.md index 0e53b8935cd..ed071705e8e 100644 --- a/docs/es/introduction/distinctive_features.md +++ b/docs/es/introduction/distinctive_features.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Características distintivas de ClickHouse {#distinctive-features-of-clickhouse} ## DBMS orientado a columnas verdaderas {#true-column-oriented-dbms} diff --git a/docs/es/introduction/features_considered_disadvantages.md b/docs/es/introduction/features_considered_disadvantages.md index 0a9f56083c4..1e615f9caaf 100644 --- a/docs/es/introduction/features_considered_disadvantages.md +++ b/docs/es/introduction/features_considered_disadvantages.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Características de ClickHouse que pueden considerarse desventajas {#clickhouse-features-that-can-be-considered-disadvantages} 1. No hay transacciones completas. diff --git a/docs/es/introduction/history.md b/docs/es/introduction/history.md index 469b084454b..bd50e867d29 100644 --- a/docs/es/introduction/history.md +++ b/docs/es/introduction/history.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Historial de ClickHouse {#clickhouse-history} ClickHouse fue desarrollado originalmente para alimentar [El Yandex.Métrica](https://metrica.yandex.com/), [la segunda plataforma de análisis web más grande del mundo](http://w3techs.com/technologies/overview/traffic_analysis/all), y sigue siendo el componente central de este sistema. Con más de 13 billones de registros en la base de datos y más de 20 mil millones de eventos diarios, ClickHouse permite generar informes personalizados sobre la marcha directamente a partir de datos no agregados. Este artículo cubre brevemente los objetivos de ClickHouse en las primeras etapas de su desarrollo. diff --git a/docs/es/introduction/performance.md b/docs/es/introduction/performance.md index a819e285369..4c2dfa971e0 100644 --- a/docs/es/introduction/performance.md +++ b/docs/es/introduction/performance.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Rendimiento {#performance} De acuerdo con los resultados de las pruebas internas en Yandex, ClickHouse muestra el mejor rendimiento (tanto el mayor rendimiento para consultas largas como la menor latencia en consultas cortas) para escenarios operativos comparables entre los sistemas de su clase que estaban disponibles para pruebas. Puede ver los resultados de la prueba en un [página separada](https://clickhouse.tech/benchmark.html). diff --git a/docs/es/operations/access_rights.md b/docs/es/operations/access_rights.md index 1e60285c259..9006ade40dd 100644 --- a/docs/es/operations/access_rights.md +++ b/docs/es/operations/access_rights.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Derechos de acceso {#access-rights} Los usuarios y los derechos de acceso se configuran en la configuración del usuario. Esto suele ser `users.xml`. diff --git a/docs/es/operations/backup.md b/docs/es/operations/backup.md index 94eaa606052..5f1ffc79648 100644 --- a/docs/es/operations/backup.md +++ b/docs/es/operations/backup.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Copia de seguridad de datos {#data-backup} Mientras [replicación](table_engines/replication.md) proporciona protección contra fallas de hardware, no protege contra errores humanos: eliminación accidental de datos, eliminación de la tabla incorrecta o una tabla en el clúster incorrecto y errores de software que resultan en un procesamiento incorrecto de datos o daños en los datos. En muchos casos, errores como estos afectarán a todas las réplicas. ClickHouse tiene protecciones integradas para evitar algunos tipos de errores, por ejemplo, de forma predeterminada [no puede simplemente colocar tablas con un motor similar a MergeTree que contenga más de 50 Gb de datos](https://github.com/ClickHouse/ClickHouse/blob/v18.14.18-stable/dbms/programs/server/config.xml#L322-L330). Sin embargo, estas garantías no cubren todos los casos posibles y pueden eludirse. diff --git a/docs/es/operations/configuration_files.md b/docs/es/operations/configuration_files.md index 16df7afdaae..af508217469 100644 --- a/docs/es/operations/configuration_files.md +++ b/docs/es/operations/configuration_files.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Archivos de configuración {#configuration_files} ClickHouse admite la administración de configuración de varios archivos. El archivo de configuración del servidor principal es `/etc/clickhouse-server/config.xml`. Otros archivos deben estar en el `/etc/clickhouse-server/config.d` Directorio. diff --git a/docs/es/operations/index.md b/docs/es/operations/index.md index aaa98a6bf05..78c89f786f3 100644 --- a/docs/es/operations/index.md +++ b/docs/es/operations/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Operación {#operations} El manual de operaciones de ClickHouse consta de las siguientes secciones principales: diff --git a/docs/es/operations/monitoring.md b/docs/es/operations/monitoring.md index 0584ed258fa..4729796dc83 100644 --- a/docs/es/operations/monitoring.md +++ b/docs/es/operations/monitoring.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Monitoreo {#monitoring} Usted puede monitorear: diff --git a/docs/es/operations/performance/sampling_query_profiler.md b/docs/es/operations/performance/sampling_query_profiler.md index 639dbfe972e..cf12c2b2e5a 100644 --- a/docs/es/operations/performance/sampling_query_profiler.md +++ b/docs/es/operations/performance/sampling_query_profiler.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Analizador de consultas de muestreo {#sampling-query-profiler} ClickHouse ejecuta el generador de perfiles de muestreo que permite analizar la ejecución de consultas. Utilizando el generador de perfiles puede encontrar rutinas de código fuente que se utilizan con más frecuencia durante la ejecución de la consulta. Puede rastrear el tiempo de CPU y el tiempo de reloj de pared invertido, incluido el tiempo de inactividad. diff --git a/docs/es/operations/performance_test.md b/docs/es/operations/performance_test.md index 95bbef1be6c..62e5078691b 100644 --- a/docs/es/operations/performance_test.md +++ b/docs/es/operations/performance_test.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cómo probar su hardware con ClickHouse {#how-to-test-your-hardware-with-clickhouse} Con esta instrucción, puede ejecutar una prueba de rendimiento básica de ClickHouse en cualquier servidor sin instalar paquetes de ClickHouse. diff --git a/docs/es/operations/quotas.md b/docs/es/operations/quotas.md index 89955f2b84a..4b53db1bbd0 100644 --- a/docs/es/operations/quotas.md +++ b/docs/es/operations/quotas.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Cuota {#quotas} Las cuotas le permiten limitar el uso de recursos durante un período de tiempo, o simplemente realizar un seguimiento del uso de recursos. diff --git a/docs/es/operations/requirements.md b/docs/es/operations/requirements.md index 43c21fa14a7..2aea6ba9a0c 100644 --- a/docs/es/operations/requirements.md +++ b/docs/es/operations/requirements.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Requisito {#requirements} ## CPU {#cpu} diff --git a/docs/es/operations/server_settings/index.md b/docs/es/operations/server_settings/index.md index 6fe199aaf89..f98b4c8b788 100644 --- a/docs/es/operations/server_settings/index.md +++ b/docs/es/operations/server_settings/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Parámetros de configuración del servidor {#server-settings} Esta sección contiene descripciones de la configuración del servidor que no se puede cambiar en el nivel de sesión o consulta. diff --git a/docs/es/operations/server_settings/settings.md b/docs/es/operations/server_settings/settings.md index 73791250c5b..6c9c74592bd 100644 --- a/docs/es/operations/server_settings/settings.md +++ b/docs/es/operations/server_settings/settings.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Configuración del servidor {#server-settings} ## builtin\_dictionaries\_reload\_interval {#builtin-dictionaries-reload-interval} diff --git a/docs/es/operations/settings/constraints_on_settings.md b/docs/es/operations/settings/constraints_on_settings.md index 941fc8fc693..a67f6b38a54 100644 --- a/docs/es/operations/settings/constraints_on_settings.md +++ b/docs/es/operations/settings/constraints_on_settings.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Restricciones en la configuración {#constraints-on-settings} Las restricciones en los ajustes se pueden definir en el `profiles` sección de la `user.xml` el archivo de configuración y prohíba a los usuarios cambiar algunos de los ajustes `SET` consulta. diff --git a/docs/es/operations/settings/index.md b/docs/es/operations/settings/index.md index 5fcfe99fd3d..a62525c786d 100644 --- a/docs/es/operations/settings/index.md +++ b/docs/es/operations/settings/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Configuración {#settings} Hay varias formas de realizar todos los ajustes que se describen a continuación. diff --git a/docs/es/operations/settings/permissions_for_queries.md b/docs/es/operations/settings/permissions_for_queries.md index 3aa50ba37d4..5f777aacf16 100644 --- a/docs/es/operations/settings/permissions_for_queries.md +++ b/docs/es/operations/settings/permissions_for_queries.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Permisos para consultas {#permissions_for_queries} Las consultas en ClickHouse se pueden dividir en varios tipos: diff --git a/docs/es/operations/settings/query_complexity.md b/docs/es/operations/settings/query_complexity.md index 452b3d62074..da39fd01a7b 100644 --- a/docs/es/operations/settings/query_complexity.md +++ b/docs/es/operations/settings/query_complexity.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Restricciones en la complejidad de consultas {#restrictions-on-query-complexity} Las restricciones en la complejidad de la consulta forman parte de la configuración. diff --git a/docs/es/operations/settings/settings.md b/docs/es/operations/settings/settings.md index 06a559b4c6e..a28ef316d83 100644 --- a/docs/es/operations/settings/settings.md +++ b/docs/es/operations/settings/settings.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Configuración {#settings} ## distributed\_product\_mode {#distributed-product-mode} diff --git a/docs/es/operations/settings/settings_profiles.md b/docs/es/operations/settings/settings_profiles.md index 056646844af..3bc93b7dc02 100644 --- a/docs/es/operations/settings/settings_profiles.md +++ b/docs/es/operations/settings/settings_profiles.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Perfiles de configuración {#settings-profiles} Un perfil de configuración es una colección de configuraciones agrupadas con el mismo nombre. Cada usuario de ClickHouse tiene un perfil. diff --git a/docs/es/operations/settings/settings_users.md b/docs/es/operations/settings/settings_users.md index 21c389332a3..32d3791b72f 100644 --- a/docs/es/operations/settings/settings_users.md +++ b/docs/es/operations/settings/settings_users.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Configuración del usuario {#user-settings} El `users` sección de la `user.xml` el archivo de configuración contiene la configuración del usuario. diff --git a/docs/es/operations/system_tables.md b/docs/es/operations/system_tables.md index 9fbb4176e28..af073bc0fcc 100644 --- a/docs/es/operations/system_tables.md +++ b/docs/es/operations/system_tables.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Tablas del sistema {#system-tables} Las tablas del sistema se utilizan para implementar parte de la funcionalidad del sistema y para proporcionar acceso a información sobre cómo funciona el sistema. diff --git a/docs/es/operations/table_engines/aggregatingmergetree.md b/docs/es/operations/table_engines/aggregatingmergetree.md index 8cd485831da..9f49f3b76d3 100644 --- a/docs/es/operations/table_engines/aggregatingmergetree.md +++ b/docs/es/operations/table_engines/aggregatingmergetree.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # AgregaciónMergeTree {#aggregatingmergetree} El motor hereda de [Método de codificación de datos:](mergetree.md#table_engines-mergetree), alterando la lógica para la fusión de partes de datos. ClickHouse reemplaza todas las filas con la misma clave principal (o más exactamente, con la misma [clave de clasificación](mergetree.md)) con una sola fila (dentro de una parte de datos) que almacena una combinación de estados de funciones agregadas. diff --git a/docs/es/operations/table_engines/buffer.md b/docs/es/operations/table_engines/buffer.md index a1545297ccf..f05101a485e 100644 --- a/docs/es/operations/table_engines/buffer.md +++ b/docs/es/operations/table_engines/buffer.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Búfer {#buffer} Almacena los datos para escribir en la memoria RAM, enjuagándolos periódicamente a otra tabla. Durante la operación de lectura, los datos se leen desde el búfer y la otra tabla simultáneamente. diff --git a/docs/es/operations/table_engines/collapsingmergetree.md b/docs/es/operations/table_engines/collapsingmergetree.md index 32ac0d64cf9..9a05e0effb7 100644 --- a/docs/es/operations/table_engines/collapsingmergetree.md +++ b/docs/es/operations/table_engines/collapsingmergetree.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # ColapsarMergeTree {#table_engine-collapsingmergetree} El motor hereda de [Método de codificación de datos:](mergetree.md) y agrega la lógica de las filas que colapsan al algoritmo de fusión de partes de datos. diff --git a/docs/es/operations/table_engines/custom_partitioning_key.md b/docs/es/operations/table_engines/custom_partitioning_key.md index 4d043716540..71cfeb52411 100644 --- a/docs/es/operations/table_engines/custom_partitioning_key.md +++ b/docs/es/operations/table_engines/custom_partitioning_key.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Clave de partición personalizada {#custom-partitioning-key} La partición está disponible para el [Método de codificación de datos:](mergetree.md) mesas familiares (incluyendo [repetición](replication.md) tabla). [Vistas materializadas](materializedview.md) basado en tablas MergeTree soporte de particionamiento, también. diff --git a/docs/es/operations/table_engines/dictionary.md b/docs/es/operations/table_engines/dictionary.md index 5ef899d078e..d9c76229517 100644 --- a/docs/es/operations/table_engines/dictionary.md +++ b/docs/es/operations/table_engines/dictionary.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Diccionario {#dictionary} El `Dictionary` el motor muestra el [Diccionario](../../query_language/dicts/external_dicts.md) datos como una tabla ClickHouse. diff --git a/docs/es/operations/table_engines/distributed.md b/docs/es/operations/table_engines/distributed.md index a4b20a4e74d..e47ceee011f 100644 --- a/docs/es/operations/table_engines/distributed.md +++ b/docs/es/operations/table_engines/distributed.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Distribuido {#distributed} **Las tablas con motor distribuido no almacenan ningún dato por sí mismas**, pero permite el procesamiento de consultas distribuidas en varios servidores. diff --git a/docs/es/operations/table_engines/external_data.md b/docs/es/operations/table_engines/external_data.md index a93c3bd3566..1a88dac6729 100644 --- a/docs/es/operations/table_engines/external_data.md +++ b/docs/es/operations/table_engines/external_data.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Datos externos para el procesamiento de consultas {#external-data-for-query-processing} ClickHouse permite enviar a un servidor los datos necesarios para procesar una consulta, junto con una consulta SELECT. Estos datos se colocan en una tabla temporal (consulte la sección “Temporary tables”) y se puede utilizar en la consulta (por ejemplo, en operadores IN). diff --git a/docs/es/operations/table_engines/file.md b/docs/es/operations/table_engines/file.md index 14f97ef910a..dbe9ee7d873 100644 --- a/docs/es/operations/table_engines/file.md +++ b/docs/es/operations/table_engines/file.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # File {#table_engines-file} El motor de tabla de archivos mantiene los datos en un archivo en uno de los [file diff --git a/docs/es/operations/table_engines/generate.md b/docs/es/operations/table_engines/generate.md index b9f027a6162..11993bcc353 100644 --- a/docs/es/operations/table_engines/generate.md +++ b/docs/es/operations/table_engines/generate.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # GenerateRandom {#table_engines-generate} El motor de tabla GenerateRandom produce datos aleatorios para el esquema de tabla determinado. diff --git a/docs/es/operations/table_engines/graphitemergetree.md b/docs/es/operations/table_engines/graphitemergetree.md index 75c27347328..3db9f224807 100644 --- a/docs/es/operations/table_engines/graphitemergetree.md +++ b/docs/es/operations/table_engines/graphitemergetree.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # GraphiteMergeTree {#graphitemergetree} Este motor está diseñado para el adelgazamiento y la agregación / promedio (rollup) [Grafito](http://graphite.readthedocs.io/en/latest/index.html) datos. Puede ser útil para los desarrolladores que desean usar ClickHouse como almacén de datos para Graphite. diff --git a/docs/es/operations/table_engines/hdfs.md b/docs/es/operations/table_engines/hdfs.md index 4ca0292b3bd..48078611bb0 100644 --- a/docs/es/operations/table_engines/hdfs.md +++ b/docs/es/operations/table_engines/hdfs.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # HDFS {#table_engines-hdfs} Este motor proporciona integración con [Acerca de nosotros](https://en.wikipedia.org/wiki/Apache_Hadoop) permitiendo gestionar datos sobre [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)a través de ClickHouse. Este motor es similar diff --git a/docs/es/operations/table_engines/index.md b/docs/es/operations/table_engines/index.md index f43911874bc..de5a13de359 100644 --- a/docs/es/operations/table_engines/index.md +++ b/docs/es/operations/table_engines/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Motores de mesa {#table_engines} El motor de tabla (tipo de tabla) determina: diff --git a/docs/es/operations/table_engines/jdbc.md b/docs/es/operations/table_engines/jdbc.md index eacefe25701..7d6d5649df6 100644 --- a/docs/es/operations/table_engines/jdbc.md +++ b/docs/es/operations/table_engines/jdbc.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # JDBC {#table-engine-jdbc} Permite que ClickHouse se conecte a bases de datos externas a través de [JDBC](https://en.wikipedia.org/wiki/Java_Database_Connectivity). diff --git a/docs/es/operations/table_engines/join.md b/docs/es/operations/table_engines/join.md index 4a21e7f8d6c..65ec4b950a6 100644 --- a/docs/es/operations/table_engines/join.md +++ b/docs/es/operations/table_engines/join.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Unir {#join} Estructura de datos preparada para usar en [UNIR](../../query_language/select.md#select-join) operación. diff --git a/docs/es/operations/table_engines/kafka.md b/docs/es/operations/table_engines/kafka.md index 54b211c3115..40bd3ce2578 100644 --- a/docs/es/operations/table_engines/kafka.md +++ b/docs/es/operations/table_engines/kafka.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Kafka {#kafka} Este motor funciona con [Acerca de nosotros](http://kafka.apache.org/). diff --git a/docs/es/operations/table_engines/log.md b/docs/es/operations/table_engines/log.md index 8e029f45408..595e2532d45 100644 --- a/docs/es/operations/table_engines/log.md +++ b/docs/es/operations/table_engines/log.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Registro {#log} El motor pertenece a la familia de motores de registro. Consulte las propiedades comunes de los motores de registro y sus diferencias en [Familia del motor de registro](log_family.md) artículo. diff --git a/docs/es/operations/table_engines/log_family.md b/docs/es/operations/table_engines/log_family.md index 0f9d77ee062..1a2b3f2bb70 100644 --- a/docs/es/operations/table_engines/log_family.md +++ b/docs/es/operations/table_engines/log_family.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Familia del motor de registro {#log-engine-family} Estos motores fueron desarrollados para escenarios en los que necesita escribir rápidamente muchas tablas pequeñas (hasta aproximadamente 1 millón de filas) y leerlas más tarde en su conjunto. diff --git a/docs/es/operations/table_engines/materializedview.md b/docs/es/operations/table_engines/materializedview.md index 4e12075c542..d40213a4d18 100644 --- a/docs/es/operations/table_engines/materializedview.md +++ b/docs/es/operations/table_engines/materializedview.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Método de codificación de datos: {#materializedview} Se utiliza para implementar vistas materializadas (para obtener más información, consulte [CREAR TABLA](../../query_language/create.md)). Para almacenar datos, utiliza un motor diferente que se especificó al crear la vista. Al leer desde una tabla, solo usa este motor. diff --git a/docs/es/operations/table_engines/memory.md b/docs/es/operations/table_engines/memory.md index 333d74ccd9b..66b1a79c4e4 100644 --- a/docs/es/operations/table_engines/memory.md +++ b/docs/es/operations/table_engines/memory.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Memoria {#memory} El motor de memoria almacena datos en RAM, en forma sin comprimir. Los datos se almacenan exactamente en la misma forma en que se reciben cuando se leen. En otras palabras, la lectura de esta tabla es completamente gratuita. diff --git a/docs/es/operations/table_engines/merge.md b/docs/es/operations/table_engines/merge.md index 33789b56570..7147a55b975 100644 --- a/docs/es/operations/table_engines/merge.md +++ b/docs/es/operations/table_engines/merge.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Fusionar {#merge} El `Merge` motor (no debe confundirse con `MergeTree`) no almacena datos en sí, pero permite leer de cualquier número de otras tablas simultáneamente. diff --git a/docs/es/operations/table_engines/mergetree.md b/docs/es/operations/table_engines/mergetree.md index 53f16e3904e..53d89427ee0 100644 --- a/docs/es/operations/table_engines/mergetree.md +++ b/docs/es/operations/table_engines/mergetree.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Método de codificación de datos: {#table_engines-mergetree} El `MergeTree` motor y otros motores de esta familia (`*MergeTree`) son los motores de mesa ClickHouse más robustos. diff --git a/docs/es/operations/table_engines/mysql.md b/docs/es/operations/table_engines/mysql.md index 3ce17a02837..bb7d3016221 100644 --- a/docs/es/operations/table_engines/mysql.md +++ b/docs/es/operations/table_engines/mysql.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # MySQL {#mysql} El motor MySQL le permite realizar `SELECT` Consultas sobre datos almacenados en un servidor MySQL remoto. diff --git a/docs/es/operations/table_engines/null.md b/docs/es/operations/table_engines/null.md index 39bec0533f5..7915af8e108 100644 --- a/docs/es/operations/table_engines/null.md +++ b/docs/es/operations/table_engines/null.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Nulo {#null} Al escribir en una tabla Null, los datos se ignoran. Al leer desde una tabla Null, la respuesta está vacía. diff --git a/docs/es/operations/table_engines/odbc.md b/docs/es/operations/table_engines/odbc.md index d5bf8fc8492..765d6b814aa 100644 --- a/docs/es/operations/table_engines/odbc.md +++ b/docs/es/operations/table_engines/odbc.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # ODBC {#table-engine-odbc} Permite que ClickHouse se conecte a bases de datos externas a través de [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity). diff --git a/docs/es/operations/table_engines/replacingmergetree.md b/docs/es/operations/table_engines/replacingmergetree.md index 7b59f08223f..149c0211662 100644 --- a/docs/es/operations/table_engines/replacingmergetree.md +++ b/docs/es/operations/table_engines/replacingmergetree.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # ReplacingMergeTree {#replacingmergetree} El motor difiere de [Método de codificación de datos:](mergetree.md#table_engines-mergetree) en que elimina las entradas duplicadas con el mismo valor de clave principal (o más exactamente, con el mismo [clave de clasificación](mergetree.md) de valor). diff --git a/docs/es/operations/table_engines/replication.md b/docs/es/operations/table_engines/replication.md index 143a7aa418f..36f0b877b81 100644 --- a/docs/es/operations/table_engines/replication.md +++ b/docs/es/operations/table_engines/replication.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Replicación de datos {#table_engines-replication} La replicación solo se admite para tablas de la familia MergeTree: diff --git a/docs/es/operations/table_engines/set.md b/docs/es/operations/table_engines/set.md index c56ab0ab96a..4c21397db0f 100644 --- a/docs/es/operations/table_engines/set.md +++ b/docs/es/operations/table_engines/set.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Establecer {#set} Un conjunto de datos que siempre está en la memoria RAM. Está diseñado para su uso en el lado derecho del operador IN (consulte la sección “IN operators”). diff --git a/docs/es/operations/table_engines/stripelog.md b/docs/es/operations/table_engines/stripelog.md index b4b32672cdb..a6131ae5d32 100644 --- a/docs/es/operations/table_engines/stripelog.md +++ b/docs/es/operations/table_engines/stripelog.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # StripeLog {#stripelog} Este motor pertenece a la familia de motores de registro. Consulte las propiedades comunes de los motores de registro y sus diferencias en [Familia del motor de registro](log_family.md) artículo. diff --git a/docs/es/operations/table_engines/summingmergetree.md b/docs/es/operations/table_engines/summingmergetree.md index 2b2fedfe602..dae6f366217 100644 --- a/docs/es/operations/table_engines/summingmergetree.md +++ b/docs/es/operations/table_engines/summingmergetree.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # SummingMergeTree {#summingmergetree} El motor hereda de [Método de codificación de datos:](mergetree.md#table_engines-mergetree). La diferencia es que al fusionar partes de datos para `SummingMergeTree` ClickHouse reemplaza todas las filas con la misma clave primaria (o más exactamente, con la misma [clave de clasificación](mergetree.md)) con una fila que contiene valores resumidos para las columnas con el tipo de datos numérico. Si la clave de ordenación está compuesta de manera que un solo valor de clave corresponde a un gran número de filas, esto reduce significativamente el volumen de almacenamiento y acelera la selección de datos. diff --git a/docs/es/operations/table_engines/tinylog.md b/docs/es/operations/table_engines/tinylog.md index a563d7a523e..1d9ac4c3b73 100644 --- a/docs/es/operations/table_engines/tinylog.md +++ b/docs/es/operations/table_engines/tinylog.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # TinyLog {#tinylog} El motor pertenece a la familia de motores de registro. Ver [Familia del motor de registro](log_family.md) para las propiedades comunes de los motores de registro y sus diferencias. diff --git a/docs/es/operations/table_engines/url.md b/docs/es/operations/table_engines/url.md index 5ccc690670f..d606de56083 100644 --- a/docs/es/operations/table_engines/url.md +++ b/docs/es/operations/table_engines/url.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Nombre de la red inalámbrica (SSID):) {#table_engines-url} Administra datos en un servidor HTTP/HTTPS remoto. Este motor es similar diff --git a/docs/es/operations/table_engines/versionedcollapsingmergetree.md b/docs/es/operations/table_engines/versionedcollapsingmergetree.md index 99a0df0c493..c12c27cef88 100644 --- a/docs/es/operations/table_engines/versionedcollapsingmergetree.md +++ b/docs/es/operations/table_engines/versionedcollapsingmergetree.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # VersionedCollapsingMergeTree {#versionedcollapsingmergetree} Este motor: diff --git a/docs/es/operations/table_engines/view.md b/docs/es/operations/table_engines/view.md index 3fc432ef249..9ff0ec1836e 100644 --- a/docs/es/operations/table_engines/view.md +++ b/docs/es/operations/table_engines/view.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Vista {#table_engines-view} Se utiliza para implementar vistas (para obtener más información, consulte `CREATE VIEW query`). No almacena datos, pero solo almacena los datos especificados `SELECT` consulta. Al leer desde una tabla, ejecuta esta consulta (y elimina todas las columnas innecesarias de la consulta). diff --git a/docs/es/operations/tips.md b/docs/es/operations/tips.md index 3913a6b1909..e07c29a5e5a 100644 --- a/docs/es/operations/tips.md +++ b/docs/es/operations/tips.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Recomendaciones de uso {#usage-recommendations} ## CPU Scaling Governor {#cpu-scaling-governor} diff --git a/docs/es/operations/troubleshooting.md b/docs/es/operations/troubleshooting.md index 4996ee2bebc..d381ef8ffcf 100644 --- a/docs/es/operations/troubleshooting.md +++ b/docs/es/operations/troubleshooting.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Solución de problemas {#troubleshooting} - [Instalación](#troubleshooting-installation-errors) diff --git a/docs/es/operations/update.md b/docs/es/operations/update.md index d03f6069426..ce93dab08dc 100644 --- a/docs/es/operations/update.md +++ b/docs/es/operations/update.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Actualización de ClickHouse {#clickhouse-update} Si se instaló ClickHouse desde paquetes deb, ejecute los siguientes comandos en el servidor: diff --git a/docs/es/operations/utils/clickhouse-benchmark.md b/docs/es/operations/utils/clickhouse-benchmark.md index f63dc41c67e..9c91d378b98 100644 --- a/docs/es/operations/utils/clickhouse-benchmark.md +++ b/docs/es/operations/utils/clickhouse-benchmark.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Sistema abierto. {#clickhouse-benchmark} Se conecta a un servidor ClickHouse y envía repetidamente las consultas especificadas. diff --git a/docs/es/operations/utils/clickhouse-copier.md b/docs/es/operations/utils/clickhouse-copier.md index c398301998a..caf282c3806 100644 --- a/docs/es/operations/utils/clickhouse-copier.md +++ b/docs/es/operations/utils/clickhouse-copier.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Método de codificación de datos: {#clickhouse-copier} Copia datos de las tablas de un clúster en tablas de otro (o del mismo) clúster. diff --git a/docs/es/operations/utils/clickhouse-local.md b/docs/es/operations/utils/clickhouse-local.md index 0a4cc067170..faad161ba69 100644 --- a/docs/es/operations/utils/clickhouse-local.md +++ b/docs/es/operations/utils/clickhouse-local.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Sistema abierto. {#clickhouse-local} El `clickhouse-local` El programa le permite realizar un procesamiento rápido en archivos locales, sin tener que implementar y configurar el servidor ClickHouse. diff --git a/docs/es/operations/utils/index.md b/docs/es/operations/utils/index.md index b7bee1def34..2911d46f310 100644 --- a/docs/es/operations/utils/index.md +++ b/docs/es/operations/utils/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Utilidad ClickHouse {#clickhouse-utility} - [Sistema abierto.](clickhouse-local.md) — Permite ejecutar consultas SQL en datos sin detener el servidor ClickHouse, similar a cómo `awk` hace esto. diff --git a/docs/es/query_language/agg_functions/combinators.md b/docs/es/query_language/agg_functions/combinators.md index 59216a8aa78..3abe9eb0dcb 100644 --- a/docs/es/query_language/agg_functions/combinators.md +++ b/docs/es/query_language/agg_functions/combinators.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Combinadores de funciones agregadas {#aggregate_functions_combinators} El nombre de una función agregada puede tener un sufijo anexado. Esto cambia la forma en que funciona la función de agregado. diff --git a/docs/es/query_language/agg_functions/index.md b/docs/es/query_language/agg_functions/index.md index f230aa00439..297cefd8d2d 100644 --- a/docs/es/query_language/agg_functions/index.md +++ b/docs/es/query_language/agg_functions/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones agregadas {#aggregate-functions} Las funciones agregadas funcionan en el [normal](http://www.sql-tutorial.com/sql-aggregate-functions-sql-tutorial) forma esperada por los expertos en bases de datos. diff --git a/docs/es/query_language/agg_functions/parametric_functions.md b/docs/es/query_language/agg_functions/parametric_functions.md index 82806bf2636..70703657548 100644 --- a/docs/es/query_language/agg_functions/parametric_functions.md +++ b/docs/es/query_language/agg_functions/parametric_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones agregadas paramétricas {#aggregate_functions_parametric} Algunas funciones agregadas pueden aceptar no solo columnas de argumentos (utilizadas para la compresión), sino un conjunto de parámetros: constantes para la inicialización. La sintaxis es de dos pares de corchetes en lugar de uno. El primero es para parámetros, y el segundo es para argumentos. diff --git a/docs/es/query_language/agg_functions/reference.md b/docs/es/query_language/agg_functions/reference.md deleted file mode 120000 index c5651cb0793..00000000000 --- a/docs/es/query_language/agg_functions/reference.md +++ /dev/null @@ -1 +0,0 @@ -../../../en/query_language/agg_functions/reference.md \ No newline at end of file diff --git a/docs/es/query_language/agg_functions/reference.md b/docs/es/query_language/agg_functions/reference.md new file mode 100644 index 00000000000..467d50ae93f --- /dev/null +++ b/docs/es/query_language/agg_functions/reference.md @@ -0,0 +1,1834 @@ +--- +machine_translated: true +--- + +# Referencia de la función {#function-reference} + +## contar {#agg_function-count} + +Cuenta el número de filas o valores no NULL. + +ClickHouse admite las siguientes sintaxis para `count`: +- `count(expr)` o `COUNT(DISTINCT expr)`. +- `count()` o `COUNT(*)`. El `count()` la sintaxis es específica de ClickHouse. + +**Parámetros** + +La función puede tomar: + +- Cero parámetros. +- Una [expresion](../syntax.md#syntax-expressions). + +**Valor devuelto** + +- Si se llama a la función sin parámetros, cuenta el número de filas. +- Si el [expresion](../syntax.md#syntax-expressions) se pasa, entonces la función cuenta cuántas veces esta expresión devuelve no nula. Si la expresión devuelve un [NULL](../../data_types/nullable.md)-type valor, entonces el resultado de `count` no se queda `Nullable`. La función devuelve 0 si la expresión devuelta `NULL` para todas las filas. + +En ambos casos el tipo del valor devuelto es [UInt64](../../data_types/int_uint.md). + +**Detalles** + +ClickHouse soporta el `COUNT(DISTINCT ...)` sintaxis. El comportamiento de esta construcción depende del [count\_distinct\_implementation](../../operations/settings/settings.md#settings-count_distinct_implementation) configuración. Define cuál de las [uniq\*](#agg_function-uniq) se utiliza para realizar la operación. El valor predeterminado es el [uniqExact](#agg_function-uniqexact) función. + +El `SELECT count() FROM table` consulta no está optimizado, porque el número de entradas en la tabla no se almacena por separado. Elige una pequeña columna de la tabla y cuenta el número de valores en ella. + +**Ejemplos** + +Ejemplo 1: + +``` sql +SELECT count() FROM t +``` + +``` text +┌─count()─┐ +│ 5 │ +└─────────┘ +``` + +Ejemplo 2: + +``` sql +SELECT name, value FROM system.settings WHERE name = 'count_distinct_implementation' +``` + +``` text +┌─name──────────────────────────┬─value─────┐ +│ count_distinct_implementation │ uniqExact │ +└───────────────────────────────┴───────────┘ +``` + +``` sql +SELECT count(DISTINCT num) FROM t +``` + +``` text +┌─uniqExact(num)─┐ +│ 3 │ +└────────────────┘ +``` + +Este ejemplo muestra que `count(DISTINCT num)` se realiza por el `uniqExact` función según el `count_distinct_implementation` valor de ajuste. + +## cualquiera (x) {#agg_function-any} + +Selecciona el primer valor encontrado. +La consulta se puede ejecutar en cualquier orden e incluso en un orden diferente cada vez, por lo que el resultado de esta función es indeterminado. +Para obtener un resultado determinado, puede usar el ‘min’ o ‘max’ función en lugar de ‘any’. + +En algunos casos, puede confiar en el orden de ejecución. Esto se aplica a los casos en que SELECT proviene de una subconsulta que usa ORDER BY. + +Cuando un `SELECT` consulta tiene el `GROUP BY` cláusula o al menos una función agregada, ClickHouse (en contraste con MySQL) requiere que todas las expresiones `SELECT`, `HAVING`, y `ORDER BY` las cláusulas pueden calcularse a partir de claves o de funciones agregadas. En otras palabras, cada columna seleccionada de la tabla debe usarse en claves o dentro de funciones agregadas. Para obtener un comportamiento como en MySQL, puede colocar las otras columnas en el `any` función de agregado. + +## Cualquier pesado (x) {#anyheavyx} + +Selecciona un valor que ocurre con frecuencia [pesos pesados](http://www.cs.umd.edu/~samir/498/karp.pdf) algoritmo. Si hay un valor que se produce más de la mitad de los casos en cada uno de los subprocesos de ejecución de la consulta, se devuelve este valor. Normalmente, el resultado es no determinista. + +``` sql +anyHeavy(column) +``` + +**Argumento** + +- `column` – The column name. + +**Ejemplo** + +Tome el [A tiempo](../../getting_started/example_datasets/ontime.md) conjunto de datos y seleccione cualquier valor que ocurra con frecuencia `AirlineID` columna. + +``` sql +SELECT anyHeavy(AirlineID) AS res +FROM ontime +``` + +``` text +┌───res─┐ +│ 19690 │ +└───────┘ +``` + +## Cualquier último (x) {#anylastx} + +Selecciona el último valor encontrado. +El resultado es tan indeterminado como para el `any` función. + +## Método de codificación de datos: {#groupbitand} + +Se aplica bit a bit `AND` para la serie de números. + +``` sql +groupBitAnd(expr) +``` + +**Parámetros** + +`expr` – An expression that results in `UInt*` tipo. + +**Valor de retorno** + +Valor de la `UInt*` tipo. + +**Ejemplo** + +Datos de prueba: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +Consulta: + +``` sql +SELECT groupBitAnd(num) FROM t +``` + +Donde `num` es la columna con los datos de prueba. + +Resultado: + +``` text +binary decimal +00000100 = 4 +``` + +## GrupoBitO {#groupbitor} + +Se aplica bit a bit `OR` para la serie de números. + +``` sql +groupBitOr(expr) +``` + +**Parámetros** + +`expr` – An expression that results in `UInt*` tipo. + +**Valor de retorno** + +Valor de la `UInt*` tipo. + +**Ejemplo** + +Datos de prueba: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +Consulta: + +``` sql +SELECT groupBitOr(num) FROM t +``` + +Donde `num` es la columna con los datos de prueba. + +Resultado: + +``` text +binary decimal +01111101 = 125 +``` + +## GrupoBitXor {#groupbitxor} + +Se aplica bit a bit `XOR` para la serie de números. + +``` sql +groupBitXor(expr) +``` + +**Parámetros** + +`expr` – An expression that results in `UInt*` tipo. + +**Valor de retorno** + +Valor de la `UInt*` tipo. + +**Ejemplo** + +Datos de prueba: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +Consulta: + +``` sql +SELECT groupBitXor(num) FROM t +``` + +Donde `num` es la columna con los datos de prueba. + +Resultado: + +``` text +binary decimal +01101000 = 104 +``` + +## Método de codificación de datos: {#groupbitmap} + +Mapa de bits o cálculos agregados de una columna entera sin signo, devuelve cardinalidad de tipo UInt64, si agrega el sufijo -State, luego devuelve [objeto de mapa de bits](../functions/bitmap_functions.md). + +``` sql +groupBitmap(expr) +``` + +**Parámetros** + +`expr` – An expression that results in `UInt*` tipo. + +**Valor de retorno** + +Valor de la `UInt64` tipo. + +**Ejemplo** + +Datos de prueba: + +``` text +UserID +1 +1 +2 +3 +``` + +Consulta: + +``` sql +SELECT groupBitmap(UserID) as num FROM t +``` + +Resultado: + +``` text +num +3 +``` + +## Mínimo (x) {#agg_function-min} + +Calcula el mínimo. + +## máximo (x) {#agg_function-max} + +Calcula el máximo. + +## ¿Cómo puedo hacerlo?) {#agg-function-argmin} + +Calcula el ‘arg’ para un valor mínimo ‘val’ valor. Si hay varios valores diferentes de ‘arg’ para valores mínimos de ‘val’, el primero de estos valores encontrados es la salida. + +**Ejemplo:** + +``` text +┌─user─────┬─salary─┐ +│ director │ 5000 │ +│ manager │ 3000 │ +│ worker │ 1000 │ +└──────────┴────────┘ +``` + +``` sql +SELECT argMin(user, salary) FROM salary +``` + +``` text +┌─argMin(user, salary)─┐ +│ worker │ +└──────────────────────┘ +``` + +## Descripción) {#agg-function-argmax} + +Calcula el ‘arg’ para un valor máximo ‘val’ valor. Si hay varios valores diferentes de ‘arg’ para valores máximos de ‘val’, el primero de estos valores encontrados es la salida. + +## suma (x) {#agg_function-sum} + +Calcula la suma. +Solo funciona para números. + +## ¿Cómo puedo obtener más información?) {#sumwithoverflowx} + +Calcula la suma de los números, utilizando el mismo tipo de datos para el resultado que para los parámetros de entrada. Si la suma supera el valor máximo para este tipo de datos, la función devuelve un error. + +Solo funciona para números. + +## sumMap(clave, valor) {#agg_functions-summap} + +Totals el ‘value’ matriz de acuerdo con las claves especificadas en el ‘key’ matriz. +El número de elementos en ‘key’ y ‘value’ debe ser el mismo para cada fila que se sume. +Returns a tuple of two arrays: keys in sorted order, and values ​​summed for the corresponding keys. + +Ejemplo: + +``` sql +CREATE TABLE sum_map( + date Date, + timeslot DateTime, + statusMap Nested( + status UInt16, + requests UInt64 + ) +) ENGINE = Log; +INSERT INTO sum_map VALUES + ('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10]); +SELECT + timeslot, + sumMap(statusMap.status, statusMap.requests) +FROM sum_map +GROUP BY timeslot +``` + +``` text +┌────────────timeslot─┬─sumMap(statusMap.status, statusMap.requests)─┐ +│ 2000-01-01 00:00:00 │ ([1,2,3,4,5],[10,10,20,10,10]) │ +│ 2000-01-01 00:01:00 │ ([4,5,6,7,8],[10,10,20,10,10]) │ +└─────────────────────┴──────────────────────────────────────────────┘ +``` + +## SkewPop {#skewpop} + +Calcula el [la asimetría](https://en.wikipedia.org/wiki/Skewness) de una secuencia. + +``` sql +skewPop(expr) +``` + +**Parámetros** + +`expr` — [Expresion](../syntax.md#syntax-expressions) devolviendo un número. + +**Valor devuelto** + +The skewness of the given distribution. Type — [Float64](../../data_types/float.md) + +**Ejemplo** + +``` sql +SELECT skewPop(value) FROM series_with_value_column +``` + +## Sistema abierto. {#skewsamp} + +Calcula el [asimetría de la muestra](https://en.wikipedia.org/wiki/Skewness) de una secuencia. + +Representa una estimación imparcial de la asimetría de una variable aleatoria si los valores pasados forman su muestra. + +``` sql +skewSamp(expr) +``` + +**Parámetros** + +`expr` — [Expresion](../syntax.md#syntax-expressions) devolviendo un número. + +**Valor devuelto** + +The skewness of the given distribution. Type — [Float64](../../data_types/float.md). Si `n <= 1` (`n` es el tamaño de la muestra), luego la función devuelve `nan`. + +**Ejemplo** + +``` sql +SELECT skewSamp(value) FROM series_with_value_column +``` + +## KurtPop {#kurtpop} + +Calcula el [curtosis](https://en.wikipedia.org/wiki/Kurtosis) de una secuencia. + +``` sql +kurtPop(expr) +``` + +**Parámetros** + +`expr` — [Expresion](../syntax.md#syntax-expressions) devolviendo un número. + +**Valor devuelto** + +The kurtosis of the given distribution. Type — [Float64](../../data_types/float.md) + +**Ejemplo** + +``` sql +SELECT kurtPop(value) FROM series_with_value_column +``` + +## KurtSamp {#kurtsamp} + +Calcula el [curtosis muestra](https://en.wikipedia.org/wiki/Kurtosis) de una secuencia. + +Representa una estimación imparcial de la curtosis de una variable aleatoria si los valores pasados forman su muestra. + +``` sql +kurtSamp(expr) +``` + +**Parámetros** + +`expr` — [Expresion](../syntax.md#syntax-expressions) devolviendo un número. + +**Valor devuelto** + +The kurtosis of the given distribution. Type — [Float64](../../data_types/float.md). Si `n <= 1` (`n` es un tamaño de la muestra), luego la función devuelve `nan`. + +**Ejemplo** + +``` sql +SELECT kurtSamp(value) FROM series_with_value_column +``` + +## Para obtener más información, consulta nuestra Política de privacidad y nuestras Condiciones de uso) {#agg-function-timeseriesgroupsum} + +`timeSeriesGroupSum` puede agregar diferentes series de tiempo que muestran la marca de tiempo no la alineación. +Utilizará la interpolación lineal entre dos marcas de tiempo de muestra y luego sumará series temporales juntas. + +- `uid` es la identificación única de la serie temporal, `UInt64`. +- `timestamp` es el tipo Int64 para admitir milisegundos o microsegundos. +- `value` es la métrica. + +La función devuelve una matriz de tuplas con `(timestamp, aggregated_value)` par. + +Antes de utilizar esta función, asegúrese de `timestamp` está en orden ascendente. + +Ejemplo: + +``` text +┌─uid─┬─timestamp─┬─value─┐ +│ 1 │ 2 │ 0.2 │ +│ 1 │ 7 │ 0.7 │ +│ 1 │ 12 │ 1.2 │ +│ 1 │ 17 │ 1.7 │ +│ 1 │ 25 │ 2.5 │ +│ 2 │ 3 │ 0.6 │ +│ 2 │ 8 │ 1.6 │ +│ 2 │ 12 │ 2.4 │ +│ 2 │ 18 │ 3.6 │ +│ 2 │ 24 │ 4.8 │ +└─────┴───────────┴───────┘ +``` + +``` sql +CREATE TABLE time_series( + uid UInt64, + timestamp Int64, + value Float64 +) ENGINE = Memory; +INSERT INTO time_series VALUES + (1,2,0.2),(1,7,0.7),(1,12,1.2),(1,17,1.7),(1,25,2.5), + (2,3,0.6),(2,8,1.6),(2,12,2.4),(2,18,3.6),(2,24,4.8); + +SELECT timeSeriesGroupSum(uid, timestamp, value) +FROM ( + SELECT * FROM time_series order by timestamp ASC +); +``` + +Y el resultado será: + +``` text +[(2,0.2),(3,0.9),(7,2.1),(8,2.4),(12,3.6),(17,5.1),(18,5.4),(24,7.2),(25,2.5)] +``` + +## También puede utilizar el siguiente ejemplo:) {#agg-function-timeseriesgroupratesum} + +Del mismo modo timeSeriesGroupRateSum, timeSeriesGroupRateSum calculará la tasa de series temporales y luego sumará las tasas juntas. +Además, la marca de tiempo debe estar en orden ascendente antes de usar esta función. + +Use esta función, el resultado anterior será: + +``` text +[(2,0),(3,0.1),(7,0.3),(8,0.3),(12,0.3),(17,0.3),(18,0.3),(24,0.3),(25,0.1)] +``` + +## Acerca de) {#agg_function-avg} + +Calcula el promedio. +Solo funciona para números. +El resultado es siempre Float64. + +## uniq {#agg_function-uniq} + +Calcula el número aproximado de diferentes valores del argumento. + +``` sql +uniq(x[, ...]) +``` + +**Parámetros** + +La función toma un número variable de parámetros. Los parámetros pueden ser `Tuple`, `Array`, `Date`, `DateTime`, `String`, o tipos numéricos. + +**Valor devuelto** + +- A [UInt64](../../data_types/int_uint.md)-tipo número. + +**Detalles de implementación** + +Función: + +- Calcula un hash para todos los parámetros en el agregado, luego lo usa en los cálculos. + +- Utiliza un algoritmo de muestreo adaptativo. Para el estado de cálculo, la función utiliza una muestra de valores hash de elemento de hasta 65536. + + This algorithm is very accurate and very efficient on the CPU. When the query contains several of these functions, using `uniq` is almost as fast as using other aggregate functions. + +- Proporciona el resultado de forma determinista (no depende del orden de procesamiento de la consulta). + +Recomendamos usar esta función en casi todos los escenarios. + +**Ver también** + +- [uniqCombined](#agg_function-uniqcombined) +- [UniqCombined64](#agg_function-uniqcombined64) +- [uniqHLL12](#agg_function-uniqhll12) +- [uniqExact](#agg_function-uniqexact) + +## uniqCombined {#agg_function-uniqcombined} + +Calcula el número aproximado de diferentes valores de argumento. + +``` sql +uniqCombined(HLL_precision)(x[, ...]) +``` + +El `uniqCombined` es una buena opción para calcular el número de valores diferentes. + +**Parámetros** + +La función toma un número variable de parámetros. Los parámetros pueden ser `Tuple`, `Array`, `Date`, `DateTime`, `String`, o tipos numéricos. + +`HLL_precision` es el logaritmo base-2 del número de células en [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog). Opcional, puede utilizar la función como `uniqCombined(x[, ...])`. El valor predeterminado para `HLL_precision` es 17, que es efectivamente 96 KiB de espacio (2 ^ 17 celdas, 6 bits cada una). + +**Valor devuelto** + +- Numero [UInt64](../../data_types/int_uint.md)-tipo número. + +**Detalles de implementación** + +Función: + +- Calcula un hash (hash de 64 bits para `String` y 32 bits de lo contrario) para todos los parámetros en el agregado, luego lo usa en los cálculos. + +- Utiliza una combinación de tres algoritmos: matriz, tabla hash e HyperLogLog con una tabla de corrección de errores. + + For a small number of distinct elements, an array is used. When the set size is larger, a hash table is used. For a larger number of elements, HyperLogLog is used, which will occupy a fixed amount of memory. + +- Proporciona el resultado de forma determinista (no depende del orden de procesamiento de la consulta). + +!!! note "Nota" + Dado que usa hash de 32 bits para no-`String` tipo, el resultado tendrá un error muy alto para cardinalidades significativamente mayores que `UINT_MAX` (el error aumentará rápidamente después de unas pocas decenas de miles de millones de valores distintos), por lo tanto, en este caso debe usar [UniqCombined64](#agg_function-uniqcombined64) + +En comparación con el [uniq](#agg_function-uniq) función, el `uniqCombined`: + +- Consume varias veces menos memoria. +- Calcula con una precisión varias veces mayor. +- Por lo general, tiene un rendimiento ligeramente menor. En algunos escenarios, `uniqCombined` puede funcionar mejor que `uniq`, por ejemplo, con consultas distribuidas que transmiten un gran número de estados de agregación a través de la red. + +**Ver también** + +- [uniq](#agg_function-uniq) +- [UniqCombined64](#agg_function-uniqcombined64) +- [uniqHLL12](#agg_function-uniqhll12) +- [uniqExact](#agg_function-uniqexact) + +## UniqCombined64 {#agg_function-uniqcombined64} + +Lo mismo que [uniqCombined](#agg_function-uniqcombined), pero utiliza hash de 64 bits para todos los tipos de datos. + +## uniqHLL12 {#agg_function-uniqhll12} + +Calcula el número aproximado de diferentes valores de argumento [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog) algoritmo. + +``` sql +uniqHLL12(x[, ...]) +``` + +**Parámetros** + +La función toma un número variable de parámetros. Los parámetros pueden ser `Tuple`, `Array`, `Date`, `DateTime`, `String`, o tipos numéricos. + +**Valor devuelto** + +- A [UInt64](../../data_types/int_uint.md)-tipo número. + +**Detalles de implementación** + +Función: + +- Calcula un hash para todos los parámetros en el agregado, luego lo usa en los cálculos. + +- Utiliza el algoritmo HyperLogLog para aproximar el número de valores de argumento diferentes. + + 212 5-bit cells are used. The size of the state is slightly more than 2.5 KB. The result is not very accurate (up to ~10% error) for small data sets (<10K elements). However, the result is fairly accurate for high-cardinality data sets (10K-100M), with a maximum error of ~1.6%. Starting from 100M, the estimation error increases, and the function will return very inaccurate results for data sets with extremely high cardinality (1B+ elements). + +- Proporciona el resultado determinado (no depende del orden de procesamiento de la consulta). + +No recomendamos usar esta función. En la mayoría de los casos, use el [uniq](#agg_function-uniq) o [uniqCombined](#agg_function-uniqcombined) función. + +**Ver también** + +- [uniq](#agg_function-uniq) +- [uniqCombined](#agg_function-uniqcombined) +- [uniqExact](#agg_function-uniqexact) + +## uniqExact {#agg_function-uniqexact} + +Calcula el número exacto de diferentes valores de argumento. + +``` sql +uniqExact(x[, ...]) +``` + +Utilice el `uniqExact` función si necesita absolutamente un resultado exacto. De lo contrario, use el [uniq](#agg_function-uniq) función. + +El `uniqExact` función utiliza más memoria que `uniq`, porque el tamaño del estado tiene un crecimiento ilimitado a medida que aumenta el número de valores diferentes. + +**Parámetros** + +La función toma un número variable de parámetros. Los parámetros pueden ser `Tuple`, `Array`, `Date`, `DateTime`, `String`, o tipos numéricos. + +**Ver también** + +- [uniq](#agg_function-uniq) +- [uniqCombined](#agg_function-uniqcombined) +- [uniqHLL12](#agg_function-uniqhll12) + +## ¿Cómo puedo hacerlo?) {#agg_function-grouparray} + +Crea una matriz de valores de argumento. +Los valores se pueden agregar a la matriz en cualquier orden (indeterminado). + +La segunda versión (con el `max_size` parámetro) limita el tamaño de la matriz resultante a `max_size` elemento. +Por ejemplo, `groupArray (1) (x)` es equivalente a `[any (x)]`. + +En algunos casos, aún puede confiar en el orden de ejecución. Esto se aplica a los casos en que `SELECT` procede de una subconsulta que utiliza `ORDER BY`. + +## Para obtener más información, consulte el siguiente enlace:) {#grouparrayinsertatvalue-position} + +Inserta un valor en la matriz en la posición especificada. + +!!! note "Nota" + Esta función utiliza posiciones de base cero, contrariamente a las posiciones de base única convencionales para matrices SQL. + +Accepts the value and position as input. If several values ​​are inserted into the same position, any of them might end up in the resulting array (the first one will be used in the case of single-threaded execution). If no value is inserted into a position, the position is assigned the default value. + +Parámetros opcionales: + +- El valor predeterminado para sustituir en posiciones vacías. +- La longitud de la matriz resultante. Esto le permite recibir matrices del mismo tamaño para todas las claves agregadas. Al utilizar este parámetro, se debe especificar el valor predeterminado. + +## groupArrayMovingSum {#agg_function-grouparraymovingsum} + +Calcula la suma móvil de los valores de entrada. + +``` sql +groupArrayMovingSum(numbers_for_summing) +groupArrayMovingSum(window_size)(numbers_for_summing) +``` + +La función puede tomar el tamaño de la ventana como un parámetro. Si no se especifica, la función toma el tamaño de ventana igual al número de filas de la columna. + +**Parámetros** + +- `numbers_for_summing` — [Expresion](../syntax.md#syntax-expressions) dando como resultado un valor de tipo de datos numérico. +- `window_size` — Size of the calculation window. + +**Valores devueltos** + +- Matriz del mismo tamaño y tipo que los datos de entrada. + +**Ejemplo** + +La tabla de ejemplo: + +``` sql +CREATE TABLE t +( + `int` UInt8, + `float` Float32, + `dec` Decimal32(2) +) +ENGINE = TinyLog +``` + +``` text +┌─int─┬─float─┬──dec─┐ +│ 1 │ 1.1 │ 1.10 │ +│ 2 │ 2.2 │ 2.20 │ +│ 4 │ 4.4 │ 4.40 │ +│ 7 │ 7.77 │ 7.77 │ +└─────┴───────┴──────┘ +``` + +Consulta: + +``` sql +SELECT + groupArrayMovingSum(int) AS I, + groupArrayMovingSum(float) AS F, + groupArrayMovingSum(dec) AS D +FROM t +``` + +``` text +┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐ +│ [1,3,7,14] │ [1.1,3.3000002,7.7000003,15.47] │ [1.10,3.30,7.70,15.47] │ +└────────────┴─────────────────────────────────┴────────────────────────┘ +``` + +``` sql +SELECT + groupArrayMovingSum(2)(int) AS I, + groupArrayMovingSum(2)(float) AS F, + groupArrayMovingSum(2)(dec) AS D +FROM t +``` + +``` text +┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐ +│ [1,3,6,11] │ [1.1,3.3000002,6.6000004,12.17] │ [1.10,3.30,6.60,12.17] │ +└────────────┴─────────────────────────────────┴────────────────────────┘ +``` + +## Método de codificación de datos: {#agg_function-grouparraymovingavg} + +Calcula la media móvil de los valores de entrada. + +``` sql +groupArrayMovingAvg(numbers_for_summing) +groupArrayMovingAvg(window_size)(numbers_for_summing) +``` + +La función puede tomar el tamaño de la ventana como un parámetro. Si no se especifica, la función toma el tamaño de ventana igual al número de filas de la columna. + +**Parámetros** + +- `numbers_for_summing` — [Expresion](../syntax.md#syntax-expressions) dando como resultado un valor de tipo de datos numérico. +- `window_size` — Size of the calculation window. + +**Valores devueltos** + +- Matriz del mismo tamaño y tipo que los datos de entrada. + +La función utiliza [redondeando hacia cero](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero). Trunca los decimales insignificantes para el tipo de datos resultante. + +**Ejemplo** + +La tabla de ejemplo `b`: + +``` sql +CREATE TABLE t +( + `int` UInt8, + `float` Float32, + `dec` Decimal32(2) +) +ENGINE = TinyLog +``` + +``` text +┌─int─┬─float─┬──dec─┐ +│ 1 │ 1.1 │ 1.10 │ +│ 2 │ 2.2 │ 2.20 │ +│ 4 │ 4.4 │ 4.40 │ +│ 7 │ 7.77 │ 7.77 │ +└─────┴───────┴──────┘ +``` + +Consulta: + +``` sql +SELECT + groupArrayMovingAvg(int) AS I, + groupArrayMovingAvg(float) AS F, + groupArrayMovingAvg(dec) AS D +FROM t +``` + +``` text +┌─I─────────┬─F───────────────────────────────────┬─D─────────────────────┐ +│ [0,0,1,3] │ [0.275,0.82500005,1.9250001,3.8675] │ [0.27,0.82,1.92,3.86] │ +└───────────┴─────────────────────────────────────┴───────────────────────┘ +``` + +``` sql +SELECT + groupArrayMovingAvg(2)(int) AS I, + groupArrayMovingAvg(2)(float) AS F, + groupArrayMovingAvg(2)(dec) AS D +FROM t +``` + +``` text +┌─I─────────┬─F────────────────────────────────┬─D─────────────────────┐ +│ [0,1,3,5] │ [0.55,1.6500001,3.3000002,6.085] │ [0.55,1.65,3.30,6.08] │ +└───────────┴──────────────────────────────────┴───────────────────────┘ +``` + +## ¿Cómo puedo obtener más información?) {#groupuniqarrayx-groupuniqarraymax-sizex} + +Crea una matriz a partir de diferentes valores de argumento. El consumo de memoria es el mismo que para el `uniqExact` función. + +La segunda versión (con el `max_size` parámetro) limita el tamaño de la matriz resultante a `max_size` elemento. +Por ejemplo, `groupUniqArray(1)(x)` es equivalente a `[any(x)]`. + +## cuantil {#quantile} + +Calcula un aproximado [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos. + +Esta función se aplica [muestreo de embalses](https://en.wikipedia.org/wiki/Reservoir_sampling) con un tamaño de depósito de hasta 8192 y un generador de números aleatorios para el muestreo. El resultado es no determinista. Para obtener un cuantil exacto, use el [quantileExact](#quantileexact) función. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantile(level)(expr) +``` + +Apodo: `median`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [tipos de datos](../../data_types/index.md#data_types), [Fecha](../../data_types/date.md) o [FechaHora](../../data_types/datetime.md). + +**Valor devuelto** + +- Cuantil aproximado del nivel especificado. + +Tipo: + +- [Float64](../../data_types/float.md) para la entrada de tipo de datos numéricos. +- [Fecha](../../data_types/date.md) si los valores de entrada tienen `Date` tipo. +- [FechaHora](../../data_types/datetime.md) si los valores de entrada tienen `DateTime` tipo. + +**Ejemplo** + +Tabla de entrada: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +Consulta: + +``` sql +SELECT quantile(val) FROM t +``` + +Resultado: + +``` text +┌─quantile(val)─┐ +│ 1.5 │ +└───────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## quantileDeterminista {#quantiledeterministic} + +Calcula un aproximado [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos. + +Esta función se aplica [muestreo de embalses](https://en.wikipedia.org/wiki/Reservoir_sampling) con un tamaño de depósito de hasta 8192 y algoritmo determinista de muestreo. El resultado es determinista. Para obtener un cuantil exacto, use el [quantileExact](#quantileexact) función. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantileDeterministic(level)(expr, determinator) +``` + +Apodo: `medianDeterministic`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [tipos de datos](../../data_types/index.md#data_types), [Fecha](../../data_types/date.md) o [FechaHora](../../data_types/datetime.md). +- `determinator` — Number whose hash is used instead of a random number generator in the reservoir sampling algorithm to make the result of sampling deterministic. As a determinator you can use any deterministic positive number, for example, a user id or an event id. If the same determinator value occures too often, the function works incorrectly. + +**Valor devuelto** + +- Cuantil aproximado del nivel especificado. + +Tipo: + +- [Float64](../../data_types/float.md) para la entrada de tipo de datos numéricos. +- [Fecha](../../data_types/date.md) si los valores de entrada tienen `Date` tipo. +- [FechaHora](../../data_types/datetime.md) si los valores de entrada tienen `DateTime` tipo. + +**Ejemplo** + +Tabla de entrada: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +Consulta: + +``` sql +SELECT quantileDeterministic(val, 1) FROM t +``` + +Resultado: + +``` text +┌─quantileDeterministic(val, 1)─┐ +│ 1.5 │ +└───────────────────────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## quantileExact {#quantileexact} + +Calcula exactamente el [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos. + +To get exact value, all the passed values ​​are combined into an array, which is then partially sorted. Therefore, the function consumes `O(n)` memoria, donde `n` es un número de valores que se pasaron. Sin embargo, para un pequeño número de valores, la función es muy efectiva. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantileExact(level)(expr) +``` + +Apodo: `medianExact`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [tipos de datos](../../data_types/index.md#data_types), [Fecha](../../data_types/date.md) o [FechaHora](../../data_types/datetime.md). + +**Valor devuelto** + +- Cuantil del nivel especificado. + +Tipo: + +- [Float64](../../data_types/float.md) para la entrada de tipo de datos numéricos. +- [Fecha](../../data_types/date.md) si los valores de entrada tienen `Date` tipo. +- [FechaHora](../../data_types/datetime.md) si los valores de entrada tienen `DateTime` tipo. + +**Ejemplo** + +Consulta: + +``` sql +SELECT quantileExact(number) FROM numbers(10) +``` + +Resultado: + +``` text +┌─quantileExact(number)─┐ +│ 5 │ +└───────────────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## quantileExactWeighted {#quantileexactweighted} + +Calcula exactamente el [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos, teniendo en cuenta el peso de cada elemento. + +To get exact value, all the passed values ​​are combined into an array, which is then partially sorted. Each value is counted with its weight, as if it is present `weight` times. A hash table is used in the algorithm. Because of this, if the passed values ​​are frequently repeated, the function consumes less RAM than [quantileExact](#quantileexact). Puede usar esta función en lugar de `quantileExact` y especifique el peso 1. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantileExactWeighted(level)(expr, weight) +``` + +Apodo: `medianExactWeighted`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [tipos de datos](../../data_types/index.md#data_types), [Fecha](../../data_types/date.md) o [FechaHora](../../data_types/datetime.md). +- `weight` — Column with weights of sequence members. Weight is a number of value occurrences. + +**Valor devuelto** + +- Cuantil del nivel especificado. + +Tipo: + +- [Float64](../../data_types/float.md) para la entrada de tipo de datos numéricos. +- [Fecha](../../data_types/date.md) si los valores de entrada tienen `Date` tipo. +- [FechaHora](../../data_types/datetime.md) si los valores de entrada tienen `DateTime` tipo. + +**Ejemplo** + +Tabla de entrada: + +``` text +┌─n─┬─val─┐ +│ 0 │ 3 │ +│ 1 │ 2 │ +│ 2 │ 1 │ +│ 5 │ 4 │ +└───┴─────┘ +``` + +Consulta: + +``` sql +SELECT quantileExactWeighted(n, val) FROM t +``` + +Resultado: + +``` text +┌─quantileExactWeighted(n, val)─┐ +│ 1 │ +└───────────────────────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## quantileTiming {#quantiletiming} + +Con la precisión determinada calcula el [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos. + +El resultado es determinista (no depende del orden de procesamiento de la consulta). La función está optimizada para trabajar con secuencias que describen distribuciones como tiempos de carga de páginas web o tiempos de respuesta de back-end. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantileTiming(level)(expr) +``` + +Apodo: `medianTiming`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). + +- `expr` — [Expresion](../syntax.md#syntax-expressions) sobre una columna valores que devuelven un [Flotante\*](../../data_types/float.md)-tipo número. + + - If negative values are passed to the function, the behavior is undefined. + - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000. + +**Exactitud** + +El cálculo es preciso si: + +- El número total de valores no supera los 5670. +- El número total de valores supera los 5670, pero el tiempo de carga de la página es inferior a 1024 ms. + +De lo contrario, el resultado del cálculo se redondea al múltiplo más cercano de 16 ms. + +!!! note "Nota" + Para calcular los cuantiles de tiempo de carga de la página, esta función es más efectiva y precisa que [cuantil](#quantile). + +**Valor devuelto** + +- Cuantil del nivel especificado. + +Tipo: `Float32`. + +!!! note "Nota" + Si no se pasan valores a la función (cuando se `quantileTimingIf`), [NaN](../../data_types/float.md#data_type-float-nan-inf) se devuelve. El propósito de esto es diferenciar estos casos de los casos que resultan en cero. Ver [ORDER BY cláusula](../select.md#select-order-by) para notas sobre la clasificación `NaN` valor. + +**Ejemplo** + +Tabla de entrada: + +``` text +┌─response_time─┐ +│ 72 │ +│ 112 │ +│ 126 │ +│ 145 │ +│ 104 │ +│ 242 │ +│ 313 │ +│ 168 │ +│ 108 │ +└───────────────┘ +``` + +Consulta: + +``` sql +SELECT quantileTiming(response_time) FROM t +``` + +Resultado: + +``` text +┌─quantileTiming(response_time)─┐ +│ 126 │ +└───────────────────────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## quantileTimingWeighted {#quantiletimingweighted} + +Con la precisión determinada calcula el [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos según el peso de cada miembro de secuencia. + +El resultado es determinista (no depende del orden de procesamiento de la consulta). La función está optimizada para trabajar con secuencias que describen distribuciones como tiempos de carga de páginas web o tiempos de respuesta de back-end. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantileTimingWeighted(level)(expr, weight) +``` + +Apodo: `medianTimingWeighted`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). + +- `expr` — [Expresion](../syntax.md#syntax-expressions) sobre una columna valores que devuelven un [Flotante\*](../../data_types/float.md)-tipo número. + + - If negative values are passed to the function, the behavior is undefined. + - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000. + +- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. + +**Exactitud** + +El cálculo es preciso si: + +- El número total de valores no supera los 5670. +- El número total de valores supera los 5670, pero el tiempo de carga de la página es inferior a 1024 ms. + +De lo contrario, el resultado del cálculo se redondea al múltiplo más cercano de 16 ms. + +!!! note "Nota" + Para calcular los cuantiles de tiempo de carga de la página, esta función es más efectiva y precisa que [cuantil](#quantile). + +**Valor devuelto** + +- Cuantil del nivel especificado. + +Tipo: `Float32`. + +!!! note "Nota" + Si no se pasan valores a la función (cuando se `quantileTimingIf`), [NaN](../../data_types/float.md#data_type-float-nan-inf) se devuelve. El propósito de esto es diferenciar estos casos de los casos que resultan en cero. Ver [ORDER BY cláusula](../select.md#select-order-by) para notas sobre la clasificación `NaN` valor. + +**Ejemplo** + +Tabla de entrada: + +``` text +┌─response_time─┬─weight─┐ +│ 68 │ 1 │ +│ 104 │ 2 │ +│ 112 │ 3 │ +│ 126 │ 2 │ +│ 138 │ 1 │ +│ 162 │ 1 │ +└───────────────┴────────┘ +``` + +Consulta: + +``` sql +SELECT quantileTimingWeighted(response_time, weight) FROM t +``` + +Resultado: + +``` text +┌─quantileTimingWeighted(response_time, weight)─┐ +│ 112 │ +└───────────────────────────────────────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## quantileTDigest {#quantiletdigest} + +Calcula un aproximado [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos usando el [T-digest](https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf) algoritmo. + +El error máximo es 1%. El consumo de memoria es `log(n)`, donde `n` es un número de valores. El resultado depende del orden de ejecución de la consulta y no es determinista. + +El rendimiento de la función es menor que el rendimiento de [cuantil](#quantile) o [quantileTiming](#quantiletiming). En términos de la relación entre el tamaño del estado y la precisión, esta función es mucho mejor que `quantile`. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantileTDigest(level)(expr) +``` + +Apodo: `medianTDigest`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [tipos de datos](../../data_types/index.md#data_types), [Fecha](../../data_types/date.md) o [FechaHora](../../data_types/datetime.md). + +**Valor devuelto** + +- Cuantil aproximado del nivel especificado. + +Tipo: + +- [Float64](../../data_types/float.md) para la entrada de tipo de datos numéricos. +- [Fecha](../../data_types/date.md) si los valores de entrada tienen `Date` tipo. +- [FechaHora](../../data_types/datetime.md) si los valores de entrada tienen `DateTime` tipo. + +**Ejemplo** + +Consulta: + +``` sql +SELECT quantileTDigest(number) FROM numbers(10) +``` + +Resultado: + +``` text +┌─quantileTDigest(number)─┐ +│ 4.5 │ +└─────────────────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## quantileTDigestWeighted {#quantiletdigestweighted} + +Calcula un aproximado [cuantil](https://en.wikipedia.org/wiki/Quantile) de una secuencia de datos numéricos usando el [T-digest](https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf) algoritmo. La función tiene en cuenta el peso de cada miembro de secuencia. El error máximo es 1%. El consumo de memoria es `log(n)`, donde `n` es un número de valores. + +El rendimiento de la función es menor que el rendimiento de [cuantil](#quantile) o [quantileTiming](#quantiletiming). En términos de la relación entre el tamaño del estado y la precisión, esta función es mucho mejor que `quantile`. + +El resultado depende del orden de ejecución de la consulta y no es determinista. + +Cuando se utilizan múltiples `quantile*` funciones con diferentes niveles en una consulta, los estados internos no se combinan (es decir, la consulta funciona de manera menos eficiente de lo que podría). En este caso, use el [cantiles](#quantiles) función. + +**Sintaxis** + +``` sql +quantileTDigest(level)(expr) +``` + +Apodo: `medianTDigest`. + +**Parámetros** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` valor en el rango de `[0.01, 0.99]`. Valor predeterminado: 0.5. En `level=0.5` la función calcula [mediana](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [tipos de datos](../../data_types/index.md#data_types), [Fecha](../../data_types/date.md) o [FechaHora](../../data_types/datetime.md). +- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. + +**Valor devuelto** + +- Cuantil aproximado del nivel especificado. + +Tipo: + +- [Float64](../../data_types/float.md) para la entrada de tipo de datos numéricos. +- [Fecha](../../data_types/date.md) si los valores de entrada tienen `Date` tipo. +- [FechaHora](../../data_types/datetime.md) si los valores de entrada tienen `DateTime` tipo. + +**Ejemplo** + +Consulta: + +``` sql +SELECT quantileTDigestWeighted(number, 1) FROM numbers(10) +``` + +Resultado: + +``` text +┌─quantileTDigestWeighted(number, 1)─┐ +│ 4.5 │ +└────────────────────────────────────┘ +``` + +**Ver también** + +- [mediana](#median) +- [cantiles](#quantiles) + +## mediana {#median} + +El `median*` funciones son los alias para el `quantile*` función. Calculan la mediana de una muestra de datos numéricos. + +Función: + +- `median` — Alias for [cuantil](#quantile). +- `medianDeterministic` — Alias for [quantileDeterminista](#quantiledeterministic). +- `medianExact` — Alias for [quantileExact](#quantileexact). +- `medianExactWeighted` — Alias for [quantileExactWeighted](#quantileexactweighted). +- `medianTiming` — Alias for [quantileTiming](#quantiletiming). +- `medianTimingWeighted` — Alias for [quantileTimingWeighted](#quantiletimingweighted). +- `medianTDigest` — Alias for [quantileTDigest](#quantiletdigest). +- `medianTDigestWeighted` — Alias for [quantileTDigestWeighted](#quantiletdigestweighted). + +**Ejemplo** + +Tabla de entrada: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +Consulta: + +``` sql +SELECT medianDeterministic(val, 1) FROM t +``` + +Resultado: + +``` text +┌─medianDeterministic(val, 1)─┐ +│ 1.5 │ +└─────────────────────────────┘ +``` + +## quantiles(level1, level2, …)(x) {#quantiles} + +Todas las funciones de cuantiles también tienen funciones de cuantiles correspondientes: `quantiles`, `quantilesDeterministic`, `quantilesTiming`, `quantilesTimingWeighted`, `quantilesExact`, `quantilesExactWeighted`, `quantilesTDigest`. Estas funciones calculan todos los cuantiles de los niveles enumerados en una sola pasada y devuelven una matriz de los valores resultantes. + +## Acerca de Nosotros) {#varsampx} + +Calcula la cantidad `Σ((x - x̅)^2) / (n - 1)`, donde `n` es el tamaño de la muestra y `x̅`es el valor promedio de `x`. + +Representa una estimación imparcial de la varianza de una variable aleatoria si los valores pasados forman su muestra. + +Devoluciones `Float64`. Cuando `n <= 1`, devoluciones `+∞`. + +## Nombre de la red inalámbrica (SSID):) {#varpopx} + +Calcula la cantidad `Σ((x - x̅)^2) / n`, donde `n` es el tamaño de la muestra y `x̅`es el valor promedio de `x`. + +En otras palabras, dispersión para un conjunto de valores. Devoluciones `Float64`. + +## Soporte técnico) {#stddevsampx} + +El resultado es igual a la raíz cuadrada de `varSamp(x)`. + +## stddevPop(x) {#stddevpopx} + +El resultado es igual a la raíz cuadrada de `varPop(x)`. + +## topK(N)(x) {#topknx} + +Devuelve una matriz de los valores aproximadamente más frecuentes de la columna especificada. La matriz resultante se ordena en orden descendente de frecuencia aproximada de valores (no por los valores mismos). + +Implementa el [Ahorro de espacio filtrado](http://www.l2f.inesc-id.pt/~fmmb/wiki/uploads/Work/misnis.ref0a.pdf) algoritmo para analizar TopK, basado en el algoritmo de reducción y combinación de [Ahorro de espacio paralelo](https://arxiv.org/pdf/1401.0702.pdf). + +``` sql +topK(N)(column) +``` + +Esta función no proporciona un resultado garantizado. En ciertas situaciones, pueden producirse errores y pueden devolver valores frecuentes que no son los valores más frecuentes. + +Recomendamos usar el `N < 10` valor; el rendimiento se reduce con grandes `N` valor. Valor máximo de `N = 65536`. + +**Parámetros** + +- ‘N’ es el número de elementos a devolver. + +Si se omite el parámetro, se utiliza el valor predeterminado 10. + +**Argumento** + +- ' x ' – The value to calculate frequency. + +**Ejemplo** + +Tome el [A tiempo](../../getting_started/example_datasets/ontime.md) conjunto de datos y seleccione los tres valores más frecuentes `AirlineID` columna. + +``` sql +SELECT topK(3)(AirlineID) AS res +FROM ontime +``` + +``` text +┌─res─────────────────┐ +│ [19393,19790,19805] │ +└─────────────────────┘ +``` + +## topKPeso {#topkweighted} + +Similar a `topK` pero toma un argumento adicional de tipo entero - `weight`. Cada valor se contabiliza `weight` veces para el cálculo de la frecuencia. + +**Sintaxis** + +``` sql +topKWeighted(N)(x, weight) +``` + +**Parámetros** + +- `N` — The number of elements to return. + +**Argumento** + +- `x` – The value. +- `weight` — The weight. [UInt8](../../data_types/int_uint.md). + +**Valor devuelto** + +Devuelve una matriz de los valores con la suma aproximada máxima de pesos. + +**Ejemplo** + +Consulta: + +``` sql +SELECT topKWeighted(10)(number, number) FROM numbers(1000) +``` + +Resultado: + +``` text +┌─topKWeighted(10)(number, number)──────────┐ +│ [999,998,997,996,995,994,993,992,991,990] │ +└───────────────────────────────────────────┘ +``` + +## covarSamp(x, y) {#covarsampx-y} + +Calcula el valor de `Σ((x - x̅)(y - y̅)) / (n - 1)`. + +Devuelve Float64. Cuando `n <= 1`, returns +∞. + +## covarPop(x, y) {#covarpopx-y} + +Calcula el valor de `Σ((x - x̅)(y - y̅)) / n`. + +## corr(x, y) {#corrx-y} + +Calcula el coeficiente de correlación de Pearson: `Σ((x - x̅)(y - y̅)) / sqrt(Σ((x - x̅)^2) * Σ((y - y̅)^2))`. + +## categoricalInformationValue {#categoricalinformationvalue} + +Calcula el valor de `(P(tag = 1) - P(tag = 0))(log(P(tag = 1)) - log(P(tag = 0)))` para cada categoría. + +``` sql +categoricalInformationValue(category1, category2, ..., tag) +``` + +El resultado indica cómo una característica discreta (categórica `[category1, category2, ...]` contribuir a un modelo de aprendizaje que predice el valor de `tag`. + +## SimpleLinearRegression {#simplelinearregression} + +Realiza una regresión lineal simple (unidimensional). + +``` sql +simpleLinearRegression(x, y) +``` + +Parámetros: + +- `x` — Column with dependent variable values. +- `y` — Column with explanatory variable values. + +Valores devueltos: + +Constante `(a, b)` de la línea resultante `y = a*x + b`. + +**Ejemplos** + +``` sql +SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3]) +``` + +``` text +┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3])─┐ +│ (1,0) │ +└───────────────────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6]) +``` + +``` text +┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6])─┐ +│ (1,3) │ +└───────────────────────────────────────────────────────────────────┘ +``` + +## stochasticLinearRegression {#agg_functions-stochasticlinearregression} + +Esta función implementa la regresión lineal estocástica. Admite parámetros personalizados para la tasa de aprendizaje, el coeficiente de regularización L2, el tamaño de mini lote y tiene pocos métodos para actualizar los pesos ([Adán](https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Adam) (utilizado por defecto), [SGD simple](https://en.wikipedia.org/wiki/Stochastic_gradient_descent), [Impulso](https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum), [Nesterov](https://mipt.ru/upload/medialibrary/d7e/41-91.pdf)). + +### Parámetros {#agg_functions-stochasticlinearregression-parameters} + +Hay 4 parámetros personalizables. Se pasan a la función secuencialmente, pero no es necesario pasar los cuatro; se usarán valores predeterminados, sin embargo, un buen modelo requirió algún ajuste de parámetros. + +``` text +stochasticLinearRegression(1.0, 1.0, 10, 'SGD') +``` + +1. `learning rate` es el coeficiente en la longitud del paso, cuando se realiza el paso de descenso de gradiente. Una tasa de aprendizaje demasiado grande puede causar pesos infinitos del modelo. El valor predeterminado es `0.00001`. +2. `l2 regularization coefficient` que puede ayudar a prevenir el sobreajuste. El valor predeterminado es `0.1`. +3. `mini-batch size` establece el número de elementos, cuyos gradientes se calcularán y sumarán para realizar un paso de descenso de gradiente. El descenso estocástico puro usa un elemento, sin embargo, tener lotes pequeños (aproximadamente 10 elementos) hace que los pasos de gradiente sean más estables. El valor predeterminado es `15`. +4. `method for updating weights`, son: `Adam` (predeterminada), `SGD`, `Momentum`, `Nesterov`. `Momentum` y `Nesterov` requieren un poco más de cálculos y memoria, sin embargo, resultan útiles en términos de velocidad de convergencia y estabilidad de los métodos de gradiente estocásticos. + +### Uso {#agg_functions-stochasticlinearregression-usage} + +`stochasticLinearRegression` se utiliza en dos pasos: ajustar el modelo y predecir nuevos datos. Para ajustar el modelo y guardar su estado para su uso posterior, utilizamos `-State` combinador, que básicamente guarda el estado (pesos del modelo, etc.). +Para predecir usamos la función [evalMLMethod](../functions/machine_learning_functions.md#machine_learning_methods-evalmlmethod), que toma un estado como argumento, así como características para predecir. + + + +**1.** Accesorio + +Dicha consulta puede ser utilizada. + +``` sql +CREATE TABLE IF NOT EXISTS train_data +( + param1 Float64, + param2 Float64, + target Float64 +) ENGINE = Memory; + +CREATE TABLE your_model ENGINE = Memory AS SELECT +stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, param1, param2) +AS state FROM train_data; +``` + +Aquí también tenemos que insertar datos en `train_data` tabla. El número de parámetros no es fijo, depende solo del número de argumentos, pasados a `linearRegressionState`. Todos deben ser valores numéricos. +Tenga en cuenta que la columna con valor objetivo (que nos gustaría aprender a predecir) se inserta como primer argumento. + +**2.** Predecir + +Después de guardar un estado en la tabla, podemos usarlo varias veces para la predicción, o incluso fusionarlo con otros estados y crear nuevos modelos aún mejores. + +``` sql +WITH (SELECT state FROM your_model) AS model SELECT +evalMLMethod(model, param1, param2) FROM test_data +``` + +La consulta devolverá una columna de valores predichos. Tenga en cuenta que el primer argumento de `evalMLMethod` ser `AggregateFunctionState` objeto, siguiente son columnas de características. + +`test_data` es una mesa como `train_data` pero puede no contener el valor objetivo. + +### Nota {#agg_functions-stochasticlinearregression-notes} + +1. Para fusionar dos modelos, el usuario puede crear dicha consulta: + `sql SELECT state1 + state2 FROM your_models` + donde `your_models` la tabla contiene ambos modelos. Esta consulta devolverá un nuevo `AggregateFunctionState` objeto. + +2. El usuario puede obtener pesos del modelo creado para sus propios fines sin guardar el modelo si no `-State` combinador se utiliza. + `sql SELECT stochasticLinearRegression(0.01)(target, param1, param2) FROM train_data` + Dicha consulta se ajustará al modelo y devolverá sus pesos: primero son los pesos, que corresponden a los parámetros del modelo, el último es el sesgo. Entonces, en el ejemplo anterior, la consulta devolverá una columna con 3 valores. + +**Ver también** + +- [stochasticLogisticRegression](#agg_functions-stochasticlogisticregression) +- [Diferencia entre regresiones lineales y logísticas](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) + +## stochasticLogisticRegression {#agg_functions-stochasticlogisticregression} + +Esta función implementa la regresión logística estocástica. Se puede usar para problemas de clasificación binaria, admite los mismos parámetros personalizados que stochasticLinearRegression y funciona de la misma manera. + +### Parámetros {#agg_functions-stochasticlogisticregression-parameters} + +Los parámetros son exactamente los mismos que en stochasticLinearRegression: +`learning rate`, `l2 regularization coefficient`, `mini-batch size`, `method for updating weights`. +Para obtener más información, consulte [parámetros](#agg_functions-stochasticlinearregression-parameters). + +``` text +stochasticLogisticRegression(1.0, 1.0, 10, 'SGD') +``` + +1. Accesorio + + + + See the `Fitting` section in the [stochasticLinearRegression](#stochasticlinearregression-usage-fitting) description. + + Predicted labels have to be in \[-1, 1\]. + +1. Predecir + + + + Using saved state we can predict probability of object having label `1`. + + ``` sql + WITH (SELECT state FROM your_model) AS model SELECT + evalMLMethod(model, param1, param2) FROM test_data + ``` + + The query will return a column of probabilities. Note that first argument of `evalMLMethod` is `AggregateFunctionState` object, next are columns of features. + + We can also set a bound of probability, which assigns elements to different labels. + + ``` sql + SELECT ans < 1.1 AND ans > 0.5 FROM + (WITH (SELECT state FROM your_model) AS model SELECT + evalMLMethod(model, param1, param2) AS ans FROM test_data) + ``` + + Then the result will be labels. + + `test_data` is a table like `train_data` but may not contain target value. + +**Ver también** + +- [stochasticLinearRegression](#agg_functions-stochasticlinearregression) +- [Diferencia entre regresiones lineales y logísticas.](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) + +## Método de codificación de datos: {#groupbitmapand} + +Calcula el AND de una columna de mapa de bits, devuelve la cardinalidad del tipo UInt64, si agrega el sufijo -State, luego devuelve [objeto de mapa de bits](../functions/bitmap_functions.md). + +``` sql +groupBitmapAnd(expr) +``` + +**Parámetros** + +`expr` – An expression that results in `AggregateFunction(groupBitmap, UInt*)` tipo. + +**Valor de retorno** + +Valor de la `UInt64` tipo. + +**Ejemplo** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapAnd(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapAnd(z)─┐ +│ 3 │ +└───────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapAndState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapAndState(z)))─┐ +│ [6,8,10] │ +└──────────────────────────────────────────────────┘ +``` + +## Método de codificación de datos: {#groupbitmapor} + +Calcula el OR de una columna de mapa de bits, devuelve la cardinalidad del tipo UInt64, si agrega el sufijo -State, luego devuelve [objeto de mapa de bits](../functions/bitmap_functions.md). Esto es equivalente a `groupBitmapMerge`. + +``` sql +groupBitmapOr(expr) +``` + +**Parámetros** + +`expr` – An expression that results in `AggregateFunction(groupBitmap, UInt*)` tipo. + +**Valor de retorno** + +Valor de la `UInt64` tipo. + +**Ejemplo** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapOr(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapOr(z)─┐ +│ 15 │ +└──────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapOrState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapOrState(z)))─┐ +│ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] │ +└─────────────────────────────────────────────────┘ +``` + +## Método de codificación de datos: {#groupbitmapxor} + +Calcula el XOR de una columna de mapa de bits, devuelve la cardinalidad del tipo UInt64, si agrega el sufijo -State, luego devuelve [objeto de mapa de bits](../functions/bitmap_functions.md). + +``` sql +groupBitmapOr(expr) +``` + +**Parámetros** + +`expr` – An expression that results in `AggregateFunction(groupBitmap, UInt*)` tipo. + +**Valor de retorno** + +Valor de la `UInt64` tipo. + +**Ejemplo** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapXor(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapXor(z)─┐ +│ 10 │ +└───────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapXorState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapXorState(z)))─┐ +│ [1,3,5,6,8,10,11,13,14,15] │ +└──────────────────────────────────────────────────┘ +``` + +[Artículo Original](https://clickhouse.tech/docs/en/query_language/agg_functions/reference/) diff --git a/docs/es/query_language/alter.md b/docs/es/query_language/alter.md index e4726159bd2..31342199735 100644 --- a/docs/es/query_language/alter.md +++ b/docs/es/query_language/alter.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + ## ALTERAR {#query_language_queries_alter} El `ALTER` consulta sólo se admite para `*MergeTree` mesas, así como `Merge`y`Distributed`. La consulta tiene varias variaciones. diff --git a/docs/es/query_language/create.md b/docs/es/query_language/create.md index d366001e261..ba6f5f1849b 100644 --- a/docs/es/query_language/create.md +++ b/docs/es/query_language/create.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # CREAR Consultas {#create-queries} ## CREAR BASE DE DATOS {#query-language-create-database} diff --git a/docs/es/query_language/dicts/external_dicts.md b/docs/es/query_language/dicts/external_dicts.md index 28e408b57e2..e0b09c6015e 100644 --- a/docs/es/query_language/dicts/external_dicts.md +++ b/docs/es/query_language/dicts/external_dicts.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Diccionarios externos {#dicts-external-dicts} Puede agregar sus propios diccionarios de varias fuentes de datos. El origen de datos de un diccionario puede ser un archivo ejecutable o de texto local, un recurso HTTP u otro DBMS. Para obtener más información, consulte “[Fuentes para diccionarios externos](external_dicts_dict_sources.md)”. diff --git a/docs/es/query_language/dicts/external_dicts_dict.md b/docs/es/query_language/dicts/external_dicts_dict.md index 1614a78fb6b..1d1b7bbcb0e 100644 --- a/docs/es/query_language/dicts/external_dicts_dict.md +++ b/docs/es/query_language/dicts/external_dicts_dict.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Configuración de un diccionario externo {#dicts-external-dicts-dict} Si el diccionario se configura usando un archivo xml, la configuración del diccionario tiene la siguiente estructura: diff --git a/docs/es/query_language/dicts/external_dicts_dict_hierarchical.md b/docs/es/query_language/dicts/external_dicts_dict_hierarchical.md index 095a3cb2b78..2665fc76d0e 100644 --- a/docs/es/query_language/dicts/external_dicts_dict_hierarchical.md +++ b/docs/es/query_language/dicts/external_dicts_dict_hierarchical.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Diccionarios jerárquicos {#hierarchical-dictionaries} ClickHouse soporta diccionarios jerárquicos con un [llave numérica](external_dicts_dict_structure.md#ext_dict-numeric-key). diff --git a/docs/es/query_language/dicts/external_dicts_dict_layout.md b/docs/es/query_language/dicts/external_dicts_dict_layout.md index 7467a5d8100..cfa7dcaf304 100644 --- a/docs/es/query_language/dicts/external_dicts_dict_layout.md +++ b/docs/es/query_language/dicts/external_dicts_dict_layout.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Almacenamiento de diccionarios en la memoria {#dicts-external-dicts-dict-layout} Hay una variad de formas de almacenar diccionarios en la memoria. diff --git a/docs/es/query_language/dicts/external_dicts_dict_lifetime.md b/docs/es/query_language/dicts/external_dicts_dict_lifetime.md index cbea58f8dd4..4e004d0ee7f 100644 --- a/docs/es/query_language/dicts/external_dicts_dict_lifetime.md +++ b/docs/es/query_language/dicts/external_dicts_dict_lifetime.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Actualizaciones del diccionario {#dictionary-updates} ClickHouse actualiza periódicamente los diccionarios. El intervalo de actualización para los diccionarios completamente descargados y el intervalo de invalidación para los diccionarios almacenados en caché se `` etiqueta en segundos. diff --git a/docs/es/query_language/dicts/external_dicts_dict_sources.md b/docs/es/query_language/dicts/external_dicts_dict_sources.md index c9d4804a300..953e0d193e0 100644 --- a/docs/es/query_language/dicts/external_dicts_dict_sources.md +++ b/docs/es/query_language/dicts/external_dicts_dict_sources.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Fuentes de diccionarios externos {#dicts-external-dicts-dict-sources} Un diccionario externo se puede conectar desde muchas fuentes diferentes. diff --git a/docs/es/query_language/dicts/external_dicts_dict_structure.md b/docs/es/query_language/dicts/external_dicts_dict_structure.md index a337a8b71e2..4b97e3e1701 100644 --- a/docs/es/query_language/dicts/external_dicts_dict_structure.md +++ b/docs/es/query_language/dicts/external_dicts_dict_structure.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Clave y campos del diccionario {#dictionary-key-and-fields} El `` cláusula describe la clave del diccionario y los campos disponibles para consultas. diff --git a/docs/es/query_language/dicts/index.md b/docs/es/query_language/dicts/index.md index 77e6f0db41c..6007869a9b1 100644 --- a/docs/es/query_language/dicts/index.md +++ b/docs/es/query_language/dicts/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Diccionario {#dictionaries} Un diccionario es un mapeo (`key -> attributes`) que es conveniente para varios tipos de listas de referencia. diff --git a/docs/es/query_language/dicts/internal_dicts.md b/docs/es/query_language/dicts/internal_dicts.md index 60571371c02..4795975b1cb 100644 --- a/docs/es/query_language/dicts/internal_dicts.md +++ b/docs/es/query_language/dicts/internal_dicts.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Diccionarios internos {#internal_dicts} ClickHouse contiene una función integrada para trabajar con una geobase. diff --git a/docs/es/query_language/functions/arithmetic_functions.md b/docs/es/query_language/functions/arithmetic_functions.md index c41d52a4991..9ec7995edad 100644 --- a/docs/es/query_language/functions/arithmetic_functions.md +++ b/docs/es/query_language/functions/arithmetic_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones aritméticas {#arithmetic-functions} Para todas las funciones aritméticas, el tipo de resultado se calcula como el tipo de número más pequeño en el que encaja el resultado, si existe dicho tipo. El mínimo se toma simultáneamente en función del número de bits, si está firmado y si flota. Si no hay suficientes bits, se toma el tipo de bit más alto. diff --git a/docs/es/query_language/functions/array_functions.md b/docs/es/query_language/functions/array_functions.md index b42cf192277..e1dd2a38f69 100644 --- a/docs/es/query_language/functions/array_functions.md +++ b/docs/es/query_language/functions/array_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con matrices {#functions-for-working-with-arrays} ## vaciar {#function-empty} diff --git a/docs/es/query_language/functions/array_join.md b/docs/es/query_language/functions/array_join.md index b9df26ec71f..25645efc45c 100644 --- a/docs/es/query_language/functions/array_join.md +++ b/docs/es/query_language/functions/array_join.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # arrayJoin función {#functions_arrayjoin} Esta es una función muy inusual. diff --git a/docs/es/query_language/functions/bit_functions.md b/docs/es/query_language/functions/bit_functions.md index d74c89c3633..309c55e33ca 100644 --- a/docs/es/query_language/functions/bit_functions.md +++ b/docs/es/query_language/functions/bit_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Bit funciones {#bit-functions} Las funciones de bits funcionan para cualquier par de tipos de UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32 o Float64. diff --git a/docs/es/query_language/functions/bitmap_functions.md b/docs/es/query_language/functions/bitmap_functions.md index a16ff2aad87..65fcc33731a 100644 --- a/docs/es/query_language/functions/bitmap_functions.md +++ b/docs/es/query_language/functions/bitmap_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de mapa de bits {#bitmap-functions} Las funciones de mapa de bits funcionan para dos mapas de bits Cálculo del valor del objeto, es devolver un nuevo mapa de bits o cardinalidad mientras se usa el cálculo de la fórmula, como y, o, xor, y no, etc. diff --git a/docs/es/query_language/functions/comparison_functions.md b/docs/es/query_language/functions/comparison_functions.md index c64cd659bb9..ebd799508a9 100644 --- a/docs/es/query_language/functions/comparison_functions.md +++ b/docs/es/query_language/functions/comparison_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de comparación {#comparison-functions} Las funciones de comparación siempre devuelven 0 o 1 (Uint8). diff --git a/docs/es/query_language/functions/conditional_functions.md b/docs/es/query_language/functions/conditional_functions.md index efed413827b..9506ea2aaa2 100644 --- a/docs/es/query_language/functions/conditional_functions.md +++ b/docs/es/query_language/functions/conditional_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones condicionales {#conditional-functions} ## si {#if} diff --git a/docs/es/query_language/functions/date_time_functions.md b/docs/es/query_language/functions/date_time_functions.md index a9e651b9e3a..d1f2d2622cd 100644 --- a/docs/es/query_language/functions/date_time_functions.md +++ b/docs/es/query_language/functions/date_time_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con fechas y horas {#functions-for-working-with-dates-and-times} Soporte para zonas horarias diff --git a/docs/es/query_language/functions/encoding_functions.md b/docs/es/query_language/functions/encoding_functions.md index e8b59c85588..dadb4b4db00 100644 --- a/docs/es/query_language/functions/encoding_functions.md +++ b/docs/es/query_language/functions/encoding_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de codificación {#encoding-functions} ## char {#char} diff --git a/docs/es/query_language/functions/ext_dict_functions.md b/docs/es/query_language/functions/ext_dict_functions.md index 86a37cef3ce..fe7515b8846 100644 --- a/docs/es/query_language/functions/ext_dict_functions.md +++ b/docs/es/query_language/functions/ext_dict_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con diccionarios externos {#ext_dict_functions} Para obtener información sobre cómo conectar y configurar diccionarios externos, consulte [Diccionarios externos](../dicts/external_dicts.md). diff --git a/docs/es/query_language/functions/functions_for_nulls.md b/docs/es/query_language/functions/functions_for_nulls.md index f3c71fc7b89..e343667ce6e 100644 --- a/docs/es/query_language/functions/functions_for_nulls.md +++ b/docs/es/query_language/functions/functions_for_nulls.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con agregados anulables {#functions-for-working-with-nullable-aggregates} ## IsNull {#isnull} diff --git a/docs/es/query_language/functions/geo.md b/docs/es/query_language/functions/geo.md index 62083a6a09e..eba818b5639 100644 --- a/docs/es/query_language/functions/geo.md +++ b/docs/es/query_language/functions/geo.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con coordenadas geográficas {#functions-for-working-with-geographical-coordinates} ## GranCircleDistance {#greatcircledistance} diff --git a/docs/es/query_language/functions/hash_functions.md b/docs/es/query_language/functions/hash_functions.md index b1e63417ef1..0bb985c2af0 100644 --- a/docs/es/query_language/functions/hash_functions.md +++ b/docs/es/query_language/functions/hash_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones hash {#hash-functions} Las funciones Hash se pueden usar para la barajada pseudoaleatoria determinista de elementos. diff --git a/docs/es/query_language/functions/higher_order_functions.md b/docs/es/query_language/functions/higher_order_functions.md index c867c5dddf0..fce1c63d2c1 100644 --- a/docs/es/query_language/functions/higher_order_functions.md +++ b/docs/es/query_language/functions/higher_order_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de orden superior {#higher-order-functions} ## `->` operador, función lambda (params, expr) {#operator-lambdaparams-expr-function} diff --git a/docs/es/query_language/functions/in_functions.md b/docs/es/query_language/functions/in_functions.md index a0ebd07a3ea..9ecd8c1f8ad 100644 --- a/docs/es/query_language/functions/in_functions.md +++ b/docs/es/query_language/functions/in_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para implementar el operador IN {#functions-for-implementing-the-in-operator} ## Información de uso {#in-functions} diff --git a/docs/es/query_language/functions/index.md b/docs/es/query_language/functions/index.md index 8e69d670b59..80d528393ea 100644 --- a/docs/es/query_language/functions/index.md +++ b/docs/es/query_language/functions/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Función {#functions} Hay al menos \* dos tipos de funciones: funciones regulares (simplemente se llaman “functions”) y funciones agregadas. Estos son conceptos completamente diferentes. Las funciones regulares funcionan como si se aplicaran a cada fila por separado (para cada fila, el resultado de la función no depende de las otras filas). Las funciones agregadas acumulan un conjunto de valores de varias filas (es decir,dependen de todo el conjunto de filas). diff --git a/docs/es/query_language/functions/introspection.md b/docs/es/query_language/functions/introspection.md index dd0fb0c61f5..634cf52118c 100644 --- a/docs/es/query_language/functions/introspection.md +++ b/docs/es/query_language/functions/introspection.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de introspección {#introspection-functions} Puede utilizar las funciones descritas en este capítulo para [ELFO](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) y [ENANO](https://en.wikipedia.org/wiki/DWARF) para la creación de perfiles de consultas. diff --git a/docs/es/query_language/functions/ip_address_functions.md b/docs/es/query_language/functions/ip_address_functions.md index 3705168a6e2..5f55fc55fab 100644 --- a/docs/es/query_language/functions/ip_address_functions.md +++ b/docs/es/query_language/functions/ip_address_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con direcciones IP {#functions-for-working-with-ip-addresses} ## Número de código: IPv4NumToString (num) {#ipv4numtostringnum} diff --git a/docs/es/query_language/functions/json_functions.md b/docs/es/query_language/functions/json_functions.md index 10c6b4b3d6f..d8732b281e1 100644 --- a/docs/es/query_language/functions/json_functions.md +++ b/docs/es/query_language/functions/json_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con JSON {#functions-for-working-with-json} En el Yandex.Metrica, JSON es transmitido por los usuarios como parámetros de sesión. Hay algunas funciones especiales para trabajar con este JSON. (Aunque en la mayoría de los casos, los JSON también se procesan previamente, y los valores resultantes se colocan en columnas separadas en su formato procesado.) Todas estas funciones se basan en sólidas suposiciones sobre lo que puede ser el JSON, pero tratan de hacer lo menos posible para hacer el trabajo. diff --git a/docs/es/query_language/functions/logical_functions.md b/docs/es/query_language/functions/logical_functions.md index ecfb4c51f30..5de5607f134 100644 --- a/docs/es/query_language/functions/logical_functions.md +++ b/docs/es/query_language/functions/logical_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones lógicas {#logical-functions} Las funciones lógicas aceptan cualquier tipo numérico, pero devuelven un número UInt8 igual a 0 o 1. diff --git a/docs/es/query_language/functions/machine_learning_functions.md b/docs/es/query_language/functions/machine_learning_functions.md index e205c91cc00..b1c80ee7ce0 100644 --- a/docs/es/query_language/functions/machine_learning_functions.md +++ b/docs/es/query_language/functions/machine_learning_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de aprendizaje automático {#machine-learning-functions} ## evalMLMethod (predicción) {#machine_learning_methods-evalmlmethod} diff --git a/docs/es/query_language/functions/math_functions.md b/docs/es/query_language/functions/math_functions.md index 77ab4dff4c1..1cc15ba944d 100644 --- a/docs/es/query_language/functions/math_functions.md +++ b/docs/es/query_language/functions/math_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones matemáticas {#mathematical-functions} Todas las funciones devuelven un número Float64. La precisión del resultado es cercana a la precisión máxima posible, pero el resultado puede no coincidir con el número representable de la máquina más cercano al número real correspondiente. diff --git a/docs/es/query_language/functions/other_functions.md b/docs/es/query_language/functions/other_functions.md index 5879ac4ad3c..8201620f809 100644 --- a/docs/es/query_language/functions/other_functions.md +++ b/docs/es/query_language/functions/other_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Otras funciones {#other-functions} ## nombre de host() {#hostname} diff --git a/docs/es/query_language/functions/random_functions.md b/docs/es/query_language/functions/random_functions.md index fd9496bec03..19547210aa0 100644 --- a/docs/es/query_language/functions/random_functions.md +++ b/docs/es/query_language/functions/random_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para generar números pseudoaleatorios {#functions-for-generating-pseudo-random-numbers} Se utilizan generadores no criptográficos de números pseudoaleatorios. diff --git a/docs/es/query_language/functions/rounding_functions.md b/docs/es/query_language/functions/rounding_functions.md index 7959dfa15bd..7d9eb229586 100644 --- a/docs/es/query_language/functions/rounding_functions.md +++ b/docs/es/query_language/functions/rounding_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de redondeo {#rounding-functions} ## Piso(x\[, N\]) {#floorx-n} diff --git a/docs/es/query_language/functions/splitting_merging_functions.md b/docs/es/query_language/functions/splitting_merging_functions.md index 37c76748e2f..9f257fe2f61 100644 --- a/docs/es/query_language/functions/splitting_merging_functions.md +++ b/docs/es/query_language/functions/splitting_merging_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para dividir y fusionar cadenas y matrices {#functions-for-splitting-and-merging-strings-and-arrays} ## Por ejemplo:) {#splitbycharseparator-s} diff --git a/docs/es/query_language/functions/string_functions.md b/docs/es/query_language/functions/string_functions.md index 8e756452aed..bd25c9128db 100644 --- a/docs/es/query_language/functions/string_functions.md +++ b/docs/es/query_language/functions/string_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con cadenas {#functions-for-working-with-strings} ## Vaciar {#empty} diff --git a/docs/es/query_language/functions/string_replace_functions.md b/docs/es/query_language/functions/string_replace_functions.md index 66bb57e70a0..3449162c5c5 100644 --- a/docs/es/query_language/functions/string_replace_functions.md +++ b/docs/es/query_language/functions/string_replace_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para buscar y reemplazar en cadenas {#functions-for-searching-and-replacing-in-strings} ## replaceOne(pajar, patrón, reemplazo) {#replaceonehaystack-pattern-replacement} diff --git a/docs/es/query_language/functions/string_search_functions.md b/docs/es/query_language/functions/string_search_functions.md index b4cef0216ab..c9ef20be853 100644 --- a/docs/es/query_language/functions/string_search_functions.md +++ b/docs/es/query_language/functions/string_search_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para buscar cadenas {#functions-for-searching-strings} La búsqueda distingue entre mayúsculas y minúsculas de forma predeterminada en todas estas funciones. Hay variantes separadas para la búsqueda insensible a mayúsculas y minúsculas. diff --git a/docs/es/query_language/functions/type_conversion_functions.md b/docs/es/query_language/functions/type_conversion_functions.md index 206695930af..9d6751a7c10 100644 --- a/docs/es/query_language/functions/type_conversion_functions.md +++ b/docs/es/query_language/functions/type_conversion_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de conversión de tipos {#type-conversion-functions} ## Problemas comunes de conversiones numéricas {#numeric-conversion-issues} diff --git a/docs/es/query_language/functions/url_functions.md b/docs/es/query_language/functions/url_functions.md index 7601f357e92..5cfb751446b 100644 --- a/docs/es/query_language/functions/url_functions.md +++ b/docs/es/query_language/functions/url_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con URL {#functions-for-working-with-urls} Todas estas funciones no siguen el RFC. Se simplifican al máximo para mejorar el rendimiento. diff --git a/docs/es/query_language/functions/uuid_functions.md b/docs/es/query_language/functions/uuid_functions.md index 469e4dd807c..b83411c08ec 100644 --- a/docs/es/query_language/functions/uuid_functions.md +++ b/docs/es/query_language/functions/uuid_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con UUID {#functions-for-working-with-uuid} Las funciones para trabajar con UUID se enumeran a continuación. diff --git a/docs/es/query_language/functions/ym_dict_functions.md b/docs/es/query_language/functions/ym_dict_functions.md index f80204f777f..7e5d7b2d73e 100644 --- a/docs/es/query_language/functions/ym_dict_functions.md +++ b/docs/es/query_language/functions/ym_dict_functions.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones para trabajar con Yandex.Métrica, diccionarios {#functions-for-working-with-yandex-metrica-dictionaries} Para que las funciones a continuación funcionen, la configuración del servidor debe especificar las rutas y direcciones para obtener todo el Yandex.Diccionarios Metrica. Los diccionarios se cargan en la primera llamada de cualquiera de estas funciones. Si no se pueden cargar las listas de referencia, se produce una excepción. diff --git a/docs/es/query_language/index.md b/docs/es/query_language/index.md index a7f21a41441..fa981365e64 100644 --- a/docs/es/query_language/index.md +++ b/docs/es/query_language/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Referencia SQL {#sql-reference} - [SELECCIONAR](select.md) diff --git a/docs/es/query_language/insert_into.md b/docs/es/query_language/insert_into.md index 3decb6fdd8b..62a0f6fdaf2 100644 --- a/docs/es/query_language/insert_into.md +++ b/docs/es/query_language/insert_into.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + ## INSERTAR {#insert} Adición de datos. diff --git a/docs/es/query_language/misc.md b/docs/es/query_language/misc.md index 747f0852704..ff21fc1b457 100644 --- a/docs/es/query_language/misc.md +++ b/docs/es/query_language/misc.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Consultas Misceláneas {#miscellaneous-queries} ## CONECTAR {#attach} diff --git a/docs/es/query_language/operators.md b/docs/es/query_language/operators.md index 248e40a62f9..19d6d058f00 100644 --- a/docs/es/query_language/operators.md +++ b/docs/es/query_language/operators.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Operador {#operators} Todos los operadores se transforman a sus funciones correspondientes en la etapa de análisis de consulta de acuerdo con su precedencia y asociatividad. diff --git a/docs/es/query_language/select.md b/docs/es/query_language/select.md index e886b0f0fcb..b3aaef02b79 100644 --- a/docs/es/query_language/select.md +++ b/docs/es/query_language/select.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # SELECCIONAR consultas Sintaxis {#select-queries-syntax} `SELECT` realiza la recuperación de datos. diff --git a/docs/es/query_language/show.md b/docs/es/query_language/show.md index 0341f654035..f713fbe337e 100644 --- a/docs/es/query_language/show.md +++ b/docs/es/query_language/show.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # MOSTRAR consultas {#show-queries} ## MOSTRAR CREAR TABLA {#show-create-table} diff --git a/docs/es/query_language/syntax.md b/docs/es/query_language/syntax.md index b0467b44f77..cb24cf46430 100644 --- a/docs/es/query_language/syntax.md +++ b/docs/es/query_language/syntax.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Sintaxis {#syntax} Hay dos tipos de analizadores en el sistema: el analizador SQL completo (un analizador de descenso recursivo) y el analizador de formato de datos (un analizador de flujo rápido). diff --git a/docs/es/query_language/system.md b/docs/es/query_language/system.md index 27a3f61f20d..bd30ef013ed 100644 --- a/docs/es/query_language/system.md +++ b/docs/es/query_language/system.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Consultas del sistema {#query-language-system} - [Cargar DICCIONARIOS](#query_language-system-reload-dictionaries) diff --git a/docs/es/query_language/table_functions/file.md b/docs/es/query_language/table_functions/file.md index c3744b62e74..f20a208d920 100644 --- a/docs/es/query_language/table_functions/file.md +++ b/docs/es/query_language/table_functions/file.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # file {#file} Crea una tabla a partir de un archivo. Esta función de tabla es similar a [URL](url.md) y [Hdfs](hdfs.md) Aquel. diff --git a/docs/es/query_language/table_functions/generate.md b/docs/es/query_language/table_functions/generate.md index cfaf38ccf9e..5192b0563f3 100644 --- a/docs/es/query_language/table_functions/generate.md +++ b/docs/es/query_language/table_functions/generate.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # generateRandom {#generaterandom} Genera datos aleatorios con un esquema dado. diff --git a/docs/es/query_language/table_functions/hdfs.md b/docs/es/query_language/table_functions/hdfs.md index 9a72d684039..81e9a9e8898 100644 --- a/docs/es/query_language/table_functions/hdfs.md +++ b/docs/es/query_language/table_functions/hdfs.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Hdfs {#hdfs} Crea una tabla a partir de archivos en HDFS. Esta función de tabla es similar a [URL](url.md) y [file](file.md) Aquel. diff --git a/docs/es/query_language/table_functions/index.md b/docs/es/query_language/table_functions/index.md index 7b297676d38..0f249638a0b 100644 --- a/docs/es/query_language/table_functions/index.md +++ b/docs/es/query_language/table_functions/index.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Funciones de tabla {#table-functions} Las funciones de tabla son métodos para construir tablas. diff --git a/docs/es/query_language/table_functions/input.md b/docs/es/query_language/table_functions/input.md index ab89c198c42..cbc91842eb2 100644 --- a/docs/es/query_language/table_functions/input.md +++ b/docs/es/query_language/table_functions/input.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # entrada {#input} `input(structure)` - función de tabla que permite convertir e insertar efectivamente los datos enviados al diff --git a/docs/es/query_language/table_functions/jdbc.md b/docs/es/query_language/table_functions/jdbc.md index ed13151a713..5c97bb56a42 100644 --- a/docs/es/query_language/table_functions/jdbc.md +++ b/docs/es/query_language/table_functions/jdbc.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # jdbc {#table-function-jdbc} `jdbc(jdbc_connection_uri, schema, table)` - devuelve la tabla que está conectado a través del controlador JDBC. diff --git a/docs/es/query_language/table_functions/merge.md b/docs/es/query_language/table_functions/merge.md index f1090deca81..268ad0a84e0 100644 --- a/docs/es/query_language/table_functions/merge.md +++ b/docs/es/query_language/table_functions/merge.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Fusionar {#merge} `merge(db_name, 'tables_regexp')` – Crea una tabla de combinación temporal. Para obtener más información, consulte la sección “Table engines, Merge”. diff --git a/docs/es/query_language/table_functions/mysql.md b/docs/es/query_language/table_functions/mysql.md index 9fa4d272b63..a8d57279d6b 100644 --- a/docs/es/query_language/table_functions/mysql.md +++ b/docs/es/query_language/table_functions/mysql.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # mysql {#mysql} Permitir `SELECT` consultas que se realizarán en los datos que se almacenan en un servidor MySQL remoto. diff --git a/docs/es/query_language/table_functions/numbers.md b/docs/es/query_language/table_functions/numbers.md index 59d67cc6ff8..5d6017e523c 100644 --- a/docs/es/query_language/table_functions/numbers.md +++ b/docs/es/query_language/table_functions/numbers.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # número {#numbers} `numbers(N)` – Devuelve una tabla con el único ‘number’ columna (UInt64) que contiene enteros de 0 a N-1. diff --git a/docs/es/query_language/table_functions/odbc.md b/docs/es/query_language/table_functions/odbc.md index 13a77aa90d5..1e0cf1a723e 100644 --- a/docs/es/query_language/table_functions/odbc.md +++ b/docs/es/query_language/table_functions/odbc.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Nosotros {#table-functions-odbc} Devuelve la tabla que está conectada a través de [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity). diff --git a/docs/es/query_language/table_functions/remote.md b/docs/es/query_language/table_functions/remote.md index 922c038b1e2..adc7aa44207 100644 --- a/docs/es/query_language/table_functions/remote.md +++ b/docs/es/query_language/table_functions/remote.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Remoto, remoteSecure {#remote-remotesecure} Le permite acceder a servidores remotos sin crear un `Distributed` tabla. diff --git a/docs/es/query_language/table_functions/url.md b/docs/es/query_language/table_functions/url.md index fb7cee98f9a..6978d5ece18 100644 --- a/docs/es/query_language/table_functions/url.md +++ b/docs/es/query_language/table_functions/url.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # URL {#url} `url(URL, format, structure)` - devuelve una tabla creada a partir del `URL` con dado diff --git a/docs/es/roadmap.md b/docs/es/roadmap.md index 6bd63d64a8c..11934c67422 100644 --- a/docs/es/roadmap.md +++ b/docs/es/roadmap.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + # Hoja de ruta {#roadmap} ## Q1 2020 {#q1-2020} diff --git a/docs/es/security_changelog.md b/docs/es/security_changelog.md index 1658c348279..94a0fd83f73 100644 --- a/docs/es/security_changelog.md +++ b/docs/es/security_changelog.md @@ -1,3 +1,7 @@ +--- +machine_translated: true +--- + ## Corregido en la versión de ClickHouse 19.14.3.3, 2019-09-10 {#fixed-in-clickhouse-release-19-14-3-3-2019-09-10} ### ¿Qué puedes encontrar en Neodigit {#cve-2019-15024} diff --git a/docs/fa/getting_started/playground.md b/docs/fa/getting_started/playground.md new file mode 120000 index 00000000000..de5b41f453e --- /dev/null +++ b/docs/fa/getting_started/playground.md @@ -0,0 +1 @@ +../../en/getting_started/playground.md \ No newline at end of file diff --git a/docs/fr/changelog/2017.md b/docs/fr/changelog/2017.md new file mode 100644 index 00000000000..8cb6e3ef2e0 --- /dev/null +++ b/docs/fr/changelog/2017.md @@ -0,0 +1,265 @@ +--- +machine_translated: true +--- + +### Clickhouse version 1.1.54327, 2017-12-21 {#clickhouse-release-1-1-54327-2017-12-21} + +Cette version contient des corrections de bugs pour la version précédente 1.1.54318: + +- Correction d'un bug avec condition de concurrence possible dans la réplication qui pourrait conduire à la perte de données. Ce problème affecte les versions 1.1.54310 et 1.1.54318. Si vous utilisez l'une de ces versions avec des tables répliquées, la mise à jour est fortement recommandée. Ce problème apparaît dans les journaux dans les messages d'avertissement comme `Part ... from own log doesn't exist.` Le problème est pertinent même si vous ne voyez pas ces messages dans les journaux. + +### Clickhouse version 1.1.54318, 2017-11-30 {#clickhouse-release-1-1-54318-2017-11-30} + +Cette version contient des corrections de bugs pour la version précédente 1.1.54310: + +- Correction de suppressions de ligne incorrectes lors des fusions dans le moteur SummingMergeTree +- Correction d'une fuite de mémoire dans les moteurs mergetree non compliqués +- Correction de la dégradation des performances avec des inserts fréquents dans les moteurs MergeTree +- Correction d'un problème qui causait la file d'attente de réplication pour arrêter l'exécution +- Rotation fixe et archivage des journaux du serveur + +### Clickhouse version 1.1.54310, 2017-11-01 {#clickhouse-release-1-1-54310-2017-11-01} + +#### Nouveauté: {#new-features} + +- Clé de partitionnement personnalisée pour la famille MergeTree des moteurs de table. +- [Kafka](https://clickhouse.yandex/docs/en/operations/table_engines/kafka/) tableau moteur. +- Ajout du support pour le chargement [CatBoost](https://catboost.yandex/) modèles et les appliquer aux données stockées dans ClickHouse. +- Ajout du support pour les fuseaux horaires avec des décalages non entiers de UTC. +- Ajout du support pour les opérations arithmétiques avec des intervalles de temps. +- La plage de valeurs pour les types Date et DateTime est étendue à l'année 2105. +- Ajouté le `CREATE MATERIALIZED VIEW x TO y` requête (spécifie une table pour stocker les données d'une vue matérialisée). +- Ajouté le `ATTACH TABLE` requête sans arguments. +- La logique de traitement des colonnes imbriquées avec des noms se terminant par-Map dans une table SummingMergeTree a été extraite dans la fonction d'agrégat sumMap. Vous pouvez maintenant spécifier ces colonnes explicitement. +- La taille maximale du dictionnaire IP trie est augmentée à 128M entrées. +- Ajout de la fonction getSizeOfEnumType. +- Ajout de la fonction d'agrégat sumWithOverflow. +- Ajout du support pour le format D'entrée Cap'n Proto. +- Vous pouvez maintenant personnaliser le niveau de compression lors de l'utilisation de l'algorithme zstd. + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes} + +- Création de tables temporaires avec un moteur autre que la Mémoire n'est pas autorisé. +- La création explicite de tables avec le moteur View ou MaterializedView n'est pas autorisée. +- Lors de la création de la table, une nouvelle vérification vérifie que l'expression de clé d'échantillonnage est incluse dans la clé primaire. + +#### Corrections de bugs: {#bug-fixes} + +- Correction des accrochages lors de l'insertion synchrone dans une table distribuée. +- Ajout et retrait non atomiques fixes de pièces dans des tables répliquées. +- Les données insérées dans une vue matérialisée ne sont pas soumises à une déduplication inutile. +- L'exécution d'une requête vers une table distribuée pour laquelle le réplica local est en retard et les réplicas distants ne sont pas disponibles n'entraîne plus d'erreur. +- Les utilisateurs n'ont pas besoin d'autorisations d'accès au `default` base de données pour créer des tables temporaires plus. +- Correction d'un plantage lors de la spécification du type de tableau sans arguments. +- Correction des interruptions lorsque le volume du disque contenant les journaux du serveur est plein. +- Correction d'un débordement dans la fonction toRelativeWeekNum pour la première semaine de L'époque Unix. + +#### Construire des améliorations: {#build-improvements} + +- Plusieurs bibliothèques tierces (notamment Poco) ont été mises à jour et converties en sous-modules git. + +### Clickhouse version 1.1.54304, 2017-10-19 {#clickhouse-release-1-1-54304-2017-10-19} + +#### Nouveauté: {#new-features-1} + +- Prise en charge TLS dans le protocole natif (pour activer, définir `tcp_ssl_port` dans `config.xml` ). + +#### Corrections de bugs: {#bug-fixes-1} + +- `ALTER` pour les tables répliquées essaie maintenant de commencer à s'exécuter dès que possible. +- Fixe plante lors de la lecture des données avec le paramètre `preferred_block_size_bytes=0.` +- Plantages fixes de `clickhouse-client` lorsque vous appuyez sur `Page Down` +- L'interprétation correcte de certaines requêtes complexes avec `GLOBAL IN` et `UNION ALL` +- `FREEZE PARTITION` fonctionne toujours atomiquement maintenant. +- Les requêtes POST vides renvoient maintenant une réponse avec le code 411. +- Correction d'erreurs d'interprétation pour des expressions comme `CAST(1 AS Nullable(UInt8)).` +- Correction d'une erreur lors de la lecture `Array(Nullable(String))` les colonnes de `MergeTree` table. +- Fixe s'écraser lors de l'analyse des requêtes comme `SELECT dummy AS dummy, dummy AS b` +- Les utilisateurs sont mis à jour correctement avec invalide `users.xml` +- Manipulation correcte lorsqu'un dictionnaire exécutable renvoie un code de réponse différent de zéro. + +### Clickhouse version 1.1.54292, 2017-09-20 {#clickhouse-release-1-1-54292-2017-09-20} + +#### Nouveauté: {#new-features-2} + +- Ajouté le `pointInPolygon` fonction pour travailler avec des coordonnées sur un plan de coordonnées. +- Ajouté le `sumMap` fonction d'agrégation pour calculer la somme des tableaux, similaire à `SummingMergeTree`. +- Ajouté le `trunc` fonction. Amélioration des performances des fonctions d'arrondi (`round`, `floor`, `ceil`, `roundToExp2`) et corrigé la logique de la façon dont ils fonctionnent. Changé la logique de la `roundToExp2` fonction pour les fractions et les nombres négatifs. +- Le fichier exécutable ClickHouse dépend maintenant moins de la version libc. Le même fichier exécutable ClickHouse peut fonctionner sur une grande variété de systèmes Linux. Il existe toujours une dépendance lors de l'utilisation de requêtes compilées (avec le paramètre `compile = 1` qui n'est pas utilisé par défaut). +- Réduit le temps nécessaire à la compilation dynamique des requêtes. + +#### Corrections de bugs: {#bug-fixes-2} + +- Correction d'une erreur qui produisait parfois `part ... intersects previous part` messages et cohérence des répliques affaiblies. +- Correction d'une erreur qui a provoqué le verrouillage du serveur si ZooKeeper n'était pas disponible pendant l'arrêt. +- Suppression de la journalisation excessive lors de la restauration des répliques. +- Correction d'une erreur dans L'Union toute la mise en œuvre. +- Correction d'une erreur dans la fonction concat qui s'est produite si la première colonne d'un bloc a le type de tableau. +- La progression est maintenant affichée correctement dans le système.fusionne table. + +### Clickhouse version 1.1.54289, 2017-09-13 {#clickhouse-release-1-1-54289-2017-09-13} + +#### Nouveauté: {#new-features-3} + +- `SYSTEM` les requêtes pour l'administration du serveur: `SYSTEM RELOAD DICTIONARY`, `SYSTEM RELOAD DICTIONARIES`, `SYSTEM DROP DNS CACHE`, `SYSTEM SHUTDOWN`, `SYSTEM KILL`. +- Ajout de fonctions pour travailler avec des tableaux: `concat`, `arraySlice`, `arrayPushBack`, `arrayPushFront`, `arrayPopBack`, `arrayPopFront`. +- Ajouter `root` et `identity` paramètres pour la configuration de ZooKeeper. Cela vous permet d'isoler des utilisateurs individuels sur le même cluster ZooKeeper. +- Fonctions d'agrégation ajoutées `groupBitAnd`, `groupBitOr`, et `groupBitXor` (pour la compatibilité, ils sont également disponibles sous les noms de `BIT_AND`, `BIT_OR`, et `BIT_XOR`). +- Les dictionnaires externes peuvent être chargés à partir de MySQL en spécifiant un socket dans le système de fichiers. +- Les dictionnaires externes peuvent être chargés à partir de MySQL sur SSL (`ssl_cert`, `ssl_key`, `ssl_ca` paramètre). +- Ajouté le `max_network_bandwidth_for_user` paramètre pour limiter l'utilisation globale de la bande passante pour les requêtes par utilisateur. +- Soutien pour `DROP TABLE` pour les tables temporaires. +- Support pour la lecture `DateTime` valeurs au format d'horodatage Unix de `CSV` et `JSONEachRow` format. +- Les répliques en retard dans les requêtes distribuées sont maintenant exclues par défaut (le seuil par défaut est de 5 minutes). +- Le verrouillage FIFO est utilisé pendant ALTER: une requête ALTER n'est pas bloquée indéfiniment pour les requêtes en cours d'exécution en continu. +- Option à définir `umask` dans le fichier de configuration. +- Amélioration des performances pour les requêtes avec `DISTINCT` . + +#### Corrections de bugs: {#bug-fixes-3} + +- Amélioration du processus de suppression des anciens nœuds dans ZooKeeper. Auparavant, les anciens nœuds n'étaient parfois pas supprimés s'il y avait des insertions très fréquentes, ce qui faisait que le serveur était lent à s'arrêter, entre autres choses. +- Correction de la randomisation lors du choix des hôtes pour la connexion à ZooKeeper. +- Correction de l'exclusion des répliques en retard dans les requêtes distribuées si la réplique est localhost. +- Correction d'une erreur où une partie des données dans un `ReplicatedMergeTree` table pourrait être cassé après l'exécution `ALTER MODIFY` sur un élément dans un `Nested` structure. +- Correction d'une erreur qui pourrait provoquer des requêtes SELECT “hang”. +- Améliorations apportées aux requêtes DDL distribuées. +- Correction de la requête `CREATE TABLE ... AS `. +- Résolu à l'impasse dans l' `ALTER ... CLEAR COLUMN IN PARTITION` requête pour `Buffer` table. +- Correction de la valeur par défaut invalide pour `Enum` s (0 au lieu du minimum) lors de l'utilisation du `JSONEachRow` et `TSKV` format. +- Résolu l'apparition de processus zombies lors de l'utilisation d'un dictionnaire avec un `executable` source. +- Correction de segfault pour la requête HEAD. + +#### Workflow amélioré pour développer et assembler ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse} + +- Vous pouvez utiliser `pbuilder` pour construire ClickHouse. +- Vous pouvez utiliser `libc++` plutôt `libstdc++` pour construit sur Linux. +- Ajout d'instructions pour l'utilisation d'outils d'analyse de code statique: `Coverage`, `clang-tidy`, `cppcheck`. + +#### Veuillez noter lors de la mise à niveau: {#please-note-when-upgrading} + +- Il y a maintenant une valeur par défaut plus élevée pour le paramètre MergeTree `max_bytes_to_merge_at_max_space_in_pool` (la taille totale maximale des parties de données à fusionner, en octets): elle est passée de 100 GiB à 150 GiB. Cela peut entraîner de grandes fusions s'exécutant après la mise à niveau du serveur, ce qui pourrait entraîner une charge accrue sur le sous-système de disque. Si l'espace libre disponible sur le serveur est inférieur au double de la quantité totale des fusions en cours d'exécution, toutes les autres fusions s'arrêteront, y compris les fusions de petites parties de données. Par conséquent, les requêtes D'insertion échoueront avec le message “Merges are processing significantly slower than inserts.” L'utilisation de la `SELECT * FROM system.merges` requête pour surveiller la situation. Vous pouvez également vérifier le `DiskSpaceReservedForMerge` métrique dans l' `system.metrics` table, ou en Graphite. Vous n'avez rien à faire pour résoudre ce problème, car le problème se résoudra une fois les grandes fusions terminées. Si vous trouvez cela inacceptable, vous pouvez restaurer la valeur précédente pour le `max_bytes_to_merge_at_max_space_in_pool` paramètre. Pour ce faire, allez à l' section dans config.xml, ensemble ``` ``107374182400 ``` et redémarrer le serveur. + +### Clickhouse version 1.1.54284, 2017-08-29 {#clickhouse-release-1-1-54284-2017-08-29} + +- C'est une version de correction de la précédente 1.1.54282 libération. Il corrige les fuites dans le répertoire des pièces dans ZooKeeper. + +### Clickhouse version 1.1.54282, 2017-08-23 {#clickhouse-release-1-1-54282-2017-08-23} + +Cette version contient des corrections de bugs pour la version précédente 1.1.54276: + +- Fixe `DB::Exception: Assertion violation: !_path.empty()` lors de l'insertion dans une table distribuée. +- Correction de l'analyse lors de l'insertion au format RowBinary si les données d'entrée commencent par';'. +- Errors during runtime compilation of certain aggregate functions (e.g. `groupArray()`). + +### Clickhouse Version 1.1.54276, 2017-08-16 {#clickhouse-release-1-1-54276-2017-08-16} + +#### Nouveauté: {#new-features-4} + +- Ajout d'une section facultative avec pour une requête SELECT. Exemple de requête: `WITH 1+1 AS a SELECT a, a*a` +- INSERT peut être effectué de manière synchrone dans une table distribuée: OK n'est retourné qu'une fois toutes les données enregistrées sur tous les fragments. Ceci est activé par le paramètre insert\_distributed\_sync = 1. +- Ajout du type de données UUID pour travailler avec des identifiants de 16 octets. +- Ajout D'alias de CHAR, FLOAT et d'autres types pour la compatibilité avec Tableau. +- Ajout des fonctions toYYYYMM, toYYYYMMDD et toYYYYMMDDhhmmss pour convertir le temps en nombres. +- Vous pouvez utiliser les adresses IP (avec le nom d'hôte) pour identifier les serveurs pour les requêtes DDL en cluster. +- Ajout du support pour les arguments non constants et les décalages négatifs dans la fonction `substring(str, pos, len).` +- Ajout du paramètre max\_size pour `groupArray(max_size)(column)` fonction d'agrégation, et optimisé ses performances. + +#### Les principaux changements: {#main-changes} + +- Améliorations de la sécurité: tous les fichiers du serveur sont créés avec des autorisations 0640 (peuvent être modifiés via paramètre de configuration). +- Amélioration des messages d'erreur pour les requêtes avec une syntaxe invalide. +- Réduction significative de la consommation de mémoire et amélioration des performances lors de la fusion de grandes sections de données MergeTree. +- Augmentation significative des performances des fusions de données pour le Remplacementmergetree engine. +- Amélioration des performances pour les insertions asynchrones à partir d'une table distribuée en combinant plusieurs insertions sources. Pour activer cette fonctionnalité, utilisez le paramètre distributed\_directory\_monitor\_batch\_inserts=1. + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-1} + +- Modification du format binaire des états agrégés de `groupArray(array_column)` fonctions pour les tableaux. + +#### Liste complète des modifications: {#complete-list-of-changes} + +- Ajouté le `output_format_json_quote_denormals` paramètre, qui permet la sortie des valeurs NaN et inf au format JSON. +- Allocation de flux optimisée lors de la lecture à partir d'une table distribuée. +- Les paramètres peuvent être configurés en mode Lecture seule si la valeur ne change pas. +- Ajout de la possibilité de récupérer des granules non entiers du moteur MergeTree afin de respecter les restrictions sur la taille de bloc spécifiée dans le paramètre preferred\_block\_size\_bytes. Le but est de réduire la consommation de RAM et d'augmenter la localisation du cache lors du traitement des requêtes à partir de tables avec de grandes colonnes. +- Utilisation efficace des index qui contiennent des expressions comme `toStartOfHour(x)` pour des conditions comme `toStartOfHour(x) op сonstexpr.` +- Ajout de nouveaux paramètres pour les moteurs MergeTree (la section merge\_tree dans config.XML): + - replicated\_deduplication\_window\_seconds définit le nombre de secondes autorisé pour la déduplication des insertions dans les tables répliquées. + - cleanup\_delay\_period définit la fréquence de démarrage du nettoyage pour supprimer les données obsolètes. + - replicated\_can\_become\_leader peut empêcher une réplique de devenir le leader (et d'affecter des fusions). +- Nettoyage accéléré pour supprimer les données obsolètes de ZooKeeper. +- Plusieurs améliorations et corrections pour les requêtes ddl en cluster. Un intérêt particulier est le nouveau paramètre distributed\_ddl\_task\_timeout, qui limite le temps d'attente d'une réponse des serveurs du cluster. Si une requête ddl n'a pas été effectuée sur tous les hôtes, une réponse contiendra une erreur de délai d'attente et une requête sera exécutée en mode asynchrone. +- Amélioration de l'affichage des traces de pile dans les journaux du serveur. +- Ajouté le “none” valeur pour la méthode de compression. +- Vous pouvez utiliser plusieurs sections dictionaries\_config dans config.XML. +- Il est possible de se connecter à MySQL via un socket dans le système de fichiers. +- Système.table de pièces a une nouvelle colonne avec des informations sur la taille des marques, en octets. + +#### Corrections de bugs: {#bug-fixes-4} + +- Les tables distribuées utilisant une table de fusion fonctionnent maintenant correctement pour une requête SELECT avec une condition sur le `_table` champ. +- Correction d'une condition de course rare dans ReplicatedMergeTree lors de la vérification des pièces de données. +- Fixe le gel sur “leader election” lors du démarrage d'un serveur. +- Le paramètre max\_replica\_delay\_for\_distributed\_queries a été ignoré lors de l'utilisation d'une réplique locale de la source de données. Ce problème a été corrigé. +- Correction d'un comportement incorrect de `ALTER TABLE CLEAR COLUMN IN PARTITION` lorsque vous tentez de nettoyer une colonne non existante. +- Correction d'une exception dans la fonction multiIf lors de l'utilisation de tableaux ou de chaînes vides. +- Correction d'allocations de mémoire excessives lors de la désérialisation du format natif. +- Correction d'une mise à jour automatique incorrecte des dictionnaires Trie. +- Correction d'une exception lors de l'exécution de requêtes avec une clause GROUP BY à partir d'une table de fusion lors de l'utilisation D'un exemple. +- Correction d'un plantage de GROUP BY lors de l'utilisation de distributed\_aggregation\_memory\_efficient=1. +- Vous pouvez maintenant spécifier la base de données.table dans le côté droit de IN et JOIN. +- Trop de threads ont été utilisés pour l'agrégation parallèle. Ce problème a été corrigé. +- Correction de la façon dont le “if” fonction fonctionne avec des arguments FixedString. +- SELECT a mal fonctionné à partir d'une table distribuée pour les fragments avec un poids de 0. Ce problème a été corrigé. +- Exécuter `CREATE VIEW IF EXISTS no longer causes crashes.` +- Correction d'un comportement incorrect lorsque input\_format\_skip\_unknown\_fields = 1 est défini et qu'il existe des nombres négatifs. +- Correction d'une boucle infinie dans le `dictGetHierarchy()` fonction s'il y a des données non valides dans le dictionnaire. +- Fixe `Syntax error: unexpected (...)` erreurs lors de l'exécution de requêtes distribuées avec des sous-requêtes dans une clause IN ou JOIN et des tables de fusion. +- Correction d'une interprétation incorrecte D'une requête SELECT à partir de tables de dictionnaire. +- Correction de l' “Cannot mremap” erreur lors de l'utilisation de tableaux dans In et JOIN clauses avec plus de 2 milliards d'éléments. +- Correction du basculement pour les dictionnaires avec MySQL comme source. + +#### Workflow amélioré pour développer et assembler ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse-1} + +- Construit peuvent être assemblés en Arcadie. +- Vous pouvez utiliser gcc 7 pour compiler ClickHouse. +- Les builds parallèles utilisant ccache + distcc sont plus rapides maintenant. + +### Clickhouse version 1.1.54245, 2017-07-04 {#clickhouse-release-1-1-54245-2017-07-04} + +#### Nouveauté: {#new-features-5} + +- DDL distribué (par exemple, `CREATE TABLE ON CLUSTER`) +- La réplication de la requête `ALTER TABLE CLEAR COLUMN IN PARTITION.` +- Le moteur pour les tables de dictionnaire (accès aux données du dictionnaire sous la forme d'une table). +- Moteur de base de données de dictionnaire (ce type de base de données a automatiquement des tables de dictionnaire disponibles pour tous les dictionnaires externes connectés). +- Vous pouvez vérifier les mises à jour du dictionnaire en envoyant une demande à la source. +- Noms de colonnes qualifiés +- Les identificateurs entre des guillemets doubles. +- Sessions dans L'interface HTTP. +- La requête OPTIMIZE pour une table répliquée peut s'exécuter non seulement sur le leader. + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-2} + +- Supprimé ensemble GLOBAL. + +#### Des modifications mineures: {#minor-changes} + +- Maintenant, après le déclenchement d'une alerte, le journal imprime la trace complète de la pile. +- Détendu la vérification du nombre de pièces de données endommagées/supplémentaires au démarrage (il y avait trop de faux positifs). + +#### Corrections de bugs: {#bug-fixes-5} + +- Correction d'une mauvaise connexion “sticking” lors de l'insertion dans une table distribuée. +- GLOBAL in fonctionne maintenant pour une requête à partir d'une table de fusion qui regarde une table distribuée. +- Le nombre incorrect de cœurs a été détecté sur une machine virtuelle Google Compute Engine. Ce problème a été corrigé. +- Changements dans le fonctionnement d'une source exécutable de dictionnaires externes mis en cache. +- Correction de la comparaison des chaînes contenant des caractères nuls. +- Correction de la comparaison des champs de clé primaire Float32 avec des constantes. +- Auparavant, une estimation incorrecte de la taille d'un champ pouvait entraîner des allocations trop importantes. +- Correction d'un plantage lors de l'interrogation d'une colonne Nullable ajoutée à une table en utilisant ALTER. +- Correction d'un plantage lors du tri par une colonne Nullable, si le nombre de lignes est inférieur à la limite. +- Correction d'une commande par sous-requête composée uniquement de valeurs constantes. +- Auparavant, une table répliquée pouvait rester dans l'état non valide après l'échec d'une table de suppression. +- Les alias des sous-requêtes scalaires avec des résultats vides ne sont plus perdus. +- Maintenant, une requête qui a utilisé la compilation n'échoue pas avec une erreur si le fichier. so est endommagé. diff --git a/docs/fr/changelog/2018.md b/docs/fr/changelog/2018.md new file mode 100644 index 00000000000..cae840dfc34 --- /dev/null +++ b/docs/fr/changelog/2018.md @@ -0,0 +1,1060 @@ +--- +machine_translated: true +--- + +## Clickhouse version 18.16 {#clickhouse-release-18-16} + +### Clickhouse version 18.16.1, 2018-12-21 {#clickhouse-release-18-16-1-2018-12-21} + +#### Corrections de bugs: {#bug-fixes} + +- Correction d'une erreur qui a conduit à des problèmes avec la mise à jour des dictionnaires avec la source ODBC. [\#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [\#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- La compilation JIT des fonctions d'agrégat fonctionne maintenant avec des colonnes LowCardinality. [\#3838](https://github.com/ClickHouse/ClickHouse/issues/3838) + +#### Amélioration: {#improvements} + +- Ajouté le `low_cardinality_allow_in_native_format` paramètre enabled (activé, option par défaut). Lorsqu'elles sont désactivées, les colonnes LowCardinality seront converties en colonnes ordinaires pour les requêtes SELECT et les colonnes ordinaires seront attendues pour les requêtes INSERT. [\#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) + +#### Construire des améliorations: {#build-improvements} + +- Corrections pour les builds sur macOS et ARM. + +### Clickhouse version 18.16.0, 2018-12-14 {#clickhouse-release-18-16-0-2018-12-14} + +#### Nouveauté: {#new-features} + +- `DEFAULT` les expressions sont évaluées pour les champs manquants lors du chargement de données dans des formats d'entrée semi-structurés (`JSONEachRow`, `TSKV`). La fonction est activée avec le `insert_sample_with_metadata` paramètre. [\#3555](https://github.com/ClickHouse/ClickHouse/pull/3555) +- Le `ALTER TABLE` la requête a maintenant la `MODIFY ORDER BY` action pour changer la clé de tri lors de l'ajout ou de la suppression d'une colonne de table. Ceci est utile pour les tables dans la `MergeTree` famille qui effectuent des tâches supplémentaires lors de la fusion en fonction de cette clé de tri, telles que `SummingMergeTree`, `AggregatingMergeTree` et ainsi de suite. [\#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) [\#3755](https://github.com/ClickHouse/ClickHouse/pull/3755) +- Pour les tableaux dans le `MergeTree` famille, maintenant vous pouvez spécifier une clé de tri différente (`ORDER BY`) et de l'indice de (`PRIMARY KEY`). La clé de tri peut être plus longue que l'index. [\#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) +- Ajouté le `hdfs` fonction de table et le `HDFS` moteur de table pour l'importation et l'exportation de données vers HDFS. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/3617) +- Ajout de fonctions pour travailler avec base64: `base64Encode`, `base64Decode`, `tryBase64Decode`. [Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3350) +- Vous pouvez maintenant utiliser un paramètre pour configurer la précision du `uniqCombined` fonction d'agrégation (sélectionnez le nombre de cellules HyperLogLog). [\#3406](https://github.com/ClickHouse/ClickHouse/pull/3406) +- Ajouté le `system.contributors` table qui contient les noms de tous ceux qui ont fait des commits dans ClickHouse. [\#3452](https://github.com/ClickHouse/ClickHouse/pull/3452) +- Ajout de la possibilité d'omettre la partition de l' `ALTER TABLE ... FREEZE` requête en vue de sauvegarder toutes les partitions à la fois. [\#3514](https://github.com/ClickHouse/ClickHouse/pull/3514) +- Ajouter `dictGet` et `dictGetOrDefault` fonctions qui ne nécessitent pas de spécifier le type de valeur de retour. Le type est déterminé automatiquement à partir de la description du dictionnaire. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3564) +- Vous pouvez maintenant spécifier des commentaires pour une colonne dans la description de la table et la modifier en utilisant `ALTER`. [\#3377](https://github.com/ClickHouse/ClickHouse/pull/3377) +- La lecture est prise en charge pour `Join` tapez des tables avec des touches simples. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Vous pouvez maintenant spécifier les options `join_use_nulls`, `max_rows_in_join`, `max_bytes_in_join`, et `join_overflow_mode` lors de la création d'un `Join` type de table. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Ajouté le `joinGet` fonction qui permet d'utiliser un `Join` tapez table comme un dictionnaire. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Ajouté le `partition_key`, `sorting_key`, `primary_key`, et `sampling_key` les colonnes de la `system.tables` table afin de fournir des informations sur les clés de table. [\#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Ajouté le `is_in_partition_key`, `is_in_sorting_key`, `is_in_primary_key`, et `is_in_sampling_key` les colonnes de la `system.columns` table. [\#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Ajouté le `min_time` et `max_time` les colonnes de la `system.parts` table. Ces colonnes sont remplies lorsque la clé de partitionnement est une expression composée de `DateTime` colonne. [Emmanuel Donin de Rosière](https://github.com/ClickHouse/ClickHouse/pull/3800) + +#### Corrections de bugs: {#bug-fixes-1} + +- Corrections et améliorations des performances pour `LowCardinality` type de données. `GROUP BY` utiliser `LowCardinality(Nullable(...))`. Obtenir les valeurs de `extremes`. Traitement des fonctions d'ordre Élevé. `LEFT ARRAY JOIN`. Distribué `GROUP BY`. Fonctions qui renvoient `Array`. L'exécution de `ORDER BY`. Écrit à `Distributed` tableaux (nicelulu). Rétrocompatibilité pour `INSERT` requêtes provenant d'anciens clients qui implémentent `Native` protocole. Soutien pour `LowCardinality` pour `JOIN`. Amélioration des performances lorsque vous travaillez dans un flux unique. [\#3823](https://github.com/ClickHouse/ClickHouse/pull/3823) [\#3803](https://github.com/ClickHouse/ClickHouse/pull/3803) [\#3799](https://github.com/ClickHouse/ClickHouse/pull/3799) [\#3769](https://github.com/ClickHouse/ClickHouse/pull/3769) [\#3744](https://github.com/ClickHouse/ClickHouse/pull/3744) [\#3681](https://github.com/ClickHouse/ClickHouse/pull/3681) [\#3651](https://github.com/ClickHouse/ClickHouse/pull/3651) [\#3649](https://github.com/ClickHouse/ClickHouse/pull/3649) [\#3641](https://github.com/ClickHouse/ClickHouse/pull/3641) [\#3632](https://github.com/ClickHouse/ClickHouse/pull/3632) [\#3568](https://github.com/ClickHouse/ClickHouse/pull/3568) [\#3523](https://github.com/ClickHouse/ClickHouse/pull/3523) [\#3518](https://github.com/ClickHouse/ClickHouse/pull/3518) +- Correction de la façon dont le `select_sequential_consistency` l'option fonctionne. Auparavant, lorsque ce paramètre était activé, un résultat incomplet était parfois renvoyé après avoir commencé à écrire sur une nouvelle partition. [\#2863](https://github.com/ClickHouse/ClickHouse/pull/2863) +- Les bases de données sont correctement spécifiées lors de L'exécution de DDL `ON CLUSTER` les requêtes et `ALTER UPDATE/DELETE`. [\#3772](https://github.com/ClickHouse/ClickHouse/pull/3772) [\#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Les bases de données sont correctement spécifiées pour les sous-requêtes à l'intérieur d'une vue. [\#3521](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Correction d'un bug dans `PREWHERE` avec `FINAL` pour `VersionedCollapsingMergeTree`. [7167bfd7](https://github.com/ClickHouse/ClickHouse/commit/7167bfd7b365538f7a91c4307ad77e552ab4e8c1) +- Maintenant, vous pouvez utiliser `KILL QUERY` pour annuler les requêtes qui n'ont pas encore démarré car elles attendent que la table soit verrouillée. [\#3517](https://github.com/ClickHouse/ClickHouse/pull/3517) +- Correction des calculs de date et d'heure si les horloges ont été déplacées à minuit (cela se produit en Iran, et est arrivé à Moscou de 1981 à 1983). Auparavant, cela a conduit à la réinitialisation de l'heure un jour plus tôt que nécessaire, et a également provoqué un formatage incorrect de la date et de l'heure au format texte. [\#3819](https://github.com/ClickHouse/ClickHouse/pull/3819) +- Correction de bugs dans certains cas, de `VIEW` et les sous-requêtes qui omettent la base de données. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Correction d'une condition de course lors de la lecture simultanée d'un `MATERIALIZED VIEW` et la suppression d'un `MATERIALIZED VIEW` en raison de ne pas verrouiller l'interne `MATERIALIZED VIEW`. [\#3404](https://github.com/ClickHouse/ClickHouse/pull/3404) [\#3694](https://github.com/ClickHouse/ClickHouse/pull/3694) +- Correction de l'erreur `Lock handler cannot be nullptr.` [\#3689](https://github.com/ClickHouse/ClickHouse/pull/3689) +- Correction du traitement des requêtes lorsque le `compile_expressions` option est activée (elle est activée par défaut). Expressions constantes non déterministes comme le `now` fonction ne sont plus déplié. [\#3457](https://github.com/ClickHouse/ClickHouse/pull/3457) +- Correction d'un plantage lors de la spécification d'un argument d'échelle non constant dans `toDecimal32/64/128` fonction. +- Correction d'une erreur lors de l'insertion d'un tableau avec `NULL` éléments dans le `Values` formater dans une colonne de type `Array` sans `Nullable` (si `input_format_values_interpret_expressions` = 1). [\#3487](https://github.com/ClickHouse/ClickHouse/pull/3487) [\#3503](https://github.com/ClickHouse/ClickHouse/pull/3503) +- Fixe continue de journalisation des erreurs dans `DDLWorker` si la Gardienne n'est pas disponible. [8f50c620](https://github.com/ClickHouse/ClickHouse/commit/8f50c620334988b28018213ec0092fe6423847e2) +- Correction du type de retour pour `quantile*` les fonctions de `Date` et `DateTime` les types d'arguments. [\#3580](https://github.com/ClickHouse/ClickHouse/pull/3580) +- Correction de l' `WITH` clause si elle spécifie un alias simple sans expressions. [\#3570](https://github.com/ClickHouse/ClickHouse/pull/3570) +- Correction du traitement des requêtes avec des sous-requêtes nommées et des noms de colonnes qualifiés lorsque `enable_optimize_predicate_expression` est activé. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3588) +- Correction de l'erreur `Attempt to attach to nullptr thread group` lorsque vous travaillez avec des vues matérialisées. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3623) +- Correction d'un plantage lors du passage de certains arguments incorrects `arrayReverse` fonction. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Correction du débordement de tampon dans le `extractURLParameter` fonction. Amélioration de la performance. Ajout d'un traitement correct des chaînes contenant zéro octet. [141e9799](https://github.com/ClickHouse/ClickHouse/commit/141e9799e49201d84ea8e951d1bed4fb6d3dacb5) +- Dépassement de tampon fixe dans le `lowerUTF8` et `upperUTF8` fonction. Retiré la possibilité d'exécuter ces fonctions sur `FixedString` tapez les arguments. [\#3662](https://github.com/ClickHouse/ClickHouse/pull/3662) +- Correction d'une condition de course rare lors de la suppression `MergeTree` table. [\#3680](https://github.com/ClickHouse/ClickHouse/pull/3680) +- Correction d'une condition de course lors de la lecture de `Buffer` tables et effectuer simultanément `ALTER` ou `DROP` sur les tables cibles. [\#3719](https://github.com/ClickHouse/ClickHouse/pull/3719) +- Correction d'un segfault si le `max_temporary_non_const_columns` limite a été dépassée. [\#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Amélioration: {#improvements-1} + +- Le serveur n'écrit pas les fichiers de configuration traités `/etc/clickhouse-server/` répertoire. Au lieu de cela, il les enregistre dans la `preprocessed_configs` répertoire à l'intérieur `path`. Cela signifie que l' `/etc/clickhouse-server/` répertoire n'ont pas d'accès en écriture pour le `clickhouse` de l'utilisateur, ce qui améliore la sécurité. [\#2443](https://github.com/ClickHouse/ClickHouse/pull/2443) +- Le `min_merge_bytes_to_use_direct_io` l'option est définie sur 10 GiB par défaut. Une fusion qui forme de grandes parties de tables de la famille MergeTree sera effectuée dans `O_DIRECT` mode, qui empêche l'expulsion excessive du cache de page. [\#3504](https://github.com/ClickHouse/ClickHouse/pull/3504) +- Démarrage accéléré du serveur lorsqu'il y a un très grand nombre de tables. [\#3398](https://github.com/ClickHouse/ClickHouse/pull/3398) +- Ajout d'un pool de connexion et HTTP `Keep-Alive` pour les connexions entre les répliques. [\#3594](https://github.com/ClickHouse/ClickHouse/pull/3594) +- Si la syntaxe de la requête n'est pas `400 Bad Request` le code est renvoyé dans la `HTTP` interface (500 a été retourné précédemment). [31bc680a](https://github.com/ClickHouse/ClickHouse/commit/31bc680ac5f4bb1d0360a8ba4696fa84bb47d6ab) +- Le `join_default_strictness` l'option est définie sur `ALL` par défaut, pour la compatibilité. [120e2cbe](https://github.com/ClickHouse/ClickHouse/commit/120e2cbe2ff4fbad626c28042d9b28781c805afe) +- Suppression de la journalisation vers `stderr` à partir de la `re2` bibliothèque pour les expressions régulières non valides ou complexes. [\#3723](https://github.com/ClickHouse/ClickHouse/pull/3723) +- Ajouté pour la `Kafka` moteur de table: vérifie les abonnements avant de commencer à lire à partir de Kafka; le paramètre kafka\_max\_block\_size pour la table. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3396) +- Le `cityHash64`, `farmHash64`, `metroHash64`, `sipHash64`, `halfMD5`, `murmurHash2_32`, `murmurHash2_64`, `murmurHash3_32`, et `murmurHash3_64` fonctions maintenant travailler pour n'importe quel nombre d'arguments et des arguments sous la forme de tuples. [\#3451](https://github.com/ClickHouse/ClickHouse/pull/3451) [\#3519](https://github.com/ClickHouse/ClickHouse/pull/3519) +- Le `arrayReverse` fonction fonctionne maintenant avec tous les types de tableaux. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Ajout d'un paramètre optionnel: la taille de l'emplacement pour le `timeSlots` fonction. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3724) +- Pour `FULL` et `RIGHT JOIN`, le `max_block_size` le paramètre est utilisé pour un flux de données non jointes à partir de la table de droite. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3699) +- Ajouté le `--secure` paramètre de ligne de commande dans `clickhouse-benchmark` et `clickhouse-performance-test` pour activer TLS. [\#3688](https://github.com/ClickHouse/ClickHouse/pull/3688) [\#3690](https://github.com/ClickHouse/ClickHouse/pull/3690) +- Conversion de Type lorsque la structure d'un `Buffer` type table ne correspond pas à la structure de la table de destination. [Vitaly Baranov](https://github.com/ClickHouse/ClickHouse/pull/3603) +- Ajouté le `tcp_keep_alive_timeout` option pour activer les paquets persistant après une inactivité de l'intervalle de temps spécifié. [\#3441](https://github.com/ClickHouse/ClickHouse/pull/3441) +- Suppression des guillemets inutiles de valeurs pour la clé de partition dans le `system.parts` le tableau si il se compose d'une seule colonne. [\#3652](https://github.com/ClickHouse/ClickHouse/pull/3652) +- La fonction modulo fonctionne pour `Date` et `DateTime` types de données. [\#3385](https://github.com/ClickHouse/ClickHouse/pull/3385) +- Ajouté synonymes pour le `POWER`, `LN`, `LCASE`, `UCASE`, `REPLACE`, `LOCATE`, `SUBSTR`, et `MID` fonction. [\#3774](https://github.com/ClickHouse/ClickHouse/pull/3774) [\#3763](https://github.com/ClickHouse/ClickHouse/pull/3763) Certains noms de fonctions sont insensibles à la casse pour la compatibilité avec le standard SQL. Sucre syntaxique ajouté `SUBSTRING(expr FROM start FOR length)` pour la compatibilité avec SQL. [\#3804](https://github.com/ClickHouse/ClickHouse/pull/3804) +- Ajout de la possibilité de `mlock` pages mémoire correspondant à `clickhouse-server` code exécutable pour l'empêcher d'être forcé hors de la mémoire. Cette fonctionnalité est désactivée par défaut. [\#3553](https://github.com/ClickHouse/ClickHouse/pull/3553) +- Amélioration des performances lors de la lecture de `O_DIRECT` (avec l' `min_bytes_to_use_direct_io` option activée). [\#3405](https://github.com/ClickHouse/ClickHouse/pull/3405) +- Amélioration de la performance de l' `dictGet...OrDefault` fonction pour un argument clé constant et un argument par défaut non constant. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3563) +- Le `firstSignificantSubdomain` la fonction traite maintenant les domaines `gov`, `mil`, et `edu`. [Igor Hatarist](https://github.com/ClickHouse/ClickHouse/pull/3601) Amélioration de la performance. [\#3628](https://github.com/ClickHouse/ClickHouse/pull/3628) +- Possibilité de spécifier des variables d'environnement personnalisées pour le démarrage `clickhouse-server` à l'aide de la `SYS-V init.d` script en définissant `CLICKHOUSE_PROGRAM_ENV` dans `/etc/default/clickhouse`. + [Pavlo Bashynskyi](https://github.com/ClickHouse/ClickHouse/pull/3612) +- Code de retour Correct pour le script d'initialisation clickhouse-server. [\#3516](https://github.com/ClickHouse/ClickHouse/pull/3516) +- Le `system.metrics` la table a maintenant le `VersionInteger` métrique, et `system.build_options` a la ligne ajoutée `VERSION_INTEGER`, qui contient la forme numérique de la version ClickHouse, telle que `18016000`. [\#3644](https://github.com/ClickHouse/ClickHouse/pull/3644) +- Retiré la possibilité de comparer la `Date` tapez avec un nombre pour éviter les erreurs potentielles comme `date = 2018-12-17`, où les citations autour de la date sont omises par erreur. [\#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) +- Correction du comportement des fonctions avec État comme `rowNumberInAllBlocks`. Ils ont précédemment sorti un résultat qui était un nombre plus grand en raison du démarrage lors de l'analyse de la requête. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3729) +- Si l' `force_restore_data` le fichier ne peut pas être supprimé, un message d'erreur est affiché. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3794) + +#### Construire des améliorations: {#build-improvements-1} + +- Mise à jour le `jemalloc` bibliothèque, qui corrige une fuite de mémoire potentielle. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3557) +- Profilage avec `jemalloc` est activé par défaut pour les versions de débogage. [2cc82f5c](https://github.com/ClickHouse/ClickHouse/commit/2cc82f5cbe266421cd4c1165286c2c47e5ffcb15) +- Ajout de la possibilité d'exécuter des tests d'intégration lorsque `Docker` est installé sur le système. [\#3650](https://github.com/ClickHouse/ClickHouse/pull/3650) +- Ajout du test d'expression fuzz dans les requêtes SELECT. [\#3442](https://github.com/ClickHouse/ClickHouse/pull/3442) +- Ajout d'un test de stress pour les commits, qui effectue des tests fonctionnels en parallèle et dans un ordre aléatoire pour détecter plus de conditions de course. [\#3438](https://github.com/ClickHouse/ClickHouse/pull/3438) +- Amélioration de la méthode de démarrage de clickhouse-server dans une image Docker. [Elghazal Ahmed](https://github.com/ClickHouse/ClickHouse/pull/3663) +- Pour une image Docker, ajout du support pour l'initialisation des bases de données à l'aide de fichiers dans le `/docker-entrypoint-initdb.d` répertoire. [Konstantin Lebedev](https://github.com/ClickHouse/ClickHouse/pull/3695) +- Corrections pour les builds sur ARM. [\#3709](https://github.com/ClickHouse/ClickHouse/pull/3709) + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes} + +- Retiré la possibilité de comparer la `Date` tapez avec un numéro. Plutôt `toDate('2018-12-18') = 17883`, vous devez utiliser la conversion de type explicite `= toDate(17883)` [\#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) + +## Clickhouse version 18.14 {#clickhouse-release-18-14} + +### Clickhouse version 18.14.19, 2018-12-19 {#clickhouse-release-18-14-19-2018-12-19} + +#### Corrections de bugs: {#bug-fixes-2} + +- Correction d'une erreur qui a conduit à des problèmes avec la mise à jour des dictionnaires avec la source ODBC. [\#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [\#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- Les bases de données sont correctement spécifiées lors de L'exécution de DDL `ON CLUSTER` requête. [\#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Correction d'un segfault si le `max_temporary_non_const_columns` limite a été dépassée. [\#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Construire des améliorations: {#build-improvements-2} + +- Corrections pour les builds sur ARM. + +### Clickhouse version 18.14.18, 2018-12-04 {#clickhouse-release-18-14-18-2018-12-04} + +#### Corrections de bugs: {#bug-fixes-3} + +- Correction d'une erreur dans `dictGet...` fonction pour les dictionnaires de type `range` si un des arguments est constante et l'autre ne l'est pas. [\#3751](https://github.com/ClickHouse/ClickHouse/pull/3751) +- Correction d'une erreur qui a causé des messages `netlink: '...': attribute type 1 has an invalid length` pour être imprimé dans le journal du noyau Linux, cela ne se passait que sur des versions assez fraîches du noyau Linux. [\#3749](https://github.com/ClickHouse/ClickHouse/pull/3749) +- Fixe erreur de segmentation en fonction `empty` pour l'argument de `FixedString` type. [Daniel, Dao Quang Minh](https://github.com/ClickHouse/ClickHouse/pull/3703) +- Correction d'une allocation de mémoire excessive lors de l'utilisation d'une grande valeur de `max_query_size` (a la mémoire de morceau de `max_query_size` octets a été préalloué à la fois). [\#3720](https://github.com/ClickHouse/ClickHouse/pull/3720) + +#### Construire des changements: {#build-changes} + +- Correction de la construction avec les bibliothèques LLVM/Clang de la version 7 à partir des paquets du système D'exploitation (ces bibliothèques sont utilisées pour la compilation de requêtes d'exécution). [\#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### Clickhouse version 18.14.17, 2018-11-30 {#clickhouse-release-18-14-17-2018-11-30} + +#### Corrections de bugs: {#bug-fixes-4} + +- Correction de cas où le processus de pont ODBC ne s'est pas terminé avec le processus du serveur principal. [\#3642](https://github.com/ClickHouse/ClickHouse/pull/3642) +- Insertion synchrone fixe dans le `Distributed` table avec une liste des colonnes qui diffère de la liste des colonnes de la table distante. [\#3673](https://github.com/ClickHouse/ClickHouse/pull/3673) +- Correction d'une condition de concurrence rare qui peut conduire à un crash lors de la suppression D'une table MergeTree. [\#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Correction d'un blocage de requête dans le cas où la création de thread de requête échoue avec le `Resource temporarily unavailable` erreur. [\#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Fixe de l'analyse de l' `ENGINE` clause lorsque le `CREATE AS table` la syntaxe a été utilisée et `ENGINE` la clause a été spécifiée avant le `AS table` (l'erreur a entraîné en ignorant le moteur). [\#3692](https://github.com/ClickHouse/ClickHouse/pull/3692) + +### Clickhouse version 18.14.15, 2018-11-21 {#clickhouse-release-18-14-15-2018-11-21} + +#### Corrections de bugs: {#bug-fixes-5} + +- La taille du bloc de mémoire a été surestimée lors de la désérialisation de la colonne de type `Array(String)` qui conduit à “Memory limit exceeded” erreur. Le problème est apparu dans la version 18.12.13. [\#3589](https://github.com/ClickHouse/ClickHouse/issues/3589) + +### Clickhouse version 18.14.14, 2018-11-20 {#clickhouse-release-18-14-14-2018-11-20} + +#### Corrections de bugs: {#bug-fixes-6} + +- Fixe `ON CLUSTER` requêtes lorsque le cluster est configuré comme sécurisé (indicateur ``). [\#3599](https://github.com/ClickHouse/ClickHouse/pull/3599) + +#### Construire des changements: {#build-changes-1} + +- Correction de problèmes (llvm-7 du système, macos) [\#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### Clickhouse version 18.14.13, 2018-11-08 {#clickhouse-release-18-14-13-2018-11-08} + +#### Corrections de bugs: {#bug-fixes-7} + +- Correction de l' `Block structure mismatch in MergingSorted stream` erreur. [\#3162](https://github.com/ClickHouse/ClickHouse/issues/3162) +- Fixe `ON CLUSTER` requêtes dans le cas où les connexions sécurisées ont été activées dans la configuration du cluster (le `` drapeau). [\#3465](https://github.com/ClickHouse/ClickHouse/pull/3465) +- Correction d'une erreur dans les requêtes utilisées `SAMPLE`, `PREWHERE` et les colonnes alias. [\#3543](https://github.com/ClickHouse/ClickHouse/pull/3543) +- Correction d'un rare `unknown compression method` erreur lors de la `min_bytes_to_use_direct_io` le réglage a été activé. [3544](https://github.com/ClickHouse/ClickHouse/pull/3544) + +#### Amélioration des performances: {#performance-improvements} + +- Régression de performance fixe des requêtes avec `GROUP BY` de colonnes de type UInt16 ou Date lors de l'exécution sur les processeurs AMD EPYC. [Igor Lapko](https://github.com/ClickHouse/ClickHouse/pull/3512) +- Correction de la régression des performances des requêtes qui traitent les chaînes longues. [\#3530](https://github.com/ClickHouse/ClickHouse/pull/3530) + +#### Construire des améliorations: {#build-improvements-3} + +- Améliorations pour simplifier la construction Arcadia. [\#3475](https://github.com/ClickHouse/ClickHouse/pull/3475), [\#3535](https://github.com/ClickHouse/ClickHouse/pull/3535) + +### Clickhouse version 18.14.12, 2018-11-02 {#clickhouse-release-18-14-12-2018-11-02} + +#### Corrections de bugs: {#bug-fixes-8} + +- Correction d'un plantage lors de la jonction de deux sous-requêtes sans nom. [\#3505](https://github.com/ClickHouse/ClickHouse/pull/3505) +- Fixe générant des requêtes incorrectes (avec un vide `WHERE` clause) lors de l'interrogation de bases de données externes. [hotid](https://github.com/ClickHouse/ClickHouse/pull/3477) +- Correction en utilisant une valeur de délai d'attente incorrecte Dans les dictionnaires ODBC. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3511) + +### Clickhouse version 18.14.11, 2018-10-29 {#clickhouse-release-18-14-11-2018-10-29} + +#### Corrections de bugs: {#bug-fixes-9} + +- Correction de l'erreur `Block structure mismatch in UNION stream: different number of columns` dans les requêtes LIMIT. [\#2156](https://github.com/ClickHouse/ClickHouse/issues/2156) +- Correction d'erreurs lors de la fusion de données dans des tables contenant des tableaux à l'intérieur de structures imbriquées. [\#3397](https://github.com/ClickHouse/ClickHouse/pull/3397) +- Correction de résultats de requête incorrects si le `merge_tree_uniform_read_distribution` paramètre est désactivé (il est activé par défaut). [\#3429](https://github.com/ClickHouse/ClickHouse/pull/3429) +- Correction d'une erreur sur les insertions à une table distribuée au format natif. [\#3411](https://github.com/ClickHouse/ClickHouse/issues/3411) + +### Clickhouse version 18.14.10, 2018-10-23 {#clickhouse-release-18-14-10-2018-10-23} + +- Le `compile_expressions` le paramètre (compilation JIT d'expressions) est désactivé par défaut. [\#3410](https://github.com/ClickHouse/ClickHouse/pull/3410) +- Le `enable_optimize_predicate_expression` paramètre est désactivé par défaut. + +### Clickhouse version 18.14.9, 2018-10-16 {#clickhouse-release-18-14-9-2018-10-16} + +#### Nouveauté: {#new-features-1} + +- Le `WITH CUBE` le modificateur `GROUP BY` (la syntaxe alternative `GROUP BY CUBE(...)` est également disponible). [\#3172](https://github.com/ClickHouse/ClickHouse/pull/3172) +- Ajouté le `formatDateTime` fonction. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2770) +- Ajouté le `JDBC` tableau moteur et `jdbc` fonction table (nécessite l'installation de clickhouse-JDBC-bridge). [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- Ajout de fonctions pour travailler avec le numéro de semaine ISO: `toISOWeek`, `toISOYear`, `toStartOfISOYear`, et `toDayOfYear`. [\#3146](https://github.com/ClickHouse/ClickHouse/pull/3146) +- Maintenant, vous pouvez utiliser `Nullable` colonnes pour `MySQL` et `ODBC` table. [\#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Imbriquée structures de données peuvent être lues comme des objets imbriqués dans `JSONEachRow` format. Ajouté le `input_format_import_nested_json` paramètre. [Veloman Yunkan](https://github.com/ClickHouse/ClickHouse/pull/3144) +- Le traitement parallèle est disponible pour beaucoup `MATERIALIZED VIEW`s lors de l'insertion de données. Voir la `parallel_view_processing` paramètre. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3208) +- Ajouté le `SYSTEM FLUSH LOGS` requête (vidage forcé des journaux sur les tables système telles que `query_log`) [\#3321](https://github.com/ClickHouse/ClickHouse/pull/3321) +- Maintenant, vous pouvez utiliser prédéfinis `database` et `table` macros lors de la déclaration `Replicated` table. [\#3251](https://github.com/ClickHouse/ClickHouse/pull/3251) +- A ajouté la capacité de lire `Decimal` valeurs de type en notation d'ingénierie (indiquant des puissances de dix). [\#3153](https://github.com/ClickHouse/ClickHouse/pull/3153) + +#### Caractéristiques expérimentales: {#experimental-features} + +- Optimisation de la clause GROUP BY pour `LowCardinality data types.` [\#3138](https://github.com/ClickHouse/ClickHouse/pull/3138) +- Calcul optimisé des expressions pour `LowCardinality data types.` [\#3200](https://github.com/ClickHouse/ClickHouse/pull/3200) + +#### Amélioration: {#improvements-2} + +- Consommation de mémoire considérablement réduite pour les requêtes avec `ORDER BY` et `LIMIT`. Voir la `max_bytes_before_remerge_sort` paramètre. [\#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- En l'absence de `JOIN` (`LEFT`, `INNER`, …), `INNER JOIN` est supposé. [\#3147](https://github.com/ClickHouse/ClickHouse/pull/3147) +- Qualifié astérisques fonctionner correctement dans les requêtes avec `JOIN`. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3202) +- Le `ODBC` table engine choisit correctement la méthode de citation des identifiants dans le dialecte SQL d'une base de données distante. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- Le `compile_expressions` le paramètre (compilation JIT des expressions) est activé par défaut. +- Correction du comportement pour la base de données/TABLE DROP simultanée si existe et créer une base de données/TABLE si N'existe pas. Auparavant, un `CREATE DATABASE ... IF NOT EXISTS` requête peut renvoyer le message d'erreur “File … already exists” et la `CREATE TABLE ... IF NOT EXISTS` et `DROP TABLE IF EXISTS` les requêtes peuvent revenir `Table ... is creating or attaching right now`. [\#3101](https://github.com/ClickHouse/ClickHouse/pull/3101) +- Les expressions LIKE ET IN avec une moitié droite constante sont passées au serveur distant lors de l'interrogation à partir de tables MySQL ou ODBC. [\#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Les comparaisons avec des expressions constantes dans une clause WHERE sont transmises au serveur distant lors de l'interrogation à partir de tables MySQL et ODBC. Auparavant, seules les comparaisons avec les constantes étaient passées. [\#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Calcul Correct de la largeur de ligne dans le terminal pour `Pretty` formats, y compris les chaînes avec des hiéroglyphes. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/3257). +- `ON CLUSTER` peut être spécifié pour `ALTER UPDATE` requête. +- Amélioration des performances de lecture des données `JSONEachRow` format. [\#3332](https://github.com/ClickHouse/ClickHouse/pull/3332) +- Ajouté synonymes pour le `LENGTH` et `CHARACTER_LENGTH` fonctions de compatibilité. Le `CONCAT` la fonction n'est plus sensible à la casse. [\#3306](https://github.com/ClickHouse/ClickHouse/pull/3306) +- Ajouté le `TIMESTAMP` synonyme de la `DateTime` type. [\#3390](https://github.com/ClickHouse/ClickHouse/pull/3390) +- Il y a toujours de l'espace réservé pour query\_id dans les journaux du serveur, même si la ligne de journal n'est pas liée à une requête. Cela facilite l'analyse des journaux de texte du serveur avec des outils tiers. +- La consommation de mémoire par une requête est enregistrée lorsqu'il dépasse le niveau suivant d'un nombre entier de gigaoctets. [\#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- Ajout du mode de compatibilité pour le cas où la bibliothèque cliente qui utilise le protocole natif envoie moins de colonnes par erreur que ce que le serveur attend pour la requête D'insertion. Ce scénario était possible lors de l'utilisation de la bibliothèque clickhouse-cpp. Auparavant, ce scénario provoquait le plantage du serveur. [\#3171](https://github.com/ClickHouse/ClickHouse/pull/3171) +- Dans une expression WHERE définie par l'utilisateur `clickhouse-copier` vous pouvez maintenant utiliser un `partition_key` alias (pour un filtrage supplémentaire par partition de table source). Ceci est utile si le schéma de partitionnement change pendant la copie, mais ne change que légèrement. [\#3166](https://github.com/ClickHouse/ClickHouse/pull/3166) +- Le flux de travail du `Kafka` le moteur a été déplacé vers un pool de threads en arrière-plan afin de réduire automatiquement la vitesse de lecture des données à des charges élevées. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- Support pour la lecture `Tuple` et `Nested` valeurs de structures comme `struct` dans le `Cap'n'Proto format`. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3216) +- La liste des domaines de premier niveau pour les `firstSignificantSubdomain` la fonction inclut maintenant le domaine `biz`. [décaséale](https://github.com/ClickHouse/ClickHouse/pull/3219) +- Dans la configuration des dictionnaires externes, `null_value` est interprétée comme la valeur du type de données par défaut. [\#3330](https://github.com/ClickHouse/ClickHouse/pull/3330) +- Soutien pour le `intDiv` et `intDivOrZero` fonctions pour `Decimal`. [b48402e8](https://github.com/ClickHouse/ClickHouse/commit/b48402e8712e2b9b151e0eef8193811d433a1264) +- Soutien pour le `Date`, `DateTime`, `UUID`, et `Decimal` types comme clé pour le `sumMap` fonction d'agrégation. [\#3281](https://github.com/ClickHouse/ClickHouse/pull/3281) +- Soutien pour le `Decimal` type de données dans les dictionnaires externes. [\#3324](https://github.com/ClickHouse/ClickHouse/pull/3324) +- Soutien pour le `Decimal` type de données dans `SummingMergeTree` table. [\#3348](https://github.com/ClickHouse/ClickHouse/pull/3348) +- Ajouté spécialisations pour `UUID` dans `if`. [\#3366](https://github.com/ClickHouse/ClickHouse/pull/3366) +- Réduit le nombre de `open` et `close` les appels système lors de la lecture d'un `MergeTree table`. [\#3283](https://github.com/ClickHouse/ClickHouse/pull/3283) +- A `TRUNCATE TABLE` requête peut être exécutée sur n'importe quel réplica (la requête est transmise au chef de réplique). [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3375) + +#### Corrections de bugs: {#bug-fixes-10} + +- Correction d'un problème avec `Dictionary` tables pour `range_hashed` dictionnaire. Cette erreur s'est produite dans la version 18.12.17. [\#1702](https://github.com/ClickHouse/ClickHouse/pull/1702) +- Correction d'une erreur lors du chargement `range_hashed` les dictionnaires (le message `Unsupported type Nullable (...)`). Cette erreur s'est produite dans la version 18.12.17. [\#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Corrigé des erreurs dans la `pointInPolygon` fonction due à l'accumulation de calculs inexacts pour les polygones avec un grand nombre de sommets situés à proximité les uns des autres. [\#3331](https://github.com/ClickHouse/ClickHouse/pull/3331) [\#3341](https://github.com/ClickHouse/ClickHouse/pull/3341) +- Si, après la fusion de parties de données, la somme de contrôle de la partie résultante diffère du résultat de la même fusion dans une autre réplique, le résultat de la fusion est supprimé et la partie de données est téléchargée à partir de l'autre réplique (c'est le comportement correct). Mais après avoir téléchargé la partie data, elle n'a pas pu être ajoutée à l'ensemble de travail en raison d'une erreur indiquant que la partie existe déjà (car la partie data a été supprimée avec un certain retard après la fusion). Cela a conduit à cycliques tente de télécharger les mêmes données. [\#3194](https://github.com/ClickHouse/ClickHouse/pull/3194) +- Correction d'un calcul incorrect de la consommation totale de mémoire par les requêtes (en raison d'un calcul incorrect, le `max_memory_usage_for_all_queries` le réglage n'a pas fonctionné correctement et le `MemoryTracking` métrique a une valeur incorrecte). Cette erreur s'est produite dans la version 18.12.13. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3344) +- Correction de la fonctionnalité de `CREATE TABLE ... ON CLUSTER ... AS SELECT ...` Cette erreur s'est produite dans la version 18.12.13. [\#3247](https://github.com/ClickHouse/ClickHouse/pull/3247) +- Correction de la préparation inutile des structures de données pour `JOIN`s sur le serveur qui initie la requête si `JOIN` est effectué uniquement sur des serveurs distants. [\#3340](https://github.com/ClickHouse/ClickHouse/pull/3340) +- Correction de bugs dans le `Kafka` engine: blocages après les exceptions lors du démarrage de la lecture des données, et verrous à la fin [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- Pour `Kafka` tableaux, le facultatif `schema` le paramètre n'a pas été passé (le schéma du `Cap'n'Proto` format). [Vojtech Splichal](https://github.com/ClickHouse/ClickHouse/pull/3150) +- Si L'ensemble des serveurs ZooKeeper a des serveurs qui acceptent la connexion mais la ferment immédiatement au lieu de répondre à la prise de contact, ClickHouse choisit de connecter un autre serveur. Auparavant, cela produisait l'erreur `Cannot read all data. Bytes read: 0. Bytes expected: 4.` et le serveur ne pouvait pas commencer. [8218cf3a](https://github.com/ClickHouse/ClickHouse/commit/8218cf3a5f39a43401953769d6d12a0bb8d29da9) +- Si L'ensemble des serveurs ZooKeeper contient des serveurs pour lesquels la requête DNS renvoie une erreur, ces serveurs sont ignorés. [17b8e209](https://github.com/ClickHouse/ClickHouse/commit/17b8e209221061325ad7ba0539f03c6e65f87f29) +- Conversion de type fixe entre `Date` et `DateTime` lors de l'insertion de données dans le `VALUES` format (si `input_format_values_interpret_expressions = 1`). Auparavant, la conversion était effectuée entre la valeur numérique du nombre de jours dans Unix Epoch time et L'horodatage Unix, ce qui conduisait à des résultats inattendus. [\#3229](https://github.com/ClickHouse/ClickHouse/pull/3229) +- Conversion de type corrigée entre `Decimal` et des nombres entiers. [\#3211](https://github.com/ClickHouse/ClickHouse/pull/3211) +- Corrigé des erreurs dans la `enable_optimize_predicate_expression` paramètre. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3231) +- Correction d'une erreur D'analyse au format CSV avec des nombres à virgule flottante si un séparateur CSV non par défaut est utilisé, tel que `;` [\#3155](https://github.com/ClickHouse/ClickHouse/pull/3155) +- Correction de l' `arrayCumSumNonNegative` fonction (il n'accumule pas de valeurs négatives si l'accumulateur est inférieur à zéro). [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/3163) +- Fixe comment `Merge` les tables de travail sur le dessus de `Distributed` tables lors de l'utilisation `PREWHERE`. [\#3165](https://github.com/ClickHouse/ClickHouse/pull/3165) +- Corrections de bugs dans l' `ALTER UPDATE` requête. +- Correction de bugs dans le `odbc` fonction de table apparue dans la version 18.12. [\#3197](https://github.com/ClickHouse/ClickHouse/pull/3197) +- Correction du fonctionnement des fonctions d'agrégat avec `StateArray` combinators. [\#3188](https://github.com/ClickHouse/ClickHouse/pull/3188) +- Correction d'un crash lors de la division d'une `Decimal` valeur par zéro. [69dd6609](https://github.com/ClickHouse/ClickHouse/commit/69dd6609193beb4e7acd3e6ad216eca0ccfb8179) +- Sortie fixe des types pour les opérations utilisant `Decimal` et des arguments entiers. [\#3224](https://github.com/ClickHouse/ClickHouse/pull/3224) +- Correction du segfault pendant `GROUP BY` sur `Decimal128`. [3359ba06](https://github.com/ClickHouse/ClickHouse/commit/3359ba06c39fcd05bfdb87d6c64154819621e13a) +- Le `log_query_threads` le paramètre (journalisation des informations sur chaque thread d'exécution de la requête) ne prend effet que si `log_queries` l'option (journalisation des informations sur les requêtes) est définie sur 1. Depuis le `log_query_threads` l'option est activée par défaut, les informations sur les threads ont déjà été enregistrées même si la journalisation des requêtes a été désactivée. [\#3241](https://github.com/ClickHouse/ClickHouse/pull/3241) +- Correction d'une erreur dans le fonctionnement distribué de la fonction d'agrégat quantiles (le message d'erreur `Not found column quantile...`). [292a8855](https://github.com/ClickHouse/ClickHouse/commit/292a885533b8e3b41ce8993867069d14cbd5a664) +- Correction du problème de compatibilité lorsque vous travaillez sur un cluster de serveurs de version 18.12.17 et de serveurs plus anciens en même temps. Pour les requêtes distribuées avec des clés GROUP BY de longueur fixe et non fixe, s'il y avait une grande quantité de données à agréger, les données renvoyées n'étaient pas toujours entièrement agrégées (deux lignes différentes contenaient les mêmes clés d'agrégation). [\#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) +- Manipulation fixe des substitutions dans `clickhouse-performance-test` si la requête ne contient qu'une partie des substitutions déclaré dans le test. [\#3263](https://github.com/ClickHouse/ClickHouse/pull/3263) +- Correction d'une erreur lors de l'utilisation `FINAL` avec `PREWHERE`. [\#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Correction d'une erreur lors de l'utilisation `PREWHERE` sur les colonnes qui ont été ajoutées pendant `ALTER`. [\#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Ajout d'une vérification de l'absence de `arrayJoin` pour `DEFAULT` et `MATERIALIZED` expression. Précédemment, `arrayJoin` conduit à une erreur lors de l'insertion de données. [\#3337](https://github.com/ClickHouse/ClickHouse/pull/3337) +- Ajout d'une vérification de l'absence de `arrayJoin` dans un `PREWHERE` clause. Auparavant, cela a conduit à des messages comme `Size ... doesn't match` ou `Unknown compression method` lors de l'exécution de requêtes. [\#3357](https://github.com/ClickHouse/ClickHouse/pull/3357) +- Correction de segfault qui pourrait se produire dans de rares cas après l'optimisation qui a remplacé et chaînes des évaluations d'égalité avec l'expression IN correspondante. [liuyimin-bytedance](https://github.com/ClickHouse/ClickHouse/pull/3339) +- Corrections mineures à `clickhouse-benchmark`: auparavant, les informations client n'étaient pas envoyées au serveur; maintenant, le nombre de requêtes exécutées est calculé plus précisément lors de l'arrêt et pour limiter le nombre d'itérations. [\#3351](https://github.com/ClickHouse/ClickHouse/pull/3351) [\#3352](https://github.com/ClickHouse/ClickHouse/pull/3352) + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-1} + +- Enlevé le `allow_experimental_decimal_type` option. Le `Decimal` type de données est disponible pour utilisation par défaut. [\#3329](https://github.com/ClickHouse/ClickHouse/pull/3329) + +## Clickhouse Version 18.12 {#clickhouse-release-18-12} + +### Clickhouse version 18.12.17, 2018-09-16 {#clickhouse-release-18-12-17-2018-09-16} + +#### Nouveauté: {#new-features-2} + +- `invalidate_query` (la possibilité de spécifier une requête pour vérifier si un dictionnaire externe doit être mis à jour) est implémentée pour `clickhouse` source. [\#3126](https://github.com/ClickHouse/ClickHouse/pull/3126) +- Ajout de la possibilité d'utiliser `UInt*`, `Int*`, et `DateTime` types de données (avec le `Date` le type) comme un `range_hashed` clé de dictionnaire externe qui définit les limites des plages. Maintenant `NULL` peut être utilisé pour désigner un intervalle ouvert. [Vasily Nemkov](https://github.com/ClickHouse/ClickHouse/pull/3123) +- Le `Decimal` type prend maintenant en charge `var*` et `stddev*` les fonctions d'agrégation. [\#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- Le `Decimal` type prend désormais en charge les fonctions mathématiques (`exp`, `sin` et ainsi de suite.) [\#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- Le `system.part_log` la table a maintenant le `partition_id` colonne. [\#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Corrections de bugs: {#bug-fixes-11} + +- `Merge` fonctionne maintenant correctement sur `Distributed` table. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3159) +- Incompatibilité fixe (dépendance inutile sur le `glibc` version) qui a rendu impossible l'exécution de ClickHouse sur `Ubuntu Precise` et les anciennes versions. L'incompatibilité est apparue dans la version 18.12.13. [\#3130](https://github.com/ClickHouse/ClickHouse/pull/3130) +- Corrigé des erreurs dans la `enable_optimize_predicate_expression` paramètre. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) +- Correction d'un problème mineur de rétrocompatibilité apparu lors de l'utilisation d'un cluster de répliques sur des versions antérieures au 18.12.13 et de la création simultanée d'une nouvelle réplique d'une table sur un serveur avec une version plus récente (indiquée dans le message `Can not clone replica, because the ... updated to new ClickHouse version`, ce qui est logique, mais ne devrait pas arriver). [\#3122](https://github.com/ClickHouse/ClickHouse/pull/3122) + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-2} + +- Le `enable_optimize_predicate_expression` option est activée par défaut (ce qui est plutôt optimiste). Si des erreurs d'analyse de requête se produisent liées à la recherche des noms de colonnes, définissez `enable_optimize_predicate_expression` à 0. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) + +### Clickhouse version 18.12.14, 2018-09-13 {#clickhouse-release-18-12-14-2018-09-13} + +#### Nouveauté: {#new-features-3} + +- Ajout du support pour `ALTER UPDATE` requête. [\#3035](https://github.com/ClickHouse/ClickHouse/pull/3035) +- Ajouté le `allow_ddl` option, qui limite l'accès de L'utilisateur aux requêtes DDL. [\#3104](https://github.com/ClickHouse/ClickHouse/pull/3104) +- Ajouté le `min_merge_bytes_to_use_direct_io` option pour `MergeTree` moteurs, qui vous permet de définir un seuil pour la taille totale de la fusion (quand au-dessus du seuil, les fichiers de partie de données seront traités en utilisant O\_DIRECT). [\#3117](https://github.com/ClickHouse/ClickHouse/pull/3117) +- Le `system.merges` la table système contient maintenant `partition_id` colonne. [\#3099](https://github.com/ClickHouse/ClickHouse/pull/3099) + +#### Amélioration {#improvements-3} + +- Si une partie de données reste inchangée pendant la mutation, elle n'est pas téléchargée par les répliques. [\#3103](https://github.com/ClickHouse/ClickHouse/pull/3103) +- La saisie semi-automatique est disponible pour les noms de paramètres lorsque vous travaillez avec `clickhouse-client`. [\#3106](https://github.com/ClickHouse/ClickHouse/pull/3106) + +#### Corrections de bugs: {#bug-fixes-12} + +- Ajouter un chèque pour les montants des tableaux sont des éléments de `Nested` les champs de type lors de l'insertion. [\#3118](https://github.com/ClickHouse/ClickHouse/pull/3118) +- Correction d'une erreur de mise à jour des dictionnaires externes `ODBC` source et `hashed` stockage. Cette erreur s'est produite dans la version 18.12.13. +- Correction d'un plantage lors de la création d'une table temporaire à partir d'une requête `IN` condition. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3098) +- Correction d'une erreur dans les fonctions d'agrégation pour les tableaux peuvent avoir `NULL` élément. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/3097) + +### Clickhouse version 18.12.13, 2018-09-10 {#clickhouse-release-18-12-13-2018-09-10} + +#### Nouveauté: {#new-features-4} + +- Ajouté le `DECIMAL(digits, scale)` type de données (`Decimal32(scale)`, `Decimal64(scale)`, `Decimal128(scale)`). Pour l'activer, utilisez le paramètre `allow_experimental_decimal_type`. [\#2846](https://github.com/ClickHouse/ClickHouse/pull/2846) [\#2970](https://github.com/ClickHouse/ClickHouse/pull/2970) [\#3008](https://github.com/ClickHouse/ClickHouse/pull/3008) [\#3047](https://github.com/ClickHouse/ClickHouse/pull/3047) +- Nouveau `WITH ROLLUP` le modificateur `GROUP BY` (syntaxe alternative: `GROUP BY ROLLUP(...)`). [\#2948](https://github.com/ClickHouse/ClickHouse/pull/2948) +- Dans les requêtes avec jointure, le caractère étoile se développe en une liste de colonnes dans toutes les tables, conformément à la norme SQL. Vous pouvez restaurer l'ancien comportement en paramètre `asterisk_left_columns_only` à 1 au niveau de la configuration utilisateur. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2787) +- Ajout du support pour joindre avec les fonctions de table. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Saisie semi-automatique en appuyant sur Tab dans clickhouse-client. [Sergey Shcherbin](https://github.com/ClickHouse/ClickHouse/pull/2447) +- Ctrl + C dans clickhouse-client efface une requête qui a été entrée. [\#2877](https://github.com/ClickHouse/ClickHouse/pull/2877) +- Ajouté le `join_default_strictness` paramètre (valeurs: `"`, `'any'`, `'all'`). Cela vous permet de ne pas préciser `ANY` ou `ALL` pour `JOIN`. [\#2982](https://github.com/ClickHouse/ClickHouse/pull/2982) +- Chaque ligne du journal du serveur associée au traitement de la requête affiche L'ID de la requête. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Maintenant, vous pouvez obtenir des journaux d'exécution de requête dans clickhouse-client (utilisez le `send_logs_level` paramètre). Avec le traitement des requêtes distribuées, les journaux sont cascadés à partir de tous les serveurs. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Le `system.query_log` et `system.processes` (`SHOW PROCESSLIST` les tableaux ont maintenant des informations sur tous les paramètres modifiés lorsque vous exécutez une requête (la structure imbriquée de l' `Settings` données). Ajouté le `log_query_settings` paramètre. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Le `system.query_log` et `system.processes` les tables affichent désormais des informations sur le nombre de threads participant à l'exécution de la requête (voir `thread_numbers` colonne). [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Ajouter `ProfileEvents` compteurs qui mesurent le temps passé à lire et à écrire sur le réseau et à lire et à écrire sur le disque, le nombre d'erreurs réseau et le temps passé à attendre lorsque la bande passante réseau est limitée. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Ajouter `ProfileEvents`compteurs qui contiennent les métriques système de rusage (vous pouvez les utiliser pour obtenir des informations sur L'utilisation du processeur dans l'espace utilisateur et le noyau, les erreurs de page et les commutateurs de contexte), ainsi que les métriques taskstats (utilisez-les pour obtenir des informations sur le temps d'attente d'E/S, le temps D'attente du processeur et [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Le `ProfileEvents` les compteurs sont appliqués globalement et pour chaque requête, ainsi que pour chaque thread d'exécution de requête, ce qui vous permet de profiler la consommation de ressources par requête en détail. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Ajouté le `system.query_thread_log` table, qui contient des informations sur chaque thread d'exécution de requête. Ajouté le `log_query_threads` paramètre. [\#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Le `system.metrics` et `system.events` les tables ont maintenant une documentation intégrée. [\#3016](https://github.com/ClickHouse/ClickHouse/pull/3016) +- Ajouté le `arrayEnumerateDense` fonction. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2975) +- Ajouté le `arrayCumSumNonNegative` et `arrayDifference` fonction. [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/2942) +- Ajouté le `retention` fonction d'agrégation. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2887) +- Vous pouvez maintenant ajouter (fusionner) des états de fonctions d'agrégat en utilisant l'opérateur plus et multiplier les états de fonctions d'agrégat par une constante non négative. [\#3062](https://github.com/ClickHouse/ClickHouse/pull/3062) [\#3034](https://github.com/ClickHouse/ClickHouse/pull/3034) +- Les Tables de la famille MergeTree ont maintenant la colonne virtuelle `_partition_id`. [\#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Caractéristiques expérimentales: {#experimental-features-1} + +- Ajouté le `LowCardinality(T)` type de données. Ce type de données crée automatiquement un dictionnaire local de valeurs et permet le traitement des données sans déballer le dictionnaire. [\#2830](https://github.com/ClickHouse/ClickHouse/pull/2830) +- Ajout d'un cache de fonctions compilées JIT et d'un compteur pour le nombre d'utilisations avant la compilation. Pour compiler des expressions JIT, activez `compile_expressions` paramètre. [\#2990](https://github.com/ClickHouse/ClickHouse/pull/2990) [\#3077](https://github.com/ClickHouse/ClickHouse/pull/3077) + +#### Amélioration: {#improvements-4} + +- Correction du problème avec l'accumulation illimitée du journal de réplication quand il y a des répliques abandonnées. Ajout d'un mode de récupération efficace pour les répliques avec un long décalage. +- Amélioration des performances de `GROUP BY` avec l'agrégation de plusieurs champs lorsque l'un d'eux est une chaîne et les autres sont de longueur fixe. +- Amélioration des performances lors de l'utilisation `PREWHERE` et avec transfert implicite d'expressions dans `PREWHERE`. +- Amélioration des performances d'analyse pour les formats de texte (`CSV`, `TSV`). [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2977) [\#2980](https://github.com/ClickHouse/ClickHouse/pull/2980) +- Amélioration des performances de lecture des chaînes et des tableaux dans les formats binaires. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2955) +- Augmentation des performances et réduction de la consommation de mémoire pour les requêtes `system.tables` et `system.columns` quand il y a un très grand nombre de tables sur un seul serveur. [\#2953](https://github.com/ClickHouse/ClickHouse/pull/2953) +- Correction d'un problème de performances dans le cas d'un grand flux de requêtes résultant en une erreur (la `_dl_addr` la fonction est visible dans `perf top` mais le serveur n'utilise pas beaucoup de CPU). [\#2938](https://github.com/ClickHouse/ClickHouse/pull/2938) +- Les Conditions sont converties dans la vue (lorsque `enable_optimize_predicate_expression` est activé). [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Améliorations de la fonctionnalité pour le `UUID` type de données. [\#3074](https://github.com/ClickHouse/ClickHouse/pull/3074) [\#2985](https://github.com/ClickHouse/ClickHouse/pull/2985) +- Le `UUID` le type de données est pris en charge dans les dictionnaires-Alchemist. [\#2822](https://github.com/ClickHouse/ClickHouse/pull/2822) +- Le `visitParamExtractRaw` la fonction fonctionne correctement avec les structures imbriquées. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2974) +- Lorsque l' `input_format_skip_unknown_fields` paramètre est activé, les champs d'objet dans `JSONEachRow` format sont ignorés correctement. [BlahGeek](https://github.com/ClickHouse/ClickHouse/pull/2958) +- Pour un `CASE` expression avec conditions, vous pouvez maintenant omettre `ELSE`, ce qui est équivalent à `ELSE NULL`. [\#2920](https://github.com/ClickHouse/ClickHouse/pull/2920) +- Le délai d'attente de l'opération peut maintenant être configuré lorsque vous travaillez avec ZooKeeper. [urykhy](https://github.com/ClickHouse/ClickHouse/pull/2971) +- Vous pouvez spécifier un décalage pour `LIMIT n, m` comme `LIMIT n OFFSET m`. [\#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- Vous pouvez utiliser l' `SELECT TOP n` syntaxe comme alternative pour `LIMIT`. [\#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- Augmentation de la taille de la file d'attente pour écrire dans les tables `SystemLog parameter queue is full` l'erreur ne se produit pas aussi souvent. +- Le `windowFunnel` fonction d'agrégation prend désormais en charge les événements qui répondent à plusieurs conditions. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2801) +- Les colonnes dupliquées peuvent être utilisées dans un `USING` la clause de `JOIN`. [\#3006](https://github.com/ClickHouse/ClickHouse/pull/3006) +- `Pretty` formats maintenant avoir une limite sur l'alignement des colonnes de largeur. L'utilisation de la `output_format_pretty_max_column_pad_width` paramètre. Si une valeur est plus large, il sera toujours affichée dans son intégralité, mais les autres cellules dans le tableau ne sera pas trop large. [\#3003](https://github.com/ClickHouse/ClickHouse/pull/3003) +- Le `odbc` la fonction table vous permet maintenant de spécifier le nom de la base de données / schéma. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2885) +- Ajout de la possibilité d'utiliser un nom d'utilisateur spécifié dans le `clickhouse-client` fichier de configuration. [Vladimir Kozbin](https://github.com/ClickHouse/ClickHouse/pull/2909) +- Le `ZooKeeperExceptions` compteur a été divisé en trois compteurs: `ZooKeeperUserExceptions`, `ZooKeeperHardwareExceptions`, et `ZooKeeperOtherExceptions`. +- `ALTER DELETE` les requêtes fonctionnent pour les vues matérialisées. +- Ajouté randomisation lors de l'exécution du thread de nettoyage périodiquement pour `ReplicatedMergeTree` afin d'éviter les pics de charge périodiques lorsqu'il y a un très grand nombre de `ReplicatedMergeTree` table. +- Soutien pour `ATTACH TABLE ... ON CLUSTER` requête. [\#3025](https://github.com/ClickHouse/ClickHouse/pull/3025) + +#### Corrections de bugs: {#bug-fixes-13} + +- Correction d'un problème avec `Dictionary` tables (jette le `Size of offsets doesn't match size of column` ou `Unknown compression method` exception). Ce bug est apparu dans la version 18.10.3. [\#2913](https://github.com/ClickHouse/ClickHouse/issues/2913) +- Correction d'un bug lors de la fusion `CollapsingMergeTree` tables si l'une des parties de données est vide (ces parties sont formées lors de la fusion ou `ALTER DELETE` si toutes les données ont été supprimées), et le `vertical` l'algorithme a été utilisé pour la fusion. [\#3049](https://github.com/ClickHouse/ClickHouse/pull/3049) +- Correction d'une condition de course pendant `DROP` ou `TRUNCATE` pour `Memory` tables simultanément `SELECT`, ce qui pourrait conduire à des pannes de serveur. Ce bug est apparu dans la version 1.1.54388. [\#3038](https://github.com/ClickHouse/ClickHouse/pull/3038) +- Correction de la possibilité de perte de données lors de l'insertion dans `Replicated` des tables, si la `Session is expired` l'erreur est renvoyée (la perte de données peut être détectée par le `ReplicatedDataLoss` métrique). Cette erreur s'est produite dans la version 1.1.54378. [\#2939](https://github.com/ClickHouse/ClickHouse/pull/2939) [\#2949](https://github.com/ClickHouse/ClickHouse/pull/2949) [\#2964](https://github.com/ClickHouse/ClickHouse/pull/2964) +- Correction d'un segfault pendant `JOIN ... ON`. [\#3000](https://github.com/ClickHouse/ClickHouse/pull/3000) +- Correction de l'erreur de recherche des noms de colonne lorsque le `WHERE` expression se compose entièrement d'un nom de colonne qualifié, tel que `WHERE table.column`. [\#2994](https://github.com/ClickHouse/ClickHouse/pull/2994) +- Correction de l' “Not found column” erreur survenue lors de l'exécution de requêtes distribuées si une seule colonne composée d'une expression avec une sous-requête est demandée à partir d'un serveur distant. [\#3087](https://github.com/ClickHouse/ClickHouse/pull/3087) +- Correction de l' `Block structure mismatch in UNION stream: different number of columns` erreur qui s'est produite pour les requêtes distribuées si l'un des fragments est locale et l'autre ne l'est pas, et l'optimisation de la déplacer à `PREWHERE` est déclenchée. [\#2226](https://github.com/ClickHouse/ClickHouse/pull/2226) [\#3037](https://github.com/ClickHouse/ClickHouse/pull/3037) [\#3055](https://github.com/ClickHouse/ClickHouse/pull/3055) [\#3065](https://github.com/ClickHouse/ClickHouse/pull/3065) [\#3073](https://github.com/ClickHouse/ClickHouse/pull/3073) [\#3090](https://github.com/ClickHouse/ClickHouse/pull/3090) [\#3093](https://github.com/ClickHouse/ClickHouse/pull/3093) +- Correction de l' `pointInPolygon` fonction pour certains cas de polygones non convexes. [\#2910](https://github.com/ClickHouse/ClickHouse/pull/2910) +- Correction du résultat incorrect lors de la comparaison `nan` avec des entiers. [\#3024](https://github.com/ClickHouse/ClickHouse/pull/3024) +- Correction d'une erreur dans le `zlib-ng` bibliothèque qui pourrait conduire à segfault dans de rares cas. [\#2854](https://github.com/ClickHouse/ClickHouse/pull/2854) +- Correction d'une fuite de mémoire lors de l'insertion dans une table avec `AggregateFunction` colonnes, si l'état de la fonction d'agrégat n'est pas simple (alloue la mémoire séparément), et si une seule demande d'insertion entraîne plusieurs petits blocs. [\#3084](https://github.com/ClickHouse/ClickHouse/pull/3084) +- Correction d'une condition de concurrence lors de la création et la suppression de la même `Buffer` ou `MergeTree` table en même temps. +- Correction de la possibilité d'un segfault lors de la comparaison des tuples constitués de certains types non triviaux, tels que les tuples. [\#2989](https://github.com/ClickHouse/ClickHouse/pull/2989) +- Correction de la possibilité d'un segfault lors de l'exécution de certains `ON CLUSTER` requête. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2960) +- Correction d'une erreur dans le `arrayDistinct` fonction pour `Nullable` les éléments du tableau. [\#2845](https://github.com/ClickHouse/ClickHouse/pull/2845) [\#2937](https://github.com/ClickHouse/ClickHouse/pull/2937) +- Le `enable_optimize_predicate_expression` option prend en charge correctement les cas avec `SELECT *`. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2929) +- Correction du segfault lors de la réinitialisation de la session ZooKeeper. [\#2917](https://github.com/ClickHouse/ClickHouse/pull/2917) +- Blocage potentiel fixe lorsque vous travaillez avec ZooKeeper. +- Correction d'un code incorrect pour ajouter des structures de données imbriquées dans un `SummingMergeTree`. +- Lors de l'allocation de mémoire pour les états de fonctions d'agrégat, l'alignement est correctement pris en compte, ce qui permet d'utiliser des opérations nécessitant un alignement lors de la mise en œuvre des états de fonctions d'agrégat. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2808) + +#### Correction de sécurité: {#security-fix} + +- Utilisation sûre des sources de données ODBC. L'Interaction avec les pilotes ODBC utilise un `clickhouse-odbc-bridge` processus. Les erreurs dans les pilotes ODBC tiers ne causent plus de problèmes de stabilité du serveur ou de vulnérabilités. [\#2828](https://github.com/ClickHouse/ClickHouse/pull/2828) [\#2879](https://github.com/ClickHouse/ClickHouse/pull/2879) [\#2886](https://github.com/ClickHouse/ClickHouse/pull/2886) [\#2893](https://github.com/ClickHouse/ClickHouse/pull/2893) [\#2921](https://github.com/ClickHouse/ClickHouse/pull/2921) +- Correction d'une validation incorrecte du chemin du fichier dans le `catBoostPool` table de fonction. [\#2894](https://github.com/ClickHouse/ClickHouse/pull/2894) +- Le contenu des tableaux du système (`tables`, `databases`, `parts`, `columns`, `parts_columns`, `merges`, `mutations`, `replicas`, et `replication_queue`) sont filtrés en fonction de l'accès configuré de l'utilisateur aux bases de données (`allow_databases`). [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2856) + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-3} + +- Dans les requêtes avec jointure, le caractère étoile se développe en une liste de colonnes dans toutes les tables, conformément à la norme SQL. Vous pouvez restaurer l'ancien comportement en paramètre `asterisk_left_columns_only` à 1 au niveau de la configuration utilisateur. + +#### Construire des changements: {#build-changes-2} + +- La plupart des tests d'intégration peuvent maintenant être exécutés par commit. +- Les contrôles de style de Code peuvent également être exécutés par commit. +- Le `memcpy` l'implémentation est choisie correctement lors de la construction sur CentOS7/Fedora. [Etienne Champetier](https://github.com/ClickHouse/ClickHouse/pull/2912) +- Lorsque vous utilisez clang pour construire, certains avertissements de `-Weverything` ont été ajoutées, en plus de la `-Wall-Wextra -Werror`. [\#2957](https://github.com/ClickHouse/ClickHouse/pull/2957) +- Débogage de la construction utilise le `jemalloc` option de débogage. +- L'interface de la bibliothèque pour interagir avec ZooKeeper est déclarée abstraite. [\#2950](https://github.com/ClickHouse/ClickHouse/pull/2950) + +## Clickhouse version 18.10 {#clickhouse-release-18-10} + +### Clickhouse version 18.10.3, 2018-08-13 {#clickhouse-release-18-10-3-2018-08-13} + +#### Nouveauté: {#new-features-5} + +- HTTPS peut être utilisé pour la réplication. [\#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) +- Ajout des fonctions `murmurHash2_64`, `murmurHash3_32`, `murmurHash3_64`, et `murmurHash3_128` en plus de l'existant `murmurHash2_32`. [\#2791](https://github.com/ClickHouse/ClickHouse/pull/2791) +- Prise en charge des types Nullable dans le pilote ODBC ClickHouse (`ODBCDriver2` le format de sortie). [\#2834](https://github.com/ClickHouse/ClickHouse/pull/2834) +- Soutien pour `UUID` dans les colonnes de clé. + +#### Amélioration: {#improvements-5} + +- Les Clusters peuvent être supprimés sans redémarrer le serveur lorsqu'ils sont supprimés des fichiers de configuration. [\#2777](https://github.com/ClickHouse/ClickHouse/pull/2777) +- Les dictionnaires externes peuvent être supprimés sans redémarrer le serveur lorsqu'ils sont supprimés des fichiers de configuration. [\#2779](https://github.com/ClickHouse/ClickHouse/pull/2779) +- Ajouter `SETTINGS` soutien pour le `Kafka` tableau moteur. [Alexander Marshalov](https://github.com/ClickHouse/ClickHouse/pull/2781) +- Des améliorations pour l' `UUID` type de données (pas encore terminée). [\#2618](https://github.com/ClickHouse/ClickHouse/pull/2618) +- Prise en charge des pièces vides après fusion dans le `SummingMergeTree`, `CollapsingMergeTree` et `VersionedCollapsingMergeTree` moteur. [\#2815](https://github.com/ClickHouse/ClickHouse/pull/2815) +- Les anciens enregistrements de mutations terminées sont supprimés (`ALTER DELETE`). [\#2784](https://github.com/ClickHouse/ClickHouse/pull/2784) +- Ajouté le `system.merge_tree_settings` table. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/2841) +- Le `system.tables` la table a maintenant des colonnes de dépendance: `dependencies_database` et `dependencies_table`. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2851) +- Ajouté le `max_partition_size_to_drop` option de configuration. [\#2782](https://github.com/ClickHouse/ClickHouse/pull/2782) +- Ajouté le `output_format_json_escape_forward_slashes` option. [Alexandre Botcharov](https://github.com/ClickHouse/ClickHouse/pull/2812) +- Ajouté le `max_fetch_partition_retries_count` paramètre. [\#2831](https://github.com/ClickHouse/ClickHouse/pull/2831) +- Ajouté le `prefer_localhost_replica` paramètre permettant de désactiver la préférence pour une réplique locale et d'accéder à une réplique locale sans interaction entre processus. [\#2832](https://github.com/ClickHouse/ClickHouse/pull/2832) +- Le `quantileExact` fonction d'agrégation retourne `nan` dans le cas de l'agrégation sur un vide `Float32` ou `Float64` définir. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2855) + +#### Corrections de bugs: {#bug-fixes-14} + +- Suppression de l'échappement inutile des paramètres de chaîne de connexion pour ODBC, ce qui rendait impossible l'établissement d'une connexion. Cette erreur s'est produite dans la version 18.6.0. +- Fixe la logique de traitement `REPLACE PARTITION` les commandes dans la file d'attente de réplication. Si il y a deux `REPLACE` pour la même partition, la logique incorrecte pourrait entraîner l'un d'entre eux de rester dans la file d'attente de réplication et ne pas être exécuté. [\#2814](https://github.com/ClickHouse/ClickHouse/pull/2814) +- Correction d'un bug de fusion lorsque toutes les parties de données étaient vides (parties formées à partir d'une fusion ou `ALTER DELETE` si toutes les données ont été supprimées). Ce bug est apparu dans la version 18.1.0. [\#2930](https://github.com/ClickHouse/ClickHouse/pull/2930) +- Correction d'une erreur pour simultanées `Set` ou `Join`. [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2823) +- Correction de l' `Block structure mismatch in UNION stream: different number of columns` erreur qui s'est produite pour `UNION ALL` requêtes dans une sous-requête si l'un des `SELECT` les requêtes contiennent des noms de colonnes en double. [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2094) +- Correction d'une fuite de mémoire si une exception se produisait lors de la connexion à un serveur MySQL. +- Correction d'un code de réponse clickhouse-client incorrect en cas d'erreur de requête. +- Correction d'un comportement incorrect des vues matérialisées contenant DISTINCT. [\#2795](https://github.com/ClickHouse/ClickHouse/issues/2795) + +#### Modifications incompatibles en arrière {#backward-incompatible-changes-4} + +- Suppression de la prise en charge des requêtes CHECK TABLE pour les tables distribuées. + +#### Construire des changements: {#build-changes-3} + +- L'allocateur a été remplacé: `jemalloc` est maintenant utilisé à la place de `tcmalloc`. Dans certains scénarios, cela augmente la vitesse jusqu'à 20%. Cependant, il y a des questions qui ont ralenti jusqu'à 20%. La consommation de mémoire a été réduite d'environ 10% dans certains scénarios, avec une meilleure stabilité. Avec des charges très compétitives, l'utilisation du processeur dans l'espace utilisateur et dans le système ne montre qu'une légère augmentation. [\#2773](https://github.com/ClickHouse/ClickHouse/pull/2773) +- L'utilisation de libressl à partir d'un sous-module. [\#1983](https://github.com/ClickHouse/ClickHouse/pull/1983) [\#2807](https://github.com/ClickHouse/ClickHouse/pull/2807) +- Utilisation d'unixodbc à partir d'un sous-module. [\#2789](https://github.com/ClickHouse/ClickHouse/pull/2789) +- L'utilisation de mariadb-connecteur-c à partir d'un sous-module. [\#2785](https://github.com/ClickHouse/ClickHouse/pull/2785) +- Ajout de fichiers de test fonctionnels au référentiel qui dépendent de la disponibilité des données de test (pour le moment, sans les données de test elles-mêmes). + +## Clickhouse version 18.6 {#clickhouse-release-18-6} + +### Clickhouse version 18.6.0, 2018-08-02 {#clickhouse-release-18-6-0-2018-08-02} + +#### Nouveauté: {#new-features-6} + +- Ajout du support pour les expressions on pour la syntaxe JOIN ON: + `JOIN ON Expr([table.]column ...) = Expr([table.]column, ...) [AND Expr([table.]column, ...) = Expr([table.]column, ...) ...]` + L'expression doit être une chaîne d'égalités rejoint par l'opérateur ET. De chaque côté de l'égalité peut être une expression arbitraire sur les colonnes de l'une des tables. L'utilisation de noms de colonnes entièrement qualifiés est prise en charge (`table.name`, `database.table.name`, `table_alias.name`, `subquery_alias.name`) pour la bonne table. [\#2742](https://github.com/ClickHouse/ClickHouse/pull/2742) +- HTTPS peut être activé pour la réplication. [\#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) + +#### Amélioration: {#improvements-6} + +- Le serveur transmet le composant patch de sa version au client. Les données sur le composant de version de correctif sont `system.processes` et `query_log`. [\#2646](https://github.com/ClickHouse/ClickHouse/pull/2646) + +## Clickhouse version 18.5 {#clickhouse-release-18-5} + +### Clickhouse version 18.5.1, 2018-07-31 {#clickhouse-release-18-5-1-2018-07-31} + +#### Nouveauté: {#new-features-7} + +- Ajout de la fonction de hachage `murmurHash2_32` [\#2756](https://github.com/ClickHouse/ClickHouse/pull/2756). + +#### Amélioration: {#improvements-7} + +- Maintenant, vous pouvez utiliser le `from_env` [\#2741](https://github.com/ClickHouse/ClickHouse/pull/2741) attribut pour définir des valeurs dans les fichiers de configuration à partir de variables d'environnement. +- Ajout de versions insensibles à la casse `coalesce`, `ifNull`, et `nullIf functions` [\#2752](https://github.com/ClickHouse/ClickHouse/pull/2752). + +#### Corrections de bugs: {#bug-fixes-15} + +- Correction d'un bug possible lors du démarrage d'une réplique [\#2759](https://github.com/ClickHouse/ClickHouse/pull/2759). + +## Clickhouse version 18.4 {#clickhouse-release-18-4} + +### Clickhouse version 18.4.0, 2018-07-28 {#clickhouse-release-18-4-0-2018-07-28} + +#### Nouveauté: {#new-features-8} + +- Tables système ajoutées: `formats`, `data_type_families`, `aggregate_function_combinators`, `table_functions`, `table_engines`, `collations` [\#2721](https://github.com/ClickHouse/ClickHouse/pull/2721). +- Ajout de la possibilité d'utiliser une fonction de table au lieu d'un tableau en argument d'une `remote` ou `cluster table function` [\#2708](https://github.com/ClickHouse/ClickHouse/pull/2708). +- Soutien pour `HTTP Basic` l'authentification dans le protocole de réplication [\#2727](https://github.com/ClickHouse/ClickHouse/pull/2727). +- Le `has` fonction permet de rechercher une valeur numérique dans un tableau de `Enum` valeur [Maxim Khrisanfov](https://github.com/ClickHouse/ClickHouse/pull/2699). +- Prise en charge de l'ajout de séparateurs de messages arbitraires lors de la lecture de `Kafka` [Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2701). + +#### Amélioration: {#improvements-8} + +- Le `ALTER TABLE t DELETE WHERE` la requête ne réécrit pas les parties de données qui n'ont pas été affectées par la condition WHERE [\#2694](https://github.com/ClickHouse/ClickHouse/pull/2694). +- Le `use_minimalistic_checksums_in_zookeeper` option pour `ReplicatedMergeTree` des tables est activé par défaut. Ce paramètre a été ajouté dans la version 1.1.54378, 2018-04-16. Les Versions antérieures à 1.1.54378 ne peuvent plus être installées. +- La prise en charge de `KILL` et `OPTIMIZE` requêtes qui spécifient `ON CLUSTER` [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2689). + +#### Corrections de bugs: {#bug-fixes-16} + +- Correction de l'erreur `Column ... is not under an aggregate function and not in GROUP BY` pour l'agrégation avec une expression. Ce bug est apparu dans la version 18.1.0. ([bbdd780b](https://github.com/ClickHouse/ClickHouse/commit/bbdd780be0be06a0f336775941cdd536878dd2c2)) +- Correction d'un bug dans l' `windowFunnel aggregate function` [L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2735). +- Correction d'un bug dans l' `anyHeavy` fonction d'agrégation ([a2101df2](https://github.com/ClickHouse/ClickHouse/commit/a2101df25a6a0fba99aa71f8793d762af2b801ee)) +- Correction d'un crash du serveur lors de l'utilisation du `countArray()` fonction d'agrégation. + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-5} + +- Paramètres pour `Kafka` moteur a été changé de `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_schema, kafka_num_consumers])` de `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_row_delimiter, kafka_schema, kafka_num_consumers])`. Si vos tables utilisent `kafka_schema` ou `kafka_num_consumers` paramètres, vous devez modifier manuellement les fichiers de métadonnées `path/metadata/database/table.sql` et d'ajouter `kafka_row_delimiter` paramètre avec `''` valeur. + +## Clickhouse version 18.1 {#clickhouse-release-18-1} + +### Clickhouse version 18.1.0, 2018-07-23 {#clickhouse-release-18-1-0-2018-07-23} + +#### Nouveauté: {#new-features-9} + +- Soutien pour le `ALTER TABLE t DELETE WHERE` requête pour les tables MergeTree non répliquées ([\#2634](https://github.com/ClickHouse/ClickHouse/pull/2634)). +- Prise en charge des types arbitraires pour `uniq*` famille de fonctions agrégées ([\#2010](https://github.com/ClickHouse/ClickHouse/issues/2010)). +- Prise en charge des types arbitraires dans les opérateurs de comparaison ([\#2026](https://github.com/ClickHouse/ClickHouse/issues/2026)). +- Le `users.xml` fichier permet de définir un masque de sous-réseau au format `10.0.0.1/255.255.255.0`. Ceci est nécessaire pour utiliser des masques pour les réseaux IPv6 avec des zéros au milieu ([\#2637](https://github.com/ClickHouse/ClickHouse/pull/2637)). +- Ajouté le `arrayDistinct` fonction ([\#2670](https://github.com/ClickHouse/ClickHouse/pull/2670)). +- Le moteur SummingMergeTree peut maintenant fonctionner avec des colonnes de type AggregateFunction ([Constantin S. Pan](https://github.com/ClickHouse/ClickHouse/pull/2566)). + +#### Amélioration: {#improvements-9} + +- Modification du schéma de numérotation pour les versions de version. Maintenant, la première partie contient l'année de sortie (A. D., fuseau horaire de Moscou, moins 2000), la deuxième partie contient le nombre de changements majeurs (augmente pour la plupart des versions), et la troisième partie est la version patch. Les versions sont toujours rétrocompatibles, sauf indication contraire dans le changelog. +- Conversions plus rapides de nombres à virgule flottante en une chaîne ([Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2664)). +- Si certaines lignes ont été ignorées lors d'une insertion en raison d'erreurs d'analyse (ceci est possible avec `input_allow_errors_num` et `input_allow_errors_ratio` paramètres activé), le nombre de lignes ignorées est maintenant écrit dans le journal du serveur ([Leonardo Cecchi](https://github.com/ClickHouse/ClickHouse/pull/2669)). + +#### Corrections de bugs: {#bug-fixes-17} + +- Correction de la commande TRUNCATE pour les tables temporaires ([Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2624)). +- Correction d'une impasse rare dans la bibliothèque client ZooKeeper qui se produisait lorsqu'une erreur réseau se produisait lors de la lecture de la réponse ([c315200](https://github.com/ClickHouse/ClickHouse/commit/c315200e64b87e44bdf740707fc857d1fdf7e947)). +- Correction d'une erreur lors d'une conversion en types Nullable ([\#1322](https://github.com/ClickHouse/ClickHouse/issues/1322)). +- Correction du résultat incorrect de l' `maxIntersection()` fonction lorsque les limites des intervalles de coïncidé ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2657)). +- Correction d'une transformation incorrecte de la chaîne d'expression OR dans un argument de fonction ([chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2663)). +- Fixe une dégradation des performances pour les requêtes contenant `IN (subquery)` expressions à l'intérieur d'une autre sous-requête ([\#2571](https://github.com/ClickHouse/ClickHouse/issues/2571)). +- Fixe incompatibilité entre les serveurs avec des versions différentes requêtes distribuées qui utilisent un `CAST` fonction qui n'est pas en majuscules ([fe8c4d6](https://github.com/ClickHouse/ClickHouse/commit/fe8c4d64e434cacd4ceef34faa9005129f2190a5)). +- Ajout de guillemets manquants d'identifiants pour les requêtes à un SGBD externe ([\#2635](https://github.com/ClickHouse/ClickHouse/issues/2635)). + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-6} + +- La conversion d'une chaîne contenant le nombre zéro en DateTime ne fonctionne pas. Exemple: `SELECT toDateTime('0')`. C'est aussi la raison pour laquelle `DateTime DEFAULT '0'` ne fonctionne pas dans les tableaux, ainsi que `0` dans les dictionnaires. Solution: remplacer `0` avec `0000-00-00 00:00:00`. + +## Clickhouse version 1.1 {#clickhouse-release-1-1} + +### Clickhouse version 1.1.54394, 2018-07-12 {#clickhouse-release-1-1-54394-2018-07-12} + +#### Nouveauté: {#new-features-10} + +- Ajouté le `histogram` fonction d'agrégation ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2521)). +- Maintenant `OPTIMIZE TABLE ... FINAL` peut être utilisé sans spécifier de partitions pour `ReplicatedMergeTree` ([Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2600)). + +#### Corrections de bugs: {#bug-fixes-18} + +- Correction d'un problème avec un très petit délai d'attente pour les sockets (une seconde) pour la lecture et l'écriture lors de l'envoi et du téléchargement de données répliquées, ce qui rendait impossible le téléchargement de pièces plus grandes s'il y avait une charge sur le réseau ou le disque (cela entraînait des tentatives cycliques de téléchargement de pièces). Cette erreur s'est produite dans la version 1.1.54388. +- Correction de problèmes lors de l'utilisation de chroot dans ZooKeeper si vous avez inséré des blocs de données en double dans la table. +- Le `has` la fonction fonctionne maintenant correctement pour un tableau avec les valeurs null éléments ([\#2115](https://github.com/ClickHouse/ClickHouse/issues/2115)). +- Le `system.tables` table fonctionne maintenant correctement lorsqu'il est utilisé dans les requêtes distribuées. Le `metadata_modification_time` et `engine_full` les colonnes sont maintenant non-virtuel. Correction d'une erreur qui s'est produite si seules ces colonnes étaient interrogées à partir de la table. +- Correction de la façon dont un vide `TinyLog` table fonctionne après l'insertion d'un bloc de données vide ([\#2563](https://github.com/ClickHouse/ClickHouse/issues/2563)). +- Le `system.zookeeper` table fonctionne si la valeur du nœud dans ZooKeeper est NULL. + +### Clickhouse version 1.1.54390, 2018-07-06 {#clickhouse-release-1-1-54390-2018-07-06} + +#### Nouveauté: {#new-features-11} + +- Les requêtes peuvent être envoyées `multipart/form-data` format (dans le `query` champ), ce qui est utile si des données externes sont également envoyées pour le traitement de la requête ([Olga Hvostikova](https://github.com/ClickHouse/ClickHouse/pull/2490)). +- Ajout de la possibilité d'activer ou de désactiver le traitement des guillemets simples ou doubles lors de la lecture de données au format CSV. Vous pouvez configurer cela dans le `format_csv_allow_single_quotes` et `format_csv_allow_double_quotes` paramètre ([Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2574)). +- Maintenant `OPTIMIZE TABLE ... FINAL` peut être utilisé sans spécifier la partition pour les variantes non répliquées de `MergeTree` ([Amos Oiseau](https://github.com/ClickHouse/ClickHouse/pull/2599)). + +#### Amélioration: {#improvements-10} + +- Amélioration des performances, réduction de la consommation de mémoire et suivi correct de la consommation de mémoire avec l'utilisation de L'opérateur IN lorsqu'un index de table peut être utilisé ([\#2584](https://github.com/ClickHouse/ClickHouse/pull/2584)). +- Retiré redondant vérification des sommes de contrôle lors de l'ajout d'une partie des données. Ceci est important lorsqu'il y a un grand nombre de répliques, car dans ces cas, le nombre total de contrôles était égal à n^2. +- Ajout du support pour `Array(Tuple(...))` arguments en faveur de la `arrayEnumerateUniq` fonction ([\#2573](https://github.com/ClickHouse/ClickHouse/pull/2573)). +- Ajouter `Nullable` soutien pour le `runningDifference` fonction ([\#2594](https://github.com/ClickHouse/ClickHouse/pull/2594)). +- Amélioration des performances d'analyse des requêtes lorsqu'il existe un très grand nombre d'expressions ([\#2572](https://github.com/ClickHouse/ClickHouse/pull/2572)). +- Sélection plus rapide des parties de données à fusionner `ReplicatedMergeTree` table. Récupération plus rapide de la session ZooKeeper ([\#2597](https://github.com/ClickHouse/ClickHouse/pull/2597)). +- Le `format_version.txt` fichier pour `MergeTree` tables est recréée si elle est manquante, ce qui est logique si ClickHouse est lancé après avoir copié la structure de répertoire sans fichiers ([Ciprian Hacman](https://github.com/ClickHouse/ClickHouse/pull/2593)). + +#### Corrections de bugs: {#bug-fixes-19} + +- Correction d'un bug lorsque vous travaillez avec ZooKeeper qui pourrait rendre impossible la récupération de la session et des États en lecture seule des tables avant de redémarrer le serveur. +- Correction d'un bug lorsque vous travaillez avec ZooKeeper qui pourrait entraîner la suppression des anciens nœuds si la session est interrompue. +- Correction d'une erreur dans le `quantileTDigest` fonction pour les arguments Float (ce bug a été introduit dans la version 1.1.54388) ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2553)). +- Correction d'un bug dans l'index des tables MergeTree si la colonne de clé primaire est située à l'intérieur de la fonction de conversion des types entre des entiers signés et non signés de même taille ([\#2603](https://github.com/ClickHouse/ClickHouse/pull/2603)). +- Fixe erreur de segmentation si `macros` sont utilisés mais ils ne sont pas dans le fichier de configuration ([\#2570](https://github.com/ClickHouse/ClickHouse/pull/2570)). +- Correction du passage à la base de données par défaut lors de la reconnexion du client ([\#2583](https://github.com/ClickHouse/ClickHouse/pull/2583)). +- Correction d'un bug qui se produisait lors de la `use_index_for_in_with_subqueries` paramètre a été désactivé. + +#### Correction de sécurité: {#security-fix-1} + +- L'envoi de fichiers n'est plus possible lorsqu'il est connecté à MySQL (`LOAD DATA LOCAL INFILE`). + +### Clickhouse version 1.1.54388, 2018-06-28 {#clickhouse-release-1-1-54388-2018-06-28} + +#### Nouveauté: {#new-features-12} + +- Soutien pour le `ALTER TABLE t DELETE WHERE` requête pour les tables répliquées. Ajouté le `system.mutations` tableau pour suivre la progression de ce type de requêtes. +- Soutien pour le `ALTER TABLE t [REPLACE|ATTACH] PARTITION` requête pour les tables \* MergeTree. +- Soutien pour le `TRUNCATE TABLE` requête ([L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2260)) +- Plusieurs nouveaux `SYSTEM` requêtes pour les tables répliquées (`RESTART REPLICAS`, `SYNC REPLICA`, `[STOP|START] [MERGES|FETCHES|SENDS REPLICATED|REPLICATION QUEUES]`). +- Ajout de la possibilité d'écrire dans une table avec le moteur MySQL et la fonction de table correspondante ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2294)). +- Ajouté le `url()` fonction de table et le `URL` tableau moteur ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2501)). +- Ajouté le `windowFunnel` fonction d'agrégation ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2352)). +- Nouveau `startsWith` et `endsWith` fonctions pour les chaînes ([Vadim Plakhtinsky](https://github.com/ClickHouse/ClickHouse/pull/2429)). +- Le `numbers()` la fonction table vous permet maintenant de spécifier le décalage ([L'Hiver Zhang](https://github.com/ClickHouse/ClickHouse/pull/2535)). +- Le mot de passe pour `clickhouse-client` peut être saisi de manière interactive. +- Les journaux du serveur peuvent maintenant être envoyés à syslog ([Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2459)). +- Prise en charge de la connexion dans les dictionnaires avec une source de bibliothèque partagée ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2472)). +- Prise en charge des délimiteurs CSV personnalisés ([Ivan Joukov](https://github.com/ClickHouse/ClickHouse/pull/2263)) +- Ajouté le `date_time_input_format` paramètre. Si vous basculez ce paramètre sur `'best_effort'`, Les valeurs DateTime seront lues dans un large éventail de formats. +- Ajouté le `clickhouse-obfuscator` utilitaire pour l'obscurcissement des données. Exemple d'utilisation: publication des données utilisées dans les tests de performance. + +#### Caractéristiques expérimentales: {#experimental-features-2} + +- Ajout de la possibilité de calculer `and` arguments uniquement là où ils sont nécessaires ([Anastasia Tsarkova](https://github.com/ClickHouse/ClickHouse/pull/2272)) +- La compilation JIT en code natif est maintenant disponible pour certaines expressions ([pyos](https://github.com/ClickHouse/ClickHouse/pull/2277)). + +#### Corrections de bugs: {#bug-fixes-20} + +- Les doublons n'apparaissent plus pour une requête avec `DISTINCT` et `ORDER BY`. +- Les requêtes avec `ARRAY JOIN` et `arrayFilter` ne renvoie plus un résultat incorrect. +- Correction d'une erreur lors de la lecture d'une colonne de tableau à partir d'une structure Imbriquée ([\#2066](https://github.com/ClickHouse/ClickHouse/issues/2066)). +- Correction d'une erreur lors de l'analyse des requêtes avec une clause HAVING comme `HAVING tuple IN (...)`. +- Correction d'une erreur lors de l'analyse des requêtes avec récursive des alias. +- Correction d'une erreur lors de la lecture de ReplacingMergeTree avec une condition dans PREWHERE qui filtre Toutes les lignes ([\#2525](https://github.com/ClickHouse/ClickHouse/issues/2525)). +- Les paramètres de profil utilisateur n'ont pas été appliqués lors de l'utilisation de sessions dans L'interface HTTP. +- Correction de la façon dont les paramètres sont appliqués à partir des paramètres de ligne de commande dans clickhouse-local. +- La bibliothèque client ZooKeeper utilise maintenant le délai d'attente de session reçu du serveur. +- Correction d'un bug dans la bibliothèque client ZooKeeper lorsque le client attendait la réponse du serveur plus longtemps que le délai d'attente. +- Correction de l'élagage des pièces pour les requêtes avec des conditions sur les colonnes de clé de partition ([\#2342](https://github.com/ClickHouse/ClickHouse/issues/2342)). +- Les fusions sont maintenant possibles après `CLEAR COLUMN IN PARTITION` ([\#2315](https://github.com/ClickHouse/ClickHouse/issues/2315)). +- Le mappage de Type dans la fonction de table ODBC a été corrigé ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2268)). +- Les comparaisons de Type ont été corrigées pour `DateTime` avec et sans le fuseau horaire ([Alexandre Botcharov](https://github.com/ClickHouse/ClickHouse/pull/2400)). +- Correction de l'analyse syntaxique et du formatage `CAST` opérateur. +- Insertion fixe dans une vue matérialisée pour le moteur de table distribué ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2411)). +- Correction d'une condition de concurrence lors de l'écriture de données `Kafka` moteur aux vues matérialisées ([Yangkuan Liu](https://github.com/ClickHouse/ClickHouse/pull/2448)). +- Correction de SSRF dans la fonction de table remote (). +- Comportement de sortie fixe de `clickhouse-client` en mode multi-lignes ([\#2510](https://github.com/ClickHouse/ClickHouse/issues/2510)). + +#### Amélioration: {#improvements-11} + +- Les tâches d'arrière plan dans les tables répliquées sont maintenant effectuées dans un pool de threads plutôt que dans des threads séparés ([Silviu Caragea](https://github.com/ClickHouse/ClickHouse/pull/1722)). +- Amélioration des performances de compression LZ4. +- Analyse plus rapide pour les requêtes avec un grand nombre de jointures et de sous-requêtes. +- Le cache DNS est maintenant mis à jour automatiquement lorsqu'il y a trop d'erreurs réseau. +- Les insertions de Table ne se produisent plus si l'insertion dans l'une des vues matérialisées n'est pas possible car elle comporte trop de parties. +- Correction de l'écart dans les compteurs d'événements `Query`, `SelectQuery`, et `InsertQuery`. +- Des Expressions comme `tuple IN (SELECT tuple)` sont autorisés si les types de tuple correspondent. +- Un serveur avec des tables répliquées peut démarrer même si vous n'avez pas configuré ZooKeeper. +- Lors du calcul du nombre de cœurs CPU disponibles, les limites sur les groupes cgroups sont maintenant prises en compte ([Atri Sharma](https://github.com/ClickHouse/ClickHouse/pull/2325)). +- Ajouté chown pour les répertoires de configuration dans le fichier de configuration systemd ([Mikhaïl Shirjaeva](https://github.com/ClickHouse/ClickHouse/pull/2421)). + +#### Construire des changements: {#build-changes-4} + +- Le compilateur gcc8 peut être utilisé pour les builds. +- Ajout de la possibilité de construire llvm à partir du sous-module. +- La version de la bibliothèque librdkafka a été mise à jour vers v0. 11. 4. +- Ajout de la possibilité d'utiliser la bibliothèque libcpuid du système. La version de la bibliothèque a été mise à jour à 0.4.0. +- Correction de la construction en utilisant la bibliothèque vectorclass ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2274)). +- Cmake génère maintenant des fichiers pour ninja par défaut (comme lors de l'utilisation `-G Ninja`). +- Ajout de la possibilité d'utiliser la bibliothèque libtinfo au lieu de libtermcap ([Georgy Kondratiev](https://github.com/ClickHouse/ClickHouse/pull/2519)). +- Correction d'un conflit de fichier d'en-tête dans Fedora Rawhide ([\#2520](https://github.com/ClickHouse/ClickHouse/issues/2520)). + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-7} + +- Retiré échapper dans `Vertical` et `Pretty*` formats et supprimé le `VerticalRaw` format. +- Si des serveurs avec la version 1.1.54388 (ou plus récente) et des serveurs avec une version plus ancienne sont utilisés simultanément dans une requête distribuée et la requête a le `cast(x, 'Type')` expression sans `AS` mot clé et n'a pas le mot `cast` en majuscules, une exception sera levée avec un message du genre `Not found column cast(0, 'UInt8') in block`. Solution: mettez à jour le serveur sur l'ensemble du cluster. + +### Clickhouse version 1.1.54385, 2018-06-01 {#clickhouse-release-1-1-54385-2018-06-01} + +#### Corrections de bugs: {#bug-fixes-21} + +- Correction d'une erreur qui, dans certains cas, provoquait le blocage des opérations de ZooKeeper. + +### Clickhouse version 1.1.54383, 2018-05-22 {#clickhouse-release-1-1-54383-2018-05-22} + +#### Corrections de bugs: {#bug-fixes-22} + +- Correction d'un ralentissement de la file d'attente de réplication si une table a plusieurs répliques. + +### Clickhouse version 1.1.54381, 2018-05-14 {#clickhouse-release-1-1-54381-2018-05-14} + +#### Corrections de bugs: {#bug-fixes-23} + +- Correction d'une fuite de nœuds dans ZooKeeper lorsque ClickHouse perd la connexion au serveur ZooKeeper. + +### Clickhouse version 1.1.54380, 2018-04-21 {#clickhouse-release-1-1-54380-2018-04-21} + +#### Nouveauté: {#new-features-13} + +- Ajout de la fonction table `file(path, format, structure)`. Un exemple de lecture d'octets depuis `/dev/urandom`: ``` ln -s /dev/urandom /var/lib/clickhouse/user_files/random``clickhouse-client -q "SELECT * FROM file('random', 'RowBinary', 'd UInt8') LIMIT 10" ```. + +#### Amélioration: {#improvements-12} + +- Les sous-requêtes peuvent être encapsulées `()` crochets pour améliorer la lisibilité des requêtes. Exemple: `(SELECT 1) UNION ALL (SELECT 1)`. +- Simple `SELECT` les requêtes de l' `system.processes` le tableau ne sont pas inclus dans le `max_concurrent_queries` limite. + +#### Corrections de bugs: {#bug-fixes-24} + +- Correction d'un comportement incorrect de la `IN` opérateur quand sélectionner à partir de `MATERIALIZED VIEW`. +- Correction d'un filtrage incorrect par index de partition dans des expressions comme `partition_key_column IN (...)`. +- Incapacité fixe à exécuter `OPTIMIZE` requête sur réplica non leader si `REANAME` a été effectuée sur la table. +- Correction de l'erreur d'autorisation lors de l'exécution `OPTIMIZE` ou `ALTER` requêtes sur une réplique non-leader. +- Fixe le gel de l' `KILL QUERY`. +- Correction d'une erreur dans la bibliothèque client ZooKeeper qui a conduit à la perte de montres, le gel de la file d'attente DDL distribuée, et des ralentissements dans la file d'attente de réplication si un non vide `chroot` le préfixe est utilisé dans la configuration de ZooKeeper. + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-8} + +- Suppression du support pour les expressions comme `(a, b) IN (SELECT (a, b))` (vous pouvez utiliser l'expression équivalente `(a, b) IN (SELECT a, b)`). Dans les versions précédentes, ces expressions ont conduit à indéterminé `WHERE` filtrage ou causé des erreurs. + +### Clickhouse version 1.1.54378, 2018-04-16 {#clickhouse-release-1-1-54378-2018-04-16} + +#### Nouveauté: {#new-features-14} + +- Niveau d'enregistrement peut être modifié sans redémarrer le serveur. +- Ajouté le `SHOW CREATE DATABASE` requête. +- Le `query_id` peut être passé à `clickhouse-client` (elBroom). +- Nouveau paramètre: `max_network_bandwidth_for_all_users`. +- Ajout du support pour `ALTER TABLE ... PARTITION ...` pour `MATERIALIZED VIEW`. +- Ajout d'informations sur la taille des parties de données sous forme non compressée dans la table système. +- Prise en charge du chiffrement de serveur à serveur pour les tables distribuées (`1` dans la configuration de la réplique ``). +- Configuration du niveau de la table pour `ReplicatedMergeTree` la famille afin de minimiser la quantité de données stockées dans Zookeeper: : `use_minimalistic_checksums_in_zookeeper = 1` +- Configuration de l' `clickhouse-client` invite. Par défaut, les noms de serveur sont maintenant affichés à l'invite. Le nom d'affichage du serveur peut être modifié. Il est également envoyé dans le `X-ClickHouse-Display-Name` En-tête HTTP (Kirill Shvakov). +- Séparés par des virgules multiples `topics` peut être spécifié pour l' `Kafka` moteur (Tobias Adamson) +- Quand une requête est arrêtée par `KILL QUERY` ou `replace_running_query` le client reçoit l' `Query was canceled` exception au lieu d'un résultat incomplète. + +#### Amélioration: {#improvements-13} + +- `ALTER TABLE ... DROP/DETACH PARTITION` les requêtes sont exécutées à l'avant de la file d'attente de réplication. +- `SELECT ... FINAL` et `OPTIMIZE ... FINAL` peut être utilisé même lorsque la table a une seule partie de données. +- A `query_log` la table est recréée à la volée si elle a été supprimée manuellement (Kirill Shvakov). +- Le `lengthUTF8` fonction fonctionne plus rapidement (zhang2014). +- Amélioration des performances des inserts synchrones dans `Distributed` table (`insert_distributed_sync = 1` lorsqu'il existe un très grand nombre de fragments. +- Le serveur accepte le `send_timeout` et `receive_timeout` les paramètres du client et les applique lors de la connexion au client (ils sont appliqués dans l'ordre inverse: le socket du serveur `send_timeout` est définie à l' `receive_timeout` valeur reçue du client, et vice versa). +- Récupération de crash plus robuste pour une insertion asynchrone dans `Distributed` table. +- Le type de retour de la `countEqual` la fonction a changé à partir de `UInt32` de `UInt64` (谢磊). + +#### Corrections de bugs: {#bug-fixes-25} + +- Correction d'une erreur avec `IN` lorsque le côté gauche de l'expression est `Nullable`. +- Les résultats corrects sont maintenant retournés lors de l'utilisation de tuples avec `IN` lorsque certains des composants tuple sont dans l'index de la table. +- Le `max_execution_time` limite fonctionne désormais correctement avec les requêtes distribuées. +- Correction d'erreurs lors du calcul de la taille des colonnes composites `system.columns` table. +- Correction d'une erreur lors de la création d'une table temporaire `CREATE TEMPORARY TABLE IF NOT EXISTS.` +- Erreurs corrigées dans `StorageKafka` (\#\#2075) +- Le serveur fixe se bloque à partir d'arguments non valides de certaines fonctions d'agrégat. +- Correction de l'erreur qui a empêché l' `DETACH DATABASE` requête de l'arrêt des tâches d'arrière-plan pour `ReplicatedMergeTree` table. +- `Too many parts` l'état est moins susceptible de se produire lors de l'insertion dans agrégées des vues matérialisées (\#\#2084). +- Correction de la gestion récursive des substitutions dans la configuration si une substitution doit être suivie d'une autre substitution au même niveau. +- Correction de la syntaxe dans le fichier de métadonnées lors de la création d'un `VIEW` qui utilise une requête avec `UNION ALL`. +- `SummingMergeTree` fonctionne maintenant correctement pour la sommation des structures de données imbriquées avec une clé composite. +- Correction de la possibilité d'une condition de course lors du choix du leader pour `ReplicatedMergeTree` table. + +#### Construire des changements: {#build-changes-5} + +- La construction prend en charge `ninja` plutôt `make` et utilise `ninja` par défaut pour les versions de construction. +- Paquets renommés: `clickhouse-server-base` dans `clickhouse-common-static`; `clickhouse-server-common` dans `clickhouse-server`; `clickhouse-common-dbg` dans `clickhouse-common-static-dbg`. Pour installer, utilisez `clickhouse-server clickhouse-client`. Les paquets avec les anciens noms seront toujours chargés dans les dépôts pour une compatibilité descendante. + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-9} + +- Retiré de l'interprétation d'une expression si un tableau est spécifié sur le côté gauche. Auparavant, l'expression `arr IN (set)` a été interprété comme “at least one `arr` element belongs to the `set`”. Pour obtenir le même comportement dans la nouvelle version, écrire `arrayExists(x -> x IN (set), arr)`. +- Désactivé l'utilisation incorrecte de l'option socket `SO_REUSEPORT`, qui a été incorrectement activé par défaut dans la bibliothèque Poco. Notez que sous Linux il n'y a plus aucune raison de spécifier simultanément les adresses `::` et `0.0.0.0` for listen – use just `::`, qui permet d'écouter la connexion à la fois sur IPv4 et IPv6 (avec les paramètres de configuration du noyau par défaut). Vous pouvez également revenir au comportement des versions précédentes en spécifiant `1` dans la config. + +### Clickhouse version 1.1.54370, 2018-03-16 {#clickhouse-release-1-1-54370-2018-03-16} + +#### Nouveauté: {#new-features-15} + +- Ajouté le `system.macros` table et mise à jour automatique des macros lorsque le fichier de configuration est modifié. +- Ajouté le `SYSTEM RELOAD CONFIG` requête. +- Ajouté le `maxIntersections(left_col, right_col)` fonction d'agrégation, qui retourne le nombre maximal d'simultanément intersection d'intervalles `[left; right]`. Le `maxIntersectionsPosition(left, right)` fonction retourne le début de la “maximum” intervalle. ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2012)). + +#### Amélioration: {#improvements-14} + +- Lors de l'insertion de données dans une `Replicated` tableau, moins de demandes sont faites à `ZooKeeper` (et la plupart des erreurs au niveau de l'utilisateur ont disparu de la `ZooKeeper` journal). +- Ajout de la possibilité de créer des alias pour les ensembles de données. Exemple: `WITH (1, 2, 3) AS set SELECT number IN set FROM system.numbers LIMIT 10`. + +#### Corrections de bugs: {#bug-fixes-26} + +- Correction de l' `Illegal PREWHERE` erreur lors de la lecture des tables de fusion pour `Distributed`table. +- Ajout de correctifs qui vous permettent de démarrer clickhouse-server dans des conteneurs Docker IPv4 uniquement. +- Correction d'une condition de course lors de la lecture du système `system.parts_columns tables.` +- Suppression de la double mise en mémoire tampon lors d'un insert synchrone `Distributed` table, ce qui aurait pu provoquer la connexion à timeout. +- Correction d'un bug qui a causé des attentes trop longues pour une réplique indisponible avant de commencer un `SELECT` requête. +- Correction de dates incorrectes dans le `system.parts` table. +- Correction d'un bug qui rendait impossible l'insertion de données dans un `Replicated` le tableau si `chroot` était non vide dans la configuration du `ZooKeeper` cluster. +- Correction de l'algorithme de fusion verticale pour un `ORDER BY` table. +- Restauré la possibilité d'utiliser des dictionnaires dans les requêtes aux tables distantes, même si ces dictionnaires ne sont pas présents sur le serveur demandeur. Cette fonctionnalité a été perdue dans la version 1.1.54362. +- Restauré le comportement pour les requêtes comme `SELECT * FROM remote('server2', default.table) WHERE col IN (SELECT col2 FROM default.table)` lorsque le côté droit de la `IN` devrait utiliser une télécommande `default.table` au lieu d'un local. Ce comportement a été rompu dans la version 1.1.54358. +- Suppression de la journalisation au niveau des erreurs `Not found column ... in block`. + +### Clickhouse Version 1.1.54362, 2018-03-11 {#clickhouse-release-1-1-54362-2018-03-11} + +#### Nouveauté: {#new-features-16} + +- Agrégation sans `GROUP BY` pour un ensemble vide (comme `SELECT count(*) FROM table WHERE 0`) renvoie maintenant un résultat avec une ligne avec des valeurs null pour les fonctions d'agrégation, conformément à la norme SQL. Pour restaurer l'ancien comportement (renvoyer un résultat vide), définissez `empty_result_for_aggregation_by_empty_set` 1. +- Conversion de type ajouté pour `UNION ALL`. Différents noms d'alias sont autorisés dans `SELECT` les positions dans `UNION ALL` en conformité avec le standard SQL. +- Les expressions arbitraires sont prises en charge dans `LIMIT BY` clause. Auparavant, il était seulement possible d'utiliser des colonnes résultant de `SELECT`. +- Un indice de `MergeTree` tables est utilisé lorsque `IN` est appliqué à un n-uplet d'expressions à partir des colonnes de la clé primaire. Exemple: `WHERE (UserID, EventDate) IN ((123, '2000-01-01'), ...)` (Anastasiya Tsarkova). +- Ajouté le `clickhouse-copier` outil pour copier entre les clusters et remodeler les données (beta). +- Ajout de fonctions de hachage cohérentes: `yandexConsistentHash`, `jumpConsistentHash`, `sumburConsistentHash`. Ils peuvent être utilisés comme une clé de sharding afin de réduire la quantité de trafic réseau lors de remaniements ultérieurs. +- L'ajout de fonctions: `arrayAny`, `arrayAll`, `hasAny`, `hasAll`, `arrayIntersect`, `arrayResize`. +- Ajouté le `arrayCumSum` fonction (Javi Santana). +- Ajouté le `parseDateTimeBestEffort`, `parseDateTimeBestEffortOrZero`, et `parseDateTimeBestEffortOrNull` fonctions pour lire le DateTime à partir d'une chaîne contenant du texte dans une grande variété de formats possibles. +- Les données peuvent être partiellement rechargées à partir de dictionnaires externes lors de la mise à jour (charger uniquement les enregistrements dans lesquels la valeur du champ spécifié supérieure à celle du téléchargement précédent) (Arsen Hakobyan). +- Ajouté le `cluster` table de fonction. Exemple: `cluster(cluster_name, db, table)`. Le `remote` la fonction table peut accepter le nom du cluster comme premier argument, s'il est spécifié comme identifiant. +- Le `remote` et `cluster` les fonctions de table peuvent être utilisées dans `INSERT` requête. +- Ajouté le `create_table_query` et `engine_full` colonnes virtuelles au `system.tables`table . Le `metadata_modification_time` la colonne est virtuel. +- Ajouté le `data_path` et `metadata_path` les colonnes à `system.tables`et`system.databases` tables, et a ajouté le `path` la colonne de la `system.parts` et `system.parts_columns` table. +- Ajout d'informations supplémentaires sur les fusions `system.part_log` table. +- Une clé de partitionnement arbitraire peut être utilisée pour `system.query_log` table (Kirill Shvakov). +- Le `SHOW TABLES` query affiche maintenant également des tables temporaires. Ajout de tables temporaires et `is_temporary` colonne de `system.tables` (zhang2014). +- Ajouter `DROP TEMPORARY TABLE` et `EXISTS TEMPORARY TABLE` les requêtes (zhang2014). +- Soutien pour `SHOW CREATE TABLE` pour les tables temporaires (zhang2014). +- Ajouté le `system_profile` paramètre de configuration pour les paramètres utilisés par les processus internes. +- Soutien pour le chargement `object_id` comme un attribut de `MongoDB` dictionnaires (Pavel Litvinenko). +- Lecture `null` comme valeur par défaut lors du chargement de données pour un dictionnaire externe `MongoDB` source (Pavel Litvinenko). +- Lecture `DateTime` les valeurs dans la `Values` formater à partir D'un horodatage Unix sans guillemets simples. +- Le basculement est pris en charge dans `remote` fonctions de table pour les cas où certaines répliques manquent la table demandée. +- Les paramètres de Configuration peuvent être remplacées dans la ligne de commande lorsque vous exécutez `clickhouse-server`. Exemple: `clickhouse-server -- --logger.level=information`. +- Mise en œuvre de la `empty` fonction à partir d'un `FixedString` argument: la fonction renvoie 1 si la chaîne est entièrement composée d'octets nuls (zhang2014). +- Ajouté le `listen_try`paramètre de configuration pour l'écoute d'au moins une des adresses listen sans quitter, si certaines adresses ne peuvent pas être écoutées (utile pour les systèmes avec prise en charge désactivée pour IPv4 ou IPv6). +- Ajouté le `VersionedCollapsingMergeTree` tableau moteur. +- Prise en charge des lignes et des types numériques arbitraires `library` source du dictionnaire. +- `MergeTree` les tableaux peuvent être utilisés sans une clé primaire (vous devez spécifier `ORDER BY tuple()`). +- A `Nullable` peut être de type `CAST` pour un non-`Nullable` type si l'argument n'est pas `NULL`. +- `RENAME TABLE` peut être effectuée pour `VIEW`. +- Ajouté le `throwIf` fonction. +- Ajouté le `odbc_default_field_size` option, qui vous permet d'étendre la taille maximale de la valeur chargée à partir D'une source ODBC (par défaut, il est 1024). +- Le `system.processes` table et `SHOW PROCESSLIST` ont maintenant la `is_cancelled` et `peak_memory_usage` colonne. + +#### Amélioration: {#improvements-15} + +- Les limites et quotas sur le résultat ne sont plus appliqués aux données intermédiaires pour `INSERT SELECT` les requêtes ou pour `SELECT` les sous-requêtes. +- Moins de faux déclencheurs de `force_restore_data` lors de la vérification de l'état de `Replicated` les tables lorsque le serveur démarre. +- Ajouté le `allow_distributed_ddl` option. +- Les fonctions non déterministes ne sont pas autorisées dans les expressions `MergeTree` table de clés. +- Fichiers avec des substitutions de `config.d` les répertoires sont chargés par ordre alphabétique. +- Amélioration de la performance de l' `arrayElement` fonction dans le cas d'une constante tableau multidimensionnel avec un tableau vide comme l'un des éléments. Exemple: `[[1], []][x]`. +- Le serveur démarre plus rapidement maintenant lors de l'utilisation de fichiers de configuration avec de très grandes substitutions (par exemple, de très grandes listes de réseaux IP). +- Lors de l'exécution d'une requête, les fonctions de valeur de table s'exécutent une fois. Précédemment, `remote` et `mysql` les fonctions à valeur de table ont effectué la même requête deux fois pour récupérer la structure de la table à partir d'un serveur distant. +- Le `MkDocs` générateur de documentation est utilisé. +- Lorsque vous essayez de supprimer une colonne de table `DEFAULT`/`MATERIALIZED` les expressions des autres colonnes dépendent, une exception est levée (zhang2014). +- Ajout de la possibilité d'analyser une ligne vide dans des formats de texte comme le nombre 0 pour `Float` types de données. Cette fonctionnalité était auparavant disponible mais a été perdue dans la version 1.1.54342. +- `Enum` les valeurs peuvent être utilisés dans `min`, `max`, `sum` et quelques autres fonctions. Dans ces cas, il utilise des valeurs numériques correspondantes. Cette fonctionnalité était auparavant disponible mais a été perdue dans la version 1.1.54337. +- Ajouter `max_expanded_ast_elements` pour limiter la taille de L'AST après l'expansion récursive des alias. + +#### Corrections de bugs: {#bug-fixes-27} + +- Correction de cas où des colonnes inutiles ont été supprimées des sous-requêtes par erreur, ou non supprimées des sous-requêtes contenant `UNION ALL`. +- Correction d'un bug dans les fusions pour `ReplacingMergeTree` table. +- Insertions synchrones fixes dans `Distributed` table (`insert_distributed_sync = 1`). +- Fixe erreur de segmentation pour certaines utilisations de `FULL` et `RIGHT JOIN` avec des colonnes en double dans les sous-requêtes. +- Fixe erreur de segmentation pour certaines utilisations de `replace_running_query` et `KILL QUERY`. +- Fixe l'ordre du `source` et `last_exception` les colonnes dans l' `system.dictionaries` table. +- Correction d'un bug lors de l' `DROP DATABASE` la requête n'a pas supprimé le fichier contenant des métadonnées. +- Correction de l' `DROP DATABASE` requête pour `Dictionary` les bases de données. +- Fixe la faible précision de `uniqHLL12` et `uniqCombined` fonctions pour les cardinalités supérieures à 100 millions d'articles (Alex Bocharov). +- Correction du calcul des valeurs par défaut implicites si nécessaire pour calculer simultanément des expressions explicites par défaut dans `INSERT` les requêtes (zhang2014). +- Correction d'un cas rare lorsqu'une requête à un `MergeTree` la table n'a pas pu finir (chenxing-xc). +- Correction d'un plantage survenu lors de l'exécution d'un `CHECK` requête pour `Distributed` tables si tous les fragments sont locaux (chenxing.xc). +- Correction d'une légère régression des performances avec des fonctions qui utilisent des expressions régulières. +- Correction d'une régression de performance lors de la création de tableaux multidimensionnels à partir d'expressions complexes. +- Correction d'un bug qui pourrait causer un supplément `FORMAT` article à paraître dans un `.sql` fichier de métadonnées. +- Correction d'un bug qui a causé la `max_table_size_to_drop` limite à appliquer lorsque vous essayez de supprimer un `MATERIALIZED VIEW` en regardant une table explicitement spécifiée. +- Correction de l'incompatibilité avec les anciens clients (les anciens clients étaient parfois envoyés `DateTime('timezone')` type, dont ils ne comprennent pas). +- Correction d'un bug lors de la lecture `Nested` éléments de colonne de structures qui ont été ajoutés en utilisant `ALTER` mais qui sont vides pour les anciennes partitions, lorsque les conditions de ces colonnes a déménagé à `PREWHERE`. +- Correction d'un bug lors du filtrage des tables virtuelles `_table` colonnes dans les requêtes à `Merge` table. +- Correction d'un bug lors de l'utilisation `ALIAS` les colonnes en `Distributed` table. +- Correction d'un bug qui rendait la compilation dynamique impossible pour les requêtes avec des fonctions `quantile` famille. +- Correction d'une condition de concurrence dans le pipeline d'exécution de requête qui s'est produite dans de très rares cas lors de l'utilisation `Merge` avec un grand nombre de tables, et lors de l'utilisation `GLOBAL` les sous-requêtes. +- Correction d'un crash lors du passage de tableaux de tailles différentes pour un `arrayReduce` fonction lors de l'utilisation de fonctions d'agrégation à partir de plusieurs arguments. +- Interdit l'utilisation de requêtes avec `UNION ALL` dans un `MATERIALIZED VIEW`. +- Correction d'une erreur lors de l'initialisation du `part_log` table système au démarrage du serveur (par défaut, `part_log` est désactivée). + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-10} + +- Enlevé le `distributed_ddl_allow_replicated_alter` option. Ce comportement est activé par défaut. +- Enlevé le `strict_insert_defaults` paramètre. Si vous utilisez cette fonctionnalité, écrivez à `clickhouse-feedback@yandex-team.com`. +- Enlevé le `UnsortedMergeTree` moteur. + +### Clickhouse Version 1.1.54343, 2018-02-05 {#clickhouse-release-1-1-54343-2018-02-05} + +- Ajout de la prise en charge des macros pour définir les noms de cluster dans les requêtes DDL distribuées et les constructeurs de tables distribuées: `CREATE TABLE distr ON CLUSTER '{cluster}' (...) ENGINE = Distributed('{cluster}', 'db', 'table')`. +- Maintenant requêtes comme `SELECT ... FROM table WHERE expr IN (subquery)` sont traitées à l'aide de la `table` index. +- Amélioration du traitement des doublons lors de l'insertion dans des tables répliquées, de sorte qu'ils ne ralentissent plus l'exécution de la file d'attente de réplication. + +### Clickhouse Version 1.1.54342, 2018-01-22 {#clickhouse-release-1-1-54342-2018-01-22} + +Cette version contient des corrections de bugs pour la version précédente 1.1.54337: + +- Correction d'une régression dans 1.1.54337: si l'utilisateur par défaut a un accès en lecture seule, le serveur refuse de démarrer avec le message `Cannot create database in readonly mode`. +- Correction d'une régression dans 1.1.54337: sur les systèmes avec systemd, les journaux sont toujours écrits dans syslog quelle que soit la configuration; le script watchdog utilise toujours init.d. +- Correction d'une régression dans 1.1.54337: mauvaise configuration par défaut dans L'image Docker. +- Correction du comportement non déterministe de GraphiteMergeTree (vous pouvez le voir dans les messages de journal `Data after merge is not byte-identical to the data on another replicas`). +- Correction d'un bug qui peut conduire à des fusions incohérentes après optimiser la requête aux tables répliquées (vous pouvez le voir dans les messages de journal `Part ... intersects the previous part`). +- Les tables tampon fonctionnent maintenant correctement lorsque des colonnes matérialisées sont présentes dans la table de destination (par zhang2014). +- Correction d'un bug dans la mise en œuvre de NULL. + +### Clickhouse Version 1.1.54337, 2018-01-18 {#clickhouse-release-1-1-54337-2018-01-18} + +#### Nouveauté: {#new-features-17} + +- Ajout du support pour le stockage de tableaux et de tuples multidimensionnels (`Tuple` type de données) dans les tableaux. +- Prise en charge des fonctions de table pour `DESCRIBE` et `INSERT` requête. Ajout du support pour les sous-requêtes dans `DESCRIBE`. Exemple: `DESC TABLE remote('host', default.hits)`; `DESC TABLE (SELECT 1)`; `INSERT INTO TABLE FUNCTION remote('host', default.hits)`. Soutien pour `INSERT INTO TABLE` outre `INSERT INTO`. +- Amélioration du support pour les fuseaux horaires. Le `DateTime` le type de données peut être annoté avec le fuseau horaire utilisé pour l'analyse et le formatage dans les formats de texte. Exemple: `DateTime('Europe/Moscow')`. Lorsque les fuseaux horaires sont spécifiés dans les fonctions `DateTime` arguments, le type de retour pour suivre le fuseau horaire, et la valeur sera affichée comme prévu. +- Ajout des fonctions `toTimeZone`, `timeDiff`, `toQuarter`, `toRelativeQuarterNum`. Le `toRelativeHour`/`Minute`/`Second` les fonctions peuvent prendre une valeur de type `Date` comme argument. Le `now` nom de la fonction est sensible à la casse. +- Ajouté le `toStartOfFifteenMinutes` fonction (Kirill Shvakov). +- Ajouté le `clickhouse format` outil de formatage des requêtes. +- Ajouté le `format_schema_path` configuration parameter (Marek Vavruşa). It is used for specifying a schema in `Cap'n Proto` format. Les fichiers de schéma peuvent être situés uniquement dans le répertoire spécifié. +- Ajout du support pour les substitutions de configuration (`incl` et `conf.d`) pour la configuration de dictionnaires et de modèles externes (Pavel Yakunin). +- Ajout d'une colonne avec la documentation pour le `system.settings` table (Kirill Shvakov). +- Ajouté le `system.parts_columns` table avec des informations sur la taille des colonnes dans chaque partie `MergeTree` table. +- Ajouté le `system.models` tableau avec des informations sur chargé `CatBoost` machine de modèles d'apprentissage. +- Ajouté le `mysql` et `odbc` fonction de table et correspondant `MySQL` et `ODBC` moteurs de table pour accéder aux bases de données distantes. Cette fonctionnalité est en phase bêta. +- Ajout de la possibilité de passer un argument de type `AggregateFunction` pour l' `groupArray` fonction d'agrégation (vous pouvez donc créer un tableau d'États d'une fonction d'agrégation). +- Suppression des restrictions sur diverses combinaisons de combinateurs de fonction d'agrégat. Par exemple, vous pouvez utiliser `avgForEachIf` ainsi que `avgIfForEach` les fonctions d'agrégation, qui ont des comportements différents. +- Le `-ForEach` fonction d'agrégation combinator est prolongée pour le cas des fonctions d'agrégation de plusieurs arguments. +- Ajout du support pour les fonctions d'agrégation de `Nullable` arguments même pour les cas où la fonction renvoie un non-`Nullable` résultat (ajouté avec la contribution de Silviu Caragea). Exemple: `groupArray`, `groupUniqArray`, `topK`. +- Ajouté le `max_client_network_bandwidth` pour `clickhouse-client` (Kirill Shvakov). +- Les utilisateurs avec le `readonly = 2` setting are allowed to work with TEMPORARY tables (CREATE, DROP, INSERT…) (Kirill Shvakov). +- Ajout du support pour l'utilisation de plusieurs consommateurs avec le `Kafka` moteur. Options de configuration étendues pour `Kafka` (Marek Vavruša). +- Ajouté le `intExp3` et `intExp4` fonction. +- Ajouté le `sumKahan` fonction d'agrégation. +- Ajout des fonctions to\* Number \* OrNull, où \* Number \* est un type numérique. +- Ajout du support pour `WITH` clauses pour un `INSERT SELECT` requête (auteur: zhang2014). +- Ajout des paramètres de: `http_connection_timeout`, `http_send_timeout`, `http_receive_timeout`. En particulier, ces paramètres sont utilisés pour télécharger des parties de données pour la réplication. La modification de ces paramètres permet un basculement plus rapide si le réseau est surchargé. +- Ajout du support pour `ALTER` pour les tables de type `Null` (Anastasiya Tsarkova). +- Le `reinterpretAsString` la fonction est étendue pour tous les types de données stockés de manière contiguë en mémoire. +- Ajouté le `--silent` option pour le `clickhouse-local` outil. Il supprime les informations d'exécution de requête d'impression dans stderr. +- Ajout du support pour la lecture des valeurs de type `Date` à partir du texte dans un format où le mois et / ou le jour du mois est spécifié en utilisant un seul chiffre au lieu de deux chiffres (oiseau Amos). + +#### Optimisations des performances: {#performance-optimizations} + +- Amélioration des performances des fonctions d'agrégation `min`, `max`, `any`, `anyLast`, `anyHeavy`, `argMin`, `argMax` à partir d'arguments de chaîne. +- Amélioration des performances des fonctions `isInfinite`, `isFinite`, `isNaN`, `roundToExp2`. +- Amélioration des performances de l'analyse et du formatage `Date` et `DateTime` tapez les valeurs au format texte. +- Amélioration des performances et de la précision de l'analyse des nombres à virgule flottante. +- Abaissé l'utilisation de la mémoire pour `JOIN` dans le cas où les parties gauche et droite ont des colonnes avec des noms identiques qui ne sont pas contenus dans `USING` . +- Amélioration des performances des fonctions d'agrégation `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr` en réduisant la stabilité de calcul. Les anciennes fonctions sont disponibles sous les noms de `varSampStable`, `varPopStable`, `stddevSampStable`, `stddevPopStable`, `covarSampStable`, `covarPopStable`, `corrStable`. + +#### Corrections de bugs: {#bug-fixes-28} + +- Déduplication de données fixe après l'exécution d'un `DROP` ou `DETACH PARTITION` requête. Dans la version précédente, la suppression d'une partition et l'insertion à nouveau des mêmes données ne fonctionnaient pas car les blocs insérés étaient considérés comme des doublons. +- Correction d'un bug qui pourrait conduire à une interprétation incorrecte de la `WHERE` la clause de `CREATE MATERIALIZED VIEW` les requêtes avec `POPULATE` . +- Correction d'un bug dans l'utilisation de l' `root_path` paramètre dans l' `zookeeper_servers` configuration. +- Correction des résultats inattendus du passage du `Date` argument `toStartOfDay` . +- Correction de l' `addMonths` et `subtractMonths` fonctions et l'arithmétique pour `INTERVAL n MONTH` dans les cas où le résultat de l'année précédente. +- Ajout du support manquant pour le `UUID` type de données pour `DISTINCT` , `JOIN` , et `uniq` fonctions agrégées et dictionnaires externes (Evgeniy Ivanov). Soutien pour `UUID` est encore incomplète. +- Fixe `SummingMergeTree` comportement dans les cas où les lignes additionnées à zéro. +- Diverses corrections pour le `Kafka` engine (Marek Vavruša). +- Correction d'un comportement incorrect de la `Join` moteur de table (oiseau Amos). +- Correction d'un comportement d'allocateur incorrect sous FreeBSD et OS X. +- Le `extractAll` fonction prend désormais en charge les correspondances vides. +- Correction d'une erreur qui bloquait l'utilisation de `libressl` plutôt `openssl` . +- Correction de l' `CREATE TABLE AS SELECT` requête à partir de tables temporaires. +- Correction de la non-atomicité de la mise à jour de la file d'attente de réplication. Cela peut entraîner la désynchronisation des répliques jusqu'au redémarrage du serveur. +- Correction d'un débordement possible dans `gcd` , `lcm` et `modulo` (`%` de l'opérateur) (Mak Skorokhod). +- `-preprocessed` les fichiers sont maintenant créés après modification `umask` (`umask` peut être changé dans le fichier de configuration). +- Correction d'un bug dans la vérification des antécédents des pièces (`MergeTreePartChecker` ) lors de l'utilisation d'une coutume clé de partition. +- Correction de l'analyse des tuples (valeurs du `Tuple` type de données) dans des formats de texte. +- Amélioration des messages d'erreur sur les types incompatibles transmis à `multiIf` , `array` et quelques autres fonctions. +- Repensé de soutien pour `Nullable` type. Correction de bugs qui peuvent conduire à un plantage du serveur. Correction de presque tous les autres bugs liés à `NULL` support: conversions de type incorrectes dans INSERT SELECT, support insuffisant pour Nullable dans HAVING et PREWHERE, `join_use_nulls` mode, Nullable types comme arguments de `OR` l'opérateur, etc. +- Correction de divers bugs liés à la sémantique interne des types de données. Exemples: sommation inutile de `Enum` tapez les champs dans `SummingMergeTree` ; l'alignement de la `Enum` types de `Pretty` formats, etc. +- Contrôles plus stricts pour les combinaisons autorisées de colonnes composites. +- Correction du débordement lors de la spécification d'un très grand paramètre pour le `FixedString` type de données. +- Correction d'un bug dans l' `topK` fonction d'agrégation dans un cas générique. +- Ajout de la vérification manquante pour l'égalité des tailles de tableau dans les arguments de n-ARY variantes de fonctions d'agrégation avec un `-Array` combinator. +- Correction d'un bug dans `--pager` pour `clickhouse-client` (auteur: ks1322). +- Fixe la précision de la `exp10` fonction. +- Correction du comportement du `visitParamExtract` fonction pour une meilleure conformité avec la documentation. +- Correction du crash lorsque des types de données incorrects sont spécifiés. +- Correction du comportement de `DISTINCT` dans le cas lorsque toutes les colonnes sont des constantes. +- Correction du formatage de la requête dans le cas de l'utilisation du `tupleElement` fonction avec une expression constante complexe comme indice d'élément tuple. +- Correction d'un bug dans `Dictionary` tables pour `range_hashed` dictionnaire. +- Correction d'un bug qui conduit à des lignes excessives dans le résultat de `FULL` et `RIGHT JOIN` (Oiseau Amos). +- Correction d'un plantage du serveur lors de la création et de la suppression de fichiers temporaires `config.d` répertoires pendant le rechargement de la configuration. +- Correction de l' `SYSTEM DROP DNS CACHE` requête: le cache a été vidé mais les adresses des nœuds de cluster n'ont pas été mises à jour. +- Correction du comportement de `MATERIALIZED VIEW` après l'exécution de `DETACH TABLE` for the table under the view (Marek Vavruša). + +#### Construire des améliorations: {#build-improvements-4} + +- Le `pbuilder` l'outil est utilisé pour les versions. Le processus de construction est presque complètement indépendant de l'environnement hôte de construction. +- Une seule version est utilisée pour différentes versions du système d'exploitation. Les paquets et les binaires ont été rendus compatibles avec un large éventail de systèmes Linux. +- Ajouté le `clickhouse-test` paquet. Il peut être utilisé pour exécuter des tests fonctionnels. +- L'archive source peut maintenant être publié dans le référentiel. Il peut être utilisé pour reproduire la construction sans utiliser GitHub. +- Ajout d'une intégration limitée avec Travis CI. En raison des limites de temps de construction dans Travis, seule la construction de débogage est testée et un sous-ensemble limité de tests est exécuté. +- Ajout du support pour `Cap'n'Proto` dans la construction par défaut. +- Modification du format des sources de documentation à partir de `Restricted Text` de `Markdown`. +- Ajout du support pour `systemd` (Vladimir Smirnov). Il est désactivé par défaut en raison d'une incompatibilité avec certaines images du système D'exploitation et peut être activé manuellement. +- Pour la génération de code dynamique, `clang` et `lld` sont intégrées dans le `clickhouse` binaire. Ils peuvent également être invoqués comme `clickhouse clang` et `clickhouse lld` . +- Suppression de l'utilisation des extensions GNU du code. Permis à l' `-Wextra` option. Lors de la construction avec `clang` la valeur par défaut est `libc++` plutôt `libstdc++`. +- Extrait `clickhouse_parsers` et `clickhouse_common_io` les bibliothèques pour accélérer les constructions des différents outils. + +#### Modifications incompatibles en arrière: {#backward-incompatible-changes-11} + +- Le format des marques dans `Log` tapez les tables qui contiennent `Nullable` les colonnes ont été modifiées d'une manière incompatible avec l'arrière. Si vous avez ces tables, vous devez les convertir en `TinyLog` tapez avant de démarrer la nouvelle version du serveur. Pour ce faire, remplacez `ENGINE = Log` avec `ENGINE = TinyLog` dans le correspondant `.sql` fichier dans le `metadata` répertoire. Si votre table n'a pas `Nullable` les colonnes ou si le type de votre table n'est pas `Log`, alors vous n'avez pas besoin de faire quoi que ce soit. +- Enlevé le `experimental_allow_extended_storage_definition_syntax` paramètre. Maintenant cette fonctionnalité est activée par défaut. +- Le `runningIncome` fonction a été renommée en `runningDifferenceStartingWithFirstvalue` pour éviter toute confusion. +- Enlevé le `FROM ARRAY JOIN arr` syntaxe lorsque la jointure du tableau est spécifiée directement après FROM sans table (Amos Bird). +- Enlevé le `BlockTabSeparated` format utilisé uniquement à des fins de démonstration. +- Modification du format d'État pour les fonctions d'agrégation `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. Si vous avez stocké des états de ces fonctions d'agrégat dans des tables (en utilisant `AggregateFunction` type de données ou vues matérialisées avec les états correspondants), écrivez svp à clickhouse-feedback@yandex-team.com. +- Dans les versions précédentes du serveur, il y avait une fonctionnalité non documentée: si une fonction d'agrégation dépend de paramètres, vous pouvez toujours la spécifier sans paramètres dans le type de données AggregateFunction. Exemple: `AggregateFunction(quantiles, UInt64)` plutôt `AggregateFunction(quantiles(0.5, 0.9), UInt64)`. Cette fonctionnalité a été perdu. Bien qu'il ne soit pas documenté, nous prévoyons de le soutenir à nouveau dans les prochaines versions. +- Les types de données Enum ne peuvent pas être utilisés dans les fonctions d'agrégat min/max. Cette capacité sera rendu dans la prochaine version. + +#### Veuillez noter lors de la mise à niveau: {#please-note-when-upgrading} + +- Lorsque vous effectuez une mise à jour continue sur un cluster, au moment où certaines répliques exécutent L'ancienne version de ClickHouse et d'autres la nouvelle version, la réplication est temporairement arrêtée et le message `unknown parameter 'shard'` apparaît dans le journal. La réplication se poursuivra après la mise à jour de toutes les répliques du cluster. +- Si différentes versions de ClickHouse sont en cours d'exécution sur les serveurs de cluster, il est possible que les requêtes distribuées utilisant les fonctions suivantes aient des résultats incorrects: `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. Vous devez mettre à jour tous les nœuds de cluster. + +## [Changelog pour 2017](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/changelog/2017.md) {#changelog-for-2017} diff --git a/docs/fr/changelog/2019.md b/docs/fr/changelog/2019.md new file mode 120000 index 00000000000..105ca144fca --- /dev/null +++ b/docs/fr/changelog/2019.md @@ -0,0 +1 @@ +../../en/changelog/2019.md \ No newline at end of file diff --git a/docs/fr/changelog/index.md b/docs/fr/changelog/index.md new file mode 100644 index 00000000000..710f11ba1d5 --- /dev/null +++ b/docs/fr/changelog/index.md @@ -0,0 +1,664 @@ +--- +machine_translated: true +--- + +## Clickhouse version v20. 3 {#clickhouse-release-v20-3} + +### Clickhouse version v20. 3. 4. 10, 2020-03-20 {#clickhouse-release-v20-3-4-10-2020-03-20} + +#### Bug Fix {#bug-fix} + +- Cette version contient également toutes les corrections de bugs de 20.1.8.41 +- Fixer manquant `rows_before_limit_at_least` pour les requêtes sur http (avec pipeline de processeurs). Cela corrige [\#9730](https://github.com/ClickHouse/ClickHouse/issues/9730). [\#9757](https://github.com/ClickHouse/ClickHouse/pull/9757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +### Clickhouse version v20. 3. 3. 6, 2020-03-17 {#clickhouse-release-v20-3-3-6-2020-03-17} + +#### Bug Fix {#bug-fix-1} + +- Cette version contient également toutes les corrections de bugs de 20.1.7.38 +- Correction d'un bug dans une réplication qui ne permet pas la réplication de fonctionner si l'Utilisateur a exécuté des mutations sur la version précédente. Cela corrige [\#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [\#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alésapine](https://github.com/alesapin)). Il rend la version 20.3 rétrocompatible à nouveau. +- Ajouter un paramètre `use_compact_format_in_distributed_parts_names` qui permet d'écrire des fichiers pour `INSERT` les requêtes en `Distributed` tableau avec un format plus compact. Cela corrige [\#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [\#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alésapine](https://github.com/alesapin)). Il rend la version 20.3 rétrocompatible à nouveau. + +### Clickhouse version v20. 3. 2. 1, 2020-03-12 {#clickhouse-release-v20-3-2-1-2020-03-12} + +#### Modification Incompatible En Arrière {#backward-incompatible-change} + +- Correction du problème `file name too long` lors de l'envoi de données pour `Distributed` tables pour un grand nombre de répliques. Correction du problème que les informations d'identification de réplique étaient exposées dans le journal du serveur. Le format du nom du répertoire sur le disque a été changé en `[shard{shard_index}[_replica{replica_index}]]`. [\#8911](https://github.com/ClickHouse/ClickHouse/pull/8911) ([Mikhail Korotov](https://github.com/millb)) Après la mise à niveau vers la nouvelle version, vous ne pourrez pas rétrograder sans intervention manuelle, car l'ancienne version du serveur ne reconnaît pas le nouveau format de répertoire. Si vous souhaitez passer, vous devez renommer manuellement les répertoires correspondant à l'ancien format. Cette modification s'applique uniquement si vous avez utilisé asynchrone `INSERT`s `Distributed` table. Dans la version 20.3.3, nous allons introduire un paramètre qui vous permettra d'activer le nouveau format progressivement. +- Modification du format des entrées du journal de réplication pour les commandes de mutation. Vous devez attendre que les anciennes mutations soient traitées avant d'installer la nouvelle version. +- Implémentez un profileur de mémoire simple qui vide stacktraces vers `system.trace_log` chaque n octets au-dessus de la limite d'allocation douce [\#8765](https://github.com/ClickHouse/ClickHouse/pull/8765) ([Ivan](https://github.com/abyss7)) [\#9472](https://github.com/ClickHouse/ClickHouse/pull/9472) ([alexeï-milovidov](https://github.com/alexey-milovidov)) La colonne de `system.trace_log` a été renommé de `timer_type` de `trace_type`. Cela nécessitera des changements dans les outils d'analyse des performances et de traitement flamegraph de tiers. +- Utilisez L'id de thread du système d'exploitation partout au lieu du numéro de thread interne. Cela corrige [\#7477](https://github.com/ClickHouse/ClickHouse/issues/7477) Vieux `clickhouse-client` impossible de recevoir les journaux envoyés par le serveur lorsque le paramètre `send_logs_level` est activé, car les noms et les types des messages de journal structurés ont été modifiés. D'autre part, différentes versions de serveur peuvent envoyer des journaux avec différents types les uns aux autres. Lorsque vous n'utilisez pas l' `send_logs_level` réglage, vous ne devez pas soin. [\#8954](https://github.com/ClickHouse/ClickHouse/pull/8954) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Supprimer `indexHint` fonction [\#9542](https://github.com/ClickHouse/ClickHouse/pull/9542) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Supprimer `findClusterIndex`, `findClusterValue` fonction. Cela corrige [\#8641](https://github.com/ClickHouse/ClickHouse/issues/8641). Si vous utilisez ces fonctions, envoyez un courriel à `clickhouse-feedback@yandex-team.com` [\#9543](https://github.com/ClickHouse/ClickHouse/pull/9543) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Maintenant, il n'est pas permis de créer des colonnes ou ajouter des colonnes avec `SELECT` sous-requête comme expression par défaut. [\#9481](https://github.com/ClickHouse/ClickHouse/pull/9481) ([alésapine](https://github.com/alesapin)) +- Exiger des alias pour les sous-requêtes dans la JOINTURE. [\#9274](https://github.com/ClickHouse/ClickHouse/pull/9274) ([Artem Zuikov](https://github.com/4ertus2)) +- Améliorer `ALTER MODIFY/ADD` les requêtes de la logique. Maintenant vous ne pouvez pas `ADD` colonne sans type, `MODIFY` l'expression par défaut ne change pas le type de colonne et `MODIFY` type ne perd pas la valeur d'expression par défaut. Fixer [\#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). [\#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) ([alésapine](https://github.com/alesapin)) +- Exiger que le serveur soit redémarré pour appliquer les modifications dans la configuration de journalisation. Il s'agit d'une solution de contournement temporaire pour éviter le bogue où le serveur se connecte à un fichier journal supprimé (voir [\#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [\#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Paramètre `experimental_use_processors` est activé par défaut. Ce paramètre active l'utilisation du nouveau pipeline de requêtes. C'est un refactoring interne et nous n'attendons aucun changement visible. Si vous voyez des problèmes, réglez-le sur Retour à zéro. [\#8768](https://github.com/ClickHouse/ClickHouse/pull/8768) ([alexeï-milovidov](https://github.com/alexey-milovidov)) + +#### Nouveauté {#new-feature} + +- Ajouter `Avro` et `AvroConfluent` d'entrée/sortie de formats [\#8571](https://github.com/ClickHouse/ClickHouse/pull/8571) ([Andrew Onyshchuk](https://github.com/oandrew)) [\#8957](https://github.com/ClickHouse/ClickHouse/pull/8957) ([Andrew Onyshchuk](https://github.com/oandrew)) [\#8717](https://github.com/ClickHouse/ClickHouse/pull/8717) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mises à jour multithread et non bloquantes des clés expirées dans `cache` dictionnaires (avec autorisation facultative pour lire les anciens). [\#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Ajouter une requête `ALTER ... MATERIALIZE TTL`. Il exécute mutation qui force à supprimer les données expirées par TTL et recalcule les méta-informations sur TTL dans toutes les parties. [\#8775](https://github.com/ClickHouse/ClickHouse/pull/8775) ([Anton Popov](https://github.com/CurtizJ)) +- Passez de HashJoin à MergeJoin (sur le disque) si nécessaire [\#9082](https://github.com/ClickHouse/ClickHouse/pull/9082) ([Artem Zuikov](https://github.com/4ertus2)) +- Ajouter `MOVE PARTITION` commande pour `ALTER TABLE` [\#4729](https://github.com/ClickHouse/ClickHouse/issues/4729) [\#6168](https://github.com/ClickHouse/ClickHouse/pull/6168) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Le rechargement de la configuration de stockage du fichier de configuration à la volée. [\#8594](https://github.com/ClickHouse/ClickHouse/pull/8594) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Autorisé à changer `storage_policy` pas moins riche. [\#8107](https://github.com/ClickHouse/ClickHouse/pull/8107) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Ajout du support pour globs / jokers pour le stockage S3 et la fonction de table. [\#8851](https://github.com/ClickHouse/ClickHouse/pull/8851) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Mettre `bitAnd`, `bitOr`, `bitXor`, `bitNot` pour `FixedString(N)` type de données. [\#9091](https://github.com/ClickHouse/ClickHouse/pull/9091) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Ajout de la fonction `bitCount`. Cela corrige [\#8702](https://github.com/ClickHouse/ClickHouse/issues/8702). [\#8708](https://github.com/ClickHouse/ClickHouse/pull/8708) ([alexeï-milovidov](https://github.com/alexey-milovidov)) [\#8749](https://github.com/ClickHouse/ClickHouse/pull/8749) ([ikopylov](https://github.com/ikopylov)) +- Ajouter `generateRandom` fonction de table pour générer des lignes aléatoires avec un schéma donné. Permet de remplir une table de test arbitraire avec des données. [\#8994](https://github.com/ClickHouse/ClickHouse/pull/8994) ([Ilya Yatsishin](https://github.com/qoega)) +- `JSONEachRowFormat`: support cas particulier lorsque les objets enfermés dans un tableau de niveau supérieur. [\#8860](https://github.com/ClickHouse/ClickHouse/pull/8860) ([Kruglov Pavel](https://github.com/Avogar)) +- Il est maintenant possible de créer une colonne avec `DEFAULT` expression qui dépend d'une colonne avec défaut `ALIAS` expression. [\#9489](https://github.com/ClickHouse/ClickHouse/pull/9489) ([alésapine](https://github.com/alesapin)) +- Autoriser à spécifier `--limit` plus que la taille des données source dans `clickhouse-obfuscator`. Les données se répéteront avec différentes graines aléatoires. [\#9155](https://github.com/ClickHouse/ClickHouse/pull/9155) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter `groupArraySample` fonction (similaire à `groupArray`) avec réservoir algorithme d'échantillonnage. [\#8286](https://github.com/ClickHouse/ClickHouse/pull/8286) ([Amos Oiseau](https://github.com/amosbird)) +- Maintenant, vous pouvez surveiller la taille de la file d'attente de mise à jour dans `cache`/`complex_key_cache` dictionnaires via les métriques du système. [\#9413](https://github.com/ClickHouse/ClickHouse/pull/9413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Autoriser L'utilisation de CRLF comme séparateur de ligne au format de sortie CSV avec réglage `output_format_csv_crlf_end_of_line` est réglé sur 1 [\#8934](https://github.com/ClickHouse/ClickHouse/pull/8934) [\#8935](https://github.com/ClickHouse/ClickHouse/pull/8935) [\#8963](https://github.com/ClickHouse/ClickHouse/pull/8963) ([Mikhail Korotov](https://github.com/millb)) +- Mettre en œuvre plus de fonctions de la [H3](https://github.com/uber/h3) API: `h3GetBaseCell`, `h3HexAreaM2`, `h3IndexesAreNeighbors`, `h3ToChildren`, `h3ToString` et `stringToH3` [\#8938](https://github.com/ClickHouse/ClickHouse/pull/8938) ([Nico Mandery](https://github.com/nmandery)) +- Nouveau paramètre introduit: `max_parser_depth` pour contrôler la taille maximale de la pile et permettre de grandes requêtes complexes. Cela corrige [\#6681](https://github.com/ClickHouse/ClickHouse/issues/6681) et [\#7668](https://github.com/ClickHouse/ClickHouse/issues/7668). [\#8647](https://github.com/ClickHouse/ClickHouse/pull/8647) ([Maxim Smirnov](https://github.com/qMBQx8GH)) +- Ajouter un paramètre `force_optimize_skip_unused_shards` réglage sur lancer si le saut d'éclats inutilisés n'est pas possible [\#8805](https://github.com/ClickHouse/ClickHouse/pull/8805) ([Azat Khuzhin](https://github.com/azat)) +- Permet de configurer plusieurs disques / volumes pour stocker des données pour l'envoi `Distributed` moteur [\#8756](https://github.com/ClickHouse/ClickHouse/pull/8756) ([Azat Khuzhin](https://github.com/azat)) +- Politique de stockage de soutien (`` pour le stockage temporaire des données. [\#8750](https://github.com/ClickHouse/ClickHouse/pull/8750) ([Azat Khuzhin](https://github.com/azat)) +- Ajouter `X-ClickHouse-Exception-Code` En-tête HTTP défini si une exception a été levée avant l'envoi de données. Cela met en œuvre [\#4971](https://github.com/ClickHouse/ClickHouse/issues/4971). [\#8786](https://github.com/ClickHouse/ClickHouse/pull/8786) ([Mikhail Korotov](https://github.com/millb)) +- Ajout de la fonction `ifNotFinite`. C'est juste un sucre syntaxique: `ifNotFinite(x, y) = isFinite(x) ? x : y`. [\#8710](https://github.com/ClickHouse/ClickHouse/pull/8710) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter `last_successful_update_time` colonne en `system.dictionaries` table [\#9394](https://github.com/ClickHouse/ClickHouse/pull/9394) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Ajouter `blockSerializedSize` fonction (taille sur disque sans compression) [\#8952](https://github.com/ClickHouse/ClickHouse/pull/8952) ([Azat Khuzhin](https://github.com/azat)) +- Ajouter une fonction `moduloOrZero` [\#9358](https://github.com/ClickHouse/ClickHouse/pull/9358) ([hcz](https://github.com/hczhcz)) +- Tables système ajoutées `system.zeros` et `system.zeros_mt` ainsi que les fonctions de conte `zeros()` et `zeros_mt()`. Les Tables (et les fonctions de table) contiennent une seule colonne avec le nom `zero` et le type `UInt8`. Cette colonne contient des zéros. Il est nécessaire à des fins de test comme la méthode la plus rapide pour générer de nombreuses lignes. Cela corrige [\#6604](https://github.com/ClickHouse/ClickHouse/issues/6604) [\#9593](https://github.com/ClickHouse/ClickHouse/pull/9593) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Caractéristique Expérimentale {#experimental-feature} + +- Ajouter un nouveau format compact de pièces dans `MergeTree`-table de famille dont toutes les colonnes sont stockées dans un fichier. Il aide à augmenter les performances des inserts petits et fréquents. L'ancien format (un fichier par colonne) s'appelle maintenant wide. Le format de stockage des données est contrôlé par les paramètres `min_bytes_for_wide_part` et `min_rows_for_wide_part`. [\#8290](https://github.com/ClickHouse/ClickHouse/pull/8290) ([Anton Popov](https://github.com/CurtizJ)) +- Prise en charge du stockage S3 pour `Log`, `TinyLog` et `StripeLog` table. [\#8862](https://github.com/ClickHouse/ClickHouse/pull/8862) ([Pavel Kovalenko](https://github.com/Jokser)) + +#### Bug Fix {#bug-fix-2} + +- Correction d'espaces incohérents dans les messages de journal. [\#9322](https://github.com/ClickHouse/ClickHouse/pull/9322) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction d'un bug dans lequel les tableaux de tuples sans nom ont été aplatis en tant que structures imbriquées lors de la création de la table. [\#8866](https://github.com/ClickHouse/ClickHouse/pull/8866) ([achulkov2](https://github.com/achulkov2)) +- Correction du problème lorsque “Too many open files” l'erreur peut se produire s'il y a trop de fichiers correspondant glob modèle dans `File` table ou `file` table de fonction. Maintenant, les fichiers sont ouverts paresseusement. Cela corrige [\#8857](https://github.com/ClickHouse/ClickHouse/issues/8857) [\#8861](https://github.com/ClickHouse/ClickHouse/pull/8861) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- DROP table temporaire ne supprime plus que la table temporaire. [\#8907](https://github.com/ClickHouse/ClickHouse/pull/8907) ([Vitaly Baranov](https://github.com/vitlibar)) +- Supprimer la partition obsolète lorsque nous éteignons le serveur ou détacher/joindre une table. [\#8602](https://github.com/ClickHouse/ClickHouse/pull/8602) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Pour savoir comment le disque par défaut calcule l'espace libre à partir de `data` répertoire. Correction du problème lorsque la quantité d'espace libre n'est pas calculée correctement si l' `data` le répertoire est monté sur un appareil séparé (cas rare). Cela corrige [\#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) [\#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) ([Mikhail Korotov](https://github.com/millb)) +- Permettre virgule (croix) joindre avec IN () à l'intérieur. [\#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) ([Artem Zuikov](https://github.com/4ertus2)) +- Permettre de réécrire CROSS to INNER JOIN s'il n'y a pas \[pas\] comme opérateur dans la section WHERE. [\#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) ([Artem Zuikov](https://github.com/4ertus2)) +- Correction d'un résultat incorrect possible après `GROUP BY` avec le paramètre activé `distributed_aggregation_memory_efficient`. Fixer [\#9134](https://github.com/ClickHouse/ClickHouse/issues/9134). [\#9289](https://github.com/ClickHouse/ClickHouse/pull/9289) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Les clés trouvées ont été comptées comme manquées dans les métriques des dictionnaires de cache. [\#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Correction du protocole de réplication incompatibilité introduit dans [\#8598](https://github.com/ClickHouse/ClickHouse/issues/8598). [\#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alésapine](https://github.com/alesapin)) +- Condition de course fixe sur `queue_task_handle` au démarrage de `ReplicatedMergeTree` table. [\#9552](https://github.com/ClickHouse/ClickHouse/pull/9552) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Jeton `NOT` ne fonctionne pas dans `SHOW TABLES NOT LIKE` requête [\#8727](https://github.com/ClickHouse/ClickHouse/issues/8727) [\#8940](https://github.com/ClickHouse/ClickHouse/pull/8940) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Vérification de plage ajoutée à la fonction `h3EdgeLengthM`. Sans cette vérification, un débordement de tampon est possible. [\#8945](https://github.com/ClickHouse/ClickHouse/pull/8945) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction d'un bug dans les calculs par lots des opérations logiques ternaires sur plusieurs arguments (plus de 10). [\#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alexander Kazakov](https://github.com/Akazz)) +- Correction d'une erreur D'optimisation de PREWHERE, qui pourrait conduire à des `Inconsistent number of columns got from MergeTreeRangeReader` exception. [\#9024](https://github.com/ClickHouse/ClickHouse/pull/9024) ([Anton Popov](https://github.com/CurtizJ)) +- Fix inattendu `Timeout exceeded while reading from socket` exception, qui se produit aléatoirement sur une connexion sécurisée avant le délai d'expiration réellement dépassé et lorsque query profiler est activé. Également ajouter `connect_timeout_with_failover_secure_ms` paramètres (par défaut 100 ms), qui est similaire à `connect_timeout_with_failover_ms`, mais est utilisé pour les connexions sécurisées (parce que la liaison SSL est plus lente, que la connexion TCP ordinaire) [\#9026](https://github.com/ClickHouse/ClickHouse/pull/9026) ([tavplubix](https://github.com/tavplubix)) +- Correction d'un bug avec la finalisation des mutations, lorsque la mutation peut se bloquer dans l'état avec `parts_to_do=0` et `is_done=0`. [\#9022](https://github.com/ClickHouse/ClickHouse/pull/9022) ([alésapine](https://github.com/alesapin)) +- Utilisez une nouvelle logique de jointure avec `partial_merge_join` paramètre. Il est possible de faire `ANY|ALL|SEMI LEFT` et `ALL INNER` les jointures avec `partial_merge_join=1` maintenant. [\#8932](https://github.com/ClickHouse/ClickHouse/pull/8932) ([Artem Zuikov](https://github.com/4ertus2)) +- Shard pince maintenant les paramètres obtenus de l'initiateur aux constaints de la partition au lieu de lancer une exception. Ce correctif permet d'envoyer des requêtes à un serveur avec un autre contraintes. [\#9447](https://github.com/ClickHouse/ClickHouse/pull/9447) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixe, problème de gestion de mémoire dans `MergeTreeReadPool`. [\#8791](https://github.com/ClickHouse/ClickHouse/pull/8791) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixer `toDecimal*OrNull()` famille de fonctions lorsqu'elle est appelée avec une chaîne `e`. Fixer [\#8312](https://github.com/ClickHouse/ClickHouse/issues/8312) [\#8764](https://github.com/ClickHouse/ClickHouse/pull/8764) ([Artem Zuikov](https://github.com/4ertus2)) +- Assurez-vous que `FORMAT Null` n'envoie pas de données au client. [\#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Correction d'un bug dans cet horodatage `LiveViewBlockInputStream` ne sera pas mis à jour. `LIVE VIEW` est une fonctionnalité expérimentale. [\#8644](https://github.com/ClickHouse/ClickHouse/pull/8644) ([vxider](https://github.com/Vxider)) [\#8625](https://github.com/ClickHouse/ClickHouse/pull/8625) ([vxider](https://github.com/Vxider)) +- Fixe `ALTER MODIFY TTL` mauvais comportement qui n'a pas permis de supprimer les anciennes expressions TTL. [\#8422](https://github.com/ClickHouse/ClickHouse/pull/8422) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Rapport UBSan fixe dans MergeTreeIndexSet. Cela corrige [\#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) [\#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction du comportement de `match` et `extract` fonctions lorsque haystack a zéro octets. Le comportement était mauvais quand la botte de foin était constante. Cela corrige [\#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [\#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexeï-milovidov](https://github.com/alexey-milovidov)) [\#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Évitez de lancer de destructor dans la bibliothèque Apache Avro 3rd-party. [\#9066](https://github.com/ClickHouse/ClickHouse/pull/9066) ([Andrew Onyshchuk](https://github.com/oandrew)) +- Ne commettez pas un lot interrogé à partir de `Kafka` partiellement, car il peut conduire à des trous dans les données. [\#8876](https://github.com/ClickHouse/ClickHouse/pull/8876) ([filimonov](https://github.com/filimonov)) +- Fixer `joinGet` avec les types de retour nullable. https://github.com/ClickHouse/ClickHouse/issues/8919 [\#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) ([Amos Oiseau](https://github.com/amosbird)) +- Correction de l'incompatibilité des données lorsqu'elles sont compressées avec `T64` codec. [\#9016](https://github.com/ClickHouse/ClickHouse/pull/9016) ([Artem Zuikov](https://github.com/4ertus2)) Corriger les ID de type de données dans `T64` codec de compression qui conduit à une mauvaise (de)compression dans les versions affectées. [\#9033](https://github.com/ClickHouse/ClickHouse/pull/9033) ([Artem Zuikov](https://github.com/4ertus2)) +- Ajouter un paramètre `enable_early_constant_folding` et le désactiver dans certains cas, cela conduit à des erreurs. [\#9010](https://github.com/ClickHouse/ClickHouse/pull/9010) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix Pushdown prédicat optimizer avec vue et activer le test [\#9011](https://github.com/ClickHouse/ClickHouse/pull/9011) ([L'Hiver Zhang](https://github.com/zhang2014)) +- Fixer erreur de segmentation dans `Merge` tables, cela peut arriver lors de la lecture de `File` stockage [\#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) ([tavplubix](https://github.com/tavplubix)) +- Ajout d'une vérification de la stratégie de stockage dans `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE`. Sinon, cela pourrait rendre les données de la partie inaccessibles après le redémarrage et empêcher ClickHouse de démarrer. [\#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix modifie s'il y a TTL défini pour la table. [\#8800](https://github.com/ClickHouse/ClickHouse/pull/8800) ([Anton Popov](https://github.com/CurtizJ)) +- Correction de la condition de course qui peut se produire lorsque `SYSTEM RELOAD ALL DICTIONARIES` est exécuté pendant que certains dictionnaires sont modifiés / ajoutés / supprimés. [\#8801](https://github.com/ClickHouse/ClickHouse/pull/8801) ([Vitaly Baranov](https://github.com/vitlibar)) +- Dans les versions précédentes `Memory` le moteur de base de données utilise un chemin de données vide, de sorte que les tables sont créées dans `path` directory (e.g. `/var/lib/clickhouse/`), not in data directory of database (e.g. `/var/lib/clickhouse/db_name`). [\#8753](https://github.com/ClickHouse/ClickHouse/pull/8753) ([tavplubix](https://github.com/tavplubix)) +- Correction de messages de journal erronés sur le disque ou la stratégie par défaut manquant. [\#9530](https://github.com/ClickHouse/ClickHouse/pull/9530) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix not (has ()) pour l'index bloom\_filter des types de tableau. [\#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) +- Permettre à première colonne(s) dans un tableau avec `Log` moteur alias [\#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) ([Ivan](https://github.com/abyss7)) +- Fixer l'ordre des plages pendant la lecture d' `MergeTree` table dans un fil. Cela pourrait conduire à des exceptions `MergeTreeRangeReader` ou mauvais résultats de requête. [\#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) ([Anton Popov](https://github.com/CurtizJ)) +- Faire `reinterpretAsFixedString` retourner `FixedString` plutôt `String`. [\#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) ([Andrew Onyshchuk](https://github.com/oandrew)) +- Évitez les cas extrêmement rares où l'utilisateur peut se tromper message d'erreur (`Success` au lieu d'une description détaillée de l'erreur). [\#9457](https://github.com/ClickHouse/ClickHouse/pull/9457) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ne pas planter lors de l'utilisation de `Template` format avec modèle de ligne vide. [\#8785](https://github.com/ClickHouse/ClickHouse/pull/8785) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Les fichiers de métadonnées pour les tables système peuvent être créés au mauvais endroit [\#8653](https://github.com/ClickHouse/ClickHouse/pull/8653) ([tavplubix](https://github.com/tavplubix)) Fixer [\#8581](https://github.com/ClickHouse/ClickHouse/issues/8581). +- Correction de la course de données sur exception\_ptr dans le dictionnaire de cache [\#8303](https://github.com/ClickHouse/ClickHouse/issues/8303). [\#9379](https://github.com/ClickHouse/ClickHouse/pull/9379) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Ne pas lancer une exception pour la requête `ATTACH TABLE IF NOT EXISTS`. Auparavant, il a été lancé si la table existe déjà, malgré le `IF NOT EXISTS` clause. [\#8967](https://github.com/ClickHouse/ClickHouse/pull/8967) ([Anton Popov](https://github.com/CurtizJ)) +- Correction manquant fermeture paren dans le message d'exception. [\#8811](https://github.com/ClickHouse/ClickHouse/pull/8811) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Éviter de message `Possible deadlock avoided` au démarrage de clickhouse-client en mode interactif. [\#9455](https://github.com/ClickHouse/ClickHouse/pull/9455) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction du problème lorsque le remplissage à la fin de la valeur codée base64 peut être mal formé. Mettre à jour la bibliothèque base64. Cela corrige [\#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), proche [\#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [\#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Empêcher la perte de données dans `Kafka` dans de rares cas, lorsque l'exception se produit après la lecture du suffixe mais avant la validation. Fixer [\#9378](https://github.com/ClickHouse/ClickHouse/issues/9378) [\#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) ([filimonov](https://github.com/filimonov)) +- Correction d'une exception dans `DROP TABLE IF EXISTS` [\#8663](https://github.com/ClickHouse/ClickHouse/pull/8663) ([Nikita Vasilev](https://github.com/nikvas0)) +- Correction de plantage lorsqu'un utilisateur essaie d' `ALTER MODIFY SETTING` pour Ancien formaté `MergeTree` famille de moteurs de table. [\#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alésapine](https://github.com/alesapin)) +- Prise en charge des numéros UInt64 qui ne correspondent pas à Int64 dans les fonctions liées à JSON. Mettre à jour SIMDJSON à maîtriser. Cela corrige [\#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) [\#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Exécution fixe de prédicats inversés lorsque l'index fonctionnel non strictement monotinique est utilisé. [\#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) ([Alexander Kazakov](https://github.com/Akazz)) +- N'essayez pas de plier `IN` constante dans `GROUP BY` [\#8868](https://github.com/ClickHouse/ClickHouse/pull/8868) ([Amos Oiseau](https://github.com/amosbird)) +- Correction d'un bug dans `ALTER DELETE` mutations qui conduit à la corruption d'index. Cela corrige [\#9019](https://github.com/ClickHouse/ClickHouse/issues/9019) et [\#8982](https://github.com/ClickHouse/ClickHouse/issues/8982). En outre fixer des conditions de course extrêmement rares dans `ReplicatedMergeTree` `ALTER` requête. [\#9048](https://github.com/ClickHouse/ClickHouse/pull/9048) ([alésapine](https://github.com/alesapin)) +- Lorsque le réglage `compile_expressions` est activée, vous pouvez obtenir `unexpected column` dans `LLVMExecutableFunction` lorsque nous utilisons `Nullable` type [\#8910](https://github.com/ClickHouse/ClickHouse/pull/8910) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Plusieurs correctifs pour `Kafka` moteur: 1) Correction des doublons qui apparaissaient pendant le rééquilibrage du groupe de consommateurs. 2) Correction rare ‘holes’ apparu lorsque les données ont été interrogées à partir de plusieurs partitions avec un sondage et validées partiellement (maintenant, nous traitons / validons toujours l'ensemble du bloc de messages interrogé). 3) corriger les vidages par taille de bloc (avant que seul le rinçage par Délai d'attente fonctionnait correctement). 4) meilleure procédure d'abonnement (avec rétroaction d'affectation). 5) Faites fonctionner les tests plus rapidement (avec des intervalles et des délais d'attente par défaut). En raison du fait que les données n'étaient pas vidées par la taille du bloc auparavant (comme il se doit selon la documentation), Ce PR peut entraîner une dégradation des performances avec les paramètres par défaut (en raison de vidages plus fréquents et plus petits qui sont moins optimaux). Si vous rencontrez le problème de performance après ce changement - veuillez augmenter `kafka_max_block_size` dans le tableau de la plus grande valeur ( par exemple `CREATE TABLE ...Engine=Kafka ... SETTINGS ... kafka_max_block_size=524288`). Fixer [\#7259](https://github.com/ClickHouse/ClickHouse/issues/7259) [\#8917](https://github.com/ClickHouse/ClickHouse/pull/8917) ([filimonov](https://github.com/filimonov)) +- Fixer `Parameter out of bound` exception dans certaines requêtes après les optimisations PREWHERE. [\#8914](https://github.com/ClickHouse/ClickHouse/pull/8914) ([Baudouin Giard](https://github.com/bgiard)) +- Correction du cas de la consistance mixte des arguments de la fonction `arrayZip`. [\#8705](https://github.com/ClickHouse/ClickHouse/pull/8705) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Lors de l'exécution de `CREATE` requête, plier les expressions constantes dans les arguments du moteur de stockage. Remplacez le nom de base de données vide par la base de données actuelle. Fixer [\#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [\#3492](https://github.com/ClickHouse/ClickHouse/issues/3492) [\#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) ([tavplubix](https://github.com/tavplubix)) +- Maintenant il n'est pas possible de créer ou d'ajouter des colonnes avec des alias cycliques simples comme `a DEFAULT b, b DEFAULT a`. [\#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alésapine](https://github.com/alesapin)) +- Correction d'un bug avec double mouvement qui peut corrompre la partie originale. Ceci est pertinent si vous utilisez `ALTER TABLE MOVE` [\#8680](https://github.com/ClickHouse/ClickHouse/pull/8680) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Permettre `interval` identifiant pour analyser correctement sans backticks. Correction d'un problème lorsqu'une requête ne peut pas être exécutée même si le `interval` l'identifiant est entouré de backticks ou de guillemets doubles. Cela corrige [\#9124](https://github.com/ClickHouse/ClickHouse/issues/9124). [\#9142](https://github.com/ClickHouse/ClickHouse/pull/9142) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Test de fuzz fixe et comportement incorrect de `bitTestAll`/`bitTestAny` fonction. [\#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction plantage possible/mauvais nombre de lignes dans `LIMIT n WITH TIES` quand il y a beaucoup de lignes égales à n'ème ligne. [\#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) +- Correction de mutations avec des parties écrites avec activé `insert_quorum`. [\#9463](https://github.com/ClickHouse/ClickHouse/pull/9463) ([alésapine](https://github.com/alesapin)) +- Correction de la course de données à la destruction de `Poco::HTTPServer`. Cela peut se produire lorsque le serveur est démarré et immédiatement arrêté. [\#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) +- Correction d'un bug dans lequel un message d'erreur trompeur a été affiché lors de l'exécution `SHOW CREATE TABLE a_table_that_does_not_exist`. [\#8899](https://github.com/ClickHouse/ClickHouse/pull/8899) ([achulkov2](https://github.com/achulkov2)) +- Fixe `Parameters are out of bound` exception dans de rares cas où nous avons une constante dans le `SELECT` clause quand nous avons un `ORDER BY` et un `LIMIT` clause. [\#8892](https://github.com/ClickHouse/ClickHouse/pull/8892) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Fix finalisation des mutations, quand déjà fait mutation peut avoir le statut `is_done=0`. [\#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) ([alésapine](https://github.com/alesapin)) +- Empêcher l'exécution de `ALTER ADD INDEX` pour les tables MergeTree avec une ancienne syntaxe, car cela ne fonctionne pas. [\#8822](https://github.com/ClickHouse/ClickHouse/pull/8822) ([Mikhail Korotov](https://github.com/millb)) +- Pendant le démarrage du serveur, n'ACCÉDEZ PAS à la table, qui `LIVE VIEW` dépend de, donc le serveur sera en mesure de démarrer. Également supprimer `LIVE VIEW` dépendances lors du détachement `LIVE VIEW`. `LIVE VIEW` est une fonctionnalité expérimentale. [\#8824](https://github.com/ClickHouse/ClickHouse/pull/8824) ([tavplubix](https://github.com/tavplubix)) +- Correction possible segfault dans `MergeTreeRangeReader`, lors de l'exécution `PREWHERE`. [\#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) ([Anton Popov](https://github.com/CurtizJ)) +- Correction d'éventuelles sommes de contrôle non appariées avec la colonne TTL. [\#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) +- Correction d'un bug lorsque les pièces n'étaient pas déplacées en arrière-plan par les règles TTL dans le cas où il n'y avait qu'un seul volume. [\#8672](https://github.com/ClickHouse/ClickHouse/pull/8672) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Correction du problème `Method createColumn() is not implemented for data type Set`. Cela corrige [\#7799](https://github.com/ClickHouse/ClickHouse/issues/7799). [\#8674](https://github.com/ClickHouse/ClickHouse/pull/8674) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Maintenant, nous allons essayer de finaliser les mutations plus fréquemment. [\#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alésapine](https://github.com/alesapin)) +- Fixer `intDiv` par moins une constante [\#9351](https://github.com/ClickHouse/ClickHouse/pull/9351) ([hcz](https://github.com/hczhcz)) +- Correction d'une condition de course possible dans `BlockIO`. [\#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correction d'un bug menant à la résiliation du serveur lorsque vous essayez d'utiliser / drop `Kafka` tableau créé avec de mauvais paramètres. [\#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) ([filimonov](https://github.com/filimonov)) +- Ajout d'une solution de contournement si le système d'exploitation renvoie un résultat erroné pour `timer_create` fonction. [\#8837](https://github.com/ClickHouse/ClickHouse/pull/8837) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction d'une erreur dans l'utilisation de `min_marks_for_seek` paramètre. Correction du message d'erreur lorsqu'il n'y a pas de clé de sharding dans la table distribuée et que nous essayons d'ignorer les fragments inutilisés. [\#8908](https://github.com/ClickHouse/ClickHouse/pull/8908) ([Azat Khuzhin](https://github.com/azat)) + +#### Amélioration {#improvement} + +- Mettre `ALTER MODIFY/DROP` requêtes au-dessus des mutations pour `ReplicatedMergeTree*` les moteurs de la famille. Maintenant `ALTERS` bloque uniquement à l'étape de mise à jour des métadonnées, et ne bloque pas après cela. [\#8701](https://github.com/ClickHouse/ClickHouse/pull/8701) ([alésapine](https://github.com/alesapin)) +- Ajouter la possibilité de réécrire CROSS aux jointures internes avec `WHERE` section contenant des noms Non qialifiés. [\#9512](https://github.com/ClickHouse/ClickHouse/pull/9512) ([Artem Zuikov](https://github.com/4ertus2)) +- Faire `SHOW TABLES` et `SHOW DATABASES` les requêtes prennent en charge le `WHERE` les expressions et les `FROM`/`IN` [\#9076](https://github.com/ClickHouse/ClickHouse/pull/9076) ([sundyli](https://github.com/sundy-li)) +- Ajout d'un paramètre `deduplicate_blocks_in_dependent_materialized_views`. [\#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) ([urykhy](https://github.com/urykhy)) +- Après des changements récents Le client MySQL a commencé à imprimer des chaînes binaires en hexadécimal les rendant ainsi non lisibles ([\#9032](https://github.com/ClickHouse/ClickHouse/issues/9032)). La solution de contournement dans ClickHouse est de marquer les colonnes de chaîne comme UTF-8, ce qui n'est pas toujours le cas, mais généralement le cas. [\#9079](https://github.com/ClickHouse/ClickHouse/pull/9079) ([Yuriy Baranov](https://github.com/yurriy)) +- Ajout du support des clés String et FixedString pour `sumMap` [\#8903](https://github.com/ClickHouse/ClickHouse/pull/8903) ([Baudouin Giard](https://github.com/bgiard)) +- Clés de chaîne de soutien dans les cartes SummingMergeTree [\#8933](https://github.com/ClickHouse/ClickHouse/pull/8933) ([Baudouin Giard](https://github.com/bgiard)) +- Signal terminaison du thread au pool de threads même si le thread a lancé une exception [\#8736](https://github.com/ClickHouse/ClickHouse/pull/8736) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +- Permettent de mettre en `query_id` dans `clickhouse-benchmark` [\#9416](https://github.com/ClickHouse/ClickHouse/pull/9416) ([Anton Popov](https://github.com/CurtizJ)) +- N'autorisez pas les expressions étranges `ALTER TABLE ... PARTITION partition` requête. Cela répond à l' [\#7192](https://github.com/ClickHouse/ClickHouse/issues/7192) [\#8835](https://github.com/ClickHouse/ClickHouse/pull/8835) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Table `system.table_engines` fournit maintenant des informations sur le support des fonctionnalités (comme `supports_ttl` ou `supports_sort_order`). [\#8830](https://github.com/ClickHouse/ClickHouse/pull/8830) ([Max Akhmedov](https://github.com/zlobober)) +- Permettre `system.metric_log` par défaut. Il contiendra des lignes avec des valeurs de ProfileEvents, CurrentMetrics collectées avec “collect\_interval\_milliseconds” intervalle (une seconde par défaut). La table est très petite (généralement par ordre de mégaoctets) et la collecte de ces données par défaut est raisonnable. [\#9225](https://github.com/ClickHouse/ClickHouse/pull/9225) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries. Fixes [\#6964](https://github.com/ClickHouse/ClickHouse/issues/6964) [\#8874](https://github.com/ClickHouse/ClickHouse/pull/8874) ([Ivan](https://github.com/abyss7)) +- Maintenant temporaire `LIVE VIEW` est créé par `CREATE LIVE VIEW name WITH TIMEOUT [42] ...` plutôt `CREATE TEMPORARY LIVE VIEW ...` parce que la syntaxe précédente n'était pas conforme à `CREATE TEMPORARY TABLE ...` [\#9131](https://github.com/ClickHouse/ClickHouse/pull/9131) ([tavplubix](https://github.com/tavplubix)) +- Ajouter text\_log.paramètre de configuration de niveau pour limiter les entrées `system.text_log` table [\#8809](https://github.com/ClickHouse/ClickHouse/pull/8809) ([Azat Khuzhin](https://github.com/azat)) +- Permettre de mettre la partie téléchargée sur un disque / volume selon les règles TTL [\#8598](https://github.com/ClickHouse/ClickHouse/pull/8598) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Pour les dictionnaires MySQL externes, autorisez à mutualiser le pool de connexions MySQL pour “share” parmi les dictionnaires. Cette option réduit considérablement le nombre de connexions aux serveurs MySQL. [\#9409](https://github.com/ClickHouse/ClickHouse/pull/9409) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Afficher le temps d'exécution de la requête le plus proche pour les quantiles dans `clickhouse-benchmark` sortie au lieu de valeurs interpolées. Il est préférable d'afficher les valeurs qui correspondent à l'exécution de certaines requêtes. [\#8712](https://github.com/ClickHouse/ClickHouse/pull/8712) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Possibilité d'ajouter une clé et un horodatage pour le message lors de l'insertion de données dans Kafka. Fixer [\#7198](https://github.com/ClickHouse/ClickHouse/issues/7198) [\#8969](https://github.com/ClickHouse/ClickHouse/pull/8969) ([filimonov](https://github.com/filimonov)) +- Si le serveur est exécuté à partir du terminal, mettez en surbrillance le numéro de thread, l'id de requête et la priorité du journal par couleurs. Ceci permet d'améliorer la lisibilité des messages de journal corrélés pour les développeurs. [\#8961](https://github.com/ClickHouse/ClickHouse/pull/8961) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Meilleur message d'exception lors du chargement des tables pour `Ordinary` la base de données. [\#9527](https://github.com/ClickHouse/ClickHouse/pull/9527) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mettre `arraySlice` pour les tableaux avec des états de fonction d'agrégat. Cela corrige [\#9388](https://github.com/ClickHouse/ClickHouse/issues/9388) [\#9391](https://github.com/ClickHouse/ClickHouse/pull/9391) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Autoriser les fonctions constantes et les tableaux constants à utiliser sur le côté droit de L'opérateur IN. [\#8813](https://github.com/ClickHouse/ClickHouse/pull/8813) ([Anton Popov](https://github.com/CurtizJ)) +- Si l'exception zookeeper s'est produite lors de la récupération des données du système.les répliques, l'afficher dans une colonne séparée. Cela met en œuvre [\#9137](https://github.com/ClickHouse/ClickHouse/issues/9137) [\#9138](https://github.com/ClickHouse/ClickHouse/pull/9138) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Supprimer atomiquement les parties de données MergeTree sur destroy. [\#8402](https://github.com/ClickHouse/ClickHouse/pull/8402) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Prise en charge de la sécurité au niveau des lignes pour les tables distribuées. [\#8926](https://github.com/ClickHouse/ClickHouse/pull/8926) ([Ivan](https://github.com/abyss7)) +- Now we recognize suffix (like KB, KiB…) in settings values. [\#8072](https://github.com/ClickHouse/ClickHouse/pull/8072) ([Mikhail Korotov](https://github.com/millb)) +- Empêchez la mémoire lors de la construction du résultat d'une jointure importante. [\#8637](https://github.com/ClickHouse/ClickHouse/pull/8637) ([Artem Zuikov](https://github.com/4ertus2)) +- Ajout de noms de clusters aux suggestions en mode interactif dans `clickhouse-client`. [\#8709](https://github.com/ClickHouse/ClickHouse/pull/8709) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries [\#8820](https://github.com/ClickHouse/ClickHouse/pull/8820) ([Ivan](https://github.com/abyss7)) +- Ajout de la colonne `exception_code` dans `system.query_log` table. [\#8770](https://github.com/ClickHouse/ClickHouse/pull/8770) ([Mikhail Korotov](https://github.com/millb)) +- Serveur de compatibilité MySQL activé sur le port `9004` par défaut dans le fichier de configuration du serveur. Fixe génération de mot de passe commande dans l'exemple de configuration. [\#8771](https://github.com/ClickHouse/ClickHouse/pull/8771) ([Yuriy Baranov](https://github.com/yurriy)) +- Empêcher l'abandon à l'arrêt si le système de fichiers est en lecture seule. Cela corrige [\#9094](https://github.com/ClickHouse/ClickHouse/issues/9094) [\#9100](https://github.com/ClickHouse/ClickHouse/pull/9100) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Meilleur message d'exception lorsque la longueur est requise dans la requête HTTP POST. [\#9453](https://github.com/ClickHouse/ClickHouse/pull/9453) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter `_path` et `_file` les colonnes virtuelles à `HDFS` et `File` les moteurs et les `hdfs` et `file` les fonctions de table [\#8489](https://github.com/ClickHouse/ClickHouse/pull/8489) ([Olga Khvostikova](https://github.com/stavrolia)) +- Correction d'erreur `Cannot find column` lors de l'insertion dans `MATERIALIZED VIEW` dans le cas où une nouvelle colonne a été ajoutée à la table interne de la vue. [\#8766](https://github.com/ClickHouse/ClickHouse/pull/8766) [\#8788](https://github.com/ClickHouse/ClickHouse/pull/8788) ([vzakaznikov](https://github.com/vzakaznikov)) [\#8788](https://github.com/ClickHouse/ClickHouse/issues/8788) [\#8806](https://github.com/ClickHouse/ClickHouse/pull/8806) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [\#8803](https://github.com/ClickHouse/ClickHouse/pull/8803) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correction de la progression sur le protocole client-serveur natif, en envoyant la progression après la mise à jour finale (comme les journaux). Cela peut être pertinent uniquement pour certains outils tiers qui utilisent le protocole natif. [\#9495](https://github.com/ClickHouse/ClickHouse/pull/9495) ([Azat Khuzhin](https://github.com/azat)) +- Ajouter une métrique système de suivi du nombre de connexions client à L'aide du protocole MySQL ([\#9013](https://github.com/ClickHouse/ClickHouse/issues/9013)). [\#9015](https://github.com/ClickHouse/ClickHouse/pull/9015) ([Eugene Klimov](https://github.com/Slach)) +- A partir de Maintenant, les réponses HTTP auront `X-ClickHouse-Timezone` en-tête défini sur la même valeur de fuseau horaire que `SELECT timezone()` serait-rapport. [\#9493](https://github.com/ClickHouse/ClickHouse/pull/9493) ([Denis Glazachev](https://github.com/traceon)) + +#### Amélioration Des Performances {#performance-improvement} + +- Améliorer les performances de l'analyse de l'indice DANS [\#9261](https://github.com/ClickHouse/ClickHouse/pull/9261) ([Anton Popov](https://github.com/CurtizJ)) +- Code plus simple et plus efficace dans les fonctions logiques + nettoyage de code. Un suivi à [\#8718](https://github.com/ClickHouse/ClickHouse/issues/8718) [\#8728](https://github.com/ClickHouse/ClickHouse/pull/8728) ([Alexander Kazakov](https://github.com/Akazz)) +- Amélioration globale de la performance (de l'ordre de 5%..200% pour les requêtes affectées) en assurant un aliasing encore plus strict avec les fonctionnalités c++20. [\#9304](https://github.com/ClickHouse/ClickHouse/pull/9304) ([Amos Oiseau](https://github.com/amosbird)) +- Aliasing plus strict pour les boucles internes des fonctions de comparaison. [\#9327](https://github.com/ClickHouse/ClickHouse/pull/9327) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Aliasing plus strict pour les boucles internes des fonctions arithmétiques. [\#9325](https://github.com/ClickHouse/ClickHouse/pull/9325) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Une implémentation ~3 fois plus rapide pour ColumnVector::replicate (), via laquelle ColumnConst:: convertToFullColumn () est implémentée. Sera également utile dans les tests lors de la matérialisation des constantes. [\#9293](https://github.com/ClickHouse/ClickHouse/pull/9293) ([Alexander Kazakov](https://github.com/Akazz)) +- Une autre amélioration mineure des performances à `ColumnVector::replicate()` (cela accélère le `materialize` fonction et des fonctions d'ordre supérieur) une amélioration encore plus [\#9293](https://github.com/ClickHouse/ClickHouse/issues/9293) [\#9442](https://github.com/ClickHouse/ClickHouse/pull/9442) ([Alexander Kazakov](https://github.com/Akazz)) +- Amélioration des performances de `stochasticLinearRegression` fonction d'agrégation. Ce patch est fourni par Intel. [\#8652](https://github.com/ClickHouse/ClickHouse/pull/8652) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Améliorer les performances de `reinterpretAsFixedString` fonction. [\#9342](https://github.com/ClickHouse/ClickHouse/pull/9342) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- N'envoyez pas de blocs au client pour `Null` format dans le pipeline de processeurs. [\#8797](https://github.com/ClickHouse/ClickHouse/pull/8797) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [\#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +#### Construction / Test / Amélioration De L'Emballage {#buildtestingpackaging-improvement} + +- La gestion des exceptions fonctionne maintenant correctement sur le sous-système Windows Pour Linux. Tu vois https://github.com/ClickHouse-Extras/libunwind/pull/3 cela corrige [\#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [\#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) +- Remplacer `readline` avec `replxx` interactif, l'édition en ligne en `clickhouse-client` [\#8416](https://github.com/ClickHouse/ClickHouse/pull/8416) ([Ivan](https://github.com/abyss7)) +- Meilleur temps de construction et moins d'instanciations de modèle dans FunctionsComparison. [\#9324](https://github.com/ClickHouse/ClickHouse/pull/9324) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Intégration ajoutée avec `clang-tidy` in CI. Voir aussi [\#6044](https://github.com/ClickHouse/ClickHouse/issues/6044) [\#9566](https://github.com/ClickHouse/ClickHouse/pull/9566) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Maintenant, nous lions ClickHouse dans CI en utilisant `lld` même pour `gcc`. [\#9049](https://github.com/ClickHouse/ClickHouse/pull/9049) ([alésapine](https://github.com/alesapin)) +- Permet de randomiser la planification des threads et d'insérer des problèmes lorsque `THREAD_FUZZER_*` variables d'environnement sont définies. Cela aide les tests. [\#9459](https://github.com/ClickHouse/ClickHouse/pull/9459) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Activer les sockets sécurisés dans les tests sans état [\#9288](https://github.com/ClickHouse/ClickHouse/pull/9288) ([tavplubix](https://github.com/tavplubix)) +- Rendre SPLIT\_SHARED\_LIBRARIES = OFF plus robuste [\#9156](https://github.com/ClickHouse/ClickHouse/pull/9156) ([Azat Khuzhin](https://github.com/azat)) +- Faire “performance\_introspection\_and\_logging” test fiable au serveur aléatoire bloqué. Cela peut se produire dans L'environnement CI. Voir aussi [\#9515](https://github.com/ClickHouse/ClickHouse/issues/9515) [\#9528](https://github.com/ClickHouse/ClickHouse/pull/9528) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Valider XML dans la vérification de style. [\#9550](https://github.com/ClickHouse/ClickHouse/pull/9550) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Condition de course fixe dans l'essai `00738_lock_for_inner_table`. Ce test reposait sur le sommeil. [\#9555](https://github.com/ClickHouse/ClickHouse/pull/9555) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Supprimer les tests de performance de type `once`. Ceci est nécessaire pour exécuter tous les tests de performance en mode de comparaison statistique (plus fiable). [\#9557](https://github.com/ClickHouse/ClickHouse/pull/9557) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajout d'un test de performance pour les fonctions arithmétiques. [\#9326](https://github.com/ClickHouse/ClickHouse/pull/9326) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouté test de performance pour `sumMap` et `sumMapWithOverflow` les fonctions d'agrégation. Pour le suivi de la [\#8933](https://github.com/ClickHouse/ClickHouse/issues/8933) [\#8947](https://github.com/ClickHouse/ClickHouse/pull/8947) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Assurez le style des codes D'erreur en vérifiant le style. [\#9370](https://github.com/ClickHouse/ClickHouse/pull/9370) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter un script pour l'historique des tests. [\#8796](https://github.com/ClickHouse/ClickHouse/pull/8796) ([alésapine](https://github.com/alesapin)) +- Ajouter un avertissement GCC `-Wsuggest-override` pour localiser et réparer tous les endroits où `override` mot-clé doit être utilisé. [\#8760](https://github.com/ClickHouse/ClickHouse/pull/8760) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +- Ignorer le symbole faible sous Mac OS X car il doit être défini [\#9538](https://github.com/ClickHouse/ClickHouse/pull/9538) ([Utilisateur supprimé](https://github.com/ghost)) +- Normaliser le temps d'exécution de certaines requêtes dans les tests de performance. Ceci est fait en préparation pour exécuter tous les tests de performance en mode comparaison. [\#9565](https://github.com/ClickHouse/ClickHouse/pull/9565) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction de certains tests pour prendre en charge pytest avec des tests de requête [\#9062](https://github.com/ClickHouse/ClickHouse/pull/9062) ([Ivan](https://github.com/abyss7)) +- Activez SSL dans build avec MSan, afin que le serveur n'échoue pas au démarrage lors de l'exécution de tests sans état [\#9531](https://github.com/ClickHouse/ClickHouse/pull/9531) ([tavplubix](https://github.com/tavplubix)) +- Correction de la substitution de base de données dans les résultats des tests [\#9384](https://github.com/ClickHouse/ClickHouse/pull/9384) ([Ilya Yatsishin](https://github.com/qoega)) +- Construire des correctifs pour diverses plates-formes [\#9381](https://github.com/ClickHouse/ClickHouse/pull/9381) ([proller](https://github.com/proller)) [\#8755](https://github.com/ClickHouse/ClickHouse/pull/8755) ([proller](https://github.com/proller)) [\#8631](https://github.com/ClickHouse/ClickHouse/pull/8631) ([proller](https://github.com/proller)) +- Ajout de la section disques à l'image Docker test stateless-with-coverage [\#9213](https://github.com/ClickHouse/ClickHouse/pull/9213) ([Pavel Kovalenko](https://github.com/Jokser)) +- Débarrassez-vous des fichiers in-source-tree lors de la construction avec GRPC [\#9588](https://github.com/ClickHouse/ClickHouse/pull/9588) ([Amos Oiseau](https://github.com/amosbird)) +- Temps de construction légèrement plus rapide en supprimant SessionCleaner du contexte. Rendre le code de SessionCleaner plus simple. [\#9232](https://github.com/ClickHouse/ClickHouse/pull/9232) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mise à jour de la vérification des requêtes suspendues dans le script clickhouse-test [\#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alexander Kazakov](https://github.com/Akazz)) +- Suppression de certains fichiers inutiles du référentiel. [\#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Changement de type de math perftests de `once` de `loop`. [\#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ajouter une image docker qui permet de créer un rapport HTML interactif du navigateur de code pour notre base de code. [\#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alésapine](https://github.com/alesapin)) Voir [Navigateur De Code Woboq](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html) +- Supprimer certains échecs de test sous MSan. [\#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- SpeedUp “exception while insert” test. Ce test expire souvent dans la construction debug-with-coverage. [\#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mettre `libcxx` et `libcxxabi` maîtriser. En préparation à [\#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [\#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction du test flacky `00910_zookeeper_test_alter_compression_codecs`. [\#9525](https://github.com/ClickHouse/ClickHouse/pull/9525) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Nettoyer les drapeaux de l'éditeur de liens dupliqués. Assurez-vous que l'éditeur de liens ne pas rechercher un symbole inattendu. [\#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos Oiseau](https://github.com/amosbird)) +- Ajouter `clickhouse-odbc` pilote dans les images de test. Cela permet de tester l'interaction de ClickHouse avec ClickHouse via son propre pilote ODBC. [\#9348](https://github.com/ClickHouse/ClickHouse/pull/9348) ([filimonov](https://github.com/filimonov)) +- Correction de plusieurs bugs dans les tests unitaires. [\#9047](https://github.com/ClickHouse/ClickHouse/pull/9047) ([alésapine](https://github.com/alesapin)) +- Permettre `-Wmissing-include-dirs` Avertissement GCC pour éliminer toutes les inclusions non existantes-principalement à la suite D'erreurs de script CMake [\#8704](https://github.com/ClickHouse/ClickHouse/pull/8704) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +- Décrivez les raisons si query profiler ne peut pas fonctionner. C'est prévu pour [\#9049](https://github.com/ClickHouse/ClickHouse/issues/9049) [\#9144](https://github.com/ClickHouse/ClickHouse/pull/9144) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mettre à jour OpenSSL vers le maître en amont. Correction du problème lorsque les connexions TLS peuvent échouer avec le message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error` et `SSL Exception: error:2400006E:random number generator::error retrieving entropy`. Le problème était présent dans la version 20.1. [\#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mettre à jour Dockerfile pour le serveur [\#8893](https://github.com/ClickHouse/ClickHouse/pull/8893) ([Ilya Mazaev](https://github.com/ne-ray)) +- Corrections mineures dans le script build-gcc-from-sources [\#8774](https://github.com/ClickHouse/ClickHouse/pull/8774) ([Michael Nacharov](https://github.com/mnach)) +- Remplacer `numbers` de `zeros` dans perftests où `number` la colonne n'est pas utilisée. Cela conduira à des résultats de test plus propres. [\#9600](https://github.com/ClickHouse/ClickHouse/pull/9600) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correction d'un problème de débordement de pile lors de l'utilisation de initializer\_list dans les constructeurs de colonnes. [\#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Utilisateur supprimé](https://github.com/ghost)) +- Mise à niveau librdkafka à v1. 3. 0. Activer groupé `rdkafka` et `gsasl` bibliothèques sous Mac OS X. [\#9000](https://github.com/ClickHouse/ClickHouse/pull/9000) ([Andrew Onyshchuk](https://github.com/oandrew)) +- correction de construction sur GCC 9.2.0 [\#9306](https://github.com/ClickHouse/ClickHouse/pull/9306) ([vxider](https://github.com/Vxider)) + +## Clickhouse version v20. 1 {#clickhouse-release-v20-1} + +### Clickhouse version v20. 1. 8. 41, 2020-03-20 {#clickhouse-release-v20-1-8-41-2020-03-20} + +#### Bug Fix {#bug-fix-3} + +- Correction possible permanente `Cannot schedule a task` erreur (due à une exception non gérée dans `ParallelAggregatingBlockInputStream::Handler::onFinish/onFinishThread`). Cela corrige [\#6833](https://github.com/ClickHouse/ClickHouse/issues/6833). [\#9154](https://github.com/ClickHouse/ClickHouse/pull/9154) ([Azat Khuzhin](https://github.com/azat)) +- Correction de la consommation excessive de mémoire dans `ALTER` les requêtes (mutations). Cela corrige [\#9533](https://github.com/ClickHouse/ClickHouse/issues/9533) et [\#9670](https://github.com/ClickHouse/ClickHouse/issues/9670). [\#9754](https://github.com/ClickHouse/ClickHouse/pull/9754) ([alésapine](https://github.com/alesapin)) +- Correction d'un bug dans backquoting dans les dictionnaires externes DDL. Cela corrige [\#9619](https://github.com/ClickHouse/ClickHouse/issues/9619). [\#9734](https://github.com/ClickHouse/ClickHouse/pull/9734) ([alésapine](https://github.com/alesapin)) + +### Clickhouse version v20. 1. 7. 38, 2020-03-18 {#clickhouse-release-v20-1-7-38-2020-03-18} + +#### Bug Fix {#bug-fix-4} + +- Correction de noms de fonctions internes incorrects pour `sumKahan` et `sumWithOverflow`. Je mène à l'exception en utilisant ces fonctions dans les requêtes distantes. [\#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)). Ce problème était dans toutes les versions de ClickHouse. +- Permettre `ALTER ON CLUSTER` de `Distributed` tables avec réplication interne. Cela corrige [\#3268](https://github.com/ClickHouse/ClickHouse/issues/3268). [\#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)). Ce problème était dans toutes les versions de ClickHouse. +- Corriger les exceptions possibles `Size of filter doesn't match size of column` et `Invalid number of rows in Chunk` dans `MergeTreeRangeReader`. Ils pouvaient apparaître lors de l'exécution `PREWHERE` dans certains cas. Fixer [\#9132](https://github.com/ClickHouse/ClickHouse/issues/9132). [\#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) +- Correction du problème: le fuseau horaire n'a pas été conservé si vous écrivez une expression arithmétique simple comme `time + 1` (contrairement à une expression comme `time + INTERVAL 1 SECOND`). Cela corrige [\#5743](https://github.com/ClickHouse/ClickHouse/issues/5743). [\#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexeï-milovidov](https://github.com/alexey-milovidov)). Ce problème était dans toutes les versions de ClickHouse. +- Maintenant il n'est pas possible de créer ou d'ajouter des colonnes avec des alias cycliques simples comme `a DEFAULT b, b DEFAULT a`. [\#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alésapine](https://github.com/alesapin)) +- Correction du problème lorsque le remplissage à la fin de la valeur codée base64 peut être mal formé. Mettre à jour la bibliothèque base64. Cela corrige [\#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), proche [\#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [\#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction de la course de données à la destruction de `Poco::HTTPServer`. Cela peut se produire lorsque le serveur est démarré et immédiatement arrêté. [\#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) +- Correction plantage possible/mauvais nombre de lignes dans `LIMIT n WITH TIES` quand il y a beaucoup de lignes égales à n'ème ligne. [\#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) +- Correction d'éventuelles sommes de contrôle non appariées avec la colonne TTL. [\#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) +- Correction de plantage lorsqu'un utilisateur essaie d' `ALTER MODIFY SETTING` pour Ancien formaté `MergeTree` famille de moteurs de table. [\#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alésapine](https://github.com/alesapin)) +- Maintenant, nous allons essayer de finaliser les mutations plus fréquemment. [\#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alésapine](https://github.com/alesapin)) +- Correction du protocole de réplication incompatibilité introduit dans [\#8598](https://github.com/ClickHouse/ClickHouse/issues/8598). [\#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alésapine](https://github.com/alesapin)) +- Fix not (has ()) pour l'index bloom\_filter des types de tableau. [\#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) +- Correction du comportement de `match` et `extract` fonctions lorsque haystack a zéro octets. Le comportement était mauvais quand la botte de foin était constante. Cela corrige [\#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [\#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexeï-milovidov](https://github.com/alexey-milovidov)) [\#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexeï-milovidov](https://github.com/alexey-milovidov)) + +#### Construction / Test / Amélioration De L'Emballage {#buildtestingpackaging-improvement-1} + +- La gestion des exceptions fonctionne maintenant correctement sur le sous-système Windows Pour Linux. Tu vois https://github.com/ClickHouse-Extras/libunwind/pull/3 cela corrige [\#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [\#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) + +### Clickhouse version v20. 1. 6. 30, 2020-03-05 {#clickhouse-release-v20-1-6-30-2020-03-05} + +#### Bug Fix {#bug-fix-5} + +- Correction de l'incompatibilité des données lorsqu'elles sont compressées avec `T64` codec. + [\#9039](https://github.com/ClickHouse/ClickHouse/pull/9039) [(abyss7)](https://github.com/abyss7) +- Correction de l'ordre des plages lors de la lecture de la table MergeTree dans un thread. Fixer [\#8964](https://github.com/ClickHouse/ClickHouse/issues/8964). + [\#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) [(CurtizJ)](https://github.com/CurtizJ) +- Correction possible segfault dans `MergeTreeRangeReader`, lors de l'exécution `PREWHERE`. Fixer [\#9064](https://github.com/ClickHouse/ClickHouse/issues/9064). + [\#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) [(CurtizJ)](https://github.com/CurtizJ) +- Fixer `reinterpretAsFixedString` retourner `FixedString` plutôt `String`. + [\#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) [(oandrew)](https://github.com/oandrew) +- Fixer `joinGet` avec les types de retour nullable. Fixer [\#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) + [\#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) [(amosbird)](https://github.com/amosbird) +- Correction du test fuzz et du comportement incorrect des fonctions bitTestAll/bitTestAny. + [\#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Corrigez le comportement des fonctions match et extract lorsque haystack a zéro octet. Le comportement était mauvais quand la botte de foin était constante. Fixer [\#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) + [\#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Exécution fixe de prédicats inversés lorsque l'index fonctionnel non strictement monotinique est utilisé. Fixer [\#9034](https://github.com/ClickHouse/ClickHouse/issues/9034) + [\#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) [(Akazz)](https://github.com/Akazz) +- Permettre à réécrire `CROSS` de `INNER JOIN` si il y a `[NOT] LIKE` opérateur `WHERE` section. Fixer [\#9191](https://github.com/ClickHouse/ClickHouse/issues/9191) + [\#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) [(4ertus2)](https://github.com/4ertus2) +- Autoriser la(Les) première (s) colonne (s) dans une table avec Log engine à être un alias. + [\#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) [(abyss7)](https://github.com/abyss7) +- Autoriser la virgule rejoindre `IN()` à l'intérieur. Fixer [\#7314](https://github.com/ClickHouse/ClickHouse/issues/7314). + [\#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) [(4ertus2)](https://github.com/4ertus2) +- Améliorer `ALTER MODIFY/ADD` les requêtes de la logique. Maintenant vous ne pouvez pas `ADD` colonne sans type, `MODIFY` l'expression par défaut ne change pas le type de colonne et `MODIFY` type ne perd pas la valeur d'expression par défaut. Fixer [\#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). + [\#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) [(alesapin)](https://github.com/alesapin) +- Fix finalisation des mutations, quand déjà fait mutation peut avoir le statut is\_done = 0. + [\#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) [(alesapin)](https://github.com/alesapin) +- Soutien “Processors” pipeline pour le système.nombres et système.numbers\_mt. Cela corrige également le bug lorsque `max_execution_time` n'est pas respectée. + [\#7796](https://github.com/ClickHouse/ClickHouse/pull/7796) [(KochetovNicolai)](https://github.com/KochetovNicolai) +- Correction d'un mauvais comptage de `DictCacheKeysRequestedFound` métrique. + [\#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) [(nikitamikhaylov)](https://github.com/nikitamikhaylov) +- Ajout d'une vérification de la stratégie de stockage dans `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE` ce qui pourrait autrement rendre les données de la partie inaccessibles après le redémarrage et empêcher ClickHouse de démarrer. + [\#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) [(excitoon)](https://github.com/excitoon) +- Rapport UBSan fixe dans `MergeTreeIndexSet`. Cela corrige [\#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) + [\#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Correction possible datarace dans BlockIO. + [\#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) [(KochetovNicolai)](https://github.com/KochetovNicolai) +- Soutien pour `UInt64` nombres qui ne correspondent pas à Int64 dans les fonctions liées à JSON. Mettre `SIMDJSON` maîtriser. Cela corrige [\#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) + [\#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Résoudre le problème lorsque la quantité d'espace libre n'est pas calculée correctement si le répertoire de données est monté sur un appareil séparé. Pour le disque par défaut calculer l'espace libre à partir du sous-répertoire de données. Cela corrige [\#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) + [\#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) [(millb)](https://github.com/millb) +- Corrigez le problème lorsque les connexions TLS peuvent échouer avec le message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error and SSL Exception: error:2400006E:random number generator::error retrieving entropy.` Mettre à jour OpenSSL vers le maître en amont. + [\#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) [(alexey-milovidov)](https://github.com/alexey-milovidov) +- Lors de l'exécution de `CREATE` requête, plier les expressions constantes dans les arguments du moteur de stockage. Remplacez le nom de base de données vide par la base de données actuelle. Fixer [\#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [\#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). Corrigez également la vérification de l'adresse locale dans ClickHouseDictionarySource. + [\#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) +- Fixer erreur de segmentation dans `StorageMerge`, ce qui peut arriver lors de la lecture de StorageFile. + [\#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) [(tabplubix)](https://github.com/tavplubix) +- Empêcher la perte de données dans `Kafka` dans de rares cas, lorsque l'exception se produit après la lecture du suffixe mais avant la validation. Fixer [\#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Concerner: [\#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) + [\#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) +- Correction d'un bug menant à la résiliation du serveur lorsque vous essayez d'utiliser / drop `Kafka` tableau créé avec de mauvais paramètres. Fixer [\#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporer [\#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). + [\#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) + +#### Nouveauté {#new-feature-1} + +- Ajouter `deduplicate_blocks_in_dependent_materialized_views` option pour contrôler le comportement des insertions idempotent dans des tables avec des vues matérialisées. Cette nouvelle fonctionnalité a été ajoutée à la version de bugfix par une demande spéciale D'Altinity. + [\#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) + +### Clickhouse version v20. 1. 2. 4, 2020-01-22 {#clickhouse-release-v20-1-2-4-2020-01-22} + +#### Modification Incompatible En Arrière {#backward-incompatible-change-1} + +- Effectuer le réglage `merge_tree_uniform_read_distribution` obsolète. Le serveur reconnaît toujours ce paramètre, mais il n'a pas d'effet. [\#8308](https://github.com/ClickHouse/ClickHouse/pull/8308) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Type de retour modifié de la fonction `greatCircleDistance` de `Float32` parce que maintenant, le résultat du calcul est `Float32`. [\#7993](https://github.com/ClickHouse/ClickHouse/pull/7993) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Maintenant, il est prévu que les paramètres de requête sont représentés dans “escaped” format. Par exemple, pour passer de la chaîne `ab` vous devez écrire `a\tb` ou `a\b` et, respectivement,, `a%5Ctb` ou `a%5C%09b` dans L'URL. Ceci est nécessaire pour ajouter la possibilité de passer NULL as `\N`. Cela corrige [\#7488](https://github.com/ClickHouse/ClickHouse/issues/7488). [\#8517](https://github.com/ClickHouse/ClickHouse/pull/8517) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Permettre `use_minimalistic_part_header_in_zookeeper` réglage pour `ReplicatedMergeTree` par défaut. Cela permettra de réduire considérablement la quantité de données stockées dans ZooKeeper. Ce paramètre est pris en charge depuis la version 19.1 et nous l'utilisons déjà en production dans plusieurs services sans aucun problème depuis plus d'une demi-année. Désactivez ce paramètre si vous avez la possibilité de passer à des versions antérieures à 19.1. [\#6850](https://github.com/ClickHouse/ClickHouse/pull/6850) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Les indices de saut de données sont prêts pour la production et activés par défaut. Paramètre `allow_experimental_data_skipping_indices`, `allow_experimental_cross_to_join_conversion` et `allow_experimental_multiple_joins_emulation` sont maintenant obsolètes et ne rien faire. [\#7974](https://github.com/ClickHouse/ClickHouse/pull/7974) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter de nouveaux `ANY JOIN` logique pour `StorageJoin` compatible avec `JOIN` opération. Pour mettre à niveau sans changement de comportement vous devez ajouter `SETTINGS any_join_distinct_right_table_keys = 1` pour engine Join tables metadata ou recréer ces tables après la mise à niveau. [\#8400](https://github.com/ClickHouse/ClickHouse/pull/8400) ([Artem Zuikov](https://github.com/4ertus2)) +- Exiger que le serveur soit redémarré pour appliquer les modifications dans la configuration de journalisation. Il s'agit d'une solution de contournement temporaire pour éviter le bogue où le serveur se connecte à un fichier journal supprimé (voir [\#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [\#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +#### Nouveauté {#new-feature-2} + +- Ajout d'informations sur les chemins d'accès `system.merges`. [\#8043](https://github.com/ClickHouse/ClickHouse/pull/8043) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Ajouter la possibilité d'exécuter `SYSTEM RELOAD DICTIONARY` requête en `ON CLUSTER` mode. [\#8288](https://github.com/ClickHouse/ClickHouse/pull/8288) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Ajouter la possibilité d'exécuter `CREATE DICTIONARY` les requêtes en `ON CLUSTER` mode. [\#8163](https://github.com/ClickHouse/ClickHouse/pull/8163) ([alésapine](https://github.com/alesapin)) +- Maintenant, le profil de l'utilisateur dans `users.xml` peut hériter de plusieurs profils. [\#8343](https://github.com/ClickHouse/ClickHouse/pull/8343) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Ajouter `system.stack_trace` table qui permet de regarder les traces de pile de tous les threads du serveur. Ceci est utile pour les développeurs d'introspecter l'état du serveur. Cela corrige [\#7576](https://github.com/ClickHouse/ClickHouse/issues/7576). [\#8344](https://github.com/ClickHouse/ClickHouse/pull/8344) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter `DateTime64` type de données configurables sous-précision de seconde. [\#7170](https://github.com/ClickHouse/ClickHouse/pull/7170) ([Vasily Nemkov](https://github.com/Enmk)) +- Ajouter une fonction de table `clusterAllReplicas` ce qui permet d'interroger tous les nœuds dans le cluster. [\#8493](https://github.com/ClickHouse/ClickHouse/pull/8493) ([kiran sunkari](https://github.com/kiransunkari)) +- Ajouter une fonction d'agrégat `categoricalInformationValue` qui calcule la valeur d'information d'une fonction discrète. [\#8117](https://github.com/ClickHouse/ClickHouse/pull/8117) ([hcz](https://github.com/hczhcz)) +- Accélérer l'analyse des fichiers de données dans `CSV`, `TSV` et `JSONEachRow` formater en le faisant en parallèle. [\#7780](https://github.com/ClickHouse/ClickHouse/pull/7780) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Ajouter une fonction `bankerRound` qui effectue l'arrondi. [\#8112](https://github.com/ClickHouse/ClickHouse/pull/8112) ([hcz](https://github.com/hczhcz)) +- Soutenir plus de langues dans le dictionnaire intégré pour les noms de région: ‘ru’, ‘en’, ‘ua’, ‘uk’, ‘by’, ‘kz’, ‘tr’, ‘de’, ‘uz’, ‘lv’, ‘lt’, ‘et’, ‘pt’, ‘he’, ‘vi’. [\#8189](https://github.com/ClickHouse/ClickHouse/pull/8189) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Améliorer l'uniformité de `ANY JOIN` logique. Maintenant `t1 ANY LEFT JOIN t2` égal `t2 ANY RIGHT JOIN t1`. [\#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +- Ajouter un paramètre `any_join_distinct_right_table_keys` ce qui permet un vieux comportement pour `ANY INNER JOIN`. [\#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +- Ajouter de nouveaux `SEMI` et `ANTI JOIN`. Vieux `ANY INNER JOIN` comportement maintenant disponible en `SEMI LEFT JOIN`. [\#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +- Ajouter `Distributed` format pour `File` moteur et `file` fonction de table qui permet de lire à partir `.bin` fichiers générés par des insertions asynchrones dans `Distributed` table. [\#8535](https://github.com/ClickHouse/ClickHouse/pull/8535) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ajouter un argument de colonne de réinitialisation facultatif pour `runningAccumulate` ce qui permet de réinitialiser les résultats d'agrégation pour chaque nouvelle valeur de clé. [\#8326](https://github.com/ClickHouse/ClickHouse/pull/8326) ([Sergey Kononenko](https://github.com/kononencheg)) +- Ajouter la possibilité d'utiliser ClickHouse comme point de terminaison Prometheus. [\#7900](https://github.com/ClickHouse/ClickHouse/pull/7900) ([vdimir](https://github.com/Vdimir)) +- Ajouter une section `` dans `config.xml` qui restreint les hôtes autorisés pour les moteurs de table distants et les fonctions de table `URL`, `S3`, `HDFS`. [\#7154](https://github.com/ClickHouse/ClickHouse/pull/7154) ([Mikhail Korotov](https://github.com/millb)) +- Ajout de la fonction `greatCircleAngle` qui calcule la distance sur une sphère en degrés. [\#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Rayon de la Terre modifié pour être cohérent avec la bibliothèque H3. [\#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter `JSONCompactEachRow` et `JSONCompactEachRowWithNamesAndTypes` les formats d'entrée et de sortie. [\#7841](https://github.com/ClickHouse/ClickHouse/pull/7841) ([Mikhail Korotov](https://github.com/millb)) +- Ajout d'une fonctionnalité pour les moteurs de table liés aux fichiers et les fonctions de table (`File`, `S3`, `URL`, `HDFS`) qui permet de lire et d'écrire `gzip` fichiers basés sur un paramètre de moteur supplémentaire ou une extension de fichier. [\#7840](https://github.com/ClickHouse/ClickHouse/pull/7840) ([Andrey Bodrov](https://github.com/apbodrov)) +- Ajouté le `randomASCII(length)` fonction, générant une chaîne avec un ensemble aléatoire de [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) caractères imprimables. [\#8401](https://github.com/ClickHouse/ClickHouse/pull/8401) ([Baïonnette](https://github.com/BayoNet)) +- Ajout de la fonction `JSONExtractArrayRaw` qui renvoie un tableau sur des éléments de tableau JSON non analysés de `JSON` chaîne. [\#8081](https://github.com/ClickHouse/ClickHouse/pull/8081) ([Oleg Matrokhin](https://github.com/errx)) +- Ajouter `arrayZip` fonction qui permet de combiner plusieurs tableaux de longueurs égales dans un tableau de n-uplets. [\#8149](https://github.com/ClickHouse/ClickHouse/pull/8149) ([L'Hiver Zhang](https://github.com/zhang2014)) +- Ajouter la possibilité de déplacer des données entre les disques selon configuré `TTL`-expressions pour `*MergeTree` famille de moteurs de table. [\#8140](https://github.com/ClickHouse/ClickHouse/pull/8140) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Ajout d'une nouvelle fonction d'agrégat `avgWeighted` qui permet de calculer la moyenne pondérée. [\#7898](https://github.com/ClickHouse/ClickHouse/pull/7898) ([Andrey Bodrov](https://github.com/apbodrov)) +- Maintenant, l'analyse parallèle est activée par défaut pour `TSV`, `TSKV`, `CSV` et `JSONEachRow` format. [\#7894](https://github.com/ClickHouse/ClickHouse/pull/7894) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Ajouter plusieurs fonctions de géo `H3` bibliothèque: `h3GetResolution`, `h3EdgeAngle`, `h3EdgeLength`, `h3IsValid` et `h3kRing`. [\#8034](https://github.com/ClickHouse/ClickHouse/pull/8034) ([Konstantin Malanchev](https://github.com/hombit)) +- Ajout du support pour brotli (`br`) compression dans les stockages liés aux fichiers et les fonctions de table. Cela corrige [\#8156](https://github.com/ClickHouse/ClickHouse/issues/8156). [\#8526](https://github.com/ClickHouse/ClickHouse/pull/8526) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter `groupBit*` fonctions pour l' `SimpleAggregationFunction` type. [\#8485](https://github.com/ClickHouse/ClickHouse/pull/8485) ([Guillaume Tassery](https://github.com/YiuRULE)) + +#### Bug Fix {#bug-fix-6} + +- Correction du renommage des tables avec `Distributed` moteur. Correction problème [\#7868](https://github.com/ClickHouse/ClickHouse/issues/7868). [\#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([tavplubix](https://github.com/tavplubix)) +- Maintenant dictionnaires de soutien `EXPRESSION` pour les attributs dans une chaîne arbitraire en dialecte SQL non-ClickHouse. [\#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alésapine](https://github.com/alesapin)) +- Réparation de `INSERT SELECT FROM mysql(...)` requête. Cela corrige [\#8070](https://github.com/ClickHouse/ClickHouse/issues/8070) et [\#7960](https://github.com/ClickHouse/ClickHouse/issues/7960). [\#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([tavplubix](https://github.com/tavplubix)) +- Correction d'erreur “Mismatch column sizes” lors de l'insertion par défaut `Tuple` de `JSONEachRow`. Cela corrige [\#5653](https://github.com/ClickHouse/ClickHouse/issues/5653). [\#8606](https://github.com/ClickHouse/ClickHouse/pull/8606) ([tavplubix](https://github.com/tavplubix)) +- Maintenant, une exception sera levée en cas d'utilisation `WITH TIES` parallèlement `LIMIT BY`. Ajoutez également la possibilité d'utiliser `TOP` avec `LIMIT BY`. Cela corrige [\#7472](https://github.com/ClickHouse/ClickHouse/issues/7472). [\#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Correction de la dépendance unintendent à partir de la nouvelle version de glibc dans `clickhouse-odbc-bridge` binaire. [\#8046](https://github.com/ClickHouse/ClickHouse/pull/8046) ([Amos Oiseau](https://github.com/amosbird)) +- Correction d'un bug dans la fonction de contrôle de `*MergeTree` les moteurs de la famille. Maintenant, il n'échoue pas dans le cas où nous avons une quantité égale de lignes dans le dernier granule et la dernière marque (non finale). [\#8047](https://github.com/ClickHouse/ClickHouse/pull/8047) ([alésapine](https://github.com/alesapin)) +- Fixer l'insertion dans `Enum*` les colonnes après `ALTER` requête, lorsque le type numérique sous-jacent est égal au type spécifié par la table. Cela corrige [\#7836](https://github.com/ClickHouse/ClickHouse/issues/7836). [\#7908](https://github.com/ClickHouse/ClickHouse/pull/7908) ([Anton Popov](https://github.com/CurtizJ)) +- Négatif non constant autorisé “size” argument pour la fonction `substring`. Il n'a pas été autorisé par erreur. Cela corrige [\#4832](https://github.com/ClickHouse/ClickHouse/issues/4832). [\#7703](https://github.com/ClickHouse/ClickHouse/pull/7703) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction d'un bogue d'analyse lorsque le nombre d'arguments transmis est erroné `(O|J)DBC` tableau moteur. [\#7709](https://github.com/ClickHouse/ClickHouse/pull/7709) ([alésapine](https://github.com/alesapin)) +- Utilisation du nom de commande du processus clickhouse en cours d'exécution lors de l'envoi de journaux à syslog. Dans les versions précédentes, la chaîne vide était utilisée à la place du nom de la commande. [\#8460](https://github.com/ClickHouse/ClickHouse/pull/8460) ([Michael Nacharov](https://github.com/mnach)) +- Correction de la vérification des hôtes autorisés pour `localhost`. Ce PR corrige la solution fournie dans [\#8241](https://github.com/ClickHouse/ClickHouse/pull/8241). [\#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) +- Correction plantage rare dans `argMin` et `argMax` fonctions pour les arguments de chaîne longue, lorsque result est utilisé dans `runningAccumulate` fonction. Cela corrige [\#8325](https://github.com/ClickHouse/ClickHouse/issues/8325) [\#8341](https://github.com/ClickHouse/ClickHouse/pull/8341) ([dinosaure](https://github.com/769344359)) +- Correction de la surcommission de mémoire pour les tables avec `Buffer` moteur. [\#8345](https://github.com/ClickHouse/ClickHouse/pull/8345) ([Azat Khuzhin](https://github.com/azat)) +- Correction d'un bug potentiel dans les fonctions qui peuvent prendre `NULL` comme l'un des arguments et retourner non-NULL. [\#8196](https://github.com/ClickHouse/ClickHouse/pull/8196) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Meilleurs calculs de métriques dans le pool de threads pour les processus `MergeTree` table des moteurs. [\#8194](https://github.com/ClickHouse/ClickHouse/pull/8194) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fonction Fix `IN` à l'intérieur de `WHERE` instruction lorsque le filtre de table de niveau ligne est présent. Fixer [\#6687](https://github.com/ClickHouse/ClickHouse/issues/6687) [\#8357](https://github.com/ClickHouse/ClickHouse/pull/8357) ([Ivan](https://github.com/abyss7)) +- Maintenant, une exception est levée si la valeur intégrale n'est pas complètement analysée pour les valeurs des paramètres. [\#7678](https://github.com/ClickHouse/ClickHouse/pull/7678) ([Mikhail Korotov](https://github.com/millb)) +- Fix exception lorsque la fonction est utilisée dans la requête distribuée table avec plus de deux fragments. [\#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) +- Maintenant, bloom filter peut gérer des tableaux de longueur nulle et n'effectue pas de calculs redondants. [\#8242](https://github.com/ClickHouse/ClickHouse/pull/8242) ([achimbab](https://github.com/achimbab)) +- Correction de la vérification si un hôte client est autorisé en faisant correspondre l'hôte client à `host_regexp` spécifié dans `users.xml`. [\#8241](https://github.com/ClickHouse/ClickHouse/pull/8241) ([Vitaly Baranov](https://github.com/vitlibar)) +- Relax colonne ambiguë vérifier qui conduit à des faux positifs dans plusieurs `JOIN ON` section. [\#8385](https://github.com/ClickHouse/ClickHouse/pull/8385) ([Artem Zuikov](https://github.com/4ertus2)) +- Correction possible plantage du serveur (`std::terminate`) lorsque le serveur ne peut pas envoyer ou écrire des données `JSON` ou `XML` format avec les valeurs de `String` type de données (qui nécessitent `UTF-8` validation) ou lors de la compression des données de résultat avec l'algorithme Brotli ou dans certains autres cas rares. Cela corrige [\#7603](https://github.com/ClickHouse/ClickHouse/issues/7603) [\#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction de la condition de course dans `StorageDistributedDirectoryMonitor` trouvé par CI. Cela corrige [\#8364](https://github.com/ClickHouse/ClickHouse/issues/8364). [\#8383](https://github.com/ClickHouse/ClickHouse/pull/8383) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Maintenant fond fusionne dans `*MergeTree` la famille des moteurs de table préserve l'ordre de volume de la Politique de stockage avec plus de précision. [\#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Maintenant moteur de table `Kafka` fonctionne correctement avec `Native` format. Cela corrige [\#6731](https://github.com/ClickHouse/ClickHouse/issues/6731) [\#7337](https://github.com/ClickHouse/ClickHouse/issues/7337) [\#8003](https://github.com/ClickHouse/ClickHouse/issues/8003). [\#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +- Formats fixes avec des en-têtes (comme `CSVWithNames`) qui lançaient une exception sur EOF pour le moteur de table `Kafka`. [\#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +- Correction d'un bug avec making set from subquery dans la partie droite de `IN` section. Cela corrige [\#5767](https://github.com/ClickHouse/ClickHouse/issues/5767) et [\#2542](https://github.com/ClickHouse/ClickHouse/issues/2542). [\#7755](https://github.com/ClickHouse/ClickHouse/pull/7755) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Correction d'un crash possible lors de la lecture à partir du stockage `File`. [\#7756](https://github.com/ClickHouse/ClickHouse/pull/7756) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correction de la lecture des fichiers en `Parquet` format contenant des colonnes de type `list`. [\#8334](https://github.com/ClickHouse/ClickHouse/pull/8334) ([maxulan](https://github.com/maxulan)) +- Correction d'erreur `Not found column` pour les requêtes distribuées avec `PREWHERE` condition dépendant de la clé d'échantillonnage si `max_parallel_replicas > 1`. [\#7913](https://github.com/ClickHouse/ClickHouse/pull/7913) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correction d'erreur `Not found column` si la requête utilisée `PREWHERE` dépendant de l'alias de la table et le jeu de résultats était vide en raison de la condition de clé primaire. [\#7911](https://github.com/ClickHouse/ClickHouse/pull/7911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Type de retour fixe pour les fonctions `rand` et `randConstant` en cas de `Nullable` argument. Maintenant renvoient toujours `UInt32` et jamais `Nullable(UInt32)`. [\#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Désactivé prédicat-poussoir vers le bas pour `WITH FILL` expression. Cela corrige [\#7784](https://github.com/ClickHouse/ClickHouse/issues/7784). [\#7789](https://github.com/ClickHouse/ClickHouse/pull/7789) ([L'Hiver Zhang](https://github.com/zhang2014)) +- Fixe incorrect `count()` résultat `SummingMergeTree` lorsque `FINAL` la section est utilisée. [\#3280](https://github.com/ClickHouse/ClickHouse/issues/3280) [\#7786](https://github.com/ClickHouse/ClickHouse/pull/7786) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Correction d'un résultat incorrect possible pour les fonctions constantes à partir de serveurs distants. C'est arrivé pour les requêtes avec des fonctions comme `version()`, `uptime()`, etc. qui renvoie différentes valeurs constantes pour différents serveurs. Cela corrige [\#7666](https://github.com/ClickHouse/ClickHouse/issues/7666). [\#7689](https://github.com/ClickHouse/ClickHouse/pull/7689) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correction d'un bug compliqué dans l'optimisation des prédicats push-down qui conduit à de mauvais résultats. Cela résout beaucoup de problèmes sur l'optimisation des prédicats push-down. [\#8503](https://github.com/ClickHouse/ClickHouse/pull/8503) ([L'Hiver Zhang](https://github.com/zhang2014)) +- Correction d'un crash dans l' `CREATE TABLE .. AS dictionary` requête. [\#8508](https://github.com/ClickHouse/ClickHouse/pull/8508) ([Azat Khuzhin](https://github.com/azat)) +- Plusieurs améliorations grammaire ClickHouse dans `.g4` fichier. [\#8294](https://github.com/ClickHouse/ClickHouse/pull/8294) ([taiyang-li](https://github.com/taiyang-li)) +- Correction d'un bug qui conduit à des plantages dans `JOIN`s avec tables avec moteur `Join`. Cela corrige [\#7556](https://github.com/ClickHouse/ClickHouse/issues/7556) [\#8254](https://github.com/ClickHouse/ClickHouse/issues/8254) [\#7915](https://github.com/ClickHouse/ClickHouse/issues/7915) [\#8100](https://github.com/ClickHouse/ClickHouse/issues/8100). [\#8298](https://github.com/ClickHouse/ClickHouse/pull/8298) ([Artem Zuikov](https://github.com/4ertus2)) +- Corriger les dictionnaires redondants recharger sur `CREATE DATABASE`. [\#7916](https://github.com/ClickHouse/ClickHouse/pull/7916) ([Azat Khuzhin](https://github.com/azat)) +- Limiter le nombre maximum de flux pour lire à partir `StorageFile` et `StorageHDFS`. Corrections https://github.com/ClickHouse/ClickHouse/issues/7650. [\#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alésapine](https://github.com/alesapin)) +- Correction d'un bug dans `ALTER ... MODIFY ... CODEC` requête, lorsque l'utilisateur spécifie à la fois l'expression par défaut et le codec. Fixer [8593](https://github.com/ClickHouse/ClickHouse/issues/8593). [\#8614](https://github.com/ClickHouse/ClickHouse/pull/8614) ([alésapine](https://github.com/alesapin)) +- Correction d'une erreur dans la fusion en arrière-plan des colonnes avec `SimpleAggregateFunction(LowCardinality)` type. [\#8613](https://github.com/ClickHouse/ClickHouse/pull/8613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fonction d'enregistrement de type fixe `toDateTime64`. [\#8375](https://github.com/ClickHouse/ClickHouse/pull/8375) ([Vasily Nemkov](https://github.com/Enmk)) +- Maintenant le serveur ne plante pas `LEFT` ou `FULL JOIN` avec et Rejoindre moteur et non pris en charge `join_use_nulls` paramètre. [\#8479](https://github.com/ClickHouse/ClickHouse/pull/8479) ([Artem Zuikov](https://github.com/4ertus2)) +- Maintenant `DROP DICTIONARY IF EXISTS db.dict` la requête ne lance pas d'exception si `db` n'existe pas. [\#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) +- Correction des plantages possibles dans les fonctions de la table (`file`, `mysql`, `remote`) causés par l'utilisation de la référence à enlever `IStorage` objet. Correction d'une analyse incorrecte des colonnes spécifiées lors de l'insertion dans la fonction de table. [\#7762](https://github.com/ClickHouse/ClickHouse/pull/7762) ([tavplubix](https://github.com/tavplubix)) +- S'assurer du réseau avant de démarrer `clickhouse-server`. Cela corrige [\#7507](https://github.com/ClickHouse/ClickHouse/issues/7507). [\#8570](https://github.com/ClickHouse/ClickHouse/pull/8570) ([Zhichang Yu](https://github.com/yuzhichang)) +- Correction de la gestion des délais d'attente pour les connexions sécurisées, de sorte que les requêtes ne se bloquent pas indéfiniment. Cela corrige [\#8126](https://github.com/ClickHouse/ClickHouse/issues/8126). [\#8128](https://github.com/ClickHouse/ClickHouse/pull/8128) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Fixer `clickhouse-copier`conflit redondant entre les travailleurs concurrents. [\#7816](https://github.com/ClickHouse/ClickHouse/pull/7816) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +- Maintenant, les mutations ne sautent pas les parties attachées, même si leur version de mutation était plus grande que la version de mutation actuelle. [\#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) [\#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alésapine](https://github.com/alesapin)) +- Ignorer les copies redondantes de `*MergeTree` les parties de données après le déplacement vers un autre disque et le redémarrage du serveur. [\#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Correction d'un crash dans l' `FULL JOIN` avec `LowCardinality` dans `JOIN` clé. [\#8252](https://github.com/ClickHouse/ClickHouse/pull/8252) ([Artem Zuikov](https://github.com/4ertus2)) +- Interdit d'utiliser le nom de colonne plus d'une fois dans insert query comme `INSERT INTO tbl (x, y, x)`. Cela corrige [\#5465](https://github.com/ClickHouse/ClickHouse/issues/5465), [\#7681](https://github.com/ClickHouse/ClickHouse/issues/7681). [\#7685](https://github.com/ClickHouse/ClickHouse/pull/7685) ([alésapine](https://github.com/alesapin)) +- Ajout de secours pour la détection du nombre de cœurs de processeur physiques pour les processeurs inconnus (en utilisant le nombre de cœurs de processeur logiques). Cela corrige [\#5239](https://github.com/ClickHouse/ClickHouse/issues/5239). [\#7726](https://github.com/ClickHouse/ClickHouse/pull/7726) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Fixer `There's no column` erreur pour les colonnes matérialisées et alias. [\#8210](https://github.com/ClickHouse/ClickHouse/pull/8210) ([Artem Zuikov](https://github.com/4ertus2)) +- Correction d'un crash sever lorsque `EXISTS` la requête a été utilisé sans `TABLE` ou `DICTIONARY` qualificatif. Tout comme `EXISTS t`. Cela corrige [\#8172](https://github.com/ClickHouse/ClickHouse/issues/8172). Ce bug a été introduit dans la version 19.17. [\#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction d'un bug rare avec erreur `"Sizes of columns doesn't match"` qui pourraient apparaître lors de l'utilisation `SimpleAggregateFunction` colonne. [\#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) +- Correction d'un bug où l'utilisateur avec vide `allow_databases` vous avez accès à toutes les bases de données (et même pour `allow_dictionaries`). [\#7793](https://github.com/ClickHouse/ClickHouse/pull/7793) ([DeifyTheGod](https://github.com/DeifyTheGod)) +- Correction du crash du client lorsque le serveur est déjà déconnecté du client. [\#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) +- Fixer `ORDER BY` comportement en cas de tri par préfixe de clé primaire et Suffixe de clé non primaire. [\#7759](https://github.com/ClickHouse/ClickHouse/pull/7759) ([Anton Popov](https://github.com/CurtizJ)) +- Vérifiez si la colonne qualifiée est présente dans le tableau. Cela corrige [\#6836](https://github.com/ClickHouse/ClickHouse/issues/6836). [\#7758](https://github.com/ClickHouse/ClickHouse/pull/7758) ([Artem Zuikov](https://github.com/4ertus2)) +- Correction du comportement avec `ALTER MOVE` exécuté immédiatement après la fin de la fusion se déplace superpart De spécifié. Fixer [\#8103](https://github.com/ClickHouse/ClickHouse/issues/8103). [\#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Correction d'un crash possible du serveur lors de l'utilisation `UNION` avec un nombre différent de colonnes. Fixer [\#7279](https://github.com/ClickHouse/ClickHouse/issues/7279). [\#7929](https://github.com/ClickHouse/ClickHouse/pull/7929) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixer la taille de résultat pour la fonction substring `substr` avec une taille négative. [\#8589](https://github.com/ClickHouse/ClickHouse/pull/8589) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Maintenant le serveur n'exécute pas la mutation partielle dans `MergeTree` s'il n'y a pas assez de threads libres dans le pool d'arrière-plan. [\#8588](https://github.com/ClickHouse/ClickHouse/pull/8588) ([tavplubix](https://github.com/tavplubix)) +- Correction d'une faute de frappe mineure sur le formatage `UNION ALL` AST. [\#7999](https://github.com/ClickHouse/ClickHouse/pull/7999) ([litao91](https://github.com/litao91)) +- Correction des résultats incorrects du filtre bloom pour les nombres négatifs. Cela corrige [\#8317](https://github.com/ClickHouse/ClickHouse/issues/8317). [\#8566](https://github.com/ClickHouse/ClickHouse/pull/8566) ([L'Hiver Zhang](https://github.com/zhang2014)) +- Dépassement de tampon potentiel fixe en décompression. Un utilisateur malveillant peut transmettre des données compressées fabriquées qui provoqueront une lecture après le tampon. Ce problème a été trouvé par Eldar Zaitov de l'équipe de sécurité de L'information Yandex. [\#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction d'un résultat incorrect en raison du débordement d'entiers dans `arrayIntersect`. [\#7777](https://github.com/ClickHouse/ClickHouse/pull/7777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Maintenant `OPTIMIZE TABLE` query n'attendra pas les répliques hors ligne pour effectuer l'opération. [\#8314](https://github.com/ClickHouse/ClickHouse/pull/8314) ([javi santana](https://github.com/javisantana)) +- Fixe `ALTER TTL` analyseur pour `Replicated*MergeTree` table. [\#8318](https://github.com/ClickHouse/ClickHouse/pull/8318) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Correction de la communication entre le serveur et le client, afin que le serveur lise les informations des tables temporaires après l'échec de la requête. [\#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) +- Fixer `bitmapAnd` erreur de fonction lors de l'intersection d'un bitmap agrégé et d'un bitmap scalaire. [\#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) +- Affiner la définition de `ZXid` selon le Guide du programmeur ZooKeeper qui corrige un bug dans `clickhouse-cluster-copier`. [\#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +- `odbc` fonction de table respecte maintenant `external_table_functions_use_nulls` paramètre. [\#7506](https://github.com/ClickHouse/ClickHouse/pull/7506) ([Vasily Nemkov](https://github.com/Enmk)) +- Correction d'un bug qui conduisait à une course de données rare. [\#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alexander Kazakov](https://github.com/Akazz)) +- Maintenant `SYSTEM RELOAD DICTIONARY` recharge complètement un dictionnaire, en ignorant `update_field`. Cela corrige [\#7440](https://github.com/ClickHouse/ClickHouse/issues/7440). [\#8037](https://github.com/ClickHouse/ClickHouse/pull/8037) ([Vitaly Baranov](https://github.com/vitlibar)) +- Ajouter la possibilité de vérifier si le dictionnaire existe dans create query. [\#8032](https://github.com/ClickHouse/ClickHouse/pull/8032) ([alésapine](https://github.com/alesapin)) +- Fixer `Float*` l'analyse en `Values` format. Cela corrige [\#7817](https://github.com/ClickHouse/ClickHouse/issues/7817). [\#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([tavplubix](https://github.com/tavplubix)) +- Correction d'un crash lorsque nous ne pouvons pas réserver d'espace dans certaines opérations en arrière-plan de `*MergeTree` famille de moteurs de table. [\#7873](https://github.com/ClickHouse/ClickHouse/pull/7873) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Correction du crash de l'opération de fusion lorsque la table contient `SimpleAggregateFunction(LowCardinality)` colonne. Cela corrige [\#8515](https://github.com/ClickHouse/ClickHouse/issues/8515). [\#8522](https://github.com/ClickHouse/ClickHouse/pull/8522) ([Azat Khuzhin](https://github.com/azat)) +- Restaurez la prise en charge de toutes les locales ICU et ajoutez la possibilité d'appliquer des collations pour les expressions constantes. Ajoutez également le nom de la langue à `system.collations` table. [\#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alésapine](https://github.com/alesapin)) +- Correction d'un bug lorsque les dictionnaires externes avec zéro durée de vie minimale (`LIFETIME(MIN 0 MAX N)`, `LIFETIME(N)`) ne pas mettre à jour en arrière-plan. [\#7983](https://github.com/ClickHouse/ClickHouse/pull/7983) ([alésapine](https://github.com/alesapin)) +- Correction d'un crash lorsque le dictionnaire externe avec la source de ClickHouse a une sous-requête dans la requête. [\#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correction d'une analyse incorrecte de l'extension de fichier dans la table avec le moteur `URL`. Cela corrige [\#8157](https://github.com/ClickHouse/ClickHouse/issues/8157). [\#8419](https://github.com/ClickHouse/ClickHouse/pull/8419) ([Andrey Bodrov](https://github.com/apbodrov)) +- Fixer `CHECK TABLE` requête pour `*MergeTree` les tables sans clé. Fixer [\#7543](https://github.com/ClickHouse/ClickHouse/issues/7543). [\#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alésapine](https://github.com/alesapin)) +- De conversion fixe de `Float64` au type MySQL. [\#8079](https://github.com/ClickHouse/ClickHouse/pull/8079) ([Yuriy Baranov](https://github.com/yurriy)) +- Maintenant, si la table n'a pas été complètement abandonnée en raison d'un plantage du serveur, le serveur va essayer de la restaurer et de la charger. [\#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([tavplubix](https://github.com/tavplubix)) +- Correction d'un crash dans la fonction de table `file` lors de l'insertion dans le fichier qui n'existe pas. Maintenant, dans ce cas, le fichier sera créé et insérez seraient traités. [\#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) +- Correction de l'impasse rare qui peut arriver quand `trace_log` est activé. [\#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) +- Ajouter la possibilité de travailler avec différents types en outre `Date` dans `RangeHashed` dictionnaire externe créé à partir de la requête DDL. Fixer [7899](https://github.com/ClickHouse/ClickHouse/issues/7899). [\#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alésapine](https://github.com/alesapin)) +- Correction d'un crash lorsque `now64()` est appelé avec un résultat d'une autre fonction. [\#8270](https://github.com/ClickHouse/ClickHouse/pull/8270) ([Vasily Nemkov](https://github.com/Enmk)) +- Correction d'un bug avec la détection de l'adresse IP du client pour les connexions via le protocole de fil mysql. [\#7743](https://github.com/ClickHouse/ClickHouse/pull/7743) ([Dmitry Muzyka](https://github.com/dmitriy-myz)) +- Correction de la gestion du tableau vide dans `arraySplit` fonction. Cela corrige [\#7708](https://github.com/ClickHouse/ClickHouse/issues/7708). [\#7747](https://github.com/ClickHouse/ClickHouse/pull/7747) ([hcz](https://github.com/hczhcz)) +- Correction du problème lorsque `pid-file` d'un autre cours d'exécution `clickhouse-server` peut être supprimée. [\#8487](https://github.com/ClickHouse/ClickHouse/pull/8487) ([Weiqing Xu](https://github.com/weiqxu)) +- Correction du rechargement du dictionnaire s'il a `invalidate_query`, qui a arrêté les mises à jour et une exception sur les tentatives de mise à jour précédentes. [\#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alésapine](https://github.com/alesapin)) +- Correction d'une erreur dans la fonction `arrayReduce` qui peut conduire à “double free” et erreur dans le combinateur de fonction d'agrégat `Resample` que peut provoquer la fuite de mémoire. Fonction agrégée ajoutée `aggThrow`. Cette fonction peut être utilisée à des fins de test. [\#8446](https://github.com/ClickHouse/ClickHouse/pull/8446) ([alexeï-milovidov](https://github.com/alexey-milovidov)) + +#### Amélioration {#improvement-1} + +- Amélioration de la journalisation lorsque vous travaillez avec `S3` tableau moteur. [\#8251](https://github.com/ClickHouse/ClickHouse/pull/8251) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +- Imprimé message d'aide quand aucun argument n'est passé lors de l'appel `clickhouse-local`. Cela corrige [\#5335](https://github.com/ClickHouse/ClickHouse/issues/5335). [\#8230](https://github.com/ClickHouse/ClickHouse/pull/8230) ([Andrey Nagorny](https://github.com/Melancholic)) +- Ajouter un paramètre `mutations_sync` ce qui permet d'attendre `ALTER UPDATE/DELETE` les requêtes de manière synchrone. [\#8237](https://github.com/ClickHouse/ClickHouse/pull/8237) ([alésapine](https://github.com/alesapin)) +- Autoriser à configurer relative `user_files_path` dans `config.xml` (de la manière similaire à `format_schema_path`). [\#7632](https://github.com/ClickHouse/ClickHouse/pull/7632) ([hcz](https://github.com/hczhcz)) +- Ajouter une exception pour les types illégaux pour les fonctions de conversion avec `-OrZero` postfix. [\#7880](https://github.com/ClickHouse/ClickHouse/pull/7880) ([Andrey Konyaev](https://github.com/akonyaev90)) +- Simplifier le format de l'en-tête de l'envoi des données à un serveur dans une requête distribuée. [\#8044](https://github.com/ClickHouse/ClickHouse/pull/8044) ([Vitaly Baranov](https://github.com/vitlibar)) +- `Live View` refactoring du moteur de table. [\#8519](https://github.com/ClickHouse/ClickHouse/pull/8519) ([vzakaznikov](https://github.com/vzakaznikov)) +- Ajoutez des vérifications supplémentaires pour les dictionnaires externes créés à partir de requêtes DDL. [\#8127](https://github.com/ClickHouse/ClickHouse/pull/8127) ([alésapine](https://github.com/alesapin)) +- Correction d'erreur `Column ... already exists` lors de l'utilisation `FINAL` et `SAMPLE` together, e.g. `select count() from table final sample 1/2`. Fixer [\#5186](https://github.com/ClickHouse/ClickHouse/issues/5186). [\#7907](https://github.com/ClickHouse/ClickHouse/pull/7907) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Table maintenant le premier argument de `joinGet` la fonction peut être tableau identifiant. [\#7707](https://github.com/ClickHouse/ClickHouse/pull/7707) ([Amos Oiseau](https://github.com/amosbird)) +- Autoriser l'utilisation des `MaterializedView` avec les sous-requêtes ci-dessus `Kafka` table. [\#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) +- Maintenant, l'arrière-plan se déplace entre les disques, exécutez le pool de threads seprate. [\#7670](https://github.com/ClickHouse/ClickHouse/pull/7670) ([Vladimir Chebotarev](https://github.com/excitoon)) +- `SYSTEM RELOAD DICTIONARY` s'exécute maintenant de manière synchrone. [\#8240](https://github.com/ClickHouse/ClickHouse/pull/8240) ([Vitaly Baranov](https://github.com/vitlibar)) +- Les traces de pile affichent désormais des adresses physiques (décalages dans le fichier objet) au lieu des adresses de mémoire virtuelle (où le fichier objet a été chargé). Qui permet l'utilisation de `addr2line` lorsque binaire est indépendant de la position et ASLR est actif. Cela corrige [\#8360](https://github.com/ClickHouse/ClickHouse/issues/8360). [\#8387](https://github.com/ClickHouse/ClickHouse/pull/8387) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Appuyer une nouvelle syntaxe pour la sécurité de niveau ligne filtres: `…
`. Fixer [\#5779](https://github.com/ClickHouse/ClickHouse/issues/5779). [\#8381](https://github.com/ClickHouse/ClickHouse/pull/8381) ([Ivan](https://github.com/abyss7)) +- Maintenant `cityHash` fonction peut travailler avec `Decimal` et `UUID` type. Fixer [\#5184](https://github.com/ClickHouse/ClickHouse/issues/5184). [\#7693](https://github.com/ClickHouse/ClickHouse/pull/7693) ([Mikhail Korotov](https://github.com/millb)) +- Suppression de la granularité à index fixe (c'était 1024) des journaux système car elle est obsolète après l'implémentation de la granularité adaptative. [\#7698](https://github.com/ClickHouse/ClickHouse/pull/7698) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Serveur de compatibilité MySQL activé lorsque ClickHouse est compilé sans SSL. [\#7852](https://github.com/ClickHouse/ClickHouse/pull/7852) ([Yuriy Baranov](https://github.com/yurriy)) +- Maintenant, les sommes de contrôle du serveur ont distribué des lots, ce qui donne des erreurs plus verbeuses en cas de données corrompues dans le lot. [\#7914](https://github.com/ClickHouse/ClickHouse/pull/7914) ([Azat Khuzhin](https://github.com/azat)) +- Soutien `DROP DATABASE`, `DETACH TABLE`, `DROP TABLE` et `ATTACH TABLE` pour `MySQL` moteur de base de données. [\#8202](https://github.com/ClickHouse/ClickHouse/pull/8202) ([L'Hiver Zhang](https://github.com/zhang2014)) +- Ajouter l'authentification dans la fonction de table S3 et le moteur de table. [\#7623](https://github.com/ClickHouse/ClickHouse/pull/7623) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Ajout de vérifier les pièces supplémentaires de `MergeTree` sur différents disques, afin de ne pas permettre de manquer des parties de données sur des disques indéfinis. [\#8118](https://github.com/ClickHouse/ClickHouse/pull/8118) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Activez la prise en charge SSL pour le client et le serveur Mac. [\#8297](https://github.com/ClickHouse/ClickHouse/pull/8297) ([Ivan](https://github.com/abyss7)) +- Maintenant, ClickHouse peut fonctionner en tant que serveur fédéré MySQL (voir https://dev.mysql.com/doc/refman/5.7/en/federated-create-server.html). [\#7717](https://github.com/ClickHouse/ClickHouse/pull/7717) ([Maxim Fedotov](https://github.com/MaxFedotov)) +- `clickhouse-client` maintenant seulement activer `bracketed-paste` lorsque multiquery est activé et multiline est désactivé. Cette correction (\#7757)\[https://github.com/ClickHouse/ClickHouse/issues/7757\]. [\#7761](https://github.com/ClickHouse/ClickHouse/pull/7761) ([Amos Oiseau](https://github.com/amosbird)) +- Soutien `Array(Decimal)` dans `if` fonction. [\#7721](https://github.com/ClickHouse/ClickHouse/pull/7721) ([Artem Zuikov](https://github.com/4ertus2)) +- Soutien Décimales `arrayDifference`, `arrayCumSum` et `arrayCumSumNegative` fonction. [\#7724](https://github.com/ClickHouse/ClickHouse/pull/7724) ([Artem Zuikov](https://github.com/4ertus2)) +- Ajouter `lifetime` colonne de `system.dictionaries` table. [\#6820](https://github.com/ClickHouse/ClickHouse/issues/6820) [\#7727](https://github.com/ClickHouse/ClickHouse/pull/7727) ([kekekekule](https://github.com/kekekekule)) +- Vérification améliorée des pièces existantes sur différents disques pour `*MergeTree` table des moteurs. Adresse [\#7660](https://github.com/ClickHouse/ClickHouse/issues/7660). [\#8440](https://github.com/ClickHouse/ClickHouse/pull/8440) ([Vladimir Chebotarev](https://github.com/excitoon)) +- L'intégration avec `AWS SDK` pour `S3` interactions qui permet d'utiliser toutes les fonctionnalités S3 hors de la boîte. [\#8011](https://github.com/ClickHouse/ClickHouse/pull/8011) ([Pavel Kovalenko](https://github.com/Jokser)) +- Ajout du support pour les sous-requêtes dans `Live View` table. [\#7792](https://github.com/ClickHouse/ClickHouse/pull/7792) ([vzakaznikov](https://github.com/vzakaznikov)) +- Vérifier à l'aide de `Date` ou `DateTime` colonne de `TTL` des expressions a été supprimé. [\#7920](https://github.com/ClickHouse/ClickHouse/pull/7920) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Informations sur le disque ajouté `system.detached_parts` table. [\#7833](https://github.com/ClickHouse/ClickHouse/pull/7833) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Maintenant paramètres `max_(table|partition)_size_to_drop` peut être modifié sans redémarrage de l'ordinateur. [\#7779](https://github.com/ClickHouse/ClickHouse/pull/7779) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +- Facilité d'utilisation légèrement meilleure des messages d'erreur. Demander à l'utilisateur de ne pas supprimer les lignes ci-dessous `Stack trace:`. [\#7897](https://github.com/ClickHouse/ClickHouse/pull/7897) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mieux lire les messages de `Kafka` moteur dans différents formats après [\#7935](https://github.com/ClickHouse/ClickHouse/issues/7935). [\#8035](https://github.com/ClickHouse/ClickHouse/pull/8035) ([Ivan](https://github.com/abyss7)) +- Meilleure compatibilité avec les clients MySQL qui ne prennent pas en charge `sha2_password` greffon auth. [\#8036](https://github.com/ClickHouse/ClickHouse/pull/8036) ([Yuriy Baranov](https://github.com/yurriy)) +- Supporte plus de types de colonnes dans le serveur de compatibilité MySQL. [\#7975](https://github.com/ClickHouse/ClickHouse/pull/7975) ([Yuriy Baranov](https://github.com/yurriy)) +- Mettre `ORDER BY` optimisation pour les `Merge`, `Buffer` et `Materilized View` stockages avec sous-jacent `MergeTree` table. [\#8130](https://github.com/ClickHouse/ClickHouse/pull/8130) ([Anton Popov](https://github.com/CurtizJ)) +- Maintenant, nous utilisons toujours L'implémentation POSIX de `getrandom` pour avoir une meilleure compatibilité avec les anciens noyaux (\< 3.17). [\#7940](https://github.com/ClickHouse/ClickHouse/pull/7940) ([Amos Oiseau](https://github.com/amosbird)) +- Mieux vaut vérifier la destination valide dans une règle de déplacement TTL. [\#8410](https://github.com/ClickHouse/ClickHouse/pull/8410) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Mieux vérifie cassé insérer des lots pour `Distributed` tableau moteur. [\#7933](https://github.com/ClickHouse/ClickHouse/pull/7933) ([Azat Khuzhin](https://github.com/azat)) +- Ajouter une colonne avec un tableau de nom de pièces que les mutations doivent traiter à l'avenir `system.mutations` table. [\#8179](https://github.com/ClickHouse/ClickHouse/pull/8179) ([alésapine](https://github.com/alesapin)) +- Optimisation de tri de fusion parallèle pour les processeurs. [\#8552](https://github.com/ClickHouse/ClickHouse/pull/8552) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Paramètre `mark_cache_min_lifetime` est maintenant obsolète et ne fait rien. Dans les versions précédentes, mark cache peut croître en mémoire supérieure à `mark_cache_size` pour accommoder les données dans `mark_cache_min_lifetime` deuxième. Cela conduisait à la confusion et à une utilisation de la mémoire plus élevée que prévu, ce qui est particulièrement mauvais sur les systèmes à contraintes de mémoire. Si vous constatez une dégradation des performances après l'installation de cette version, vous devez `mark_cache_size`. [\#8484](https://github.com/ClickHouse/ClickHouse/pull/8484) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Préparation à utiliser `tid` partout. Cela est nécessaire pour [\#7477](https://github.com/ClickHouse/ClickHouse/issues/7477). [\#8276](https://github.com/ClickHouse/ClickHouse/pull/8276) ([alexeï-milovidov](https://github.com/alexey-milovidov)) + +#### Amélioration Des Performances {#performance-improvement-1} + +- Optimisations des performances dans le pipeline de processeurs. [\#7988](https://github.com/ClickHouse/ClickHouse/pull/7988) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Mises à jour non bloquantes des clés expirées dans les dictionnaires de cache (avec autorisation de lire les anciennes). [\#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Compiler ClickHouse sans `-fno-omit-frame-pointer` globalement pour épargner un registre de plus. [\#8097](https://github.com/ClickHouse/ClickHouse/pull/8097) ([Amos Oiseau](https://github.com/amosbird)) +- SpeedUp `greatCircleDistance` fonction et ajouter des tests de performance pour elle. [\#7307](https://github.com/ClickHouse/ClickHouse/pull/7307) ([Olga Khvostikova](https://github.com/stavrolia)) +- Amélioration des performances de la fonction `roundDown`. [\#8465](https://github.com/ClickHouse/ClickHouse/pull/8465) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Amélioration des performances de `max`, `min`, `argMin`, `argMax` pour `DateTime64` type de données. [\#8199](https://github.com/ClickHouse/ClickHouse/pull/8199) ([Vasily Nemkov](https://github.com/Enmk)) +- Amélioration des performances de tri sans limite ou avec une grande limite et le tri externe. [\#8545](https://github.com/ClickHouse/ClickHouse/pull/8545) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Amélioration des performances du formatage des nombres à virgule flottante jusqu'à 6 fois. [\#8542](https://github.com/ClickHouse/ClickHouse/pull/8542) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Amélioration des performances de `modulo` fonction. [\#7750](https://github.com/ClickHouse/ClickHouse/pull/7750) ([Amos Oiseau](https://github.com/amosbird)) +- Optimisé `ORDER BY` et la fusion avec une seule clé de colonne. [\#8335](https://github.com/ClickHouse/ClickHouse/pull/8335) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Meilleure mise en œuvre pour `arrayReduce`, `-Array` et `-State` combinators. [\#7710](https://github.com/ClickHouse/ClickHouse/pull/7710) ([Amos Oiseau](https://github.com/amosbird)) +- Maintenant `PREWHERE` doit être optimisé pour être au moins aussi efficace que l' `WHERE`. [\#7769](https://github.com/ClickHouse/ClickHouse/pull/7769) ([Amos Oiseau](https://github.com/amosbird)) +- Améliorer la façon dont `round` et `roundBankers` manipulation des nombres négatifs. [\#8229](https://github.com/ClickHouse/ClickHouse/pull/8229) ([hcz](https://github.com/hczhcz)) +- Amélioration des performances de décodage `DoubleDelta` et `Gorilla` les codecs par environ de 30 à 40%. Cela corrige [\#7082](https://github.com/ClickHouse/ClickHouse/issues/7082). [\#8019](https://github.com/ClickHouse/ClickHouse/pull/8019) ([Vasily Nemkov](https://github.com/Enmk)) +- Amélioration des performances de `base64` les fonctions connexes. [\#8444](https://github.com/ClickHouse/ClickHouse/pull/8444) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajout d'une fonction `geoDistance`. Il est similaire à `greatCircleDistance` mais utilise l'approximation au modèle ellipsoïde WGS-84. Les performances des deux fonctions sont presque les mêmes. [\#8086](https://github.com/ClickHouse/ClickHouse/pull/8086) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Plus rapide `min` et `max` fonctions d'agrégation pour les `Decimal` type de données. [\#8144](https://github.com/ClickHouse/ClickHouse/pull/8144) ([Artem Zuikov](https://github.com/4ertus2)) +- Vectoriser le traitement `arrayReduce`. [\#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos Oiseau](https://github.com/amosbird)) +- `if` les chaînes sont maintenant optimisés `multiIf`. [\#8355](https://github.com/ClickHouse/ClickHouse/pull/8355) ([kamalov-ruslan](https://github.com/kamalov-ruslan)) +- Correction de la régression des performances de `Kafka` moteur de table introduit en 19.15. Cela corrige [\#7261](https://github.com/ClickHouse/ClickHouse/issues/7261). [\#7935](https://github.com/ClickHouse/ClickHouse/pull/7935) ([filimonov](https://github.com/filimonov)) +- Retiré “pie” génération de code qui `gcc` de paquets Debian apporte parfois par défaut. [\#8483](https://github.com/ClickHouse/ClickHouse/pull/8483) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Formats de données d'analyse parallèle [\#6553](https://github.com/ClickHouse/ClickHouse/pull/6553) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Activer l'analyseur optimisé de `Values` avec des expressions par défaut (`input_format_values_deduce_templates_of_expressions=1`). [\#8231](https://github.com/ClickHouse/ClickHouse/pull/8231) ([tavplubix](https://github.com/tavplubix)) + +#### Construction / Test / Amélioration De L'Emballage {#buildtestingpackaging-improvement-2} + +- Construire des correctifs pour `ARM` et en un minimum de mode. [\#8304](https://github.com/ClickHouse/ClickHouse/pull/8304) ([proller](https://github.com/proller)) +- Ajouter le fichier de couverture flush pour `clickhouse-server` lorsque std::atexit n'est pas appelé. Également légèrement amélioré la journalisation dans les tests sans état avec la couverture. [\#8267](https://github.com/ClickHouse/ClickHouse/pull/8267) ([alésapine](https://github.com/alesapin)) +- Mettre à jour la bibliothèque LLVM dans contrib. Évitez D'utiliser LLVM à partir de paquets OS. [\#8258](https://github.com/ClickHouse/ClickHouse/pull/8258) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Faire empaqueté `curl` construire entièrement calme. [\#8232](https://github.com/ClickHouse/ClickHouse/pull/8232) [\#8203](https://github.com/ClickHouse/ClickHouse/pull/8203) ([Pavel Kovalenko](https://github.com/Jokser)) +- Correction de quelques `MemorySanitizer` avertissement. [\#8235](https://github.com/ClickHouse/ClickHouse/pull/8235) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Utiliser `add_warning` et `no_warning` les macros dans `CMakeLists.txt`. [\#8604](https://github.com/ClickHouse/ClickHouse/pull/8604) ([Ivan](https://github.com/abyss7)) +- Ajout du support de l'objet compatible Minio S3 (https://min.io/) pour de meilleurs tests d'intégration. [\#7863](https://github.com/ClickHouse/ClickHouse/pull/7863) [\#7875](https://github.com/ClickHouse/ClickHouse/pull/7875) ([Pavel Kovalenko](https://github.com/Jokser)) +- Importer `libc` en-têtes à contrib. Il permet de rendre les builds plus cohérents sur différents systèmes (uniquement pour `x86_64-linux-gnu`). [\#5773](https://github.com/ClickHouse/ClickHouse/pull/5773) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Supprimer `-fPIC` à partir de certaines bibliothèques. [\#8464](https://github.com/ClickHouse/ClickHouse/pull/8464) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Propre `CMakeLists.txt` pour le roulage. Tu vois https://github.com/ClickHouse/ClickHouse/pull/8011\#issuecomment-569478910 [\#8459](https://github.com/ClickHouse/ClickHouse/pull/8459) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Avertissements silencieux dans `CapNProto` bibliothèque. [\#8220](https://github.com/ClickHouse/ClickHouse/pull/8220) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Ajouter des tests de performance pour les tables de hachage optimisées par chaîne courte. [\#7679](https://github.com/ClickHouse/ClickHouse/pull/7679) ([Amos Oiseau](https://github.com/amosbird)) +- Maintenant ClickHouse va construire sur `AArch64` même si `MADV_FREE` n'est pas disponible. Cela corrige [\#8027](https://github.com/ClickHouse/ClickHouse/issues/8027). [\#8243](https://github.com/ClickHouse/ClickHouse/pull/8243) ([Amos Oiseau](https://github.com/amosbird)) +- Mettre `zlib-ng` pour résoudre les problèmes de désinfectant de mémoire. [\#7182](https://github.com/ClickHouse/ClickHouse/pull/7182) [\#8206](https://github.com/ClickHouse/ClickHouse/pull/8206) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Activez la bibliothèque MySQL interne sur un système non Linux, car l'utilisation des paquets du système D'exploitation est très fragile et ne fonctionne généralement pas du tout. Cela corrige [\#5765](https://github.com/ClickHouse/ClickHouse/issues/5765). [\#8426](https://github.com/ClickHouse/ClickHouse/pull/8426) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction de la construction sur certains systèmes après activation `libc++`. Cela annule et remplace [\#8374](https://github.com/ClickHouse/ClickHouse/issues/8374). [\#8380](https://github.com/ClickHouse/ClickHouse/pull/8380) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Faire `Field` méthodes plus de type-sûr pour trouver plus d'erreurs. [\#7386](https://github.com/ClickHouse/ClickHouse/pull/7386) [\#8209](https://github.com/ClickHouse/ClickHouse/pull/8209) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Ajout de fichiers manquants à la `libc-headers` sous-module. [\#8507](https://github.com/ClickHouse/ClickHouse/pull/8507) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Corrigé de mal `JSON` citation dans la sortie de test de performance. [\#8497](https://github.com/ClickHouse/ClickHouse/pull/8497) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Maintenant, la trace de pile est affichée pour `std::exception` et `Poco::Exception`. Dans les versions précédentes, il était disponible uniquement pour `DB::Exception`. Cela améliore le diagnostic. [\#8501](https://github.com/ClickHouse/ClickHouse/pull/8501) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Le portage `clock_gettime` et `clock_nanosleep` pour les nouvelles versions glibc. [\#8054](https://github.com/ClickHouse/ClickHouse/pull/8054) ([Amos Oiseau](https://github.com/amosbird)) +- Permettre `part_log` dans l'exemple config pour les développeurs. [\#8609](https://github.com/ClickHouse/ClickHouse/pull/8609) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction de la nature asynchrone du rechargement dans `01036_no_superfluous_dict_reload_on_create_database*`. [\#8111](https://github.com/ClickHouse/ClickHouse/pull/8111) ([Azat Khuzhin](https://github.com/azat)) +- Tests de performance codec fixe. [\#8615](https://github.com/ClickHouse/ClickHouse/pull/8615) ([Vasily Nemkov](https://github.com/Enmk)) +- Ajouter des scripts d'installation pour `.tgz` construire et documentation pour eux. [\#8612](https://github.com/ClickHouse/ClickHouse/pull/8612) [\#8591](https://github.com/ClickHouse/ClickHouse/pull/8591) ([alésapine](https://github.com/alesapin)) +- Supprimé Vieux `ZSTD` test (il a été créé en 2016 pour reproduire le bug que la version pré 1.0 de ZSTD a eu). Cela corrige [\#8618](https://github.com/ClickHouse/ClickHouse/issues/8618). [\#8619](https://github.com/ClickHouse/ClickHouse/pull/8619) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction de la construction sur Mac OS Catalina. [\#8600](https://github.com/ClickHouse/ClickHouse/pull/8600) ([meo](https://github.com/meob)) +- Augmentation du nombre de lignes dans les tests de performance du codec pour rendre les résultats visibles. [\#8574](https://github.com/ClickHouse/ClickHouse/pull/8574) ([Vasily Nemkov](https://github.com/Enmk)) +- Dans les versions debug, traiter `LOGICAL_ERROR` exceptions comme Échecs d'assertion, de sorte qu'ils sont plus faciles à remarquer. [\#8475](https://github.com/ClickHouse/ClickHouse/pull/8475) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Rendre le test de performance lié aux formats plus déterministe. [\#8477](https://github.com/ClickHouse/ClickHouse/pull/8477) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mettre `lz4` pour corriger un échec MemorySanitizer. [\#8181](https://github.com/ClickHouse/ClickHouse/pull/8181) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Supprimer un faux positif MemorySanitizer connu dans la gestion des exceptions. [\#8182](https://github.com/ClickHouse/ClickHouse/pull/8182) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Mettre `gcc` et `g++` à la version 9 dans `build/docker/build.sh` [\#7766](https://github.com/ClickHouse/ClickHouse/pull/7766) ([TLightSky](https://github.com/tlightsky)) +- Ajoutez un cas de test de performance pour tester cela `PREWHERE` est pire que `WHERE`. [\#7768](https://github.com/ClickHouse/ClickHouse/pull/7768) ([Amos Oiseau](https://github.com/amosbird)) +- Progrès vers la fixation d'un test flacky. [\#8621](https://github.com/ClickHouse/ClickHouse/pull/8621) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Évitez le rapport MemorySanitizer pour les données de `libunwind`. [\#8539](https://github.com/ClickHouse/ClickHouse/pull/8539) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Mettre `libc++` la dernière version. [\#8324](https://github.com/ClickHouse/ClickHouse/pull/8324) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Construire la bibliothèque ICU à partir de sources. Cela corrige [\#6460](https://github.com/ClickHouse/ClickHouse/issues/6460). [\#8219](https://github.com/ClickHouse/ClickHouse/pull/8219) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Commutation de `libressl` de `openssl`. ClickHouse devrait prendre en charge TLS 1.3 et SNI après ce changement. Cela corrige [\#8171](https://github.com/ClickHouse/ClickHouse/issues/8171). [\#8218](https://github.com/ClickHouse/ClickHouse/pull/8218) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Rapport UBSan fixe lors de l'utilisation `chacha20_poly1305` de SSL (se produit sur la connexion à https://yandex.ru/). [\#8214](https://github.com/ClickHouse/ClickHouse/pull/8214) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Correction du mode de fichier de mot de passe par défaut pour `.deb` des distributions linux. [\#8075](https://github.com/ClickHouse/ClickHouse/pull/8075) ([proller](https://github.com/proller)) +- Expression améliorée pour obtenir `clickhouse-server` PID dans `clickhouse-test`. [\#8063](https://github.com/ClickHouse/ClickHouse/pull/8063) ([Alexander Kazakov](https://github.com/Akazz)) +- Mise à jour contrib / googletest à v1. 10. 0. [\#8587](https://github.com/ClickHouse/ClickHouse/pull/8587) ([Alexander Burmak](https://github.com/Alex-Burmak)) +- Rapport ThreadSaninitizer fixe dans `base64` bibliothèque. Aussi mis à jour cette bibliothèque à la dernière version, mais cela n'a pas d'importance. Cela corrige [\#8397](https://github.com/ClickHouse/ClickHouse/issues/8397). [\#8403](https://github.com/ClickHouse/ClickHouse/pull/8403) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Fixer `00600_replace_running_query` pour les transformateurs. [\#8272](https://github.com/ClickHouse/ClickHouse/pull/8272) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Supprimer le support pour `tcmalloc` faire `CMakeLists.txt` plus simple. [\#8310](https://github.com/ClickHouse/ClickHouse/pull/8310) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Libérer gcc construit maintenant utiliser `libc++` plutôt `libstdc++`. Récemment `libc++` a été utilisé uniquement avec clang. Cela améliorera la cohérence des configurations de construction et la portabilité. [\#8311](https://github.com/ClickHouse/ClickHouse/pull/8311) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Activer la bibliothèque ICU pour construire avec MemorySanitizer. [\#8222](https://github.com/ClickHouse/ClickHouse/pull/8222) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Supprimer les avertissements de `CapNProto` bibliothèque. [\#8224](https://github.com/ClickHouse/ClickHouse/pull/8224) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Suppression de cas spéciaux de code pour `tcmalloc` parce que c'est plus pris en charge. [\#8225](https://github.com/ClickHouse/ClickHouse/pull/8225) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Dans la tâche de couverture CI, tuez le serveur gracieusement pour lui permettre d'enregistrer le rapport de couverture. Cela corrige les rapports de couverture incomplets que nous avons vus récemment. [\#8142](https://github.com/ClickHouse/ClickHouse/pull/8142) ([alésapine](https://github.com/alesapin)) +- Tests de Performance pour tous les codecs contre `Float64` et `UInt64` valeur. [\#8349](https://github.com/ClickHouse/ClickHouse/pull/8349) ([Vasily Nemkov](https://github.com/Enmk)) +- `termcap` est très obsolète et conduit à divers problèmes (F. G. manquant “up” cap et en écho `^J` au lieu de multi-ligne) . Faveur `terminfo` ou groupés `ncurses`. [\#7737](https://github.com/ClickHouse/ClickHouse/pull/7737) ([Amos Oiseau](https://github.com/amosbird)) +- Fixer `test_storage_s3` test d'intégration. [\#7734](https://github.com/ClickHouse/ClickHouse/pull/7734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Soutien `StorageFile(, null)` pour insérer un bloc dans un fichier de format donné sans écrire sur le disque. Ceci est requis pour les tests de performance. [\#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos Oiseau](https://github.com/amosbird)) +- Argument supplémentaire en `--print-time` aux tests fonctionnels qui imprime le temps d'exécution par test. [\#8001](https://github.com/ClickHouse/ClickHouse/pull/8001) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Ajouté assertions à `KeyCondition` lors de L'évaluation RPN. Cela corrigera l'avertissement de gcc-9. [\#8279](https://github.com/ClickHouse/ClickHouse/pull/8279) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Vider les options cmake dans les builds CI. [\#8273](https://github.com/ClickHouse/ClickHouse/pull/8273) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Ne générez pas d'informations de débogage pour certaines bibliothèques fat. [\#8271](https://github.com/ClickHouse/ClickHouse/pull/8271) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Faire `log_to_console.xml` connectez-vous toujours à stderr, que ce soit interactif ou non. [\#8395](https://github.com/ClickHouse/ClickHouse/pull/8395) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Suppression de certaines fonctionnalités inutilisées de `clickhouse-performance-test` outil. [\#8555](https://github.com/ClickHouse/ClickHouse/pull/8555) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Maintenant, nous allons également rechercher `lld-X` avec correspondant `clang-X` version. [\#8092](https://github.com/ClickHouse/ClickHouse/pull/8092) ([alésapine](https://github.com/alesapin)) +- Amélioration de construction de Parquet. [\#8421](https://github.com/ClickHouse/ClickHouse/pull/8421) ([maxulan](https://github.com/maxulan)) +- Plus D'Avertissements GCC [\#8221](https://github.com/ClickHouse/ClickHouse/pull/8221) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +- Package pour Arch Linux permet maintenant d'exécuter le serveur ClickHouse, et pas seulement le client. [\#8534](https://github.com/ClickHouse/ClickHouse/pull/8534) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixer le test avec les processeurs. Corrections de performances minuscules. [\#7672](https://github.com/ClickHouse/ClickHouse/pull/7672) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Mise à jour contrib/protobuf. [\#8256](https://github.com/ClickHouse/ClickHouse/pull/8256) ([Matwey V. Kornilov](https://github.com/matwey)) +- En préparation du passage à c++20 comme une célébration du Nouvel An. “May the C++ force be with ClickHouse.” [\#8447](https://github.com/ClickHouse/ClickHouse/pull/8447) ([Amos Oiseau](https://github.com/amosbird)) + +#### Caractéristique Expérimentale {#experimental-feature-1} + +- Ajouté cadre expérimental `min_bytes_to_use_mmap_io`. Il permet de lire de gros fichiers sans copier les données du noyau vers l'espace utilisateur. Le paramètre est désactivé par défaut. Le seuil recommandé est d'environ 64 Mo, car mmap / munmap est lent. [\#8520](https://github.com/ClickHouse/ClickHouse/pull/8520) ([alexeï-milovidov](https://github.com/alexey-milovidov)) +- Quotas retravaillés dans le cadre du système de contrôle d'accès. Ajouté nouveau tableau `system.quotas` de nouvelles fonctions `currentQuota`, `currentQuotaKey`, nouvelle syntaxe SQL `CREATE QUOTA`, `ALTER QUOTA`, `DROP QUOTA`, `SHOW QUOTA`. [\#7257](https://github.com/ClickHouse/ClickHouse/pull/7257) ([Vitaly Baranov](https://github.com/vitlibar)) +- Autoriser à sauter des paramètres inconnus avec des avertissements au lieu de lancer des exceptions. [\#7653](https://github.com/ClickHouse/ClickHouse/pull/7653) ([Vitaly Baranov](https://github.com/vitlibar)) +- Stratégies de ligne retravaillées dans le cadre du système de contrôle d'accès. Ajouté nouveau tableau `system.row_policies`, nouvelle fonction `currentRowPolicies()`, nouvelle syntaxe SQL `CREATE POLICY`, `ALTER POLICY`, `DROP POLICY`, `SHOW CREATE POLICY`, `SHOW POLICIES`. [\#7808](https://github.com/ClickHouse/ClickHouse/pull/7808) ([Vitaly Baranov](https://github.com/vitlibar)) + +#### Correction De Sécurité {#security-fix} + +- Correction de la possibilité de lire la structure des répertoires dans les tables avec `File` tableau moteur. Cela corrige [\#8536](https://github.com/ClickHouse/ClickHouse/issues/8536). [\#8537](https://github.com/ClickHouse/ClickHouse/pull/8537) ([alexeï-milovidov](https://github.com/alexey-milovidov)) + +## [Changelog pour 2019](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/changelog/2019.md) {#changelog-for-2019} diff --git a/docs/fr/commercial/cloud.md b/docs/fr/commercial/cloud.md new file mode 100644 index 00000000000..ec592154f52 --- /dev/null +++ b/docs/fr/commercial/cloud.md @@ -0,0 +1,20 @@ +--- +machine_translated: true +--- + +# Fournisseurs De Services Cloud ClickHouse {#clickhouse-cloud-service-providers} + +!!! info "Info" + Si vous avez lancé un cloud public avec un service clickhouse géré, n'hésitez pas à [ouvrir une demande d'extraction](https://github.com/ClickHouse/ClickHouse/edit/master/docs/en/commercial/cloud.md) ajouter à la liste suivante. + +## Yandex Cloud {#yandex-cloud} + +[Service géré Yandex pour ClickHouse](https://cloud.yandex.com/services/managed-clickhouse?utm_source=referrals&utm_medium=clickhouseofficialsite&utm_campaign=link3) offre les fonctionnalités suivantes: + +- Service ZooKeeper entièrement géré pour [Réplication de ClickHouse](../operations/table_engines/replication.md) +- Choix multiples de type de stockage +- Répliques dans différentes zones de disponibilité +- Le chiffrement et l'isolement +- Automatisation de la maintenance + +{## [Article Original](https://clickhouse.tech/docs/en/commercial/cloud/) ##} diff --git a/docs/fr/data_types/array.md b/docs/fr/data_types/array.md new file mode 100644 index 00000000000..f20abaabc49 --- /dev/null +++ b/docs/fr/data_types/array.md @@ -0,0 +1,74 @@ +--- +machine_translated: true +--- + +# Array(T) {#data-type-array} + +Un tableau de `T`les éléments de type. `T` peut être n'importe quel type de données, y compris un tableau. + +## La création d'un tableau {#creating-an-array} + +Vous pouvez utiliser une fonction pour créer un tableau: + +``` sql +array(T) +``` + +Vous pouvez également utiliser des crochets. + +``` sql +[] +``` + +Exemple de création d'un tableau: + +``` sql +SELECT array(1, 2) AS x, toTypeName(x) +``` + +``` text +┌─x─────┬─toTypeName(array(1, 2))─┐ +│ [1,2] │ Array(UInt8) │ +└───────┴─────────────────────────┘ +``` + +``` sql +SELECT [1, 2] AS x, toTypeName(x) +``` + +``` text +┌─x─────┬─toTypeName([1, 2])─┐ +│ [1,2] │ Array(UInt8) │ +└───────┴────────────────────┘ +``` + +## Utilisation de Types de données {#working-with-data-types} + +Lors de la création d'un tableau à la volée, ClickHouse définit automatiquement le type d'argument comme le type de données le plus étroit pouvant stocker tous les arguments listés. S'il y a des [Nullable](nullable.md#data_type-nullable) ou littéral [NULL](../query_language/syntax.md#null-literal) les valeurs, le type d'un élément de tableau devient également [Nullable](nullable.md). + +Si ClickHouse n'a pas pu déterminer le type de données, il génère une exception. Par exemple, cela se produit lorsque vous essayez de créer un tableau avec des chaînes et des nombres simultanément (`SELECT array(1, 'a')`). + +Exemples de détection automatique de type de données: + +``` sql +SELECT array(1, 2, NULL) AS x, toTypeName(x) +``` + +``` text +┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐ +│ [1,2,NULL] │ Array(Nullable(UInt8)) │ +└────────────┴───────────────────────────────┘ +``` + +Si vous essayez de créer un tableau de types de données incompatibles, ClickHouse lève une exception: + +``` sql +SELECT array(1, 'a') +``` + +``` text +Received exception from server (version 1.1.54388): +Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not. +``` + +[Article Original](https://clickhouse.tech/docs/en/data_types/array/) diff --git a/docs/fr/data_types/boolean.md b/docs/fr/data_types/boolean.md new file mode 100644 index 00000000000..693709cda9f --- /dev/null +++ b/docs/fr/data_types/boolean.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Les Valeurs Booléennes {#boolean-values} + +Il n'y a pas de type distinct pour les valeurs booléennes. Utilisez le type UInt8, limité aux valeurs 0 ou 1. + +[Article Original](https://clickhouse.tech/docs/en/data_types/boolean/) diff --git a/docs/fr/data_types/date.md b/docs/fr/data_types/date.md new file mode 100644 index 00000000000..812b0682cd2 --- /dev/null +++ b/docs/fr/data_types/date.md @@ -0,0 +1,12 @@ +--- +machine_translated: true +--- + +# Date {#date} + +Date. Stocké en deux octets comme le nombre de jours depuis 1970-01-01 (non signé). Permet de stocker des valeurs juste après le début de L'époque Unix jusqu'au seuil supérieur défini par une constante au stade de la compilation (actuellement, c'est jusqu'à l'année 2106, mais l'année finale entièrement prise en charge est 2105). +La valeur minimale est sortie comme 0000-00-00. + +La valeur de date est stockée sans le fuseau horaire. + +[Article Original](https://clickhouse.tech/docs/en/data_types/date/) diff --git a/docs/fr/data_types/datetime.md b/docs/fr/data_types/datetime.md new file mode 100644 index 00000000000..797364b3f51 --- /dev/null +++ b/docs/fr/data_types/datetime.md @@ -0,0 +1,126 @@ +--- +machine_translated: true +--- + +# DateTime {#data_type-datetime} + +Permet de stocker un instant dans le temps, qui peut être exprimé comme une date de calendrier et une heure d'une journée. + +Syntaxe: + +``` sql +DateTime([timezone]) +``` + +Plage de valeurs prise en charge: \[1970-01-01 00:00:00, 2105-12-31 23:59:59\]. + +Résolution: 1 seconde. + +## Utilisation Remarques {#usage-remarks} + +Le point dans le temps est enregistré en tant que [Le timestamp Unix](https://en.wikipedia.org/wiki/Unix_time), quel que soit le fuseau horaire ou l'heure d'été. En outre, l' `DateTime` type peut stocker le fuseau horaire qui est le même pour la colonne entière, qui affecte la façon dont les valeurs de la `DateTime` les valeurs de type sont affichées au format texte et comment les valeurs spécifiées en tant que chaînes sont analysées (‘2020-01-01 05:00:01’). Le fuseau horaire n'est pas stocké dans les lignes de la table (ou dans resultset), mais est stocké dans les métadonnées de la colonne. +Une liste des fuseaux horaires pris en charge peut être trouvée dans le [Base de données de fuseau horaire IANA](https://www.iana.org/time-zones). +Le `tzdata` paquet, contenant [Base de données de fuseau horaire IANA](https://www.iana.org/time-zones), doit être installé dans le système. L'utilisation de la `timedatectl list-timezones` commande pour lister les fuseaux horaires connus par un système local. + +Vous pouvez définir explicitement un fuseau horaire `DateTime`- tapez des colonnes lors de la création d'une table. Si le fuseau horaire n'est pas défini, ClickHouse utilise la valeur [fuseau](../operations/server_settings/settings.md#server_settings-timezone) paramètre dans les paramètres du serveur ou les paramètres du système d'exploitation au moment du démarrage du serveur ClickHouse. + +Le [clickhouse-client](../interfaces/cli.md) applique le fuseau horaire du serveur par défaut si un fuseau horaire n'est pas explicitement défini lors de l'initialisation du type de données. Pour utiliser le fuseau horaire du client, exécutez `clickhouse-client` avec l' `--use_client_time_zone` paramètre. + +Clickhouse affiche les valeurs dans `YYYY-MM-DD hh:mm:ss` format de texte par défaut. Vous pouvez modifier la sortie avec le [formatDateTime](../query_language/functions/date_time_functions.md#formatdatetime) fonction. + +Lorsque vous insérez des données dans ClickHouse, vous pouvez utiliser différents formats de chaînes de date et d'heure, en fonction de la valeur du [date\_time\_input\_format](../operations/settings/settings.md#settings-date_time_input_format) paramètre. + +## Exemple {#examples} + +**1.** Création d'une table avec un `DateTime`- tapez la colonne et insérez des données dedans: + +``` sql +CREATE TABLE dt +( + `timestamp` DateTime('Europe/Moscow'), + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +INSERT INTO dt Values (1546300800, 1), ('2019-01-01 00:00:00', 2); +``` + +``` sql +SELECT * FROM dt; +``` + +``` text +┌───────────timestamp─┬─event_id─┐ +│ 2019-01-01 03:00:00 │ 1 │ +│ 2019-01-01 00:00:00 │ 2 │ +└─────────────────────┴──────────┘ +``` + +- Lors de l'insertion de datetime en tant qu'entier, il est traité comme un horodatage Unix (UTC). `1546300800` représenter `'2019-01-01 00:00:00'` L'UTC. Cependant, comme `timestamp` la colonne a `Europe/Moscow` (UTC+3) fuseau horaire spécifié, lors de la sortie en tant que chaîne, la valeur sera affichée comme `'2019-01-01 03:00:00'` +- Lors de l'insertion d'une valeur de chaîne en tant que datetime, elle est traitée comme étant dans le fuseau horaire de la colonne. `'2019-01-01 00:00:00'` sera considérée comme étant en `Europe/Moscow` fuseau horaire et enregistré sous `1546290000`. + +**2.** Le filtrage sur `DateTime` valeur + +``` sql +SELECT * FROM dt WHERE timestamp = toDateTime('2019-01-01 00:00:00', 'Europe/Moscow') +``` + +``` text +┌───────────timestamp─┬─event_id─┐ +│ 2019-01-01 00:00:00 │ 2 │ +└─────────────────────┴──────────┘ +``` + +`DateTime` les valeurs de colonne peuvent être filtrées à l'aide d'une `WHERE` prédicat. Elle sera convertie `DateTime` automatiquement: + +``` sql +SELECT * FROM dt WHERE timestamp = '2019-01-01 00:00:00' +``` + +``` text +┌───────────timestamp─┬─event_id─┐ +│ 2019-01-01 03:00:00 │ 1 │ +└─────────────────────┴──────────┘ +``` + +**3.** Obtenir un fuseau horaire pour un `DateTime`colonne de type: + +``` sql +SELECT toDateTime(now(), 'Europe/Moscow') AS column, toTypeName(column) AS x +``` + +``` text +┌──────────────column─┬─x─────────────────────────┐ +│ 2019-10-16 04:12:04 │ DateTime('Europe/Moscow') │ +└─────────────────────┴───────────────────────────┘ +``` + +**4.** Conversion de fuseau horaire + +``` sql +SELECT +toDateTime(timestamp, 'Europe/London') as lon_time, +toDateTime(timestamp, 'Europe/Moscow') as mos_time +FROM dt +``` + +``` text +┌───────────lon_time──┬────────────mos_time─┐ +│ 2019-01-01 00:00:00 │ 2019-01-01 03:00:00 │ +│ 2018-12-31 21:00:00 │ 2019-01-01 00:00:00 │ +└─────────────────────┴─────────────────────┘ +``` + +## Voir Aussi {#see-also} + +- [Fonctions de conversion de Type](../query_language/functions/type_conversion_functions.md) +- [Fonctions pour travailler avec des dates et des heures](../query_language/functions/date_time_functions.md) +- [Fonctions pour travailler avec des tableaux](../query_language/functions/array_functions.md) +- [Le `date_time_input_format` paramètre](../operations/settings/settings.md#settings-date_time_input_format) +- [Le `timezone` paramètre de configuration du serveur](../operations/server_settings/settings.md#server_settings-timezone) +- [Opérateurs pour travailler avec des dates et des heures](../query_language/operators.md#operators-datetime) +- [Le `Date` type de données](date.md) + +[Article Original](https://clickhouse.tech/docs/en/data_types/datetime/) diff --git a/docs/fr/data_types/datetime64.md b/docs/fr/data_types/datetime64.md new file mode 100644 index 00000000000..3b9acff1731 --- /dev/null +++ b/docs/fr/data_types/datetime64.md @@ -0,0 +1,101 @@ +--- +machine_translated: true +--- + +# DateTime64 {#data_type-datetime64} + +Permet de stocker un instant dans le temps, qui peut être exprimé comme une date de calendrier et une heure d'un jour, avec une précision de sous-seconde définie + +Tick taille (précision): 10-précision deuxième + +Syntaxe: + +``` sql +DateTime64(precision, [timezone]) +``` + +En interne, stocke les données comme un certain nombre de ‘ticks’ depuis le début de l'époque (1970-01-01 00: 00: 00 UTC) comme Int64. La résolution des tiques est déterminée par le paramètre de précision. En outre, l' `DateTime64` type peut stocker le fuseau horaire qui est le même pour la colonne entière, qui affecte la façon dont les valeurs de la `DateTime64` les valeurs de type sont affichées au format texte et comment les valeurs spécifiées en tant que chaînes sont analysées (‘2020-01-01 05:00:01.000’). Le fuseau horaire n'est pas stocké dans les lignes de la table (ou dans resultset), mais est stocké dans les métadonnées de la colonne. Voir les détails dans [DateTime](datetime.md). + +## Exemple {#examples} + +**1.** Création d'une table avec `DateTime64`- tapez la colonne et insérez des données dedans: + +``` sql +CREATE TABLE dt +( + `timestamp` DateTime64(3, 'Europe/Moscow'), + `event_id` UInt8 +) +ENGINE = TinyLog +``` + +``` sql +INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2) +``` + +``` sql +SELECT * FROM dt +``` + +``` text +┌───────────────timestamp─┬─event_id─┐ +│ 2019-01-01 03:00:00.000 │ 1 │ +│ 2019-01-01 00:00:00.000 │ 2 │ +└─────────────────────────┴──────────┘ +``` + +- Lors de l'insertion de datetime en tant qu'entier, il est traité comme un horodatage Unix (UTC) mis à l'échelle de manière appropriée. `1546300800000` (avec précision 3) représente `'2019-01-01 00:00:00'` L'UTC. Cependant, comme `timestamp` la colonne a `Europe/Moscow` (UTC+3) fuseau horaire spécifié, lors de la sortie sous forme de chaîne, la valeur sera affichée comme `'2019-01-01 03:00:00'` +- Lors de l'insertion d'une valeur de chaîne en tant que datetime, elle est traitée comme étant dans le fuseau horaire de la colonne. `'2019-01-01 00:00:00'` sera considérée comme étant en `Europe/Moscow` fuseau horaire et stocké comme `1546290000000`. + +**2.** Le filtrage sur `DateTime64` valeur + +``` sql +SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Europe/Moscow') +``` + +``` text +┌───────────────timestamp─┬─event_id─┐ +│ 2019-01-01 00:00:00.000 │ 2 │ +└─────────────────────────┴──────────┘ +``` + +Contrairement `DateTime`, `DateTime64` les valeurs ne sont pas converties depuis `String` automatiquement + +**3.** Obtenir un fuseau horaire pour un `DateTime64`-le type de la valeur: + +``` sql +SELECT toDateTime64(now(), 3, 'Europe/Moscow') AS column, toTypeName(column) AS x +``` + +``` text +┌──────────────────column─┬─x──────────────────────────────┐ +│ 2019-10-16 04:12:04.000 │ DateTime64(3, 'Europe/Moscow') │ +└─────────────────────────┴────────────────────────────────┘ +``` + +**4.** Conversion de fuseau horaire + +``` sql +SELECT +toDateTime64(timestamp, 3, 'Europe/London') as lon_time, +toDateTime64(timestamp, 3, 'Europe/Moscow') as mos_time +FROM dt +``` + +``` text +┌───────────────lon_time──┬────────────────mos_time─┐ +│ 2019-01-01 00:00:00.000 │ 2019-01-01 03:00:00.000 │ +│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │ +└─────────────────────────┴─────────────────────────┘ +``` + +## Voir Aussi {#see-also} + +- [Fonctions de conversion de Type](../query_language/functions/type_conversion_functions.md) +- [Fonctions pour travailler avec des dates et des heures](../query_language/functions/date_time_functions.md) +- [Fonctions pour travailler avec des tableaux](../query_language/functions/array_functions.md) +- [Le `date_time_input_format` paramètre](../operations/settings/settings.md#settings-date_time_input_format) +- [Le `timezone` paramètre de configuration du serveur](../operations/server_settings/settings.md#server_settings-timezone) +- [Opérateurs pour travailler avec des dates et des heures](../query_language/operators.md#operators-datetime) +- [`Date` type de données](date.md) +- [`DateTime` type de données](datetime.md) diff --git a/docs/fr/data_types/decimal.md b/docs/fr/data_types/decimal.md new file mode 100644 index 00000000000..902df0d9519 --- /dev/null +++ b/docs/fr/data_types/decimal.md @@ -0,0 +1,106 @@ +--- +machine_translated: true +--- + +# Décimal (P, S), Décimal32 (S), Décimal64 (S), Décimal128 (S) {#decimalp-s-decimal32s-decimal64s-decimal128s} + +Nombres à points fixes signés qui conservent la précision pendant les opérations d'addition, de soustraction et de multiplication. Pour la division, les chiffres les moins significatifs sont ignorés (non arrondis). + +## Paramètre {#parameters} + +- P-précision. Plage valide: \[1: 38 \]. Détermine le nombre de chiffres décimaux nombre peut avoir (fraction y compris). +- S - échelle. Plage valide: \[0: P \]. Détermine le nombre de chiffres décimaux fraction peut avoir. + +En fonction de P Paramètre Valeur décimal (P, S) est un synonyme de: +- P à partir de \[ 1: 9\] - Pour Décimal32 (S) +- P à partir de \[10: 18\] - pour Décimal64 (S) +- P à partir de \[19: 38\] - pour Décimal128 (S) + +## Plages de valeurs décimales {#decimal-value-ranges} + +- Décimal32 (S) - ( -1 \* 10^(9 - S), 1 \* 10^(9-S) ) +- Décimal64 (S) - ( -1 \* 10^(18 - S), 1 \* 10^(18-S) ) +- Décimal128 (S) - ( -1 \* 10^(38 - S), 1 \* 10^(38-S) ) + +Par exemple, Decimal32(4) peut contenir des nombres de -99999.9999 à 99999.9999 avec 0,0001 étape. + +## Représentation interne {#internal-representation} + +En interne, les données sont représentées comme des entiers signés normaux avec une largeur de bit respective. Les plages de valeurs réelles qui peuvent être stockées en mémoire sont un peu plus grandes que celles spécifiées ci-dessus, qui sont vérifiées uniquement lors de la conversion à partir d'une chaîne. + +Parce que les processeurs modernes ne prennent pas en charge les entiers 128 bits nativement, les opérations sur Decimal128 sont émulées. Pour cette raison, Decimal128 fonctionne significativement plus lentement que Decimal32 / Decimal64. + +## Opérations et type de résultat {#operations-and-result-type} + +Les opérations binaires sur le résultat décimal dans le type de résultat plus large (avec n'importe quel ordre d'arguments). + +- Décimal64 (S1) Decimal32 (S2) - \> Decimal64 (S) +- Décimal128 (S1) Decimal32 (S2) - \> Decimal128 (S) +- Décimal128 (S1) Decimal64 (S2) - \> Decimal128 (S) + +Règles pour l'échelle: + +- ajouter, soustraire: S = max (S1, S2). +- multuply: S = S1 + S2. +- diviser: S = S1. + +Pour des opérations similaires entre décimal et entier, le résultat est Décimal de la même taille qu'un argument. + +Les opérations entre Decimal et Float32 / Float64 ne sont pas définies. Si vous en avez besoin, vous pouvez explicitement lancer l'un des arguments en utilisant les builtins toDecimal32, toDecimal64, toDecimal128 ou toFloat32, toFloat64. Gardez à l'esprit que le résultat perdra de la précision et que la conversion de type est une opération coûteuse en calcul. + +Certaines fonctions sur le résultat de retour décimal comme Float64 (par exemple, var ou stddev). Les calculs intermédiaires peuvent toujours être effectués en décimal, ce qui peut conduire à des résultats différents entre les entrées Float64 et Decimal avec les mêmes valeurs. + +## Contrôles de débordement {#overflow-checks} + +Pendant les calculs sur Décimal, des débordements entiers peuvent se produire. Les chiffres excessifs dans une fraction sont éliminés (non arrondis). Les chiffres excessifs dans la partie entière conduiront à une exception. + +``` sql +SELECT toDecimal32(2, 4) AS x, x / 3 +``` + +``` text +┌──────x─┬─divide(toDecimal32(2, 4), 3)─┐ +│ 2.0000 │ 0.6666 │ +└────────┴──────────────────────────────┘ +``` + +``` sql +SELECT toDecimal32(4.2, 8) AS x, x * x +``` + +``` text +DB::Exception: Scale is out of bounds. +``` + +``` sql +SELECT toDecimal32(4.2, 8) AS x, 6 * x +``` + +``` text +DB::Exception: Decimal math overflow. +``` + +Les contrôles de débordement entraînent un ralentissement des opérations. S'il est connu que les débordements ne sont pas possibles, il est logique de désactiver les contrôles en utilisant `decimal_check_overflow` paramètre. Lorsque des contrôles sont désactivés et le débordement se produit, le résultat sera faux: + +``` sql +SET decimal_check_overflow = 0; +SELECT toDecimal32(4.2, 8) AS x, 6 * x +``` + +``` text +┌──────────x─┬─multiply(6, toDecimal32(4.2, 8))─┐ +│ 4.20000000 │ -17.74967296 │ +└────────────┴──────────────────────────────────┘ +``` + +Les contrôles de débordement se produisent non seulement sur les opérations arithmétiques mais aussi sur la comparaison de valeurs: + +``` sql +SELECT toDecimal32(1, 8) < 100 +``` + +``` text +DB::Exception: Can't compare. +``` + +[Article Original](https://clickhouse.tech/docs/en/data_types/decimal/) diff --git a/docs/fr/data_types/domains/ipv4.md b/docs/fr/data_types/domains/ipv4.md new file mode 100644 index 00000000000..bba8fcaf1e1 --- /dev/null +++ b/docs/fr/data_types/domains/ipv4.md @@ -0,0 +1,81 @@ +--- +machine_translated: true +--- + +## IPv4 {#ipv4} + +`IPv4` est un domaine basé sur `UInt32` tapez et sert de remplacement typé pour stocker des valeurs IPv4. Il fournit un stockage compact avec le format d'entrée-sortie convivial et les informations de type de colonne sur l'inspection. + +### Utilisation De Base {#basic-usage} + +``` sql +CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY url; + +DESCRIBE TABLE hits; +``` + +``` text +┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐ +│ url │ String │ │ │ │ │ +│ from │ IPv4 │ │ │ │ │ +└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┘ +``` + +Ou vous pouvez utiliser le domaine IPv4 comme clé: + +``` sql +CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY from; +``` + +`IPv4` le domaine prend en charge le format d'entrée personnalisé en tant que chaînes IPv4: + +``` sql +INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '116.253.40.133')('https://clickhouse.tech', '183.247.232.58')('https://clickhouse.yandex/docs/en/', '116.106.34.242'); + +SELECT * FROM hits; +``` + +``` text +┌─url────────────────────────────────┬───────────from─┐ +│ https://clickhouse.tech/docs/en/ │ 116.106.34.242 │ +│ https://wikipedia.org │ 116.253.40.133 │ +│ https://clickhouse.tech │ 183.247.232.58 │ +└────────────────────────────────────┴────────────────┘ +``` + +Les valeurs sont stockées sous forme binaire compacte: + +``` sql +SELECT toTypeName(from), hex(from) FROM hits LIMIT 1; +``` + +``` text +┌─toTypeName(from)─┬─hex(from)─┐ +│ IPv4 │ B7F7E83A │ +└──────────────────┴───────────┘ +``` + +Les valeurs de domaine ne sont pas implicitement convertibles en types autres que `UInt32`. +Si vous voulez convertir `IPv4` valeur à une chaîne, vous devez le faire explicitement avec `IPv4NumToString()` fonction: + +``` sql +SELECT toTypeName(s), IPv4NumToString(from) as s FROM hits LIMIT 1; +``` + + ┌─toTypeName(IPv4NumToString(from))─┬─s──────────────┐ + │ String │ 183.247.232.58 │ + └───────────────────────────────────┴────────────────┘ + +Ou coulé à un `UInt32` valeur: + +``` sql +SELECT toTypeName(i), CAST(from as UInt32) as i FROM hits LIMIT 1; +``` + +``` text +┌─toTypeName(CAST(from, 'UInt32'))─┬──────────i─┐ +│ UInt32 │ 3086477370 │ +└──────────────────────────────────┴────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/data_types/domains/ipv4) diff --git a/docs/fr/data_types/domains/ipv6.md b/docs/fr/data_types/domains/ipv6.md new file mode 100644 index 00000000000..52cc1c92536 --- /dev/null +++ b/docs/fr/data_types/domains/ipv6.md @@ -0,0 +1,83 @@ +--- +machine_translated: true +--- + +## IPv6 {#ipv6} + +`IPv6` est un domaine basé sur `FixedString(16)` tapez et sert de remplacement typé pour stocker des valeurs IPv6. Il fournit un stockage compact avec le format d'entrée-sortie convivial et les informations de type de colonne sur l'inspection. + +### Utilisation De Base {#basic-usage} + +``` sql +CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY url; + +DESCRIBE TABLE hits; +``` + +``` text +┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐ +│ url │ String │ │ │ │ │ +│ from │ IPv6 │ │ │ │ │ +└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┘ +``` + +Ou vous pouvez utiliser `IPv6` domaine comme l'un des principaux: + +``` sql +CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY from; +``` + +`IPv6` le domaine prend en charge l'entrée personnalisée en tant que chaînes IPv6: + +``` sql +INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '2a02:aa08:e000:3100::2')('https://clickhouse.tech', '2001:44c8:129:2632:33:0:252:2')('https://clickhouse.yandex/docs/en/', '2a02:e980:1e::1'); + +SELECT * FROM hits; +``` + +``` text +┌─url────────────────────────────────┬─from──────────────────────────┐ +│ https://clickhouse.tech │ 2001:44c8:129:2632:33:0:252:2 │ +│ https://clickhouse.tech/docs/en/ │ 2a02:e980:1e::1 │ +│ https://wikipedia.org │ 2a02:aa08:e000:3100::2 │ +└────────────────────────────────────┴───────────────────────────────┘ +``` + +Les valeurs sont stockées sous forme binaire compacte: + +``` sql +SELECT toTypeName(from), hex(from) FROM hits LIMIT 1; +``` + +``` text +┌─toTypeName(from)─┬─hex(from)────────────────────────┐ +│ IPv6 │ 200144C8012926320033000002520002 │ +└──────────────────┴──────────────────────────────────┘ +``` + +Les valeurs de domaine ne sont pas implicitement convertibles en types autres que `FixedString(16)`. +Si vous voulez convertir `IPv6` valeur à une chaîne, vous devez le faire explicitement avec `IPv6NumToString()` fonction: + +``` sql +SELECT toTypeName(s), IPv6NumToString(from) as s FROM hits LIMIT 1; +``` + +``` text +┌─toTypeName(IPv6NumToString(from))─┬─s─────────────────────────────┐ +│ String │ 2001:44c8:129:2632:33:0:252:2 │ +└───────────────────────────────────┴───────────────────────────────┘ +``` + +Ou coulé à un `FixedString(16)` valeur: + +``` sql +SELECT toTypeName(i), CAST(from as FixedString(16)) as i FROM hits LIMIT 1; +``` + +``` text +┌─toTypeName(CAST(from, 'FixedString(16)'))─┬─i───────┐ +│ FixedString(16) │ ��� │ +└───────────────────────────────────────────┴─────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/data_types/domains/ipv6) diff --git a/docs/fr/data_types/domains/overview.md b/docs/fr/data_types/domains/overview.md new file mode 100644 index 00000000000..c7341b2252f --- /dev/null +++ b/docs/fr/data_types/domains/overview.md @@ -0,0 +1,29 @@ +--- +machine_translated: true +--- + +# Domaine {#domains} + +Les domaines sont des types spéciaux qui ajoutent des fonctionnalités supplémentaires au sommet du type de base existant, mais en laissant le format on-wire et on-disc du type de données sous-jacent intact. À l'heure actuelle, ClickHouse ne prend pas en charge les domaines définis par l'utilisateur. + +Vous pouvez utiliser des domaines partout type de base correspondant peut être utilisé, par exemple: + +- Créer une colonne d'un type de domaine +- Valeurs de lecture / écriture depuis / vers la colonne de domaine +- L'utiliser comme un indice si un type de base peut être utilisée comme un indice +- Fonctions d'appel avec des valeurs de colonne de domaine + +### Fonctionnalités supplémentaires des domaines {#extra-features-of-domains} + +- Nom de type de colonne explicite dans `SHOW CREATE TABLE` ou `DESCRIBE TABLE` +- Entrée du format convivial avec `INSERT INTO domain_table(domain_column) VALUES(...)` +- Sortie au format convivial pour `SELECT domain_column FROM domain_table` +- Chargement de données à partir d'une source externe dans un format convivial: `INSERT INTO domain_table FORMAT CSV ...` + +### Limitation {#limitations} + +- Impossible de convertir la colonne d'index du type de base en type de domaine via `ALTER TABLE`. +- Impossible de convertir implicitement des valeurs de chaîne en valeurs de domaine lors de l'insertion de données d'une autre colonne ou table. +- Le domaine n'ajoute aucune contrainte sur les valeurs stockées. + +[Article Original](https://clickhouse.tech/docs/en/data_types/domains/overview) diff --git a/docs/fr/data_types/enum.md b/docs/fr/data_types/enum.md new file mode 100644 index 00000000000..bb1e43ea15f --- /dev/null +++ b/docs/fr/data_types/enum.md @@ -0,0 +1,129 @@ +--- +machine_translated: true +--- + +# Enum {#enum} + +Type énuméré composé de valeurs nommées. + +Les valeurs nommées doivent être déclarées comme `'string' = integer` pair. ClickHouse ne stocke que des nombres, mais prend en charge les opérations avec les valeurs à travers leurs noms. + +Supports ClickHouse: + +- 8-bit `Enum`. Il peut contenir jusqu'à 256 valeurs énumérées dans le `[-128, 127]` gamme. +- 16 bits `Enum`. Il peut contenir jusqu'à 65 536 valeurs énumérées dans le `[-32768, 32767]` gamme. + +Clickhouse choisit automatiquement le type de `Enum` lorsque les données sont insérées. Vous pouvez également utiliser `Enum8` ou `Enum16` types pour être sûr de la taille de stockage. + +## Exemples d'utilisation {#usage-examples} + +Ici, nous créons une table avec une `Enum8('hello' = 1, 'world' = 2)` type de colonne: + +``` sql +CREATE TABLE t_enum +( + x Enum('hello' = 1, 'world' = 2) +) +ENGINE = TinyLog +``` + +Colonne `x` ne peut stocker que les valeurs répertoriées dans la définition de type: `'hello'` ou `'world'`. Si vous essayez d'enregistrer une autre valeur, ClickHouse déclenchera une exception. Taille 8 bits pour cela `Enum` est choisi automatiquement. + +``` sql +INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello') +``` + +``` text +Ok. +``` + +``` sql +INSERT INTO t_enum values('a') +``` + +``` text +Exception on client: +Code: 49. DB::Exception: Unknown element 'a' for type Enum('hello' = 1, 'world' = 2) +``` + +Lorsque vous interrogez des données de la table, ClickHouse affiche les valeurs de chaîne de `Enum`. + +``` sql +SELECT * FROM t_enum +``` + +``` text +┌─x─────┐ +│ hello │ +│ world │ +│ hello │ +└───────┘ +``` + +Si vous avez besoin de voir les équivalents numériques des lignes, vous devez `Enum` valeur en type entier. + +``` sql +SELECT CAST(x, 'Int8') FROM t_enum +``` + +``` text +┌─CAST(x, 'Int8')─┐ +│ 1 │ +│ 2 │ +│ 1 │ +└─────────────────┘ +``` + +Pour créer une valeur d'Enum dans une requête, vous devez également utiliser `CAST`. + +``` sql +SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)')) +``` + +``` text +┌─toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))─┐ +│ Enum8('a' = 1, 'b' = 2) │ +└─────────────────────────────────────────────────────┘ +``` + +## Règles générales et utilisation {#general-rules-and-usage} + +Chacune des valeurs se voit attribuer un nombre dans la plage `-128 ... 127` pour `Enum8` ou dans la gamme `-32768 ... 32767` pour `Enum16`. Toutes les chaînes et les nombres doivent être différents. Une chaîne vide est autorisé. Si ce type est spécifié (dans une définition de table), les nombres peuvent être dans un ordre arbitraire. Toutefois, l'ordre n'a pas d'importance. + +Ni la chaîne ni la valeur numérique dans un `Enum` peut être [NULL](../query_language/syntax.md). + +Un `Enum` peut être contenue dans [Nullable](nullable.md) type. Donc, si vous créez une table en utilisant la requête + +``` sql +CREATE TABLE t_enum_nullable +( + x Nullable( Enum8('hello' = 1, 'world' = 2) ) +) +ENGINE = TinyLog +``` + +il peut stocker non seulement des `'hello'` et `'world'`, mais `NULL`, ainsi. + +``` sql +INSERT INTO t_enum_nullable Values('hello'),('world'),(NULL) +``` + +Dans la mémoire RAM, un `Enum` la colonne est stockée dans la même manière que `Int8` ou `Int16` des valeurs numériques correspondantes. + +Lors de la lecture sous forme de texte, ClickHouse analyse la valeur sous forme de chaîne et recherche la chaîne correspondante à partir de l'ensemble des valeurs Enum. Si elle n'est pas trouvée, une exception est levée. Lors de la lecture au format texte, la chaîne est lue et la valeur numérique correspondante est recherchée. Une exception sera levée si il n'est pas trouvé. +Lors de l'écriture sous forme de texte, il écrit la valeur correspondante de la chaîne. Si les données de colonne contiennent des déchets (nombres qui ne proviennent pas de l'ensemble valide), une exception est levée. Lors de la lecture et de l'écriture sous forme binaire, cela fonctionne de la même manière que pour les types de données Int8 et Int16. +La valeur implicite par défaut est la valeur avec le numéro le plus bas. + +Lors `ORDER BY`, `GROUP BY`, `IN`, `DISTINCT` et ainsi de suite, les Énumérations se comportent de la même façon que les nombres correspondants. Par exemple, ORDER BY les trie numériquement. Les opérateurs d'égalité et de comparaison fonctionnent de la même manière sur les énumérations que sur les valeurs numériques sous-jacentes. + +Les valeurs Enum ne peuvent pas être comparées aux nombres. Les Enums peuvent être comparés à une chaîne constante. Si la chaîne comparée à n'est pas une valeur valide pour L'énumération, une exception sera levée. L'opérateur est pris en charge avec l'Enum sur le côté gauche, et un ensemble de chaînes sur le côté droit. Les chaînes sont les valeurs de L'énumération correspondante. + +Most numeric and string operations are not defined for Enum values, e.g. adding a number to an Enum or concatenating a string to an Enum. +Cependant, L'énumération a un naturel `toString` fonction qui renvoie sa valeur de chaîne. + +Les valeurs Enum sont également convertibles en types numériques en utilisant `toT` fonction, où T est un type numérique. Lorsque T correspond au type numérique sous-jacent de l'énumération, cette conversion est à coût nul. +Le type Enum peut être modifié sans coût en utilisant ALTER, si seulement l'ensemble des valeurs est modifié. Il est possible d'ajouter et de supprimer des membres de L'énumération en utilisant ALTER (la suppression n'est sûre que si la valeur supprimée n'a jamais été utilisée dans la table). À titre de sauvegarde, la modification de la valeur numérique d'un membre Enum précédemment défini lancera une exception. + +En utilisant ALTER, il est possible de changer un Enum8 en Enum16 ou vice versa, tout comme changer un Int8 en Int16. + +[Article Original](https://clickhouse.tech/docs/en/data_types/enum/) diff --git a/docs/fr/data_types/fixedstring.md b/docs/fr/data_types/fixedstring.md new file mode 100644 index 00000000000..0bb91baf681 --- /dev/null +++ b/docs/fr/data_types/fixedstring.md @@ -0,0 +1,60 @@ +--- +machine_translated: true +--- + +# FixedString {#fixedstring} + +Une chaîne de longueur fixe de `N` octets (ni caractères ni points de code). + +Pour déclarer une colonne de `FixedString` tapez, utilisez la syntaxe suivante: + +``` sql + FixedString(N) +``` + +Où `N` est un nombre naturel. + +Le `FixedString` type est efficace lorsque les données ont la longueur de précisément `N` octet. Dans tous les autres cas, il est susceptible de réduire l'efficacité. + +Exemples de valeurs qui peuvent être stockées efficacement dans `FixedString`-tapé colonnes: + +- La représentation binaire des adresses IP (`FixedString(16)` pour IPv6). +- Language codes (ru\_RU, en\_US … ). +- Currency codes (USD, RUB … ). +- Représentation binaire des hachages (`FixedString(16)` pour MD5, `FixedString(32)` pour SHA256). + +Pour stocker les valeurs UUID, utilisez [UUID](uuid.md) type de données. + +Lors de l'insertion des données, ClickHouse: + +- Complète une chaîne avec des octets null si la chaîne contient moins de `N` octet. +- Jette le `Too large value for FixedString(N)` exception si la chaîne contient plus de `N` octet. + +Lors de la sélection des données, ClickHouse ne supprime pas les octets nuls à la fin de la chaîne. Si vous utilisez le `WHERE` clause, vous devez ajouter des octets null manuellement pour `FixedString` valeur. L'exemple suivant illustre l'utilisation de l' `WHERE` la clause de `FixedString`. + +Considérons le tableau suivant avec le seul `FixedString(2)` colonne: + +``` text +┌─name──┐ +│ b │ +└───────┘ +``` + +Requête `SELECT * FROM FixedStringTable WHERE a = 'b'` ne renvoie aucune donnée en conséquence. Nous devrions compléter le modèle de filtre avec des octets nuls. + +``` sql +SELECT * FROM FixedStringTable +WHERE a = 'b\0' +``` + +``` text +┌─a─┐ +│ b │ +└───┘ +``` + +Ce comportement diffère de MySQL pour le `CHAR` type (où les chaînes sont remplies d'espaces et les espaces sont supprimés pour la sortie). + +À noter que la longueur de la `FixedString(N)` la valeur est constante. Le [longueur](../query_language/functions/array_functions.md#array_functions-length) la fonction renvoie `N` même si l' `FixedString(N)` la valeur est remplie uniquement avec des octets [vide](../query_language/functions/string_functions.md#empty) la fonction renvoie `1` dans ce cas. + +[Article Original](https://clickhouse.tech/docs/en/data_types/fixedstring/) diff --git a/docs/fr/data_types/float.md b/docs/fr/data_types/float.md new file mode 100644 index 00000000000..8458f0e13da --- /dev/null +++ b/docs/fr/data_types/float.md @@ -0,0 +1,84 @@ +--- +machine_translated: true +--- + +# Float32, Float64 {#float32-float64} + +[Les nombres à virgule flottante](https://en.wikipedia.org/wiki/IEEE_754). + +Les Types sont équivalents aux types de C: + +- `Float32` - `float` +- `Float64` - `double` + +Nous vous recommandons de stocker les données sous forme entière chaque fois que possible. Par exemple, convertissez des nombres de précision fixes en valeurs entières, telles que des montants monétaires ou des temps de chargement de page en millisecondes. + +## Utilisation de nombres à virgule flottante {#using-floating-point-numbers} + +- Calculs avec des nombres à virgule flottante peut produire une erreur d'arrondi. + + + +``` sql +SELECT 1 - 0.9 +``` + +``` text +┌───────minus(1, 0.9)─┐ +│ 0.09999999999999998 │ +└─────────────────────┘ +``` + +- Le résultat du calcul dépend de la méthode de calcul (le type de processeur et de l'architecture du système informatique). +- Les calculs à virgule flottante peuvent entraîner des nombres tels que l'infini (`Inf`) et “not-a-number” (`NaN`). Cela doit être pris en compte lors du traitement des résultats de calculs. +- Lors de l'analyse de nombres à virgule flottante à partir de texte, le résultat peut ne pas être le nombre représentable par machine le plus proche. + +## NaN et Inf {#data_type-float-nan-inf} + +Contrairement à SQL standard, ClickHouse prend en charge les catégories suivantes de nombres à virgule flottante: + +- `Inf` – Infinity. + + + +``` sql +SELECT 0.5 / 0 +``` + +``` text +┌─divide(0.5, 0)─┐ +│ inf │ +└────────────────┘ +``` + +- `-Inf` – Negative infinity. + + + +``` sql +SELECT -0.5 / 0 +``` + +``` text +┌─divide(-0.5, 0)─┐ +│ -inf │ +└─────────────────┘ +``` + +- `NaN` – Not a number. + + + +``` sql +SELECT 0 / 0 +``` + +``` text +┌─divide(0, 0)─┐ +│ nan │ +└──────────────┘ +``` + + See the rules for `NaN` sorting in the section [ORDER BY clause](../query_language/select.md). + +[Article Original](https://clickhouse.tech/docs/en/data_types/float/) diff --git a/docs/fr/data_types/index.md b/docs/fr/data_types/index.md new file mode 100644 index 00000000000..f5f9386c042 --- /dev/null +++ b/docs/fr/data_types/index.md @@ -0,0 +1,11 @@ +--- +machine_translated: true +--- + +# Types De Données {#data_types} + +ClickHouse peut stocker différents types de données dans des cellules de table. + +Cette section décrit les types de données pris en charge et les considérations spéciales pour les utiliser et/ou les implémenter le cas échéant. + +[Article Original](https://clickhouse.tech/docs/en/data_types/) diff --git a/docs/fr/data_types/int_uint.md b/docs/fr/data_types/int_uint.md new file mode 100644 index 00000000000..ec3018d42c8 --- /dev/null +++ b/docs/fr/data_types/int_uint.md @@ -0,0 +1,23 @@ +--- +machine_translated: true +--- + +# UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64 {#uint8-uint16-uint32-uint64-int8-int16-int32-int64} + +Entiers de longueur fixe, avec ou sans signe. + +## Plages Int {#int-ranges} + +- Int8 - \[-128: 127\] +- Int16 - \[-32768: 32767\] +- Int32 - \[-2147483648: 2147483647\] +- Int64 - \[-9223372036854775808: 9223372036854775807\] + +## Plages Uint {#uint-ranges} + +- UInt8 - \[0: 255\] +- UInt16 - \[0: 65535\] +- UInt32- \[0: 4294967295\] +- UInt64- \[0: 18446744073709551615\] + +[Article Original](https://clickhouse.tech/docs/en/data_types/int_uint/) diff --git a/docs/fr/data_types/nested_data_structures/aggregatefunction.md b/docs/fr/data_types/nested_data_structures/aggregatefunction.md new file mode 100644 index 00000000000..ba4d1e9cd73 --- /dev/null +++ b/docs/fr/data_types/nested_data_structures/aggregatefunction.md @@ -0,0 +1,67 @@ +--- +machine_translated: true +--- + +# AggregateFunction(name, types\_of\_arguments…) {#data-type-aggregatefunction} + +Aggregate functions can have an implementation-defined intermediate state that can be serialized to an AggregateFunction(…) data type and stored in a table, usually, by means of [une vue matérialisée](../../query_language/select.md#create-view). La manière courante de produire un État de fonction d'agrégat est d'appeler la fonction d'agrégat avec le `-State` suffixe. Pour obtenir le résultat final de l'agrégation dans l'avenir, vous devez utiliser la même fonction d'agrégation avec la `-Merge`suffixe. + +`AggregateFunction` — parametric data type. + +**Paramètre** + +- Nom de la fonction d'agrégation. + + If the function is parametric, specify its parameters too. + +- Types des arguments de la fonction d'agrégation. + +**Exemple** + +``` sql +CREATE TABLE t +( + column1 AggregateFunction(uniq, UInt64), + column2 AggregateFunction(anyIf, String, UInt8), + column3 AggregateFunction(quantiles(0.5, 0.9), UInt64) +) ENGINE = ... +``` + +[uniq](../../query_language/agg_functions/reference.md#agg_function-uniq), anyIf ([tout](../../query_language/agg_functions/reference.md#agg_function-any)+[Si](../../query_language/agg_functions/combinators.md#agg-functions-combinator-if)) et [les quantiles](../../query_language/agg_functions/reference.md) les fonctions d'agrégation sont-elles prises en charge dans ClickHouse. + +## Utilisation {#usage} + +### Insertion De Données {#data-insertion} + +Pour insérer des données, utilisez `INSERT SELECT` avec le regroupement d' `-State`- fonction. + +**Exemples de fonction** + +``` sql +uniqState(UserID) +quantilesState(0.5, 0.9)(SendTiming) +``` + +Contrairement aux fonctions correspondantes `uniq` et `quantiles`, `-State`- les fonctions renvoient l'état, au lieu de la valeur finale. En d'autres termes, ils renvoient une valeur de `AggregateFunction` type. + +Dans les résultats de `SELECT` requête, les valeurs de `AggregateFunction` type ont une représentation binaire spécifique à l'implémentation pour tous les formats de sortie ClickHouse. Si les données de vidage dans, par exemple, `TabSeparated` format avec `SELECT` requête, puis ce vidage peut être chargé en utilisant `INSERT` requête. + +### Sélection De Données {#data-selection} + +Lors de la sélection des données `AggregatingMergeTree` table, utilisez `GROUP BY` et les mêmes fonctions d'agrégat que lors de l'insertion de données, mais en utilisant `-Merge`suffixe. + +Une fonction d'agrégation avec `-Merge` suffixe prend un ensemble d'états, les combine, et renvoie le résultat complet de l'agrégation de données. + +Par exemple, les deux requêtes suivantes retournent le même résultat: + +``` sql +SELECT uniq(UserID) FROM table + +SELECT uniqMerge(state) FROM (SELECT uniqState(UserID) AS state FROM table GROUP BY RegionID) +``` + +## Exemple D'Utilisation {#usage-example} + +Voir [AggregatingMergeTree](../../operations/table_engines/aggregatingmergetree.md) Description du moteur. + +[Article Original](https://clickhouse.tech/docs/en/data_types/nested_data_structures/aggregatefunction/) diff --git a/docs/fr/data_types/nested_data_structures/index.md b/docs/fr/data_types/nested_data_structures/index.md new file mode 100644 index 00000000000..9691b587181 --- /dev/null +++ b/docs/fr/data_types/nested_data_structures/index.md @@ -0,0 +1,7 @@ +--- +machine_translated: true +--- + +# Structures De Données Imbriquées {#nested-data-structures} + +[Article Original](https://clickhouse.tech/docs/en/data_types/nested_data_structures/) diff --git a/docs/fr/data_types/nested_data_structures/nested.md b/docs/fr/data_types/nested_data_structures/nested.md new file mode 100644 index 00000000000..f6dceb4b6c1 --- /dev/null +++ b/docs/fr/data_types/nested_data_structures/nested.md @@ -0,0 +1,103 @@ +--- +machine_translated: true +--- + +# Nested(Name1 Type1, Name2 Type2, …) {#nestedname1-type1-name2-type2} + +A nested data structure is like a table inside a cell. The parameters of a nested data structure – the column names and types – are specified the same way as in a [CREATE TABLE](../../query_language/create.md) requête. Chaque ligne de table peut correspondre à n'importe quel nombre de lignes dans une structure de données imbriquée. + +Exemple: + +``` sql +CREATE TABLE test.visits +( + CounterID UInt32, + StartDate Date, + Sign Int8, + IsNew UInt8, + VisitID UInt64, + UserID UInt64, + ... + Goals Nested + ( + ID UInt32, + Serial UInt32, + EventTime DateTime, + Price Int64, + OrderID String, + CurrencyID UInt32 + ), + ... +) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign) +``` + +Cet exemple déclare le `Goals` structure de données imbriquée, qui contient des données sur les conversions (objectifs atteints). Chaque ligne de la ‘visits’ table peut correspondre à zéro ou n'importe quel nombre de conversions. + +Un seul niveau d'imbrication est pris en charge. Les colonnes de structures imbriquées contenant des tableaux sont équivalentes à des tableaux multidimensionnels, elles ont donc un support limité (il n'y a pas de support pour stocker ces colonnes dans des tables avec le moteur MergeTree). + +Dans la plupart des cas, lorsque vous travaillez avec une structure de données imbriquée, ses colonnes sont spécifiées avec des noms de colonnes séparés par un point. Ces colonnes constituent un tableau de types correspondants. Tous les tableaux de colonnes d'une structure de données imbriquée unique ont la même longueur. + +Exemple: + +``` sql +SELECT + Goals.ID, + Goals.EventTime +FROM test.visits +WHERE CounterID = 101500 AND length(Goals.ID) < 5 +LIMIT 10 +``` + +``` text +┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐ +│ [1073752,591325,591325] │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27'] │ +│ [1073752] │ ['2014-03-17 00:28:25'] │ +│ [1073752] │ ['2014-03-17 10:46:20'] │ +│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │ +│ [] │ [] │ +│ [1073752,591325,591325] │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21'] │ +│ [] │ [] │ +│ [] │ [] │ +│ [591325,1073752] │ ['2014-03-17 00:46:05','2014-03-17 00:46:05'] │ +│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │ +└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +Il est plus facile de penser à une structure de données imbriquée comme un ensemble de plusieurs tableaux de colonnes de la même longueur. + +Le seul endroit où une requête SELECT peut spécifier le nom d'une structure de données imbriquée entière au lieu de colonnes individuelles est la clause de jointure de tableau. Pour plus d'informations, voir “ARRAY JOIN clause”. Exemple: + +``` sql +SELECT + Goal.ID, + Goal.EventTime +FROM test.visits +ARRAY JOIN Goals AS Goal +WHERE CounterID = 101500 AND length(Goals.ID) < 5 +LIMIT 10 +``` + +``` text +┌─Goal.ID─┬──────Goal.EventTime─┐ +│ 1073752 │ 2014-03-17 16:38:10 │ +│ 591325 │ 2014-03-17 16:38:48 │ +│ 591325 │ 2014-03-17 16:42:27 │ +│ 1073752 │ 2014-03-17 00:28:25 │ +│ 1073752 │ 2014-03-17 10:46:20 │ +│ 1073752 │ 2014-03-17 13:59:20 │ +│ 591325 │ 2014-03-17 22:17:55 │ +│ 591325 │ 2014-03-17 22:18:07 │ +│ 591325 │ 2014-03-17 22:18:51 │ +│ 1073752 │ 2014-03-17 11:37:06 │ +└─────────┴─────────────────────┘ +``` + +Vous ne pouvez pas effectuer SELECT pour une structure de données imbriquée entière. Vous ne pouvez lister explicitement que les colonnes individuelles qui en font partie. + +Pour une requête INSERT, vous devez passer tous les tableaux de colonnes composant d'une structure de données imbriquée séparément (comme s'il s'agissait de tableaux de colonnes individuels). Au cours de l'insertion, le système vérifie qu'ils ont la même longueur. + +Pour une requête DESCRIBE, les colonnes d'une structure de données imbriquée sont répertoriées séparément de la même manière. + +La requête ALTER pour les éléments d'une structure de données imbriquée a des limites. + +[Article Original](https://clickhouse.tech/docs/en/data_types/nested_data_structures/nested/) diff --git a/docs/fr/data_types/nullable.md b/docs/fr/data_types/nullable.md new file mode 100644 index 00000000000..3a5c6bcff6c --- /dev/null +++ b/docs/fr/data_types/nullable.md @@ -0,0 +1,43 @@ +--- +machine_translated: true +--- + +# Nullable(TypeName) {#data_type-nullable} + +Permet de stocker marqueur spécial ([NULL](../query_language/syntax.md)) qui dénote “missing value” aux valeurs normales autorisées par `TypeName`. Par exemple, un `Nullable(Int8)` type colonne peut stocker `Int8` type de valeurs, et les lignes qui n'ont pas de valeur magasin `NULL`. + +Pour un `TypeName` vous ne pouvez pas utiliser les types de données composites [Tableau](array.md) et [Tuple](tuple.md). Les types de données composites peuvent contenir `Nullable` valeurs de type, telles que `Array(Nullable(Int8))`. + +A `Nullable` le champ type ne peut pas être inclus dans les index de table. + +`NULL` est la valeur par défaut pour tout `Nullable` type, sauf indication contraire dans la configuration du serveur ClickHouse. + +## Caractéristiques de stockage {#storage-features} + +Stocker `Nullable` valeurs de type dans une colonne de table, ClickHouse utilise un fichier séparé avec `NULL` masques en plus du fichier normal avec des valeurs. Les entrées du fichier masks permettent à ClickHouse de faire la distinction entre `NULL` et une valeur par défaut du type de données correspondant pour chaque ligne de table. En raison d'un fichier supplémentaire, `Nullable` colonne consomme de l'espace de stockage supplémentaire par rapport à une normale similaire. + +!!! info "Note" + Utiliser `Nullable` affecte presque toujours négativement les performances, gardez cela à l'esprit lors de la conception de vos bases de données. + +## Exemple d'utilisation {#usage-example} + +``` sql +CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog +``` + +``` sql +INSERT INTO t_null VALUES (1, NULL), (2, 3) +``` + +``` sql +SELECT x + y FROM t_null +``` + +``` text +┌─plus(x, y)─┐ +│ ᴺᵁᴸᴸ │ +│ 5 │ +└────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/data_types/nullable/) diff --git a/docs/fr/data_types/special_data_types/expression.md b/docs/fr/data_types/special_data_types/expression.md new file mode 100644 index 00000000000..a368afa07ba --- /dev/null +++ b/docs/fr/data_types/special_data_types/expression.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Expression {#expression} + +Les Expressions sont utilisées pour représenter des lambdas dans des fonctions d'ordre Élevé. + +[Article Original](https://clickhouse.tech/docs/en/data_types/special_data_types/expression/) diff --git a/docs/fr/data_types/special_data_types/index.md b/docs/fr/data_types/special_data_types/index.md new file mode 100644 index 00000000000..a55535d7541 --- /dev/null +++ b/docs/fr/data_types/special_data_types/index.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Types De Données Spéciaux {#special-data-types} + +Les valeurs de type de données spéciales ne peuvent pas être sérialisées pour l'enregistrement dans une table ou la sortie dans les résultats de la requête, mais peuvent être utilisées comme résultat intermédiaire lors de l'exécution de la requête. + +[Article Original](https://clickhouse.tech/docs/en/data_types/special_data_types/) diff --git a/docs/fr/data_types/special_data_types/interval.md b/docs/fr/data_types/special_data_types/interval.md new file mode 100644 index 00000000000..b5ee83bf6bd --- /dev/null +++ b/docs/fr/data_types/special_data_types/interval.md @@ -0,0 +1,82 @@ +--- +machine_translated: true +--- + +# Intervalle {#data-type-interval} + +Famille de types de données représentant des intervalles d'heure et de date. Les types de la [INTERVAL](../../query_language/operators.md#operator-interval) opérateur. + +!!! warning "Avertissement" + `Interval` les valeurs de type de données ne peuvent pas être stockées dans les tables. + +Structure: + +- Intervalle de temps en tant que valeur entière non signée. +- Type de l'intervalle. + +Types d'intervalles pris en charge: + +- `SECOND` +- `MINUTE` +- `HOUR` +- `DAY` +- `WEEK` +- `MONTH` +- `QUARTER` +- `YEAR` + +Pour chaque type d'intervalle, il existe un type de données distinct. Par exemple, l' `DAY` l'intervalle correspond au `IntervalDay` type de données: + +``` sql +SELECT toTypeName(INTERVAL 4 DAY) +``` + +``` text +┌─toTypeName(toIntervalDay(4))─┐ +│ IntervalDay │ +└──────────────────────────────┘ +``` + +## Utilisation Remarques {#data-type-interval-usage-remarks} + +Vous pouvez utiliser `Interval`-tapez des valeurs dans des opérations arithmétiques avec [Date](../../data_types/date.md) et [DateTime](../../data_types/datetime.md)-type de valeurs. Par exemple, vous pouvez ajouter 4 jours à l'heure actuelle: + +``` sql +SELECT now() as current_date_time, current_date_time + INTERVAL 4 DAY +``` + +``` text +┌───current_date_time─┬─plus(now(), toIntervalDay(4))─┐ +│ 2019-10-23 10:58:45 │ 2019-10-27 10:58:45 │ +└─────────────────────┴───────────────────────────────┘ +``` + +Les intervalles avec différents types ne peuvent pas être combinés. Vous ne pouvez pas utiliser des intervalles comme `4 DAY 1 HOUR`. Spécifiez des intervalles en unités inférieures ou égales à la plus petite unité de l'intervalle, par exemple, l'intervalle `1 day and an hour` l'intervalle peut être exprimée comme `25 HOUR` ou `90000 SECOND`. + +Vous ne pouvez pas effectuer d'opérations arithmétiques avec `Interval`- tapez des valeurs, mais vous pouvez ajouter des intervalles de différents types par conséquent aux valeurs dans `Date` ou `DateTime` types de données. Exemple: + +``` sql +SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR +``` + +``` text +┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐ +│ 2019-10-23 11:16:28 │ 2019-10-27 14:16:28 │ +└─────────────────────┴────────────────────────────────────────────────────────┘ +``` + +La requête suivante provoque une exception: + +``` sql +select now() AS current_date_time, current_date_time + (INTERVAL 4 DAY + INTERVAL 3 HOUR) +``` + +``` text +Received exception from server (version 19.14.1): +Code: 43. DB::Exception: Received from localhost:9000. DB::Exception: Wrong argument types for function plus: if one argument is Interval, then another must be Date or DateTime.. +``` + +## Voir Aussi {#see-also} + +- [INTERVAL](../../query_language/operators.md#operator-interval) opérateur +- [toInterval](../../query_language/functions/type_conversion_functions.md#function-tointerval) type fonctions de conversion diff --git a/docs/fr/data_types/special_data_types/nothing.md b/docs/fr/data_types/special_data_types/nothing.md new file mode 100644 index 00000000000..1e93f58d9d9 --- /dev/null +++ b/docs/fr/data_types/special_data_types/nothing.md @@ -0,0 +1,23 @@ +--- +machine_translated: true +--- + +# Rien {#nothing} + +Le seul but de ce type de données est de représenter les cas où une valeur n'est pas prévu. Donc vous ne pouvez pas créer un `Nothing` type de valeur. + +Par exemple, littéral [NULL](../../query_language/syntax.md#null-literal) a type de `Nullable(Nothing)`. Voir plus sur [Nullable](../../data_types/nullable.md). + +Le `Nothing` type peut également être utilisé pour désigner des tableaux vides: + +``` sql +SELECT toTypeName(array()) +``` + +``` text +┌─toTypeName(array())─┐ +│ Array(Nothing) │ +└─────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/data_types/special_data_types/nothing/) diff --git a/docs/fr/data_types/special_data_types/set.md b/docs/fr/data_types/special_data_types/set.md new file mode 100644 index 00000000000..82dcef10abe --- /dev/null +++ b/docs/fr/data_types/special_data_types/set.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Définir {#set} + +Utilisé pour la moitié droite d'un [IN](../../query_language/select.md#select-in-operators) expression. + +[Article Original](https://clickhouse.tech/docs/en/data_types/special_data_types/set/) diff --git a/docs/fr/data_types/string.md b/docs/fr/data_types/string.md new file mode 100644 index 00000000000..a34495c0f79 --- /dev/null +++ b/docs/fr/data_types/string.md @@ -0,0 +1,17 @@ +--- +machine_translated: true +--- + +# Chaîne {#string} + +Les chaînes d'une longueur arbitraire. La longueur n'est pas limitée. La valeur peut contenir un ensemble arbitraire d'octets, y compris des octets nuls. +Le type de chaîne remplace les types VARCHAR, BLOB, CLOB et autres provenant d'autres SGBD. + +## Encodage {#encodings} + +ClickHouse n'a pas le concept d'encodages. Les chaînes peuvent contenir un ensemble arbitraire d'octets, qui sont stockés et sortis tels quels. +Si vous avez besoin de stocker des textes, nous vous recommandons d'utiliser L'encodage UTF-8. À tout le moins, si votre terminal utilise UTF-8 (comme recommandé), vous pouvez lire et écrire vos valeurs sans effectuer de conversions. +De même, certaines fonctions pour travailler avec des chaînes ont des variations distinctes qui fonctionnent sous l'hypothèse que la chaîne contient un ensemble d'octets représentant un texte codé en UTF-8. +Par exemple, l' ‘length’ fonction calcule la longueur de la chaîne en octets, tandis que le ‘lengthUTF8’ la fonction calcule la longueur de la chaîne en points de code Unicode, en supposant que la valeur est encodée en UTF-8. + +[Article Original](https://clickhouse.tech/docs/en/data_types/string/) diff --git a/docs/fr/data_types/tuple.md b/docs/fr/data_types/tuple.md new file mode 100644 index 00000000000..2f180046753 --- /dev/null +++ b/docs/fr/data_types/tuple.md @@ -0,0 +1,49 @@ +--- +machine_translated: true +--- + +# Tuple(T1, T2, …) {#tuplet1-t2} + +Un n-uplet d'éléments, chacun ayant une personne [type](index.md#data_types). + +Les Tuples sont utilisés pour le regroupement temporaire de colonnes. Les colonnes peuvent être regroupées lorsqu'une expression IN est utilisée dans une requête et pour spécifier certains paramètres formels des fonctions lambda. Pour plus d'informations, voir les sections [Dans les opérateurs](../query_language/select.md) et [Des fonctions d'ordre supérieur](../query_language/functions/higher_order_functions.md). + +Les Tuples peuvent être le résultat d'une requête. Dans ce cas, pour les formats de texte autres que JSON, les valeurs sont séparées par des virgules entre parenthèses. Dans les formats JSON, les tuples sont sortis sous forme de tableaux (entre crochets). + +## La création d'un tuple {#creating-a-tuple} + +Vous pouvez utiliser une fonction pour créer un tuple: + +``` sql +tuple(T1, T2, ...) +``` + +Exemple de création d'un tuple: + +``` sql +SELECT tuple(1,'a') AS x, toTypeName(x) +``` + +``` text +┌─x───────┬─toTypeName(tuple(1, 'a'))─┐ +│ (1,'a') │ Tuple(UInt8, String) │ +└─────────┴───────────────────────────┘ +``` + +## Utilisation de types de données {#working-with-data-types} + +Lors de la création d'un tuple à la volée, ClickHouse détecte automatiquement le type de chaque argument comme le minimum des types qui peuvent stocker la valeur de l'argument. Si l'argument est [NULL](../query_language/syntax.md#null-literal) le type de l'élément tuple est [Nullable](nullable.md). + +Exemple de détection automatique de type de données: + +``` sql +SELECT tuple(1, NULL) AS x, toTypeName(x) +``` + +``` text +┌─x────────┬─toTypeName(tuple(1, NULL))──────┐ +│ (1,NULL) │ Tuple(UInt8, Nullable(Nothing)) │ +└──────────┴─────────────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/data_types/tuple/) diff --git a/docs/fr/data_types/uuid.md b/docs/fr/data_types/uuid.md new file mode 100644 index 00000000000..86790c6265e --- /dev/null +++ b/docs/fr/data_types/uuid.md @@ -0,0 +1,74 @@ +--- +machine_translated: true +--- + +# UUID {#uuid-data-type} + +Un identifiant unique universel (UUID) est un numéro de 16 octets utilisé pour identifier les enregistrements. Pour plus d'informations sur L'UUID, voir [Wikipedia](https://en.wikipedia.org/wiki/Universally_unique_identifier). + +L'exemple de valeur de type UUID est représenté ci-dessous: + +``` text +61f0c404-5cb3-11e7-907b-a6006ad3dba0 +``` + +Si vous ne spécifiez pas la valeur de la colonne UUID lors de l'insertion d'un nouvel enregistrement, la valeur UUID est remplie avec zéro: + +``` text +00000000-0000-0000-0000-000000000000 +``` + +## Comment générer {#how-to-generate} + +Pour générer la valeur UUID, ClickHouse fournit [generateUUIDv4](../query_language/functions/uuid_functions.md) fonction. + +## Exemple d'utilisation {#usage-example} + +**Exemple 1** + +Cet exemple montre la création d'une table avec la colonne de type UUID et l'insertion d'une valeur dans la table. + +``` sql +CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog +``` + +``` sql +INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1' +``` + +``` sql +SELECT * FROM t_uuid +``` + +``` text +┌────────────────────────────────────x─┬─y─────────┐ +│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │ +└──────────────────────────────────────┴───────────┘ +``` + +**Exemple 2** + +Dans cet exemple, la valeur de la colonne UUID n'est pas spécifiée lors de l'insertion d'un nouvel enregistrement. + +``` sql +INSERT INTO t_uuid (y) VALUES ('Example 2') +``` + +``` sql +SELECT * FROM t_uuid +``` + +``` text +┌────────────────────────────────────x─┬─y─────────┐ +│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │ +│ 00000000-0000-0000-0000-000000000000 │ Example 2 │ +└──────────────────────────────────────┴───────────┘ +``` + +## Restriction {#restrictions} + +Le type de données UUID ne prend en charge que les fonctions qui [Chaîne](string.md) type de données prend également en charge (par exemple, [min](../query_language/agg_functions/reference.md#agg_function-min), [Max](../query_language/agg_functions/reference.md#agg_function-max), et [compter](../query_language/agg_functions/reference.md#agg_function-count)). + +Le type de données UUID n'est pas pris en charge par les opérations arithmétiques (par exemple, [ABS](../query_language/functions/arithmetic_functions.md#arithm_func-abs)) ou des fonctions d'agrégation, comme [somme](../query_language/agg_functions/reference.md#agg_function-sum) et [avg](../query_language/agg_functions/reference.md#agg_function-avg). + +[Article Original](https://clickhouse.tech/docs/en/data_types/uuid/) diff --git a/docs/fr/database_engines/index.md b/docs/fr/database_engines/index.md new file mode 100644 index 00000000000..6bd365428e0 --- /dev/null +++ b/docs/fr/database_engines/index.md @@ -0,0 +1,17 @@ +--- +machine_translated: true +--- + +# Moteurs De Base De Données {#database-engines} + +Moteurs de base de données vous permettent de travailler avec des tables. + +Par défaut, ClickHouse utilise son moteur de base de données natif, qui fournit [moteurs de table](../operations/table_engines/index.md) et un [Dialecte SQL](../query_language/syntax.md). + +Vous pouvez également utiliser les moteurs de base de données suivants: + +- [MySQL](mysql.md) + +- [Paresseux](lazy.md) + +[Article Original](https://clickhouse.tech/docs/en/database_engines/) diff --git a/docs/fr/database_engines/lazy.md b/docs/fr/database_engines/lazy.md new file mode 100644 index 00000000000..203c62d815b --- /dev/null +++ b/docs/fr/database_engines/lazy.md @@ -0,0 +1,15 @@ +--- +machine_translated: true +--- + +# Paresseux {#lazy} + +Conserve les tables en RAM uniquement `expiration_time_in_seconds` secondes après le dernier accès. Peut être utilisé uniquement avec les tables \* Log. + +Il est optimisé pour stocker de nombreuses petites tables \*Log, pour lesquelles il y a un long intervalle de temps entre les accès. + +## La création d'une Base de données {#creating-a-database} + + CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds); + +[Article Original](https://clickhouse.tech/docs/en/database_engines/lazy/) diff --git a/docs/fr/database_engines/mysql.md b/docs/fr/database_engines/mysql.md new file mode 100644 index 00000000000..c56771e34c2 --- /dev/null +++ b/docs/fr/database_engines/mysql.md @@ -0,0 +1,132 @@ +--- +machine_translated: true +--- + +# MySQL {#mysql} + +Permet de se connecter à des bases de données sur un serveur MySQL distant et `INSERT` et `SELECT` requêtes pour échanger des données entre Clickhouse et MySQL. + +Le `MySQL` moteur de base de données traduire les requêtes sur le serveur MySQL afin que vous puissiez effectuer des opérations telles que `SHOW TABLES` ou `SHOW CREATE TABLE`. + +Vous ne pouvez pas effectuer les requêtes suivantes: + +- `RENAME` +- `CREATE TABLE` +- `ALTER` + +## La création d'une Base de données {#creating-a-database} + +``` sql +CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] +ENGINE = MySQL('host:port', 'database', 'user', 'password') +``` + +**Les Paramètres Du Moteur** + +- `host:port` — MySQL server address. +- `database` — Remote database name. +- `user` — MySQL user. +- `password` — User password. + +## Types De Données Soutien {#data_types-support} + +| MySQL | ClickHouse | +|----------------------------------|---------------------------------------------| +| UNSIGNED TINYINT | [UInt8](../data_types/int_uint.md) | +| TINYINT | [Int8](../data_types/int_uint.md) | +| UNSIGNED SMALLINT | [UInt16](../data_types/int_uint.md) | +| SMALLINT | [Int16](../data_types/int_uint.md) | +| UNSIGNED INT, UNSIGNED MEDIUMINT | [UInt32](../data_types/int_uint.md) | +| INT, MEDIUMINT | [Int32](../data_types/int_uint.md) | +| UNSIGNED BIGINT | [UInt64](../data_types/int_uint.md) | +| BIGINT | [Int64](../data_types/int_uint.md) | +| FLOAT | [Float32](../data_types/float.md) | +| DOUBLE | [Float64](../data_types/float.md) | +| DATE | [Date](../data_types/date.md) | +| DATETIME, TIMESTAMP | [DateTime](../data_types/datetime.md) | +| BINARY | [FixedString](../data_types/fixedstring.md) | + +Tous les autres types de données MySQL sont convertis en [Chaîne](../data_types/string.md). + +[Nullable](../data_types/nullable.md) est pris en charge. + +## Exemples D'utilisation {#examples-of-use} + +Table dans MySQL: + +``` text +mysql> USE test; +Database changed + +mysql> CREATE TABLE `mysql_table` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `float` FLOAT NOT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from mysql_table; ++--------+-------+ +| int_id | value | ++--------+-------+ +| 1 | 2 | ++--------+-------+ +1 row in set (0,00 sec) +``` + +Base de données dans ClickHouse, échange de données avec le serveur MySQL: + +``` sql +CREATE DATABASE mysql_db ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password') +``` + +``` sql +SHOW DATABASES +``` + +``` text +┌─name─────┐ +│ default │ +│ mysql_db │ +│ system │ +└──────────┘ +``` + +``` sql +SHOW TABLES FROM mysql_db +``` + +``` text +┌─name─────────┐ +│ mysql_table │ +└──────────────┘ +``` + +``` sql +SELECT * FROM mysql_db.mysql_table +``` + +``` text +┌─int_id─┬─value─┐ +│ 1 │ 2 │ +└────────┴───────┘ +``` + +``` sql +INSERT INTO mysql_db.mysql_table VALUES (3,4) +``` + +``` sql +SELECT * FROM mysql_db.mysql_table +``` + +``` text +┌─int_id─┬─value─┐ +│ 1 │ 2 │ +│ 3 │ 4 │ +└────────┴───────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/database_engines/mysql/) diff --git a/docs/fr/development/architecture.md b/docs/fr/development/architecture.md new file mode 100644 index 00000000000..ad19a0d4231 --- /dev/null +++ b/docs/fr/development/architecture.md @@ -0,0 +1,200 @@ +--- +machine_translated: true +--- + +# Vue d'ensemble de L'Architecture ClickHouse {#overview-of-clickhouse-architecture} + +ClickHouse est un véritable SGBD orienté colonne. Les données sont stockées par colonnes et lors de l'exécution de tableaux (vecteurs ou morceaux de colonnes). Dans la mesure du possible, les opérations sont distribuées sur des tableaux, plutôt que sur des valeurs individuelles. Il est appelé “vectorized query execution,” et cela aide à réduire le coût du traitement des données réel. + +> Cette idée n'est pas nouvelle. Il remonte à la `APL` langage de programmation et ses descendants: `A +`, `J`, `K`, et `Q`. La programmation de tableau est utilisée dans le traitement des données scientifiques. Cette idée n'est pas non plus nouvelle dans les bases de données relationnelles: par exemple, elle est utilisée dans le `Vectorwise` système. + +Il existe deux approches différentes pour accélérer le traitement des requêtes: l'exécution vectorisée des requêtes et la génération de code d'exécution. Ce dernier supprime toute indirection et expédition dynamique. Aucune de ces approches est strictement meilleure que l'autre. La génération de code d'exécution peut être meilleure lorsqu'elle fusionne de nombreuses opérations, utilisant ainsi pleinement les unités D'exécution du processeur et le pipeline. L'exécution de requête vectorisée peut être moins pratique car elle implique des vecteurs temporaires qui doivent être écrits dans le cache et lus. Si les données temporaires ne rentre pas dans le cache L2, cela devient un problème. Mais l'exécution de requête vectorisée utilise plus facilement les capacités SIMD de la CPU. Un [document de recherche](http://15721.courses.cs.cmu.edu/spring2016/papers/p5-sompolski.pdf) écrit par nos amis montre qu'il est préférable de combiner les deux approches. ClickHouse utilise l'exécution de requête vectorisée et a un support initial limité pour la génération de code d'exécution. + +## Colonne {#columns} + +`IColumn` l'interface est utilisée pour représenter des colonnes en mémoire (en fait, des morceaux de colonnes). Cette interface fournit des méthodes d'aide pour la mise en œuvre de divers opérateurs relationnels. Presque toutes les opérations sont immuables: elles ne modifient pas la colonne d'origine, mais en créent une nouvelle modifiée. Par exemple, l' `IColumn :: filter` méthode accepte un masque d'octet de filtre. Il est utilisé pour le `WHERE` et `HAVING` opérateurs relationnels. Exemples supplémentaires: `IColumn :: permute` méthode de soutien `ORDER BY`, le `IColumn :: cut` méthode de soutien `LIMIT`. + +Divers `IColumn` application (`ColumnUInt8`, `ColumnString` et ainsi de suite) sont responsables de la mémoire disposition de colonnes. La disposition de la mémoire est généralement un tableau contigu. Pour le type entier de colonnes, c'est juste un contiguë tableau, comme `std :: vector`. Pour `String` et `Array` colonnes, il s'agit de deux vecteurs: Un pour tous les éléments du tableau, placé de manière contiguë, et un second pour les décalages au début de chaque tableau. Il y a aussi `ColumnConst` cela stocke une seule valeur en mémoire, mais ressemble à une colonne. + +## Champ {#field} + +Néanmoins, il est possible de travailler avec des valeurs individuelles ainsi. Pour représenter une valeur individuelle, la `Field` est utilisée. `Field` est juste une union discriminée de `UInt64`, `Int64`, `Float64`, `String` et `Array`. `IColumn` a l' `operator[]` méthode pour obtenir la n-ème valeur en tant que `Field` et la `insert` méthode pour ajouter un `Field` à la fin d'une colonne. Ces méthodes ne sont pas très efficaces, car ils nécessitent de traiter avec temporaire `Field` des objets représentant une valeur individuelle. Il existe des méthodes plus efficaces, telles que `insertFrom`, `insertRangeFrom` et ainsi de suite. + +`Field` ne pas avoir assez d'informations sur un type de données spécifique pour une table. Exemple, `UInt8`, `UInt16`, `UInt32`, et `UInt64` tous sont représentés comme `UInt64` dans un `Field`. + +## Abstractions Qui Fuient {#leaky-abstractions} + +`IColumn` a des méthodes pour les transformations relationnelles communes des données, mais elles ne répondent pas à tous les besoins. Exemple, `ColumnUInt64` ne pas avoir une méthode pour calculer la somme des deux colonnes, et `ColumnString` n'a pas de méthode pour exécuter une recherche de sous-chaîne. Ces innombrables routines sont mises en œuvre en dehors de `IColumn`. + +Diverses fonctions sur les colonnes peuvent être implémentées de manière générique et non efficace en utilisant `IColumn` méthodes pour extraire `Field` valeurs, ou d'une manière spécialisée en utilisant la connaissance de la disposition de la mémoire interne des données dans un `IColumn` application. Il est implémenté en lançant des fonctions à un `IColumn` tapez et traitez directement la représentation interne. Exemple, `ColumnUInt64` a l' `getData` méthode qui renvoie une référence à un tableau interne, puis une autre routine lit ou remplit ce tableau directement. Nous avons “leaky abstractions” permettent de spécialisations diverses routines. + +## Types De Données {#data_types} + +`IDataType` est responsable de la sérialisation et de la désérialisation: pour la lecture et l'écriture de morceaux de colonnes ou de valeurs individuelles sous forme binaire ou de texte. `IDataType` correspond directement aux types de données dans les tables. Par exemple, il y a `DataTypeUInt32`, `DataTypeDateTime`, `DataTypeString` et ainsi de suite. + +`IDataType` et `IColumn` ne sont que faiblement liés les uns aux autres. Différents types de données peuvent être représentés en mémoire par le même `IColumn` application. Exemple, `DataTypeUInt32` et `DataTypeDateTime` sont tous deux représentés par `ColumnUInt32` ou `ColumnConstUInt32`. En outre, le même type de données peut être représentée par différents `IColumn` application. Exemple, `DataTypeUInt8` peut être représenté par `ColumnUInt8` ou `ColumnConstUInt8`. + +`IDataType` stocke uniquement les métadonnées. Par exemple, `DataTypeUInt8` ne stocke rien du tout (sauf vptr) et `DataTypeFixedString` magasins juste `N` (la taille des chaînes de taille fixe). + +`IDataType` a des méthodes d'aide pour différents formats de données. Des exemples sont des méthodes pour sérialiser une valeur avec des guillemets possibles, pour sérialiser une valeur pour JSON et pour sérialiser une valeur dans le format XML. Il n'y a pas de correspondance directe avec les formats de données. Par exemple, les différents formats de données `Pretty` et `TabSeparated` pouvez utiliser le même `serializeTextEscaped` méthode d'aide à partir de la `IDataType` interface. + +## Bloc {#block} + +A `Block` est un conteneur qui représente un sous-ensemble (morceau) d'une table en mémoire. C'est juste un ensemble de triplets: `(IColumn, IDataType, column name)`. Pendant l'exécution de la requête, les données sont traitées par `Block`s. Si nous avons un `Block`, nous disposons de données (dans le `IColumn` objet), nous avons des informations sur son type (dans `IDataType`) qui nous indique comment traiter cette colonne, et nous avons le nom de la colonne. Il peut s'agir du nom de colonne d'origine de la table ou d'un nom artificiel attribué pour obtenir des résultats temporaires de calculs. + +Lorsque nous calculons une fonction sur des colonnes dans un bloc, nous ajoutons une autre colonne avec son résultat au bloc, et nous ne touchons pas les colonnes pour les arguments de la fonction car les opérations sont immuables. Plus tard, les colonnes inutiles peuvent être supprimées du bloc, mais pas modifiées. Il est pratique pour l'élimination des sous-expressions communes. + +Des blocs sont créés pour chaque bloc de données traité. Notez que pour le même type de calcul, les noms et les types de colonnes restent les mêmes pour différents blocs, et seules les données de colonne changent. Il est préférable de diviser les données de bloc de l'en-tête de bloc car les petites tailles de Bloc ont une surcharge élevée de chaînes temporaires pour copier shared\_ptrs et les noms de colonnes. + +## Bloquer Les Flux {#block-streams} + +Les flux de blocs sont destinés au traitement des données. Nous utilisons des flux de blocs pour lire des données quelque part, effectuer des transformations de données ou écrire des données quelque part. `IBlockInputStream` a l' `read` méthode pour récupérer le bloc suivant, tandis que des. `IBlockOutputStream` a l' `write` méthode pour pousser le bloc quelque part. + +Les flux sont responsables de: + +1. De la lecture ou de l'écriture dans une table. La table renvoie simplement un flux pour lire ou écrire des blocs. +2. Mise en œuvre des formats de données. Par exemple, si vous souhaitez envoyer des données vers un terminal `Pretty` format, vous créez un flux de sortie de bloc où vous poussez des blocs, et il les formate. +3. Effectuer des transformations de données. Disons que vous avez `IBlockInputStream` et veulent créer un flux filtré. Vous créez `FilterBlockInputStream` et l'initialiser avec votre flux de données. Puis quand vous tirez un bloc de `FilterBlockInputStream`, il extrait un bloc de votre flux, le filtre et vous renvoie le bloc filtré. Les pipelines d'exécution des requêtes sont représentés de cette façon. + +Il y a des transformations plus sophistiquées. Par exemple, lorsque vous tirez de `AggregatingBlockInputStream` il lit toutes les données à partir de sa source, agrégats, puis renvoie un flux de données agrégées pour vous. Un autre exemple: `UnionBlockInputStream` accepte de nombreuses sources d'entrée dans le constructeur et également un certain nombre de threads. Il lance plusieurs threads et lit à partir de plusieurs sources en parallèle. + +> Les flux de blocs utilisent le “pull” approche pour contrôler le flux: lorsque vous extrayez un bloc du premier flux, il extrait par conséquent les blocs requis des flux imbriqués, et l'ensemble du pipeline d'exécution fonctionnera. Ni “pull” ni “push” est la meilleure solution, car le flux de contrôle est implicite, ce qui limite l'implémentation de diverses fonctionnalités telles que l'exécution simultanée de plusieurs requêtes (fusion de plusieurs pipelines ensemble). Cette limitation pourrait être surmontée avec des coroutines ou simplement en exécutant des threads supplémentaires qui s'attendent les uns aux autres. Nous pouvons avoir plus de possibilités si nous rendons le flux de contrôle explicite: si nous localisons la logique pour passer des données d'une unité de calcul à une autre en dehors de ces unités de calcul. Lire ce [article](http://journal.stuffwithstuff.com/2013/01/13/iteration-inside-and-out/) pour plus de pensées. + +Il convient de noter que le pipeline d'exécution de la requête crée des données temporaires à chaque étape. Nous essayons de garder la taille du bloc suffisamment petite pour que les données temporaires tiennent dans le cache du processeur. Avec cette hypothèse, l'écriture et la lecture de données temporaires sont presque libres en comparaison avec d'autres calculs. Nous pourrions envisager une alternative, qui est de fusionner de nombreuses opérations dans le pipeline ensemble. Cela pourrait rendre le pipeline aussi court que possible et supprimer une grande partie des données temporaires, ce qui pourrait être un avantage, mais cela présente également des inconvénients. Par exemple, un pipeline divisé facilite l'implémentation de la mise en cache de données intermédiaires, le vol de données intermédiaires à partir de requêtes similaires exécutées en même temps et la fusion de pipelines pour des requêtes similaires. + +## Format {#formats} + +Les formats de données sont implémentés avec des flux de blocs. Il y a “presentational” formats appropriés uniquement pour la sortie de données vers le client, tels que `Pretty` format, qui fournit seulement `IBlockOutputStream`. Et il existe des formats d'entrée / sortie, tels que `TabSeparated` ou `JSONEachRow`. + +Il y a aussi des flux de lignes: `IRowInputStream` et `IRowOutputStream`. Ils vous permettent de tirer/pousser des données par des lignes individuelles, pas par des blocs. Et ils ne sont nécessaires que pour simplifier la mise en œuvre des formats orientés ligne. Wrapper `BlockInputStreamFromRowInputStream` et `BlockOutputStreamFromRowOutputStream` vous permet de convertir des flux orientés ligne en flux orientés blocs réguliers. + +## I/O {#io} + +Pour l'entrée/sortie orientée octet, il y a `ReadBuffer` et `WriteBuffer` les classes abstraites. Ils sont utilisés à la place de C++ `iostream`s. Ne vous inquiétez pas: chaque projet c++ mature utilise autre chose que `iostream`s pour de bonnes raisons. + +`ReadBuffer` et `WriteBuffer` sont juste un tampon contigu et un curseur pointant vers la position dans ce tampon. Les implémentations peuvent posséder ou non la mémoire du tampon. Il existe une méthode virtuelle pour remplir le tampon avec les données suivantes (pour `ReadBuffer`) ou pour vider le tampon quelque part (pour `WriteBuffer`). Les méthodes virtuelles sont rarement cités. + +Les implémentations de `ReadBuffer`/`WriteBuffer` sont utilisés pour travailler avec des fichiers et des descripteurs de fichiers et des sockets réseau, pour implémenter la compression (`CompressedWriteBuffer` is initialized with another WriteBuffer and performs compression before writing data to it), and for other purposes – the names `ConcatReadBuffer`, `LimitReadBuffer`, et `HashingWriteBuffer` parler pour eux-mêmes. + +Read / WriteBuffers ne traite que les octets. Il y a des fonctions de `ReadHelpers` et `WriteHelpers` fichiers d'en-tête pour aider à formater l'entrée / sortie. Par exemple, il existe des assistants pour écrire un nombre au format décimal. + +Regardons ce qui se passe lorsque vous voulez écrire un ensemble de résultats dans `JSON` format de sortie standard (stdout). Vous avez un jeu de résultats prêt à être récupéré `IBlockInputStream`. Vous créez `WriteBufferFromFileDescriptor(STDOUT_FILENO)` pour écrire des octets dans stdout. Vous créez `JSONRowOutputStream`, initialisé avec qui `WriteBuffer`, pour écrire des lignes dans `JSON` à stdout. Vous créez `BlockOutputStreamFromRowOutputStream` de plus, pour la représenter comme `IBlockOutputStream`. Ensuite, vous appelez `copyData` pour transférer des données de `IBlockInputStream` de `IBlockOutputStream` et tout fonctionne. Interne, `JSONRowOutputStream` écrira divers délimiteurs JSON et appellera `IDataType::serializeTextJSON` méthode avec une référence à `IColumn` et le numéro de ligne comme arguments. Conséquent, `IDataType::serializeTextJSON` appellera une méthode de `WriteHelpers.h`: exemple, `writeText` pour les types numériques et `writeJSONString` pour `DataTypeString`. + +## Table {#tables} + +Le `IStorage` l'interface représente les tables. Différentes implémentations de cette interface sont des moteurs de table différents. Les exemples sont `StorageMergeTree`, `StorageMemory` et ainsi de suite. Les Instances de ces classes ne sont que des tables. + +Clé `IStorage` les méthodes sont `read` et `write`. Il y a aussi des `alter`, `rename`, `drop` et ainsi de suite. Le `read` méthode accepte les arguments suivants: l'ensemble de colonnes à lire à partir d'un tableau, l' `AST` requête à considérer, et le nombre souhaité de flux de retour. Il renvoie un ou plusieurs `IBlockInputStream` objets et informations sur l'étape de traitement des données qui a été effectuée dans un moteur de table lors de l'exécution de la requête. + +Dans la plupart des cas, la méthode read n'est responsable que de la lecture des colonnes spécifiées à partir d'une table, et non d'un traitement ultérieur des données. Tout traitement ultérieur des données est effectué par l'interpréteur de requêtes et n'est pas de la responsabilité de `IStorage`. + +Mais il y a des exceptions notables: + +- La requête AST est transmise au `read` et le moteur de table peut l'utiliser pour dériver l'utilisation de l'index et pour lire moins de données à partir d'une table. +- Parfois, le moteur de table peut traiter les données lui-même à une étape spécifique. Exemple, `StorageDistributed` peut envoyer une requête aux serveurs distants, leur demander de traiter les données à une étape où les données de différents serveurs distants peuvent être fusionnées, et renvoyer ces données prétraitées. L'interpréteur de requête termine ensuite le traitement des données. + +Table `read` la méthode peut retourner plusieurs `IBlockInputStream` objets permettant le traitement parallèle des données. Ces flux d'entrée de bloc multiples peuvent lire à partir d'une table en parallèle. Ensuite, vous pouvez envelopper ces flux avec diverses transformations (telles que l'évaluation d'expression ou le filtrage) qui peuvent être calculées indépendamment et créer un `UnionBlockInputStream` en plus d'eux, pour lire à partir de plusieurs flux en parallèle. + +Il y a aussi des `TableFunction`s. Ce sont des fonctions qui renvoient un `IStorage` objet à utiliser dans le `FROM` la clause d'une requête. + +Pour avoir une idée rapide de la façon d'implémenter votre moteur de table, regardez quelque chose de simple, comme `StorageMemory` ou `StorageTinyLog`. + +> Comme le résultat de l' `read` méthode, `IStorage` retourner `QueryProcessingStage` – information about what parts of the query were already calculated inside storage. + +## Analyseur {#parsers} + +Un analyseur de descente récursif écrit à la main analyse une requête. Exemple, `ParserSelectQuery` appelle simplement récursivement les analyseurs sous-jacents pour diverses parties de la requête. Les analyseurs créent un `AST`. Le `AST` est représenté par des nœuds, qui sont des instances de `IAST`. + +> Les générateurs d'analyseurs ne sont pas utilisés pour des raisons historiques. + +## Interprète {#interpreters} + +Les interprètes sont responsables de la création du pipeline d'exécution des requêtes à partir `AST`. Il existe des interprètes simples, tels que `InterpreterExistsQuery` et `InterpreterDropQuery` ou le plus sophistiqué de `InterpreterSelectQuery`. Le pipeline d'exécution de requête est une combinaison de flux d'entrée ou de sortie de bloc. Par exemple, le résultat de l'interprétation de la `SELECT` la requête est la `IBlockInputStream` pour lire le jeu de résultats; le résultat de la requête d'INSERTION est l' `IBlockOutputStream` pour écrire des données à insérer, et le résultat de l'interprétation `INSERT SELECT` la requête est la `IBlockInputStream` cela renvoie un jeu de résultats vide lors de la première lecture, mais qui copie `SELECT` de `INSERT` dans le même temps. + +`InterpreterSelectQuery` utiliser `ExpressionAnalyzer` et `ExpressionActions` machines pour l'analyse des requêtes et des transformations. C'est là que la plupart des optimisations de requêtes basées sur des règles sont effectuées. `ExpressionAnalyzer` est assez désordonné et devrait être réécrit: diverses transformations et optimisations de requête doivent être extraites dans des classes séparées pour permettre des transformations modulaires ou une requête. + +## Fonction {#functions} + +Il y a des fonctions ordinaires et des fonctions agrégées. Pour les fonctions d'agrégation, voir la section suivante. + +Ordinary functions don't change the number of rows – they work as if they are processing each row independently. In fact, functions are not called for individual rows, but for `Block`'s de données pour implémenter l'exécution de requête vectorisée. + +Il y a quelques fonctions diverses, comme [la taille de bloc](../query_language/functions/other_functions.md#function-blocksize), [rowNumberInBlock](../query_language/functions/other_functions.md#function-rownumberinblock), et [runningAccumulate](../query_language/functions/other_functions.md#function-runningaccumulate), qui exploitent le traitement de bloc et violent l'indépendance des lignes. + +ClickHouse a un typage fort, donc il n'y a pas de conversion de type implicite. Si une fonction ne prend pas en charge une combinaison spécifique de types, elle lève une exception. Mais les fonctions peuvent fonctionner (être surchargées) pour de nombreuses combinaisons de types différentes. Par exemple, l' `plus` fonction (pour mettre en œuvre la `+` opérateur) fonctionne pour toute combinaison de types numériques: `UInt8` + `Float32`, `UInt16` + `Int8` et ainsi de suite. En outre, certaines fonctions variadiques peuvent accepter n'importe quel nombre d'arguments, tels que `concat` fonction. + +L'implémentation d'une fonction peut être légèrement gênante car une fonction distribue explicitement les types de données pris en charge et pris en charge `IColumns`. Par exemple, l' `plus` la fonction a du code généré par l'instanciation D'un modèle C++ pour chaque combinaison de types numériques, et des arguments gauche et droit constants ou non constants. + +C'est un excellent endroit pour implémenter la génération de code d'exécution pour éviter le gonflement du code de modèle. En outre, il permet d'ajouter des fonctions fusionnées comme Fusionné Multiplier-Ajouter ou de faire plusieurs comparaisons dans une itération de boucle. + +En raison de l'exécution de requête vectorisée, les fonctions ne sont pas court-circuitées. Par exemple, si vous écrivez `WHERE f(x) AND g(y)` les deux faces sont calculés, même pour les lignes, quand `f(x)` est égal à zéro (sauf quand `f(x)` est une expression constante nulle). Mais si la sélectivité de l' `f(x)` la condition est élevée, et le calcul de `f(x)` est beaucoup moins cher que `g(y)`, il est préférable d'implémenter le calcul multi-pass. Il serait d'abord calculer `f(x)` puis filtrer les colonnes par la suite, puis de calculer `g(y)` uniquement pour les petits morceaux de données filtrés. + +## Les Fonctions D'Agrégation {#aggregate-functions} + +Les fonctions d'agrégation sont des fonctions avec État. Ils accumulent les valeurs passées dans certains etats et vous permettent d'obtenir des résultats de cet état. Ils sont gérés avec le `IAggregateFunction` interface. Les États peuvent être assez simples (l'État pour `AggregateFunctionCount` est juste un seul `UInt64` valeur) ou très complexes (l'état de `AggregateFunctionUniqCombined` est une combinaison linéaire du tableau, d'une table de hachage, et un `HyperLogLog` structure probabiliste des données). + +Les États sont répartis en `Arena` (un pool de mémoire) pour traiter plusieurs états lors de l'exécution d'une cardinalité élevée `GROUP BY` requête. Les États peuvent avoir un constructeur et un destructeur non triviaux: par exemple, les États d'agrégation compliqués peuvent allouer eux-mêmes de la mémoire supplémentaire. Il faut accorder une certaine attention à la création et à la destruction des États et à la transmission appropriée de leur propriété et de leur ordre de destruction. + +Les États d'agrégation peuvent être sérialisés et désérialisés pour passer sur le réseau pendant l'exécution de la requête distribuée ou pour les écrire sur le disque où il n'y a pas assez de RAM. Ils peuvent même être stockés dans une table avec le `DataTypeAggregateFunction` pour permettre l'agrégation incrémentielle des données. + +> Le format de données sérialisé pour les états de fonction d'agrégat n'est pas versionné pour le moment. C'est ok si les États d'agrégat ne sont stockés que temporairement. Mais nous avons l' `AggregatingMergeTree` moteur de table pour l'agrégation incrémentielle, et les gens l'utilisent déjà en production. C'est la raison pour laquelle la rétrocompatibilité est requise lors de la modification du format sérialisé pour toute fonction d'agrégat à l'avenir. + +## Serveur {#server} + +Le serveur implémente plusieurs interfaces différentes: + +- Une interface HTTP pour tous les clients étrangers. +- Une interface TCP pour le client clickhouse natif et pour la communication inter-serveur lors de l'exécution de la requête distribuée. +- Une interface pour transférer des données pour la réplication. + +En interne, il s'agit simplement d'un serveur multithread primitif sans coroutines ni fibres. Étant donné que le serveur n'est pas conçu pour traiter un taux élevé de requêtes simples, mais pour traiter un taux relativement faible de requêtes complexes, chacun d'eux peut traiter une grande quantité de données à des fins d'analyse. + +Le serveur initialise le `Context` classe avec l'environnement nécessaire à l'exécution des requêtes: la liste des bases de données disponibles, des utilisateurs et des droits d'accès, des paramètres, des clusters, la liste des processus, le journal des requêtes, etc. Les interprètes utilisent cet environnement. + +Nous maintenons une compatibilité ascendante et descendante complète pour le protocole TCP du serveur: les anciens clients peuvent parler à de nouveaux serveurs, et les nouveaux clients peuvent parler à d'anciens serveurs. Mais nous ne voulons pas le maintenir éternellement, et nous supprimons le support pour les anciennes versions après environ un an. + +!!! note "Note" + Pour la plupart des applications externes, nous vous recommandons d'utiliser L'interface HTTP car elle est simple et facile à utiliser. Le protocole TCP est plus étroitement lié aux structures de données internes: il utilise un format interne pour passer des blocs de données, et il utilise un cadrage personnalisé pour les données compressées. Nous n'avons pas publié de bibliothèque C pour ce protocole car elle nécessite de lier la plupart de la base de code ClickHouse, ce qui n'est pas pratique. + +## Exécution De Requête Distribuée {#distributed-query-execution} + +Les serveurs d'une configuration de cluster sont pour la plupart indépendants. Vous pouvez créer un `Distributed` table sur un ou tous les serveurs dans un cluster. Le `Distributed` table does not store data itself – it only provides a “view” à toutes les tables sur plusieurs nœuds d'un cluster. Lorsque vous sélectionnez à partir d'un `Distributed` table, il réécrit cette requête, choisit les nœuds distants en fonction des paramètres d'équilibrage de charge et leur envoie la requête. Le `Distributed` table demande aux serveurs distants de traiter une requête jusqu'à une étape où les résultats intermédiaires de différents serveurs peuvent être fusionnés. Puis il reçoit les résultats intermédiaires et les fusionne. La table distribuée essaie de distribuer autant de travail que possible aux serveurs distants et n'envoie pas beaucoup de données intermédiaires sur le réseau. + +Les choses deviennent plus compliquées lorsque vous avez des sous-requêtes dans des clauses IN ou JOIN, et que chacune d'elles utilise un `Distributed` table. Nous avons différentes stratégies pour l'exécution de ces requêtes. + +Il n'existe pas de plan de requête global pour l'exécution des requêtes distribuées. Chaque nœud a son plan de requête local pour sa partie du travail. Nous n'avons qu'une simple exécution de requête distribuée en une seule passe: nous envoyons des requêtes pour les nœuds distants, puis fusionnons les résultats. Mais cela n'est pas possible pour les requêtes compliquées avec des groupes de cardinalité élevés ou avec une grande quantité de données temporaires pour la jointure. Dans de tels cas, nous avons besoin de “reshuffle” données entre les serveurs, ce qui nécessite une coordination supplémentaire. ClickHouse ne supporte pas ce type d'exécution de requête, et nous devons y travailler. + +## Fusion De L'Arbre {#merge-tree} + +`MergeTree` est une famille de moteurs de stockage qui prend en charge l'indexation par clé primaire. La clé primaire peut être un tuple arbitraire de colonnes ou d'expressions. De données dans un `MergeTree` la table est stockée dans “parts”. Chaque partie stocke les données dans l'ordre de la clé primaire, de sorte que les données sont ordonnées lexicographiquement par le tuple de clé primaire. Toutes les colonnes du tableau sont stockés dans différents `column.bin` les fichiers dans ces régions. Les fichiers sont constitués de blocs compressés. Chaque bloc est généralement de 64 KO à 1 Mo de données non compressées, en fonction de la taille de la valeur moyenne. Les blocs sont constitués de valeurs de colonne placées de manière contiguë l'une après l'autre. Les valeurs de colonne sont dans le même ordre pour chaque colonne (la clé primaire définit l'ordre), donc lorsque vous itérez par plusieurs colonnes, vous obtenez des valeurs pour les lignes correspondantes. + +La clé primaire elle-même est “sparse”. Il ne traite pas chaque ligne, mais seulement certaines plages de données. Séparé `primary.idx` fichier a la valeur de la clé primaire pour chaque N-ième ligne, où N est appelé `index_granularity` (habituellement, N = 8192). Aussi, pour chaque colonne, nous avons `column.mrk` les fichiers avec l' “marks,” qui sont des décalages à chaque N-ème ligne dans le fichier de données. Chaque marque est une paire: le décalage dans le fichier au début du bloc compressé, et le décalage dans le bloc décompressé au début des données. Habituellement, les blocs compressés sont alignés par des marques, et le décalage dans le bloc décompressé est nul. Les données pour `primary.idx` réside toujours dans la mémoire, et les données pour `column.mrk` les fichiers sont mis en cache. + +Quand nous allons lire quelque chose d'une partie dans `MergeTree` nous regardons `primary.idx` données et locate plages qui pourraient contenir des données demandées, puis regardez `column.mrk` données et calculer des décalages pour savoir où commencer à lire ces plages. En raison de la rareté, les données excédentaires peuvent être lues. ClickHouse ne convient pas à une charge élevée de requêtes ponctuelles simples, car toute la gamme avec `index_granularity` les lignes doivent être lues pour chaque clé, et le bloc compressé entier doit être décompressé pour chaque colonne. Nous avons rendu l'index clairsemé parce que nous devons être en mesure de maintenir des milliards de lignes par serveur unique sans consommation de mémoire notable pour l'index. De plus, comme la clé primaire est clairsemée, elle n'est pas unique: elle ne peut pas vérifier l'existence de la clé dans la table au moment de l'insertion. Vous pourriez avoir plusieurs lignes avec la même clé dans une table. + +Lorsque vous `INSERT` un tas de données dans `MergeTree`, ce groupe est trié par ordre de clé primaire et forme une nouvelle partie. Il existe des threads d'arrière-plan qui sélectionnent périodiquement certaines parties et les fusionnent en une seule partie triée pour maintenir le nombre de parties relativement faible. C'est pourquoi il est appelé `MergeTree`. Bien sûr, la fusion conduit à “write amplification”. Toutes les parties sont immuables: elles sont seulement créées et supprimées, mais pas modifiées. Lorsque SELECT est exécuté, il contient un instantané de la table (un ensemble de parties). Après la Fusion, nous conservons également les anciennes pièces pendant un certain temps pour faciliter une récupération après une défaillance, donc si nous voyons qu'une partie fusionnée est probablement cassée, nous pouvons la remplacer par ses parties sources. + +`MergeTree` n'est pas un arbre LSM car il ne contient pas “memtable” et “log”: inserted data is written directly to the filesystem. This makes it suitable only to INSERT data in batches, not by individual row and not very frequently – about once per second is ok, but a thousand times a second is not. We did it this way for simplicity's sake, and because we are already inserting data in batches in our applications. + +> Les tables MergeTree ne peuvent avoir qu'un seul index (primaire): il n'y a pas d'index secondaires. Il serait bon d'autoriser plusieurs représentations physiques sous une table logique, par exemple, pour stocker des données dans plus d'un ordre physique ou même pour autoriser des représentations avec des données pré-agrégées avec des données originales. + +Il existe des moteurs MergeTree qui effectuent un travail supplémentaire lors des fusions en arrière-plan. Les exemples sont `CollapsingMergeTree` et `AggregatingMergeTree`. Cela pourrait être traité comme un support spécial pour les mises à jour. Gardez à l'esprit que ce ne sont pas de vraies mises à jour car les utilisateurs n'ont généralement aucun contrôle sur le moment où les fusions en arrière-plan sont exécutées et les données dans un `MergeTree` la table est presque toujours stockée dans plus d'une partie, pas sous une forme complètement fusionnée. + +## Réplication {#replication} + +La réplication dans ClickHouse peut être configurée sur une base par table. Vous pouvez avoir des tables répliquées et des tables non répliquées sur le même serveur. Vous pouvez également avoir des tables répliquées de différentes manières, comme une table avec une réplication à deux facteurs et une autre avec trois facteurs. + +La réplication est implémentée dans le `ReplicatedMergeTree` moteur de stockage. Le chemin d'accès dans `ZooKeeper` est spécifié comme paramètre pour le moteur de stockage. Toutes les tables avec le même chemin dans `ZooKeeper` devenez des répliques les unes des autres: elles synchronisent leurs données et maintiennent la cohérence. Les répliques peuvent être ajoutées et supprimées dynamiquement simplement en créant ou en supprimant une table. + +La réplication utilise un schéma multi-maître asynchrone. Vous pouvez insérer des données dans n'importe quel réplica qui a une session avec `ZooKeeper`, et les données sont répliquées à toutes les autres répliques de manière asynchrone. Parce que ClickHouse ne prend pas en charge les mises à jour, la réplication est sans conflit. Comme il n'y a pas d'accusé de réception de quorum des insertions, les données juste insérées peuvent être perdues si un nœud échoue. + +Les métadonnées pour la réplication sont stockées dans ZooKeeper. Il existe un journal de réplication qui répertorie les actions à effectuer. Les Actions sont: obtenir une partie; fusionner des parties; déposer une partition, et ainsi de suite. Chaque réplica copie le journal de réplication dans sa file d'attente, puis exécute les actions de la file d'attente. Par exemple, sur l'insertion, l' “get the part” l'action est créée dans le journal, et chaque réplique téléchargements de la partie. Les fusions sont coordonnées entre les répliques pour obtenir des résultats identiques aux octets. Toutes les parties sont fusionnées de la même manière sur toutes les répliques. Il est réalisé en élisant une réplique en tant que leader, et cette réplique initie fusionne et écrit “merge parts” actions dans le journal. + +La réplication est physique: seules les parties compressées sont transférées entre les nœuds, pas les requêtes. Les fusions sont traitées sur chaque réplique indépendamment dans la plupart des cas pour réduire les coûts du réseau en évitant l'amplification du réseau. Grand fusionné les pièces sont envoyées sur le réseau uniquement en cas de retard de réplication. + +En outre, chaque réplique stocke son état dans ZooKeeper comme l'ensemble des pièces et ses sommes de contrôle. Lorsque l'état sur le système de fichiers local diverge de l'état de référence dans ZooKeeper, le réplica restaure sa cohérence en téléchargeant les parties manquantes et brisées à partir d'autres réplicas. Lorsqu'il y a des données inattendues ou brisées dans le système de fichiers local, ClickHouse ne les supprime pas, mais les déplace dans un répertoire séparé et les oublie. + +!!! note "Note" + Le cluster ClickHouse est constitué de fragments indépendants, et chaque fragment est constitué de répliques. Le cluster est **pas élastique**, donc, après avoir ajouté un nouveau fragment, les données ne sont pas rééquilibrées automatiquement entre les fragments. Au lieu de cela, la charge du cluster est censée être ajustée pour être inégale. Cette implémentation vous donne plus de contrôle, et c'est ok pour des clusters relativement petits, tels que des dizaines de nœuds. Mais pour les clusters avec des centaines de nœuds que nous utilisons en production, cette approche devient un inconvénient important. Nous devrions implémenter un moteur de table qui s'étend sur le cluster avec des régions répliquées dynamiquement qui pourraient être divisées et équilibrées automatiquement entre les clusters. + +{## [Article Original](https://clickhouse.tech/docs/en/development/architecture/) ##} diff --git a/docs/fr/development/browse_code.md b/docs/fr/development/browse_code.md new file mode 100644 index 00000000000..49f49dcb26e --- /dev/null +++ b/docs/fr/development/browse_code.md @@ -0,0 +1,11 @@ +--- +machine_translated: true +--- + +# Parcourir Le Code Source De ClickHouse {#browse-clickhouse-source-code} + +Vous pouvez utiliser **Woboq** navigateur de code en ligne disponible [ici](https://clickhouse-test-reports.s3.yandex.net/codebrowser/html_report///ClickHouse/dbms/src/index.html). Il fournit la navigation de code et la mise en évidence sémantique, la recherche et l'indexation. L'instantané de code est mis à jour quotidiennement. + +Aussi, vous pouvez parcourir les sources sur [GitHub](https://github.com/ClickHouse/ClickHouse) comme à l'habitude. + +Si vous êtes intéressé par L'IDE à utiliser, nous vous recommandons CLion, Qt Creator, VS Code et KDevelop (avec des mises en garde). Vous pouvez utiliser N'importe quel IDE préféré. Vim et Emacs comptent également. diff --git a/docs/fr/development/build.md b/docs/fr/development/build.md new file mode 100644 index 00000000000..7fa1bb066ea --- /dev/null +++ b/docs/fr/development/build.md @@ -0,0 +1,138 @@ +--- +machine_translated: true +--- + +# Comment Construire ClickHouse pour le développement {#how-to-build-clickhouse-for-development} + +Le tutoriel suivant est basé sur le système Linux Ubuntu. +Avec les modifications appropriées, il devrait également fonctionner sur toute autre distribution Linux. +Plates-formes prises en charge: x86\_64 et AArch64. La prise en charge de Power9 est expérimentale. + +## Installez Git, CMake, Python et Ninja {#install-git-cmake-python-and-ninja} + +``` bash +$ sudo apt-get install git cmake python ninja-build +``` + +Ou cmake3 au lieu de cmake sur les systèmes plus anciens. + +## Installer GCC 9 {#install-gcc-9} + +Il y a plusieurs façons de le faire. + +### Installer à partir d'un paquet PPA {#install-from-a-ppa-package} + +``` bash +$ sudo apt-get install software-properties-common +$ sudo apt-add-repository ppa:ubuntu-toolchain-r/test +$ sudo apt-get update +$ sudo apt-get install gcc-9 g++-9 +``` + +### Installer à partir de Sources {#install-from-sources} + +Regarder [utils/ci/build-gcc-from-sources.sh](https://github.com/ClickHouse/ClickHouse/blob/master/utils/ci/build-gcc-from-sources.sh) + +## Utilisez GCC 9 pour les Builds {#use-gcc-9-for-builds} + +``` bash +$ export CC=gcc-9 +$ export CXX=g++-9 +``` + +## Commander Clickhouse Sources {#checkout-clickhouse-sources} + +``` bash +$ git clone --recursive git@github.com:ClickHouse/ClickHouse.git +``` + +ou + +``` bash +$ git clone --recursive https://github.com/ClickHouse/ClickHouse.git +``` + +## Construire ClickHouse {#build-clickhouse} + +``` bash +$ cd ClickHouse +$ mkdir build +$ cd build +$ cmake .. +$ ninja +$ cd .. +``` + +Pour créer un exécutable, exécutez `ninja clickhouse`. +Cela va créer de l' `dbms/programs/clickhouse` exécutable, qui peut être utilisé avec `client` ou `server` argument. + +# Comment Construire ClickHouse sur N'importe quel Linux {#how-to-build-clickhouse-on-any-linux} + +La construction nécessite les composants suivants: + +- Git (est utilisé uniquement pour extraire les sources, ce n'est pas nécessaire pour la construction) +- CMake 3.10 ou plus récent +- Ninja (recommandé) ou faire +- Compilateur C++: gcc 9 ou clang 8 ou plus récent +- Linker: lld ou gold (le classique GNU LD ne fonctionnera pas) +- Python (est seulement utilisé dans la construction LLVM et il est facultatif) + +Si tous les composants sont installés, vous pouvez construire de la même manière que les étapes ci-dessus. + +Exemple pour Ubuntu Eoan: + + sudo apt update + sudo apt install git cmake ninja-build g++ python + git clone --recursive https://github.com/ClickHouse/ClickHouse.git + mkdir build && cd build + cmake ../ClickHouse + ninja + +Exemple Pour openSUSE Tumbleweed: + + sudo zypper install git cmake ninja gcc-c++ python lld + git clone --recursive https://github.com/ClickHouse/ClickHouse.git + mkdir build && cd build + cmake ../ClickHouse + ninja + +Exemple Pour Fedora Rawhide: + + sudo yum update + yum --nogpg install git cmake make gcc-c++ python2 + git clone --recursive https://github.com/ClickHouse/ClickHouse.git + mkdir build && cd build + cmake ../ClickHouse + make -j $(nproc) + +# Vous N'avez pas à construire ClickHouse {#you-dont-have-to-build-clickhouse} + +ClickHouse est disponible dans des binaires et des paquets pré-construits. Les binaires sont portables et peuvent être exécutés sur N'importe quelle saveur Linux. + +Ils sont conçus pour les versions stables, préconfigurables et de test aussi longtemps que pour chaque commit à master et pour chaque requête d'extraction. + +Pour trouver la construction la plus fraîche de `master`, aller à [page commits](https://github.com/ClickHouse/ClickHouse/commits/master), cliquez sur la première coche verte ou Croix Rouge près de commit, et cliquez sur le “Details” lien à droite après “ClickHouse Build Check”. + +# Comment construire le paquet ClickHouse Debian {#how-to-build-clickhouse-debian-package} + +## Installer Git et Pbuilder {#install-git-and-pbuilder} + +``` bash +$ sudo apt-get update +$ sudo apt-get install git python pbuilder debhelper lsb-release fakeroot sudo debian-archive-keyring debian-keyring +``` + +## Commander Clickhouse Sources {#checkout-clickhouse-sources-1} + +``` bash +$ git clone --recursive --branch master https://github.com/ClickHouse/ClickHouse.git +$ cd ClickHouse +``` + +## Exécuter Le Script De Publication {#run-release-script} + +``` bash +$ ./release +``` + +[Article Original](https://clickhouse.tech/docs/en/development/build/) diff --git a/docs/fr/development/build_cross_arm.md b/docs/fr/development/build_cross_arm.md new file mode 100644 index 00000000000..c7ec1857151 --- /dev/null +++ b/docs/fr/development/build_cross_arm.md @@ -0,0 +1,40 @@ +--- +machine_translated: true +--- + +# Comment Construire ClickHouse sur Linux pour l'architecture AARCH64 (ARM64) {#how-to-build-clickhouse-on-linux-for-aarch64-arm64-architecture} + +C'est pour le cas où vous avez machine Linux et que vous voulez utiliser pour construire `clickhouse` binaire qui fonctionnera sur une autre machine Linux avec une architecture CPU AARCH64. Ceci est destiné aux contrôles d'intégration continus qui s'exécutent sur des serveurs Linux. + +La construction croisée pour AARCH64 est basée sur [Instructions de construction](build.md), suivez d'abord. + +# Installer Clang-8 {#install-clang-8} + +Suivez les instructions de https://apt.llvm.org/ pour votre configuration Ubuntu ou Debian. +Par exemple, dans Ubuntu Bionic vous pouvez utiliser les commandes suivantes: + +``` bash +echo "deb [trusted=yes] http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main" | sudo tee /etc/apt/sources.list.d/llvm.list +sudo apt-get update +sudo apt-get install clang-8 +``` + +# Installer Un Ensemble D'Outils De Compilation Croisée {#install-cross-compilation-toolset} + +``` bash +cd ClickHouse +mkdir -p build-aarch64/cmake/toolchain/linux-aarch64 +wget 'https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz?revision=2e88a73f-d233-4f96-b1f4-d8b36e9bb0b9&la=en' -O gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz +tar xJf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C build-aarch64/cmake/toolchain/linux-aarch64 --strip-components=1 +``` + +# Construire ClickHouse {#build-clickhouse} + +``` bash +cd ClickHouse +mkdir build-arm64 +CC=clang-8 CXX=clang++-8 cmake . -Bbuild-arm64 -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake +ninja -C build-arm64 +``` + +Le binaire résultant s'exécutera uniquement sur Linux avec l'architecture CPU AARCH64. diff --git a/docs/fr/development/build_cross_osx.md b/docs/fr/development/build_cross_osx.md new file mode 100644 index 00000000000..f95663992c3 --- /dev/null +++ b/docs/fr/development/build_cross_osx.md @@ -0,0 +1,61 @@ +--- +machine_translated: true +--- + +# Comment Construire ClickHouse sur Linux pour Mac OS X {#how-to-build-clickhouse-on-linux-for-mac-os-x} + +C'est pour le cas où vous avez machine Linux et que vous voulez utiliser pour construire `clickhouse` binaire qui s'exécutera sur OS X. Ceci est destiné aux contrôles d'intégration continus qui s'exécutent sur des serveurs Linux. Si vous voulez construire ClickHouse directement sur Mac OS X, puis procéder à [une autre instruction](build_osx.md). + +Le cross-build pour Mac OS X est basé sur le [Instructions de construction](build.md), suivez d'abord. + +# Installer Clang-8 {#install-clang-8} + +Suivez les instructions de https://apt.llvm.org/ pour votre configuration Ubuntu ou Debian. +Par exemple les commandes pour Bionic sont comme: + +``` bash +sudo echo "deb [trusted=yes] http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main" >> /etc/apt/sources.list +sudo apt-get install clang-8 +``` + +# Installer Un Ensemble D'Outils De Compilation Croisée {#install-cross-compilation-toolset} + +Souvenons nous du chemin où nous installons `cctools` comme ${CCTOOLS} + +``` bash +mkdir ${CCTOOLS} + +git clone https://github.com/tpoechtrager/apple-libtapi.git +cd apple-libtapi +INSTALLPREFIX=${CCTOOLS} ./build.sh +./install.sh +cd .. + +git clone https://github.com/tpoechtrager/cctools-port.git +cd cctools-port/cctools +./configure --prefix=${CCTOOLS} --with-libtapi=${CCTOOLS} --target=x86_64-apple-darwin +make install +``` + +En outre, nous devons télécharger macOS X SDK dans l'arbre de travail. + +``` bash +cd ClickHouse +wget 'https://github.com/phracker/MacOSX-SDKs/releases/download/10.14-beta4/MacOSX10.14.sdk.tar.xz' +mkdir -p build-darwin/cmake/toolchain/darwin-x86_64 +tar xJf MacOSX10.14.sdk.tar.xz -C build-darwin/cmake/toolchain/darwin-x86_64 --strip-components=1 +``` + +# Construire ClickHouse {#build-clickhouse} + +``` bash +cd ClickHouse +mkdir build-osx +CC=clang-8 CXX=clang++-8 cmake . -Bbuild-osx -DCMAKE_TOOLCHAIN_FILE=cmake/darwin/toolchain-x86_64.cmake \ + -DCMAKE_AR:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ar \ + -DCMAKE_RANLIB:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ranlib \ + -DLINKER_NAME=${CCTOOLS}/bin/x86_64-apple-darwin-ld +ninja -C build-osx +``` + +Le binaire résultant aura un format exécutable Mach-O et ne pourra pas être exécuté sous Linux. diff --git a/docs/fr/development/build_osx.md b/docs/fr/development/build_osx.md new file mode 100644 index 00000000000..9730a864726 --- /dev/null +++ b/docs/fr/development/build_osx.md @@ -0,0 +1,90 @@ +--- +machine_translated: true +--- + +# Comment Construire ClickHouse sur Mac OS X {#how-to-build-clickhouse-on-mac-os-x} + +Build devrait fonctionner sur Mac OS X 10.15 (Catalina) + +## Installer Homebrew {#install-homebrew} + +``` bash +$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +``` + +## Installez les compilateurs, outils et bibliothèques requis {#install-required-compilers-tools-and-libraries} + +``` bash +$ brew install cmake ninja libtool gettext +``` + +## Commander Clickhouse Sources {#checkout-clickhouse-sources} + +``` bash +$ git clone --recursive git@github.com:ClickHouse/ClickHouse.git +``` + +ou + +``` bash +$ git clone --recursive https://github.com/ClickHouse/ClickHouse.git + +$ cd ClickHouse +``` + +## Construire ClickHouse {#build-clickhouse} + +``` bash +$ mkdir build +$ cd build +$ cmake .. -DCMAKE_CXX_COMPILER=`which clang++` -DCMAKE_C_COMPILER=`which clang` +$ ninja +$ cd .. +``` + +## Mises en garde {#caveats} + +Si vous avez l'intention d'exécuter clickhouse-server, assurez-vous d'augmenter la variable maxfiles du système. + +!!! info "Note" + Vous aurez besoin d'utiliser sudo. + +Pour ce faire, créez le fichier suivant: + +/ Bibliothèque / LaunchDaemons / limite.maxfiles.plist: + +``` xml + + + + + Label + limit.maxfiles + ProgramArguments + + launchctl + limit + maxfiles + 524288 + 524288 + + RunAtLoad + + ServiceIPC + + + +``` + +Exécutez la commande suivante: + +``` bash +$ sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist +``` + +Redémarrer. + +Pour vérifier si elle fonctionne, vous pouvez utiliser `ulimit -n` commande. + +[Article Original](https://clickhouse.tech/docs/en/development/build_osx/) diff --git a/docs/fr/development/contrib.md b/docs/fr/development/contrib.md new file mode 100644 index 00000000000..2d06428dba0 --- /dev/null +++ b/docs/fr/development/contrib.md @@ -0,0 +1,39 @@ +--- +machine_translated: true +--- + +# Bibliothèques Tierces Utilisées {#third-party-libraries-used} + +| Bibliothèque | Licence | +|----------------------|------------------------------------------------------------------------------------------------------------------------------------------------| +| base64 | [Licence BSD 2-Clause](https://github.com/aklomp/base64/blob/a27c565d1b6c676beaf297fe503c4518185666f7/LICENSE) | +| stimuler | [Licence Logicielle Boost 1.0](https://github.com/ClickHouse-Extras/boost-extra/blob/6883b40449f378019aec792f9983ce3afc7ff16e/LICENSE_1_0.txt) | +| brotli | [MIT](https://github.com/google/brotli/blob/master/LICENSE) | +| capnproto | [MIT](https://github.com/capnproto/capnproto/blob/master/LICENSE) | +| cctz | [Licence Apache 2.0](https://github.com/google/cctz/blob/4f9776a310f4952454636363def82c2bf6641d5f/LICENSE.txt) | +| double-conversion | [Licence BSD 3-Clause](https://github.com/google/double-conversion/blob/cf2f0f3d547dc73b4612028a155b80536902ba02/LICENSE) | +| FastMemcpy | [MIT](https://github.com/ClickHouse/ClickHouse/blob/master/libs/libmemcpy/impl/LICENSE) | +| googletest | [Licence BSD 3-Clause](https://github.com/google/googletest/blob/master/LICENSE) | +| h3 | [Licence Apache 2.0](https://github.com/uber/h3/blob/master/LICENSE) | +| hyperscan | [Licence BSD 3-Clause](https://github.com/intel/hyperscan/blob/master/LICENSE) | +| libbtrie | [Licence BSD 2-Clause](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libbtrie/LICENSE) | +| libcxxabi | [BSD + MIT](https://github.com/ClickHouse/ClickHouse/blob/master/libs/libglibc-compatibility/libcxxabi/LICENSE.TXT) | +| libdivide | [Licence Zlib](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libdivide/LICENSE.txt) | +| libgsasl | [LGPL v2.1](https://github.com/ClickHouse-Extras/libgsasl/blob/3b8948a4042e34fb00b4fb987535dc9e02e39040/LICENSE) | +| libhdfs3 | [Licence Apache 2.0](https://github.com/ClickHouse-Extras/libhdfs3/blob/bd6505cbb0c130b0db695305b9a38546fa880e5a/LICENSE.txt) | +| libmetrohash | [Licence Apache 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libmetrohash/LICENSE) | +| libpcg-aléatoire | [Licence Apache 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/libpcg-random/LICENSE-APACHE.txt) | +| libressl | [Licence OpenSSL](https://github.com/ClickHouse-Extras/ssl/blob/master/COPYING) | +| librdkafka | [Licence BSD 2-Clause](https://github.com/edenhill/librdkafka/blob/363dcad5a23dc29381cc626620e68ae418b3af19/LICENSE) | +| libwidechar\_width | [CC0 1.0 universel](https://github.com/ClickHouse/ClickHouse/blob/master/libs/libwidechar_width/LICENSE) | +| llvm | [Licence BSD 3-Clause](https://github.com/ClickHouse-Extras/llvm/blob/163def217817c90fb982a6daf384744d8472b92b/llvm/LICENSE.TXT) | +| lz4 | [Licence BSD 2-Clause](https://github.com/lz4/lz4/blob/c10863b98e1503af90616ae99725ecd120265dfb/LICENSE) | +| mariadb-connecteur-c | [LGPL v2.1](https://github.com/ClickHouse-Extras/mariadb-connector-c/blob/3.1/COPYING.LIB) | +| murmurhash | [Domaine Public](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/murmurhash/LICENSE) | +| pdqsort | [Licence Zlib](https://github.com/ClickHouse/ClickHouse/blob/master/contrib/pdqsort/license.txt) | +| poco | [Licence Du Logiciel Boost-Version 1.0](https://github.com/ClickHouse-Extras/poco/blob/fe5505e56c27b6ecb0dcbc40c49dc2caf4e9637f/LICENSE) | +| protobuf | [Licence BSD 3-Clause](https://github.com/ClickHouse-Extras/protobuf/blob/12735370922a35f03999afff478e1c6d7aa917a4/LICENSE) | +| re2 | [Licence BSD 3-Clause](https://github.com/google/re2/blob/7cf8b88e8f70f97fd4926b56aa87e7f53b2717e0/LICENSE) | +| UnixODBC | [LGPL v2.1](https://github.com/ClickHouse-Extras/UnixODBC/tree/b0ad30f7f6289c12b76f04bfb9d466374bb32168) | +| zlib-ng | [Licence Zlib](https://github.com/ClickHouse-Extras/zlib-ng/blob/develop/LICENSE.md) | +| zstd | [Licence BSD 3-Clause](https://github.com/facebook/zstd/blob/dev/LICENSE) | diff --git a/docs/fr/development/developer_instruction.md b/docs/fr/development/developer_instruction.md new file mode 100644 index 00000000000..fedec292b2b --- /dev/null +++ b/docs/fr/development/developer_instruction.md @@ -0,0 +1,282 @@ +--- +machine_translated: true +--- + +La construction de ClickHouse est prise en charge sous Linux, FreeBSD et Mac OS X. + +# Si vous utilisez Windows {#if-you-use-windows} + +Si vous utilisez Windows, vous devez créer une machine virtuelle avec Ubuntu. Pour commencer à travailler avec une machine virtuelle, installez VirtualBox. Vous pouvez télécharger Ubuntu sur le site: https://www.ubuntu.com/\#download. veuillez créer une machine virtuelle à partir de l'image téléchargée (vous devez réserver au moins 4 Go de RAM pour cela). Pour exécuter un terminal de ligne de commande dans Ubuntu, recherchez un programme contenant le mot “terminal” dans son nom (gnome-terminal, konsole etc.) ou appuyez simplement sur Ctrl + Alt + T. + +# Si vous utilisez un système 32 bits {#if-you-use-a-32-bit-system} + +ClickHouse ne peut pas fonctionner ou construire sur un système 32 bits. Vous devez acquérir l'accès à un système 64 bits et vous pouvez continuer la lecture. + +# Création d'un référentiel sur GitHub {#creating-a-repository-on-github} + +Pour commencer à travailler avec clickhouse repository, vous aurez besoin d'un compte GitHub. + +Vous en avez probablement déjà un, mais si vous ne le faites pas, veuillez vous inscrire à https://github.com. dans le cas où vous n'avez pas de clés SSH, vous devez les générer, puis les télécharger sur GitHub. Il est nécessaire pour l'envoi de vos correctifs. Il est également possible d'utiliser les mêmes clés SSH que vous utilisez avec d'autres serveurs SSH - vous les avez probablement déjà. + +Créer un fork de clickhouse repository. Pour ce faire, cliquez sur l' “fork” bouton dans le coin supérieur droit à https://github.com/ClickHouse/ClickHouse. il fourche votre propre copie de ClickHouse / ClickHouse à votre compte. + +Le processus de développement consiste d'abord à valider les modifications prévues dans votre fork de ClickHouse, puis à créer un “pull request” pour que ces modifications soient acceptées dans le référentiel principal (ClickHouse/ClickHouse). + +Pour travailler avec les dépôts git, veuillez installer `git`. + +Pour ce faire dans Ubuntu vous exécutez dans le terminal de ligne de commande: + + sudo apt update + sudo apt install git + +Un bref manuel sur l'utilisation de Git peut être trouvé ici: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf. +Pour un manuel détaillé sur Git voir https://git-scm.com/book/en/v2. + +# Clonage d'un référentiel sur votre machine de développement {#cloning-a-repository-to-your-development-machine} + +Ensuite, vous devez télécharger les fichiers source sur votre machine de travail. Ceci est appelé “to clone a repository” parce qu'il crée une copie locale du dépôt sur votre machine de travail. + +Dans le terminal de ligne de commande exécuter: + + git clone --recursive git@guthub.com:your_github_username/ClickHouse.git + cd ClickHouse + +Remarque: Veuillez remplacer *your\_github\_username* avec ce qui est approprié! + +Cette commande va créer un répertoire `ClickHouse` contenant la copie de travail du projet. + +Il est important que le chemin d'accès au répertoire de travail ne contienne aucun espace, car cela peut entraîner des problèmes lors de l'exécution du système de construction. + +Veuillez noter que clickhouse repository utilise `submodules`. That is what the references to additional repositories are called (i.e. external libraries on which the project depends). It means that when cloning the repository you need to specify the `--recursive` drapeau comme dans l'exemple ci-dessus. Si le dépôt a été cloné sans submodules, pour télécharger, vous devez exécuter les opérations suivantes: + + git submodule init + git submodule update + +Vous pouvez vérifier l'état avec la commande: `git submodule status`. + +Si vous obtenez le message d'erreur suivantes: + + Permission denied (publickey). + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + +Cela signifie généralement que les clés SSH pour la connexion à GitHub sont manquantes. Ces clés sont normalement situés dans `~/.ssh`. Pour que les clés SSH soient acceptées, vous devez les télécharger dans la section Paramètres de L'interface utilisateur GitHub. + +Vous pouvez également cloner le référentiel via le protocole https: + + git clone https://github.com/ClickHouse/ClickHouse.git + +Ceci, cependant, ne vous permettra pas d'envoyer vos modifications sur le serveur. Vous pouvez toujours l'utiliser temporairement et ajouter les clés SSH plus tard en remplaçant l'adresse distante du référentiel par `git remote` commande. + +Vous pouvez également ajouter l'adresse du dépôt clickhouse original à votre référentiel local pour extraire les mises à jour à partir de là: + + git remote add upstream git@github.com:ClickHouse/ClickHouse.git + +Après avoir exécuté avec succès cette commande vous serez en mesure de tirer les mises à jour du repo clickhouse principal en exécutant `git pull upstream master`. + +## Travailler avec des submodules {#working-with-submodules} + +Travailler avec des sous-modules dans git pourrait être douloureux. Prochaines commandes aidera à gérer: + + # ! each command accepts --recursive + # Update remote URLs for submodules. Barely rare case + git submodule sync + # Add new submodules + git submodule init + # Update existing submodules to the current state + git submodule update + # Two last commands could be merged together + git submodule update --init + +Les commandes suivantes vous aideront à réinitialiser tous les sous-modules à l'état initial (!AVERTISSEMENT! - tout changement à l'intérieur sera supprimé): + + # Synchronizes submodules' remote URL with .gitmodules + git submodule sync --recursive + # Update the registered submodules with initialize not yet initialized + git submodule update --init --recursive + # Reset all changes done after HEAD + git submodule foreach git reset --hard + # Clean files from .gitignore + git submodule foreach git clean -xfd + # Repeat last 4 commands for all submodule + git submodule foreach git submodule sync --recursive + git submodule foreach git submodule update --init --recursive + git submodule foreach git submodule foreach git reset --hard + git submodule foreach git submodule foreach git clean -xfd + +# Système De Construction {#build-system} + +ClickHouse utilise CMake et Ninja pour la construction. + +CMake - un système de méta-construction qui peut générer des fichiers Ninja (tâches de construction). +Ninja - un système de construction plus petit avec un accent sur la vitesse utilisée pour exécuter ces tâches générées cmake. + +Pour installer sur Ubuntu, Debian ou mint run `sudo apt install cmake ninja-build`. + +Sur CentOS, RedHat run `sudo yum install cmake ninja-build`. + +Si vous utilisez Arch ou Gentoo, vous savez probablement vous - même comment installer CMake. + +Pour installer CMake et Ninja sur Mac OS X installez D'abord Homebrew puis installez tout le reste via brew: + + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + brew install cmake ninja + +Ensuite, vérifiez la version de CMake: `cmake --version`. Si elle est inférieure à 3.3, vous devez installer une version plus récente du site web: https://cmake.org/download/. + +# Bibliothèques Externes Facultatives {#optional-external-libraries} + +ClickHouse utilise plusieurs bibliothèques externes pour la construction. Tous n'ont pas besoin d'être installés séparément car ils sont construits avec ClickHouse à partir des sources situées dans les sous-modules. Vous pouvez vérifier la liste dans `contrib`. + +# Compilateur C++ {#c-compiler} + +Les compilateurs GCC à partir de la version 9 et Clang version 8 ou supérieure sont pris en charge pour construire ClickHouse. + +Les builds officiels de Yandex utilisent actuellement GCC car ils génèrent du code machine de performances légèrement meilleures (ce qui donne une différence allant jusqu'à plusieurs pour cent selon nos benchmarks). Et Clang est plus pratique pour le développement habituellement. Cependant, notre plate-forme d'intégration continue (CI) vérifie environ une douzaine de combinaisons de construction. + +Pour installer GCC sur Ubuntu Exécutez: `sudo apt install gcc g++` + +Vérifiez la version de gcc: `gcc --version`. Si elle est inférieure à 9, suivez les instructions ici: https://clickhouse.tech/docs/fr/développement/construction/\#install-gcc-9. + +Mac OS X build est pris en charge uniquement pour Clang. Il suffit d'exécuter `brew install llvm` + +Si vous décidez d'utiliser Clang, vous pouvez également installer `libc++` et `lld` si vous savez ce que c'est. Utiliser `ccache` est également recommandé. + +# Le processus de construction {#the-building-process} + +Maintenant que vous êtes prêt à construire ClickHouse nous vous conseillons de créer un répertoire séparé `build` à l'intérieur de `ClickHouse` qui contiendra tous les artefacts de construction: + + mkdir build + cd build + +Vous pouvez avoir plusieurs répertoires différents (build\_release, build\_debug, etc.) pour les différents types de construction. + +Tandis qu'à l'intérieur de la `build` répertoire, configurez votre build en exécutant CMake. Avant la première exécution, vous devez définir des variables d'environnement qui spécifient le compilateur (compilateur gcc version 9 dans cet exemple). + +Linux: + + export CC=gcc-9 CXX=g++-9 + cmake .. + +Mac OS X: + + export CC=clang CXX=clang++ + cmake .. + +Le `CC` variable spécifie le compilateur pour C (abréviation de compilateur C), et `CXX` variable indique quel compilateur C++ doit être utilisé pour la construction. + +Pour une version plus rapide, vous pouvez recourir à l' `debug` build type - Une construction sans optimisations. Pour cela fournissez le paramètre suivant `-D CMAKE_BUILD_TYPE=Debug`: + + cmake -D CMAKE_BUILD_TYPE=Debug .. + +Vous pouvez modifier le type de génération en exécutant cette commande dans le `build` répertoire. + +Exécutez ninja pour construire: + + ninja clickhouse-server clickhouse-client + +Seules les binaires vont être construites dans cet exemple. + +Si vous avez besoin de construire tous les binaires (utilitaires et tests), vous devez exécuter ninja sans paramètres: + + ninja + +La construction complète nécessite environ 30 Go d'espace disque libre ou 15 Go pour construire les binaires principaux. + +Lorsqu'une grande quantité de RAM est disponible sur la machine de construction vous devez limiter le nombre de tâches de construction exécutées en parallèle avec `-j` param: + + ninja -j 1 clickhouse-server clickhouse-client + +Sur les machines avec 4 Go de RAM, il est recommandé de spécifier 1, pour 8 Go de RAM `-j 2` est recommandé. + +Si vous recevez le message: `ninja: error: loading 'build.ninja': No such file or directory`, cela signifie que la génération d'une configuration de construction a échoué et que vous devez inspecter le message ci-dessus. + +Après le démarrage réussi du processus de construction, vous verrez la progression de la construction - le nombre de tâches traitées et le nombre total de tâches. + +Lors de la construction de messages sur les fichiers protobuf dans la bibliothèque libhdfs2 comme `libprotobuf WARNING` peuvent apparaître. Ils touchent rien et sont sûrs d'être ignoré. + +Lors de la construction, vous obtenez un fichier exécutable `ClickHouse//dbms/programs/clickhouse`: + + ls -l dbms/programs/clickhouse + +# Exécution de L'exécutable construit de ClickHouse {#running-the-built-executable-of-clickhouse} + +Pour exécuter le serveur sous l'utilisateur actuel vous devez naviguer vers `ClickHouse/dbms/programs/server/` (situé à l'extérieur de `build` et les exécuter: + + ../../../build/dbms/programs/clickhouse server + +Dans ce cas, ClickHouse utilisera les fichiers de configuration situés dans le répertoire courant. Vous pouvez l'exécuter `clickhouse server` depuis n'importe quel répertoire spécifiant le chemin d'accès à un fichier de configuration en tant que paramètre de ligne de commande `--config-file`. + +Pour vous connecter à ClickHouse avec clickhouse-client dans un autre terminal, accédez à `ClickHouse/build/dbms/programs/` et exécuter `clickhouse client`. + +Si vous obtenez `Connection refused` message sur Mac OS X ou FreeBSD, essayez de spécifier l'adresse hôte 127.0.0.1: + + clickhouse client --host 127.0.0.1 + +Vous pouvez remplacer la version de production de clickhouse binary installée dans votre système par votre clickhouse Binary sur mesure. Pour ce faire, installez ClickHouse sur votre machine en suivant les instructions du site officiel. Ensuite, exécutez ce qui suit: + + sudo service clickhouse-server stop + sudo cp ClickHouse/build/dbms/programs/clickhouse /usr/bin/ + sudo service clickhouse-server start + +Notez que `clickhouse-client`, `clickhouse-server` et d'autres sont des liens symboliques à la commune `clickhouse` binaire. + +Vous pouvez également exécuter votre binaire ClickHouse personnalisé avec le fichier de configuration du package clickhouse installé sur votre système: + + sudo service clickhouse-server stop + sudo -u clickhouse ClickHouse/build/dbms/programs/clickhouse server --config-file /etc/clickhouse-server/config.xml + +# IDE (environnement de développement intégré) {#ide-integrated-development-environment} + +Si vous ne savez pas quel IDE utiliser, nous vous recommandons D'utiliser CLion. CLion est un logiciel commercial, mais il offre une période d'essai gratuite de 30 jours. Il est également gratuit pour les étudiants. CLion peut être utilisé à la fois sur Linux et sur Mac OS X. + +KDevelop et QTCreator sont d'autres grandes alternatives D'un IDE pour développer ClickHouse. KDevelop est un IDE très pratique bien qu'instable. Si KDevelop se bloque après un certain temps lors de l'ouverture du projet, vous devez cliquer sur “Stop All” bouton dès qu'il a ouvert la liste des fichiers du projet. Après cela, KDevelop devrait être bien pour travailler avec. + +En tant qu'éditeurs de code simples, vous pouvez utiliser Sublime Text ou Visual Studio Code, ou Kate (qui sont tous disponibles sur Linux). + +Juste au cas où, il convient de mentionner que CLion crée `build` chemin sur son propre, il aussi sur son propre sélectionne `debug` pour le type de construction, pour la configuration, il utilise une version de CMake définie dans CLion et non celle installée par vous, et enfin, CLion utilisera `make` pour exécuter construire des tâches au lieu de `ninja`. C'est un comportement normal, gardez cela à l'esprit pour éviter toute confusion. + +# L'Écriture De Code {#writing-code} + +La description de l'architecture ClickHouse peut être trouvée ici: https://clickhouse.tech/docs/fr/développement/architecture/ + +Le code Style Guide: https://clickhouse.tech/docs/fr/développement/style/ + +Rédaction de tests: https://clickhouse.tech/docs/fr/développement/tests/ + +Liste des tâches: https://github.com/ClickHouse/ClickHouse/blob/master/dbms/tests/instructions/easy\_tasks\_sorted\_en.md + +# Des Données De Test {#test-data} + +Le développement de ClickHouse nécessite souvent le chargement d'ensembles de données réalistes. Il est particulièrement important pour les tests de performance. Nous avons un ensemble spécialement préparé de données anonymisées de Yandex.Metrica. Il nécessite en outre quelques 3 Go d'espace disque libre. Notez que ces données ne sont pas requises pour accomplir la plupart des tâches de développement. + + sudo apt install wget xz-utils + + wget https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits_v1.tsv.xz + wget https://clickhouse-datasets.s3.yandex.net/visits/tsv/visits_v1.tsv.xz + + xz -v -d hits_v1.tsv.xz + xz -v -d visits_v1.tsv.xz + + clickhouse-client + + CREATE TABLE test.hits ( WatchID UInt64, JavaEnable UInt8, Title String, GoodEvent Int16, EventTime DateTime, EventDate Date, CounterID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RegionID UInt32, UserID UInt64, CounterClass Int8, OS UInt8, UserAgent UInt8, URL String, Referer String, URLDomain String, RefererDomain String, Refresh UInt8, IsRobot UInt8, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), ResolutionWidth UInt16, ResolutionHeight UInt16, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, FlashMinor2 String, NetMajor UInt8, NetMinor UInt8, UserAgentMajor UInt16, UserAgentMinor FixedString(2), CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, MobilePhone UInt8, MobilePhoneModel String, Params String, IPNetworkID UInt32, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, IsArtifical UInt8, WindowClientWidth UInt16, WindowClientHeight UInt16, ClientTimeZone Int16, ClientEventTime DateTime, SilverlightVersion1 UInt8, SilverlightVersion2 UInt8, SilverlightVersion3 UInt32, SilverlightVersion4 UInt16, PageCharset String, CodeVersion UInt32, IsLink UInt8, IsDownload UInt8, IsNotBounce UInt8, FUniqID UInt64, HID UInt32, IsOldCounter UInt8, IsEvent UInt8, IsParameter UInt8, DontCountHits UInt8, WithHash UInt8, HitColor FixedString(1), UTCEventTime DateTime, Age UInt8, Sex UInt8, Income UInt8, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), RemoteIP UInt32, RemoteIP6 FixedString(16), WindowName Int32, OpenerName Int32, HistoryLength Int16, BrowserLanguage FixedString(2), BrowserCountry FixedString(2), SocialNetwork String, SocialAction String, HTTPError UInt16, SendTiming Int32, DNSTiming Int32, ConnectTiming Int32, ResponseStartTiming Int32, ResponseEndTiming Int32, FetchTiming Int32, RedirectTiming Int32, DOMInteractiveTiming Int32, DOMContentLoadedTiming Int32, DOMCompleteTiming Int32, LoadEventStartTiming Int32, LoadEventEndTiming Int32, NSToDOMContentLoadedTiming Int32, FirstPaintTiming Int32, RedirectCount Int8, SocialSourceNetworkID UInt8, SocialSourcePage String, ParamPrice Int64, ParamOrderID String, ParamCurrency FixedString(3), ParamCurrencyID UInt16, GoalsReached Array(UInt32), OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, RefererHash UInt64, URLHash UInt64, CLID UInt32, YCLID UInt64, ShareService String, ShareURL String, ShareTitle String, `ParsedParams.Key1` Array(String), `ParsedParams.Key2` Array(String), `ParsedParams.Key3` Array(String), `ParsedParams.Key4` Array(String), `ParsedParams.Key5` Array(String), `ParsedParams.ValueDouble` Array(Float64), IslandID FixedString(16), RequestNum UInt32, RequestTry UInt8) ENGINE = MergeTree PARTITION BY toYYYYMM(EventDate) SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID), EventTime); + + CREATE TABLE test.visits ( CounterID UInt32, StartDate Date, Sign Int8, IsNew UInt8, VisitID UInt64, UserID UInt64, StartTime DateTime, Duration UInt32, UTCStartTime DateTime, PageViews Int32, Hits Int32, IsBounce UInt8, Referer String, StartURL String, RefererDomain String, StartURLDomain String, EndURL String, LinkURL String, IsDownload UInt8, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, PlaceID Int32, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), IsYandex UInt8, GoalReachesDepth Int32, GoalReachesURL Int32, GoalReachesAny Int32, SocialSourceNetworkID UInt8, SocialSourcePage String, MobilePhoneModel String, ClientEventTime DateTime, RegionID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RemoteIP UInt32, RemoteIP6 FixedString(16), IPNetworkID UInt32, SilverlightVersion3 UInt32, CodeVersion UInt32, ResolutionWidth UInt16, ResolutionHeight UInt16, UserAgentMajor UInt16, UserAgentMinor UInt16, WindowClientWidth UInt16, WindowClientHeight UInt16, SilverlightVersion2 UInt8, SilverlightVersion4 UInt16, FlashVersion3 UInt16, FlashVersion4 UInt16, ClientTimeZone Int16, OS UInt8, UserAgent UInt8, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, NetMajor UInt8, NetMinor UInt8, MobilePhone UInt8, SilverlightVersion1 UInt8, Age UInt8, Sex UInt8, Income UInt8, JavaEnable UInt8, CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, BrowserLanguage UInt16, BrowserCountry UInt16, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), Params Array(String), `Goals.ID` Array(UInt32), `Goals.Serial` Array(UInt32), `Goals.EventTime` Array(DateTime), `Goals.Price` Array(Int64), `Goals.OrderID` Array(String), `Goals.CurrencyID` Array(UInt32), WatchIDs Array(UInt64), ParamSumPrice Int64, ParamCurrency FixedString(3), ParamCurrencyID UInt16, ClickLogID UInt64, ClickEventID Int32, ClickGoodEvent Int32, ClickEventTime DateTime, ClickPriorityID Int32, ClickPhraseID Int32, ClickPageID Int32, ClickPlaceID Int32, ClickTypeID Int32, ClickResourceID Int32, ClickCost UInt32, ClickClientIP UInt32, ClickDomainID UInt32, ClickURL String, ClickAttempt UInt8, ClickOrderID UInt32, ClickBannerID UInt32, ClickMarketCategoryID UInt32, ClickMarketPP UInt32, ClickMarketCategoryName String, ClickMarketPPName String, ClickAWAPSCampaignName String, ClickPageName String, ClickTargetType UInt16, ClickTargetPhraseID UInt64, ClickContextType UInt8, ClickSelectType Int8, ClickOptions String, ClickGroupBannerID Int32, OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, FirstVisit DateTime, PredLastVisit Date, LastVisit Date, TotalVisits UInt32, `TraficSource.ID` Array(Int8), `TraficSource.SearchEngineID` Array(UInt16), `TraficSource.AdvEngineID` Array(UInt8), `TraficSource.PlaceID` Array(UInt16), `TraficSource.SocialSourceNetworkID` Array(UInt8), `TraficSource.Domain` Array(String), `TraficSource.SearchPhrase` Array(String), `TraficSource.SocialSourcePage` Array(String), Attendance FixedString(16), CLID UInt32, YCLID UInt64, NormalizedRefererHash UInt64, SearchPhraseHash UInt64, RefererDomainHash UInt64, NormalizedStartURLHash UInt64, StartURLDomainHash UInt64, NormalizedEndURLHash UInt64, TopLevelDomain UInt64, URLScheme UInt64, OpenstatServiceNameHash UInt64, OpenstatCampaignIDHash UInt64, OpenstatAdIDHash UInt64, OpenstatSourceIDHash UInt64, UTMSourceHash UInt64, UTMMediumHash UInt64, UTMCampaignHash UInt64, UTMContentHash UInt64, UTMTermHash UInt64, FromHash UInt64, WebVisorEnabled UInt8, WebVisorActivity UInt32, `ParsedParams.Key1` Array(String), `ParsedParams.Key2` Array(String), `ParsedParams.Key3` Array(String), `ParsedParams.Key4` Array(String), `ParsedParams.Key5` Array(String), `ParsedParams.ValueDouble` Array(Float64), `Market.Type` Array(UInt8), `Market.GoalID` Array(UInt32), `Market.OrderID` Array(String), `Market.OrderPrice` Array(Int64), `Market.PP` Array(UInt32), `Market.DirectPlaceID` Array(UInt32), `Market.DirectOrderID` Array(UInt32), `Market.DirectBannerID` Array(UInt32), `Market.GoodID` Array(String), `Market.GoodName` Array(String), `Market.GoodQuantity` Array(Int32), `Market.GoodPrice` Array(Int64), IslandID FixedString(16)) ENGINE = CollapsingMergeTree(Sign) PARTITION BY toYYYYMM(StartDate) SAMPLE BY intHash32(UserID) ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID); + + clickhouse-client --max_insert_block_size 100000 --query "INSERT INTO test.hits FORMAT TSV" < hits_v1.tsv + clickhouse-client --max_insert_block_size 100000 --query "INSERT INTO test.visits FORMAT TSV" < visits_v1.tsv + +# La Création De Pull Request {#creating-pull-request} + +Accédez à votre référentiel fork dans L'interface utilisateur de GitHub. Si vous avez développé dans une branche, vous devez sélectionner cette branche. Il y aura un “Pull request” bouton situé sur l'écran. En substance, cela signifie “create a request for accepting my changes into the main repository”. + +Une demande d'extraction peuvent être créés, même si le travail n'est pas encore terminée. Dans ce cas veuillez mettre le mot “WIP” (travaux en cours) au début du titre, il peut être modifié plus tard. Ceci est utile pour l'examen coopératif et la discussion des changements ainsi que pour l'exécution de tous les tests disponibles. Il est important que vous fournissiez une brève description de vos modifications, il sera ensuite utilisé pour générer des journaux de modifications de version. + +Les tests commenceront dès que les employés de Yandex étiqueteront votre PR avec une étiquette “can be tested”. The results of some first checks (e.g. code style) will come in within several minutes. Build check results will arrive within half an hour. And the main set of tests will report itself within an hour. + +Le système préparera les builds binaires ClickHouse pour votre demande de tirage individuellement. Pour récupérer ces versions cliquez sur le “Details” lien à côté “ClickHouse build check” entrée dans la liste de vérifications. Vous y trouverez des liens directs vers les construit .paquets deb de ClickHouse que vous pouvez déployer même sur vos serveurs de production (si vous n'avez pas peur). + +Très probablement, certaines des constructions échoueront à la première fois. Cela est dû au fait que nous avons vérifier s'appuie à la fois avec gcc, ainsi qu'avec clang, pratiquement tous les avertissements existants (toujours avec le `-Werror` drapeau) activé pour clang. Sur cette même page, vous pouvez trouver tous les journaux de construction afin que vous n'ayez pas à construire ClickHouse de toutes les manières possibles. diff --git a/docs/fr/development/index.md b/docs/fr/development/index.md new file mode 100644 index 00000000000..a888dbc7d14 --- /dev/null +++ b/docs/fr/development/index.md @@ -0,0 +1,7 @@ +--- +machine_translated: true +--- + +# Développement De ClickHouse {#clickhouse-development} + +[Article Original](https://clickhouse.tech/docs/en/development/) diff --git a/docs/fr/development/style.md b/docs/fr/development/style.md new file mode 100644 index 00000000000..782aca7d1d3 --- /dev/null +++ b/docs/fr/development/style.md @@ -0,0 +1,838 @@ +--- +machine_translated: true +--- + +# Comment écrire du Code C++ {#how-to-write-c-code} + +## Recommandations Générales {#general-recommendations} + +**1.** Ce qui suit sont des recommandations, pas des exigences. + +**2.** Si vous modifiez du code, il est logique de suivre le formatage du code existant. + +**3.** Le style de Code est nécessaire pour la cohérence. La cohérence facilite la lecture du code et facilite également la recherche du code. + +**4.** Beaucoup de règles n'ont pas de raisons logiques; elles sont dictées par des pratiques établies. + +## Formater {#formatting} + +**1.** La plupart du formatage se fera automatiquement par `clang-format`. + +**2.** Les tirets sont 4 espaces. Configurez votre environnement de développement afin qu'un onglet ajoute quatre espaces. + +**3.** Les crochets d'ouverture et de fermeture doivent être sur une ligne séparée. + +``` cpp +inline void readBoolText(bool & x, ReadBuffer & buf) +{ + char tmp = '0'; + readChar(tmp, buf); + x = tmp != '0'; +} +``` + +**4.** Si le corps entier de la fonction est un `statement` il peut donc être placé sur une seule ligne. Place des espaces autour des accolades (en plus de l'espace à la fin de la ligne). + +``` cpp +inline size_t mask() const { return buf_size() - 1; } +inline size_t place(HashValue x) const { return x & mask(); } +``` + +**5.** Pour les fonctions. Ne mettez pas d'espaces entre parenthèses. + +``` cpp +void reinsert(const Value & x) +``` + +``` cpp +memcpy(&buf[place_value], &x, sizeof(x)); +``` + +**6.** Dans `if`, `for`, `while` et d'autres expressions, un espace est inséré devant le support d'ouverture (par opposition aux appels de fonction). + +``` cpp +for (size_t i = 0; i < rows; i += storage.index_granularity) +``` + +**7.** Ajouter des espaces autour des opérateurs binaires (`+`, `-`, `*`, `/`, `%`, …) and the ternary operator `?:`. + +``` cpp +UInt16 year = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0'); +UInt8 month = (s[5] - '0') * 10 + (s[6] - '0'); +UInt8 day = (s[8] - '0') * 10 + (s[9] - '0'); +``` + +**8.** Si un saut de ligne est entré, placez l'opérateur sur une nouvelle ligne et augmentez le retrait avant. + +``` cpp +if (elapsed_ns) + message << " (" + << rows_read_on_server * 1000000000 / elapsed_ns << " rows/s., " + << bytes_read_on_server * 1000.0 / elapsed_ns << " MB/s.) "; +``` + +**9.** Vous pouvez utiliser des espaces pour l'alignement dans une ligne, si vous le souhaitez. + +``` cpp +dst.ClickLogID = click.LogID; +dst.ClickEventID = click.EventID; +dst.ClickGoodEvent = click.GoodEvent; +``` + +**10.** N'utilisez pas d'espaces autour des opérateurs `.`, `->`. + +Si nécessaire, l'opérateur peut être renvoyé à la ligne suivante. Dans ce cas, le décalage devant celui-ci est augmenté. + +**11.** N'utilisez pas d'espace pour séparer les opérateurs unaires (`--`, `++`, `*`, `&`, …) from the argument. + +**12.** Mettre un espace après une virgule, mais pas avant. La même règle vaut pour un point-virgule à l'intérieur d'un `for` expression. + +**13.** Ne pas utiliser des espaces pour séparer les `[]` opérateur. + +**14.** Dans un `template <...>` expression, utiliser un espace entre les `template` et `<`; pas d'espace après `<` ou avant `>`. + +``` cpp +template +struct AggregatedStatElement +{} +``` + +**15.** Dans les classes et les structures, écrivez `public`, `private`, et `protected` sur le même niveau que `class/struct` et tiret le reste du code. + +``` cpp +template +class MultiVersion +{ +public: + /// Version of object for usage. shared_ptr manage lifetime of version. + using Version = std::shared_ptr; + ... +} +``` + +**16.** Si le même `namespace` est utilisé pour l'ensemble du fichier, et il n'y a rien d'autre significatif, un décalage n'est pas nécessaire à l'intérieur `namespace`. + +**17.** Si le bloc pour un `if`, `for`, `while` ou autres expressions se compose d'un seul `statement`, les accolades sont facultatives. Place de la `statement` sur une ligne séparée, à la place. Cette règle est également valable pour les imbriqués `if`, `for`, `while`, … + +Mais si l'intérieur `statement` contient des accolades ou `else` le bloc externe doit être écrit dans les accolades. + +``` cpp +/// Finish write. +for (auto & stream : streams) + stream.second->finalize(); +``` + +**18.** Il ne devrait pas y avoir d'espaces aux extrémités des lignes. + +**19.** Les fichiers Source sont encodés en UTF-8. + +**20.** Les caractères non-ASCII peuvent être utilisés dans les littéraux de chaîne. + +``` cpp +<< ", " << (timer.elapsed() / chunks_stats.hits) << " μsec/hit."; +``` + +**21.** N'écrivez pas plusieurs expressions sur une seule ligne. + +**22.** Groupez les sections de code à l'intérieur des fonctions et séparez-les avec pas plus d'une ligne vide. + +**23.** Séparez les fonctions, les classes, etc. avec une ou deux lignes vides. + +**24.** `A const` (liés à une valeur) doit être écrit avant le nom du type. + +``` cpp +//correct +const char * pos +const std::string & s +//incorrect +char const * pos +``` + +**25.** Lors de la déclaration d'un pointeur ou d'une référence, le `*` et `&` les symboles doivent être séparés par des espaces des deux côtés. + +``` cpp +//correct +const char * pos +//incorrect +const char* pos +const char *pos +``` + +**26.** Lors de l'utilisation de types de modèles, les alias avec le `using` mot-clé (sauf dans les cas les plus simples). + +En d'autres termes, les paramètres du modèle sont indiquées que dans `using` et ne sont pas répétés dans le code. + +`using` peut être déclaré localement, comme dans une fonction. + +``` cpp +//correct +using FileStreams = std::map>; +FileStreams streams; +//incorrect +std::map> streams; +``` + +**27.** Ne déclarez pas plusieurs variables de types différents dans une instruction. + +``` cpp +//incorrect +int x, *y; +``` + +**28.** N'utilisez pas de moulages de style C. + +``` cpp +//incorrect +std::cerr << (int)c <<; std::endl; +//correct +std::cerr << static_cast(c) << std::endl; +``` + +**29.** Dans les classes et les structures, groupez les membres et les fonctions séparément dans chaque portée de visibilité. + +**30.** Pour les petites classes et structures, il n'est pas nécessaire de séparer la déclaration de méthode de l'implémentation. + +La même chose est vraie pour les petites méthodes dans toutes les classes ou structures. + +Pour les classes et les structures modélisées, ne séparez pas les déclarations de méthode de l'implémentation (car sinon elles doivent être définies dans la même unité de traduction). + +**31.** Vous pouvez envelopper des lignes à 140 caractères, au lieu de 80. + +**32.** Utilisez toujours les opérateurs d'incrémentation/décrémentation de préfixe si postfix n'est pas requis. + +``` cpp +for (Names::const_iterator it = column_names.begin(); it != column_names.end(); ++it) +``` + +## Commentaire {#comments} + +**1.** Assurez-vous d'ajouter des commentaires pour toutes les parties non triviales du code. + +C'est très important. Écrit le commentaire peut vous aider à réaliser que le code n'est pas nécessaire, ou qu'il est mal conçu. + +``` cpp +/** Part of piece of memory, that can be used. + * For example, if internal_buffer is 1MB, and there was only 10 bytes loaded to buffer from file for reading, + * then working_buffer will have size of only 10 bytes + * (working_buffer.end() will point to position right after those 10 bytes available for read). + */ +``` + +**2.** Les commentaires peuvent être aussi détaillées que nécessaire. + +**3.** Placez les commentaires avant le code qu'ils décrivent. Dans de rares cas, des commentaires peuvent venir après le code, sur la même ligne. + +``` cpp +/** Parses and executes the query. +*/ +void executeQuery( + ReadBuffer & istr, /// Where to read the query from (and data for INSERT, if applicable) + WriteBuffer & ostr, /// Where to write the result + Context & context, /// DB, tables, data types, engines, functions, aggregate functions... + BlockInputStreamPtr & query_plan, /// Here could be written the description on how query was executed + QueryProcessingStage::Enum stage = QueryProcessingStage::Complete /// Up to which stage process the SELECT query + ) +``` + +**4.** Les commentaires doivent être rédigés en anglais seulement. + +**5.** Si vous écrivez une bibliothèque, incluez des commentaires détaillés l'expliquant dans le fichier d'en-tête principal. + +**6.** N'ajoutez pas de commentaires qui ne fournissent pas d'informations supplémentaires. En particulier, ne laissez pas de commentaires vides comme celui-ci: + +``` cpp +/* +* Procedure Name: +* Original procedure name: +* Author: +* Date of creation: +* Dates of modification: +* Modification authors: +* Original file name: +* Purpose: +* Intent: +* Designation: +* Classes used: +* Constants: +* Local variables: +* Parameters: +* Date of creation: +* Purpose: +*/ +``` + +L'exemple est emprunté à partir de la ressource http://home.tamk.fi/~jaalto/cours/coding-style/doc/désuète-code/. + +**7.** Ne pas écrire des commentaires de déchets (auteur, date de création .. au début de chaque fichier. + +**8.** Les commentaires sur une seule ligne commencent par trois barres obliques: `///` et les commentaires multi-lignes commencer avec `/**`. Ces commentaires sont pris en considération “documentation”. + +REMARQUE: Vous pouvez utiliser Doxygen pour générer de la documentation à partir de ces commentaires. Mais Doxygen n'est généralement pas utilisé car il est plus pratique de naviguer dans le code dans L'IDE. + +**9.** Les commentaires multilignes ne doivent pas avoir de lignes vides au début et à la fin (sauf la ligne qui ferme un commentaire multilignes). + +**10.** Pour commenter le code, utilisez des commentaires de base, pas “documenting” commentaire. + +**11.** Supprimez les parties commentées du code avant de valider. + +**12.** N'utilisez pas de blasphème dans les commentaires ou le code. + +**13.** N'utilisez pas de majuscules. N'utilisez pas de ponctuation excessive. + +``` cpp +/// WHAT THE FAIL??? +``` + +**14.** N'utilisez pas de commentaires pour créer des délimiteurs. + +``` cpp +///****************************************************** +``` + +**15.** Ne commencez pas les discussions dans les commentaires. + +``` cpp +/// Why did you do this stuff? +``` + +**16.** Il n'est pas nécessaire d'écrire un commentaire à la fin d'un bloc décrivant de quoi il s'agissait. + +``` cpp +/// for +``` + +## Nom {#names} + +**1.** Utilisez des lettres minuscules avec des traits de soulignement dans les noms des variables et des membres de la classe. + +``` cpp +size_t max_block_size; +``` + +**2.** Pour les noms de fonctions (méthodes), utilisez camelCase commençant par une lettre minuscule. + +``` cpp +std::string getName() const override { return "Memory"; } +``` + +**3.** Pour les noms de classes (structures), utilisez CamelCase commençant par une lettre majuscule. Les préfixes autres que I ne sont pas utilisés pour les interfaces. + +``` cpp +class StorageMemory : public IStorage +``` + +**4.** `using` sont nommées de la même manière que les classes, ou avec `_t` sur la fin. + +**5.** Noms des arguments de type de modèle: dans les cas simples, utilisez `T`; `T`, `U`; `T1`, `T2`. + +Pour les cas plus complexes, suivez les règles pour les noms de classe ou ajoutez le préfixe `T`. + +``` cpp +template +struct AggregatedStatElement +``` + +**6.** Noms des arguments constants du modèle: suivez les règles pour les noms de variables ou utilisez `N` dans les cas simples. + +``` cpp +template +struct ExtractDomain +``` + +**7.** Pour les classes abstraites (interfaces), vous pouvez ajouter `I` préfixe. + +``` cpp +class IBlockInputStream +``` + +**8.** Si vous utilisez une variable localement, vous pouvez utiliser le nom court. + +Dans tous les autres cas, utilisez un nom qui décrit la signification. + +``` cpp +bool info_successfully_loaded = false; +``` + +**9.** Les noms de `define`les constantes s et globales utilisent ALL\_CAPS avec des traits de soulignement. + +``` cpp +#define MAX_SRC_TABLE_NAMES_TO_STORE 1000 +``` + +**10.** Les noms de fichiers doivent utiliser le même style que leur contenu. + +Si un fichier contient une seule classe, nommez-le de la même manière que la classe (CamelCase). + +Si le fichier contient une seule fonction, nommez le fichier de la même manière que la fonction (camelCase). + +**11.** Si le nom contient une abréviation, puis: + +- Pour les noms de variables, l'abréviation doit utiliser des lettres minuscules `mysql_connection` (pas `mySQL_connection`). +- Pour les noms de classes et de fonctions, conservez les majuscules dans l'abréviation`MySQLConnection` (pas `MySqlConnection`). + +**12.** Les arguments du constructeur utilisés uniquement pour initialiser les membres de la classe doivent être nommés de la même manière que les membres de la classe, mais avec un trait de soulignement à la fin. + +``` cpp +FileQueueProcessor( + const std::string & path_, + const std::string & prefix_, + std::shared_ptr handler_) + : path(path_), + prefix(prefix_), + handler(handler_), + log(&Logger::get("FileQueueProcessor")) +{ +} +``` + +Le suffixe de soulignement peut être omis si l'argument n'est pas utilisé dans le corps du constructeur. + +**13.** Il n'y a pas de différence dans les noms des variables locales et des membres de classe (aucun préfixe requis). + +``` cpp +timer (not m_timer) +``` + +**14.** Pour les constantes dans un `enum`, utilisez CamelCase avec une lettre majuscule. ALL\_CAPS est également acceptable. Si l' `enum` est non local, utilisez un `enum class`. + +``` cpp +enum class CompressionMethod +{ + QuickLZ = 0, + LZ4 = 1, +}; +``` + +**15.** Tous les noms doivent être en anglais. La translittération des mots russes n'est pas autorisé. + + not Stroka + +**16.** Les abréviations sont acceptables si elles sont bien connues (quand vous pouvez facilement trouver la signification de l'abréviation dans Wikipédia ou dans un moteur de recherche). + + `AST`, `SQL`. + + Not `NVDH` (some random letters) + +Les mots incomplets sont acceptables si la version abrégée est d'usage courant. + +Vous pouvez également utiliser une abréviation si le nom complet est ensuite incluse dans les commentaires. + +**17.** Les noms de fichiers avec le code source C++ doivent avoir `.cpp` extension. Fichiers d'en-tête doit avoir la `.h` extension. + +## Comment écrire du Code {#how-to-write-code} + +**1.** Gestion de la mémoire. + +Désallocation manuelle de la mémoire (`delete`) ne peut être utilisé que dans le code de la bibliothèque. + +Dans le code de la bibliothèque, de la `delete` l'opérateur ne peut être utilisé dans des destructeurs. + +Dans le code de l'application, la mémoire doit être libérée par l'objet qui la possède. + +Exemple: + +- Le plus simple est de placer un objet sur la pile, ou d'en faire un membre d'une autre classe. +- Pour un grand nombre de petits objets, utiliser des récipients. +- Pour la désallocation automatique d'un petit nombre d'objets qui résident dans le tas, utilisez `shared_ptr/unique_ptr`. + +**2.** La gestion des ressources. + +Utiliser `RAII` et voir ci-dessus. + +**3.** La gestion des erreurs. + +Utilisez des exceptions. Dans la plupart des cas, vous avez seulement besoin de lancer une exception, et n'avez pas besoin de l'attraper (à cause de `RAII`). + +Dans les applications de traitement de données hors ligne, il est souvent acceptable de ne pas attraper d'exceptions. + +Dans les serveurs qui gèrent les demandes des utilisateurs, il suffit généralement d'attraper des exceptions au niveau supérieur du gestionnaire de connexion. + +Dans les fonctions de thread, vous devez attraper et conserver toutes les exceptions pour les repasser dans le thread principal après `join`. + +``` cpp +/// If there weren't any calculations yet, calculate the first block synchronously +if (!started) +{ + calculate(); + started = true; +} +else /// If calculations are already in progress, wait for the result + pool.wait(); + +if (exception) + exception->rethrow(); +``` + +Ne cachez jamais les exceptions sans les manipuler. Ne mettez jamais aveuglément toutes les exceptions au journal. + +``` cpp +//Not correct +catch (...) {} +``` + +Si vous devez ignorer certaines exceptions, ne le faites que pour des exceptions spécifiques et repensez le reste. + +``` cpp +catch (const DB::Exception & e) +{ + if (e.code() == ErrorCodes::UNKNOWN_AGGREGATE_FUNCTION) + return nullptr; + else + throw; +} +``` + +Lorsque vous utilisez des fonctions avec des codes de réponse ou `errno` toujours vérifier le résultat et de lever une exception en cas d'erreur. + +``` cpp +if (0 != close(fd)) + throwFromErrno("Cannot close file " + file_name, ErrorCodes::CANNOT_CLOSE_FILE); +``` + +`Do not use assert`. + +**4.** Les types d'Exception. + +Il n'est pas nécessaire d'utiliser une hiérarchie d'exceptions complexe dans le code de l'application. Le texte d'exception doit être compréhensible pour un administrateur système. + +**5.** Lancer des exceptions de destructeurs. + +Ce n'est pas recommandé, mais il est permis. + +Utilisez les options suivantes: + +- Créer une fonction (`done()` ou `finalize()`) qui vont faire tout le travail en amont qui pourrait conduire à une exception. Si cette fonction a été appelée, il ne devrait y avoir aucune exception dans le destructeur plus tard. +- Les tâches trop complexes (comme l'envoi de messages sur le réseau) peuvent être placées dans une méthode distincte que l'utilisateur de la classe devra appeler avant la destruction. +- Si il y a une exception dans le destructeur, il est préférable de l'enregistrer que de le cacher (si l'enregistreur est disponible). +- Dans les applications simples, il est acceptable de compter sur `std::terminate` (pour les cas de `noexcept` par défaut en C++11) pour gérer les exceptions. + +**6.** Blocs de code anonymes. + +Vous pouvez créer un bloc de code séparé à l'intérieur d'une seule fonction afin de rendre certaines variables locales, de sorte que les destructeurs sont appelés à la sortie du bloc. + +``` cpp +Block block = data.in->read(); + +{ + std::lock_guard lock(mutex); + data.ready = true; + data.block = block; +} + +ready_any.set(); +``` + +**7.** Multithreading. + +Dans les programmes de traitement de données hors ligne: + +- Essayez d'obtenir les meilleures performances possibles sur un seul noyau CPU. Vous pouvez ensuite paralléliser votre code si nécessaire. + +Dans les applications serveur: + +- Utiliser le pool de threads pour traiter les demandes. À ce stade, nous n'avons pas eu de tâches nécessitant un changement de contexte dans l'espace utilisateur. + +La fourche n'est pas utilisé pour la parallélisation. + +**8.** Synchronisation des threads. + +Souvent, il est possible de faire en sorte que différents threads utilisent différentes cellules de mémoire (encore mieux: différentes lignes de cache,) et de ne pas utiliser de synchronisation de thread (sauf `joinAll`). + +Si la synchronisation est nécessaire, dans la plupart des cas, il suffit d'utiliser mutex sous `lock_guard`. + +Dans d'autres cas, utilisez des primitives de synchronisation système. Ne pas utiliser occupé attendre. + +Les opérations atomiques ne doivent être utilisées que dans les cas les plus simples. + +N'essayez pas d'implémenter des structures de données sans verrou à moins qu'il ne s'agisse de votre principal domaine d'expertise. + +**9.** Pointeurs vs références. + +Dans la plupart des cas, préférez les références. + +**10.** const. + +Utiliser des références constantes, des pointeurs vers des constantes, `const_iterator` et const méthodes. + +Considérer `const` pour être par défaut et utiliser non-`const` seulement quand c'est nécessaire. + +Lors du passage de variables par valeur, en utilisant `const` habituellement ne fait pas de sens. + +**11.** non signé. + +Utiliser `unsigned` si nécessaire. + +**12.** Les types numériques. + +Utiliser les types `UInt8`, `UInt16`, `UInt32`, `UInt64`, `Int8`, `Int16`, `Int32`, et `Int64` ainsi que `size_t`, `ssize_t`, et `ptrdiff_t`. + +N'utilisez pas ces types pour les nombres: `signed/unsigned long`, `long long`, `short`, `signed/unsigned char`, `char`. + +**13.** Passer des arguments. + +Passer des valeurs complexes par référence (y compris `std::string`). + +Si une fonction capture la propriété d'un objet créé dans le tas, définissez le type d'argument `shared_ptr` ou `unique_ptr`. + +**14.** Les valeurs de retour. + +Dans la plupart des cas, il suffit d'utiliser `return`. Ne pas écrire `[return std::move(res)]{.strike}`. + +Si la fonction alloue un objet sur le tas et le renvoie, utilisez `shared_ptr` ou `unique_ptr`. + +Dans de rares cas, vous devrez peut-être renvoyer la valeur via un argument. Dans ce cas, l'argument doit être une référence. + +``` cpp +using AggregateFunctionPtr = std::shared_ptr; + +/** Allows creating an aggregate function by its name. + */ +class AggregateFunctionFactory +{ +public: + AggregateFunctionFactory(); + AggregateFunctionPtr get(const String & name, const DataTypes & argument_types) const; +``` + +**15.** espace de noms. + +Il n'est pas nécessaire d'utiliser une `namespace` pour le code de l'application. + +Les petites bibliothèques n'ont pas besoin de cela non plus. + +Pour les bibliothèques moyennes et grandes, mettez tout dans un `namespace`. + +Dans la bibliothèque `.h` fichier, vous pouvez utiliser `namespace detail` pour masquer les détails d'implémentation non nécessaires pour le code de l'application. + +Dans un `.cpp` fichier, vous pouvez utiliser un `static` ou un espace de noms anonyme pour masquer les symboles. + +Aussi, un `namespace` peut être utilisé pour un `enum` pour éviter que les noms correspondants ne tombent dans un `namespace` (mais il est préférable d'utiliser un `enum class`). + +**16.** Initialisation différée. + +Si des arguments sont requis pour l'initialisation, vous ne devriez normalement pas écrire de constructeur par défaut. + +Si plus tard, vous devez retarder l'initialisation, vous pouvez ajouter un constructeur par défaut qui créera un objet invalide. Ou, pour un petit nombre d'objets, vous pouvez utiliser `shared_ptr/unique_ptr`. + +``` cpp +Loader(DB::Connection * connection_, const std::string & query, size_t max_block_size_); + +/// For deferred initialization +Loader() {} +``` + +**17.** Des fonctions virtuelles. + +Si la classe n'est pas destinée à une utilisation polymorphe, vous n'avez pas besoin de rendre les fonctions virtuelles. Ceci s'applique également pour le destructeur. + +**18.** Encodage. + +Utilisez UTF-8 partout. Utiliser `std::string`et`char *`. Ne pas utiliser de `std::wstring`et`wchar_t`. + +**19.** Journalisation. + +Voir les exemples partout dans le code. + +Avant de valider, supprimez toute journalisation sans signification et de débogage, ainsi que tout autre type de sortie de débogage. + +L'enregistrement des cycles doit être évité, même au niveau de la Trace. + +Les journaux doivent être lisibles à tout niveau d'enregistrement. + +La journalisation ne doit être utilisée que dans le code de l'application, pour la plupart. + +Les messages du journal doivent être écrits en anglais. + +Le journal devrait de préférence être compréhensible pour l'administrateur système. + +N'utilisez pas de blasphème dans le journal. + +Utilisez L'encodage UTF-8 dans le journal. Dans de rares cas, vous pouvez utiliser des caractères non-ASCII dans le journal. + +**20.** D'entrée-sortie. + +Ne pas utiliser de `iostreams` dans les cycles internes qui sont critiques pour les performances de l'application (et ne jamais utiliser `stringstream`). + +L'utilisation de la `DB/IO` la bibliothèque la place. + +**21.** La Date et l'heure. + +Voir la `DateLUT` bibliothèque. + +**22.** comprendre. + +Toujours utiliser `#pragma once` au lieu d'inclure des gardes. + +**23.** utiliser. + +`using namespace` n'est pas utilisé. Vous pouvez utiliser `using` avec quelque chose de spécifique. Mais faire local à l'intérieur d'une classe ou d'une fonction. + +**24.** Ne pas utiliser de `trailing return type` pour les fonctions, sauf si nécessaire. + +``` cpp +[auto f() -> void;]{.strike} +``` + +**25.** Déclaration et initialisation des variables. + +``` cpp +//right way +std::string s = "Hello"; +std::string s{"Hello"}; + +//wrong way +auto s = std::string{"Hello"}; +``` + +**26.** Pour les fonctions virtuelles, écrire `virtual` dans la classe de base, mais d'écrire `override` plutôt `virtual` dans les classes descendantes. + +## Fonctionnalités inutilisées de C++ {#unused-features-of-c} + +**1.** L'héritage virtuel n'est pas utilisé. + +**2.** Les spécificateurs d'Exception de C++03 ne sont pas utilisés. + +## Plate {#platform} + +**1.** Nous écrivons du code pour une plate-forme spécifique. + +Mais toutes choses étant égales par ailleurs, le code multi-plateforme ou portable est préféré. + +**2.** Langue: C++17. + +**3.** Compilateur: `gcc`. En ce moment (décembre 2017), le code est compilé en utilisant la version 7.2. (Il peut également être compilé en utilisant `clang 4`.) + +La bibliothèque standard est utilisée (`libstdc++` ou `libc++`). + +**4.**OS: Linux Ubuntu, pas plus vieux que précis. + +**5.**Le Code est écrit pour l'architecture CPU x86\_64. + +Le jeu D'instructions CPU est l'ensemble minimum pris en charge parmi nos serveurs. Actuellement, il s'agit de SSE 4.2. + +**6.** Utiliser `-Wall -Wextra -Werror` drapeaux de compilation. + +**7.** Utilisez la liaison statique avec toutes les bibliothèques sauf celles qui sont difficiles à connecter statiquement (voir la sortie de la `ldd` commande). + +**8.** Le Code est développé et débogué avec les paramètres de version. + +## Outils {#tools} + +**1.** KDevelop est un bon IDE. + +**2.** Pour le débogage, utilisez `gdb`, `valgrind` (`memcheck`), `strace`, `-fsanitize=...`, ou `tcmalloc_minimal_debug`. + +**3.** Pour le profilage, utilisez `Linux Perf`, `valgrind` (`callgrind`), ou `strace -cf`. + +**4.** Les Sources sont dans Git. + +**5.** Assemblée utilise `CMake`. + +**6.** Les programmes sont libérés en utilisant `deb` paquet. + +**7.** Les Commits à master ne doivent pas casser la construction. + +Bien que seules les révisions sélectionnées soient considérées comme réalisables. + +**8.** Faire s'engage aussi souvent que possible, même si le code n'est que partiellement prêt. + +Utilisez des branches à cet effet. + +Si votre code dans le `master` la branche n'est pas constructible pourtant, l'exclure de la construction avant que le `push`. Vous devrez le terminer ou l'enlever dans quelques jours. + +**9.** Pour les modifications non triviales, utilisez les branches et publiez-les sur le serveur. + +**10.** Le code inutilisé est supprimé du référentiel. + +## Bibliothèque {#libraries} + +**1.** La bibliothèque standard C++14 est utilisée (les extensions expérimentales sont autorisées), ainsi que `boost` et `Poco` Framework. + +**2.** Si nécessaire, vous pouvez utiliser toutes les bibliothèques bien connues disponibles dans le package OS. + +S'il existe déjà une bonne solution, utilisez-la, même si cela signifie que vous devez installer une autre bibliothèque. + +(Mais soyez prêt à supprimer les mauvaises bibliothèques du code.) + +**3.** Vous pouvez installer une bibliothèque qui n'est pas dans les paquets, les paquets n'ont pas ce que vous souhaitez ou avez une version périmée ou le mauvais type de compilation. + +**4.** Si la Bibliothèque est petite et n'a pas son propre système de construction complexe, placez les fichiers source dans le `contrib` dossier. + +**5.** La préférence est toujours donnée aux bibliothèques déjà utilisées. + +## Recommandations Générales {#general-recommendations-1} + +**1.** Écrivez aussi peu de code que possible. + +**2.** Essayez la solution la plus simple. + +**3.** N'écrivez pas de code tant que vous ne savez pas comment cela va fonctionner et comment la boucle interne fonctionnera. + +**4.** Dans les cas les plus simples, utilisez `using` au lieu de classes ou des structures. + +**5.** Si possible, n'écrivez pas de constructeurs de copie, d'opérateurs d'affectation, de destructeurs (autres que Virtuels, si la classe contient au moins une fonction virtuelle), de constructeurs de déplacement ou d'opérateurs d'affectation de déplacement. En d'autres termes, les fonctions générées par le compilateur doivent fonctionner correctement. Vous pouvez utiliser `default`. + +**6.** La simplification du Code est encouragée. Réduire la taille de votre code si possible. + +## Recommandations Supplémentaires {#additional-recommendations} + +**1.** Spécifier explicitement `std::` pour les types de `stddef.h` + +n'est pas recommandé. En d'autres termes, nous vous recommandons d'écriture `size_t` plutôt `std::size_t` parce que c'est plus court. + +Il est acceptable d'ajouter `std::`. + +**2.** Spécifier explicitement `std::` pour les fonctions de la bibliothèque C standard + +n'est pas recommandé. En d'autres termes, écrire `memcpy` plutôt `std::memcpy`. + +La raison en est qu'il existe des fonctions non standard similaires, telles que `memmem`. Nous utilisons ces fonctions à l'occasion. Ces fonctions n'existent pas dans `namespace std`. + +Si vous écrivez `std::memcpy` plutôt `memcpy` partout, puis `memmem` sans `std::` va sembler étrange. + +Néanmoins, vous pouvez toujours utiliser `std::` si vous le souhaitez. + +**3.** Utilisation des fonctions de C lorsque les mêmes sont disponibles dans la bibliothèque C++ standard. + +Ceci est acceptable s'il est plus efficace. + +Par exemple, l'utilisation `memcpy` plutôt `std::copy` pour copier de gros morceaux de mémoire. + +**4.** Arguments de fonction multiligne. + +L'un des styles d'emballage suivants est autorisé: + +``` cpp +function( + T1 x1, + T2 x2) +``` + +``` cpp +function( + size_t left, size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + +``` cpp +function(size_t left, size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + +``` cpp +function(size_t left, size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + +``` cpp +function( + size_t left, + size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + +[Article Original](https://clickhouse.tech/docs/en/development/style/) diff --git a/docs/fr/development/tests.md b/docs/fr/development/tests.md new file mode 100644 index 00000000000..2060223c80f --- /dev/null +++ b/docs/fr/development/tests.md @@ -0,0 +1,248 @@ +--- +machine_translated: true +--- + +# ClickHouse Test {#clickhouse-testing} + +## Les Tests Fonctionnels {#functional-tests} + +Les tests fonctionnels sont les plus simples et pratiques à utiliser. La plupart des fonctionnalités de ClickHouse peuvent être testées avec des tests fonctionnels et elles sont obligatoires à utiliser pour chaque changement de code de ClickHouse qui peut être testé de cette façon. + +Chaque test fonctionnel envoie une ou plusieurs requêtes au serveur clickhouse en cours d'exécution et compare le résultat avec la référence. + +Les Tests sont situés dans `dbms/tests/queries` répertoire. Il y a deux sous-répertoires: `stateless` et `stateful`. Les tests sans état exécutent des requêtes sans données de test préchargées - ils créent souvent de petits ensembles de données synthétiques à la volée, dans le test lui-même. Les tests avec État nécessitent des données de test préchargées de Yandex.Metrica et non disponible pour le grand public. Nous avons tendance à utiliser uniquement `stateless` tests et éviter d'ajouter de nouveaux `stateful` test. + +Chaque test peut être de deux types: `.sql` et `.sh`. `.sql` test est le script SQL simple qui est canalisé vers `clickhouse-client --multiquery --testmode`. `.sh` test est un script qui est exécuté par lui-même. + +Pour exécuter tous les tests, utilisez `dbms/tests/clickhouse-test` outil. Regarder `--help` pour la liste des options possibles. Vous pouvez simplement exécuter tous les tests ou exécuter un sous ensemble de tests filtrés par sous chaîne dans le nom du test: `./clickhouse-test substring`. + +Le moyen le plus simple d'invoquer des tests fonctionnels est de copier `clickhouse-client` de `/usr/bin/`, exécuter `clickhouse-server` et puis exécutez `./clickhouse-test` à partir de son propre répertoire. + +Pour ajouter un nouveau test, créez un `.sql` ou `.sh` fichier dans `dbms/tests/queries/0_stateless` répertoire, vérifiez-le manuellement, puis générez `.reference` fichier de la façon suivante: `clickhouse-client -n --testmode < 00000_test.sql > 00000_test.reference` ou `./00000_test.sh > ./00000_test.reference`. + +Les Tests doivent utiliser (create, drop, etc) uniquement des tables dans `test` base de données supposée être créée au préalable; les tests peuvent également utiliser des tables temporaires. + +Si vous souhaitez utiliser des requêtes distribuées dans les tests fonctionnels, vous pouvez tirer parti de `remote` fonction de table avec `127.0.0.{1..2}` ou vous pouvez utiliser des clusters de test prédéfinis dans le fichier de configuration du serveur comme `test_shard_localhost`. + +Certains tests sont marqués avec `zookeeper`, `shard` ou `long` en leurs noms. +`zookeeper` est pour les tests qui utilisent ZooKeeper. `shard` est pour les tests +nécessite l'écoute du serveur `127.0.0.*`; `distributed` ou `global` avoir le même +sens. `long` est pour les tests qui s'exécutent légèrement plus longtemps qu'une seconde. Vous pouvez +désactivez ces groupes de tests en utilisant `--no-zookeeper`, `--no-shard` et +`--no-long` options, respectivement. + +## Bugs connus {#known-bugs} + +Si nous connaissons des bugs qui peuvent être facilement reproduits par des tests fonctionnels, nous plaçons des tests fonctionnels préparés dans `dbms/tests/queries/bugs` répertoire. Ces tests seront déplacés à `dbms/tests/queries/0_stateless` quand les bugs sont corrigés. + +## Les Tests D'Intégration {#integration-tests} + +Les tests d'intégration permettent de tester ClickHouse en configuration cluster et clickhouse interaction avec D'autres serveurs comme MySQL, Postgres, MongoDB. Ils sont utiles pour émuler les splits réseau, les chutes de paquets, etc. Ces tests sont exécutés sous Docker et créent plusieurs conteneurs avec divers logiciels. + +Voir `dbms/tests/integration/README.md` sur la façon d'exécuter ces tests. + +Notez que l'intégration de ClickHouse avec des pilotes tiers n'est pas testée. De plus, nous n'avons actuellement pas de tests d'intégration avec nos pilotes JDBC et ODBC. + +## Les Tests Unitaires {#unit-tests} + +Les tests unitaires sont utiles lorsque vous voulez tester non pas le ClickHouse dans son ensemble, mais une seule bibliothèque ou classe isolée. Vous pouvez activer ou désactiver la génération de tests avec `ENABLE_TESTS` Option CMake. Les tests unitaires (et autres programmes de test) sont situés dans `tests` sous-répertoires à travers le code. Pour exécuter des tests unitaires, tapez `ninja test`. Certains tests utilisent `gtest`, mais certains ne sont que des programmes qui renvoient un code de sortie non nul en cas d'échec du test. + +Ce n'est pas nécessairement d'avoir des tests unitaires si le code est déjà couvert par des tests fonctionnels (et les tests fonctionnels sont généralement beaucoup plus simples à utiliser). + +## Tests De Performance {#performance-tests} + +Les tests de Performance permettent de mesurer et de comparer les performances d'une partie isolée de ClickHouse sur des requêtes synthétiques. Les Tests sont situés à `dbms/tests/performance`. Chaque test est représenté par `.xml` fichier avec description du cas de test. Les Tests sont exécutés avec `clickhouse performance-test` outil (qui est incorporé dans `clickhouse` binaire). Voir `--help` pour l'invocation. + +Chaque essai un ou miltiple requêtes (éventuellement avec des combinaisons de paramètres) dans une boucle avec certaines conditions pour l'arrêt (comme “maximum execution speed is not changing in three seconds”) et mesurer certaines mesures sur les performances de la requête (comme “maximum execution speed”). Certains tests peuvent contenir des conditions préalables sur un ensemble de données de test préchargé. + +Si vous souhaitez améliorer les performances de ClickHouse dans certains scénarios, et si des améliorations peuvent être observées sur des requêtes simples, il est fortement recommandé d'écrire un test de performance. Il est toujours logique d'utiliser `perf top` ou d'autres outils perf pendant vos tests. + +## Outils Et Scripts De Test {#test-tools-and-scripts} + +Certains programmes dans `tests` directory ne sont pas des tests préparés, mais sont des outils de test. Par exemple, pour `Lexer` il est un outil `dbms/src/Parsers/tests/lexer` Cela fait juste la tokenisation de stdin et écrit le résultat colorisé dans stdout. Vous pouvez utiliser ce genre d'outils comme exemples de code et pour l'exploration et les tests manuels. + +Vous pouvez également placer une paire de fichiers `.sh` et `.reference` avec l'outil pour l'exécuter sur une entrée prédéfinie - alors le résultat du script peut être comparé à `.reference` fichier. Ce genre de tests ne sont pas automatisés. + +## Tests Divers {#miscellanous-tests} + +Il existe des tests pour les dictionnaires externes situés à `dbms/tests/external_dictionaries` et pour machine appris modèles dans `dbms/tests/external_models`. Ces tests ne sont pas mis à jour et doivent être transférés aux tests d'intégration. + +Il y a un test séparé pour les inserts de quorum. Ce test exécute le cluster ClickHouse sur des serveurs séparés et émule divers cas d'échec: scission réseau, chute de paquets (entre les nœuds ClickHouse, entre Clickhouse et ZooKeeper, entre le serveur ClickHouse et le client, etc.), `kill -9`, `kill -STOP` et `kill -CONT` , comme [Jepsen](https://aphyr.com/tags/Jepsen). Ensuite, le test vérifie que toutes les insertions reconnues ont été écrites et que toutes les insertions rejetées ne l'ont pas été. + +Le test de Quorum a été écrit par une équipe distincte avant que ClickHouse ne soit open-source. Cette équipe ne travaille plus avec ClickHouse. Test a été écrit accidentellement en Java. Pour ces raisons, quorum test doit être réécrit et déplacé vers tests d'intégration. + +## Les Tests Manuels {#manual-testing} + +Lorsque vous développez une nouvelle fonctionnalité, il est raisonnable de tester également manuellement. Vous pouvez le faire avec les étapes suivantes: + +Construire ClickHouse. Exécuter ClickHouse à partir du terminal: changer le répertoire à `dbms/src/programs/clickhouse-server` et de l'exécuter avec `./clickhouse-server`. Il utilisera la configuration (`config.xml`, `users.xml` et les fichiers à l'intérieur `config.d` et `users.d` répertoires) à partir du répertoire courant par défaut. Pour vous connecter au serveur ClickHouse, exécutez `dbms/src/programs/clickhouse-client/clickhouse-client`. + +Notez que tous les outils clickhouse (serveur, client, etc.) ne sont que des liens symboliques vers un seul binaire nommé `clickhouse`. Vous pouvez trouver ce binaire à `dbms/src/programs/clickhouse`. Tous les outils peuvent également être invoquée comme `clickhouse tool` plutôt `clickhouse-tool`. + +Alternativement, vous pouvez installer le paquet ClickHouse: soit une version stable du référentiel Yandex, soit vous pouvez créer un paquet pour vous-même avec `./release` dans les sources de ClickHouse racine. Puis démarrez le serveur avec `sudo service clickhouse-server start` (ou stop pour arrêter le serveur). Rechercher des journaux à `/etc/clickhouse-server/clickhouse-server.log`. + +Lorsque ClickHouse est déjà installé sur votre système, vous pouvez créer un nouveau `clickhouse` binaire et remplacer le binaire: + +``` bash +$ sudo service clickhouse-server stop +$ sudo cp ./clickhouse /usr/bin/ +$ sudo service clickhouse-server start +``` + +Vous pouvez également arrêter system clickhouse-server et exécuter le vôtre avec la même configuration mais en vous connectant au terminal: + +``` bash +$ sudo service clickhouse-server stop +$ sudo -u clickhouse /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml +``` + +Exemple avec gdb: + +``` bash +$ sudo -u clickhouse gdb --args /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml +``` + +Si le système clickhouse-server est déjà en cours d'exécution et que vous ne voulez pas l'arrêter, vous pouvez modifier les numéros de port dans votre `config.xml` (ou de les remplacer dans un fichier `config.d` répertoire), fournissez le chemin de données approprié, et exécutez-le. + +`clickhouse` binary n'a presque aucune dépendance et fonctionne sur un large éventail de distributions Linux. Rapide et sale de tester vos modifications sur un serveur, vous pouvez simplement `scp` votre douce construite `clickhouse` binaire à votre serveur et ensuite l'exécuter comme dans les exemples ci-dessus. + +## L'Environnement De Test {#testing-environment} + +Avant de publier la version stable, nous la déployons sur l'environnement de test. L'environnement de test est un cluster processus 1/39 partie de [Yandex.Metrica](https://metrica.yandex.com/) données. Nous partageons notre environnement de test avec Yandex.Metrica de l'équipe. ClickHouse est mis à niveau sans temps d'arrêt au-dessus des données existantes. Nous regardons d'abord que les données sont traitées avec succès sans retard par rapport au temps réel, la réplication continue à fonctionner et il n'y a pas de problèmes visibles pour Yandex.Metrica de l'équipe. Première vérification peut être effectuée de la façon suivante: + +``` sql +SELECT hostName() AS h, any(version()), any(uptime()), max(UTCEventTime), count() FROM remote('example01-01-{1..3}t', merge, hits) WHERE EventDate >= today() - 2 GROUP BY h ORDER BY h; +``` + +Dans certains cas, nous déployons également à l'environnement de test de nos équipes d'amis dans Yandex: marché, Cloud, etc. Nous avons également des serveurs matériels qui sont utilisés à des fins de développement. + +## Les Tests De Charge {#load-testing} + +Après le déploiement dans l'environnement de test, nous exécutons des tests de charge avec des requêtes du cluster de production. Ceci est fait manuellement. + +Assurez-vous que vous avez activé `query_log` sur votre cluster de production. + +Recueillir le journal des requêtes pour une journée ou plus: + +``` bash +$ clickhouse-client --query="SELECT DISTINCT query FROM system.query_log WHERE event_date = today() AND query LIKE '%ym:%' AND query NOT LIKE '%system.query_log%' AND type = 2 AND is_initial_query" > queries.tsv +``` + +C'est une façon compliquée exemple. `type = 2` filtrera les requêtes exécutées avec succès. `query LIKE '%ym:%'` est de sélectionner les requêtes de Yandex.Metrica. `is_initial_query` est de sélectionner uniquement les requêtes initiées par le client, pas par ClickHouse lui-même (en tant que partie du traitement de requête distribué). + +`scp` ce journal à votre cluster de test et l'exécuter comme suit: + +``` bash +$ clickhouse benchmark --concurrency 16 < queries.tsv +``` + +(probablement vous voulez aussi spécifier un `--user`) + +Ensuite, laissez-le pour une nuit ou un week-end et allez vous reposer. + +Tu devrais vérifier ça `clickhouse-server` ne plante pas, l'empreinte mémoire est limitée et les performances ne se dégradent pas au fil du temps. + +Les délais précis d'exécution des requêtes ne sont pas enregistrés et ne sont pas comparés en raison de la grande variabilité des requêtes et de l'environnement. + +## Essais De Construction {#build-tests} + +Les tests de construction permettent de vérifier que la construction n'est pas interrompue sur diverses configurations alternatives et sur certains systèmes étrangers. Les Tests sont situés à `ci` répertoire. Ils exécutent build from source à L'intérieur de Docker, Vagrant, et parfois avec `qemu-user-static` à l'intérieur de Docker. Ces tests sont en cours de développement et les essais ne sont pas automatisées. + +Motivation: + +Normalement, nous libérons et exécutons tous les tests sur une seule variante de construction ClickHouse. Mais il existe des variantes de construction alternatives qui ne sont pas complètement testées. Exemple: + +- construire sur FreeBSD; +- construire sur Debian avec les bibliothèques des paquets système; +- construire avec des liens partagés de bibliothèques; +- construire sur la plate-forme AArch64; +- construire sur la plate-forme PowerPc. + +Par exemple, construire avec des paquets système est une mauvaise pratique, car nous ne pouvons pas garantir quelle version exacte des paquets un système aura. Mais c'est vraiment nécessaire pour les responsables Debian. Pour cette raison, nous devons au moins soutenir cette variante de construction. Un autre exemple: la liaison partagée est une source commune de problèmes, mais elle est nécessaire pour certains amateurs. + +Bien que nous ne puissions pas exécuter tous les tests sur toutes les variantes de builds, nous voulons vérifier au moins que les différentes variantes de build ne sont pas cassées. Pour cela nous utilisons les essais de construction. + +## Test De Compatibilité Du Protocole {#testing-for-protocol-compatibility} + +Lorsque nous étendons le protocole réseau ClickHouse, nous testons manuellement que l'ancien clickhouse-client fonctionne avec le nouveau clickhouse-server et que le nouveau clickhouse-client fonctionne avec l'ancien clickhouse-server (simplement en exécutant des binaires à partir des paquets correspondants). + +## L'Aide Du Compilateur {#help-from-the-compiler} + +Code ClickHouse principal (qui est situé dans `dbms` annuaire) est construit avec `-Wall -Wextra -Werror` et avec quelques avertissements supplémentaires activés. Bien que ces options ne soient pas activées pour les bibliothèques tierces. + +Clang a des avertissements encore plus utiles - vous pouvez les chercher avec `-Weverything` et choisissez quelque chose à construire par défaut. + +Pour les builds de production, gcc est utilisé (il génère toujours un code légèrement plus efficace que clang). Pour le développement, clang est généralement plus pratique à utiliser. Vous pouvez construire sur votre propre machine avec le mode débogage (pour économiser la batterie de votre ordinateur portable), mais veuillez noter que le compilateur est capable de générer plus d'Avertissements avec `-O3` grâce à une meilleure analyse du flux de contrôle et de l'inter-procédure. Lors de la construction avec clang, `libc++` est utilisé au lieu de `libstdc++` et lors de la construction avec le mode débogage, la version de débogage de `libc++` est utilisé qui permet d'attraper plus d'erreurs à l'exécution. + +## Désinfectant {#sanitizers} + +**Désinfectant d'adresse**. +Nous exécutons des tests fonctionnels et d'intégration sous ASan sur la base de per-commit. + +**Valgrind (Memcheck)**. +Nous effectuons des tests fonctionnels sous Valgrind pendant la nuit. Cela prend plusieurs heures. Actuellement il y a un faux positif connu dans `re2` bibliothèque, consultez [cet article](https://research.swtch.com/sparse). + +**Désinfectant de comportement indéfini.** +Nous exécutons des tests fonctionnels et d'intégration sous ASan sur la base de per-commit. + +**Désinfectant pour filetage**. +Nous exécutons des tests fonctionnels sous TSan sur la base de per-commit. Nous n'exécutons toujours pas de tests D'intégration sous TSan sur la base de la validation. + +**Mémoire de désinfectant**. +Actuellement, nous n'utilisons toujours pas MSan. + +**Débogueur allocateur.** +Version de débogage de `jemalloc` est utilisé pour la construction de débogage. + +## Fuzzing {#fuzzing} + +Nous utilisons un simple test fuzz pour générer des requêtes SQL aléatoires et vérifier que le serveur ne meurt pas. Le test de Fuzz est effectué avec un désinfectant D'adresse. Vous pouvez le trouver dans `00746_sql_fuzzy.pl`. Ce test doit être exécuté en continu (pendant la nuit et plus longtemps). + +En décembre 2018, nous n'utilisons toujours pas de tests fuzz isolés du code de la bibliothèque. + +## Audit De Sécurité {#security-audit} + +Les gens du Département Cloud de Yandex font un aperçu de base des capacités de ClickHouse du point de vue de la sécurité. + +## Analyseurs Statiques {#static-analyzers} + +Nous courons `PVS-Studio` par commettre base. Nous avons évalué `clang-tidy`, `Coverity`, `cppcheck`, `PVS-Studio`, `tscancode`. Vous trouverez des instructions pour l'utilisation dans `dbms/tests/instructions/` répertoire. Aussi, vous pouvez lire [l'article en russe](https://habr.com/company/yandex/blog/342018/). + +Si vous utilisez `CLion` en tant QU'IDE, vous pouvez tirer parti de certains `clang-tidy` contrôles de la boîte. + +## Durcir {#hardening} + +`FORTIFY_SOURCE` est utilisé par défaut. C'est presque inutile, mais cela a toujours du sens dans de rares cas et nous ne le désactivons pas. + +## Code De Style {#code-style} + +Les règles de style de Code sont décrites [ici](https://clickhouse.tech/docs/en/development/style/). + +Pour vérifier certaines violations de style courantes, vous pouvez utiliser `utils/check-style` script. + +Pour forcer le style approprié de votre code, vous pouvez utiliser `clang-format`. Fichier `.clang-format` est situé à la racine des sources. Il correspond principalement à notre style de code réel. Mais il n'est pas recommandé d'appliquer `clang-format` pour les fichiers existants, car il rend le formatage pire. Vous pouvez utiliser `clang-format-diff` outil que vous pouvez trouver dans clang référentiel source. + +Alternativement vous pouvez essayer `uncrustify` outil pour reformater votre code. La Configuration est en `uncrustify.cfg` dans la racine des sources. Il est moins testé que `clang-format`. + +`CLion` a son propre formateur de code qui doit être réglé pour notre style de code. + +## Tests Metrica B2B {#metrica-b2b-tests} + +Chaque version de ClickHouse est testée avec les moteurs Yandex Metrica et AppMetrica. Les versions de test et stables de ClickHouse sont déployées sur des machines virtuelles et exécutées avec une petite copie de metrica engine qui traite un échantillon fixe de données d'entrée. Ensuite, les résultats de deux instances de metrica engine sont comparés ensemble. + +Ces tests sont automatisés par une équipe distincte. En raison du nombre élevé de pièces en mouvement, les tests échouent la plupart du temps complètement raisons, qui sont très difficiles à comprendre. Très probablement, ces tests ont une valeur négative pour nous. Néanmoins, ces tests se sont révélés utiles dans environ une ou deux fois sur des centaines. + +## La Couverture De Test {#test-coverage} + +En juillet 2018, nous ne suivons pas la couverture des tests. + +## Automatisation Des Tests {#test-automation} + +Nous exécutons des tests avec Yandex CI interne et le système d'automatisation des tâches nommé “Sandbox”. + +Les travaux de construction et les tests sont exécutés dans Sandbox sur une base de validation. Les paquets résultants et les résultats des tests sont publiés dans GitHub et peuvent être téléchargés par des liens directs. Les artefacts sont stockés éternellement. Lorsque vous envoyez une demande de tirage sur GitHub, nous l'étiquetons comme “can be tested” et notre système CI construira des paquets ClickHouse (release, debug, avec un désinfectant d'adresse, etc.) pour vous. + +Nous n'utilisons pas Travis CI en raison de la limite de temps et de puissance de calcul. +On n'utilise pas Jenkins. Il a été utilisé avant et maintenant nous sommes heureux de ne pas utiliser Jenkins. + +[Article Original](https://clickhouse.tech/docs/en/development/tests/) diff --git a/docs/fr/faq/general.md b/docs/fr/faq/general.md new file mode 100644 index 00000000000..51193676500 --- /dev/null +++ b/docs/fr/faq/general.md @@ -0,0 +1,57 @@ +--- +machine_translated: true +--- + +# Questions Générales {#general-questions} + +## Pourquoi Ne Pas Utiliser Quelque Chose Comme MapReduce? {#why-not-use-something-like-mapreduce} + +Nous pouvons nous référer à des systèmes comme MapReduce en tant que systèmes informatiques distribués dans lesquels l'opération de réduction est basée sur le tri distribué. La solution open-source la plus courante dans cette classe est [Apache Hadoop](http://hadoop.apache.org). Yandex utilise sa solution interne, YT. + +Ces systèmes ne sont pas appropriés pour les requêtes en ligne en raison de leur latence élevée. En d'autres termes, ils ne peuvent pas être utilisés comme back-end pour une interface web. Ces types de systèmes ne sont pas utiles pour les mises à jour de données en temps réel. Le tri distribué n'est pas la meilleure façon d'effectuer des opérations de réduction si le résultat de l'opération et tous les résultats intermédiaires (s'il y en a) sont situés dans la RAM d'un seul serveur, ce qui est généralement le cas pour les requêtes en ligne. Dans un tel cas, une table de hachage est un moyen optimal d'effectuer des opérations de réduction. Une approche courante pour optimiser les tâches map-reduce est la pré-agrégation (réduction partielle) à l'aide d'une table de hachage en RAM. L'utilisateur effectue cette optimisation manuellement. Le tri distribué est l'une des principales causes de réduction des performances lors de l'exécution de tâches simples de réduction de la carte. + +La plupart des implémentations MapReduce vous permettent d'exécuter du code arbitraire sur un cluster. Mais un langage de requête déclaratif est mieux adapté à OLAP pour exécuter des expériences rapidement. Par exemple, Hadoop a ruche et Cochon. Considérez également Cloudera Impala ou Shark (obsolète) pour Spark, ainsi que Spark SQL, Presto et Apache Drill. Les performances lors de l'exécution de telles tâches sont très sous-optimales par rapport aux systèmes spécialisés, mais une latence relativement élevée rend irréaliste l'utilisation de ces systèmes comme backend pour une interface web. + +## Que Faire si j'ai un problème avec les encodages lors de l'utilisation D'Oracle via ODBC? {#oracle-odbc-encodings} + +Si vous utilisez Oracle via le pilote ODBC comme source de dictionnaires externes, vous devez définir la valeur correcte pour `NLS_LANG` variable d'environnement dans `/etc/default/clickhouse`. Pour plus d'informations, voir le [FAQ Oracle NLS\_LANG](https://www.oracle.com/technetwork/products/globalization/nls-lang-099431.html). + +**Exemple** + +``` sql +NLS_LANG=RUSSIAN_RUSSIA.UTF8 +``` + +## Comment exporter des données de ClickHouse vers un fichier? {#how-to-export-to-file} + +### Utilisation de la Clause INTO OUTFILE {#using-into-outfile-clause} + +Ajouter un [INTO OUTFILE](../query_language/select/#into-outfile-clause) clause à votre requête. + +Exemple: + +``` sql +SELECT * FROM table INTO OUTFILE 'file' +``` + +Par défaut, ClickHouse utilise [TabSeparated](../interfaces/formats.md#tabseparated) format pour les données de sortie. Pour sélectionner le [format de données](../interfaces/formats.md), utiliser le [FORMAT de la clause](../query_language/select/#format-clause). + +Exemple: + +``` sql +SELECT * FROM table INTO OUTFILE 'file' FORMAT CSV +``` + +### Utilisation d'une Table de moteur de fichiers {#using-a-file-engine-table} + +Voir [Fichier](../operations/table_engines/file.md). + +### Utilisation De La Redirection En Ligne De Commande {#using-command-line-redirection} + +``` sql +$ clickhouse-client --query "SELECT * from table" --format FormatName > result.txt +``` + +Voir [clickhouse-client](../interfaces/cli.md). + +{## [Article Original](https://clickhouse.tech/docs/en/faq/general/) ##} diff --git a/docs/fr/getting_started/example_datasets/amplab_benchmark.md b/docs/fr/getting_started/example_datasets/amplab_benchmark.md new file mode 100644 index 00000000000..21b27e23615 --- /dev/null +++ b/docs/fr/getting_started/example_datasets/amplab_benchmark.md @@ -0,0 +1,126 @@ +--- +machine_translated: true +--- + +# AMPLab Big Data Benchmark {#amplab-big-data-benchmark} + +Tu vois https://amplab.cs.berkeley.edu/benchmark/ + +Inscrivez-vous pour un compte GRATUIT à https://aws.amazon.com. il nécessite une carte de crédit, e-mail et numéro de téléphone. Obtenir une nouvelle clé d'accès à https://console.aws.amazon.com/iam/home?nc2=h\_m\_sc\#security\_credential + +Exécutez ce qui suit dans la console: + +``` bash +$ sudo apt-get install s3cmd +$ mkdir tiny; cd tiny; +$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/tiny/ . +$ cd .. +$ mkdir 1node; cd 1node; +$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/1node/ . +$ cd .. +$ mkdir 5nodes; cd 5nodes; +$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/5nodes/ . +$ cd .. +``` + +Exécutez les requêtes ClickHouse suivantes: + +``` sql +CREATE TABLE rankings_tiny +( + pageURL String, + pageRank UInt32, + avgDuration UInt32 +) ENGINE = Log; + +CREATE TABLE uservisits_tiny +( + sourceIP String, + destinationURL String, + visitDate Date, + adRevenue Float32, + UserAgent String, + cCode FixedString(3), + lCode FixedString(6), + searchWord String, + duration UInt32 +) ENGINE = MergeTree(visitDate, visitDate, 8192); + +CREATE TABLE rankings_1node +( + pageURL String, + pageRank UInt32, + avgDuration UInt32 +) ENGINE = Log; + +CREATE TABLE uservisits_1node +( + sourceIP String, + destinationURL String, + visitDate Date, + adRevenue Float32, + UserAgent String, + cCode FixedString(3), + lCode FixedString(6), + searchWord String, + duration UInt32 +) ENGINE = MergeTree(visitDate, visitDate, 8192); + +CREATE TABLE rankings_5nodes_on_single +( + pageURL String, + pageRank UInt32, + avgDuration UInt32 +) ENGINE = Log; + +CREATE TABLE uservisits_5nodes_on_single +( + sourceIP String, + destinationURL String, + visitDate Date, + adRevenue Float32, + UserAgent String, + cCode FixedString(3), + lCode FixedString(6), + searchWord String, + duration UInt32 +) ENGINE = MergeTree(visitDate, visitDate, 8192); +``` + +Retournez à la console: + +``` bash +$ for i in tiny/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_tiny FORMAT CSV"; done +$ for i in tiny/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_tiny FORMAT CSV"; done +$ for i in 1node/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_1node FORMAT CSV"; done +$ for i in 1node/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_1node FORMAT CSV"; done +$ for i in 5nodes/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_5nodes_on_single FORMAT CSV"; done +$ for i in 5nodes/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_5nodes_on_single FORMAT CSV"; done +``` + +Requêtes pour obtenir des échantillons de données: + +``` sql +SELECT pageURL, pageRank FROM rankings_1node WHERE pageRank > 1000 + +SELECT substring(sourceIP, 1, 8), sum(adRevenue) FROM uservisits_1node GROUP BY substring(sourceIP, 1, 8) + +SELECT + sourceIP, + sum(adRevenue) AS totalRevenue, + avg(pageRank) AS pageRank +FROM rankings_1node ALL INNER JOIN +( + SELECT + sourceIP, + destinationURL AS pageURL, + adRevenue + FROM uservisits_1node + WHERE (visitDate > '1980-01-01') AND (visitDate < '1980-04-01') +) USING pageURL +GROUP BY sourceIP +ORDER BY totalRevenue DESC +LIMIT 1 +``` + +[Article Original](https://clickhouse.tech/docs/en/getting_started/example_datasets/amplab_benchmark/) diff --git a/docs/fr/getting_started/example_datasets/criteo.md b/docs/fr/getting_started/example_datasets/criteo.md new file mode 100644 index 00000000000..610ed78febd --- /dev/null +++ b/docs/fr/getting_started/example_datasets/criteo.md @@ -0,0 +1,78 @@ +--- +machine_translated: true +--- + +# Téraoctet de journaux de clics de Criteo {#terabyte-of-click-logs-from-criteo} + +Télécharger les données à partir de http://labs.criteo.com/downloads/download-terabyte-click-logs/ + +Créer une table pour importer le journal: + +``` sql +CREATE TABLE criteo_log (date Date, clicked UInt8, int1 Int32, int2 Int32, int3 Int32, int4 Int32, int5 Int32, int6 Int32, int7 Int32, int8 Int32, int9 Int32, int10 Int32, int11 Int32, int12 Int32, int13 Int32, cat1 String, cat2 String, cat3 String, cat4 String, cat5 String, cat6 String, cat7 String, cat8 String, cat9 String, cat10 String, cat11 String, cat12 String, cat13 String, cat14 String, cat15 String, cat16 String, cat17 String, cat18 String, cat19 String, cat20 String, cat21 String, cat22 String, cat23 String, cat24 String, cat25 String, cat26 String) ENGINE = Log +``` + +Télécharger les données: + +``` bash +$ for i in {00..23}; do echo $i; zcat datasets/criteo/day_${i#0}.gz | sed -r 's/^/2000-01-'${i/00/24}'\t/' | clickhouse-client --host=example-perftest01j --query="INSERT INTO criteo_log FORMAT TabSeparated"; done +``` + +Créer une table pour les données converties: + +``` sql +CREATE TABLE criteo +( + date Date, + clicked UInt8, + int1 Int32, + int2 Int32, + int3 Int32, + int4 Int32, + int5 Int32, + int6 Int32, + int7 Int32, + int8 Int32, + int9 Int32, + int10 Int32, + int11 Int32, + int12 Int32, + int13 Int32, + icat1 UInt32, + icat2 UInt32, + icat3 UInt32, + icat4 UInt32, + icat5 UInt32, + icat6 UInt32, + icat7 UInt32, + icat8 UInt32, + icat9 UInt32, + icat10 UInt32, + icat11 UInt32, + icat12 UInt32, + icat13 UInt32, + icat14 UInt32, + icat15 UInt32, + icat16 UInt32, + icat17 UInt32, + icat18 UInt32, + icat19 UInt32, + icat20 UInt32, + icat21 UInt32, + icat22 UInt32, + icat23 UInt32, + icat24 UInt32, + icat25 UInt32, + icat26 UInt32 +) ENGINE = MergeTree(date, intHash32(icat1), (date, intHash32(icat1)), 8192) +``` + +Transformez les données du journal brut et placez - les dans la deuxième table: + +``` sql +INSERT INTO criteo SELECT date, clicked, int1, int2, int3, int4, int5, int6, int7, int8, int9, int10, int11, int12, int13, reinterpretAsUInt32(unhex(cat1)) AS icat1, reinterpretAsUInt32(unhex(cat2)) AS icat2, reinterpretAsUInt32(unhex(cat3)) AS icat3, reinterpretAsUInt32(unhex(cat4)) AS icat4, reinterpretAsUInt32(unhex(cat5)) AS icat5, reinterpretAsUInt32(unhex(cat6)) AS icat6, reinterpretAsUInt32(unhex(cat7)) AS icat7, reinterpretAsUInt32(unhex(cat8)) AS icat8, reinterpretAsUInt32(unhex(cat9)) AS icat9, reinterpretAsUInt32(unhex(cat10)) AS icat10, reinterpretAsUInt32(unhex(cat11)) AS icat11, reinterpretAsUInt32(unhex(cat12)) AS icat12, reinterpretAsUInt32(unhex(cat13)) AS icat13, reinterpretAsUInt32(unhex(cat14)) AS icat14, reinterpretAsUInt32(unhex(cat15)) AS icat15, reinterpretAsUInt32(unhex(cat16)) AS icat16, reinterpretAsUInt32(unhex(cat17)) AS icat17, reinterpretAsUInt32(unhex(cat18)) AS icat18, reinterpretAsUInt32(unhex(cat19)) AS icat19, reinterpretAsUInt32(unhex(cat20)) AS icat20, reinterpretAsUInt32(unhex(cat21)) AS icat21, reinterpretAsUInt32(unhex(cat22)) AS icat22, reinterpretAsUInt32(unhex(cat23)) AS icat23, reinterpretAsUInt32(unhex(cat24)) AS icat24, reinterpretAsUInt32(unhex(cat25)) AS icat25, reinterpretAsUInt32(unhex(cat26)) AS icat26 FROM criteo_log; + +DROP TABLE criteo_log; +``` + +[Article Original](https://clickhouse.tech/docs/en/getting_started/example_datasets/criteo/) diff --git a/docs/fr/getting_started/example_datasets/index.md b/docs/fr/getting_started/example_datasets/index.md new file mode 100644 index 00000000000..584214d5718 --- /dev/null +++ b/docs/fr/getting_started/example_datasets/index.md @@ -0,0 +1,18 @@ +--- +machine_translated: true +--- + +# Exemple De Jeux De Données {#example-datasets} + +Cette section décrit comment obtenir des exemples de jeux de données et les importer dans ClickHouse. +Pour certains ensembles de données exemple les requêtes sont également disponibles. + +- [Yandex Anonymisé.Metrica Dataset](metrica.md) +- [Référence Du Schéma En Étoile](star_schema.md) +- [WikiStat](wikistat.md) +- [Téraoctet de journaux de clics de Criteo](criteo.md) +- [AMPLab Big Data Benchmark](amplab_benchmark.md) +- [New York Taxi Données](nyc_taxi.md) +- [OnTime](ontime.md) + +[Article Original](https://clickhouse.tech/docs/en/getting_started/example_datasets) diff --git a/docs/fr/getting_started/example_datasets/metrica.md b/docs/fr/getting_started/example_datasets/metrica.md new file mode 100644 index 00000000000..7ddca6462eb --- /dev/null +++ b/docs/fr/getting_started/example_datasets/metrica.md @@ -0,0 +1,67 @@ +--- +machine_translated: true +--- + +# Yandex Anonymisé.Metrica De Données {#anonymized-yandex-metrica-data} + +Dataset se compose de deux tables contenant des données anonymisées sur les hits (`hits_v1`) et les visites (`visits_v1`) de Yandex.Metrica. Vous pouvez en savoir plus sur Yandex.Metrica dans [Histoire de ClickHouse](../../introduction/history.md) section. + +L'ensemble de données se compose de deux tables, l'une d'elles peut être téléchargée sous forme compressée `tsv.xz` fichier ou comme partitions préparées. En outre, une version étendue de l' `hits` table contenant 100 millions de lignes est disponible comme TSV à https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits\_100m\_obfuscated\_v1.tsv.xz et comme partitions préparées à https://clickhouse-datasets.s3.yandex.net/hits/partitions/hits\_100m\_obfuscated\_v1.tar.xz. + +## Obtention de Tables à partir de Partitions préparées {#obtaining-tables-from-prepared-partitions} + +Télécharger et importer la table hits: + +``` bash +curl -O https://clickhouse-datasets.s3.yandex.net/hits/partitions/hits_v1.tar +tar xvf hits_v1.tar -C /var/lib/clickhouse # path to ClickHouse data directory +# check permissions on unpacked data, fix if required +sudo service clickhouse-server restart +clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1" +``` + +Télécharger et importer des visites: + +``` bash +curl -O https://clickhouse-datasets.s3.yandex.net/visits/partitions/visits_v1.tar +tar xvf visits_v1.tar -C /var/lib/clickhouse # path to ClickHouse data directory +# check permissions on unpacked data, fix if required +sudo service clickhouse-server restart +clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1" +``` + +## Obtention de Tables à partir D'un fichier TSV compressé {#obtaining-tables-from-compressed-tsv-file} + +Télécharger et importer des hits à partir du fichier TSV compressé: + +``` bash +curl https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv +# now create table +clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets" +clickhouse-client --query "CREATE TABLE datasets.hits_v1 ( WatchID UInt64, JavaEnable UInt8, Title String, GoodEvent Int16, EventTime DateTime, EventDate Date, CounterID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RegionID UInt32, UserID UInt64, CounterClass Int8, OS UInt8, UserAgent UInt8, URL String, Referer String, URLDomain String, RefererDomain String, Refresh UInt8, IsRobot UInt8, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), ResolutionWidth UInt16, ResolutionHeight UInt16, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, FlashMinor2 String, NetMajor UInt8, NetMinor UInt8, UserAgentMajor UInt16, UserAgentMinor FixedString(2), CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, MobilePhone UInt8, MobilePhoneModel String, Params String, IPNetworkID UInt32, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, IsArtifical UInt8, WindowClientWidth UInt16, WindowClientHeight UInt16, ClientTimeZone Int16, ClientEventTime DateTime, SilverlightVersion1 UInt8, SilverlightVersion2 UInt8, SilverlightVersion3 UInt32, SilverlightVersion4 UInt16, PageCharset String, CodeVersion UInt32, IsLink UInt8, IsDownload UInt8, IsNotBounce UInt8, FUniqID UInt64, HID UInt32, IsOldCounter UInt8, IsEvent UInt8, IsParameter UInt8, DontCountHits UInt8, WithHash UInt8, HitColor FixedString(1), UTCEventTime DateTime, Age UInt8, Sex UInt8, Income UInt8, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), RemoteIP UInt32, RemoteIP6 FixedString(16), WindowName Int32, OpenerName Int32, HistoryLength Int16, BrowserLanguage FixedString(2), BrowserCountry FixedString(2), SocialNetwork String, SocialAction String, HTTPError UInt16, SendTiming Int32, DNSTiming Int32, ConnectTiming Int32, ResponseStartTiming Int32, ResponseEndTiming Int32, FetchTiming Int32, RedirectTiming Int32, DOMInteractiveTiming Int32, DOMContentLoadedTiming Int32, DOMCompleteTiming Int32, LoadEventStartTiming Int32, LoadEventEndTiming Int32, NSToDOMContentLoadedTiming Int32, FirstPaintTiming Int32, RedirectCount Int8, SocialSourceNetworkID UInt8, SocialSourcePage String, ParamPrice Int64, ParamOrderID String, ParamCurrency FixedString(3), ParamCurrencyID UInt16, GoalsReached Array(UInt32), OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, RefererHash UInt64, URLHash UInt64, CLID UInt32, YCLID UInt64, ShareService String, ShareURL String, ShareTitle String, ParsedParams Nested(Key1 String, Key2 String, Key3 String, Key4 String, Key5 String, ValueDouble Float64), IslandID FixedString(16), RequestNum UInt32, RequestTry UInt8) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192" +# import data +cat hits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.hits_v1 FORMAT TSV" --max_insert_block_size=100000 +# optionally you can optimize table +clickhouse-client --query "OPTIMIZE TABLE datasets.hits_v1 FINAL" +clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1" +``` + +Télécharger et importer des visites à partir du fichier TSV compressé: + +``` bash +curl https://clickhouse-datasets.s3.yandex.net/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv +# now create table +clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets" +clickhouse-client --query "CREATE TABLE datasets.visits_v1 ( CounterID UInt32, StartDate Date, Sign Int8, IsNew UInt8, VisitID UInt64, UserID UInt64, StartTime DateTime, Duration UInt32, UTCStartTime DateTime, PageViews Int32, Hits Int32, IsBounce UInt8, Referer String, StartURL String, RefererDomain String, StartURLDomain String, EndURL String, LinkURL String, IsDownload UInt8, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, PlaceID Int32, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), IsYandex UInt8, GoalReachesDepth Int32, GoalReachesURL Int32, GoalReachesAny Int32, SocialSourceNetworkID UInt8, SocialSourcePage String, MobilePhoneModel String, ClientEventTime DateTime, RegionID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RemoteIP UInt32, RemoteIP6 FixedString(16), IPNetworkID UInt32, SilverlightVersion3 UInt32, CodeVersion UInt32, ResolutionWidth UInt16, ResolutionHeight UInt16, UserAgentMajor UInt16, UserAgentMinor UInt16, WindowClientWidth UInt16, WindowClientHeight UInt16, SilverlightVersion2 UInt8, SilverlightVersion4 UInt16, FlashVersion3 UInt16, FlashVersion4 UInt16, ClientTimeZone Int16, OS UInt8, UserAgent UInt8, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, NetMajor UInt8, NetMinor UInt8, MobilePhone UInt8, SilverlightVersion1 UInt8, Age UInt8, Sex UInt8, Income UInt8, JavaEnable UInt8, CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, BrowserLanguage UInt16, BrowserCountry UInt16, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), Params Array(String), Goals Nested(ID UInt32, Serial UInt32, EventTime DateTime, Price Int64, OrderID String, CurrencyID UInt32), WatchIDs Array(UInt64), ParamSumPrice Int64, ParamCurrency FixedString(3), ParamCurrencyID UInt16, ClickLogID UInt64, ClickEventID Int32, ClickGoodEvent Int32, ClickEventTime DateTime, ClickPriorityID Int32, ClickPhraseID Int32, ClickPageID Int32, ClickPlaceID Int32, ClickTypeID Int32, ClickResourceID Int32, ClickCost UInt32, ClickClientIP UInt32, ClickDomainID UInt32, ClickURL String, ClickAttempt UInt8, ClickOrderID UInt32, ClickBannerID UInt32, ClickMarketCategoryID UInt32, ClickMarketPP UInt32, ClickMarketCategoryName String, ClickMarketPPName String, ClickAWAPSCampaignName String, ClickPageName String, ClickTargetType UInt16, ClickTargetPhraseID UInt64, ClickContextType UInt8, ClickSelectType Int8, ClickOptions String, ClickGroupBannerID Int32, OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, FirstVisit DateTime, PredLastVisit Date, LastVisit Date, TotalVisits UInt32, TraficSource Nested(ID Int8, SearchEngineID UInt16, AdvEngineID UInt8, PlaceID UInt16, SocialSourceNetworkID UInt8, Domain String, SearchPhrase String, SocialSourcePage String), Attendance FixedString(16), CLID UInt32, YCLID UInt64, NormalizedRefererHash UInt64, SearchPhraseHash UInt64, RefererDomainHash UInt64, NormalizedStartURLHash UInt64, StartURLDomainHash UInt64, NormalizedEndURLHash UInt64, TopLevelDomain UInt64, URLScheme UInt64, OpenstatServiceNameHash UInt64, OpenstatCampaignIDHash UInt64, OpenstatAdIDHash UInt64, OpenstatSourceIDHash UInt64, UTMSourceHash UInt64, UTMMediumHash UInt64, UTMCampaignHash UInt64, UTMContentHash UInt64, UTMTermHash UInt64, FromHash UInt64, WebVisorEnabled UInt8, WebVisorActivity UInt32, ParsedParams Nested(Key1 String, Key2 String, Key3 String, Key4 String, Key5 String, ValueDouble Float64), Market Nested(Type UInt8, GoalID UInt32, OrderID String, OrderPrice Int64, PP UInt32, DirectPlaceID UInt32, DirectOrderID UInt32, DirectBannerID UInt32, GoodID String, GoodName String, GoodQuantity Int32, GoodPrice Int64), IslandID FixedString(16)) ENGINE = CollapsingMergeTree(Sign) PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192" +# import data +cat visits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.visits_v1 FORMAT TSV" --max_insert_block_size=100000 +# optionally you can optimize table +clickhouse-client --query "OPTIMIZE TABLE datasets.visits_v1 FINAL" +clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1" +``` + +## Exemple De Requêtes {#example-queries} + +[Tutoriel ClickHouse](../../getting_started/tutorial.md) est basé sur Yandex.Metrica dataset et la façon recommandée pour commencer avec cet ensemble de données est de simplement passer par tutoriel. + +D'autres exemples de requêtes pour ces tables peuvent être trouvés parmi [tests avec État](https://github.com/ClickHouse/ClickHouse/tree/master/dbms/tests/queries/1_stateful) de ClickHouse (ils sont nommés `test.hists` et `test.visits` y). diff --git a/docs/fr/getting_started/example_datasets/nyc_taxi.md b/docs/fr/getting_started/example_datasets/nyc_taxi.md new file mode 100644 index 00000000000..a1179c22d37 --- /dev/null +++ b/docs/fr/getting_started/example_datasets/nyc_taxi.md @@ -0,0 +1,387 @@ +--- +machine_translated: true +--- + +# New York Taxi Données {#new-york-taxi-data} + +Ce jeu de données peut être obtenu de deux façons: + +- importation à partir de données brutes +- téléchargement de partitions + +## Comment importer les données brutes {#how-to-import-the-raw-data} + +Tu vois https://github.com/toddwschneider/nyc-taxi-data et http://tech.marksblogg.com/billion-nyc-taxi-rides-redshift.html pour la description d'un ensemble de données et les instructions de téléchargement. + +Le téléchargement entraînera environ 227 Go de données non compressées dans des fichiers CSV. Le téléchargement prend environ une heure sur une connexion 1 Gbit (téléchargement parallèle depuis s3.amazonaws.com récupère au moins la moitié d'un canal 1 Gbit). +Certains fichiers peuvent ne pas télécharger entièrement. Vérifiez la taille des fichiers et re-télécharger tout ce qui semble douteux. + +Certains fichiers peuvent contenir des lignes invalides. Vous pouvez les corriger comme suit: + +``` bash +sed -E '/(.*,){18,}/d' data/yellow_tripdata_2010-02.csv > data/yellow_tripdata_2010-02.csv_ +sed -E '/(.*,){18,}/d' data/yellow_tripdata_2010-03.csv > data/yellow_tripdata_2010-03.csv_ +mv data/yellow_tripdata_2010-02.csv_ data/yellow_tripdata_2010-02.csv +mv data/yellow_tripdata_2010-03.csv_ data/yellow_tripdata_2010-03.csv +``` + +Ensuite, les données doivent être pré-traitées dans PostgreSQL. Cela créera des sélections de points dans les polygones (pour faire correspondre les points sur la carte avec les arrondissements de New York) et combinera toutes les données en une seule table plate dénormalisée à l'aide d'une jointure. Pour ce faire, vous devrez installer PostgreSQL avec le support PostGIS. + +Soyez prudent lors de l'exécution `initialize_database.sh` et vérifiez à nouveau manuellement que toutes les tables ont été créées correctement. + +Il faut environ 20-30 minutes pour traiter la valeur de chaque mois de données dans PostgreSQL, pour un total d'environ 48 heures. + +Vous pouvez vérifier le nombre de téléchargé lignes comme suit: + +``` bash +$ time psql nyc-taxi-data -c "SELECT count(*) FROM trips;" +## Count + 1298979494 +(1 row) + +real 7m9.164s +``` + +(C'est un peu plus de 1,1 milliard de lignes rapportées par Mark Litwintschik dans une série de billets de blog.) + +Les données de PostgreSQL utilisent 370 GO d'espace. + +Exportation des données depuis PostgreSQL: + +``` sql +COPY +( + SELECT trips.id, + trips.vendor_id, + trips.pickup_datetime, + trips.dropoff_datetime, + trips.store_and_fwd_flag, + trips.rate_code_id, + trips.pickup_longitude, + trips.pickup_latitude, + trips.dropoff_longitude, + trips.dropoff_latitude, + trips.passenger_count, + trips.trip_distance, + trips.fare_amount, + trips.extra, + trips.mta_tax, + trips.tip_amount, + trips.tolls_amount, + trips.ehail_fee, + trips.improvement_surcharge, + trips.total_amount, + trips.payment_type, + trips.trip_type, + trips.pickup, + trips.dropoff, + + cab_types.type cab_type, + + weather.precipitation_tenths_of_mm rain, + weather.snow_depth_mm, + weather.snowfall_mm, + weather.max_temperature_tenths_degrees_celsius max_temp, + weather.min_temperature_tenths_degrees_celsius min_temp, + weather.average_wind_speed_tenths_of_meters_per_second wind, + + pick_up.gid pickup_nyct2010_gid, + pick_up.ctlabel pickup_ctlabel, + pick_up.borocode pickup_borocode, + pick_up.boroname pickup_boroname, + pick_up.ct2010 pickup_ct2010, + pick_up.boroct2010 pickup_boroct2010, + pick_up.cdeligibil pickup_cdeligibil, + pick_up.ntacode pickup_ntacode, + pick_up.ntaname pickup_ntaname, + pick_up.puma pickup_puma, + + drop_off.gid dropoff_nyct2010_gid, + drop_off.ctlabel dropoff_ctlabel, + drop_off.borocode dropoff_borocode, + drop_off.boroname dropoff_boroname, + drop_off.ct2010 dropoff_ct2010, + drop_off.boroct2010 dropoff_boroct2010, + drop_off.cdeligibil dropoff_cdeligibil, + drop_off.ntacode dropoff_ntacode, + drop_off.ntaname dropoff_ntaname, + drop_off.puma dropoff_puma + FROM trips + LEFT JOIN cab_types + ON trips.cab_type_id = cab_types.id + LEFT JOIN central_park_weather_observations_raw weather + ON weather.date = trips.pickup_datetime::date + LEFT JOIN nyct2010 pick_up + ON pick_up.gid = trips.pickup_nyct2010_gid + LEFT JOIN nyct2010 drop_off + ON drop_off.gid = trips.dropoff_nyct2010_gid +) TO '/opt/milovidov/nyc-taxi-data/trips.tsv'; +``` + +L'instantané de données est créé à une vitesse d'environ 50 Mo par seconde. Lors de la création de l'instantané, PostgreSQL lit à partir du disque à une vitesse d'environ 28 Mo par seconde. +Cela prend environ 5 heures. Le fichier TSV résultant est 590612904969 octets. + +Créer une table temporaire dans ClickHouse: + +``` sql +CREATE TABLE trips +( +trip_id UInt32, +vendor_id String, +pickup_datetime DateTime, +dropoff_datetime Nullable(DateTime), +store_and_fwd_flag Nullable(FixedString(1)), +rate_code_id Nullable(UInt8), +pickup_longitude Nullable(Float64), +pickup_latitude Nullable(Float64), +dropoff_longitude Nullable(Float64), +dropoff_latitude Nullable(Float64), +passenger_count Nullable(UInt8), +trip_distance Nullable(Float64), +fare_amount Nullable(Float32), +extra Nullable(Float32), +mta_tax Nullable(Float32), +tip_amount Nullable(Float32), +tolls_amount Nullable(Float32), +ehail_fee Nullable(Float32), +improvement_surcharge Nullable(Float32), +total_amount Nullable(Float32), +payment_type Nullable(String), +trip_type Nullable(UInt8), +pickup Nullable(String), +dropoff Nullable(String), +cab_type Nullable(String), +precipitation Nullable(UInt8), +snow_depth Nullable(UInt8), +snowfall Nullable(UInt8), +max_temperature Nullable(UInt8), +min_temperature Nullable(UInt8), +average_wind_speed Nullable(UInt8), +pickup_nyct2010_gid Nullable(UInt8), +pickup_ctlabel Nullable(String), +pickup_borocode Nullable(UInt8), +pickup_boroname Nullable(String), +pickup_ct2010 Nullable(String), +pickup_boroct2010 Nullable(String), +pickup_cdeligibil Nullable(FixedString(1)), +pickup_ntacode Nullable(String), +pickup_ntaname Nullable(String), +pickup_puma Nullable(String), +dropoff_nyct2010_gid Nullable(UInt8), +dropoff_ctlabel Nullable(String), +dropoff_borocode Nullable(UInt8), +dropoff_boroname Nullable(String), +dropoff_ct2010 Nullable(String), +dropoff_boroct2010 Nullable(String), +dropoff_cdeligibil Nullable(String), +dropoff_ntacode Nullable(String), +dropoff_ntaname Nullable(String), +dropoff_puma Nullable(String) +) ENGINE = Log; +``` + +Il est nécessaire pour convertir les champs en types de données plus corrects et, si possible, pour éliminer les valeurs Null. + +``` bash +$ time clickhouse-client --query="INSERT INTO trips FORMAT TabSeparated" < trips.tsv + +real 75m56.214s +``` + +Les données sont lues à une vitesse de 112-140 Mo/seconde. +Le chargement de données dans une table de type de journal dans un flux a pris 76 minutes. +Les données de ce tableau utilisent 142 GO. + +(L'importation de données directement depuis Postgres est également possible en utilisant `COPY ... TO PROGRAM`.) + +Unfortunately, all the fields associated with the weather (precipitation…average\_wind\_speed) were filled with NULL. Because of this, we will remove them from the final data set. + +Pour commencer, nous allons créer une table sur un serveur unique. Plus tard, nous ferons le tableau distribué. + +Créer et remplir un tableau récapitulatif: + +``` sql +CREATE TABLE trips_mergetree +ENGINE = MergeTree(pickup_date, pickup_datetime, 8192) +AS SELECT + +trip_id, +CAST(vendor_id AS Enum8('1' = 1, '2' = 2, 'CMT' = 3, 'VTS' = 4, 'DDS' = 5, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14)) AS vendor_id, +toDate(pickup_datetime) AS pickup_date, +ifNull(pickup_datetime, toDateTime(0)) AS pickup_datetime, +toDate(dropoff_datetime) AS dropoff_date, +ifNull(dropoff_datetime, toDateTime(0)) AS dropoff_datetime, +assumeNotNull(store_and_fwd_flag) IN ('Y', '1', '2') AS store_and_fwd_flag, +assumeNotNull(rate_code_id) AS rate_code_id, +assumeNotNull(pickup_longitude) AS pickup_longitude, +assumeNotNull(pickup_latitude) AS pickup_latitude, +assumeNotNull(dropoff_longitude) AS dropoff_longitude, +assumeNotNull(dropoff_latitude) AS dropoff_latitude, +assumeNotNull(passenger_count) AS passenger_count, +assumeNotNull(trip_distance) AS trip_distance, +assumeNotNull(fare_amount) AS fare_amount, +assumeNotNull(extra) AS extra, +assumeNotNull(mta_tax) AS mta_tax, +assumeNotNull(tip_amount) AS tip_amount, +assumeNotNull(tolls_amount) AS tolls_amount, +assumeNotNull(ehail_fee) AS ehail_fee, +assumeNotNull(improvement_surcharge) AS improvement_surcharge, +assumeNotNull(total_amount) AS total_amount, +CAST((assumeNotNull(payment_type) AS pt) IN ('CSH', 'CASH', 'Cash', 'CAS', 'Cas', '1') ? 'CSH' : (pt IN ('CRD', 'Credit', 'Cre', 'CRE', 'CREDIT', '2') ? 'CRE' : (pt IN ('NOC', 'No Charge', 'No', '3') ? 'NOC' : (pt IN ('DIS', 'Dispute', 'Dis', '4') ? 'DIS' : 'UNK'))) AS Enum8('CSH' = 1, 'CRE' = 2, 'UNK' = 0, 'NOC' = 3, 'DIS' = 4)) AS payment_type_, +assumeNotNull(trip_type) AS trip_type, +ifNull(toFixedString(unhex(pickup), 25), toFixedString('', 25)) AS pickup, +ifNull(toFixedString(unhex(dropoff), 25), toFixedString('', 25)) AS dropoff, +CAST(assumeNotNull(cab_type) AS Enum8('yellow' = 1, 'green' = 2, 'uber' = 3)) AS cab_type, + +assumeNotNull(pickup_nyct2010_gid) AS pickup_nyct2010_gid, +toFloat32(ifNull(pickup_ctlabel, '0')) AS pickup_ctlabel, +assumeNotNull(pickup_borocode) AS pickup_borocode, +CAST(assumeNotNull(pickup_boroname) AS Enum8('Manhattan' = 1, 'Queens' = 4, 'Brooklyn' = 3, '' = 0, 'Bronx' = 2, 'Staten Island' = 5)) AS pickup_boroname, +toFixedString(ifNull(pickup_ct2010, '000000'), 6) AS pickup_ct2010, +toFixedString(ifNull(pickup_boroct2010, '0000000'), 7) AS pickup_boroct2010, +CAST(assumeNotNull(ifNull(pickup_cdeligibil, ' ')) AS Enum8(' ' = 0, 'E' = 1, 'I' = 2)) AS pickup_cdeligibil, +toFixedString(ifNull(pickup_ntacode, '0000'), 4) AS pickup_ntacode, + +CAST(assumeNotNull(pickup_ntaname) AS Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195)) AS pickup_ntaname, + +toUInt16(ifNull(pickup_puma, '0')) AS pickup_puma, + +assumeNotNull(dropoff_nyct2010_gid) AS dropoff_nyct2010_gid, +toFloat32(ifNull(dropoff_ctlabel, '0')) AS dropoff_ctlabel, +assumeNotNull(dropoff_borocode) AS dropoff_borocode, +CAST(assumeNotNull(dropoff_boroname) AS Enum8('Manhattan' = 1, 'Queens' = 4, 'Brooklyn' = 3, '' = 0, 'Bronx' = 2, 'Staten Island' = 5)) AS dropoff_boroname, +toFixedString(ifNull(dropoff_ct2010, '000000'), 6) AS dropoff_ct2010, +toFixedString(ifNull(dropoff_boroct2010, '0000000'), 7) AS dropoff_boroct2010, +CAST(assumeNotNull(ifNull(dropoff_cdeligibil, ' ')) AS Enum8(' ' = 0, 'E' = 1, 'I' = 2)) AS dropoff_cdeligibil, +toFixedString(ifNull(dropoff_ntacode, '0000'), 4) AS dropoff_ntacode, + +CAST(assumeNotNull(dropoff_ntaname) AS Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195)) AS dropoff_ntaname, + +toUInt16(ifNull(dropoff_puma, '0')) AS dropoff_puma + +FROM trips +``` + +Cela prend 3030 secondes à une vitesse d'environ 428 000 lignes par seconde. +Pour le charger plus rapidement, vous pouvez créer la table avec le `Log` le moteur de `MergeTree`. Dans ce cas, le téléchargement fonctionne plus rapidement que 200 secondes. + +La table utilise 126 GO d'espace disque. + +``` sql +SELECT formatReadableSize(sum(bytes)) FROM system.parts WHERE table = 'trips_mergetree' AND active +``` + +``` text +┌─formatReadableSize(sum(bytes))─┐ +│ 126.18 GiB │ +└────────────────────────────────┘ +``` + +Entre autres choses, vous pouvez exécuter la requête OPTIMIZE sur MergeTree. Mais ce n'est pas nécessaire puisque tout ira bien sans elle. + +## Téléchargement des Partitions préparées {#download-of-prepared-partitions} + +``` bash +$ curl -O https://clickhouse-datasets.s3.yandex.net/trips_mergetree/partitions/trips_mergetree.tar +$ tar xvf trips_mergetree.tar -C /var/lib/clickhouse # path to ClickHouse data directory +$ # check permissions of unpacked data, fix if required +$ sudo service clickhouse-server restart +$ clickhouse-client --query "select count(*) from datasets.trips_mergetree" +``` + +!!! info "Info" + Si vous exécutez les requêtes décrites ci-dessous, vous devez utiliser le nom complet de la table, `datasets.trips_mergetree`. + +## Résultats sur un seul serveur {#results-on-single-server} + +Q1: + +``` sql +SELECT cab_type, count(*) FROM trips_mergetree GROUP BY cab_type +``` + +0.490 secondes. + +Q2: + +``` sql +SELECT passenger_count, avg(total_amount) FROM trips_mergetree GROUP BY passenger_count +``` + +1.224 secondes. + +Q3: + +``` sql +SELECT passenger_count, toYear(pickup_date) AS year, count(*) FROM trips_mergetree GROUP BY passenger_count, year +``` + +2.104 secondes. + +Q4: + +``` sql +SELECT passenger_count, toYear(pickup_date) AS year, round(trip_distance) AS distance, count(*) +FROM trips_mergetree +GROUP BY passenger_count, year, distance +ORDER BY year, count(*) DESC +``` + +3.593 secondes. + +Le serveur suivant a été utilisé: + +Deux Intel (R) Xeon (R) CPU E5-2650 v2 @ 2.60 GHz, 16 noyaux physiques total, 128 GiB RAM, 8x6 TB HD sur le matériel RAID-5 + +Temps d'exécution est le meilleur des trois pistes. Mais à partir de la deuxième exécution, les requêtes lisent les données du cache du système de fichiers. Aucune autre mise en cache ne se produit: les données sont lues et traitées à chaque exécution. + +La création d'un tableau sur trois serveurs: + +Sur chaque serveur: + +``` sql +CREATE TABLE default.trips_mergetree_third ( trip_id UInt32, vendor_id Enum8('1' = 1, '2' = 2, 'CMT' = 3, 'VTS' = 4, 'DDS' = 5, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14), pickup_date Date, pickup_datetime DateTime, dropoff_date Date, dropoff_datetime DateTime, store_and_fwd_flag UInt8, rate_code_id UInt8, pickup_longitude Float64, pickup_latitude Float64, dropoff_longitude Float64, dropoff_latitude Float64, passenger_count UInt8, trip_distance Float64, fare_amount Float32, extra Float32, mta_tax Float32, tip_amount Float32, tolls_amount Float32, ehail_fee Float32, improvement_surcharge Float32, total_amount Float32, payment_type_ Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), trip_type UInt8, pickup FixedString(25), dropoff FixedString(25), cab_type Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), pickup_nyct2010_gid UInt8, pickup_ctlabel Float32, pickup_borocode UInt8, pickup_boroname Enum8('' = 0, 'Manhattan' = 1, 'Bronx' = 2, 'Brooklyn' = 3, 'Queens' = 4, 'Staten Island' = 5), pickup_ct2010 FixedString(6), pickup_boroct2010 FixedString(7), pickup_cdeligibil Enum8(' ' = 0, 'E' = 1, 'I' = 2), pickup_ntacode FixedString(4), pickup_ntaname Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195), pickup_puma UInt16, dropoff_nyct2010_gid UInt8, dropoff_ctlabel Float32, dropoff_borocode UInt8, dropoff_boroname Enum8('' = 0, 'Manhattan' = 1, 'Bronx' = 2, 'Brooklyn' = 3, 'Queens' = 4, 'Staten Island' = 5), dropoff_ct2010 FixedString(6), dropoff_boroct2010 FixedString(7), dropoff_cdeligibil Enum8(' ' = 0, 'E' = 1, 'I' = 2), dropoff_ntacode FixedString(4), dropoff_ntaname Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195), dropoff_puma UInt16) ENGINE = MergeTree(pickup_date, pickup_datetime, 8192) +``` + +Sur le serveur source: + +``` sql +CREATE TABLE trips_mergetree_x3 AS trips_mergetree_third ENGINE = Distributed(perftest, default, trips_mergetree_third, rand()) +``` + +La requête suivante redistribue les données: + +``` sql +INSERT INTO trips_mergetree_x3 SELECT * FROM trips_mergetree +``` + +Cela prend 2454 secondes. + +Sur les trois serveurs: + +Q1: 0.212 secondes. +Q2: 0.438 secondes. +Q3: 0.733 secondes. +Q4: 1.241 secondes. + +Pas de surprise ici, depuis les requêtes sont réparties linéairement. + +Nous avons également les résultats d'un cluster de 140 serveurs: + +Q1: 0,028 sec. +Q2: 0,043 sec. +Q3: 0,051 sec. +Q4: 0,072 sec. + +Dans ce cas, le temps de traitement des requêtes est déterminé surtout par la latence du réseau. +Nous avons exécuté des requêtes en utilisant un client situé dans un centre de données Yandex en Finlande sur un cluster en Russie, ce qui a ajouté environ 20 ms de latence. + +## Résumé {#summary} + +| serveur | Q1 | Q2 | Q3 | Q4 | +|---------|-------|-------|-------|-------| +| 1 | 0.490 | 1.224 | 2.104 | 3.593 | +| 3 | 0.212 | 0.438 | 0.733 | 1.241 | +| 140 | 0.028 | 0.043 | 0.051 | 0.072 | + +[Article Original](https://clickhouse.tech/docs/en/getting_started/example_datasets/nyc_taxi/) diff --git a/docs/fr/getting_started/example_datasets/ontime.md b/docs/fr/getting_started/example_datasets/ontime.md new file mode 100644 index 00000000000..ffb3845a49c --- /dev/null +++ b/docs/fr/getting_started/example_datasets/ontime.md @@ -0,0 +1,409 @@ +--- +machine_translated: true +--- + +# OnTime {#ontime} + +Ce jeu de données peut être obtenu de deux façons: + +- importation à partir de données brutes +- téléchargement de partitions + +## Importation À Partir De Données Brutes {#import-from-raw-data} + +Téléchargement de données: + +``` bash +for s in `seq 1987 2018` +do +for m in `seq 1 12` +do +wget https://transtats.bts.gov/PREZIP/On_Time_Reporting_Carrier_On_Time_Performance_1987_present_${s}_${m}.zip +done +done +``` + +(à partir de https://github.com/Percona-Lab/ontime-airline-performance/blob/master/download.sh ) + +Création d'une table: + +``` sql +CREATE TABLE `ontime` ( + `Year` UInt16, + `Quarter` UInt8, + `Month` UInt8, + `DayofMonth` UInt8, + `DayOfWeek` UInt8, + `FlightDate` Date, + `UniqueCarrier` FixedString(7), + `AirlineID` Int32, + `Carrier` FixedString(2), + `TailNum` String, + `FlightNum` String, + `OriginAirportID` Int32, + `OriginAirportSeqID` Int32, + `OriginCityMarketID` Int32, + `Origin` FixedString(5), + `OriginCityName` String, + `OriginState` FixedString(2), + `OriginStateFips` String, + `OriginStateName` String, + `OriginWac` Int32, + `DestAirportID` Int32, + `DestAirportSeqID` Int32, + `DestCityMarketID` Int32, + `Dest` FixedString(5), + `DestCityName` String, + `DestState` FixedString(2), + `DestStateFips` String, + `DestStateName` String, + `DestWac` Int32, + `CRSDepTime` Int32, + `DepTime` Int32, + `DepDelay` Int32, + `DepDelayMinutes` Int32, + `DepDel15` Int32, + `DepartureDelayGroups` String, + `DepTimeBlk` String, + `TaxiOut` Int32, + `WheelsOff` Int32, + `WheelsOn` Int32, + `TaxiIn` Int32, + `CRSArrTime` Int32, + `ArrTime` Int32, + `ArrDelay` Int32, + `ArrDelayMinutes` Int32, + `ArrDel15` Int32, + `ArrivalDelayGroups` Int32, + `ArrTimeBlk` String, + `Cancelled` UInt8, + `CancellationCode` FixedString(1), + `Diverted` UInt8, + `CRSElapsedTime` Int32, + `ActualElapsedTime` Int32, + `AirTime` Int32, + `Flights` Int32, + `Distance` Int32, + `DistanceGroup` UInt8, + `CarrierDelay` Int32, + `WeatherDelay` Int32, + `NASDelay` Int32, + `SecurityDelay` Int32, + `LateAircraftDelay` Int32, + `FirstDepTime` String, + `TotalAddGTime` String, + `LongestAddGTime` String, + `DivAirportLandings` String, + `DivReachedDest` String, + `DivActualElapsedTime` String, + `DivArrDelay` String, + `DivDistance` String, + `Div1Airport` String, + `Div1AirportID` Int32, + `Div1AirportSeqID` Int32, + `Div1WheelsOn` String, + `Div1TotalGTime` String, + `Div1LongestGTime` String, + `Div1WheelsOff` String, + `Div1TailNum` String, + `Div2Airport` String, + `Div2AirportID` Int32, + `Div2AirportSeqID` Int32, + `Div2WheelsOn` String, + `Div2TotalGTime` String, + `Div2LongestGTime` String, + `Div2WheelsOff` String, + `Div2TailNum` String, + `Div3Airport` String, + `Div3AirportID` Int32, + `Div3AirportSeqID` Int32, + `Div3WheelsOn` String, + `Div3TotalGTime` String, + `Div3LongestGTime` String, + `Div3WheelsOff` String, + `Div3TailNum` String, + `Div4Airport` String, + `Div4AirportID` Int32, + `Div4AirportSeqID` Int32, + `Div4WheelsOn` String, + `Div4TotalGTime` String, + `Div4LongestGTime` String, + `Div4WheelsOff` String, + `Div4TailNum` String, + `Div5Airport` String, + `Div5AirportID` Int32, + `Div5AirportSeqID` Int32, + `Div5WheelsOn` String, + `Div5TotalGTime` String, + `Div5LongestGTime` String, + `Div5WheelsOff` String, + `Div5TailNum` String +) ENGINE = MergeTree +PARTITION BY Year +ORDER BY (Carrier, FlightDate) +SETTINGS index_granularity = 8192; +``` + +Le chargement des données: + +``` bash +$ for i in *.zip; do echo $i; unzip -cq $i '*.csv' | sed 's/\.00//g' | clickhouse-client --host=example-perftest01j --query="INSERT INTO ontime FORMAT CSVWithNames"; done +``` + +## Téléchargement des Partitions préparées {#download-of-prepared-partitions} + +``` bash +$ curl -O https://clickhouse-datasets.s3.yandex.net/ontime/partitions/ontime.tar +$ tar xvf ontime.tar -C /var/lib/clickhouse # path to ClickHouse data directory +$ # check permissions of unpacked data, fix if required +$ sudo service clickhouse-server restart +$ clickhouse-client --query "select count(*) from datasets.ontime" +``` + +!!! info "Info" + Si vous exécutez les requêtes décrites ci-dessous, vous devez utiliser le nom complet de la table, `datasets.ontime`. + +## Requête {#queries} + +Q0. + +``` sql +SELECT avg(c1) +FROM +( + SELECT Year, Month, count(*) AS c1 + FROM ontime + GROUP BY Year, Month +); +``` + +T1. Le nombre de vols par jour de l'année 2000 à 2008 + +``` sql +SELECT DayOfWeek, count(*) AS c +FROM ontime +WHERE Year>=2000 AND Year<=2008 +GROUP BY DayOfWeek +ORDER BY c DESC; +``` + +T2. Le nombre de vols retardés de plus de 10 minutes, regroupés par jour de la semaine, pour 2000-2008 + +``` sql +SELECT DayOfWeek, count(*) AS c +FROM ontime +WHERE DepDelay>10 AND Year>=2000 AND Year<=2008 +GROUP BY DayOfWeek +ORDER BY c DESC; +``` + +T3. Le nombre de retards par l'aéroport pour 2000-2008 + +``` sql +SELECT Origin, count(*) AS c +FROM ontime +WHERE DepDelay>10 AND Year>=2000 AND Year<=2008 +GROUP BY Origin +ORDER BY c DESC +LIMIT 10; +``` + +T4. Nombre de retards par transporteur pour 2007 + +``` sql +SELECT Carrier, count(*) +FROM ontime +WHERE DepDelay>10 AND Year=2007 +GROUP BY Carrier +ORDER BY count(*) DESC; +``` + +Q5. Pourcentage de retards par transporteur pour 2007 + +``` sql +SELECT Carrier, c, c2, c*100/c2 as c3 +FROM +( + SELECT + Carrier, + count(*) AS c + FROM ontime + WHERE DepDelay>10 + AND Year=2007 + GROUP BY Carrier +) +JOIN +( + SELECT + Carrier, + count(*) AS c2 + FROM ontime + WHERE Year=2007 + GROUP BY Carrier +) USING Carrier +ORDER BY c3 DESC; +``` + +Meilleure version de la même requête: + +``` sql +SELECT Carrier, avg(DepDelay>10)*100 AS c3 +FROM ontime +WHERE Year=2007 +GROUP BY Carrier +ORDER BY c3 DESC +``` + +Q6. La demande précédente pour une plus large gamme d'années, 2000-2008 + +``` sql +SELECT Carrier, c, c2, c*100/c2 as c3 +FROM +( + SELECT + Carrier, + count(*) AS c + FROM ontime + WHERE DepDelay>10 + AND Year>=2000 AND Year<=2008 + GROUP BY Carrier +) +JOIN +( + SELECT + Carrier, + count(*) AS c2 + FROM ontime + WHERE Year>=2000 AND Year<=2008 + GROUP BY Carrier +) USING Carrier +ORDER BY c3 DESC; +``` + +Meilleure version de la même requête: + +``` sql +SELECT Carrier, avg(DepDelay>10)*100 AS c3 +FROM ontime +WHERE Year>=2000 AND Year<=2008 +GROUP BY Carrier +ORDER BY c3 DESC; +``` + +Q7. Pourcentage de vols retardés de plus de 10 minutes, par année + +``` sql +SELECT Year, c1/c2 +FROM +( + select + Year, + count(*)*100 as c1 + from ontime + WHERE DepDelay>10 + GROUP BY Year +) +JOIN +( + select + Year, + count(*) as c2 + from ontime + GROUP BY Year +) USING (Year) +ORDER BY Year; +``` + +Meilleure version de la même requête: + +``` sql +SELECT Year, avg(DepDelay>10)*100 +FROM ontime +GROUP BY Year +ORDER BY Year; +``` + +Q8. Les destinations les plus populaires par le nombre de villes directement connectées pour différentes plages d'années + +``` sql +SELECT DestCityName, uniqExact(OriginCityName) AS u +FROM ontime +WHERE Year >= 2000 and Year <= 2010 +GROUP BY DestCityName +ORDER BY u DESC LIMIT 10; +``` + +Q9. + +``` sql +SELECT Year, count(*) AS c1 +FROM ontime +GROUP BY Year; +``` + +Q10. + +``` sql +SELECT + min(Year), max(Year), Carrier, count(*) AS cnt, + sum(ArrDelayMinutes>30) AS flights_delayed, + round(sum(ArrDelayMinutes>30)/count(*),2) AS rate +FROM ontime +WHERE + DayOfWeek NOT IN (6,7) AND OriginState NOT IN ('AK', 'HI', 'PR', 'VI') + AND DestState NOT IN ('AK', 'HI', 'PR', 'VI') + AND FlightDate < '2010-01-01' +GROUP by Carrier +HAVING cnt>100000 and max(Year)>1990 +ORDER by rate DESC +LIMIT 1000; +``` + +Bonus: + +``` sql +SELECT avg(cnt) +FROM +( + SELECT Year,Month,count(*) AS cnt + FROM ontime + WHERE DepDel15=1 + GROUP BY Year,Month +); + +SELECT avg(c1) FROM +( + SELECT Year,Month,count(*) AS c1 + FROM ontime + GROUP BY Year,Month +); + +SELECT DestCityName, uniqExact(OriginCityName) AS u +FROM ontime +GROUP BY DestCityName +ORDER BY u DESC +LIMIT 10; + +SELECT OriginCityName, DestCityName, count() AS c +FROM ontime +GROUP BY OriginCityName, DestCityName +ORDER BY c DESC +LIMIT 10; + +SELECT OriginCityName, count() AS c +FROM ontime +GROUP BY OriginCityName +ORDER BY c DESC +LIMIT 10; +``` + +Ce test de performance a été créé par Vadim Tkachenko. Voir: + +- https://www.percona.com/blog/2009/10/02/analyzing-air-traffic-performance-with-infobright-and-monetdb/ +- https://www.percona.com/blog/2009/10/26/air-traffic-queries-in-luciddb/ +- https://www.percona.com/blog/2009/11/02/air-traffic-queries-in-infinidb-early-alpha/ +- https://www.percona.com/blog/2014/04/21/using-apache-hadoop-and-impala-together-with-mysql-for-data-analysis/ +- https://www.percona.com/blog/2016/01/07/apache-spark-with-air-ontime-performance-data/ +- http://nickmakos.blogspot.ru/2012/08/analyzing-air-traffic-performance-with.html + +[Article Original](https://clickhouse.tech/docs/en/getting_started/example_datasets/ontime/) diff --git a/docs/fr/getting_started/example_datasets/star_schema.md b/docs/fr/getting_started/example_datasets/star_schema.md new file mode 100644 index 00000000000..5c98762648b --- /dev/null +++ b/docs/fr/getting_started/example_datasets/star_schema.md @@ -0,0 +1,367 @@ +--- +machine_translated: true +--- + +# Référence Du Schéma En Étoile {#star-schema-benchmark} + +Compilation de dbgen: + +``` bash +$ git clone git@github.com:vadimtk/ssb-dbgen.git +$ cd ssb-dbgen +$ make +``` + +La production de données: + +!!! warning "Attention" + Avec `-s 100` dbgen génère 600 millions de lignes (67 Go), tandis que while `-s 1000` il génère 6 milliards de lignes (ce qui prend beaucoup de temps) + +``` bash +$ ./dbgen -s 1000 -T c +$ ./dbgen -s 1000 -T l +$ ./dbgen -s 1000 -T p +$ ./dbgen -s 1000 -T s +$ ./dbgen -s 1000 -T d +``` + +Création de tables dans ClickHouse: + +``` sql +CREATE TABLE customer +( + C_CUSTKEY UInt32, + C_NAME String, + C_ADDRESS String, + C_CITY LowCardinality(String), + C_NATION LowCardinality(String), + C_REGION LowCardinality(String), + C_PHONE String, + C_MKTSEGMENT LowCardinality(String) +) +ENGINE = MergeTree ORDER BY (C_CUSTKEY); + +CREATE TABLE lineorder +( + LO_ORDERKEY UInt32, + LO_LINENUMBER UInt8, + LO_CUSTKEY UInt32, + LO_PARTKEY UInt32, + LO_SUPPKEY UInt32, + LO_ORDERDATE Date, + LO_ORDERPRIORITY LowCardinality(String), + LO_SHIPPRIORITY UInt8, + LO_QUANTITY UInt8, + LO_EXTENDEDPRICE UInt32, + LO_ORDTOTALPRICE UInt32, + LO_DISCOUNT UInt8, + LO_REVENUE UInt32, + LO_SUPPLYCOST UInt32, + LO_TAX UInt8, + LO_COMMITDATE Date, + LO_SHIPMODE LowCardinality(String) +) +ENGINE = MergeTree PARTITION BY toYear(LO_ORDERDATE) ORDER BY (LO_ORDERDATE, LO_ORDERKEY); + +CREATE TABLE part +( + P_PARTKEY UInt32, + P_NAME String, + P_MFGR LowCardinality(String), + P_CATEGORY LowCardinality(String), + P_BRAND LowCardinality(String), + P_COLOR LowCardinality(String), + P_TYPE LowCardinality(String), + P_SIZE UInt8, + P_CONTAINER LowCardinality(String) +) +ENGINE = MergeTree ORDER BY P_PARTKEY; + +CREATE TABLE supplier +( + S_SUPPKEY UInt32, + S_NAME String, + S_ADDRESS String, + S_CITY LowCardinality(String), + S_NATION LowCardinality(String), + S_REGION LowCardinality(String), + S_PHONE String +) +ENGINE = MergeTree ORDER BY S_SUPPKEY; +``` + +Insertion de données: + +``` bash +$ clickhouse-client --query "INSERT INTO customer FORMAT CSV" < customer.tbl +$ clickhouse-client --query "INSERT INTO part FORMAT CSV" < part.tbl +$ clickhouse-client --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl +$ clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl +``` + +Conversion “star schema” pour dénormalisée “flat schema”: + +``` sql +SET max_memory_usage = 20000000000; + +CREATE TABLE lineorder_flat +ENGINE = MergeTree +PARTITION BY toYear(LO_ORDERDATE) +ORDER BY (LO_ORDERDATE, LO_ORDERKEY) AS +SELECT + l.LO_ORDERKEY AS LO_ORDERKEY, + l.LO_LINENUMBER AS LO_LINENUMBER, + l.LO_CUSTKEY AS LO_CUSTKEY, + l.LO_PARTKEY AS LO_PARTKEY, + l.LO_SUPPKEY AS LO_SUPPKEY, + l.LO_ORDERDATE AS LO_ORDERDATE, + l.LO_ORDERPRIORITY AS LO_ORDERPRIORITY, + l.LO_SHIPPRIORITY AS LO_SHIPPRIORITY, + l.LO_QUANTITY AS LO_QUANTITY, + l.LO_EXTENDEDPRICE AS LO_EXTENDEDPRICE, + l.LO_ORDTOTALPRICE AS LO_ORDTOTALPRICE, + l.LO_DISCOUNT AS LO_DISCOUNT, + l.LO_REVENUE AS LO_REVENUE, + l.LO_SUPPLYCOST AS LO_SUPPLYCOST, + l.LO_TAX AS LO_TAX, + l.LO_COMMITDATE AS LO_COMMITDATE, + l.LO_SHIPMODE AS LO_SHIPMODE, + c.C_NAME AS C_NAME, + c.C_ADDRESS AS C_ADDRESS, + c.C_CITY AS C_CITY, + c.C_NATION AS C_NATION, + c.C_REGION AS C_REGION, + c.C_PHONE AS C_PHONE, + c.C_MKTSEGMENT AS C_MKTSEGMENT, + s.S_NAME AS S_NAME, + s.S_ADDRESS AS S_ADDRESS, + s.S_CITY AS S_CITY, + s.S_NATION AS S_NATION, + s.S_REGION AS S_REGION, + s.S_PHONE AS S_PHONE, + p.P_NAME AS P_NAME, + p.P_MFGR AS P_MFGR, + p.P_CATEGORY AS P_CATEGORY, + p.P_BRAND AS P_BRAND, + p.P_COLOR AS P_COLOR, + p.P_TYPE AS P_TYPE, + p.P_SIZE AS P_SIZE, + p.P_CONTAINER AS P_CONTAINER +FROM lineorder AS l +INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY +INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY +INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY; +``` + +Exécution des requêtes: + +Q1.1 + +``` sql +SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM lineorder_flat +WHERE toYear(LO_ORDERDATE) = 1993 AND LO_DISCOUNT BETWEEN 1 AND 3 AND LO_QUANTITY < 25; +``` + +Q1.2 + +``` sql +SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM lineorder_flat +WHERE toYYYYMM(LO_ORDERDATE) = 199401 AND LO_DISCOUNT BETWEEN 4 AND 6 AND LO_QUANTITY BETWEEN 26 AND 35; +``` + +Q1.3 + +``` sql +SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM lineorder_flat +WHERE toISOWeek(LO_ORDERDATE) = 6 AND toYear(LO_ORDERDATE) = 1994 + AND LO_DISCOUNT BETWEEN 5 AND 7 AND LO_QUANTITY BETWEEN 26 AND 35; +``` + +Q2.1 + +``` sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; +``` + +Q2.2 + +``` sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_BRAND >= 'MFGR#2221' AND P_BRAND <= 'MFGR#2228' AND S_REGION = 'ASIA' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; +``` + +Q2.3 + +``` sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_BRAND = 'MFGR#2239' AND S_REGION = 'EUROPE' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; +``` + +Q3.1 + +``` sql +SELECT + C_NATION, + S_NATION, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE C_REGION = 'ASIA' AND S_REGION = 'ASIA' AND year >= 1992 AND year <= 1997 +GROUP BY + C_NATION, + S_NATION, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q3.2 + +``` sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE C_NATION = 'UNITED STATES' AND S_NATION = 'UNITED STATES' AND year >= 1992 AND year <= 1997 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q3.3 + +``` sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND year >= 1992 AND year <= 1997 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q3.4 + +``` sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND toYYYYMM(LO_ORDERDATE) = 199712 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q4.1 + +``` sql +SELECT + toYear(LO_ORDERDATE) AS year, + C_NATION, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + year, + C_NATION +ORDER BY + year ASC, + C_NATION ASC; +``` + +Q4.2 + +``` sql +SELECT + toYear(LO_ORDERDATE) AS year, + S_NATION, + P_CATEGORY, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (year = 1997 OR year = 1998) AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + year, + S_NATION, + P_CATEGORY +ORDER BY + year ASC, + S_NATION ASC, + P_CATEGORY ASC; +``` + +Q4.3 + +``` sql +SELECT + toYear(LO_ORDERDATE) AS year, + S_CITY, + P_BRAND, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE S_NATION = 'UNITED STATES' AND (year = 1997 OR year = 1998) AND P_CATEGORY = 'MFGR#14' +GROUP BY + year, + S_CITY, + P_BRAND +ORDER BY + year ASC, + S_CITY ASC, + P_BRAND ASC; +``` + +[Article Original](https://clickhouse.tech/docs/en/getting_started/example_datasets/star_schema/) diff --git a/docs/fr/getting_started/example_datasets/wikistat.md b/docs/fr/getting_started/example_datasets/wikistat.md new file mode 100644 index 00000000000..6b8ab4ae28d --- /dev/null +++ b/docs/fr/getting_started/example_datasets/wikistat.md @@ -0,0 +1,32 @@ +--- +machine_translated: true +--- + +# WikiStat {#wikistat} + +Voir: http://dumps.wikimedia.org/other/pagecounts-raw/ + +Création d'une table: + +``` sql +CREATE TABLE wikistat +( + date Date, + time DateTime, + project String, + subproject String, + path String, + hits UInt64, + size UInt64 +) ENGINE = MergeTree(date, (path, time), 8192); +``` + +Le chargement des données: + +``` bash +$ for i in {2007..2016}; do for j in {01..12}; do echo $i-$j >&2; curl -sSL "http://dumps.wikimedia.org/other/pagecounts-raw/$i/$i-$j/" | grep -oE 'pagecounts-[0-9]+-[0-9]+\.gz'; done; done | sort | uniq | tee links.txt +$ cat links.txt | while read link; do wget http://dumps.wikimedia.org/other/pagecounts-raw/$(echo $link | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})[0-9]{2}-[0-9]+\.gz/\1/')/$(echo $link | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})[0-9]{2}-[0-9]+\.gz/\1-\2/')/$link; done +$ ls -1 /opt/wikistat/ | grep gz | while read i; do echo $i; gzip -cd /opt/wikistat/$i | ./wikistat-loader --time="$(echo -n $i | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})([0-9]{2})-([0-9]{2})([0-9]{2})([0-9]{2})\.gz/\1-\2-\3 \4-00-00/')" | clickhouse-client --query="INSERT INTO wikistat FORMAT TabSeparated"; done +``` + +[Article Original](https://clickhouse.tech/docs/en/getting_started/example_datasets/wikistat/) diff --git a/docs/fr/getting_started/index.md b/docs/fr/getting_started/index.md new file mode 100644 index 00000000000..62f11602e64 --- /dev/null +++ b/docs/fr/getting_started/index.md @@ -0,0 +1,12 @@ +--- +machine_translated: true +--- + +# Prise En Main {#getting-started} + +Si vous êtes nouveau à ClickHouse et que vous voulez obtenir un sentiment pratique de sa performance, tout d'abord, vous devez passer par le [processus d'installation](install.md). Après cela, vous pouvez: + +- [Passez par tutoriel détaillé](tutorial.md) +- [Expérience avec des exemples de jeux de données](example_datasets/ontime.md) + +[Article Original](https://clickhouse.tech/docs/en/getting_started/) diff --git a/docs/fr/getting_started/install.md b/docs/fr/getting_started/install.md new file mode 100644 index 00000000000..4ceb4deb796 --- /dev/null +++ b/docs/fr/getting_started/install.md @@ -0,0 +1,188 @@ +--- +machine_translated: true +--- + +# Installation {#installation} + +## Configuration Système Requise {#system-requirements} + +ClickHouse peut fonctionner sur N'importe quel Linux, FreeBSD ou Mac OS X avec une architecture CPU x86\_64, AArch64 ou PowerPC64LE. + +Les binaires pré-construits officiels sont généralement compilés pour le jeu d'instructions x86\_64 et leverage SSE 4.2, donc sauf indication contraire, l'utilisation du processeur qui le prend en charge devient une exigence système supplémentaire. Voici la commande pour vérifier si le processeur actuel prend en charge SSE 4.2: + +``` bash +$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported" +``` + +Pour exécuter ClickHouse sur des processeurs qui ne prennent pas en charge SSE 4.2 ou qui ont une architecture AArch64 ou PowerPC64LE, vous devez [construire ClickHouse à partir de sources](#from-sources) avec des ajustements de configuration appropriés. + +## Options D'Installation Disponibles {#available-installation-options} + +### À partir de paquets DEB {#install-from-deb-packages} + +Il est recommandé d'utiliser officiel pré-compilé `deb` Paquets Pour Debian ou Ubuntu. + +Pour installer les paquets officiels ajoutez le référentiel Yandex dans `/etc/apt/sources.list` ou dans un autre `/etc/apt/sources.list.d/clickhouse.list` fichier: + + deb http://repo.clickhouse.tech/deb/stable/ main/ + +Si vous souhaitez utiliser la version la plus récente, remplacer `stable` avec `testing` (ceci est recommandé pour vos environnements de test). + +Exécutez ensuite ces commandes pour installer les paquets: + +``` bash +sudo apt-get install dirmngr # optional +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 # optional +sudo apt-get update +sudo apt-get install clickhouse-client clickhouse-server +``` + +Vous pouvez également télécharger et installer des paquets manuellement à partir d'ici: https://repo.yandex.ru/clickhouse/deb/stable/main/. + +#### Paquet {#packages} + +- `clickhouse-common-static` — Installs ClickHouse compiled binary files. +- `clickhouse-server` — Creates a symbolic link for `clickhouse-server` et installe la configuration du serveur par défaut. +- `clickhouse-client` — Creates a symbolic link for `clickhouse-client` et d'autres outils. et installe les fichiers de configuration du client. +- `clickhouse-common-static-dbg` — Installs ClickHouse compiled binary files with debug info. + +### À partir de paquets RPM {#from-rpm-packages} + +Il est recommandé d'utiliser officiel pré-compilé `rpm` packages pour CentOS, RedHat et toutes les autres distributions Linux basées sur rpm. + +Tout d'abord, vous devez ajouter le dépôt officiel: + +``` bash +sudo yum install yum-utils +sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG +sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64 +``` + +Si vous souhaitez utiliser la version la plus récente, remplacer `stable` avec `testing` (ceci est recommandé pour vos environnements de test). Le `prestable` la balise est parfois trop. + +Exécutez ensuite ces commandes pour installer les paquets: + +``` bash +sudo yum install clickhouse-server clickhouse-client +``` + +Vous pouvez également télécharger et installer des paquets manuellement à partir d'ici: https://repo.clickhouse.tech / rpm / stable / x86\_64. + +### À partir d'archives tgz {#from-tgz-archives} + +Il est recommandé d'utiliser officiel pré-compilé `tgz` archives pour toutes les distributions Linux, où l'installation de `deb` ou `rpm` les emballages n'est pas possible. + +La version requise peut être téléchargée avec `curl` ou `wget` depuis le référentiel https://repo.yandex.ru/clickhouse/tgz/. +Après cela, les archives téléchargées doivent être décompressées et installées avec des scripts d'installation. Exemple pour la dernière version: + +``` bash +export LATEST_VERSION=`curl https://api.github.com/repos/ClickHouse/ClickHouse/tags 2>/dev/null | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n 1` +curl -O https://repo.clickhouse.tech/tgz/clickhouse-common-static-$LATEST_VERSION.tgz +curl -O https://repo.clickhouse.tech/tgz/clickhouse-common-static-dbg-$LATEST_VERSION.tgz +curl -O https://repo.clickhouse.tech/tgz/clickhouse-server-$LATEST_VERSION.tgz +curl -O https://repo.clickhouse.tech/tgz/clickhouse-client-$LATEST_VERSION.tgz + +tar -xzvf clickhouse-common-static-$LATEST_VERSION.tgz +sudo clickhouse-common-static-$LATEST_VERSION/install/doinst.sh + +tar -xzvf clickhouse-common-static-dbg-$LATEST_VERSION.tgz +sudo clickhouse-common-static-dbg-$LATEST_VERSION/install/doinst.sh + +tar -xzvf clickhouse-server-$LATEST_VERSION.tgz +sudo clickhouse-server-$LATEST_VERSION/install/doinst.sh +sudo /etc/init.d/clickhouse-server start + +tar -xzvf clickhouse-client-$LATEST_VERSION.tgz +sudo clickhouse-client-$LATEST_VERSION/install/doinst.sh +``` + +Pour les environnements de production, il est recommandé d'utiliser la dernière `stable`-version. Vous pouvez trouver son numéro sur la page GitHub https://github.com/ClickHouse/ClickHouse/tags avec postfix `-stable`. + +### À Partir De L'Image Docker {#from-docker-image} + +Pour exécuter Clickhouse à L'intérieur Docker suivez le guide sur [Hub Docker](https://hub.docker.com/r/yandex/clickhouse-server/). Ces images utilisent officiel `deb` les paquets à l'intérieur. + +### À Partir De Sources {#from-sources} + +Pour compiler manuellement ClickHouse, suivez les instructions pour [Linux](../development/build.md) ou [Mac OS X](../development/build_osx.md). + +Vous pouvez compiler des paquets et les installer ou utiliser des programmes sans installer de paquets. En outre, en construisant manuellement, vous pouvez désactiver L'exigence SSE 4.2 ou construire pour les processeurs AArch64. + + Client: dbms/programs/clickhouse-client + Server: dbms/programs/clickhouse-server + +Vous devrez créer un dossier de données et de métadonnées et `chown` pour l'utilisateur souhaité. Leurs chemins peuvent être modifiés dans la configuration du serveur (src / SGBD / programs / server / config.xml), par défaut, ils sont: + + /opt/clickhouse/data/default/ + /opt/clickhouse/metadata/default/ + +Sur Gentoo, vous pouvez simplement utiliser `emerge clickhouse` pour installer ClickHouse à partir de sources. + +## Lancer {#launch} + +Pour démarrer le serveur en tant que démon, exécutez: + +``` bash +$ sudo service clickhouse-server start +``` + +Si vous n'avez pas `service` commande, exécuter comme + +``` bash +$ sudo /etc/init.d/clickhouse-server start +``` + +Voir les journaux dans le `/var/log/clickhouse-server/` répertoire. + +Si le serveur ne démarre pas, vérifiez les configurations dans le fichier `/etc/clickhouse-server/config.xml`. + +Vous pouvez également lancer manuellement le serveur à partir de la console: + +``` bash +$ clickhouse-server --config-file=/etc/clickhouse-server/config.xml +``` + +Dans ce cas, le journal sera imprimé sur la console, ce qui est pratique lors du développement. +Si le fichier de configuration se trouve dans le répertoire courant, vous n'avez pas besoin `--config-file` paramètre. Par défaut, il utilise `./config.xml`. + +ClickHouse prend en charge les paramètres de restriction d'accès. Ils sont situés dans la `users.xml` fichier (à côté de `config.xml`). +Par défaut, l'accès est autorisé depuis n'importe où pour `default` l'utilisateur, sans un mot de passe. Voir `user/default/networks`. +Pour plus d'informations, consultez la section [“Configuration Files”](../operations/configuration_files.md). + +Après le lancement du serveur, vous pouvez utiliser le client de ligne de commande pour vous y connecter: + +``` bash +$ clickhouse-client +``` + +Par défaut, il se connecte à `localhost:9000` au nom de l'utilisateur `default` sans un mot de passe. Il peut également être utilisé pour se connecter à un serveur distant en utilisant `--host` argument. + +Le terminal doit utiliser L'encodage UTF-8. +Pour plus d'informations, consultez la section [“Command-line client”](../interfaces/cli.md). + +Exemple: + +``` bash +$ ./clickhouse-client +ClickHouse client version 0.0.18749. +Connecting to localhost:9000. +Connected to ClickHouse server version 0.0.18749. + +:) SELECT 1 + +SELECT 1 + +┌─1─┐ +│ 1 │ +└───┘ + +1 rows in set. Elapsed: 0.003 sec. + +:) +``` + +**Félicitations, le système fonctionne!** + +Pour continuer à expérimenter, vous pouvez télécharger l'un des jeux de données de test ou passer par [tutoriel](https://clickhouse.tech/tutorial.html). + +[Article Original](https://clickhouse.tech/docs/en/getting_started/install/) diff --git a/docs/fr/getting_started/playground.md b/docs/fr/getting_started/playground.md new file mode 100644 index 00000000000..99cbd7b5747 --- /dev/null +++ b/docs/fr/getting_started/playground.md @@ -0,0 +1,45 @@ +--- +machine_translated: true +--- + +# Clickhouse Aire De Jeux {#clickhouse-playground} + +[Clickhouse Aire De Jeux](https://play.clickhouse.tech?file=welcome) permet aux utilisateurs d'expérimenter avec ClickHouse en exécutant des requêtes instantanément, sans configurer leur serveur ou leur cluster. +Plusieurs exemples de jeux de données sont disponibles dans le terrain de jeu ainsi que des exemples de requêtes qui montrent les fonctionnalités de ClickHouse. + +Les requêtes sont exécutées comme un utilisateur en lecture seule. Cela implique certaines limites: + +- Les requêtes DDL ne sont pas autorisées +- Les requêtes D'insertion ne sont pas autorisées + +Les paramètres suivants sont également appliquées: +- [`max_result_bytes=10485760`](../operations/settings/query_complexity/#max-result-bytes) +- [`max_result_rows=2000`](../operations/settings/query_complexity/#setting-max_result_rows) +- [`result_overflow_mode=break`](../operations/settings/query_complexity/#result-overflow-mode) +- [`max_execution_time=60000`](../operations/settings/query_complexity/#max-execution-time) + +Clickhouse Playground donne l'expérience du m2.Petite +[Service géré pour ClickHouse](https://cloud.yandex.com/services/managed-clickhouse) +exemple hébergé dans [Yandex.Nuage](https://cloud.yandex.com/). +Plus d'informations sur [les fournisseurs de cloud](../commercial/cloud.md). + +Clickhouse Playground interface web fait des demandes via ClickHouse [HTTP API](../interfaces/http.md). +Le backend Playground est juste un cluster ClickHouse sans aucune application Côté Serveur supplémentaire. +ClickHouse HTTPS endpoint est également disponible dans le cadre du terrain de jeu. + +Vous pouvez effectuer des requêtes sur playground en utilisant n'importe quel client HTTP, par exemple [curl](https://curl.haxx.se) ou [wget](https://www.gnu.org/software/wget/), ou configurer une connexion en utilisant [JDBC](../interfaces/jdbc.md) ou [ODBC](../interfaces/odbc.md) pilote. +Plus d'informations sur les produits logiciels qui prennent en charge ClickHouse est disponible [ici](../interfaces/index.md). + +| Paramètre | Valeur | +|:-------------|:----------------------------------------------| +| Terminaison | https://play-api.clickhouse.technologie: 8443 | +| Utilisateur | `playground` | +| Mot de passe | `clickhouse` | + +Notez que ce paramètre nécessite une connexion sécurisée. + +Exemple: + +``` bash +curl "https://play-api.clickhouse.tech:8443/?query=SELECT+'Play+ClickHouse!';&user=playground&password=clickhouse&database=datasets" +``` diff --git a/docs/fr/getting_started/tutorial.md b/docs/fr/getting_started/tutorial.md new file mode 100644 index 00000000000..bb36508efd0 --- /dev/null +++ b/docs/fr/getting_started/tutorial.md @@ -0,0 +1,668 @@ +--- +machine_translated: true +--- + +# Tutoriel ClickHouse {#clickhouse-tutorial} + +## À quoi S'attendre de ce tutoriel? {#what-to-expect-from-this-tutorial} + +En parcourant ce tutoriel, vous apprendrez à configurer un cluster ClickHouse simple. Ce sera petit, mais tolérant aux pannes et évolutif. Ensuite, nous utiliserons l'un des exemples de jeux de données pour le remplir de données et exécuter des requêtes de démonstration. + +## Configuration De Noeud Unique {#single-node-setup} + +Pour retarder les complexités d'un environnement distribué, nous allons commencer par déployer ClickHouse sur un seul serveur ou une machine virtuelle. ClickHouse est généralement installé à partir de [deb](index.md#install-from-deb-packages) ou [tr / min](index.md#from-rpm-packages) les paquets, mais il y a [alternative](index.md#from-docker-image) pour les systèmes d'exploitation qui ne sont pas les soutenir. + +Par exemple, vous avez choisi `deb` paquets et exécutés: + +``` bash +sudo apt-get install dirmngr +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 + +echo "deb http://repo.clickhouse.tech/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list +sudo apt-get update + +sudo apt-get install -y clickhouse-server clickhouse-client +``` + +Quelles sont les paquets installés: + +- `clickhouse-client` package contient [clickhouse-client](../interfaces/cli.md) application, client interactif de console de ClickHouse. +- `clickhouse-common` paquet contient un fichier exécutable ClickHouse. +- `clickhouse-server` package contient des fichiers de configuration pour exécuter ClickHouse en tant que serveur. + +Les fichiers de configuration du serveur sont `/etc/clickhouse-server/`. Avant d'aller plus loin, notez le `` élément `config.xml`. Path détermine l'emplacement pour le stockage des données, il doit donc être situé sur le volume avec une grande capacité de disque; la valeur par défaut est `/var/lib/clickhouse/`. Si vous souhaitez ajuster la configuration, il n'est pas pratique de modifier directement `config.xml` fichier, considérant qu'il pourrait obtenir réécrit sur les futures mises à jour du progiciel. La façon recommandée de remplacer les éléments de configuration est de créer [fichiers dans config.d: répertoire](../operations/configuration_files.md) qui servent de “patches” config.XML. + +Comme vous l'avez peut-être remarqué, `clickhouse-server` n'est pas lancé automatiquement après l'installation du paquet. Il ne sera pas redémarré automatiquement après les mises à jour, non plus. La façon dont vous démarrez le serveur dépend de votre système d'initialisation, généralement, c'est: + +``` bash +sudo service clickhouse-server start +``` + +ou + +``` bash +sudo /etc/init.d/clickhouse-server start +``` + +L'emplacement par défaut pour les journaux du serveur est `/var/log/clickhouse-server/`. Le serveur est prêt à gérer les connexions client une fois `Ready for connections` message. + +Une fois l' `clickhouse-server` est opérationnel, nous pouvons utiliser `clickhouse-client` pour se connecter au serveur et effectuer des tests de requêtes comme `SELECT "Hello, world!";`. + +
+ +Conseils rapides pour clickhouse-client +Mode interactif: + +``` bash +clickhouse-client +clickhouse-client --host=... --port=... --user=... --password=... +``` + +Activer les requêtes multilignes: + +``` bash +clickhouse-client -m +clickhouse-client --multiline +``` + +Exécuter des requêtes en mode batch: + +``` bash +clickhouse-client --query='SELECT 1' +echo 'SELECT 1' | clickhouse-client +clickhouse-client <<< 'SELECT 1' +``` + +Insérer des données à partir d'un fichier au format spécifié: + +``` bash +clickhouse-client --query='INSERT INTO table VALUES' < data.txt +clickhouse-client --query='INSERT INTO table FORMAT TabSeparated' < data.tsv +``` + +
+ +## Importer Un Échantillon De Données {#import-sample-dataset} + +Maintenant, il est temps de remplir notre serveur ClickHouse avec quelques exemples de données. Dans ce tutoriel, nous allons utiliser les données anonymisées de Yandex.Metrica, le premier service qui exécute ClickHouse en production avant de devenir open-source (plus à ce sujet dans [section d'histoire](../introduction/history.md)). Il y a [plusieurs façons d'importer Yandex.Metrica dataset](example_datasets/metrica.md), et pour le bien du tutoriel, nous irons avec le plus réaliste. + +### Télécharger et extraire les données de la Table {#download-and-extract-table-data} + +``` bash +curl https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv +curl https://clickhouse-datasets.s3.yandex.net/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv +``` + +Les fichiers extraits ont une taille d'environ 10 Go. + +### Créer Des Tables {#create-tables} + +Comme dans la plupart des systèmes de gestion de bases de données, clickhouse regroupe logiquement les tables en “databases”. Il y a un `default` base de données, mais nous allons en créer une nouvelle nommée `tutorial`: + +``` bash +clickhouse-client --query "CREATE DATABASE IF NOT EXISTS tutorial" +``` + +La syntaxe pour créer des tables est beaucoup plus compliquée par rapport aux bases de données (voir [référence](../query_language/create.md). En général `CREATE TABLE` déclaration doit spécifier trois choses clés: + +1. Nom de la table à créer. +2. Table schema, i.e. list of columns and their [types de données](../data_types/index.md). +3. [Tableau moteur](../operations/table_engines/index.md) et ce sont les paramètres, qui déterminent tous les détails sur la façon dont les requêtes à cette table seront physiquement exécutées. + +Yandex.Metrica est un service d'analyse web, et l'exemple de jeu de données ne couvre pas toutes ses fonctionnalités, il n'y a donc que deux tables à créer: + +- `hits` est un tableau avec chaque action effectuée par tous les utilisateurs sur tous les sites couverts par le service. +- `visits` est une table qui contient des sessions pré-construites au lieu d'actions individuelles. + +Voyons et exécutons les vraies requêtes create table pour ces tables: + +``` sql +CREATE TABLE tutorial.hits_v1 +( + `WatchID` UInt64, + `JavaEnable` UInt8, + `Title` String, + `GoodEvent` Int16, + `EventTime` DateTime, + `EventDate` Date, + `CounterID` UInt32, + `ClientIP` UInt32, + `ClientIP6` FixedString(16), + `RegionID` UInt32, + `UserID` UInt64, + `CounterClass` Int8, + `OS` UInt8, + `UserAgent` UInt8, + `URL` String, + `Referer` String, + `URLDomain` String, + `RefererDomain` String, + `Refresh` UInt8, + `IsRobot` UInt8, + `RefererCategories` Array(UInt16), + `URLCategories` Array(UInt16), + `URLRegions` Array(UInt32), + `RefererRegions` Array(UInt32), + `ResolutionWidth` UInt16, + `ResolutionHeight` UInt16, + `ResolutionDepth` UInt8, + `FlashMajor` UInt8, + `FlashMinor` UInt8, + `FlashMinor2` String, + `NetMajor` UInt8, + `NetMinor` UInt8, + `UserAgentMajor` UInt16, + `UserAgentMinor` FixedString(2), + `CookieEnable` UInt8, + `JavascriptEnable` UInt8, + `IsMobile` UInt8, + `MobilePhone` UInt8, + `MobilePhoneModel` String, + `Params` String, + `IPNetworkID` UInt32, + `TraficSourceID` Int8, + `SearchEngineID` UInt16, + `SearchPhrase` String, + `AdvEngineID` UInt8, + `IsArtifical` UInt8, + `WindowClientWidth` UInt16, + `WindowClientHeight` UInt16, + `ClientTimeZone` Int16, + `ClientEventTime` DateTime, + `SilverlightVersion1` UInt8, + `SilverlightVersion2` UInt8, + `SilverlightVersion3` UInt32, + `SilverlightVersion4` UInt16, + `PageCharset` String, + `CodeVersion` UInt32, + `IsLink` UInt8, + `IsDownload` UInt8, + `IsNotBounce` UInt8, + `FUniqID` UInt64, + `HID` UInt32, + `IsOldCounter` UInt8, + `IsEvent` UInt8, + `IsParameter` UInt8, + `DontCountHits` UInt8, + `WithHash` UInt8, + `HitColor` FixedString(1), + `UTCEventTime` DateTime, + `Age` UInt8, + `Sex` UInt8, + `Income` UInt8, + `Interests` UInt16, + `Robotness` UInt8, + `GeneralInterests` Array(UInt16), + `RemoteIP` UInt32, + `RemoteIP6` FixedString(16), + `WindowName` Int32, + `OpenerName` Int32, + `HistoryLength` Int16, + `BrowserLanguage` FixedString(2), + `BrowserCountry` FixedString(2), + `SocialNetwork` String, + `SocialAction` String, + `HTTPError` UInt16, + `SendTiming` Int32, + `DNSTiming` Int32, + `ConnectTiming` Int32, + `ResponseStartTiming` Int32, + `ResponseEndTiming` Int32, + `FetchTiming` Int32, + `RedirectTiming` Int32, + `DOMInteractiveTiming` Int32, + `DOMContentLoadedTiming` Int32, + `DOMCompleteTiming` Int32, + `LoadEventStartTiming` Int32, + `LoadEventEndTiming` Int32, + `NSToDOMContentLoadedTiming` Int32, + `FirstPaintTiming` Int32, + `RedirectCount` Int8, + `SocialSourceNetworkID` UInt8, + `SocialSourcePage` String, + `ParamPrice` Int64, + `ParamOrderID` String, + `ParamCurrency` FixedString(3), + `ParamCurrencyID` UInt16, + `GoalsReached` Array(UInt32), + `OpenstatServiceName` String, + `OpenstatCampaignID` String, + `OpenstatAdID` String, + `OpenstatSourceID` String, + `UTMSource` String, + `UTMMedium` String, + `UTMCampaign` String, + `UTMContent` String, + `UTMTerm` String, + `FromTag` String, + `HasGCLID` UInt8, + `RefererHash` UInt64, + `URLHash` UInt64, + `CLID` UInt32, + `YCLID` UInt64, + `ShareService` String, + `ShareURL` String, + `ShareTitle` String, + `ParsedParams` Nested( + Key1 String, + Key2 String, + Key3 String, + Key4 String, + Key5 String, + ValueDouble Float64), + `IslandID` FixedString(16), + `RequestNum` UInt32, + `RequestTry` UInt8 +) +ENGINE = MergeTree() +PARTITION BY toYYYYMM(EventDate) +ORDER BY (CounterID, EventDate, intHash32(UserID)) +SAMPLE BY intHash32(UserID) +SETTINGS index_granularity = 8192 +``` + +``` sql +CREATE TABLE tutorial.visits_v1 +( + `CounterID` UInt32, + `StartDate` Date, + `Sign` Int8, + `IsNew` UInt8, + `VisitID` UInt64, + `UserID` UInt64, + `StartTime` DateTime, + `Duration` UInt32, + `UTCStartTime` DateTime, + `PageViews` Int32, + `Hits` Int32, + `IsBounce` UInt8, + `Referer` String, + `StartURL` String, + `RefererDomain` String, + `StartURLDomain` String, + `EndURL` String, + `LinkURL` String, + `IsDownload` UInt8, + `TraficSourceID` Int8, + `SearchEngineID` UInt16, + `SearchPhrase` String, + `AdvEngineID` UInt8, + `PlaceID` Int32, + `RefererCategories` Array(UInt16), + `URLCategories` Array(UInt16), + `URLRegions` Array(UInt32), + `RefererRegions` Array(UInt32), + `IsYandex` UInt8, + `GoalReachesDepth` Int32, + `GoalReachesURL` Int32, + `GoalReachesAny` Int32, + `SocialSourceNetworkID` UInt8, + `SocialSourcePage` String, + `MobilePhoneModel` String, + `ClientEventTime` DateTime, + `RegionID` UInt32, + `ClientIP` UInt32, + `ClientIP6` FixedString(16), + `RemoteIP` UInt32, + `RemoteIP6` FixedString(16), + `IPNetworkID` UInt32, + `SilverlightVersion3` UInt32, + `CodeVersion` UInt32, + `ResolutionWidth` UInt16, + `ResolutionHeight` UInt16, + `UserAgentMajor` UInt16, + `UserAgentMinor` UInt16, + `WindowClientWidth` UInt16, + `WindowClientHeight` UInt16, + `SilverlightVersion2` UInt8, + `SilverlightVersion4` UInt16, + `FlashVersion3` UInt16, + `FlashVersion4` UInt16, + `ClientTimeZone` Int16, + `OS` UInt8, + `UserAgent` UInt8, + `ResolutionDepth` UInt8, + `FlashMajor` UInt8, + `FlashMinor` UInt8, + `NetMajor` UInt8, + `NetMinor` UInt8, + `MobilePhone` UInt8, + `SilverlightVersion1` UInt8, + `Age` UInt8, + `Sex` UInt8, + `Income` UInt8, + `JavaEnable` UInt8, + `CookieEnable` UInt8, + `JavascriptEnable` UInt8, + `IsMobile` UInt8, + `BrowserLanguage` UInt16, + `BrowserCountry` UInt16, + `Interests` UInt16, + `Robotness` UInt8, + `GeneralInterests` Array(UInt16), + `Params` Array(String), + `Goals` Nested( + ID UInt32, + Serial UInt32, + EventTime DateTime, + Price Int64, + OrderID String, + CurrencyID UInt32), + `WatchIDs` Array(UInt64), + `ParamSumPrice` Int64, + `ParamCurrency` FixedString(3), + `ParamCurrencyID` UInt16, + `ClickLogID` UInt64, + `ClickEventID` Int32, + `ClickGoodEvent` Int32, + `ClickEventTime` DateTime, + `ClickPriorityID` Int32, + `ClickPhraseID` Int32, + `ClickPageID` Int32, + `ClickPlaceID` Int32, + `ClickTypeID` Int32, + `ClickResourceID` Int32, + `ClickCost` UInt32, + `ClickClientIP` UInt32, + `ClickDomainID` UInt32, + `ClickURL` String, + `ClickAttempt` UInt8, + `ClickOrderID` UInt32, + `ClickBannerID` UInt32, + `ClickMarketCategoryID` UInt32, + `ClickMarketPP` UInt32, + `ClickMarketCategoryName` String, + `ClickMarketPPName` String, + `ClickAWAPSCampaignName` String, + `ClickPageName` String, + `ClickTargetType` UInt16, + `ClickTargetPhraseID` UInt64, + `ClickContextType` UInt8, + `ClickSelectType` Int8, + `ClickOptions` String, + `ClickGroupBannerID` Int32, + `OpenstatServiceName` String, + `OpenstatCampaignID` String, + `OpenstatAdID` String, + `OpenstatSourceID` String, + `UTMSource` String, + `UTMMedium` String, + `UTMCampaign` String, + `UTMContent` String, + `UTMTerm` String, + `FromTag` String, + `HasGCLID` UInt8, + `FirstVisit` DateTime, + `PredLastVisit` Date, + `LastVisit` Date, + `TotalVisits` UInt32, + `TraficSource` Nested( + ID Int8, + SearchEngineID UInt16, + AdvEngineID UInt8, + PlaceID UInt16, + SocialSourceNetworkID UInt8, + Domain String, + SearchPhrase String, + SocialSourcePage String), + `Attendance` FixedString(16), + `CLID` UInt32, + `YCLID` UInt64, + `NormalizedRefererHash` UInt64, + `SearchPhraseHash` UInt64, + `RefererDomainHash` UInt64, + `NormalizedStartURLHash` UInt64, + `StartURLDomainHash` UInt64, + `NormalizedEndURLHash` UInt64, + `TopLevelDomain` UInt64, + `URLScheme` UInt64, + `OpenstatServiceNameHash` UInt64, + `OpenstatCampaignIDHash` UInt64, + `OpenstatAdIDHash` UInt64, + `OpenstatSourceIDHash` UInt64, + `UTMSourceHash` UInt64, + `UTMMediumHash` UInt64, + `UTMCampaignHash` UInt64, + `UTMContentHash` UInt64, + `UTMTermHash` UInt64, + `FromHash` UInt64, + `WebVisorEnabled` UInt8, + `WebVisorActivity` UInt32, + `ParsedParams` Nested( + Key1 String, + Key2 String, + Key3 String, + Key4 String, + Key5 String, + ValueDouble Float64), + `Market` Nested( + Type UInt8, + GoalID UInt32, + OrderID String, + OrderPrice Int64, + PP UInt32, + DirectPlaceID UInt32, + DirectOrderID UInt32, + DirectBannerID UInt32, + GoodID String, + GoodName String, + GoodQuantity Int32, + GoodPrice Int64), + `IslandID` FixedString(16) +) +ENGINE = CollapsingMergeTree(Sign) +PARTITION BY toYYYYMM(StartDate) +ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID) +SAMPLE BY intHash32(UserID) +SETTINGS index_granularity = 8192 +``` + +Vous pouvez exécuter ces requêtes en utilisant le mode interactif de `clickhouse-client` (lancez - le simplement dans un terminal sans spécifier une requête à l'avance) ou essayez-en [interface de rechange](../interfaces/index.md) Si tu veux. + +Comme nous pouvons le voir, `hits_v1` utilise la [moteur MergeTree de base](../operations/table_engines/mergetree.md) tandis que le `visits_v1` utilise la [Effondrer](../operations/table_engines/collapsingmergetree.md) variante. + +### Importer Des Données {#import-data} + +L'importation de données vers ClickHouse se fait via [INSERT INTO](../query_language/insert_into.md) requête comme dans de nombreuses autres bases de données SQL. Toutefois, les données sont généralement fournies dans l'une des [formats de sérialisation pris en charge](../interfaces/formats.md) plutôt `VALUES` clause (qui est également pris en charge). + +Les fichiers que nous avons téléchargés plus tôt sont au format séparé par des onglets, alors voici comment les importer via le client console: + +``` bash +clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv +clickhouse-client --query "INSERT INTO tutorial.visits_v1 FORMAT TSV" --max_insert_block_size=100000 < visits_v1.tsv +``` + +ClickHouse a beaucoup de [les paramètres de tune](../operations/settings/index.md) et une façon de Les spécifier dans le client console est via des arguments, comme nous pouvons le voir avec `--max_insert_block_size`. La façon la plus simple de comprendre quels paramètres sont disponibles, que signifient-ils et quelles sont les valeurs par défaut est d'interroger le `system.settings` table: + +``` sql +SELECT name, value, changed, description +FROM system.settings +WHERE name LIKE '%max_insert_b%' +FORMAT TSV + +max_insert_block_size 1048576 0 "The maximum block size for insertion, if we control the creation of blocks for insertion." +``` + +Optionnellement, vous pouvez [OPTIMIZE](../query_language/misc/#misc_operations-optimize) les tables après l'importation. Les Tables configurées avec un moteur de MergeTree-family font toujours des fusions de parties de données en arrière-plan pour optimiser le stockage des données (ou au moins vérifier si cela a du sens). Ces requêtes forcent le moteur de table à optimiser le stockage dès maintenant au lieu d'un certain temps plus tard: + +``` bash +clickhouse-client --query "OPTIMIZE TABLE tutorial.hits_v1 FINAL" +clickhouse-client --query "OPTIMIZE TABLE tutorial.visits_v1 FINAL" +``` + +Ces requêtes démarrent une opération intensive D'E/S et de CPU, donc si la table reçoit systématiquement de nouvelles données, il est préférable de la laisser seule et de laisser les fusions s'exécuter en arrière-plan. + +Maintenant, nous pouvons vérifier si l'importation de table a réussi: + +``` bash +clickhouse-client --query "SELECT COUNT(*) FROM tutorial.hits_v1" +clickhouse-client --query "SELECT COUNT(*) FROM tutorial.visits_v1" +``` + +## Exemple De Requêtes {#example-queries} + +``` sql +SELECT + StartURL AS URL, + AVG(Duration) AS AvgDuration +FROM tutorial.visits_v1 +WHERE StartDate BETWEEN '2014-03-23' AND '2014-03-30' +GROUP BY URL +ORDER BY AvgDuration DESC +LIMIT 10 +``` + +``` sql +SELECT + sum(Sign) AS visits, + sumIf(Sign, has(Goals.ID, 1105530)) AS goal_visits, + (100. * goal_visits) / visits AS goal_percent +FROM tutorial.visits_v1 +WHERE (CounterID = 912887) AND (toYYYYMM(StartDate) = 201403) AND (domain(StartURL) = 'yandex.ru') +``` + +## Déploiement De Cluster {#cluster-deployment} + +Clickhouse cluster est un cluster homogène. Étapes pour configurer: + +1. Installer clickhouse server sur toutes les machines du cluster +2. Configurer les configurations de cluster dans les fichiers de configuration +3. Créer des tables locales sur chaque instance +4. Créer un [Distribué table](../operations/table_engines/distributed.md) + +[Distribué table](../operations/table_engines/distributed.md) est en fait une sorte de “view” aux tables locales du cluster ClickHouse. SELECT query from a distributed table s'exécute à l'aide des ressources de tous les fragments du cluster. Vous pouvez spécifier des configurations pour plusieurs clusters et créer plusieurs tables distribuées fournissant des vues à différents clusters. + +Exemple de configuration pour un cluster avec trois fragments, une réplique chacun: + +``` xml + + + + + example-perftest01j.yandex.ru + 9000 + + + + + example-perftest02j.yandex.ru + 9000 + + + + + example-perftest03j.yandex.ru + 9000 + + + + +``` + +Pour plus de démonstration, créons une nouvelle table locale avec le même `CREATE TABLE` la requête que nous avons utilisé pour `hits_v1`, mais nom de table différent: + +``` sql +CREATE TABLE tutorial.hits_local (...) ENGINE = MergeTree() ... +``` + +Création d'une table distribuée fournissant une vue dans les tables locales du cluster: + +``` sql +CREATE TABLE tutorial.hits_all AS tutorial.hits_local +ENGINE = Distributed(perftest_3shards_1replicas, tutorial, hits_local, rand()); +``` + +Une pratique courante consiste à créer des tables distribuées similaires sur toutes les machines du cluster. Il permet d'exécuter des requêtes distribuées sur n'importe quelle machine du cluster. Il existe également une autre option pour créer une table distribuée temporaire pour une requête SELECT donnée en utilisant [distant](../query_language/table_functions/remote.md) table de fonction. + +Passons à l'exécution de [INSERT SELECT](../query_language/insert_into.md) dans les Distribué table la table à plusieurs serveurs. + +``` sql +INSERT INTO tutorial.hits_all SELECT * FROM tutorial.hits_v1; +``` + +!!! warning "Avis" + Cette approche ne convient pas au sharding de grandes tables. Il y a un outil séparé [clickhouse-copieur](../operations/utils/clickhouse-copier.md) cela peut re-fragmenter de grandes tables arbitraires. + +Comme vous pouvez vous y attendre, les requêtes lourdes de calcul s'exécutent N fois plus vite si elles utilisent 3 serveurs au lieu d'un. + +Dans ce cas, nous avons utilisé un cluster avec 3 fragments, et chacun contient une seule réplique. + +Pour assurer la résilience dans un environnement de production, nous recommandons que chaque fragment contienne 2-3 répliques réparties entre plusieurs zones de disponibilité ou centres de données (ou au moins des racks). Notez que ClickHouse prend en charge un nombre illimité de répliques. + +Exemple de configuration pour un cluster d'un fragment contenant trois répliques: + +``` xml + + ... + + + + example-perftest01j.yandex.ru + 9000 + + + example-perftest02j.yandex.ru + 9000 + + + example-perftest03j.yandex.ru + 9000 + + + + +``` + +Pour activer la réplication native [ZooKeeper](http://zookeeper.apache.org/) est requis. ClickHouse s'occupe de la cohérence des données sur toutes les répliques et exécute automatiquement la procédure de restauration après l'échec. Il est recommandé de déployer le cluster ZooKeeper sur des serveurs séparés (où aucun autre processus, y compris ClickHouse, n'est en cours d'exécution). + +!!! note "Note" + ZooKeeper est pas une exigence stricte: dans certains cas simples, vous pouvez dupliquer les données par écrit dans tous les réplicas de votre code d'application. Cette approche est **pas** recommandé, dans ce cas, ClickHouse ne sera pas en mesure de garantir la cohérence des données sur toutes les répliques. Ainsi, il devient la responsabilité de votre application. + +Les emplacements ZooKeeper sont spécifiés dans le fichier de configuration: + +``` xml + + + zoo01.yandex.ru + 2181 + + + zoo02.yandex.ru + 2181 + + + zoo03.yandex.ru + 2181 + + +``` + +En outre, nous devons définir des macros pour identifier chaque fragment et chaque réplique utilisés lors de la création de la table: + +``` xml + + 01 + 01 + +``` + +S'il n'y a pas de répliques pour le moment lors de la création de la table répliquée, une nouvelle première réplique est instanciée. S'il existe déjà des répliques en direct, la nouvelle réplique clone les données de celles existantes. Vous avez la possibilité de créer toutes les tables répliquées d'abord, et ensuite insérer les données. Une autre option consiste à créer des répliques et à en ajouter d'autres Après ou pendant l'insertion des données. + +``` sql +CREATE TABLE tutorial.hits_replica (...) +ENGINE = ReplcatedMergeTree( + '/clickhouse_perftest/tables/{shard}/hits', + '{replica}' +) +... +``` + +Ici, nous utilisons [ReplicatedMergeTree](../operations/table_engines/replication.md) tableau moteur. Dans les paramètres, nous spécifions le chemin Zookeeper contenant des identificateurs de fragments et de répliques. + +``` sql +INSERT INTO tutorial.hits_replica SELECT * FROM tutorial.hits_local; +``` + +La réplication fonctionne en mode multi-maître. Les données peuvent être chargées dans n'importe quel réplica, et le système les synchronise ensuite automatiquement avec d'autres instances. La réplication est asynchrone, donc à un moment donné, toutes les répliques ne peuvent pas contenir de données récemment insérées. Au moins une réplique devrait être en place pour permettre l'ingestion de données. D'autres synchroniseront les données et répareront la cohérence une fois qu'ils redeviendront actifs. Notez que cette approche permet une faible possibilité de perte de données récemment insérées. + +[Article Original](https://clickhouse.tech/docs/en/getting_started/tutorial/) diff --git a/docs/fr/guides/apply_catboost_model.md b/docs/fr/guides/apply_catboost_model.md new file mode 100644 index 00000000000..613de6371cb --- /dev/null +++ b/docs/fr/guides/apply_catboost_model.md @@ -0,0 +1,236 @@ +--- +machine_translated: true +--- + +# Application D'un modèle Catboost dans ClickHouse {#applying-catboost-model-in-clickhouse} + +[CatBoost](https://catboost.ai) est une bibliothèque de dynamisation de gradient libre et open-source développée à [Yandex](https://yandex.com/company/) pour l'apprentissage automatique. + +Avec cette instruction, vous apprendrez à appliquer des modèles pré-formés dans ClickHouse en exécutant l'inférence de modèle à partir de SQL. + +Pour appliquer un modèle CatBoost dans ClickHouse: + +1. [Créer une Table](#create-table). +2. [Insérez les données dans la Table](#insert-data-to-table). +3. [Intégrer CatBoost dans ClickHouse](#integrate-catboost-into-clickhouse) (Étape facultative). +4. [Exécutez L'inférence du modèle à partir de SQL](#run-model-inference). + +Pour plus d'informations sur la formation des modèles CatBoost, voir [Formation et application de modèles](https://catboost.ai/docs/features/training.html#training). + +## Préalable {#prerequisites} + +Si vous n'avez pas le [Docker](https://docs.docker.com/install/) pourtant, l'installer. + +!!! note "Note" + [Docker](https://www.docker.com) est une plate-forme logicielle qui vous permet de créer des conteneurs qui isolent une installation CatBoost et ClickHouse du reste du système. + +Avant d'appliquer un modèle CatBoost: + +**1.** Tirez la [Docker image](https://hub.docker.com/r/yandex/tutorial-catboost-clickhouse) à partir du registre: + +``` bash +$ docker pull yandex/tutorial-catboost-clickhouse +``` + +Cette image Docker contient tout ce dont vous avez besoin pour exécuter CatBoost et ClickHouse: code, runtime, bibliothèques, variables d'environnement et fichiers de configuration. + +**2.** Assurez-vous que l'image Docker a été tirée avec succès: + +``` bash +$ docker image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +yandex/tutorial-catboost-clickhouse latest 622e4d17945b 22 hours ago 1.37GB +``` + +**3.** Démarrer un conteneur Docker basé sur cette image: + +``` bash +$ docker run -it -p 8888:8888 yandex/tutorial-catboost-clickhouse +``` + +## 1. Créer une Table {#create-table} + +Pour créer une table ClickHouse pour l'exemple de formation: + +**1.** Démarrez clickhouse console client en mode interactif: + +``` bash +$ clickhouse client +``` + +!!! note "Note" + Le serveur ClickHouse est déjà en cours d'exécution dans le conteneur Docker. + +**2.** Créer la table à l'aide de la commande: + +``` sql +:) CREATE TABLE amazon_train +( + date Date MATERIALIZED today(), + ACTION UInt8, + RESOURCE UInt32, + MGR_ID UInt32, + ROLE_ROLLUP_1 UInt32, + ROLE_ROLLUP_2 UInt32, + ROLE_DEPTNAME UInt32, + ROLE_TITLE UInt32, + ROLE_FAMILY_DESC UInt32, + ROLE_FAMILY UInt32, + ROLE_CODE UInt32 +) +ENGINE = MergeTree ORDER BY date +``` + +**3.** Quitter le client de la console ClickHouse: + +``` sql +:) exit +``` + +## 2. Insérez les données dans la Table {#insert-data-to-table} + +Pour insérer les données: + +**1.** Exécutez la commande suivante: + +``` bash +$ clickhouse client --host 127.0.0.1 --query 'INSERT INTO amazon_train FORMAT CSVWithNames' < ~/amazon/train.csv +``` + +**2.** Démarrez clickhouse console client en mode interactif: + +``` bash +$ clickhouse client +``` + +**3.** Assurez-vous que les données ont été téléchargées: + +``` sql +:) SELECT count() FROM amazon_train + +SELECT count() +FROM amazon_train + ++-count()-+ +| 65538 | ++---------+ +``` + +## 3. Intégrer CatBoost dans ClickHouse {#integrate-catboost-into-clickhouse} + +!!! note "Note" + **Étape facultative.** L'image Docker contient tout ce dont vous avez besoin pour exécuter CatBoost et ClickHouse. + +Pour intégrer CatBoost dans ClickHouse: + +**1.** Construire la bibliothèque d'évaluation. + +Le moyen le plus rapide d'évaluer un modèle CatBoost est la compilation `libcatboostmodel.` bibliothèque. Pour plus d'informations sur la création de la bibliothèque, voir [Documentation CatBoost](https://catboost.ai/docs/concepts/c-plus-plus-api_dynamic-c-pluplus-wrapper.html). + +**2.** Créez un nouveau répertoire n'importe où et avec n'importe quel nom, par exemple, `data` et mettez la bibliothèque créée dedans. L'image Docker contient déjà la bibliothèque `data/libcatboostmodel.so`. + +**3.** Créez un nouveau répertoire pour le modèle de configuration n'importe où et avec n'importe quel nom, par exemple, `models`. + +**4.** Créez un fichier de configuration de modèle avec n'importe quel nom, par exemple, `models/amazon_model.xml`. + +**5.** Décrire la configuration du modèle: + +``` xml + + + + catboost + + amazon + + /home/catboost/tutorial/catboost_model.bin + + 0 + + +``` + +**6.** Ajoutez le chemin D'accès à CatBoost et la configuration du modèle à la configuration de ClickHouse: + +``` xml + +/home/catboost/data/libcatboostmodel.so +/home/catboost/models/*_model.xml +``` + +## 4. Exécutez L'inférence du modèle à partir de SQL {#run-model-inference} + +Pour le modèle de test exécutez le client ClickHouse `$ clickhouse client`. + +Assurons nous que le modèle fonctionne: + +``` sql +:) SELECT + modelEvaluate('amazon', + RESOURCE, + MGR_ID, + ROLE_ROLLUP_1, + ROLE_ROLLUP_2, + ROLE_DEPTNAME, + ROLE_TITLE, + ROLE_FAMILY_DESC, + ROLE_FAMILY, + ROLE_CODE) > 0 AS prediction, + ACTION AS target +FROM amazon_train +LIMIT 10 +``` + +!!! note "Note" + Fonction [modelEvaluate](../query_language/functions/other_functions.md#function-modelevaluate) retourne tuple avec des prédictions brutes par classe pour les modèles multiclasse. + +Prédisons la probabilité: + +``` sql +:) SELECT + modelEvaluate('amazon', + RESOURCE, + MGR_ID, + ROLE_ROLLUP_1, + ROLE_ROLLUP_2, + ROLE_DEPTNAME, + ROLE_TITLE, + ROLE_FAMILY_DESC, + ROLE_FAMILY, + ROLE_CODE) AS prediction, + 1. / (1 + exp(-prediction)) AS probability, + ACTION AS target +FROM amazon_train +LIMIT 10 +``` + +!!! note "Note" + Plus d'infos sur [exp()](../query_language/functions/math_functions.md) fonction. + +Calculons LogLoss sur l'échantillon: + +``` sql +:) SELECT -avg(tg * log(prob) + (1 - tg) * log(1 - prob)) AS logloss +FROM +( + SELECT + modelEvaluate('amazon', + RESOURCE, + MGR_ID, + ROLE_ROLLUP_1, + ROLE_ROLLUP_2, + ROLE_DEPTNAME, + ROLE_TITLE, + ROLE_FAMILY_DESC, + ROLE_FAMILY, + ROLE_CODE) AS prediction, + 1. / (1. + exp(-prediction)) AS prob, + ACTION AS tg + FROM amazon_train +) +``` + +!!! note "Note" + Plus d'infos sur [avg()](../query_language/agg_functions/reference.md#agg_function-avg) et [journal()](../query_language/functions/math_functions.md) fonction. + +[Article Original](https://clickhouse.tech/docs/en/guides/apply_catboost_model/) diff --git a/docs/fr/guides/index.md b/docs/fr/guides/index.md new file mode 100644 index 00000000000..57a705f7e86 --- /dev/null +++ b/docs/fr/guides/index.md @@ -0,0 +1,12 @@ +--- +machine_translated: true +--- + +# ClickHouse Guides {#clickhouse-guides} + +Liste des instructions détaillées étape par étape qui aident à résoudre diverses tâches en utilisant ClickHouse: + +- [Tutoriel sur la configuration simple du cluster](../getting_started/tutorial.md) +- [Application D'un modèle CatBoost dans ClickHouse](apply_catboost_model.md) + +[Article Original](https://clickhouse.tech/docs/en/guides/) diff --git a/docs/fr/images b/docs/fr/images new file mode 120000 index 00000000000..73937c941ec --- /dev/null +++ b/docs/fr/images @@ -0,0 +1 @@ +../en/images \ No newline at end of file diff --git a/docs/fr/index.md b/docs/fr/index.md new file mode 100644 index 00000000000..75cb70e21e6 --- /dev/null +++ b/docs/fr/index.md @@ -0,0 +1,136 @@ +--- +machine_translated: true +--- + +# Qu'est-ce que ClickHouse? {#what-is-clickhouse} + +ClickHouse est un système de gestion de base de données orienté colonne (SGBD) pour le traitement analytique en ligne des requêtes (OLAP). + +Dans un “normal” SGBD orienté ligne, les données sont stockées dans cet ordre: + +| Rangée | WatchID | JavaEnable | Intitulé | GoodEvent | EventTime | +|--------|-------------|------------|----------------------------------|-----------|---------------------| +| \#0 | 89354350662 | 1 | Relations Avec Les Investisseurs | 1 | 2016-05-18 05:19:20 | +| \#1 | 90329509958 | 0 | Contacter | 1 | 2016-05-18 08:10:20 | +| \#2 | 89953706054 | 1 | Mission | 1 | 2016-05-18 07:38:00 | +| \#N | … | … | … | … | … | + +En d'autres termes, toutes les valeurs liées à une ligne sont physiquement stockées l'une à côté de l'autre. + +Des exemples d'un SGBD orienté ligne sont MySQL, Postgres et MS SQL Server. {: .gris } + +Dans un SGBD orienté colonne, les données sont stockées comme ceci: + +| Rangée: | \#0 | \#1 | \#2 | \#N | +|-------------|----------------------------------|---------------------|---------------------|-----| +| WatchID: | 89354350662 | 90329509958 | 89953706054 | … | +| JavaEnable: | 1 | 0 | 1 | … | +| Intitulé: | Relations Avec Les Investisseurs | Contacter | Mission | … | +| GoodEvent: | 1 | 1 | 1 | … | +| EventTime: | 2016-05-18 05:19:20 | 2016-05-18 08:10:20 | 2016-05-18 07:38:00 | … | + +Ces exemples montrent l'ordre que les données sont organisées en. Les valeurs de différentes colonnes sont stockés séparément, et les données de la même colonne sont stockées ensemble. + +Exemples D'un SGBD orienté colonne: Vertica, Paraccel (matrice Actian et Amazon Redshift), Sybase IQ, Exasol, Infobright, InfiniDB, MonetDB (VectorWise et Actian Vector), LucidDB, SAP HANA, Google Dremel, Google PowerDrill, Druid et kdb+. {: .gris } + +Different orders for storing data are better suited to different scenarios. The data access scenario refers to what queries are made, how often, and in what proportion; how much data is read for each type of query – rows, columns, and bytes; the relationship between reading and updating data; the working size of the data and how locally it is used; whether transactions are used, and how isolated they are; requirements for data replication and logical integrity; requirements for latency and throughput for each type of query, and so on. + +Plus la charge sur le système est élevée, plus il est important de personnaliser le système configuré pour correspondre aux exigences du scénario d'utilisation, et plus cette personnalisation devient fine. Il n'y a pas de système qui soit aussi bien adapté à des scénarios significativement différents. Si un système est adaptable à un large ensemble de scénarios, sous une charge élevée, le système traitera tous les scénarios de manière également médiocre, ou fonctionnera bien pour un ou quelques-uns des scénarios possibles. + +## Propriétés clés du scénario OLAP {#key-properties-of-olap-scenario} + +- La grande majorité des demandes concernent l'accès en lecture. +- Les données sont mises à jour en lots assez importants (\> 1000 lignes), pas par des lignes simples; ou elles ne sont pas mises à jour du tout. +- Les données sont ajoutées à la base de données mais ne sont pas modifiées. +- Pour les lectures, un assez grand nombre de lignes sont extraites de la base de données, mais seulement un petit sous-ensemble de colonnes. +- Les Tables sont “wide,” ce qui signifie qu'ils contiennent un grand nombre de colonnes. +- Les requêtes sont relativement rares (généralement des centaines de requêtes par serveur ou moins par seconde). +- Pour les requêtes simples, les latences autour de 50 ms sont autorisées. +- Les valeurs de colonne sont assez petites: nombres et chaînes courtes (par exemple, 60 octets par URL). +- Nécessite un débit élevé lors du traitement d'une seule requête (jusqu'à des milliards de lignes par seconde par serveur). +- Les Transactions ne sont pas nécessaires. +- Faibles exigences en matière de cohérence des données. +- Il y a une grande table par requête. Toutes les tables sont petites, sauf une. +- Un résultat de requête est significativement plus petit que les données source. En d'autres termes, les données sont filtrées ou agrégées, de sorte que le résultat s'intègre dans la RAM d'un seul serveur. + +Il est facile de voir que le scénario OLAP est très différent des autres scénarios populaires (tels que OLTP ou key-Value access). Il n'est donc pas logique d'essayer D'utiliser OLTP ou une base de données clé-valeur pour traiter les requêtes analytiques si vous voulez obtenir des performances décentes. Par exemple, si vous essayez D'utiliser MongoDB ou Redis pour l'analyse, vous obtiendrez des performances très médiocres par rapport aux bases de données OLAP. + +## Pourquoi les bases de données orientées colonne fonctionnent mieux dans le scénario OLAP {#why-column-oriented-databases-work-better-in-the-olap-scenario} + +Les bases de données orientées colonne sont mieux adaptées aux scénarios OLAP: elles sont au moins 100 fois plus rapides dans le traitement de la plupart des requêtes. Les raisons sont expliquées en détail ci-dessous, mais le fait est plus facile de démontrer visuellement: + +**SGBD orienté ligne** + +![Row-oriented](images/row_oriented.gif#) + +**SGBD orienté colonne** + +![Column-oriented](images/column_oriented.gif#) + +Vous voyez la différence? + +### D'entrée/sortie {#inputoutput} + +1. Pour une requête analytique, seul un petit nombre de colonnes de table doit être lu. Dans une base de données orientée colonne, vous pouvez lire uniquement les données dont vous avez besoin. Par exemple, si vous avez besoin de 5 colonnes sur 100, Vous pouvez vous attendre à une réduction de 20 fois des e / s. +2. Puisque les données sont lues en paquets, il est plus facile de les compresser. Les données dans les colonnes sont également plus faciles à compresser. Cela réduit d'autant le volume d'e/S. +3. En raison de la réduction des E / S, Plus de données s'insèrent dans le cache du système. + +Par exemple, la requête “count the number of records for each advertising platform” nécessite la lecture d'un “advertising platform ID” colonne, qui prend 1 octet non compressé. Si la majeure partie du trafic ne provenait pas de plates-formes publicitaires, vous pouvez vous attendre à une compression d'au moins 10 fois de cette colonne. Lors de l'utilisation d'un algorithme de compression rapide, la décompression des données est possible à une vitesse d'au moins plusieurs gigaoctets de données non compressées par seconde. En d'autres termes, cette requête ne peut être traitée qu'à une vitesse d'environ plusieurs milliards de lignes par seconde sur un seul serveur. Cette vitesse est effectivement atteinte dans la pratique. + +
+ +Exemple + +``` bash +$ clickhouse-client +ClickHouse client version 0.0.52053. +Connecting to localhost:9000. +Connected to ClickHouse server version 0.0.52053. +``` + +``` sql +SELECT CounterID, count() FROM hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20 +``` + +``` text +┌─CounterID─┬──count()─┐ +│ 114208 │ 56057344 │ +│ 115080 │ 51619590 │ +│ 3228 │ 44658301 │ +│ 38230 │ 42045932 │ +│ 145263 │ 42042158 │ +│ 91244 │ 38297270 │ +│ 154139 │ 26647572 │ +│ 150748 │ 24112755 │ +│ 242232 │ 21302571 │ +│ 338158 │ 13507087 │ +│ 62180 │ 12229491 │ +│ 82264 │ 12187441 │ +│ 232261 │ 12148031 │ +│ 146272 │ 11438516 │ +│ 168777 │ 11403636 │ +│ 4120072 │ 11227824 │ +│ 10938808 │ 10519739 │ +│ 74088 │ 9047015 │ +│ 115079 │ 8837972 │ +│ 337234 │ 8205961 │ +└───────────┴──────────┘ +``` + +
+ +### CPU {#cpu} + +Étant donné que l'exécution d'une requête nécessite le traitement d'un grand nombre de lignes, il est utile de répartir toutes les opérations pour des vecteurs entiers au lieu de lignes séparées, ou d'implémenter le moteur de requête de sorte qu'il n'y ait presque aucun coût d'expédition. Si vous ne le faites pas, avec un sous-système de disque à moitié décent, l'interpréteur de requête bloque inévitablement le processeur. Il est logique de stocker des données dans des colonnes et de les traiter, si possible, par des colonnes. + +Il y a deux façons de le faire: + +1. Un moteur vectoriel. Toutes les opérations sont écrites pour les vecteurs, au lieu de valeurs séparées. Cela signifie que vous n'avez pas besoin d'appeler les opérations très souvent, et les coûts d'expédition sont négligeables. Le code d'opération contient un cycle interne optimisé. + +2. La génération de Code. Le code généré pour la requête contient tous les appels indirects. + +Ce n'est pas fait dans “normal” bases de données, car cela n'a pas de sens lors de l'exécution de requêtes simples. Cependant, il y a des exceptions. Par exemple, MemSQL utilise la génération de code pour réduire la latence lors du traitement des requêtes SQL. (À titre de comparaison, les SGBD analytiques nécessitent une optimisation du débit, et non une latence.) + +Notez que pour l'efficacité du processeur, le langage de requête doit être déclaratif (SQL ou MDX), ou au moins un vecteur (J, K). La requête ne doit contenir que des boucles implicites, permettant une optimisation. + +{## [Article Original](https://clickhouse.tech/docs/en/) ##} diff --git a/docs/fr/interfaces/cli.md b/docs/fr/interfaces/cli.md new file mode 100644 index 00000000000..84318bbb50a --- /dev/null +++ b/docs/fr/interfaces/cli.md @@ -0,0 +1,146 @@ +--- +machine_translated: true +--- + +# Client de ligne de commande {#command-line-client} + +ClickHouse fournit un client de ligne de commande natif: `clickhouse-client`. Le client prend en charge les options de ligne de commande et les fichiers de configuration. Pour plus d'informations, voir [Configuration](#interfaces_cli_configuration). + +[Installer](../getting_started/index.md) à partir de la `clickhouse-client` package et l'exécuter avec la commande `clickhouse-client`. + +``` bash +$ clickhouse-client +ClickHouse client version 19.17.1.1579 (official build). +Connecting to localhost:9000 as user default. +Connected to ClickHouse server version 19.17.1 revision 54428. + +:) +``` + +Différentes versions client et serveur sont compatibles les unes avec les autres, mais certaines fonctionnalités peuvent ne pas être disponibles dans les anciens clients. Nous vous recommandons d'utiliser la même version du client que l'application serveur. Lorsque vous essayez d'utiliser un client de l'ancienne version, puis le serveur, `clickhouse-client` affiche le message: + + ClickHouse client version is older than ClickHouse server. It may lack support for new features. + +## Utilisation {#cli_usage} + +Le client peut être utilisé en mode interactif et non interactif (batch). Pour utiliser le mode batch, spécifiez ‘query’ d'un paramètre ou d'envoyer des données à ‘stdin’ (il vérifie que ‘stdin’ n'est pas un terminal), ou les deux. Similaire à L'interface HTTP, lors de l'utilisation ‘query’ paramètre et envoi de données à ‘stdin’ la demande est une concaténation de la ‘query’ paramètre, un saut de ligne, et les données de ‘stdin’. Ceci est pratique pour les grandes requêtes D'insertion. + +Exemple d'utilisation du client pour insérer des données: + +``` bash +$ echo -ne "1, 'some text', '2016-08-14 00:00:00'\n2, 'some more text', '2016-08-14 00:00:01'" | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"; + +$ cat <<_EOF | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"; +3, 'some text', '2016-08-14 00:00:00' +4, 'some more text', '2016-08-14 00:00:01' +_EOF + +$ cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"; +``` + +En mode batch, le format de données par défaut est TabSeparated. Vous pouvez définir le format dans la clause FORMAT de la requête. + +Par défaut, vous ne pouvez traiter une seule requête en mode batch. De faire plusieurs requêtes à partir d'un “script,” l'utilisation de la `--multiquery` paramètre. Cela fonctionne pour toutes les requêtes sauf INSERT. Les résultats de la requête sont produits consécutivement sans séparateurs supplémentaires. De même, pour traiter un grand nombre de requêtes, vous pouvez exécuter ‘clickhouse-client’ pour chaque requête. Notez que cela peut prendre des dizaines de millisecondes pour lancer le ‘clickhouse-client’ programme. + +En mode interactif, vous obtenez une ligne de commande où vous pouvez entrer des requêtes. + +Si ‘multiline’ n'est pas spécifié (par défaut): Pour exécuter la requête, appuyez sur Entrée. Le point-virgule n'est pas nécessaire à la fin de la requête. Pour entrer une requête multiligne, entrez une barre oblique inverse `\` avant le saut de ligne. Après avoir appuyé sur Entrée, il vous sera demandé d'entrer la ligne suivante de la requête. + +Si multiline est spécifié: pour exécuter une requête, terminez-la par un point-virgule et appuyez sur Entrée. Si le point-virgule a été omis à la fin de l'entrée ligne, vous serez invité à entrer la ligne suivante de la requête. + +Une seule requête est exécutée, donc tout après le point-virgule est ignoré. + +Vous pouvez spécifier `\G` au lieu de le ou après le point-virgule. Cela indique le format Vertical. Dans ce format, chaque valeur est imprimée sur une ligne distincte, ce qui est pratique pour les grandes tables. Cette fonctionnalité inhabituelle a été ajoutée pour la compatibilité avec la CLI MySQL. + +La ligne de commande est basé sur ‘replxx’ (similaire à ‘readline’). En d'autres termes, il utilise les raccourcis clavier familiers et conserve un historique. L'histoire est écrite à `~/.clickhouse-client-history`. + +Par défaut, le format utilisé est Jolicompact. Vous pouvez modifier le format dans la clause FORMAT de la requête, ou en spécifiant `\G` à la fin de la requête, en utilisant le `--format` ou `--vertical` dans la ligne de commande, ou en utilisant le fichier de configuration client. + +Pour quitter le client, appuyez sur Ctrl + D (ou Ctrl + C), ou entrez l'une des options suivantes au lieu d'une requête: “exit”, “quit”, “logout”, “exit;”, “quit;”, “logout;”, “q”, “Q”, “:q” + +Lors du traitement d'une requête, le client affiche: + +1. Progrès, qui est mis à jour pas plus de 10 fois par seconde (par défaut). Pour les requêtes rapides, la progression peut ne pas avoir le temps d'être affichée. +2. La requête formatée après l'analyse, pour le débogage. +3. Le résultat dans le format spécifié. +4. Le nombre de lignes dans le résultat, le temps passé et la vitesse moyenne de traitement des requêtes. + +Vous pouvez annuler une requête longue en appuyant sur Ctrl + C. Cependant, vous devrez toujours attendre un peu pour que le serveur abandonne la requête. Il n'est pas possible d'annuler une requête à certaines étapes. Si vous n'attendez pas et appuyez une seconde fois sur Ctrl+C, le client quittera. + +Le client de ligne de commande permet de passer des données externes (tables temporaires externes) pour l'interrogation. Pour plus d'informations, consultez la section “External data for query processing”. + +### Requêtes avec paramètres {#cli-queries-with-parameters} + +Vous pouvez créer une requête avec des paramètres et leur transmettre des valeurs à partir de l'application cliente. Cela permet d'éviter le formatage de la requête avec des valeurs dynamiques spécifiques côté client. Exemple: + +``` bash +$ clickhouse-client --param_parName="[1, 2]" -q "SELECT * FROM table WHERE a = {parName:Array(UInt16)}" +``` + +#### La Syntaxe De La Requête {#cli-queries-with-parameters-syntax} + +Formatez une requête comme d'habitude, puis placez les valeurs que vous souhaitez transmettre des paramètres de l'application à la requête entre accolades au format suivant: + +``` sql +{:} +``` + +- `name` — Placeholder identifier. In the console client it should be used in app parameters as `--param_ = value`. +- `data type` — [Type de données](../data_types/index.md) de l'application valeur de paramètre. Par exemple, une structure de données comme `(integer, ('string', integer))` peut avoir la `Tuple(UInt8, Tuple(String, UInt8))` type de données (vous pouvez également utiliser un autre [entier](../data_types/int_uint.md) type). + +#### Exemple {#example} + +``` bash +$ clickhouse-client --param_tuple_in_tuple="(10, ('dt', 10))" -q "SELECT * FROM table WHERE val = {tuple_in_tuple:Tuple(UInt8, Tuple(String, UInt8))}" +``` + +## Configuration {#interfaces_cli_configuration} + +Vous pouvez passer des paramètres à `clickhouse-client` (tous les paramètres ont une valeur par défaut) en utilisant: + +- À partir de la ligne de commande + + Les options de ligne de commande remplacent les valeurs et les paramètres par défaut dans les fichiers de configuration. + +- Les fichiers de Configuration. + + Les paramètres des fichiers de configuration remplacent les valeurs par défaut. + +### Options De Ligne De Commande {#command-line-options} + +- `--host, -h` -– The server name, ‘localhost’ par défaut. Vous pouvez utiliser le nom ou L'adresse IPv4 ou IPv6. +- `--port` – The port to connect to. Default value: 9000. Note that the HTTP interface and the native interface use different ports. +- `--user, -u` – The username. Default value: default. +- `--password` – The password. Default value: empty string. +- `--query, -q` – The query to process when using non-interactive mode. +- `--database, -d` – Select the current default database. Default value: the current database from the server settings (‘default’ par défaut). +- `--multiline, -m` – If specified, allow multiline queries (do not send the query on Enter). +- `--multiquery, -n` – If specified, allow processing multiple queries separated by semicolons. +- `--format, -f` – Use the specified default format to output the result. +- `--vertical, -E` – If specified, use the Vertical format by default to output the result. This is the same as ‘–format=Vertical’. Dans ce format, chaque valeur est imprimée sur une ligne séparée, ce qui est utile lors de l'affichage de tables larges. +- `--time, -t` – If specified, print the query execution time to ‘stderr’ en mode non interactif. +- `--stacktrace` – If specified, also print the stack trace if an exception occurs. +- `--config-file` – The name of the configuration file. +- `--secure` – If specified, will connect to server over secure connection. +- `--param_` — Value for a [requête avec paramètres](#cli-queries-with-parameters). + +### Fichiers De Configuration {#configuration_files} + +`clickhouse-client` utilise le premier fichier existant de suite: + +- Défini dans le `--config-file` paramètre. +- `./clickhouse-client.xml` +- `~/.clickhouse-client/config.xml` +- `/etc/clickhouse-client/config.xml` + +Exemple de fichier de configuration: + +``` xml + + username + password + False + +``` + +[Article Original](https://clickhouse.tech/docs/en/interfaces/cli/) diff --git a/docs/fr/interfaces/cpp.md b/docs/fr/interfaces/cpp.md new file mode 100644 index 00000000000..ecf3ca349c4 --- /dev/null +++ b/docs/fr/interfaces/cpp.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Bibliothèque Client C++ {#c-client-library} + +Voir le fichier README à [clickhouse-cpp](https://github.com/ClickHouse/clickhouse-cpp) référentiel. + +[Article Original](https://clickhouse.tech/docs/en/interfaces/cpp/) diff --git a/docs/fr/interfaces/formats.md b/docs/fr/interfaces/formats.md new file mode 100644 index 00000000000..5f5b693b550 --- /dev/null +++ b/docs/fr/interfaces/formats.md @@ -0,0 +1,1209 @@ +--- +machine_translated: true +--- + +# Formats pour les données D'entrée et de sortie {#formats} + +ClickHouse peut accepter et renvoyer des données dans différents formats. Un format pris en charge pour l'entrée peut être utilisée pour analyser les données fournies à `INSERT`s, pour effectuer `SELECT`s à partir d'une table sauvegardée par fichier, telle Qu'un fichier, une URL ou un HDFS, ou pour lire un dictionnaire externe. Un format pris en charge pour la sortie peut être utilisé pour organiser +les résultats d'une `SELECT` et pour effectuer `INSERT`s dans une table sauvegardée par fichier. + +Les formats pris en charge sont: + +| Format | Entrée | Sortie | +|-----------------------------------------------------------------|--------|--------| +| [TabSeparated](#tabseparated) | ✔ | ✔ | +| [TabSeparatedRaw](#tabseparatedraw) | ✗ | ✔ | +| [TabSeparatedWithNames](#tabseparatedwithnames) | ✔ | ✔ | +| [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes) | ✔ | ✔ | +| [Modèle](#format-template) | ✔ | ✔ | +| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ | +| [CSV](#csv) | ✔ | ✔ | +| [CSVWithNames](#csvwithnames) | ✔ | ✔ | +| [CustomSeparated](#format-customseparated) | ✔ | ✔ | +| [Valeur](#data-format-values) | ✔ | ✔ | +| [Vertical](#vertical) | ✗ | ✔ | +| [VerticalRaw](#verticalraw) | ✗ | ✔ | +| [JSON](#json) | ✗ | ✔ | +| [JSONCompact](#jsoncompact) | ✗ | ✔ | +| [JSONEachRow](#jsoneachrow) | ✔ | ✔ | +| [TSKV](#tskv) | ✔ | ✔ | +| [Joli](#pretty) | ✗ | ✔ | +| [PrettyCompact](#prettycompact) | ✗ | ✔ | +| [PrettyCompactMonoBlock](#prettycompactmonoblock) | ✗ | ✔ | +| [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | +| [PrettySpace](#prettyspace) | ✗ | ✔ | +| [Protobuf](#protobuf) | ✔ | ✔ | +| [Avro](#data-format-avro) | ✔ | ✔ | +| [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | +| [Parquet](#data-format-parquet) | ✔ | ✔ | +| [ORC](#data-format-orc) | ✔ | ✗ | +| [RowBinary](#rowbinary) | ✔ | ✔ | +| [Rowbinarywithnamesettypes](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [Natif](#native) | ✔ | ✔ | +| [NULL](#null) | ✗ | ✔ | +| [XML](#xml) | ✗ | ✔ | +| [CapnProto](#capnproto) | ✔ | ✗ | + +Vous pouvez contrôler certains paramètres de traitement de format avec les paramètres ClickHouse. Pour plus d'informations, lisez le [Paramètre](../operations/settings/settings.md) section. + +## TabSeparated {#tabseparated} + +Au format TabSeparated, les données sont écrites par ligne. Chaque ligne contient des valeurs séparées par des onglets. Chaque valeur est suivie par un onglet, à l'exception de la dernière valeur dans la ligne, qui est suivi par un saut de ligne. Les flux de ligne strictement Unix sont supposés partout. La dernière ligne doit également contenir un saut de ligne à la fin. Les valeurs sont écrites au format texte, sans guillemets et avec des caractères spéciaux échappés. + +Ce format est également disponible sous le nom de `TSV`. + +Le `TabSeparated` le format est pratique pour le traitement des données à l'aide de programmes et de scripts personnalisés. Il est utilisé par défaut dans L'interface HTTP et dans le mode batch du client de ligne de commande. Ce format permet également de transférer des données entre différents SGBD. Par exemple, vous pouvez obtenir un dump de MySQL et le télécharger sur ClickHouse, ou vice versa. + +Le `TabSeparated` format prend en charge la sortie des valeurs totales (lors de L'utilisation avec des totaux) et des valeurs extrêmes (lorsque ‘extremes’ est réglé sur 1). Dans ces cas, les valeurs totales et les extrêmes sont sorties après les données principales. Le résultat principal, les valeurs totales et les extrêmes sont séparés les uns des autres par une ligne vide. Exemple: + +``` sql +SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT TabSeparated`` +``` + +``` text +2014-03-17 1406958 +2014-03-18 1383658 +2014-03-19 1405797 +2014-03-20 1353623 +2014-03-21 1245779 +2014-03-22 1031592 +2014-03-23 1046491 + +0000-00-00 8873898 + +2014-03-17 1031592 +2014-03-23 1406958 +``` + +### Mise En Forme Des Données {#data-formatting} + +Les nombres entiers sont écrits sous forme décimale. Les numéros peuvent contenir un supplément “+” caractère au début (ignoré lors de l'analyse, et non enregistré lors du formatage). Les nombres non négatifs ne peuvent pas contenir le signe négatif. Lors de la lecture, il est permis d'analyser une chaîne vide en tant que zéro, ou (pour les types signés) une chaîne composée d'un signe moins en tant que zéro. Les nombres qui ne correspondent pas au type de données correspondant peuvent être analysés comme un nombre différent, sans message d'erreur. + +Les nombres à virgule flottante sont écrits sous forme décimale. Le point est utilisé comme séparateur décimal. Les entrées exponentielles sont prises en charge, tout comme ‘inf’, ‘+inf’, ‘-inf’, et ‘nan’. Une entrée de nombres à virgule flottante peut commencer ou se terminer par une virgule décimale. +Pendant le formatage, la précision peut être perdue sur les nombres à virgule flottante. +Pendant l'analyse, il n'est pas strictement nécessaire de lire le nombre représentable de la machine le plus proche. + +Les Dates sont écrites au format AAAA-MM-JJ et analysées dans le même format, mais avec tous les caractères comme séparateurs. +Les Dates avec les heures sont écrites dans le format `YYYY-MM-DD hh:mm:ss` et analysé dans le même format, mais avec des caractères comme séparateurs. +Tout cela se produit dans le fuseau horaire du système au moment où le client ou le serveur démarre (selon lequel d'entre eux formate les données). Pour les dates avec des heures, l'heure d'été n'est pas spécifiée. Donc, si un vidage a des temps pendant l'heure d'été, le vidage ne correspond pas sans équivoque aux données, et l'analyse sélectionnera l'une des deux fois. +Lors d'une opération de lecture, les dates et dates incorrectes avec des heures peuvent être analysées avec un débordement naturel ou en tant que dates et heures nulles, sans message d'erreur. + +À titre d'exception, l'analyse des dates avec des heures est également prise en charge au format d'horodatage Unix, si elle se compose exactement de 10 chiffres décimaux. Le résultat n'est pas dépendant du fuseau horaire. Les formats AAAA-MM-JJ hh:mm:ss et NNNNNNNNNN sont différenciés automatiquement. + +Les chaînes sont sorties avec des caractères spéciaux échappés par une barre oblique inverse. Les séquences d'échappement suivantes sont utilisées pour la sortie: `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\'`, `\\`. L'analyse prend également en charge les séquences `\a`, `\v`, et `\xHH` (séquences d'échappement hexadécimales) et `\c` séquences, où `c` est un caractère (ces séquences sont convertis à `c`). Ainsi, la lecture de données prend en charge les formats où un saut de ligne peut être écrit comme `\n` ou `\` ou comme un saut de ligne. Par exemple, la chaîne `Hello world` avec un saut de ligne entre les mots au lieu de l'espace peut être analysé dans l'une des variantes suivantes: + +``` text +Hello\nworld + +Hello\ +world +``` + +La deuxième variante est prise en charge car MySQL l'utilise lors de l'écriture de vidages séparés par des tabulations. + +L'ensemble minimum de caractères que vous devez échapper lors du passage de données au format TabSeparated: tab, saut de ligne (LF) et barre oblique inverse. + +Seul un petit ensemble de symboles sont échappés. Vous pouvez facilement tomber sur une valeur de chaîne que votre terminal va ruiner en sortie. + +Les tableaux sont écrits sous la forme d'une liste de valeurs séparées par des virgules entre crochets. Le nombre d'éléments dans le tableau sont formatés comme normalement. `Date` et `DateTime` les types sont écrits entre guillemets simples. Les chaînes sont écrites entre guillemets simples avec les mêmes règles d'échappement que ci-dessus. + +[NULL](../query_language/syntax.md) est formaté en tant qu' `\N`. + +Chaque élément de [Imbriqué](../data_types/nested_data_structures/nested.md) structures est représenté sous forme de tableau. + +Exemple: + +``` sql +CREATE TABLE nestedt +( + `id` UInt8, + `aux` Nested( + a UInt8, + b String + ) +) +ENGINE = TinyLog +``` + +``` sql +INSERT INTO nestedt Values ( 1, [1], ['a']) +``` + +``` sql +SELECT * FROM nestedt FORMAT TSV +``` + +``` text +1 [1] ['a'] +``` + +## TabSeparatedRaw {#tabseparatedraw} + +Diffère de `TabSeparated` format en ce que les lignes sont écrites sans échappement. +Ce format n'est approprié que pour la sortie d'un résultat de requête, mais pas pour l'analyse (récupération des données à insérer dans une table). + +Ce format est également disponible sous le nom de `TSVRaw`. + +## TabSeparatedWithNames {#tabseparatedwithnames} + +Diffère de la `TabSeparated` formater en ce que les noms de colonne sont écrits dans la première ligne. +Pendant l'analyse, la première ligne est complètement ignorée. Vous ne pouvez pas utiliser les noms de colonnes pour déterminer leur position ou vérifier leur exactitude. +(La prise en charge de l'analyse de la ligne d'en-tête peut être ajoutée à l'avenir.) + +Ce format est également disponible sous le nom de `TSVWithNames`. + +## TabSeparatedWithNamesAndTypes {#tabseparatedwithnamesandtypes} + +Diffère de la `TabSeparated` format que les noms de colonne sont écrits à la première ligne, tandis que les types de colonne sont dans la deuxième rangée. +Pendant l'analyse, les première et deuxième lignes sont complètement ignorées. + +Ce format est également disponible sous le nom de `TSVWithNamesAndTypes`. + +## Modèle {#format-template} + +Ce format permet de spécifier une chaîne de format personnalisée avec des espaces réservés pour les valeurs avec une règle d'échappement spécifiée. + +Il utilise les paramètres `format_template_resultset`, `format_template_row`, `format_template_rows_between_delimiter` and some settings of other formats (e.g. `output_format_json_quote_64bit_integers` lors de l'utilisation de `JSON` s'échapper, voir plus loin) + +Paramètre `format_template_row` spécifie le chemin d'accès au fichier, qui contient une chaîne de format pour les lignes avec la syntaxe suivante: + +`delimiter_1${column_1:serializeAs_1}delimiter_2${column_2:serializeAs_2} ... delimiter_N`, + +où `delimiter_i` est un délimiteur entre les valeurs (`$` symbole peut être échappé comme `$$`), +`column_i` est un nom ou un index d'une colonne dont les valeurs sont choisies ou inséré (si vide, alors la colonne sera ignoré), +`serializeAs_i` est une règle d'échappement pour les valeurs de colonne. Les règles d'échappement suivantes sont prises en charge: + +- `CSV`, `JSON`, `XML` (de même pour les formats des mêmes noms) +- `Escaped` (de la même manière à `TSV`) +- `Quoted` (de la même manière à `Values`) +- `Raw` (sans s'échapper, de même pour `TSVRaw`) +- `None` (pas de règle d'échappement, voir plus loin) + +Si une règle d'échappement est omise, alors `None` sera utilisé. `XML` et `Raw` sont adaptés uniquement pour la sortie. + +Donc, pour la chaîne de format suivante: + + `Search phrase: ${SearchPhrase:Quoted}, count: ${c:Escaped}, ad price: $$${price:JSON};` + +les valeurs de `SearchPhrase`, `c` et `price` colonnes, qui sont échappées comme `Quoted`, `Escaped` et `JSON` imprimées (pour sélectionner) ou sera prévu (insert) entre `Search phrase:`, `, count:`, `, ad price: $` et `;` délimiteurs respectivement. Exemple: + +`Search phrase: 'bathroom interior design', count: 2166, ad price: $3;` + +Le `format_template_rows_between_delimiter` paramètre spécifie délimiteur entre les lignes, qui est imprimé (ou attendu) après chaque ligne, sauf la dernière (`\n` par défaut) + +Paramètre `format_template_resultset` spécifie le chemin d'accès au fichier, qui contient une chaîne de format pour resultset. Format string for resultset a la même syntaxe qu'une chaîne de format pour row et permet de spécifier un préfixe, un suffixe et un moyen d'imprimer des informations supplémentaires. Il contient les espaces réservés suivants au lieu des noms de colonnes: + +- `data` est les lignes avec des données dans `format_template_row` format, séparés par des `format_template_rows_between_delimiter`. Cet espace doit être le premier espace réservé dans la chaîne de format. +- `totals` est la ligne avec des valeurs totales dans `format_template_row` format (lors de L'utilisation avec des totaux) +- `min` est la ligne avec des valeurs minimales dans `format_template_row` format (lorsque les extrêmes sont définis sur 1) +- `max` est la ligne avec des valeurs maximales en `format_template_row` format (lorsque les extrêmes sont définis sur 1) +- `rows` le nombre total de lignes de sortie +- `rows_before_limit` est le nombre minimal de lignes qu'il y aurait eu sans limite. Sortie uniquement si la requête contient LIMIT. Si la requête contient GROUP BY, rows\_before\_limit\_at\_least est le nombre exact de lignes qu'il y aurait eu sans limite. +- `time` est le temps d'exécution de la requête en secondes +- `rows_read` est le nombre de lignes a été lu +- `bytes_read` est le nombre d'octets (non compressé) a été lu + +Réservé `data`, `totals`, `min` et `max` ne doit pas avoir de règle d'échappement spécifiée (ou `None` doit être spécifié explicitement). Les espaces réservés restants peuvent avoir une règle d'échappement spécifiée. +Si l' `format_template_resultset` paramètre est une chaîne vide, `${data}` est utilisé comme valeur par défaut. +Pour insérer des requêtes format permet de sauter certaines colonnes ou certains champs si préfixe ou suffixe (voir Exemple). + +Sélectionnez exemple: + +``` sql +SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase ORDER BY c DESC LIMIT 5 FORMAT Template SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = '\n ' +``` + +`/some/path/resultset.format`: + +``` text + + Search phrases + + + + ${data} +
Search phrases
Search phrase Count
+ + ${max} +
Max
+ Processed ${rows_read:XML} rows in ${time:XML} sec + + +``` + +`/some/path/row.format`: + +``` text + ${0:XML} ${1:XML} +``` + +Résultat: + +``` html + + Search phrases + + + + + + + + +
Search phrases
Search phrase Count
8267016
bathroom interior design 2166
yandex 1655
spring 2014 fashion 1549
freeform photos 1480
+ + +
Max
8873898
+ Processed 3095973 rows in 0.1569913 sec + + +``` + +Insérez exemple: + +``` text +Some header +Page views: 5, User id: 4324182021466249494, Useless field: hello, Duration: 146, Sign: -1 +Page views: 6, User id: 4324182021466249494, Useless field: world, Duration: 185, Sign: 1 +Total rows: 2 +``` + +``` sql +INSERT INTO UserActivity FORMAT Template SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format' +``` + +`/some/path/resultset.format`: + +``` text +Some header\n${data}\nTotal rows: ${:CSV}\n +``` + +`/some/path/row.format`: + +``` text +Page views: ${PageViews:CSV}, User id: ${UserID:CSV}, Useless field: ${:CSV}, Duration: ${Duration:CSV}, Sign: ${Sign:CSV} +``` + +`PageViews`, `UserID`, `Duration` et `Sign` à l'intérieur des espaces réservés sont des noms de colonnes dans la table. Les valeurs après `Useless field` en rangées et après `\nTotal rows:` dans le suffixe sera ignoré. +Tous les séparateurs dans les données d'entrée doivent être strictement égal à délimiteurs dans les chaînes de format. + +## TemplateIgnoreSpaces {#templateignorespaces} + +Ce format est adapté uniquement pour l'entrée. +Semblable à `Template`, mais ignore les espaces entre les séparateurs et les valeurs dans le flux d'entrée. Toutefois, si les chaînes de format contiennent des espaces, ces caractères seront attendus dans le flux d'entrée. Permet également de spécifier des espaces réservés vides (`${}` ou `${:None}`) pour diviser un délimiteur en parties séparées pour ignorer les espaces entre eux. Ces espaces réservés sont utilisés uniquement pour ignorer les caractères d'espace. +Il est possible de lire `JSON` l'utilisation de ce format, si les valeurs des colonnes ont le même ordre dans toutes les lignes. Par exemple, la requête suivante peut être utilisée pour insérer des données à partir d'un exemple de format de sortie [JSON](#json): + +``` sql +INSERT INTO table_name FORMAT TemplateIgnoreSpaces SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = ',' +``` + +`/some/path/resultset.format`: + +``` text +{${}"meta"${}:${:JSON},${}"data"${}:${}[${data}]${},${}"totals"${}:${:JSON},${}"extremes"${}:${:JSON},${}"rows"${}:${:JSON},${}"rows_before_limit_at_least"${}:${:JSON}${}} +``` + +`/some/path/row.format`: + +``` text +{${}"SearchPhrase"${}:${}${phrase:JSON}${},${}"c"${}:${}${cnt:JSON}${}} +``` + +## TSKV {#tskv} + +Similaire à TabSeparated, mais affiche une valeur au format name = value. Les noms sont échappés de la même manière qu'au format TabSeparated, et le symbole = est également échappé. + +``` text +SearchPhrase= count()=8267016 +SearchPhrase=bathroom interior design count()=2166 +SearchPhrase=yandex count()=1655 +SearchPhrase=2014 spring fashion count()=1549 +SearchPhrase=freeform photos count()=1480 +SearchPhrase=angelina jolie count()=1245 +SearchPhrase=omsk count()=1112 +SearchPhrase=photos of dog breeds count()=1091 +SearchPhrase=curtain designs count()=1064 +SearchPhrase=baku count()=1000 +``` + +[NULL](../query_language/syntax.md) est formaté en tant qu' `\N`. + +``` sql +SELECT * FROM t_null FORMAT TSKV +``` + +``` text +x=1 y=\N +``` + +Quand il y a un grand nombre de petites colonnes, ce format est inefficace, et il n'y a généralement pas de raison de l'utiliser. Néanmoins, ce n'est pas pire que JSONEachRow en termes d'efficacité. + +Both data output and parsing are supported in this format. For parsing, any order is supported for the values of different columns. It is acceptable for some values to be omitted – they are treated as equal to their default values. In this case, zeros and blank rows are used as default values. Complex values that could be specified in the table are not supported as defaults. + +L'analyse permet la présence du champ supplémentaire `tskv` sans le signe égal ou de valeur. Ce champ est ignoré. + +## CSV {#csv} + +Format des valeurs séparées par des virgules ([RFC](https://tools.ietf.org/html/rfc4180)). + +Lors du formatage, les lignes sont entourées de guillemets doubles. Un guillemet double à l'intérieur d'une chaîne est affiché sous la forme de deux guillemets doubles dans une rangée. Il n'y a pas d'autres règles pour échapper les caractères. Date et date-heure sont entre guillemets. Les nombres sont produits sans guillemets. Les valeurs sont séparées par un caractère délimiteur, qui est `,` par défaut. Le caractère délimiteur est défini dans le paramètre [format\_csv\_delimiter](../operations/settings/settings.md#settings-format_csv_delimiter). Les lignes sont séparées à L'aide du saut de ligne Unix (LF). Les tableaux sont sérialisés au format CSV comme suit: tout d'abord, le tableau est sérialisé en une chaîne comme au format TabSeparated, puis la chaîne résultante est sortie au format CSV entre guillemets doubles. Les Tuples au format CSV sont sérialisés en tant que colonnes séparées (c'est-à-dire que leur imbrication dans le tuple est perdue). + +``` bash +$ clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FORMAT CSV" < data.csv +``` + +\*Par défaut, le délimiteur est `,`. Voir la [format\_csv\_delimiter](../operations/settings/settings.md#settings-format_csv_delimiter) réglage pour plus d'informations. + +Lors de l'analyse, toutes les valeurs peuvent être analysés avec ou sans guillemets. Les guillemets doubles et simples sont pris en charge. Les lignes peuvent également être organisées sans guillemets. Dans ce cas, ils sont analysés jusqu'au caractère délimiteur ou au saut de ligne (CR ou LF). En violation de la RFC, lors de l'analyse des lignes sans guillemets, les espaces et les onglets de début et de fin sont ignorés. Pour le saut de ligne, les types Unix (LF), Windows (CR LF) et Mac OS Classic (CR LF) sont tous pris en charge. + +Les valeurs d'entrée non cotées vides sont remplacées par des valeurs par défaut pour les colonnes respectives, si +[input\_format\_defaults\_for\_omitted\_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields) +est activé. + +`NULL` est formaté en tant qu' `\N` ou `NULL` ou une chaîne vide non cotée (voir paramètres [input\_format\_csv\_unquoted\_null\_literal\_as\_null](../operations/settings/settings.md#settings-input_format_csv_unquoted_null_literal_as_null) et [input\_format\_defaults\_for\_omitted\_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields)). + +Le format CSV prend en charge la sortie des totaux et des extrêmes de la même manière que `TabSeparated`. + +## CSVWithNames {#csvwithnames} + +Imprime également la ligne d'en-tête, semblable à `TabSeparatedWithNames`. + +## CustomSeparated {#format-customseparated} + +Semblable à [Modèle](#format-template), mais il imprime ou lit toutes les colonnes et utilise la règle d'échappement du paramètre `format_custom_escaping_rule` et délimiteurs de paramètres `format_custom_field_delimiter`, `format_custom_row_before_delimiter`, `format_custom_row_after_delimiter`, `format_custom_row_between_delimiter`, `format_custom_result_before_delimiter` et `format_custom_result_after_delimiter`, pas à partir de chaînes de format. +Il y a aussi `CustomSeparatedIgnoreSpaces` le format, qui est similaire à `TemplateIgnoreSpaces`. + +## JSON {#json} + +Sorties de données au format JSON. Outre les tables de données, il génère également des noms et des types de colonnes, ainsi que des informations supplémentaires: le nombre total de lignes de sortie et le nombre de lignes qui auraient pu être sorties s'il n'y avait pas de limite. Exemple: + +``` sql +SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase WITH TOTALS ORDER BY c DESC LIMIT 5 FORMAT JSON +``` + +``` json +{ + "meta": + [ + { + "name": "SearchPhrase", + "type": "String" + }, + { + "name": "c", + "type": "UInt64" + } + ], + + "data": + [ + { + "SearchPhrase": "", + "c": "8267016" + }, + { + "SearchPhrase": "bathroom interior design", + "c": "2166" + }, + { + "SearchPhrase": "yandex", + "c": "1655" + }, + { + "SearchPhrase": "spring 2014 fashion", + "c": "1549" + }, + { + "SearchPhrase": "freeform photos", + "c": "1480" + } + ], + + "totals": + { + "SearchPhrase": "", + "c": "8873898" + }, + + "extremes": + { + "min": + { + "SearchPhrase": "", + "c": "1480" + }, + "max": + { + "SearchPhrase": "", + "c": "8267016" + } + }, + + "rows": 5, + + "rows_before_limit_at_least": 141137 +} +``` + +Le JSON est compatible avec JavaScript. Pour ce faire, certains caractères sont en outre échappés: la barre oblique `/` s'est échappée comme l' `\/`; sauts de ligne alternatifs `U+2028` et `U+2029`, qui cassent certains navigateurs, sont échappés comme `\uXXXX`. Les caractères de contrôle ASCII sont échappés: retour arrière, flux de formulaire, saut de ligne, retour chariot et tabulation horizontale sont remplacés par `\b`, `\f`, `\n`, `\r`, `\t` , ainsi que les octets restants dans la plage 00-1F en utilisant `\uXXXX` sequences. Invalid UTF-8 sequences are changed to the replacement character � so the output text will consist of valid UTF-8 sequences. For compatibility with JavaScript, Int64 and UInt64 integers are enclosed in double-quotes by default. To remove the quotes, you can set the configuration parameter [output\_format\_json\_quote\_64bit\_integers](../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) à 0. + +`rows` – The total number of output rows. + +`rows_before_limit_at_least` Le nombre minimal de lignes aurait été sans limite. Sortie uniquement si la requête contient LIMIT. +Si la requête contient GROUP BY, rows\_before\_limit\_at\_least est le nombre exact de lignes qu'il y aurait eu sans limite. + +`totals` – Total values (when using WITH TOTALS). + +`extremes` – Extreme values (when extremes are set to 1). + +Ce format n'est approprié que pour la sortie d'un résultat de requête, mais pas pour l'analyse (récupération des données à insérer dans une table). + +Supports ClickHouse [NULL](../query_language/syntax.md) s'affiche à l'écran `null` dans la sortie JSON. + +Voir aussi l' [JSONEachRow](#jsoneachrow) format. + +## JSONCompact {#jsoncompact} + +Diffère de JSON uniquement en ce que les lignes de données sont sorties dans des tableaux, pas dans des objets. + +Exemple: + +``` json +{ + "meta": + [ + { + "name": "SearchPhrase", + "type": "String" + }, + { + "name": "c", + "type": "UInt64" + } + ], + + "data": + [ + ["", "8267016"], + ["bathroom interior design", "2166"], + ["yandex", "1655"], + ["fashion trends spring 2014", "1549"], + ["freeform photo", "1480"] + ], + + "totals": ["","8873898"], + + "extremes": + { + "min": ["","1480"], + "max": ["","8267016"] + }, + + "rows": 5, + + "rows_before_limit_at_least": 141137 +} +``` + +Ce format n'est approprié que pour la sortie d'un résultat de requête, mais pas pour l'analyse (récupération des données à insérer dans une table). +Voir aussi l' `JSONEachRow` format. + +## JSONEachRow {#jsoneachrow} + +Lorsque vous utilisez ce format, ClickHouse affiche les lignes en tant qu'objets JSON séparés et délimités par des retours à la ligne, mais les données dans leur ensemble ne sont pas JSON valides. + +``` json +{"SearchPhrase":"curtain designs","count()":"1064"} +{"SearchPhrase":"baku","count()":"1000"} +{"SearchPhrase":"","count()":"8267016"} +``` + +Lors de l'insertion des données, vous devez fournir un objet JSON distinct pour chaque ligne. + +### Insertion De Données {#inserting-data} + +``` sql +INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1} +``` + +Clickhouse permet: + +- Toute commande de paires clé-valeur dans l'objet. +- Omettre certaines valeurs. + +ClickHouse ignore les espaces entre les éléments et les virgules après les objets. Vous pouvez passer tous les objets en une seule ligne. Vous n'avez pas à les séparer avec des sauts de ligne. + +**Valeurs omises traitement** + +Clickhouse remplace les valeurs omises par les valeurs par défaut pour le [types de données](../data_types/index.md). + +Si `DEFAULT expr` clickhouse utilise différentes règles de substitution en fonction de [input\_format\_defaults\_for\_omitted\_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields) paramètre. + +Considérons le tableau suivant: + +``` sql +CREATE TABLE IF NOT EXISTS example_table +( + x UInt32, + a DEFAULT x * 2 +) ENGINE = Memory; +``` + +- Si `input_format_defaults_for_omitted_fields = 0`, alors la valeur par défaut pour `x` et `a` égal `0` (la valeur par défaut pour le `UInt32` type de données). +- Si `input_format_defaults_for_omitted_fields = 1`, alors la valeur par défaut pour `x` égal `0` mais la valeur par défaut de `a` égal `x * 2`. + +!!! note "Avertissement" + Lors de l'insertion de données avec `insert_sample_with_metadata = 1`, ClickHouse consomme plus de ressources de calcul, par rapport à l'insertion avec `insert_sample_with_metadata = 0`. + +### La Sélection De Données {#selecting-data} + +Envisager l' `UserActivity` table comme un exemple: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +Requête `SELECT * FROM UserActivity FORMAT JSONEachRow` retourner: + +``` text +{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1} +{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1} +``` + +Contrairement à l' [JSON](#json) format, il n'y a pas de substitution de séquences UTF-8 non valides. Les valeurs sont échappés de la même manière que pour `JSON`. + +!!! note "Note" + Tout ensemble d'octets peut être sortie dans les cordes. L'utilisation de la `JSONEachRow` formater si vous êtes sûr que les données de la table peuvent être formatées en tant que JSON sans perdre aucune information. + +### Utilisation de Structures imbriquées {#jsoneachrow-nested} + +Si vous avez une table avec [Imbriqué](../data_types/nested_data_structures/nested.md) colonnes de type de données, vous pouvez insérer des données JSON avec la même structure. Activer cette fonctionnalité avec le [input\_format\_import\_nested\_json](../operations/settings/settings.md#settings-input_format_import_nested_json) paramètre. + +Par exemple, considérez le tableau suivant: + +``` sql +CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory +``` + +Comme vous pouvez le voir dans la `Nested` description du type de données, ClickHouse traite chaque composant de la structure imbriquée comme une colonne distincte (`n.s` et `n.i` pour notre table). Vous pouvez insérer des données de la manière suivante: + +``` sql +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]} +``` + +Pour insérer des données en tant qu'objet JSON hiérarchique, définissez [input\_format\_import\_nested\_json=1](../operations/settings/settings.md#settings-input_format_import_nested_json). + +``` json +{ + "n": { + "s": ["abc", "def"], + "i": [1, 23] + } +} +``` + +Sans ce paramètre, ClickHouse lance une exception. + +``` sql +SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json' +``` + +``` text +┌─name────────────────────────────┬─value─┐ +│ input_format_import_nested_json │ 0 │ +└─────────────────────────────────┴───────┘ +``` + +``` sql +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}} +``` + +``` text +Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1) +``` + +``` sql +SET input_format_import_nested_json=1 +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}} +SELECT * FROM json_each_row_nested +``` + +``` text +┌─n.s───────────┬─n.i────┐ +│ ['abc','def'] │ [1,23] │ +└───────────────┴────────┘ +``` + +## Natif {#native} + +Le format le plus efficace. Les données sont écrites et lues par des blocs au format binaire. Pour chaque bloc, le nombre de lignes, le nombre de colonnes, les noms et types de colonnes et les parties de colonnes de ce bloc sont enregistrés les uns après les autres. En d'autres termes, ce format est “columnar” – it doesn't convert columns to rows. This is the format used in the native interface for interaction between servers, for using the command-line client, and for C++ clients. + +Vous pouvez utiliser ce format pour générer rapidement des vidages qui ne peuvent être lus que par le SGBD ClickHouse. Cela n'a pas de sens de travailler avec ce format vous-même. + +## NULL {#null} + +Rien n'est sortie. Cependant, la requête est traitée et, lors de l'utilisation du client de ligne de commande, les données sont transmises au client. Ceci est utilisé pour les tests, y compris les tests de performance. +Évidemment, ce format n'est approprié que pour la sortie, pas pour l'analyse. + +## Joli {#pretty} + +Affiche les données sous forme de tables Unicode-art, en utilisant également des séquences d'échappement ANSI pour définir les couleurs dans le terminal. +Une grille complète de la table est dessinée, et chaque ligne occupe deux lignes dans le terminal. +Chaque bloc de résultat est sorti sous la forme d'une table séparée. Ceci est nécessaire pour que les blocs puissent être sortis sans résultats de mise en mémoire tampon (la mise en mémoire tampon serait nécessaire pour pré-calculer la largeur visible de toutes les valeurs). + +[NULL](../query_language/syntax.md) est sortie `ᴺᵁᴸᴸ`. + +Exemple (montré pour le [PrettyCompact](#prettycompact) format): + +``` sql +SELECT * FROM t_null +``` + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +Les lignes ne sont pas échappées dans les formats Pretty\*. Exemple est montré pour la [PrettyCompact](#prettycompact) format: + +``` sql +SELECT 'String with \'quotes\' and \t character' AS Escaping_test +``` + +``` text +┌─Escaping_test────────────────────────┐ +│ String with 'quotes' and character │ +└──────────────────────────────────────┘ +``` + +Pour éviter de déverser trop de données sur le terminal, seules les 10 000 premières lignes sont imprimées. Si le nombre de lignes est supérieur ou égal à 10 000, le message “Showed first 10 000” est imprimé. +Ce format n'est approprié que pour la sortie d'un résultat de requête, mais pas pour l'analyse (récupération des données à insérer dans une table). + +Le joli format prend en charge la sortie des valeurs totales (lors de L'utilisation avec des totaux) et des extrêmes (lorsque ‘extremes’ est réglé sur 1). Dans ces cas, les valeurs totales et les valeurs extrêmes sont sorties après les données principales, dans des tableaux séparés. Exemple (montré pour le [PrettyCompact](#prettycompact) format): + +``` sql +SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT PrettyCompact +``` + +``` text +┌──EventDate─┬───────c─┐ +│ 2014-03-17 │ 1406958 │ +│ 2014-03-18 │ 1383658 │ +│ 2014-03-19 │ 1405797 │ +│ 2014-03-20 │ 1353623 │ +│ 2014-03-21 │ 1245779 │ +│ 2014-03-22 │ 1031592 │ +│ 2014-03-23 │ 1046491 │ +└────────────┴─────────┘ + +Totals: +┌──EventDate─┬───────c─┐ +│ 0000-00-00 │ 8873898 │ +└────────────┴─────────┘ + +Extremes: +┌──EventDate─┬───────c─┐ +│ 2014-03-17 │ 1031592 │ +│ 2014-03-23 │ 1406958 │ +└────────────┴─────────┘ +``` + +## PrettyCompact {#prettycompact} + +Diffère de [Joli](#pretty) en ce que la grille est dessinée entre les lignes et le résultat est plus compact. +Ce format est utilisé par défaut dans le client de ligne de commande en mode interactif. + +## PrettyCompactMonoBlock {#prettycompactmonoblock} + +Diffère de [PrettyCompact](#prettycompact) dans ce cas, jusqu'à 10 000 lignes sont mises en mémoire tampon, puis sorties en tant que table unique, pas par blocs. + +## PrettyNoEscapes {#prettynoescapes} + +Diffère de Pretty en ce que les séquences d'échappement ANSI ne sont pas utilisées. Ceci est nécessaire pour afficher ce format dans un navigateur, ainsi que pour utiliser le ‘watch’ utilitaire de ligne de commande. + +Exemple: + +``` bash +$ watch -n1 "clickhouse-client --query='SELECT event, value FROM system.events FORMAT PrettyCompactNoEscapes'" +``` + +Vous pouvez utiliser L'interface HTTP pour afficher dans le navigateur. + +### Joliscompactnoescapes {#prettycompactnoescapes} + +Le même que le réglage précédent. + +### PrettySpaceNoEscapes {#prettyspacenoescapes} + +Le même que le réglage précédent. + +## PrettySpace {#prettyspace} + +Diffère de [PrettyCompact](#prettycompact) dans cet espace (caractères d'espace) est utilisé à la place de la grille. + +## RowBinary {#rowbinary} + +Formats et analyse les données par ligne au format binaire. Les lignes et les valeurs sont répertoriées consécutivement, sans séparateurs. +Ce format est moins efficace que le format natif car il est basé sur des lignes. + +Les entiers utilisent une représentation little-endian de longueur fixe. Par exemple, UInt64 utilise 8 octets. +DateTime est représenté par UInt32 contenant L'horodatage Unix comme valeur. +Date est représenté comme un objet UInt16 qui contient le nombre de jours depuis 1970-01-01 comme valeur. +La chaîne est représentée par une longueur varint (non signée [LEB128](https://en.wikipedia.org/wiki/LEB128)), suivie par les octets de la chaîne. +FixedString est représenté simplement comme une séquence d'octets. + +Le tableau est représenté sous la forme d'une longueur varint (non signée [LEB128](https://en.wikipedia.org/wiki/LEB128)), suivie par les éléments de la matrice. + +Pour [NULL](../query_language/syntax.md#null-literal) un soutien, un octet supplémentaire contenant 1 ou 0 est ajouté avant chaque [Nullable](../data_types/nullable.md) valeur. Si la valeur est 1, alors la valeur est `NULL` et cet octet est interprétée comme une valeur distincte. Si 0, la valeur après l'octet n'est pas `NULL`. + +## Rowbinarywithnamesettypes {#rowbinarywithnamesandtypes} + +Semblable à [RowBinary](#rowbinary) mais avec l'ajout de l'en-tête: + +- [LEB128](https://en.wikipedia.org/wiki/LEB128)- nombre codé de colonnes (N) +- N `String`s spécification des noms de colonnes +- N `String`s spécification des types de colonnes + +## Valeur {#data-format-values} + +Imprime chaque ligne entre parenthèses. Les lignes sont séparées par des virgules. Il n'y a pas de virgule après la dernière ligne. Les valeurs entre parenthèses sont également séparées par des virgules. Les nombres sont produits dans un format décimal sans guillemets. Les tableaux sont affichés entre crochets. Les chaînes, les dates et les dates avec des heures sont affichées entre guillemets. Les règles d'échappement et l'analyse sont similaires à [TabSeparated](#tabseparated) format. Pendant le formatage, les espaces supplémentaires ne sont pas insérés, mais pendant l'analyse, ils sont autorisés et ignorés (sauf pour les espaces à l'intérieur des valeurs de tableau, qui ne sont pas autorisés). [NULL](../query_language/syntax.md) est représentée comme `NULL`. + +The minimum set of characters that you need to escape when passing data in Values ​​format: single quotes and backslashes. + +C'est le format qui est utilisé dans `INSERT INTO t VALUES ...`, mais vous pouvez également l'utiliser pour le formatage des résultats de requête. + +Voir aussi: [input\_format\_values\_interpret\_expressions](../operations/settings/settings.md#settings-input_format_values_interpret_expressions) et [input\_format\_values\_deduce\_templates\_of\_expressions](../operations/settings/settings.md#settings-input_format_values_deduce_templates_of_expressions) paramètre. + +## Vertical {#vertical} + +Imprime chaque valeur sur une ligne distincte avec le nom de colonne spécifié. Ce format est pratique pour imprimer une ou plusieurs lignes si chaque ligne est constituée d'un grand nombre de colonnes. + +[NULL](../query_language/syntax.md) est sortie `ᴺᵁᴸᴸ`. + +Exemple: + +``` sql +SELECT * FROM t_null FORMAT Vertical +``` + +``` text +Row 1: +────── +x: 1 +y: ᴺᵁᴸᴸ +``` + +Les lignes ne sont pas échappées au format Vertical: + +``` sql +SELECT 'string with \'quotes\' and \t with some special \n characters' AS test FORMAT Vertical +``` + +``` text +Row 1: +────── +test: string with 'quotes' and with some special + characters +``` + +Ce format n'est approprié que pour la sortie d'un résultat de requête, mais pas pour l'analyse (récupération des données à insérer dans une table). + +## VerticalRaw {#verticalraw} + +Semblable à [Vertical](#vertical), mais avec échapper désactivé. Ce format ne convient que pour la sortie des résultats de requête, pas pour l'analyse (recevoir des données et les insérer dans la table). + +## XML {#xml} + +Le format XML ne convient que pour la sortie, pas pour l'analyse. Exemple: + +``` xml + + + + + + SearchPhrase + String + + + count() + UInt64 + + + + + + + 8267016 + + + bathroom interior design + 2166 + + + yandex + 1655 + + + 2014 spring fashion + 1549 + + + freeform photos + 1480 + + + angelina jolie + 1245 + + + omsk + 1112 + + + photos of dog breeds + 1091 + + + curtain designs + 1064 + + + baku + 1000 + + + 10 + 141137 + +``` + +Si le nom de colonne n'a pas un format acceptable, juste ‘field’ est utilisé comme le nom de l'élément. En général, la structure XML suit la structure JSON. +Just as for JSON, invalid UTF-8 sequences are changed to the replacement character � so the output text will consist of valid UTF-8 sequences. + +Dans les valeurs de chaîne, les caractères `<` et `&` sont échappés comme `<` et `&`. + +Les tableaux sont produits comme `HelloWorld...`,et n-uplets d' `HelloWorld...`. + +## CapnProto {#capnproto} + +Cap'n Proto est un format de message binaire similaire aux tampons de protocole et Thrift, mais pas comme JSON ou MessagePack. + +Les messages Cap'n Proto sont strictement typés et ne sont pas auto-descriptifs, ce qui signifie qu'ils ont besoin d'une description de schéma externe. Le schéma est appliqué à la volée et mise en cache pour chaque requête. + +``` bash +$ cat capnproto_messages.bin | clickhouse-client --query "INSERT INTO test.hits FORMAT CapnProto SETTINGS format_schema='schema:Message'" +``` + +Où `schema.capnp` ressemble à ceci: + +``` capnp +struct Message { + SearchPhrase @0 :Text; + c @1 :Uint64; +} +``` + +La désérialisation est efficace et n'augmente généralement pas la charge du système. + +Voir aussi [Schéma De Format](#formatschema). + +## Protobuf {#protobuf} + +Protobuf-est un [Protocol Buffers](https://developers.google.com/protocol-buffers/) format. + +Ce format nécessite un schéma de format externe. Le schéma est mis en cache entre les requêtes. +Clickhouse prend en charge les deux `proto2` et `proto3` syntaxe. Les champs répétés/optionnels/obligatoires sont pris en charge. + +Exemples d'utilisation: + +``` sql +SELECT * FROM test.table FORMAT Protobuf SETTINGS format_schema = 'schemafile:MessageType' +``` + +``` bash +cat protobuf_messages.bin | clickhouse-client --query "INSERT INTO test.table FORMAT Protobuf SETTINGS format_schema='schemafile:MessageType'" +``` + +où le fichier `schemafile.proto` ressemble à ceci: + +``` capnp +syntax = "proto3"; + +message MessageType { + string name = 1; + string surname = 2; + uint32 birthDate = 3; + repeated string phoneNumbers = 4; +}; +``` + +Pour trouver la correspondance entre les colonnes de table et les champs du type de message des tampons de protocole, ClickHouse compare leurs noms. +Cette comparaison est insensible à la casse et les caractères `_` (trait de soulignement) et `.` (dot) sont considérés comme égaux. +Si les types d'une colonne et d'un champ de message des tampons de protocole sont différents, la conversion nécessaire est appliquée. + +Les messages imbriqués sont pris en charge. Par exemple, pour le champ `z` dans le type de message suivant + +``` capnp +message MessageType { + message XType { + message YType { + int32 z; + }; + repeated YType y; + }; + XType x; +}; +``` + +ClickHouse tente de trouver une colonne nommée `x.y.z` (ou `x_y_z` ou `X.y_Z` et ainsi de suite). +Les messages imbriqués conviennent à l'entrée ou à la sortie d'un [structures de données imbriquées](../data_types/nested_data_structures/nested.md). + +Valeurs par défaut définies dans un schéma protobuf comme ceci + +``` capnp +syntax = "proto2"; + +message MessageType { + optional int32 result_per_page = 3 [default = 10]; +} +``` + +ne sont pas appliquées; la [valeurs par défaut de la table](../query_language/create.md#create-default-values) sont utilisés à leur place. + +Clickhouse entrées et sorties messages protobuf dans le `length-delimited` format. +Cela signifie avant que chaque message devrait être écrit sa longueur comme un [varint](https://developers.google.com/protocol-buffers/docs/encoding#varints). +Voir aussi [comment lire / écrire des messages protobuf délimités par la longueur dans les langues populaires](https://cwiki.apache.org/confluence/display/GEODE/Delimiting+Protobuf+Messages). + +## Avro {#data-format-avro} + +[Apache Avro](http://avro.apache.org/) est un cadre de sérialisation de données orienté ligne développé dans le projet Hadoop D'Apache. + +ClickHouse Avro format prend en charge la lecture et l'écriture [Fichiers de données Avro](http://avro.apache.org/docs/current/spec.html#Object+Container+Files). + +### Types De Données Correspondant {#data_types-matching} + +Le tableau ci-dessous montre les types de données pris en charge et comment ils correspondent à ClickHouse [types de données](../data_types/index.md) dans `INSERT` et `SELECT` requête. + +| Type de données Avro `INSERT` | Type de données ClickHouse | Type de données Avro `SELECT` | +|---------------------------------------------|-----------------------------------------------------------------------------------------|-------------------------------| +| `boolean`, `int`, `long`, `float`, `double` | [Int (8/16/32)](../data_types/int_uint.md), [UInt (8/16/32)](../data_types/int_uint.md) | `int` | +| `boolean`, `int`, `long`, `float`, `double` | [Int64](../data_types/int_uint.md), [UInt64](../data_types/int_uint.md) | `long` | +| `boolean`, `int`, `long`, `float`, `double` | [Float32](../data_types/float.md) | `float` | +| `boolean`, `int`, `long`, `float`, `double` | [Float64](../data_types/float.md) | `double` | +| `bytes`, `string`, `fixed`, `enum` | [Chaîne](../data_types/string.md) | `bytes` | +| `bytes`, `string`, `fixed` | [FixedString (N)](../data_types/fixedstring.md) | `fixed(N)` | +| `enum` | [Enum (8/16)](../data_types/enum.md) | `enum` | +| `array(T)` | [Array(T)](../data_types/array.md) | `array(T)` | +| `union(null, T)`, `union(T, null)` | [Nullable (T)](../data_types/date.md) | `union(null, T)` | +| `null` | [Les Valeurs Null(Nothing)](../data_types/special_data_types/nothing.md) | `null` | +| `int (date)` \* | [Date](../data_types/date.md) | `int (date)` \* | +| `long (timestamp-millis)` \* | [DateTime64 (3)](../data_types/datetime.md) | `long (timestamp-millis)` \* | +| `long (timestamp-micros)` \* | [DateTime64 (6)](../data_types/datetime.md) | `long (timestamp-micros)` \* | + +\* [Types logiques Avro](http://avro.apache.org/docs/current/spec.html#Logical+Types) + +Types de données Avro non pris en charge: `record` (non-root), `map` + +Types de données logiques Avro non pris en charge: `uuid`, `time-millis`, `time-micros`, `duration` + +### Insertion De Données {#inserting-data-1} + +Pour insérer des données d'un fichier Avro dans la table ClickHouse: + +``` bash +$ cat file.avro | clickhouse-client --query="INSERT INTO {some_table} FORMAT Avro" +``` + +Le schéma racine du fichier Avro d'entrée doit être de `record` type. + +Pour trouver la correspondance entre les colonnes de table et les champs du schéma Avro ClickHouse compare leurs noms. Cette comparaison est sensible à la casse. +Les champs inutilisés sont ignorés. + +Les types de données des colonnes de la table ClickHouse peuvent différer des champs correspondants des données Avro insérées. Lors de l'insertion de données, ClickHouse interprète les types de données selon le tableau ci-dessus, puis [jeter](../query_language/functions/type_conversion_functions/#type_conversion_function-cast) les données au type de colonne correspondant. + +### La Sélection De Données {#selecting-data-1} + +Pour sélectionner des données de la table ClickHouse dans un fichier Avro: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Avro" > file.avro +``` + +Les noms de colonnes doivent: + +- commencer avec `[A-Za-z_]` +- par la suite contenir uniquement `[A-Za-z0-9_]` + +Sortie Avro fichier de compression et sync intervalle peut être configuré avec [output\_format\_avro\_codec](../operations/settings/settings.md#settings-output_format_avro_codec) et [output\_format\_avro\_sync\_interval](../operations/settings/settings.md#settings-output_format_avro_sync_interval) respectivement. + +## AvroConfluent {#data-format-avro-confluent} + +Avroconfluent prend en charge le décodage des messages Avro à objet unique couramment utilisés avec [Kafka](https://kafka.apache.org/) et [Confluentes Schéma De Registre](https://docs.confluent.io/current/schema-registry/index.html). + +Chaque message Avro intègre un id de schéma qui peut être résolu dans le schéma réel à l'aide du registre de schéma. + +Les schémas sont mis en cache une fois résolus. + +L'URL du registre de schéma est configurée avec [format\_avro\_schema\_registry\_url](../operations/settings/settings.md#settings-format_avro_schema_registry_url) + +### Types De Données Correspondant {#data_types-matching-1} + +Même que [Avro](#data-format-avro) + +### Utilisation {#usage} + +Pour vérifier rapidement la résolution du schéma, vous pouvez utiliser [kafkacat](https://github.com/edenhill/kafkacat) avec [clickhouse-local](../operations/utils/clickhouse-local.md): + +``` bash +$ kafkacat -b kafka-broker -C -t topic1 -o beginning -f '%s' -c 3 | clickhouse-local --input-format AvroConfluent --format_avro_schema_registry_url 'http://schema-registry' -S "field1 Int64, field2 String" -q 'select * from table' +1 a +2 b +3 c +``` + +Utiliser `AvroConfluent` avec [Kafka](../operations/table_engines/kafka.md): + +``` sql +CREATE TABLE topic1_stream +( + field1 String, + field2 String +) +ENGINE = Kafka() +SETTINGS +kafka_broker_list = 'kafka-broker', +kafka_topic_list = 'topic1', +kafka_group_name = 'group1', +kafka_format = 'AvroConfluent'; + +SET format_avro_schema_registry_url = 'http://schema-registry'; + +SELECT * FROM topic1_stream; +``` + +!!! note "Avertissement" + Paramètre `format_avro_schema_registry_url` doit être configuré dans `users.xml` afin de maintenir sa valeur après un redémarrage. + +## Parquet {#data-format-parquet} + +[Apache Parquet](http://parquet.apache.org/) est un format de stockage colonnaire répandu dans L'écosystème Hadoop. ClickHouse prend en charge les opérations de lecture et d'écriture pour ce format. + +### Types De Données Correspondant {#data_types-matching-2} + +Le tableau ci-dessous montre les types de données pris en charge et comment ils correspondent à ClickHouse [types de données](../data_types/index.md) dans `INSERT` et `SELECT` requête. + +| Type de données Parquet (`INSERT`) | Type de données ClickHouse | Type de données Parquet (`SELECT`) | +|------------------------------------|---------------------------------------------|------------------------------------| +| `UINT8`, `BOOL` | [UInt8](../data_types/int_uint.md) | `UINT8` | +| `INT8` | [Int8](../data_types/int_uint.md) | `INT8` | +| `UINT16` | [UInt16](../data_types/int_uint.md) | `UINT16` | +| `INT16` | [Int16](../data_types/int_uint.md) | `INT16` | +| `UINT32` | [UInt32](../data_types/int_uint.md) | `UINT32` | +| `INT32` | [Int32](../data_types/int_uint.md) | `INT32` | +| `UINT64` | [UInt64](../data_types/int_uint.md) | `UINT64` | +| `INT64` | [Int64](../data_types/int_uint.md) | `INT64` | +| `FLOAT`, `HALF_FLOAT` | [Float32](../data_types/float.md) | `FLOAT` | +| `DOUBLE` | [Float64](../data_types/float.md) | `DOUBLE` | +| `DATE32` | [Date](../data_types/date.md) | `UINT16` | +| `DATE64`, `TIMESTAMP` | [DateTime](../data_types/datetime.md) | `UINT32` | +| `STRING`, `BINARY` | [Chaîne](../data_types/string.md) | `STRING` | +| — | [FixedString](../data_types/fixedstring.md) | `STRING` | +| `DECIMAL` | [Décimal](../data_types/decimal.md) | `DECIMAL` | + +Clickhouse prend en charge la précision configurable de `Decimal` type. Le `INSERT` requête traite le Parquet `DECIMAL` tapez comme le ClickHouse `Decimal128` type. + +Types de données Parquet non pris en charge: `DATE32`, `TIME32`, `FIXED_SIZE_BINARY`, `JSON`, `UUID`, `ENUM`. + +Les types de données des colonnes de table ClickHouse peuvent différer des champs correspondants des données de Parquet insérées. Lors de l'insertion de données, ClickHouse interprète les types de données selon le tableau ci-dessus, puis [jeter](../query_language/functions/type_conversion_functions/#type_conversion_function-cast) les données de ce type de données qui est défini pour la colonne de la table ClickHouse. + +### Insertion et sélection de données {#inserting-and-selecting-data} + +Vous pouvez insérer des données Parquet à partir d'un fichier dans la table ClickHouse par la commande suivante: + +``` bash +$ cat {filename} | clickhouse-client --query="INSERT INTO {some_table} FORMAT Parquet" +``` + +Vous pouvez sélectionner des données à partir d'une table de ClickHouse et les enregistrer dans un fichier au format Parquet par la commande suivante: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Parquet" > {some_file.pq} +``` + +Pour échanger des données avec Hadoop, vous pouvez utiliser [Moteur de table HDFS](../operations/table_engines/hdfs.md). + +## ORC {#data-format-orc} + +[Apache ORC](https://orc.apache.org/) est un format de stockage colonnaire répandu dans L'écosystème Hadoop. Vous ne pouvez insérer des données dans ce format à ClickHouse. + +### Types De Données Correspondant {#data_types-matching-3} + +Le tableau ci-dessous montre les types de données pris en charge et comment ils correspondent à ClickHouse [types de données](../data_types/index.md) dans `INSERT` requête. + +| Type de données ORC (`INSERT`) | Type de données ClickHouse | +|--------------------------------|---------------------------------------| +| `UINT8`, `BOOL` | [UInt8](../data_types/int_uint.md) | +| `INT8` | [Int8](../data_types/int_uint.md) | +| `UINT16` | [UInt16](../data_types/int_uint.md) | +| `INT16` | [Int16](../data_types/int_uint.md) | +| `UINT32` | [UInt32](../data_types/int_uint.md) | +| `INT32` | [Int32](../data_types/int_uint.md) | +| `UINT64` | [UInt64](../data_types/int_uint.md) | +| `INT64` | [Int64](../data_types/int_uint.md) | +| `FLOAT`, `HALF_FLOAT` | [Float32](../data_types/float.md) | +| `DOUBLE` | [Float64](../data_types/float.md) | +| `DATE32` | [Date](../data_types/date.md) | +| `DATE64`, `TIMESTAMP` | [DateTime](../data_types/datetime.md) | +| `STRING`, `BINARY` | [Chaîne](../data_types/string.md) | +| `DECIMAL` | [Décimal](../data_types/decimal.md) | + +Clickhouse prend en charge la précision configurable de la `Decimal` type. Le `INSERT` requête traite de l'ORC `DECIMAL` tapez comme le ClickHouse `Decimal128` type. + +Types de données ORC non pris en charge: `DATE32`, `TIME32`, `FIXED_SIZE_BINARY`, `JSON`, `UUID`, `ENUM`. + +Les types de données des colonnes de la table ClickHouse ne doivent pas correspondre aux champs de données Orc correspondants. Lors de l'insertion de données, ClickHouse interprète les types de données selon le tableau ci-dessus, puis [jeter](../query_language/functions/type_conversion_functions/#type_conversion_function-cast) les données du type de données défini pour la colonne clickhouse table. + +### Insertion De Données {#inserting-data-2} + +Vous pouvez insérer des données ORC à partir d'un fichier dans la table ClickHouse par la commande suivante: + +``` bash +$ cat filename.orc | clickhouse-client --query="INSERT INTO some_table FORMAT ORC" +``` + +Pour échanger des données avec Hadoop, vous pouvez utiliser [Moteur de table HDFS](../operations/table_engines/hdfs.md). + +## Schéma De Format {#formatschema} + +Le nom du fichier contenant le schéma de format est défini par le paramètre `format_schema`. +Il est nécessaire de définir ce paramètre lorsqu'il est utilisé dans l'un des formats `Cap'n Proto` et `Protobuf`. +Le format de schéma est une combinaison d'un nom de fichier et le nom d'un type de message dans ce fichier, délimité par une virgule, +e.g. `schemafile.proto:MessageType`. +Si le fichier possède l'extension standard pour le format (par exemple, `.proto` pour `Protobuf`), +il peut être omis et dans ce cas, le format de schéma ressemble `schemafile:MessageType`. + +Si vous entrez ou sortez des données via le [client](../interfaces/cli.md) dans le [mode interactif](../interfaces/cli.md#cli_usage) le nom de fichier spécifié dans le format de schéma +peut contenir un chemin absolu, soit un chemin relatif au répertoire courant sur le client. +Si vous utilisez le client dans le [mode batch](../interfaces/cli.md#cli_usage), le chemin d'accès au schéma doit être relatif pour des raisons de sécurité. + +Si vous entrez ou sortez des données via le [Interface HTTP](../interfaces/http.md) le nom de fichier spécifié dans le format de schéma +doit être situé dans le répertoire spécifié dans [format\_schema\_path](../operations/server_settings/settings.md#server_settings-format_schema_path) +dans la configuration du serveur. + +## Sauter Les Erreurs {#skippingerrors} + +Certains formats tels que `CSV`, `TabSeparated`, `TSKV`, `JSONEachRow`, `Template`, `CustomSeparated` et `Protobuf` pouvez ignorer brisé ligne si erreur d'analyse s'est produite et poursuivre l'analyse à partir du début de la ligne suivante. Voir [input\_format\_allow\_errors\_num](../operations/settings/settings.md#settings-input_format_allow_errors_num) et +[input\_format\_allow\_errors\_ratio](../operations/settings/settings.md#settings-input_format_allow_errors_ratio) paramètre. +Limitation: +- En cas d'erreur d'analyse `JSONEachRow` ignore toutes les données jusqu'à la nouvelle ligne (ou EOF), donc les lignes doivent être délimitées par `\n` pour compter les erreurs correctement. +- `Template` et `CustomSeparated` utilisez delimiter après la dernière colonne et delimiter entre les lignes pour trouver le début de la ligne suivante, donc sauter les erreurs ne fonctionne que si au moins l'une d'entre elles n'est pas vide. + +[Article Original](https://clickhouse.tech/docs/en/interfaces/formats/) diff --git a/docs/fr/interfaces/http.md b/docs/fr/interfaces/http.md new file mode 100644 index 00000000000..a8a6bc5f37d --- /dev/null +++ b/docs/fr/interfaces/http.md @@ -0,0 +1,285 @@ +--- +machine_translated: true +--- + +# Interface HTTP {#http-interface} + +L'interface HTTP vous permet D'utiliser ClickHouse sur n'importe quelle plate-forme à partir de n'importe quel langage de programmation. Nous l'utilisons pour travailler à partir de Java et Perl, ainsi que des scripts shell. Dans d'autres départements, L'interface HTTP est utilisée à partir de Perl, Python et Go. L'interface HTTP est plus limitée que l'interface native, mais elle a une meilleure compatibilité. + +Par défaut, clickhouse-server écoute HTTP sur le port 8123 (cela peut être modifié dans la configuration). + +Si vous faites une requête GET / sans Paramètres, elle renvoie le code de réponse 200 et la chaîne définie dans [http\_server\_default\_response](../operations/server_settings/settings.md#server_settings-http_server_default_response) valeur par défaut “Ok.” (avec un saut de ligne à la fin) + +``` bash +$ curl 'http://localhost:8123/' +Ok. +``` + +Utilisez la requête GET /ping dans les scripts de vérification de la santé. Ce gestionnaire revient toujours “Ok.” (avec un saut de ligne à la fin). Disponible à partir de la version 18.12.13. + +``` bash +$ curl 'http://localhost:8123/ping' +Ok. +``` + +Envoyer la demande sous forme D'URL ‘query’ paramètre, ou comme un POSTE. Ou envoyer le début de la requête dans l' ‘query’ paramètre, et le reste dans le POST (nous expliquerons plus tard pourquoi cela est nécessaire). La taille de L'URL est limitée à 16 Ko, alors gardez cela à l'esprit lors de l'envoi de requêtes volumineuses. + +En cas de succès, vous recevez le code de réponse 200 et le résultat dans le corps de réponse. +Si une erreur se produit, vous recevez le code de réponse 500 et un texte de description de l'erreur dans le corps de la réponse. + +Lorsque vous utilisez la méthode GET, ‘readonly’ est définie. En d'autres termes, pour les requêtes qui modifient les données, vous ne pouvez utiliser que la méthode POST. Vous pouvez envoyer la requête elle-même dans le corps du message ou dans le paramètre URL. + +Exemple: + +``` bash +$ curl 'http://localhost:8123/?query=SELECT%201' +1 + +$ wget -O- -q 'http://localhost:8123/?query=SELECT 1' +1 + +$ echo -ne 'GET /?query=SELECT%201 HTTP/1.0\r\n\r\n' | nc localhost 8123 +HTTP/1.0 200 OK +Date: Wed, 27 Nov 2019 10:30:18 GMT +Connection: Close +Content-Type: text/tab-separated-values; charset=UTF-8 +X-ClickHouse-Server-Display-Name: clickhouse.ru-central1.internal +X-ClickHouse-Query-Id: 5abe861c-239c-467f-b955-8a201abb8b7f +X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0"} + +1 +``` + +Comme vous pouvez le voir, curl est un peu gênant en ce sens que les espaces doivent être échappés URL. +Bien que wget échappe à tout lui-même, nous ne recommandons pas de l'utiliser car il ne fonctionne pas bien sur HTTP 1.1 lors de l'utilisation de keep-alive et Transfer-Encoding: chunked. + +``` bash +$ echo 'SELECT 1' | curl 'http://localhost:8123/' --data-binary @- +1 + +$ echo 'SELECT 1' | curl 'http://localhost:8123/?query=' --data-binary @- +1 + +$ echo '1' | curl 'http://localhost:8123/?query=SELECT' --data-binary @- +1 +``` + +Si une partie de la requête est envoyée dans le paramètre et une partie dans la publication, un saut de ligne est inséré entre ces deux parties de données. +Exemple (cela ne fonctionnera pas): + +``` bash +$ echo 'ECT 1' | curl 'http://localhost:8123/?query=SEL' --data-binary @- +Code: 59, e.displayText() = DB::Exception: Syntax error: failed at position 0: SEL +ECT 1 +, expected One of: SHOW TABLES, SHOW DATABASES, SELECT, INSERT, CREATE, ATTACH, RENAME, DROP, DETACH, USE, SET, OPTIMIZE., e.what() = DB::Exception +``` + +Par défaut, les données sont renvoyées au format TabSeparated (pour plus d'informations, voir “Formats” section). +Vous utilisez la clause FORMAT de la requête pour demander tout autre format. + +``` bash +$ echo 'SELECT 1 FORMAT Pretty' | curl 'http://localhost:8123/?' --data-binary @- +┏━━━┓ +┃ 1 ┃ +┡━━━┩ +│ 1 │ +└───┘ +``` + +La méthode POST de transmission des données est nécessaire pour les requêtes INSERT. Dans ce cas, vous pouvez écrire le début de la requête dans le paramètre URL et utiliser POST pour transmettre les données à insérer. Les données à insérer pourraient être, par exemple, un vidage séparé par tabulation de MySQL. De cette façon, la requête INSERT remplace LOAD DATA LOCAL INFILE de MySQL. + +Exemples: création d'une table: + +``` bash +$ echo 'CREATE TABLE t (a UInt8) ENGINE = Memory' | curl 'http://localhost:8123/' --data-binary @- +``` + +Utilisation de la requête D'insertion familière pour l'insertion de données: + +``` bash +$ echo 'INSERT INTO t VALUES (1),(2),(3)' | curl 'http://localhost:8123/' --data-binary @- +``` + +Les données peuvent être envoyées séparément de la requête: + +``` bash +$ echo '(4),(5),(6)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20VALUES' --data-binary @- +``` + +Vous pouvez spécifier n'importe quel format de données. Le ‘Values’ le format est le même que ce qui est utilisé lors de L'écriture INSERT dans les valeurs t: + +``` bash +$ echo '(7),(8),(9)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20Values' --data-binary @- +``` + +Pour insérer des données à partir d'un vidage séparé par des tabulations, spécifiez le format correspondant: + +``` bash +$ echo -ne '10\n11\n12\n' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20TabSeparated' --data-binary @- +``` + +La lecture de la table des matières. Les données sont sorties dans un ordre aléatoire en raison d'un traitement de requête parallèle: + +``` bash +$ curl 'http://localhost:8123/?query=SELECT%20a%20FROM%20t' +7 +8 +9 +10 +11 +12 +1 +2 +3 +4 +5 +6 +``` + +Suppression de la table. + +``` bash +$ echo 'DROP TABLE t' | curl 'http://localhost:8123/' --data-binary @- +``` + +Pour les requêtes réussies qui ne renvoient pas de table de données, un corps de réponse vide est renvoyé. + +Vous pouvez utiliser le format de compression ClickHouse interne lors de la transmission de données. Les données compressées ont un format non standard, et vous devrez utiliser le spécial `clickhouse-compressor` programme de travail (il s'est installé avec le `clickhouse-client` paquet). Pour augmenter l'efficacité de l'insertion de données, vous pouvez désactiver la vérification de la somme de contrôle côté serveur en utilisant [http\_native\_compression\_disable\_checksumming\_on\_decompress](../operations/settings/settings.md#settings-http_native_compression_disable_checksumming_on_decompress) paramètre. + +Si vous avez spécifié `compress=1` dans l'URL, le serveur compresse les données qu'il vous envoie. +Si vous avez spécifié `decompress=1` dans L'URL, le serveur décompresse les mêmes données que vous transmettez `POST` méthode. + +Vous pouvez également choisir d'utiliser [La compression HTTP](https://en.wikipedia.org/wiki/HTTP_compression). Pour envoyer un compressé `POST` demande, ajouter l'en-tête de requête `Content-Encoding: compression_method`. Pour que ClickHouse compresse la réponse, vous devez ajouter `Accept-Encoding: compression_method`. Supports ClickHouse `gzip`, `br`, et `deflate` [méthodes de compression](https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens). Pour activer la compression HTTP, vous devez utiliser le ClickHouse [enable\_http\_compression](../operations/settings/settings.md#settings-enable_http_compression) paramètre. Vous pouvez configurer le niveau de compression des données dans le [http\_zlib\_compression\_level](#settings-http_zlib_compression_level) pour toutes les méthodes de compression. + +Vous pouvez l'utiliser pour réduire le trafic réseau lors de la transmission d'une grande quantité de données, ou pour créer des vidages qui sont immédiatement compressés. + +Exemples d'envoi de données avec compression: + +``` bash +#Sending data to the server: +$ curl -vsS "http://localhost:8123/?enable_http_compression=1" -d 'SELECT number FROM system.numbers LIMIT 10' -H 'Accept-Encoding: gzip' + +#Sending data to the client: +$ echo "SELECT 1" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/' +``` + +!!! note "Note" + Certains clients HTTP peuvent décompresser les données du serveur par défaut (avec `gzip` et `deflate`) et vous pouvez obtenir des données décompressées même si vous utilisez les paramètres de compression correctement. + +Vous pouvez utiliser l' ‘database’ Paramètre URL pour spécifier la base de données par défaut. + +``` bash +$ echo 'SELECT number FROM numbers LIMIT 10' | curl 'http://localhost:8123/?database=system' --data-binary @- +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +``` + +Par défaut, la base de données enregistrée dans les paramètres du serveur est utilisée comme base de données par défaut. Par défaut, c'est la base de données appelée ‘default’. Alternativement, vous pouvez toujours spécifier la base de données en utilisant un point avant le nom de la table. + +Le nom d'utilisateur et le mot de passe peuvent être indiqués de l'une des trois façons suivantes: + +1. Utilisation de L'authentification de base HTTP. Exemple: + + + +``` bash +$ echo 'SELECT 1' | curl 'http://user:password@localhost:8123/' -d @- +``` + +1. Dans le ‘user’ et ‘password’ Les paramètres d'URL. Exemple: + + + +``` bash +$ echo 'SELECT 1' | curl 'http://localhost:8123/?user=user&password=password' -d @- +``` + +1. Utiliser ‘X-ClickHouse-User’ et ‘X-ClickHouse-Key’ tête. Exemple: + + + +``` bash +$ echo 'SELECT 1' | curl -H 'X-ClickHouse-User: user' -H 'X-ClickHouse-Key: password' 'http://localhost:8123/' -d @- +``` + +Si le nom d'utilisateur n'est spécifié, le `default` le nom est utilisé. Si le mot de passe n'est spécifié, le mot de passe vide est utilisé. +Vous pouvez également utiliser les paramètres D'URL pour spécifier des paramètres pour le traitement d'une seule requête ou de profils entiers de paramètres. Exemple: http: / / localhost: 8123/?profil = web & max\_rows\_to\_read=1000000000 & query=sélectionner + 1 + +Pour plus d'informations, voir le [Paramètre](../operations/settings/index.md) section. + +``` bash +$ echo 'SELECT number FROM system.numbers LIMIT 10' | curl 'http://localhost:8123/?' --data-binary @- +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +``` + +Pour plus d'informations sur les autres paramètres, consultez la section “SET”. + +De même, vous pouvez utiliser des sessions ClickHouse dans le protocole HTTP. Pour ce faire, vous devez ajouter l' `session_id` GET paramètre à la demande. Vous pouvez utiliser n'importe quelle chaîne comme ID de session. Par défaut, la session est terminée après 60 secondes d'inactivité. Pour modifier ce délai d'attente, de modifier la `default_session_timeout` dans la configuration du serveur, ou ajoutez le `session_timeout` GET paramètre à la demande. Pour vérifier l'état de la session, utilisez `session_check=1` paramètre. Une seule requête à la fois peut être exécutée dans une seule session. + +Vous pouvez recevoir des informations sur le déroulement d'une requête en `X-ClickHouse-Progress` en-têtes de réponse. Pour ce faire, activez [send\_progress\_in\_http\_headers](../operations/settings/settings.md#settings-send_progress_in_http_headers). Exemple de l'en-tête de séquence: + +``` text +X-ClickHouse-Progress: {"read_rows":"2752512","read_bytes":"240570816","total_rows_to_read":"8880128"} +X-ClickHouse-Progress: {"read_rows":"5439488","read_bytes":"482285394","total_rows_to_read":"8880128"} +X-ClickHouse-Progress: {"read_rows":"8783786","read_bytes":"819092887","total_rows_to_read":"8880128"} +``` + +Possibles champs d'en-tête: + +- `read_rows` — Number of rows read. +- `read_bytes` — Volume of data read in bytes. +- `total_rows_to_read` — Total number of rows to be read. +- `written_rows` — Number of rows written. +- `written_bytes` — Volume of data written in bytes. + +Les requêtes en cours d'exécution ne s'arrêtent pas automatiquement si la connexion HTTP est perdue. L'analyse et le formatage des données sont effectués côté serveur et l'utilisation du réseau peut s'avérer inefficace. +Facultatif ‘query\_id’ le paramètre peut être passé comme ID de requête (n'importe quelle chaîne). Pour plus d'informations, consultez la section “Settings, replace\_running\_query”. + +Facultatif ‘quota\_key’ le paramètre peut être passé comme clé de quota (n'importe quelle chaîne). Pour plus d'informations, consultez la section “Quotas”. + +L'interface HTTP permet de transmettre des données externes (tables temporaires externes) pour l'interrogation. Pour plus d'informations, consultez la section “External data for query processing”. + +## Tampon De Réponse {#response-buffering} + +Vous pouvez activer la mise en mémoire tampon des réponses côté serveur. Le `buffer_size` et `wait_end_of_query` Les paramètres D'URL sont fournis à cette fin. + +`buffer_size` détermine le nombre d'octets dans le résultat de tampon dans la mémoire du serveur. Si un corps de résultat est supérieur à ce seuil, le tampon est écrit sur le canal HTTP et les données restantes sont envoyées directement au canal HTTP. + +Pour vous assurer que la réponse entière est mise en mémoire tampon, définissez `wait_end_of_query=1`. Dans ce cas, les données ne sont pas stockées dans la mémoire tampon temporaire du serveur de fichiers. + +Exemple: + +``` bash +$ curl -sS 'http://localhost:8123/?max_result_bytes=4000000&buffer_size=3000000&wait_end_of_query=1' -d 'SELECT toUInt8(number) FROM system.numbers LIMIT 9000000 FORMAT RowBinary' +``` + +Utilisez la mise en mémoire tampon pour éviter les situations où une erreur de traitement de requête s'est produite après l'envoi du code de réponse et des en-têtes HTTP au client. Dans cette situation, un message d'erreur est écrit à la fin du corps de la réponse, et du côté client, l'erreur ne peut être détectée qu'à l'étape d'analyse. + +### Requêtes avec paramètres {#cli-queries-with-parameters} + +Vous pouvez créer une requête avec paramètres et transmettre des valeurs des paramètres de la requête HTTP. Pour plus d'informations, voir [Requêtes avec des paramètres pour CLI](cli.md#cli-queries-with-parameters). + +### Exemple {#example} + +``` bash +$ curl -sS "
?param_id=2¶m_phrase=test" -d "SELECT * FROM table WHERE int_column = {id:UInt8} and string_column = {phrase:String}" +``` + +[Article Original](https://clickhouse.tech/docs/en/interfaces/http_interface/) diff --git a/docs/fr/interfaces/index.md b/docs/fr/interfaces/index.md new file mode 100644 index 00000000000..99c81e26e1b --- /dev/null +++ b/docs/fr/interfaces/index.md @@ -0,0 +1,25 @@ +--- +machine_translated: true +--- + +# Interface {#interfaces} + +ClickHouse fournit deux interfaces réseau (les deux peuvent être encapsulées en option dans TLS pour plus de sécurité): + +- [HTTP](http.md) qui est documenté et facile à utiliser directement. +- [Natif de TCP](tcp.md) qui a moins de frais généraux. + +Dans la plupart des cas, il est recommandé d'utiliser un outil ou une bibliothèque approprié au lieu d'interagir directement avec ceux-ci. Officiellement pris en charge par Yandex sont les suivants: + +- [Client de ligne de commande](cli.md) +- [JDBC](jdbc.md) +- [Pilote ODBC](odbc.md) +- [Bibliothèque client c++ ](cpp.md) + +Il existe également un large éventail de bibliothèques tierces pour travailler avec ClickHouse: + +- [Bibliothèques clientes](third-party/client_libraries.md) +- [Intégration](third-party/integrations.md) +- [Les interfaces visuelles](third-party/gui.md) + +[Article Original](https://clickhouse.tech/docs/en/interfaces/) diff --git a/docs/fr/interfaces/jdbc.md b/docs/fr/interfaces/jdbc.md new file mode 100644 index 00000000000..8912124ff39 --- /dev/null +++ b/docs/fr/interfaces/jdbc.md @@ -0,0 +1,12 @@ +--- +machine_translated: true +--- + +# JDBC {#jdbc-driver} + +- **[Pilote officiel](https://github.com/ClickHouse/clickhouse-jdbc)** +- Les pilotes tiers: + - [ClickHouse-natif-JDBC](https://github.com/housepower/ClickHouse-Native-JDBC) + - [clickhouse4j](https://github.com/blynkkk/clickhouse4j) + +[Article Original](https://clickhouse.tech/docs/en/interfaces/jdbc/) diff --git a/docs/fr/interfaces/mysql.md b/docs/fr/interfaces/mysql.md new file mode 100644 index 00000000000..56f798517e7 --- /dev/null +++ b/docs/fr/interfaces/mysql.md @@ -0,0 +1,46 @@ +--- +machine_translated: true +--- + +# Interface MySQL {#mysql-interface} + +ClickHouse prend en charge le protocole de fil MySQL. Il peut être activé par [mysql\_port](../operations/server_settings/settings.md#server_settings-mysql_port) paramètre dans le fichier de configuration: + +``` xml +9004 +``` + +Exemple de connexion à l'aide d'outil de ligne de commande `mysql`: + +``` bash +$ mysql --protocol tcp -u default -P 9004 +``` + +Sortie si une connexion a réussi: + +``` text +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 4 +Server version: 20.2.1.1-ClickHouse + +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> +``` + +Pour la compatibilité avec tous les clients MySQL, il est recommandé de spécifier le mot de passe utilisateur avec [double SHA1](../operations/settings/settings_users.md#password_double_sha1_hex) dans le fichier de configuration. +Si le mot de passe de l'utilisateur est spécifié [SHA256](../operations/settings/settings_users.md#password_sha256_hex), certains clients ne pourront pas s'authentifier (mysqljs et anciennes versions de l'outil de ligne de commande mysql). + +Restriction: + +- les requêtes préparées ne sont pas prises en charge + +- certains types de données sont envoyés sous forme de chaînes + +[Article Original](https://clickhouse.tech/docs/en/interfaces/mysql/) diff --git a/docs/fr/interfaces/odbc.md b/docs/fr/interfaces/odbc.md new file mode 100644 index 00000000000..52b9fc7905e --- /dev/null +++ b/docs/fr/interfaces/odbc.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Pilote ODBC {#odbc-driver} + +- [Pilote officiel](https://github.com/ClickHouse/clickhouse-odbc). + +[Article Original](https://clickhouse.tech/docs/en/interfaces/odbc/) diff --git a/docs/fr/interfaces/tcp.md b/docs/fr/interfaces/tcp.md new file mode 100644 index 00000000000..a2566ae6a43 --- /dev/null +++ b/docs/fr/interfaces/tcp.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Interface Native (TCP) {#native-interface-tcp} + +Le protocole natif est utilisé dans le [client de ligne de commande](cli.md), pour la communication inter-serveur pendant le traitement de requête distribué, et également dans d'autres programmes C++. Malheureusement, le protocole clickhouse natif n'a pas encore de spécification formelle, mais il peut être rétro-conçu à partir du code source ClickHouse (démarrage [ici](https://github.com/ClickHouse/ClickHouse/tree/master/dbms/src/Client)) et/ou en interceptant et en analysant le trafic TCP. + +[Article Original](https://clickhouse.tech/docs/en/interfaces/tcp/) diff --git a/docs/fr/interfaces/third-party/client_libraries.md b/docs/fr/interfaces/third-party/client_libraries.md new file mode 100644 index 00000000000..7c5e51c6e02 --- /dev/null +++ b/docs/fr/interfaces/third-party/client_libraries.md @@ -0,0 +1,55 @@ +--- +machine_translated: true +--- + +# Bibliothèques clientes de développeurs tiers {#client-libraries-from-third-party-developers} + +!!! warning "Avertissement" + Yandex ne **pas** maintenir les bibliothèques énumérées ci-dessous et n'ont pas fait de tests approfondis pour assurer leur qualité. + +- Python + - [infi.clickhouse\_orm](https://github.com/Infinidat/infi.clickhouse_orm) + - [clickhouse-chauffeur](https://github.com/mymarilyn/clickhouse-driver) + - [clickhouse-client](https://github.com/yurial/clickhouse-client) + - [aiochclient](https://github.com/maximdanilchenko/aiochclient) +- PHP + - [smi2 / phpclickhouse](https://packagist.org/packages/smi2/phpClickHouse) + - [8bitov / clickhouse-PHP-client](https://packagist.org/packages/8bitov/clickhouse-php-client) + - [bozerkins / clickhouse-client](https://packagist.org/packages/bozerkins/clickhouse-client) + - [simpod / clickhouse-client](https://packagist.org/packages/simpod/clickhouse-client) + - [seva-code/php-cliquez-maison-client](https://packagist.org/packages/seva-code/php-click-house-client) + - [Client Seasclick c++ ](https://github.com/SeasX/SeasClick) +- Aller + - [clickhouse](https://github.com/kshvakov/clickhouse/) + - [aller-clickhouse](https://github.com/roistat/go-clickhouse) + - [mailrugo-clickhouse](https://github.com/mailru/go-clickhouse) + - [golang-clickhouse](https://github.com/leprosus/golang-clickhouse) +- NodeJs + - [clickhouse (NodeJs)](https://github.com/TimonKK/clickhouse) + - [node-clickhouse](https://github.com/apla/node-clickhouse) +- Perl + - [perl-DBD-ClickHouse](https://github.com/elcamlost/perl-DBD-ClickHouse) + - [HTTP-ClickHouse](https://metacpan.org/release/HTTP-ClickHouse) + - [AnyEvent-ClickHouse](https://metacpan.org/release/AnyEvent-ClickHouse) +- Rubis + - [ClickHouse (Ruby)](https://github.com/shlima/click_house) +- R + - [clickhouse-r](https://github.com/hannesmuehleisen/clickhouse-r) + - [RClickhouse](https://github.com/IMSMWU/RClickhouse) +- Java + - [clickhouse-client-java](https://github.com/VirtusAI/clickhouse-client-java) + - [clickhouse-client](https://github.com/Ecwid/clickhouse-client) +- Scala + - [clickhouse-Scala-client](https://github.com/crobox/clickhouse-scala-client) +- Kotlin + - [AORM](https://github.com/TanVD/AORM) +- C\# + - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) + - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) + - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) +- Elixir + - [clickhousex](https://github.com/appodeal/clickhousex/) +- Nim + - [nim-clickhouse](https://github.com/leonardoce/nim-clickhouse) + +[Article Original](https://clickhouse.tech/docs/en/interfaces/third-party/client_libraries/) diff --git a/docs/fr/interfaces/third-party/gui.md b/docs/fr/interfaces/third-party/gui.md new file mode 100644 index 00000000000..3e6b039dea0 --- /dev/null +++ b/docs/fr/interfaces/third-party/gui.md @@ -0,0 +1,149 @@ +--- +machine_translated: true +--- + +# Interfaces visuelles de développeurs tiers {#visual-interfaces-from-third-party-developers} + +## Open-Source {#open-source} + +### Tabix {#tabix} + +Interface Web pour ClickHouse dans le [Tabix](https://github.com/tabixio/tabix) projet. + +Caractéristique: + +- Fonctionne avec ClickHouse directement à partir du navigateur, sans avoir besoin d'installer un logiciel supplémentaire. +- Éditeur de requête avec coloration syntaxique. +- L'Auto-complétion des commandes. +- Outils d'analyse graphique de l'exécution des requêtes. +- Options de jeu de couleurs. + +[Documentation Tabix](https://tabix.io/doc/). + +### HouseOps {#houseops} + +[HouseOps](https://github.com/HouseOps/HouseOps) est une interface utilisateur / IDE pour OSX, Linux et Windows. + +Caractéristique: + +- Générateur de requêtes avec coloration syntaxique. Affichez la réponse dans une table ou une vue JSON. +- Exporter les résultats de la requête au format CSV ou JSON. +- Liste des processus avec des descriptions. Le mode d'écriture. Capacité à arrêter (`KILL`) processus. +- Base de données du graphique. Affiche toutes les tables et leurs colonnes avec des informations supplémentaires. +- Une vue rapide de la taille de la colonne. +- La configuration du serveur. + +Les fonctionnalités suivantes sont prévues pour le développement: + +- Gestion de base de données. +- La gestion des utilisateurs. +- En temps réel l'analyse des données. +- Surveillance de Cluster. +- La gestion de Cluster. +- Suivi des tables répliquées et Kafka. + +### Phare {#lighthouse} + +[Phare](https://github.com/VKCOM/lighthouse) est une interface web légère pour ClickHouse. + +Caractéristique: + +- Liste de Table avec filtrage et métadonnées. +- Aperçu de la Table avec filtrage et tri. +- Les requêtes en lecture seule exécution. + +### Redash {#redash} + +[Redash](https://github.com/getredash/redash) est une plate-forme pour la visualisation des données. + +Prise en charge de plusieurs sources de données, y compris ClickHouse, Redash peut joindre les résultats des requêtes provenant de différentes sources de données dans un ensemble de données final. + +Caractéristique: + +- Puissant éditeur de requêtes. +- Explorateur de base de données. +- Des outils de visualisation qui vous permettent de représenter des données sous différentes formes. + +### DBeaver {#dbeaver} + +[DBeaver](https://dbeaver.io/) - client de base de données de bureau universel avec support ClickHouse. + +Caractéristique: + +- Développement de requêtes avec mise en évidence de la syntaxe et complétion automatique. +- Liste de Table avec filtres et recherche de métadonnées. +- Aperçu des données de la Table. +- Recherche en texte intégral. + +### clickhouse-cli {#clickhouse-cli} + +[clickhouse-cli](https://github.com/hatarist/clickhouse-cli) est un client de ligne de commande alternatif pour ClickHouse, écrit en Python 3. + +Caractéristique: + +- Complétion. +- Coloration syntaxique pour les requêtes et la sortie de données. +- Support Pager pour la sortie de données. +- Commandes personnalisées de type PostgreSQL. + +### clickhouse-flamegraph {#clickhouse-flamegraph} + +[clickhouse-flamegraph](https://github.com/Slach/clickhouse-flamegraph) est un outil spécialisé pour visualiser la `system.trace_log` comme [flamegraph](http://www.brendangregg.com/flamegraphs.html). + +## Commercial {#commercial} + +### DataGrip {#datagrip} + +[DataGrip](https://www.jetbrains.com/datagrip/) est un IDE de base de données de JetBrains avec un support dédié pour ClickHouse. Il est également intégré dans D'autres outils basés sur IntelliJ: PyCharm, IntelliJ IDEA, GoLand, PhpStorm et autres. + +Caractéristique: + +- Achèvement du code très rapide. +- Mise en évidence de la syntaxe ClickHouse. +- Prise en charge des fonctionnalités spécifiques à ClickHouse, par exemple, les colonnes imbriquées, les moteurs de table. +- Éditeur De Données. +- Refactoring. +- Recherche et Navigation. + +### Yandex DataLens {#yandex-datalens} + +[Yandex DataLens](https://cloud.yandex.ru/services/datalens) est un service de visualisation et d'analyse de données. + +Caractéristique: + +- Large gamme de visualisations disponibles, des graphiques à barres simples aux tableaux de bord complexes. +- Les tableaux de bord pourraient être rendus publics. +- Prise en charge de plusieurs sources de données, y compris ClickHouse. +- Stockage de données matérialisées basé sur ClickHouse. + +DataLens est [disponible gratuitement](https://cloud.yandex.com/docs/datalens/pricing) pour les projets à faible charge, même pour un usage commercial. + +- [Documentation DataLens](https://cloud.yandex.com/docs/datalens/). +- [Tutoriel](https://cloud.yandex.com/docs/solutions/datalens/data-from-ch-visualization) sur la visualisation des données à partir d'une base de données ClickHouse. + +### Logiciel Holistics {#holistics-software} + +[Holistics](https://www.holistics.io/) est une plate-forme de données à pile complète et un outil de business intelligence. + +Caractéristique: + +- E-mail automatisé, Slack et Google Sheet horaires de rapports. +- Éditeur SQL avec visualisations, contrôle de version, auto-complétion, composants de requête réutilisables et filtres dynamiques. +- Analyse intégrée des rapports et des tableaux de bord via iframe. +- Préparation des données et capacités ETL. +- Prise en charge de la modélisation des données SQL pour la cartographie relationnelle des données. + +### Looker {#looker} + +[Looker](https://looker.com) est une plate-forme de données et un outil de business intelligence avec prise en charge de plus de 50 dialectes de base de données, y compris ClickHouse. Looker est disponible en tant que plate-forme SaaS et auto-hébergé. Les utilisateurs peuvent utiliser Looker via le navigateur pour explorer les données, créer des visualisations et des tableaux de bord, planifier des rapports et partager leurs idées avec des collègues. Looker fournit un riche ensemble d'outils pour intégrer ces fonctionnalités dans d'autres applications, et une API +pour intégrer les données avec d'autres applications. + +Caractéristique: + +- Développement facile et agile en utilisant LookML, un langage qui prend en charge curated + [La Modélisation Des Données](https://looker.com/platform/data-modeling) pour soutenir les auteurs et les utilisateurs finaux. +- Intégration de flux de travail puissante via Looker [Actions De Données](https://looker.com/platform/actions). + +[Comment configurer ClickHouse dans Looker.](https://docs.looker.com/setup-and-management/database-config/clickhouse) + +[Article Original](https://clickhouse.tech/docs/en/interfaces/third-party/gui/) diff --git a/docs/fr/interfaces/third-party/integrations.md b/docs/fr/interfaces/third-party/integrations.md new file mode 100644 index 00000000000..fba357772a6 --- /dev/null +++ b/docs/fr/interfaces/third-party/integrations.md @@ -0,0 +1,93 @@ +--- +machine_translated: true +--- + +# Bibliothèques d'intégration de développeurs tiers {#integration-libraries-from-third-party-developers} + +!!! warning "Avertissement" + Yandex ne **pas** maintenir les outils et les bibliothèques énumérés ci-dessous et n'ont pas fait de tests approfondis pour assurer leur qualité. + +## Produits D'Infrastructure {#infrastructure-products} + +- Systèmes de gestion de bases de données relationnelles + - [MySQL](https://www.mysql.com) + - [ProxySQL](https://github.com/sysown/proxysql/wiki/ClickHouse-Support) + - [clickhouse-mysql-lecteur de données](https://github.com/Altinity/clickhouse-mysql-data-reader) + - [horgh-réplicateur](https://github.com/larsnovikov/horgh-replicator) + - [PostgreSQL](https://www.postgresql.org) + - [clickhousedb\_fdw](https://github.com/Percona-Lab/clickhousedb_fdw) + - [infi.clickhouse\_fdw](https://github.com/Infinidat/infi.clickhouse_fdw) (utiliser [infi.clickhouse\_orm](https://github.com/Infinidat/infi.clickhouse_orm)) + - [pg2ch](https://github.com/mkabilov/pg2ch) + - [clickhouse\_fdw](https://github.com/adjust/clickhouse_fdw) + - [MSSQL](https://en.wikipedia.org/wiki/Microsoft_SQL_Server) + - [ClickHouseMigrator](https://github.com/zlzforever/ClickHouseMigrator) +- Files d'attente de messages + - [Kafka](https://kafka.apache.org) + - [clickhouse\_sinker](https://github.com/housepower/clickhouse_sinker) (utiliser [Allez client](https://github.com/kshvakov/clickhouse/)) +- Objet de stockages + - [S3](https://en.wikipedia.org/wiki/Amazon_S3) + - [clickhouse-sauvegarde](https://github.com/AlexAkulov/clickhouse-backup) +- Orchestration de conteneur + - [Kubernetes](https://kubernetes.io) + - [clickhouse-opérateur](https://github.com/Altinity/clickhouse-operator) +- Gestion de la Configuration + - [marionnette](https://puppet.com) + - [innogames / clickhouse](https://forge.puppet.com/innogames/clickhouse) + - [mfedotov / clickhouse](https://forge.puppet.com/mfedotov/clickhouse) +- Surveiller + - [Graphite](https://graphiteapp.org) + - [graphouse](https://github.com/yandex/graphouse) + - [carbone-clickhouse](https://github.com/lomik/carbon-clickhouse) + + - [graphite-clickhouse](https://github.com/lomik/graphite-clickhouse) + - [graphite-CH-optimizer](https://github.com/innogames/graphite-ch-optimizer) - optimise les partitions calées dans [\* GraphiteMergeTree](../../operations/table_engines/graphitemergetree.md#graphitemergetree) si les règles de [configuration de cumul](../../operations/table_engines/graphitemergetree.md#rollup-configuration) pourrait être appliquée + - [Grafana](https://grafana.com/) + - [clickhouse-grafana](https://github.com/Vertamedia/clickhouse-grafana) + - [Prometheus](https://prometheus.io/) + - [clickhouse\_exporter](https://github.com/f1yegor/clickhouse_exporter) + - [PromHouse](https://github.com/Percona-Lab/PromHouse) + - [clickhouse\_exporter](https://github.com/hot-wifi/clickhouse_exporter) (utiliser [Allez client](https://github.com/kshvakov/clickhouse/)) + - [Nagios](https://www.nagios.org/) + - [check\_clickhouse](https://github.com/exogroup/check_clickhouse/) + - [check\_clickhouse.py](https://github.com/innogames/igmonplugins/blob/master/src/check_clickhouse.py) + - [Zabbix](https://www.zabbix.com) + - [clickhouse-Zabbix-modèle](https://github.com/Altinity/clickhouse-zabbix-template) + - [Sematext](https://sematext.com/) + - [intégration de clickhouse](https://github.com/sematext/sematext-agent-integrations/tree/master/clickhouse) +- Journalisation + - [rsyslog](https://www.rsyslog.com/) + - [omclickhouse](https://www.rsyslog.com/doc/master/configuration/modules/omclickhouse.html) + - [fluentd](https://www.fluentd.org) + - [maison de bois](https://github.com/flant/loghouse) (pour [Kubernetes](https://kubernetes.io)) + - [logagent](https://www.sematext.com/logagent) + - [sortie logagent-plugin-clickhouse](https://sematext.com/docs/logagent/output-plugin-clickhouse/) +- Geo + - [MaxMind](https://dev.maxmind.com/geoip/) + - [clickhouse-maxmind-geoip](https://github.com/AlexeyKupershtokh/clickhouse-maxmind-geoip) + +## Écosystèmes De Langage De Programmation {#programming-language-ecosystems} + +- Python + - [SQLAlchemy](https://www.sqlalchemy.org) + - [sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) (utiliser [infi.clickhouse\_orm](https://github.com/Infinidat/infi.clickhouse_orm)) + - [Panda](https://pandas.pydata.org) + - [pandahouse](https://github.com/kszucs/pandahouse) +- R + - [dplyr](https://db.rstudio.com/dplyr/) + - [RClickhouse](https://github.com/IMSMWU/RClickhouse) (utiliser [clickhouse-cpp](https://github.com/artpaul/clickhouse-cpp)) +- Java + - [Hadoop](http://hadoop.apache.org) + - [clickhouse-HDFS-chargeur](https://github.com/jaykelin/clickhouse-hdfs-loader) (utiliser [JDBC](../../query_language/table_functions/jdbc.md)) +- Scala + - [Akka](https://akka.io) + - [clickhouse-Scala-client](https://github.com/crobox/clickhouse-scala-client) +- C\# + - [ADO.NET](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-overview) + - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) + - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) + - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) + - [ClickHouse.Net.Les Migrations](https://github.com/ilyabreev/ClickHouse.Net.Migrations) +- Elixir + - [Ecto](https://github.com/elixir-ecto/ecto) + - [clickhouse\_ecto](https://github.com/appodeal/clickhouse_ecto) + +[Article Original](https://clickhouse.tech/docs/en/interfaces/third-party/integrations/) diff --git a/docs/fr/interfaces/third-party/proxy.md b/docs/fr/interfaces/third-party/proxy.md new file mode 100644 index 00000000000..84eea4fe78d --- /dev/null +++ b/docs/fr/interfaces/third-party/proxy.md @@ -0,0 +1,43 @@ +--- +machine_translated: true +--- + +# Serveurs Proxy de développeurs tiers {#proxy-servers-from-third-party-developers} + +## chproxy {#chproxy} + +[chproxy](https://github.com/Vertamedia/chproxy), est un proxy HTTP et un équilibreur de charge pour la base de données ClickHouse. + +Caractéristique: + +- Routage par utilisateur et mise en cache des réponses. +- Limites flexibles. +- Renouvellement automatique du certificat SSL. + +Mis en œuvre dans Go. + +## KittenHouse {#kittenhouse} + +[KittenHouse](https://github.com/VKCOM/kittenhouse) est conçu pour être un proxy local entre ClickHouse et serveur d'applications dans le cas où il est impossible ou gênant d'insérer des données en mémoire tampon du côté de votre application. + +Caractéristique: + +- En mémoire et sur disque de données en mémoire tampon. +- Routage par table. +- Équilibrage de charge et vérification de la santé. + +Mis en œuvre dans Go. + +## ClickHouse-Vrac {#clickhouse-bulk} + +[ClickHouse-Vrac](https://github.com/nikepan/clickhouse-bulk) est un collecteur simple D'insertion de ClickHouse. + +Caractéristique: + +- Groupez les demandes et envoyez-les par seuil ou intervalle. +- Plusieurs serveurs distants. +- L'authentification de base. + +Mis en œuvre dans Go. + +[Article Original](https://clickhouse.tech/docs/en/interfaces/third-party/proxy/) diff --git a/docs/fr/introduction/adopters.md b/docs/fr/introduction/adopters.md new file mode 100644 index 00000000000..9f0e2eec474 --- /dev/null +++ b/docs/fr/introduction/adopters.md @@ -0,0 +1,79 @@ +--- +machine_translated: true +--- + +# Clickhouse Adopteurs {#clickhouse-adopters} + +!!! warning "Avertissement" + La liste suivante des entreprises utilisant ClickHouse et leurs histoires de réussite est assemblé à partir de sources publiques, pourrait donc différer de la réalité actuelle. Nous vous serions reconnaissants si vous partager l'histoire de l'adoption de ClickHouse dans votre entreprise et [ajouter à la liste](https://github.com/ClickHouse/ClickHouse/edit/master/docs/en/introduction/adopters.md), mais assurez-vous que vous n'aurez aucun problème de NDA en le faisant. Fournir des mises à jour avec des publications d'autres entreprises est également utile. + +| Entreprise | Industrie | Cas d'utilisation | La Taille De Cluster | (Onu)Taille Des Données Compressées\* | Référence | +|-------------------------------------------------------------------------------|-------------------------------------|------------------------------|-----------------------------------------------------------------|-----------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [2gis](https://2gis.ru) | Cartographie | Surveiller | — | — | [Parler en russe, juillet 2019](https://youtu.be/58sPkXfq6nw) | +| [Aloha Navigateur](https://alohabrowser.com/) | Mobile App | Navigateur backend | — | — | [Diapositives en russe, mai 2019](https://github.com/yandex/clickhouse-presentations/blob/master/meetup22/aloha.pdf) | +| [Amadeus](https://amadeus.com/) | Voyage | Analytics | — | — | [Communiqué De Presse, Avril 2018](https://www.altinity.com/blog/2018/4/5/amadeus-technologies-launches-investment-and-insights-tool-based-on-machine-learning-and-strategy-algorithms) | +| [Appsflyer](https://www.appsflyer.com) | Mobile analytics | Produit principal | — | — | [Parler en russe, juillet 2019](https://www.youtube.com/watch?v=M3wbRlcpBbY) | +| [ArenaData](https://arenadata.tech/) | Plate-Forme De Données | Produit principal | — | — | [Diapositives en russe, décembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup38/indexes.pdf) | +| [Badoo](https://badoo.com) | Rencontres | Timeseries | — | — | [Diapositives en russe, décembre 2019](https://presentations.clickhouse.tech/meetup38/forecast.pdf) | +| [Benocs](https://www.benocs.com/) | Télémétrie et analyse de réseau | Produit Principal | — | — | [Diapositives en anglais, octobre 2017](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup9/lpm.pdf) | +| [Bloomberg](https://www.bloomberg.com/) | Les Finances, Les Médias | Surveiller | 102 serveurs | — | [Diapositives, Mai 2018](https://www.slideshare.net/Altinity/http-analytics-for-6m-requests-per-second-using-clickhouse-by-alexander-bocharov) | +| [Bloxy](https://bloxy.info) | Blockchain | Analytics | — | — | [Diapositives en russe, août 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/4_bloxy.pptx) | +| `Dataliance/UltraPower` | Télécommunication | Analytics | — | — | [Diapositives en chinois, janvier 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/telecom.pdf) | +| [CARTO](https://carto.com/) | Business Intelligence | GEO analytics | — | — | [Traitement géospatial avec Clickhouse](https://carto.com/blog/geospatial-processing-with-clickhouse/) | +| [CERN](http://public.web.cern.ch/public/) | Recherche | Expérience | — | — | [Communiqué De Presse, avril 2012](https://www.yandex.com/company/press_center/press_releases/2012/2012-04-10/) | +| [Cisco](http://cisco.com/) | Réseau | L'analyse de trafic | — | — | [Lightning talk, octobre 2019](https://youtu.be/-hI1vDR2oPY?t=5057) | +| [Citadelle Titres](https://www.citadelsecurities.com/) | Finance | — | — | — | [Contribution, Mars 2019](https://github.com/ClickHouse/ClickHouse/pull/4774) | +| [Citymobil](https://city-mobil.ru) | Taxi | Analytics | — | — | [Billet de Blog en russe, mars 2020](https://habr.com/en/company/citymobil/blog/490660/) | +| [ContentSquare](https://contentsquare.com) | Web analytics | Produit principal | — | — | [Billet de Blog, novembre 2018](http://souslecapot.net/2018/11/21/patrick-chatain-vp-engineering-chez-contentsquare-penser-davantage-amelioration-continue-que-revolution-constante/) | +| [Cloudflare](https://cloudflare.com) | CDN | L'analyse de trafic | 36 serveurs | — | [Billet de Blog, mai 2017](https://blog.cloudflare.com/how-cloudflare-analyzes-1m-dns-queries-per-second/), [Billet de Blog, mars 2018](https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/) | +| [Corunet](https://coru.net/) | Analytics | Produit principal | — | — | [Diapositives en anglais, avril 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup21/predictive_models.pdf) | +| [CraiditX 氪信](https://creditx.com) | Les finances de l'IA | Analyse | — | — | [Diapositives en anglais, novembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/udf.pptx) | +| [Criteo / Storetail](https://www.criteo.com/) | Détail | Produit principal | — | — | [Diapositives en anglais, octobre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/3_storetail.pptx) | +| [La Deutsche Bank](https://db.com) | Finance | BI Analytics | — | — | [Diapositives en anglais, octobre 2019](https://bigdatadays.ru/wp-content/uploads/2019/10/D2-H3-3_Yakunin-Goihburg.pdf) | +| [Diva-e](https://www.diva-e.com) | Conseil Digital | Produit Principal | — | — | [Diapositives en anglais, septembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup29/ClickHouse-MeetUp-Unusual-Applications-sd-2019-09-17.pdf) | +| [Exness](https://www.exness.com) | Trading | Métriques, Journalisation | — | — | [Parler en russe, mai 2019](https://youtu.be/_rpU-TvSfZ8?t=3215) | +| [Geniee](https://geniee.co.jp) | Réseau publicitaire | Produit principal | — | — | [Billet de Blog en japonais, juillet 2017](https://tech.geniee.co.jp/entry/2017/07/20/160100) | +| [HUYA](https://www.huya.com/) | Le Streaming Vidéo | Analytics | — | — | [Diapositives en chinois, octobre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/7.%20ClickHouse万亿数据分析实践%20李本旺(sundy-li)%20虎牙.pdf) | +| [Idealista](https://www.idealista.com) | Immobilier | Analytics | — | — | [Billet de Blog en anglais, avril 2019](https://clickhouse.yandex/blog/en/clickhouse-meetup-in-madrid-on-april-2-2019) | +| [Infovista](https://www.infovista.com/) | Réseau | Analytics | — | — | [Diapositives en anglais, octobre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup30/infovista.pdf) | +| [InnoGames](https://www.innogames.com) | Jeu | Métriques, Journalisation | — | — | [Diapositives en russe, septembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/graphite_and_clickHouse.pdf) | +| [Integros](https://integros.com) | Plate-forme pour les services vidéo | Analytics | — | — | [Diapositives en russe, mai 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) | +| [Données Kodiak](https://www.kodiakdata.com/) | Nuage | Produit principal | — | — | [Diapositives en Engish, avril 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup13/kodiak_data.pdf) | +| [Kontur](https://kontur.ru) | Le Développement De Logiciels | Métrique | — | — | [Parler en russe, novembre 2018](https://www.youtube.com/watch?v=U4u4Bd0FtrY) | +| [LifeStreet](https://lifestreet.com/) | Réseau publicitaire | Produit principal | 75 serveurs (3 répliques) | 5.27 FRP | [Billet de Blog en russe, février 2017](https://habr.com/en/post/322620/) | +| [Mail.ru Solutions Cloud](https://mcs.mail.ru/) | Les services de Cloud | Produit principal | — | — | [Exécution de L'Instance ClickHouse, en russe](https://mcs.mail.ru/help/db-create/clickhouse#) | +| [MessageBird](https://www.messagebird.com) | Télécommunication | Statistique | — | — | [Diapositives en anglais, novembre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup20/messagebird.pdf) | +| [MGID](https://www.mgid.com/) | Réseau publicitaire | Web-analytics | — | — | [Notre expérience dans la mise en œuvre de SGBD analytique ClickHouse, en russe](http://gs-studio.com/news-about-it/32777----clickhouse---c) | +| [OneAPM](https://www.oneapm.com/) | Monitorings et analyse des données | Produit principal | — | — | [Diapositives en chinois, octobre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/8.%20clickhouse在OneAPM的应用%20杜龙.pdf) | +| [Pragma L'Innovation](http://www.pragma-innovation.fr/) | Télémétrie et analyse Big Data | Produit principal | — | — | [Diapositives en anglais, octobre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/4_pragma_innovation.pdf) | +| [QINGCLOUD](https://www.qingcloud.com/) | Les services de Cloud | Produit principal | — | — | [Diapositives en chinois, octobre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/4.%20Cloud%20%2B%20TSDB%20for%20ClickHouse%20张健%20QingCloud.pdf) | +| [Qrator](https://qrator.net) | Protection DDoS | Produit principal | — | — | [Billet De Blog, Mars 2019](https://blog.qrator.net/en/clickhouse-ddos-mitigation_37/) | +| [Beijing pour cent Information Technology Co., Ltd.](https://www.percent.cn/) | Analytics | Produit Principal | — | — | [Diapositives en chinois, juin 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/4.%20ClickHouse万亿数据双中心的设计与实践%20.pdf) | +| [Rambler](https://rambler.ru) | Services Internet | Analytics | — | — | [Parler en russe, avril 2018](https://medium.com/@ramblertop/разработка-api-clickhouse-для-рамблер-топ-100-f4c7e56f3141) | +| [Tencent](https://www.tencent.com) | Messagerie | Journalisation | — | — | [Parler en chinois, novembre 2019](https://youtu.be/T-iVQRuw-QY?t=5050) | +| [Étoiles De Circulation](https://trafficstars.com/) | Réseau publicitaire | — | — | — | [Diapositives en russe, mai 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup15/lightning/ninja.pdf) | +| [S7 Airlines](https://www.s7.ru) | Avion | Métriques, Journalisation | — | — | [Parler en russe, mars 2019](https://www.youtube.com/watch?v=nwG68klRpPg&t=15s) | +| [SEMrush](https://www.semrush.com/) | Marketing | Produit principal | — | — | [Diapositives en russe, août 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/5_semrush.pdf) | +| [scireum GmbH](https://www.scireum.de/) | Ecommerce | Produit principal | — | — | [Présentation en allemand, février 2020](https://www.youtube.com/watch?v=7QWAn5RbyR4) | +| [Sentry](https://sentry.io/) | Développeur de logiciels | Backend pour le produit | — | — | [Billet de Blog en anglais, mai 2019](https://blog.sentry.io/2019/05/16/introducing-snuba-sentrys-new-search-infrastructure) | +| [SGK](http://www.sgk.gov.tr/wps/portal/sgk/tr) | Gouvernement Sécurité Sociale | Analytics | — | — | [Diapositives en anglais, novembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/ClickHouse%20Meetup-Ramazan%20POLAT.pdf) | +| [seo.do](https://seo.do/) | Analytics | Produit principal | — | — | [Diapositives en anglais, novembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/CH%20Presentation-%20Metehan%20Çetinkaya.pdf) | +| [Sina](http://english.sina.com/index.html) | Nouvelles | — | — | — | [Diapositives en chinois, octobre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/6.%20ClickHouse最佳实践%20高鹏_新浪.pdf) | +| [SMI2](https://smi2.ru/) | Nouvelles | Analytics | — | — | [Billet de Blog en russe, novembre 2017](https://habr.com/ru/company/smi2/blog/314558/) | +| [Splunk](https://www.splunk.com/) | Business Analytics | Produit principal | — | — | [Diapositives en anglais, janvier 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/splunk.pdf) | +| [Spotify](https://www.spotify.com) | Musical | Expérimentation | — | — | [Diapositives, Juillet 2018](https://www.slideshare.net/glebus/using-clickhouse-for-experimentation-104247173) | +| [Tencent](https://www.tencent.com) | Big Data | Le traitement des données | — | — | [Diapositives en chinois, octobre 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/5.%20ClickHouse大数据集群应用_李俊飞腾讯网媒事业部.pdf) | +| [Uber](https://www.uber.com) | Taxi | Journalisation | — | — | [Diapositives, Février 2020](https://presentations.clickhouse.tech/meetup40/uber.pdf) | +| [VKontakte](https://vk.com) | Réseau Social | Statistiques, Journalisation | — | — | [Diapositives en russe, août 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/3_vk.pdf) | +| [Wisebits](https://wisebits.com/) | Solutions informatiques | Analytics | — | — | [Diapositives en russe, mai 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) | +| [Xiaoxin Tech.](https://www.xiaoheiban.cn/) | Éducation | But commun | — | — | [Diapositives en anglais, novembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/sync-clickhouse-with-mysql-mongodb.pptx) | +| [Ximalaya](https://www.ximalaya.com/) | Partage Audio | OLAP | — | — | [Diapositives en anglais, novembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/ximalaya.pdf) | +| [Yandex Cloud](https://cloud.yandex.ru/services/managed-clickhouse) | Le Cloud Public | Produit principal | — | — | [Parler en russe, décembre 2019](https://www.youtube.com/watch?v=pgnak9e_E0o) | +| [Yandex DataLens](https://cloud.yandex.ru/services/datalens) | Business Intelligence | Produit principal | — | — | [Diapositives en russe, décembre 2019](https://presentations.clickhouse.tech/meetup38/datalens.pdf) | +| [Yandex Marché](https://market.yandex.ru/) | Ecommerce | Métriques, Journalisation | — | — | [Parler en russe, janvier 2019](https://youtu.be/_l1qP0DyBcA?t=478) | +| [Yandex Metrica](https://metrica.yandex.com) | Web analytics | Produit principal | 360 serveurs dans un cluster, 1862 serveurs dans un département | 66,41 FRP / 5,68 FRP | [Diapositives, Février 2020](https://presentations.clickhouse.tech/meetup40/introduction/#13) | +| [ЦВТ](https://htc-cs.ru/) | Le Développement De Logiciels | Métriques, Journalisation | — | — | [Billet de Blog, mars 2019, en russe](https://vc.ru/dev/62715-kak-my-stroili-monitoring-na-prometheus-clickhouse-i-elk) | +| [МКБ](https://mkb.ru/) | Banque | Surveillance du système Web | — | — | [Diapositives en russe, septembre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/mkb.pdf) | +| [金数据](https://jinshuju.net) | BI Analytics | Produit principal | — | — | [Diapositives en chinois, octobre 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/3.%20金数据数据架构调整方案Public.pdf) | + +[Article Original](https://clickhouse.tech/docs/en/introduction/adopters/) diff --git a/docs/fr/introduction/distinctive_features.md b/docs/fr/introduction/distinctive_features.md new file mode 100644 index 00000000000..8ae1607d63c --- /dev/null +++ b/docs/fr/introduction/distinctive_features.md @@ -0,0 +1,68 @@ +--- +machine_translated: true +--- + +# Caractéristiques distinctives de ClickHouse {#distinctive-features-of-clickhouse} + +## Vrai SGBD orienté colonne {#true-column-oriented-dbms} + +Dans un vrai SGBD orienté colonne, aucune donnée supplémentaire n'est stockée avec les valeurs. Entre autres choses, cela signifie que les valeurs de longueur constante doivent être prises en charge, pour éviter de stocker leur longueur “number” à côté de ces valeurs. Par exemple, un milliard de valeurs de type UInt8 devrait consommer environ 1 Go non compressé, ou cela affecte fortement l'utilisation du processeur. Il est essentiel de stocker des données de manière compacte (sans “garbage”) même lorsqu'il n'est pas compressé, puisque la vitesse de décompression (utilisation du processeur) dépend principalement du volume de données non compressées. + +Il est à noter car il existe des systèmes qui peuvent stocker des valeurs de différentes colonnes séparément, mais qui ne peuvent pas traiter efficacement les requêtes analytiques en raison de leur optimisation pour d'autres scénarios. Les exemples sont HBase, BigTable, Cassandra et HyperTable. Dans ces systèmes, vous obtiendriez un débit d'environ cent mille lignes par seconde, mais pas des centaines de millions de lignes par seconde. + +Il est également intéressant de noter que ClickHouse est un système de gestion de base de données, pas une seule base de données. ClickHouse permet de créer des tables et des bases de données en cours d'exécution, de charger des données et d'exécuter des requêtes sans reconfigurer et redémarrer le serveur. + +## Compression De Données {#data-compression} + +Certains SGBD orientés colonne (InfiniDB CE et MonetDB) n'utilisent pas la compression de données. Cependant, la compression des données joue un rôle clé dans la réalisation d'excellentes performances. + +## Stockage de données sur disque {#disk-storage-of-data} + +Garder les données physiquement triées par clé primaire permet d'extraire des données pour ses valeurs spécifiques ou plages de valeurs avec une faible latence, moins de quelques dizaines de millisecondes. Certains SGBD orientés colonne (tels que SAP HANA et Google PowerDrill) ne peuvent fonctionner qu'en RAM. Cette approche encourage l'allocation d'un budget matériel plus important que ce qui est nécessaire pour l'analyse en temps réel. ClickHouse est conçu pour fonctionner sur des disques durs réguliers, ce qui signifie que le coût par Go de stockage de données est faible, mais SSD et RAM supplémentaire sont également entièrement utilisés si disponible. + +## Traitement parallèle sur plusieurs cœurs {#parallel-processing-on-multiple-cores} + +Les grandes requêtes sont parallélisées naturellement, en prenant toutes les ressources nécessaires disponibles sur le serveur actuel. + +## Traitement distribué sur plusieurs serveurs {#distributed-processing-on-multiple-servers} + +Presque aucun des SGBD en colonnes mentionnés ci-dessus ne prend en charge le traitement des requêtes distribuées. +Dans ClickHouse, les données peuvent résider sur différents fragments. Chaque fragment peut être un groupe de répliques utilisées pour la tolérance aux pannes. Tous les fragments sont utilisés pour exécuter une requête en parallèle, de façon transparente pour l'utilisateur. + +## Prise en charge SQL {#sql-support} + +ClickHouse prend en charge un langage de requête déclarative basé sur SQL qui est identique à la norme SQL dans de nombreux cas. +Les requêtes prises en charge incluent les clauses GROUP BY, ORDER BY, les sous-requêtes in FROM, IN et JOIN, ainsi que les sous-requêtes scalaires. +Les sous-requêtes dépendantes et les fonctions de fenêtre ne sont pas prises en charge. + +## Moteur Vectoriel {#vector-engine} + +Les données ne sont pas seulement stockées par des colonnes, mais sont traitées par des vecteurs (parties de colonnes), ce qui permet d'atteindre une efficacité élevée du processeur. + +## Données en temps réel des Mises à jour {#real-time-data-updates} + +ClickHouse prend en charge les tables avec une clé primaire. Pour effectuer rapidement des requêtes sur la plage de la clé primaire, les données sont triées progressivement à l'aide de l'arborescence de fusion. Pour cette raison, les données peuvent être continuellement ajoutées à la table. Pas de verrouillage lorsque de nouvelles données sont ingérés. + +## Index {#index} + +Avoir une donnée physiquement triée par clé primaire permet d'extraire des données pour ses valeurs spécifiques ou plages de valeurs avec une faible latence, moins de quelques dizaines de millisecondes. + +## Convient pour les requêtes en ligne {#suitable-for-online-queries} + +Faible latence signifie que les requêtes peuvent être traitées sans délai et sans essayer de préparer une réponse à l'avance, au même moment pendant le chargement de la page de l'interface utilisateur. En d'autres termes, en ligne. + +## Prise en charge des calculs approximatifs {#support-for-approximated-calculations} + +ClickHouse offre différentes façons d'échanger la précision pour la performance: + +1. Fonctions d'agrégation pour le calcul approximatif du nombre de valeurs distinctes, de médianes et de quantiles. +2. L'exécution d'une requête basée sur une partie (échantillon) de données et obtenir un pseudo résultat. Dans ce cas, proportionnellement, moins de données sont récupérées à partir du disque. +3. L'exécution d'une agrégation pour un nombre limité de clés aléatoires, au lieu de toutes les clés. Sous certaines conditions pour la distribution des clés dans les données, cela fournit un résultat raisonnablement précis tout en utilisant moins de ressources. + +## Prise en charge de la réplication et de l'intégrité des données {#data-replication-and-data-integrity-support} + +ClickHouse utilise la réplication multi-maître asynchrone. Après avoir été écrit dans n'importe quelle réplique disponible, toutes les répliques restantes récupèrent leur copie en arrière-plan. Le système conserve des données identiques sur différentes répliques. La récupération après la plupart des échecs est effectuée automatiquement ou semi-automatiquement dans les cas complexes. + +Pour plus d'informations, consultez la section [Réplication des données](../operations/table_engines/replication.md). + +[Article Original](https://clickhouse.tech/docs/en/introduction/distinctive_features/) diff --git a/docs/fr/introduction/features_considered_disadvantages.md b/docs/fr/introduction/features_considered_disadvantages.md new file mode 100644 index 00000000000..d6a3886d489 --- /dev/null +++ b/docs/fr/introduction/features_considered_disadvantages.md @@ -0,0 +1,11 @@ +--- +machine_translated: true +--- + +# Caractéristiques de ClickHouse qui peuvent être considérées comme des inconvénients {#clickhouse-features-that-can-be-considered-disadvantages} + +1. Pas de transactions à part entière. +2. Manque de capacité à modifier ou supprimer des données déjà insérées avec un taux élevé et une faible latence. Des suppressions et des mises à jour par lots sont disponibles pour nettoyer ou modifier les données, par exemple pour [GDPR](https://gdpr-info.eu). +3. L'index clairsemé rend ClickHouse pas si approprié pour les requêtes ponctuelles récupérant des lignes simples par leurs clés. + +[Article Original](https://clickhouse.tech/docs/en/introduction/features_considered_disadvantages/) diff --git a/docs/fr/introduction/history.md b/docs/fr/introduction/history.md new file mode 100644 index 00000000000..c7a07eb64d0 --- /dev/null +++ b/docs/fr/introduction/history.md @@ -0,0 +1,53 @@ +--- +machine_translated: true +--- + +# Histoire De ClickHouse {#clickhouse-history} + +ClickHouse a été développé initialement au pouvoir [Yandex.Metrica](https://metrica.yandex.com/), [la deuxième plus grande plateforme d'analyse dans le monde](http://w3techs.com/technologies/overview/traffic_analysis/all) et continue à être le composant de base de ce système. Avec plus de 13 Billions d'enregistrements dans la base de données et plus de 20 milliards d'événements par jour, ClickHouse permet de générer des rapports personnalisés à la volée directement à partir de données non agrégées. Cet article couvre brièvement les objectifs de ClickHouse dans les premiers stades de son développement. + +Yandex.Metrica construit des rapports personnalisés à la volée en fonction des hits et des sessions, avec des segments arbitraires définis par l'utilisateur. Faisant souvent requiert la construction d'agrégats complexes, tels que le nombre d'utilisateurs uniques. De nouvelles données pour la création d'un rapport arrivent en temps réel. + +En avril 2014, Yandex.Metrica suivait environ 12 milliards d'événements (pages vues et clics) par jour. Tous ces événements doivent être stockés à créer des rapports personnalisés. Une seule requête peut exiger de la numérisation de millions de lignes en quelques centaines de millisecondes, ou des centaines de millions de lignes en quelques secondes. + +## Utilisation dans Yandex.Metrica et autres Services Yandex {#usage-in-yandex-metrica-and-other-yandex-services} + +ClickHouse sert à des fins multiples dans Yandex.Metrica. +Sa tâche principale est de créer des rapports en mode en ligne en utilisant des données non agrégées. Il utilise un cluster de 374 serveurs qui stockent plus de 20,3 billions de lignes dans la base de données. Le volume de données compressées est d'environ 2 PB, sans tenir compte des doublons et des répliques. Le volume de données non compressées (au format TSV) serait d'environ 17 PB. + +ClickHouse joue également un rôle clé dans les processus suivants: + +- Stockage des données pour la relecture de Session de Yandex.Metrica. +- Traitement des données intermédiaires. +- Création de rapports globaux avec Analytics. +- Exécution de requêtes pour le débogage du Yandex.Moteur Metrica. +- Analyse des journaux de L'API et de l'interface utilisateur. + +De nos jours, il existe plusieurs dizaines d'installations ClickHouse dans D'autres services et départements Yandex: recherche verticale, E-commerce, Publicité, business analytics, développement mobile, Services personnels et autres. + +## Données agrégées et non agrégées {#aggregated-and-non-aggregated-data} + +Il y a une opinion répandue que pour calculer efficacement les statistiques, vous devez agréger les données car cela réduit le volume de données. + +Mais l'agrégation de données est livré avec beaucoup de limitations: + +- Vous devez disposer d'une liste prédéfinie des rapports requis. +- L'utilisateur ne peut pas créer de rapports personnalisés. +- Lors de l'agrégation sur un grand nombre de clés distinctes, le volume de données est à peine réduit, l'agrégation est donc inutile. +- Pour un grand nombre de rapports, il y a trop de variations d'agrégation (explosion combinatoire). +- Lors de l'agrégation de clés avec une cardinalité élevée (telles que les URL), le volume de données n'est pas réduit de beaucoup (moins de deux fois). +- Pour cette raison, le volume de données avec l'agrégation peut augmenter au lieu de diminuer. +- Les utilisateurs ne voient pas tous les rapports que nous générons pour eux. Une grande partie de ces calculs est inutile. +- L'intégrité logique des données peut être violée pour diverses agrégations. + +Si nous n'agrégeons rien et travaillons avec des données non agrégées, cela pourrait réduire le volume des calculs. + +Cependant, avec l'agrégation, une partie importante du travail est déconnectée et achevée relativement calmement. En revanche, les calculs en ligne nécessitent un calcul aussi rapide que possible, car l'utilisateur attend le résultat. + +Yandex.Metrica dispose d'un système spécialisé d'agrégation des données appelé Metrage, qui a été utilisé pour la majorité des rapports. +À partir de 2009, Yandex.Metrica a également utilisé une base de données OLAP spécialisée pour les données non agrégées appelée OLAPServer, qui était auparavant utilisée pour le générateur de rapports. +OLAPServer a bien fonctionné pour les données non agrégées, mais il avait de nombreuses restrictions qui ne lui permettaient pas d'être utilisé pour tous les rapports comme souhaité. Ceux-ci comprenaient le manque de prise en charge des types de données (uniquement des nombres) et l'incapacité de mettre à jour progressivement les données en temps réel (cela ne pouvait être fait qu'en réécrivant les données quotidiennement). OLAPServer n'est pas un SGBD, mais une base de données spécialisée. + +L'objectif initial de ClickHouse était de supprimer les limites D'OLAPServer et de résoudre le problème du travail avec des données non agrégées pour tous les rapports, mais au fil des ans, il est devenu un système de gestion de base de données polyvalent adapté à un large éventail de tâches analytiques. + +[Article Original](https://clickhouse.tech/docs/en/introduction/history/) diff --git a/docs/fr/introduction/performance.md b/docs/fr/introduction/performance.md new file mode 100644 index 00000000000..927579f8d31 --- /dev/null +++ b/docs/fr/introduction/performance.md @@ -0,0 +1,29 @@ +--- +machine_translated: true +--- + +# Performance {#performance} + +Selon les résultats des tests internes chez Yandex, ClickHouse affiche les meilleures performances (à la fois le débit le plus élevé pour les requêtes longues et la latence la plus faible pour les requêtes courtes) pour des scénarios d'exploitation comparables parmi les systèmes de sa classe disponibles pour les tests. Vous pouvez afficher les résultats du test sur un [page séparée](https://clickhouse.tech/benchmark.html). + +De nombreux points de repère indépendants sont arrivés à des conclusions similaires. Ils ne sont pas difficiles à trouver en utilisant une recherche sur internet, ou vous pouvez voir [notre petite collection de liens](https://clickhouse.tech/#independent-benchmarks). + +## Débit pour une seule grande requête {#throughput-for-a-single-large-query} + +Le débit peut être mesuré en lignes par seconde ou en mégaoctets par seconde. Si les données sont placées dans le cache de page, une requête pas trop complexe est traitée sur du matériel moderne à une vitesse d'environ 2-10 GB / s de données non compressées sur un seul serveur (pour les cas les plus simples, la vitesse peut atteindre 30 GB/s). Si les données ne sont pas placées dans le cache de page, la vitesse dépend du sous-système de disque et du taux de compression des données. Par exemple, si le sous-système de disque permet de lire des données à 400 Mo/s et que le taux de compression des données est de 3, la vitesse devrait être d'environ 1,2 Go/s. Pour obtenir la vitesse en lignes par seconde, divisez la vitesse en octets par seconde par la taille totale des colonnes utilisées dans la requête. Par exemple, si 10 octets de colonnes sont extraites, la vitesse devrait être d'environ 100 à 200 millions de lignes par seconde. + +La vitesse de traitement augmente presque linéairement pour le traitement distribué, mais seulement si le nombre de lignes résultant de l'agrégation ou du tri n'est pas trop important. + +## Latence Lors Du Traitement Des Requêtes Courtes {#latency-when-processing-short-queries} + +Si une requête utilise une clé primaire et ne sélectionne pas trop de colonnes et de lignes à traiter (des centaines de milliers), Vous pouvez vous attendre à moins de 50 millisecondes de latence (un seul chiffre de millisecondes dans le meilleur des cas) si les données sont placées dans le cache de page. Sinon, la latence est principalement dominée par le nombre de recherches. Si vous utilisez des lecteurs de disque rotatifs, pour un système qui n'est pas surchargé, la latence peut être estimée avec cette formule: `seek time (10 ms) * count of columns queried * count of data parts`. + +## Débit lors du traitement d'une grande quantité de requêtes courtes {#throughput-when-processing-a-large-quantity-of-short-queries} + +Dans les mêmes conditions, ClickHouse peut traiter plusieurs centaines de requêtes par seconde sur un seul serveur (jusqu'à plusieurs milliers dans le meilleur des cas). Étant donné que ce scénario n'est pas typique pour les SGBD analytiques, nous vous recommandons d'attendre un maximum de 100 requêtes par seconde. + +## Performances Lors De L'Insertion De Données {#performance-when-inserting-data} + +Nous vous recommandons d'insérer des données dans des paquets d'au moins 1000 lignes, ou pas plus qu'une seule demande par seconde. Lors de l'insertion dans une table MergeTree à partir d'un dump séparé par des tabulations, la vitesse d'insertion peut être de 50 à 200 Mo/s. Si les lignes insérées ont une taille d'environ 1 KO, La vitesse sera de 50 000 à 200 000 lignes par seconde. Si les lignes sont petites, les performances peuvent être plus élevées en lignes par seconde (sur les données du système de bannière -`>` 500 000 lignes par seconde; sur les données de Graphite -`>` 1 000 000 lignes par seconde). Pour améliorer les performances, vous pouvez effectuer plusieurs requêtes D'insertion en parallèle, qui s'adaptent linéairement. + +[Article Original](https://clickhouse.tech/docs/en/introduction/performance/) diff --git a/docs/fr/operations/access_rights.md b/docs/fr/operations/access_rights.md new file mode 100644 index 00000000000..1b7bf384518 --- /dev/null +++ b/docs/fr/operations/access_rights.md @@ -0,0 +1,110 @@ +--- +machine_translated: true +--- + +# Les Droits D'Accès {#access-rights} + +Les utilisateurs et les droits d'accès sont configurés dans la configuration utilisateur. Ce n'est généralement `users.xml`. + +Les utilisateurs sont enregistrés dans le `users` section. Voici un fragment de la `users.xml` fichier: + +``` xml + + + + + + + + + + + + default + + + default + + + + + + + web + default + + test + + + test + + + +``` + +Vous pouvez voir une déclaration de deux utilisateurs: `default`et`web`. Nous avons ajouté l' `web` utilisateur séparément. + +Le `default` l'utilisateur est choisi dans les cas où le nom d'utilisateur n'est pas passé. Le `default` l'utilisateur est également utilisé pour le traitement des requêtes distribuées, si la configuration du serveur ou du cluster `user` et `password` (voir la section sur les [Distribué](../operations/table_engines/distributed.md) moteur). + +The user that is used for exchanging information between servers combined in a cluster must not have substantial restrictions or quotas – otherwise, distributed queries will fail. + +Le mot de passe est spécifié en texte clair (non recommandé) ou en SHA-256. Le hash n'est pas salé. À cet égard, vous ne devez pas considérer ces mots de passe comme assurant la sécurité contre les attaques malveillantes potentielles. Au contraire, ils sont nécessaires pour la protection contre les employés. + +Une liste de réseaux est précisé que l'accès est autorisé à partir. Dans cet exemple, la liste des réseaux pour les utilisateurs est chargé à partir d'un fichier séparé (`/etc/metrika.xml`) contenant les `networks` substitution. Voici un fragment de: + +``` xml + + ... + + ::/64 + 203.0.113.0/24 + 2001:DB8::/32 + ... + + +``` + +Vous pouvez définir cette liste de réseaux directement dans `users.xml` ou dans un fichier dans le `users.d` répertoire (pour plus d'informations, consultez la section “[Fichiers de Configuration](configuration_files.md#configuration_files)”). + +La configuration comprend des commentaires expliquant comment ouvrir l'accès de partout. + +Pour une utilisation en production, spécifiez uniquement `ip` (adresses IP et leurs masques), depuis l'utilisation `host` et `hoost_regexp` peut causer une latence supplémentaire. + +Ensuite, le profil des paramètres utilisateur est spécifié (voir la section “[Les paramètres des profils](settings/settings_profiles.md)”. Vous pouvez spécifier le profil par défaut, `default'`. Le profil peut avoir n'importe quel nom. Vous pouvez spécifier le même profil pour différents utilisateurs. La chose la plus importante que vous pouvez écrire dans les paramètres de profil `readonly=1` qui assure un accès en lecture seule. Spécifiez ensuite le quota à utiliser (voir la section “[Quota](quotas.md#quotas)”). Vous pouvez spécifier le quota par défaut: `default`. It is set in the config by default to only count resource usage, without restricting it. The quota can have any name. You can specify the same quota for different users – in this case, resource usage is calculated for each user individually. + +Dans le facultatif `` section, vous pouvez également spécifier une liste de bases de données que l'utilisateur peut accéder. Par défaut, toutes les bases de données sont disponibles pour l'utilisateur. Vous pouvez spécifier l' `default` la base de données. Dans ce cas, l'utilisateur recevra l'accès à la base de données par défaut. + +Dans le facultatif `` section, vous pouvez également spécifier une liste de dictionnaires que l'utilisateur peut accéder. Par défaut, tous les dictionnaires sont disponibles pour l'utilisateur. + +L'accès à la `system` la base de données est toujours autorisée (puisque cette base de données est utilisée pour traiter les requêtes). + +L'utilisateur peut obtenir une liste de toutes les bases de données et tables en utilisant `SHOW` requêtes ou tables système, même si l'accès aux bases de données individuelles n'est pas autorisé. + +Accès de base de données n'est pas liée à la [ReadOnly](settings/permissions_for_queries.md#settings_readonly) paramètre. Vous ne pouvez pas accorder un accès complet à une base de données et `readonly` l'accès à un autre. + +[Article Original](https://clickhouse.tech/docs/en/operations/access_rights/) diff --git a/docs/fr/operations/backup.md b/docs/fr/operations/backup.md new file mode 100644 index 00000000000..2245cd29817 --- /dev/null +++ b/docs/fr/operations/backup.md @@ -0,0 +1,38 @@ +--- +machine_translated: true +--- + +# La Sauvegarde Des Données {#data-backup} + +Alors [réplication](table_engines/replication.md) provides protection from hardware failures, it does not protect against human errors: accidental deletion of data, deletion of the wrong table or a table on the wrong cluster, and software bugs that result in incorrect data processing or data corruption. In many cases mistakes like these will affect all replicas. ClickHouse has built-in safeguards to prevent some types of mistakes — for example, by default [vous ne pouvez pas simplement supprimer des tables avec un moteur de type MergeTree contenant plus de 50 Go de données](https://github.com/ClickHouse/ClickHouse/blob/v18.14.18-stable/dbms/programs/server/config.xml#L322-L330). Toutefois, ces garanties ne couvrent pas tous les cas possibles et peuvent être contournés. + +Afin d'atténuer efficacement les erreurs humaines possibles, vous devez préparer soigneusement une stratégie de sauvegarde et de restauration de vos données **préalablement**. + +Chaque entreprise a différentes ressources disponibles et les exigences de l'entreprise, donc il n'y a pas de solution universelle pour les sauvegardes et restaurations ClickHouse qui s'adaptera à toutes les situations. Ce qui fonctionne pour un gigaoctet de données ne fonctionnera probablement pas pour des dizaines de pétaoctets. Il existe une variété d'approches possibles avec leurs propres avantages et inconvénients, qui sera discuté ci-dessous. C'est une bonne idée d'utiliser plusieurs approches au lieu d'un seul, afin de compenser leurs lacunes. + +!!! note "Note" + Gardez à l'esprit que si vous avez sauvegardé quelque chose et que vous n'avez jamais essayé de le restaurer, il est probable que la restauration ne fonctionnera pas correctement lorsque vous en avez réellement besoin (ou du moins cela prendra plus de temps que ce que les entreprises peuvent tolérer). Donc, quelle que soit l'approche de sauvegarde que vous choisissez, assurez-vous d'automatiser le processus de restauration et de le pratiquer sur un cluster clickhouse de rechange régulièrement. + +## Dupliquer Les Données Sources Ailleurs {#duplicating-source-data-somewhere-else} + +Souvent, les données qui sont ingérées dans ClickHouse sont livrées via une sorte de file d'attente persistante, telle que [Apache Kafka](https://kafka.apache.org). Dans ce cas, il est possible de configurer un ensemble supplémentaire d'abonnés qui liront le même flux de données pendant qu'il est écrit dans ClickHouse et le stockeront dans un stockage à froid quelque part. La plupart des entreprises ont déjà un stockage à froid recommandé par défaut, qui pourrait être un magasin d'objets ou un système de fichiers distribué comme [HDFS](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html). + +## Instantanés Du Système De Fichiers {#filesystem-snapshots} + +Certains systèmes de fichiers locaux fournissent des fonctionnalités d'instantané (par exemple, [ZFS](https://en.wikipedia.org/wiki/ZFS)), mais ils pourraient ne pas être le meilleur choix pour servir les requêtes actives. Une solution possible consiste à créer des répliques supplémentaires avec ce type de système de fichiers et à les exclure du [Distribué](table_engines/distributed.md) les tables qui sont utilisés pour `SELECT` requête. Les instantanés sur ces répliques seront hors de portée des requêtes qui modifient les données. En prime, ces répliques pourraient avoir des configurations matérielles spéciales avec plus de disques attachés par serveur, ce qui serait rentable. + +## clickhouse-copieur {#clickhouse-copier} + +[clickhouse-copieur](utils/clickhouse-copier.md) est un outil polyvalent qui a été initialement créé pour re-shard petaoctet - sized tables. Il peut également être utilisé à des fins de sauvegarde et de restauration car il copie de manière fiable les données entre les tables ClickHouse et les clusters. + +Pour de plus petits volumes de données, un simple `INSERT INTO ... SELECT ...` les tables distantes peuvent également fonctionner. + +## Manipulations avec des pièces {#manipulations-with-parts} + +ClickHouse permet d'utiliser le `ALTER TABLE ... FREEZE PARTITION ...` requête pour créer une copie locale des partitions de table. Ceci est implémenté en utilisant des liens durs vers le `/var/lib/clickhouse/shadow/` dossier, donc il ne consomme généralement pas d'espace disque supplémentaire pour les anciennes données. Les copies créées des fichiers ne sont pas gérées par clickhouse server, vous pouvez donc les laisser là: vous aurez une sauvegarde simple qui ne nécessite aucun système externe supplémentaire, mais elle sera toujours sujette à des problèmes matériels. Pour cette raison, il est préférable de les copier à distance vers un autre emplacement, puis de supprimer les copies locales. Les systèmes de fichiers distribués et les magasins d'objets sont toujours une bonne option pour cela, mais les serveurs de fichiers attachés normaux avec une capacité suffisante peuvent également fonctionner (dans ce cas, le transfert se fera via le système de fichiers réseau ou peut-être [rsync](https://en.wikipedia.org/wiki/Rsync)). + +Pour plus d'informations sur les requêtes liées aux manipulations de [Modifier la documentation](../query_language/alter.md#alter_manipulations-with-partitions). + +Un outil tiers est disponible pour automatiser cette approche: [clickhouse-sauvegarde](https://github.com/AlexAkulov/clickhouse-backup). + +[Article Original](https://clickhouse.tech/docs/en/operations/backup/) diff --git a/docs/fr/operations/configuration_files.md b/docs/fr/operations/configuration_files.md new file mode 100644 index 00000000000..4ead122eb41 --- /dev/null +++ b/docs/fr/operations/configuration_files.md @@ -0,0 +1,54 @@ +--- +machine_translated: true +--- + +# Fichiers De Configuration {#configuration_files} + +ClickHouse prend en charge la gestion de la configuration multi-fichiers. Le fichier de configuration du serveur principal est `/etc/clickhouse-server/config.xml`. Les autres fichiers doivent être dans le `/etc/clickhouse-server/config.d` répertoire. + +!!! note "Note" + Tous les fichiers de configuration doivent être au format XML. Aussi, ils doivent avoir le même élément racine, généralement ``. + +Certains paramètres spécifiés dans le fichier de configuration principal peuvent être remplacés dans d'autres fichiers de configuration. Le `replace` ou `remove` les attributs peuvent être spécifiés pour les éléments de ces fichiers de configuration. + +Si ni l'un ni l'autre n'est spécifié, il combine le contenu des éléments de manière récursive, remplaçant les valeurs des enfants en double. + +Si `replace` est spécifié, il remplace l'élément entier par celui spécifié. + +Si `remove` est spécifié, il supprime l'élément. + +La configuration peut également définir “substitutions”. Si un élément a le `incl` attribut, la substitution correspondante du fichier sera utilisée comme valeur. Par défaut, le chemin d'accès au fichier avec des substitutions est `/etc/metrika.xml`. Ceci peut être changé dans le [include\_from](server_settings/settings.md#server_settings-include_from) élément dans la configuration du serveur. Les valeurs de substitution sont spécifiées dans `/yandex/substitution_name` les éléments de ce fichier. Si une substitution spécifiée dans `incl` n'existe pas, il est enregistré dans le journal. Pour empêcher ClickHouse de consigner les substitutions manquantes, spécifiez `optional="true"` attribut (par exemple, les paramètres de [macro](server_settings/settings.md)). + +Les Substitutions peuvent également être effectuées à partir de ZooKeeper. Pour ce faire, spécifiez l'attribut `from_zk = "/path/to/node"`. La valeur de l'élément est remplacé par le contenu du noeud au `/path/to/node` dans ZooKeeper. Vous pouvez également placer un sous-arbre XML entier sur le nœud ZooKeeper et il sera entièrement inséré dans l'élément source. + +Le `config.xml` le fichier peut spécifier une configuration distincte avec les paramètres utilisateur, les profils et les quotas. Le chemin relatif à cette configuration est défini dans `users_config` élément. Par défaut, il est `users.xml`. Si `users_config` est omis, les paramètres utilisateur, les profils et les quotas sont `config.xml`. + +La configuration des utilisateurs peut être divisée en fichiers séparés similaires à `config.xml` et `config.d/`. +Nom du répertoire est défini comme `users_config` sans `.xml` postfix concaténé avec `.d`. +Répertoire `users.d` est utilisé par défaut, comme `users_config` par défaut `users.xml`. +Par exemple, vous pouvez avoir séparé fichier de configuration pour chaque utilisateur comme ceci: + +``` bash +$ cat /etc/clickhouse-server/users.d/alice.xml +``` + +``` xml + + + + analytics + + ::/0 + + ... + analytics + + + +``` + +Pour chaque fichier de configuration, le serveur génère également `file-preprocessed.xml` les fichiers lors du démarrage. Ces fichiers contiennent toutes les remplacements et des remplacements, et ils sont destinés à l'usage informatif. Si des substitutions ZooKeeper ont été utilisées dans les fichiers de configuration mais que ZooKeeper n'est pas disponible au démarrage du serveur, le serveur charge la configuration à partir du fichier prétraité. + +Le serveur suit les changements dans les fichiers de configuration, ainsi que les fichiers et les nœuds ZooKeeper utilisés lors des substitutions et des remplacements, et recharge les paramètres pour les utilisateurs et les clusters à la volée. Cela signifie que vous pouvez modifier le cluster, les utilisateurs et leurs paramètres sans redémarrer le serveur. + +[Article Original](https://clickhouse.tech/docs/en/operations/configuration_files/) diff --git a/docs/fr/operations/index.md b/docs/fr/operations/index.md new file mode 100644 index 00000000000..a6c0a82ef73 --- /dev/null +++ b/docs/fr/operations/index.md @@ -0,0 +1,24 @@ +--- +machine_translated: true +--- + +# Opérations {#operations} + +Le manuel d'exploitation de ClickHouse comprend les principales sections suivantes: + +- [Exigence](requirements.md) +- [Surveiller](monitoring.md) +- [Dépannage](troubleshooting.md) +- [Recommandations D'Utilisation](tips.md) +- [Procédure De Mise À Jour](update.md) +- [Les Droits D'Accès](access_rights.md) +- [La Sauvegarde Des Données](backup.md) +- [Fichiers De Configuration](configuration_files.md) +- [Quota](quotas.md) +- [Les Tables Système](system_tables.md) +- [Paramètres De Configuration Du Serveur](server_settings/index.md) +- [Comment Tester Votre Matériel Avec ClickHouse](performance_test.md) +- [Paramètre](settings/index.md) +- [Utilitaire](utils/index.md) + +[Article Original](https://clickhouse.tech/docs/en/operations/) diff --git a/docs/fr/operations/monitoring.md b/docs/fr/operations/monitoring.md new file mode 100644 index 00000000000..7921447910c --- /dev/null +++ b/docs/fr/operations/monitoring.md @@ -0,0 +1,41 @@ +--- +machine_translated: true +--- + +# Surveiller {#monitoring} + +Vous pouvez surveiller: + +- L'utilisation des ressources matérielles. +- Statistiques du serveur ClickHouse. + +## L'Utilisation Des Ressources {#resource-utilization} + +ClickHouse ne surveille pas l'état des ressources matérielles par lui-même. + +Il est fortement recommandé de configurer la surveillance de: + +- Charge et température sur les processeurs. + + Vous pouvez utiliser [dmesg](https://en.wikipedia.org/wiki/Dmesg), [turbostat](https://www.linux.org/docs/man8/turbostat.html) ou d'autres instruments. + +- Utilisation du système de stockage, de la RAM et du réseau. + +## Métriques Du Serveur ClickHouse {#clickhouse-server-metrics} + +Clickhouse server a des instruments embarqués pour la surveillance de l'auto-état. + +Pour suivre les événements du serveur, utilisez les journaux du serveur. Voir la [enregistreur](server_settings/settings.md#server_settings-logger) section du fichier de configuration. + +Clickhouse recueille: + +- Différentes mesures de la façon dont le serveur utilise les ressources de calcul. +- Statistiques communes sur le traitement des requêtes. + +Vous pouvez trouver des mesures dans le [système.métrique](system_tables.md#system_tables-metrics), [système.événement](system_tables.md#system_tables-events), et [système.asynchronous\_metrics](system_tables.md#system_tables-asynchronous_metrics) table. + +Vous pouvez configurer ClickHouse pour exporter des métriques vers [Graphite](https://github.com/graphite-project). Voir la [Graphite section](server_settings/settings.md#server_settings-graphite) dans le fichier de configuration du serveur ClickHouse. Avant de configurer l'exportation des métriques, vous devez configurer Graphite en suivant leur [guide](https://graphite.readthedocs.io/en/latest/install.html). + +De plus, vous pouvez surveiller la disponibilité du serveur via L'API HTTP. Envoyer la `HTTP GET` demande à `/ping`. Si le serveur est disponible, il répond avec `200 OK`. + +Pour surveiller les serveurs dans une configuration de cluster, vous devez [max\_replica\_delay\_for\_distributed\_queries](settings/settings.md#settings-max_replica_delay_for_distributed_queries) paramètre et utiliser la ressource HTTP `/replicas_status`. Une demande de `/replicas_status` retourner `200 OK` si la réplique est disponible et n'est pas retardé derrière les autres réplicas. Si une réplique est retardée, elle revient `503 HTTP_SERVICE_UNAVAILABLE` avec des informations sur l'écart. diff --git a/docs/fr/operations/performance/sampling_query_profiler.md b/docs/fr/operations/performance/sampling_query_profiler.md new file mode 100644 index 00000000000..cc64ed72b68 --- /dev/null +++ b/docs/fr/operations/performance/sampling_query_profiler.md @@ -0,0 +1,61 @@ +--- +machine_translated: true +--- + +# Échantillonnage Du Profileur De Requête {#sampling-query-profiler} + +ClickHouse exécute un profileur d'échantillonnage qui permet d'analyser l'exécution des requêtes. En utilisant profiler, vous pouvez trouver des routines de code source qui ont utilisé le plus fréquemment lors de l'exécution de la requête. Vous pouvez suivre le temps CPU et le temps d'horloge murale passé, y compris le temps d'inactivité. + +Utilisation du générateur de profils: + +- Installation de la [trace\_log](../server_settings/settings.md#server_settings-trace_log) la section de la configuration du serveur. + + Cette section configure le [trace\_log](../system_tables.md#system_tables-trace_log) tableau système contenant les résultats du fonctionnement du profileur. Il est configuré par défaut. Rappelez-vous que les données de ce tableau est valable que pour un serveur en cours d'exécution. Après le redémarrage du serveur, ClickHouse ne nettoie pas la table et toute l'adresse de mémoire virtuelle stockée peut devenir invalide. + +- Installation de la [query\_profiler\_cpu\_time\_period\_ns](../settings/settings.md#query_profiler_cpu_time_period_ns) ou [query\_profiler\_real\_time\_period\_ns](../settings/settings.md#query_profiler_real_time_period_ns) paramètre. Les deux paramètres peuvent être utilisés simultanément. + + Ces paramètres vous permettent de configurer les minuteries du profileur. Comme il s'agit des paramètres de session, vous pouvez obtenir une fréquence d'échantillonnage différente pour l'ensemble du serveur, les utilisateurs individuels ou les profils d'utilisateurs, pour votre session interactive et pour chaque requête individuelle. + +La fréquence d'échantillonnage par défaut est d'un échantillon par seconde et le processeur et les minuteries réelles sont activés. Cette fréquence permet de collecter suffisamment d'informations sur le cluster ClickHouse. En même temps, en travaillant avec cette fréquence, profiler n'affecte pas les performances du serveur ClickHouse. Si vous avez besoin de profiler chaque requête individuelle, essayez d'utiliser une fréquence d'échantillonnage plus élevée. + +Pour analyser les `trace_log` système de table: + +- Installer le `clickhouse-common-static-dbg` paquet. Voir [Installer à partir de paquets DEB](../../getting_started/install.md#install-from-deb-packages). + +- Autoriser les fonctions d'introspection par [allow\_introspection\_functions](../settings/settings.md#settings-allow_introspection_functions) paramètre. + + Pour des raisons de sécurité, les fonctions d'introspection sont désactivées par défaut. + +- L'utilisation de la `addressToLine`, `addressToSymbol` et `demangle` [fonctions d'introspection](../../query_language/functions/introspection.md) pour obtenir les noms de fonctions et leurs positions dans le code ClickHouse. Pour obtenir un profil pour une requête, vous devez agréger les données du `trace_log` table. Vous pouvez agréger des données par des fonctions individuelles ou par l'ensemble des traces de la pile. + +Si vous avez besoin de visualiser `trace_log` info, essayez [flamegraph](../../interfaces/third-party/gui/#clickhouse-flamegraph) et [speedscope](https://github.com/laplab/clickhouse-speedscope). + +## Exemple {#example} + +Dans cet exemple, nous: + +- Filtrage `trace_log` données par un identifiant de requête et la date actuelle. + +- Agrégation par trace de pile. + +- En utilisant les fonctions d'introspection, nous obtiendrons un rapport de: + + - Noms des symboles et des fonctions de code source correspondantes. + - Emplacements de code Source de ces fonctions. + + + +``` sql +SELECT + count(), + arrayStringConcat(arrayMap(x -> concat(demangle(addressToSymbol(x)), '\n ', addressToLine(x)), trace), '\n') AS sym +FROM system.trace_log +WHERE (query_id = 'ebca3574-ad0a-400a-9cbc-dca382f5998c') AND (event_date = today()) +GROUP BY trace +ORDER BY count() DESC +LIMIT 10 +``` + +``` text +{% include "operations/performance/sampling_query_profiler_example_result.txt" %} +``` diff --git a/docs/fr/operations/performance/sampling_query_profiler_example_result.txt b/docs/fr/operations/performance/sampling_query_profiler_example_result.txt new file mode 120000 index 00000000000..58c5abe7122 --- /dev/null +++ b/docs/fr/operations/performance/sampling_query_profiler_example_result.txt @@ -0,0 +1 @@ +../../../en/operations/performance/sampling_query_profiler_example_result.txt \ No newline at end of file diff --git a/docs/fr/operations/performance_test.md b/docs/fr/operations/performance_test.md new file mode 100644 index 00000000000..dc9fc7f0e4a --- /dev/null +++ b/docs/fr/operations/performance_test.md @@ -0,0 +1,79 @@ +--- +machine_translated: true +--- + +# Comment Tester Votre Matériel Avec ClickHouse {#how-to-test-your-hardware-with-clickhouse} + +Avec cette instruction, vous pouvez exécuter le test de performance clickhouse de base sur n'importe quel serveur sans installation de paquets ClickHouse. + +1. Aller à “commits” page: https://github.com/ClickHouse/ClickHouse/commits/master + +2. Cliquez sur la première coche verte ou croix rouge avec vert “ClickHouse Build Check” et cliquez sur le “Details” lien de proximité “ClickHouse Build Check”. + +3. Copiez le lien à “clickhouse” binaire pour amd64 ou aarch64. + +4. ssh sur le serveur et le télécharger avec wget: + + + + # For amd64: + wget https://clickhouse-builds.s3.yandex.net/0/00ba767f5d2a929394ea3be193b1f79074a1c4bc/1578163263_binary/clickhouse + # For aarch64: + wget https://clickhouse-builds.s3.yandex.net/0/00ba767f5d2a929394ea3be193b1f79074a1c4bc/1578161264_binary/clickhouse + # Then do: + chmod a+x clickhouse + +1. Télécharger configs: + + + + wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/dbms/programs/server/config.xml + wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/dbms/programs/server/users.xml + mkdir config.d + wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/dbms/programs/server/config.d/path.xml -O config.d/path.xml + wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/dbms/programs/server/config.d/log_to_console.xml -O config.d/log_to_console.xml + +1. Télécharger des fichiers de référence: + + + + wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/dbms/benchmark/clickhouse/benchmark-new.sh + chmod a+x benchmark-new.sh + wget https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/dbms/benchmark/clickhouse/queries.sql + +1. Télécharger les données de test selon le [Yandex.Metrica dataset](../getting_started/example_datasets/metrica.md) instruction (“hits” tableau contenant 100 millions de lignes). + + + + wget https://clickhouse-datasets.s3.yandex.net/hits/partitions/hits_100m_obfuscated_v1.tar.xz + tar xvf hits_100m_obfuscated_v1.tar.xz -C . + mv hits_100m_obfuscated_v1/* . + +1. Exécuter le serveur: + + + + ./clickhouse server + +1. Vérifiez les données: ssh au serveur dans un autre terminal + + + + ./clickhouse client --query "SELECT count() FROM hits_100m_obfuscated" + 100000000 + +1. Modifier le benchmark-new.sh, changement “clickhouse-client” de “./clickhouse client” et d'ajouter “–max\_memory\_usage 100000000000” paramètre. + + + + mcedit benchmark-new.sh + +1. Exécutez le test: + + + + ./benchmark-new.sh hits_100m_obfuscated + +1. Envoyez les numéros et les informations sur votre configuration matérielle à clickhouse-feedback@yandex-team.com + +Tous les résultats sont publiés ici: https://clickhouse.tech / benchmark\_hardware.HTML diff --git a/docs/fr/operations/quotas.md b/docs/fr/operations/quotas.md new file mode 100644 index 00000000000..6b921c5c665 --- /dev/null +++ b/docs/fr/operations/quotas.md @@ -0,0 +1,109 @@ +--- +machine_translated: true +--- + +# Quota {#quotas} + +Les Quotas permettent de limiter l'utilisation des ressources au cours d'une période de temps, ou tout simplement suivre l'utilisation des ressources. +Les Quotas sont configurés dans la configuration utilisateur. Ce n'est généralement ‘users.xml’. + +Le système dispose également d'une fonctionnalité pour limiter la complexité d'une seule requête. Voir la section “Restrictions on query complexity”). + +Contrairement aux restrictions de complexité des requêtes, les quotas: + +- Placez des restrictions sur un ensemble de requêtes qui peuvent être exécutées sur une période de temps, au lieu de limiter une seule requête. +- Compte des ressources dépensées sur tous les serveurs distants pour le traitement des requêtes distribuées. + +Regardons la section de la ‘users.xml’ fichier qui définit les quotas. + +``` xml + + + + + + + + 3600 + + + 0 + 0 + 0 + 0 + 0 + + +``` + +Par défaut, le quota suit simplement la consommation de ressources pour chaque heure, sans limiter l'utilisation. +La consommation de ressources calculé pour chaque intervalle est sortie dans le journal du serveur après chaque demande. + +``` xml + + + + + 3600 + + 1000 + 100 + 1000000000 + 100000000000 + 900 + + + + 86400 + + 10000 + 1000 + 5000000000 + 500000000000 + 7200 + + +``` + +Pour l' ‘statbox’ quota, restrictions sont fixées pour toutes les heures et pour toutes les 24 heures (86 400 secondes). L'intervalle de temps est compté à partir d'un moment fixe défini par l'implémentation. En d'autres termes, l'intervalle de 24 heures ne commence pas nécessairement à minuit. + +Lorsque l'intervalle se termine, toutes les valeurs collectées sont effacées. Pour l'heure suivante, le calcul du quota recommence. + +Voici les montants qui peuvent être restreint: + +`queries` – The total number of requests. + +`errors` – The number of queries that threw an exception. + +`result_rows` – The total number of rows given as the result. + +`read_rows` – The total number of source rows read from tables for running the query, on all remote servers. + +`execution_time` – The total query execution time, in seconds (wall time). + +Si la limite est dépassée pendant au moins un intervalle de temps, une exception est levée avec un texte indiquant quelle restriction a été dépassée, pour quel intervalle et quand le nouvel intervalle commence (lorsque les requêtes peuvent être envoyées à nouveau). + +Les Quotas peuvent utiliser le “quota key” fonctionnalité afin de rendre compte des ressources pour plusieurs clés indépendamment. Voici un exemple de ce: + +``` xml + + + + +``` + +Le quota est attribué aux utilisateurs dans le ‘users’ section de la configuration. Voir la section “Access rights”. + +Pour le traitement des requêtes distribuées, les montants accumulés sont stockés sur le serveur demandeur. Donc, si l'utilisateur se rend sur un autre serveur, le quota y sera “start over”. + +Lorsque le serveur est redémarré, les quotas sont réinitialisés. + +[Article Original](https://clickhouse.tech/docs/en/operations/quotas/) diff --git a/docs/fr/operations/requirements.md b/docs/fr/operations/requirements.md new file mode 100644 index 00000000000..b8baa200f92 --- /dev/null +++ b/docs/fr/operations/requirements.md @@ -0,0 +1,58 @@ +--- +machine_translated: true +--- + +# Exigence {#requirements} + +## CPU {#cpu} + +Pour l'installation à partir de paquets deb prédéfinis, utilisez un processeur avec l'architecture x86\_64 et la prise en charge des instructions SSE 4.2. Pour exécuter ClickHouse avec des processeurs qui ne prennent pas en charge SSE 4.2 ou qui ont une architecture AArch64 ou PowerPC64LE, vous devez créer ClickHouse à partir de sources. + +ClickHouse implémente le traitement parallèle des données et utilise toutes les ressources matérielles disponibles. Lors du choix d'un processeur, tenez compte du fait que ClickHouse fonctionne plus efficacement dans les configurations avec un grand nombre de cœurs mais une fréquence d'horloge plus faible que dans les configurations avec moins de cœurs et une fréquence d'horloge plus élevée. Par exemple, 16 cœurs avec 2600 MHz est préférable à 8 cœurs avec 3600 MHz. + +L'utilisation de **Turbo Boost** et **la technologie hyper-threading** technologies est recommandé. Il améliore sensiblement les performances avec une charge typique. + +## RAM {#ram} + +Nous vous recommandons d'utiliser un minimum de 4 Go de RAM afin d'effectuer des requêtes non triviales. Le serveur ClickHouse peut fonctionner avec une quantité beaucoup plus petite de RAM, mais il nécessite de la mémoire pour traiter les requêtes. + +Le volume de RAM requis dépend de: + +- La complexité des requêtes. +- La quantité de données traitées dans les requêtes. + +Pour calculer le volume de RAM requis, vous devez estimer la taille des données temporaires pour [GROUP BY](../query_language/select.md#select-group-by-clause), [DISTINCT](../query_language/select.md#select-distinct), [JOIN](../query_language/select.md#select-join) et d'autres opérations que vous utilisez. + +ClickHouse peut utiliser la mémoire externe pour les données temporaires. Voir [Groupe par dans la mémoire externe](../query_language/select.md#select-group-by-in-external-memory) pour plus de détails. + +## Fichier D'Échange {#swap-file} + +Désactiver le fichier d'échange pour les environnements de production. + +## Sous-Système De Stockage {#storage-subsystem} + +Vous devez avoir 2 Go d'espace disque libre pour installer ClickHouse. + +Le volume de stockage requis pour vos données doit être calculé séparément. L'évaluation devrait inclure: + +- Estimation du volume de données. + + Vous pouvez prendre un échantillon des données et obtenir la taille moyenne d'une ligne. Ensuite, multipliez la valeur par le nombre de lignes que vous souhaitez stocker. + +- Le coefficient de compression des données. + + Pour estimer le coefficient de compression des données, chargez un échantillon de vos données dans ClickHouse et comparez la taille réelle des données avec la taille de la table stockée. Par exemple, les données de flux de clics sont généralement compressées de 6 à 10 fois. + +Pour calculer le volume final de données à stocker, appliquez le coefficient de compression au volume de données estimé. Si vous prévoyez de stocker des données dans plusieurs répliques, puis multipliez le volume estimé par le nombre de réplicas. + +## Réseau {#network} + +Si possible, utilisez des réseaux de classe 10G ou supérieure. + +La bande passante du réseau est essentielle pour traiter les requêtes distribuées avec une grande quantité de données intermédiaires. En outre, la vitesse du réseau affecte les processus de réplication. + +## Logiciel {#software} + +ClickHouse est développé pour la famille de systèmes D'exploitation Linux. La distribution Linux recommandée est Ubuntu. Le `tzdata` paquet doit être installé dans le système. + +ClickHouse peut également fonctionner dans d'autres familles de systèmes d'exploitation. Voir les détails dans le [Prise en main](../getting_started/index.md) section de la documentation. diff --git a/docs/fr/operations/server_settings/index.md b/docs/fr/operations/server_settings/index.md new file mode 100644 index 00000000000..02e7d5cb305 --- /dev/null +++ b/docs/fr/operations/server_settings/index.md @@ -0,0 +1,15 @@ +--- +machine_translated: true +--- + +# Paramètres de configuration du serveur {#server-settings} + +Cette section contient des descriptions des paramètres du serveur qui ne peuvent pas être modifiés au niveau de la session ou de la requête. + +Ces paramètres sont stockés dans la `config.xml` fichier sur le serveur ClickHouse. + +D'autres paramètres sont décrits dans le “[Paramètre](../settings/index.md#settings)” section. + +Avant d'étudier les paramètres, lire la [Fichiers de Configuration](../configuration_files.md#configuration_files) section et notez l'utilisation de substitutions (le `incl` et `optional` attribut). + +[Article Original](https://clickhouse.tech/docs/en/operations/server_settings/) diff --git a/docs/fr/operations/server_settings/settings.md b/docs/fr/operations/server_settings/settings.md new file mode 100644 index 00000000000..fb5c5c11261 --- /dev/null +++ b/docs/fr/operations/server_settings/settings.md @@ -0,0 +1,869 @@ +--- +machine_translated: true +--- + +# Les Paramètres Du Serveur {#server-settings} + +## builtin\_dictionaries\_reload\_interval {#builtin-dictionaries-reload-interval} + +L'intervalle en secondes avant de recharger les dictionnaires intégrés. + +Clickhouse recharge les dictionnaires intégrés toutes les X secondes. Cela permet d'éditer des dictionnaires “on the fly” sans redémarrer le serveur. + +Valeur par défaut: 3600. + +**Exemple** + +``` xml +3600 +``` + +## compression {#server-settings-compression} + +Paramètres de compression de données pour [MergeTree](../table_engines/mergetree.md)-tables de moteur. + +!!! warning "Avertissement" + Ne l'utilisez pas si vous venez de commencer à utiliser ClickHouse. + +Modèle de Configuration: + +``` xml + + + ... + ... + ... + + ... + +``` + +`` Fields: + +- `min_part_size` – The minimum size of a data part. +- `min_part_size_ratio` – The ratio of the data part size to the table size. +- `method` – Compression method. Acceptable values: `lz4` ou `zstd`. + +Vous pouvez configurer plusieurs `` section. + +Actions lorsque les conditions sont remplies: + +- Si une partie de données correspond à un ensemble de conditions, ClickHouse utilise la méthode de compression spécifiée. +- Si une partie de données correspond à plusieurs ensembles de conditions, ClickHouse utilise le premier ensemble de conditions correspondant. + +Si aucune condition n'est remplie pour une partie de données, ClickHouse utilise `lz4` compression. + +**Exemple** + +``` xml + + + 10000000000 + 0.01 + zstd + + +``` + +## default\_database {#default-database} + +La base de données par défaut. + +Pour obtenir une liste de bases de données, utilisez la [SHOW DATABASES](../../query_language/show.md#show-databases) requête. + +**Exemple** + +``` xml +default +``` + +## default\_profile {#default-profile} + +Profil des paramètres par défaut. + +Les paramètres des profils sont situés dans le fichier spécifié dans le paramètre `user_config`. + +**Exemple** + +``` xml +default +``` + +## dictionaries\_config {#server_settings-dictionaries_config} + +Chemin d'accès au fichier de configuration des dictionnaires externes. + +Chemin: + +- Spécifiez le chemin absolu ou le chemin relatif au fichier de configuration du serveur. +- Le chemin peut contenir des caractères génériques \* et ?. + +Voir aussi “[Dictionnaires externes](../../query_language/dicts/external_dicts.md)”. + +**Exemple** + +``` xml +*_dictionary.xml +``` + +## dictionaries\_lazy\_load {#server_settings-dictionaries_lazy_load} + +Chargement paresseux des dictionnaires. + +Si `true` chaque dictionnaire est créé lors de la première utilisation. Si la création du dictionnaire a échoué, la fonction qui utilisait le dictionnaire lève une exception. + +Si `false`, tous les dictionnaires sont créés lorsque le serveur démarre, et si il y a une erreur, le serveur s'arrête. + +La valeur par défaut est `true`. + +**Exemple** + +``` xml +true +``` + +## format\_schema\_path {#server_settings-format_schema_path} + +Le chemin d'accès au répertoire avec des régimes pour l'entrée de données, tels que les schémas pour l' [CapnProto](../../interfaces/formats.md#capnproto) format. + +**Exemple** + +``` xml + + format_schemas/ +``` + +## graphite {#server_settings-graphite} + +Envoi de données à [Graphite](https://github.com/graphite-project). + +Paramètre: + +- host – The Graphite server. +- port – The port on the Graphite server. +- interval – The interval for sending, in seconds. +- timeout – The timeout for sending data, in seconds. +- root\_path – Prefix for keys. +- metrics – Sending data from the [système.métrique](../system_tables.md#system_tables-metrics) table. +- events – Sending deltas data accumulated for the time period from the [système.événement](../system_tables.md#system_tables-events) table. +- events\_cumulative – Sending cumulative data from the [système.événement](../system_tables.md#system_tables-events) table. +- asynchronous\_metrics – Sending data from the [système.asynchronous\_metrics](../system_tables.md#system_tables-asynchronous_metrics) table. + +Vous pouvez configurer plusieurs `` clause. Par exemple, vous pouvez l'utiliser pour envoyer des données différentes à différents intervalles. + +**Exemple** + +``` xml + + localhost + 42000 + 0.1 + 60 + one_min + true + true + false + true + +``` + +## graphite\_rollup {#server_settings-graphite-rollup} + +Paramètres pour l'amincissement des données pour le Graphite. + +Pour plus de détails, voir [GraphiteMergeTree](../table_engines/graphitemergetree.md). + +**Exemple** + +``` xml + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + +``` + +## http\_port/https\_port {#http-porthttps-port} + +Port de connexion au serveur via HTTP(S). + +Si `https_port` est spécifié, [openSSL](#server_settings-openssl) doit être configuré. + +Si `http_port` est spécifié, la configuration OpenSSL est ignorée même si elle est définie. + +**Exemple** + +``` xml +0000 +``` + +## http\_server\_default\_response {#server_settings-http_server_default_response} + +Page affichée par défaut lorsque vous accédez au serveur HTTP(S) ClickHouse. +La valeur par défaut est “Ok.” (avec un saut de ligne à la fin) + +**Exemple** + +Ouvrir `https://tabix.io/` lors de l'accès à `http://localhost: http_port`. + +``` xml + +
]]> +
+``` + +## include\_from {#server_settings-include_from} + +Le chemin d'accès au fichier avec des substitutions. + +Pour plus d'informations, consultez la section “[Fichiers de Configuration](../configuration_files.md#configuration_files)”. + +**Exemple** + +``` xml +/etc/metrica.xml +``` + +## interserver\_http\_port {#interserver-http-port} + +Port pour l'échange de données entre les serveurs ClickHouse. + +**Exemple** + +``` xml +9009 +``` + +## interserver\_http\_host {#interserver-http-host} + +Le nom d'hôte qui peut être utilisé par d'autres serveurs pour accéder à ce serveur. + +Si elle est omise, elle est définie de la même manière que `hostname-f` commande. + +Utile pour rompre avec une interface réseau spécifique. + +**Exemple** + +``` xml +example.yandex.ru +``` + +## interserver\_http\_credentials {#server-settings-interserver-http-credentials} + +Le nom d'utilisateur et le mot de passe utilisés pour [réplication](../table_engines/replication.md) avec les moteurs \* répliqués. Ces informations d'identification sont utilisées uniquement pour la communication entre les répliques et ne sont pas liées aux informations d'identification des clients ClickHouse. Le serveur vérifie ces informations d'identification pour la connexion de répliques et utilise les mêmes informations d'identification lors de la connexion à d'autres répliques. Donc, ces informations d'identification doivent être identiques pour tous les réplicas dans un cluster. +Par défaut, l'authentification n'est pas utilisé. + +Cette section contient les paramètres suivants: + +- `user` — username. +- `password` — password. + +**Exemple** + +``` xml + + admin + 222 + +``` + +## keep\_alive\_timeout {#keep-alive-timeout} + +Le nombre de secondes que ClickHouse attend pour les demandes entrantes avant de fermer la connexion. Par défaut est de 3 secondes. + +**Exemple** + +``` xml +3 +``` + +## listen\_host {#server_settings-listen_host} + +Restriction sur les hôtes dont les demandes peuvent provenir. Si vous voulez que le serveur réponde à tous, spécifiez `::`. + +Exemple: + +``` xml +::1 +127.0.0.1 +``` + +## enregistreur {#server_settings-logger} + +Paramètres de journalisation. + +Touches: + +- level – Logging level. Acceptable values: `trace`, `debug`, `information`, `warning`, `error`. +- log – The log file. Contains all the entries according to `level`. +- errorlog – Error log file. +- size – Size of the file. Applies to `log`et`errorlog`. Une fois que le fichier atteint `size`, Archives ClickHouse et le renomme, et crée un nouveau fichier journal à sa place. +- count – The number of archived log files that ClickHouse stores. + +**Exemple** + +``` xml + + trace + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 10 + +``` + +L'écriture dans le syslog est également prise en charge. Exemple de Config: + +``` xml + + 1 + +
syslog.remote:10514
+ myhost.local + LOG_LOCAL6 + syslog +
+
+``` + +Touches: + +- use\_syslog — Required setting if you want to write to the syslog. +- address — The host\[:port\] of syslogd. If omitted, the local daemon is used. +- hostname — Optional. The name of the host that logs are sent from. +- facility — [Le mot clé syslog facility](https://en.wikipedia.org/wiki/Syslog#Facility) en majuscules avec la “LOG\_” préfixe: (`LOG_USER`, `LOG_DAEMON`, `LOG_LOCAL3` et ainsi de suite). + Valeur par défaut: `LOG_USER` si `address` est spécifié, `LOG_DAEMON otherwise.` +- format – Message format. Possible values: `bsd` et `syslog.` + +## macro {#macros} + +Substitutions de paramètres pour les tables répliquées. + +Peut être omis si les tables répliquées ne sont pas utilisées. + +Pour plus d'informations, consultez la section “[Création de tables répliquées](../../operations/table_engines/replication.md)”. + +**Exemple** + +``` xml + +``` + +## mark\_cache\_size {#server-mark-cache-size} + +Taille approximative (en octets) du cache des marques utilisées par les [MergeTree](../table_engines/mergetree.md) famille. + +Le cache est partagé pour le serveur et la mémoire est allouée au besoin. La taille du cache doit être d'au moins 5368709120. + +**Exemple** + +``` xml +5368709120 +``` + +## max\_concurrent\_queries {#max-concurrent-queries} + +Nombre maximal de demandes traitées simultanément. + +**Exemple** + +``` xml +100 +``` + +## max\_connections {#max-connections} + +Le nombre maximal de connexions entrantes. + +**Exemple** + +``` xml +4096 +``` + +## max\_open\_files {#max-open-files} + +Le nombre maximal de fichiers ouverts. + +Par défaut: `maximum`. + +Nous vous recommandons d'utiliser cette option sous Mac OS X depuis le `getrlimit()` la fonction renvoie une valeur incorrecte. + +**Exemple** + +``` xml +262144 +``` + +## max\_table\_size\_to\_drop {#max-table-size-to-drop} + +Restriction sur la suppression de tables. + +Si la taille d'un [MergeTree](../table_engines/mergetree.md) table dépasse `max_table_size_to_drop` (en octets), vous ne pouvez pas le supprimer à l'aide d'une requête DROP. + +Si vous devez toujours supprimer la table sans redémarrer le serveur ClickHouse, créez le `/flags/force_drop_table` fichier et exécutez la requête DROP. + +Valeur par défaut: 50 Go. + +La valeur 0 signifie que vous pouvez supprimer toutes les tables sans aucune restriction. + +**Exemple** + +``` xml +0 +``` + +## merge\_tree {#server_settings-merge_tree} + +Réglage fin des tables dans le [MergeTree](../table_engines/mergetree.md). + +Pour plus d'informations, consultez MergeTreeSettings.h fichier d'en-tête. + +**Exemple** + +``` xml + + 5 + +``` + +## openSSL {#server_settings-openssl} + +Configuration client/serveur SSL. + +Le Support pour SSL est fourni par le `libpoco` bibliothèque. L'interface est décrite dans le fichier [SSLManager.h](https://github.com/ClickHouse-Extras/poco/blob/master/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h) + +Clés pour les paramètres Serveur/client: + +- privateKeyFile – The path to the file with the secret key of the PEM certificate. The file may contain a key and certificate at the same time. +- certificateFile – The path to the client/server certificate file in PEM format. You can omit it if `privateKeyFile` contient le certificat. +- caConfig – The path to the file or directory that contains trusted root certificates. +- verificationMode – The method for checking the node's certificates. Details are in the description of the [Cadre](https://github.com/ClickHouse-Extras/poco/blob/master/NetSSL_OpenSSL/include/Poco/Net/Context.h) classe. Valeurs possibles: `none`, `relaxed`, `strict`, `once`. +- verificationDepth – The maximum length of the verification chain. Verification will fail if the certificate chain length exceeds the set value. +- loadDefaultCAFile – Indicates that built-in CA certificates for OpenSSL will be used. Acceptable values: `true`, `false`. \| +- cipherList – Supported OpenSSL encryptions. For example: `ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH`. +- cacheSessions – Enables or disables caching sessions. Must be used in combination with `sessionIdContext`. Les valeurs acceptables: `true`, `false`. +- sessionIdContext – A unique set of random characters that the server appends to each generated identifier. The length of the string must not exceed `SSL_MAX_SSL_SESSION_ID_LENGTH`. Ce paramètre est toujours recommandé car il permet d'éviter les problèmes à la fois si le serveur met en cache la session et si le client demande la mise en cache. Valeur par défaut: `${application.name}`. +- sessionCacheSize – The maximum number of sessions that the server caches. Default value: 1024\*20. 0 – Unlimited sessions. +- sessionTimeout – Time for caching the session on the server. +- extendedVerification – Automatically extended verification of certificates after the session ends. Acceptable values: `true`, `false`. +- requireTLSv1 – Require a TLSv1 connection. Acceptable values: `true`, `false`. +- requireTLSv1\_1 – Require a TLSv1.1 connection. Acceptable values: `true`, `false`. +- requireTLSv1 – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. +- fips – Activates OpenSSL FIPS mode. Supported if the library's OpenSSL version supports FIPS. +- privateKeyPassphraseHandler – Class (PrivateKeyPassphraseHandler subclass) that requests the passphrase for accessing the private key. For example: ``, `KeyFileHandler`, `test`, ``. +- invalidCertificateHandler – Class (a subclass of CertificateHandler) for verifying invalid certificates. For example: ` ConsoleCertificateHandler ` . +- disableProtocols – Protocols that are not allowed to use. +- preferServerCiphers – Preferred server ciphers on the client. + +**Exemple de paramètres:** + +``` xml + + + + /etc/clickhouse-server/server.crt + /etc/clickhouse-server/server.key + + /etc/clickhouse-server/dhparam.pem + none + true + true + sslv2,sslv3 + true + + + true + true + sslv2,sslv3 + true + + + + RejectCertificateHandler + + + +``` + +## part\_log {#server_settings-part-log} + +Journalisation des événements associés à [MergeTree](../table_engines/mergetree.md). Par exemple, ajouter ou fusionner des données. Vous pouvez utiliser le journal pour simuler des algorithmes de fusion et comparer leurs caractéristiques. Vous pouvez visualiser le processus de fusion. + +Les requêtes sont enregistrées dans le [système.part\_log](../system_tables.md#system_tables-part-log) table, pas dans un fichier séparé. Vous pouvez configurer le nom de cette table dans le `table` paramètre (voir ci-dessous). + +Utilisez les paramètres suivants pour configurer la journalisation: + +- `database` – Name of the database. +- `table` – Name of the system table. +- `partition_by` – Sets a [partitionnement personnalisé clé](../../operations/table_engines/custom_partitioning_key.md). +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. + +**Exemple** + +``` xml + + system + part_log
+ toMonday(event_date) + 7500 +
+``` + +## chemin {#server_settings-path} + +Chemin d'accès au répertoire contenant des données. + +!!! note "Note" + La barre oblique de fin est obligatoire. + +**Exemple** + +``` xml +/var/lib/clickhouse/ +``` + +## query\_log {#server_settings-query-log} + +Réglage de la journalisation des requêtes reçues avec [log\_queries=1](../settings/settings.md) paramètre. + +Les requêtes sont enregistrées dans le [système.query\_log](../system_tables.md#system_tables-query_log) table, pas dans un fichier séparé. Vous pouvez modifier le nom de la table dans le `table` paramètre (voir ci-dessous). + +Utilisez les paramètres suivants pour configurer la journalisation: + +- `database` – Name of the database. +- `table` – Name of the system table the queries will be logged in. +- `partition_by` – Sets a [partitionnement personnalisé clé](../../operations/table_engines/custom_partitioning_key.md) pour une table. +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. + +Si la table n'existe pas, ClickHouse la créera. Si la structure du journal des requêtes a été modifiée lors de la mise à jour du serveur ClickHouse, la table avec l'ancienne structure est renommée et une nouvelle table est créée automatiquement. + +**Exemple** + +``` xml + + system + query_log
+ toMonday(event_date) + 7500 +
+``` + +## query\_thread\_log {#server_settings-query-thread-log} + +Réglage de la journalisation des threads de requêtes reçues avec [log\_query\_threads=1](../settings/settings.md#settings-log-query-threads) paramètre. + +Les requêtes sont enregistrées dans le [système.query\_thread\_log](../system_tables.md#system_tables-query-thread-log) table, pas dans un fichier séparé. Vous pouvez modifier le nom de la table dans le `table` paramètre (voir ci-dessous). + +Utilisez les paramètres suivants pour configurer la journalisation: + +- `database` – Name of the database. +- `table` – Name of the system table the queries will be logged in. +- `partition_by` – Sets a [partitionnement personnalisé clé](../../operations/table_engines/custom_partitioning_key.md) pour un système de tableau. +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. + +Si la table n'existe pas, ClickHouse la créera. Si la structure du journal des threads de requête a été modifiée lors de la mise à jour du serveur ClickHouse, la table avec l'ancienne structure est renommée et une nouvelle table est créée automatiquement. + +**Exemple** + +``` xml + + system + query_thread_log
+ toMonday(event_date) + 7500 +
+``` + +## trace\_log {#server_settings-trace_log} + +Paramètres pour le [trace\_log](../system_tables.md#system_tables-trace_log) opération de table de système. + +Paramètre: + +- `database` — Database for storing a table. +- `table` — Table name. +- `partition_by` — [Partitionnement personnalisé clé](../../operations/table_engines/custom_partitioning_key.md) pour un système de tableau. +- `flush_interval_milliseconds` — Interval for flushing data from the buffer in memory to the table. + +Le fichier de configuration du serveur par défaut `config.xml` contient la section Paramètres suivante: + +``` xml + + system + trace_log
+ toYYYYMM(event_date) + 7500 +
+``` + +## query\_masking\_rules {#query-masking-rules} + +Règles basées sur Regexp, qui seront appliquées aux requêtes ainsi qu'à tous les messages de journal avant de les stocker dans les journaux du serveur, +`system.query_log`, `system.text_log`, `system.processes` table, et dans les journaux envoyés au client. Qui permet à la prévention de +fuite de données sensibles à partir de requêtes SQL (comme les noms, e-mails, +identificateurs ou numéros de carte de crédit) aux journaux. + +**Exemple** + +``` xml + + + hide SSN + (^|\D)\d{3}-\d{2}-\d{4}($|\D) + 000-00-0000 + + +``` + +Config champs: +- `name` - nom de la règle (facultatif) +- `regexp` - Expression régulière compatible RE2 (obligatoire) +- `replace` - chaîne de substitution pour les données sensibles (facultatif, par défaut - six astérisques) + +Les règles de masquage sont appliquées à l'ensemble de la requête (pour éviter les fuites de données sensibles provenant de requêtes malformées / Non analysables). + +`system.events` table ont compteur `QueryMaskingRulesMatch` qui ont un nombre global de requête de masquage des règles de correspondances. + +Pour les requêtes distribuées chaque serveur doivent être configurés séparément, sinon, les sous-requêtes transmises à d'autres +les nœuds seront stockés sans masquage. + +## remote\_servers {#server-settings-remote-servers} + +Configuration des clusters utilisés par le [Distribué](../../operations/table_engines/distributed.md) moteur de table et par le `cluster` table de fonction. + +**Exemple** + +``` xml + +``` + +Pour la valeur de l' `incl` attribut, voir la section “[Fichiers de Configuration](../configuration_files.md#configuration_files)”. + +**Voir Aussi** + +- [skip\_unavailable\_shards](../settings/settings.md#settings-skip_unavailable_shards) + +## fuseau {#server_settings-timezone} + +Le fuseau horaire du serveur. + +Spécifié comme identifiant IANA pour le fuseau horaire UTC ou l'emplacement géographique (par exemple, Afrique / Abidjan). + +Le fuseau horaire est nécessaire pour les conversions entre les formats String et DateTime lorsque les champs DateTime sont sortis au format texte (imprimés à l'écran ou dans un fichier) et lors de L'obtention de DateTime à partir d'une chaîne. En outre, le fuseau horaire est utilisé dans les fonctions qui fonctionnent avec l'heure et la date si elles ne reçoivent pas le fuseau horaire dans les paramètres d'entrée. + +**Exemple** + +``` xml +Europe/Moscow +``` + +## tcp\_port {#server_settings-tcp_port} + +Port pour communiquer avec les clients via le protocole TCP. + +**Exemple** + +``` xml +9000 +``` + +## tcp\_port\_secure {#server_settings-tcp_port-secure} + +Port TCP pour une communication sécurisée avec les clients. Utilisez le avec [OpenSSL](#server_settings-openssl) paramètre. + +**Valeurs possibles** + +Entier positif. + +**Valeur par défaut** + +``` xml +9440 +``` + +## mysql\_port {#server_settings-mysql_port} + +Port pour communiquer avec les clients via le protocole MySQL. + +**Valeurs possibles** + +Entier positif. + +Exemple + +``` xml +9004 +``` + +## tmp\_path {#server-settings-tmp_path} + +Chemin d'accès aux données temporaires pour le traitement des requêtes volumineuses. + +!!! note "Note" + La barre oblique de fin est obligatoire. + +**Exemple** + +``` xml +/var/lib/clickhouse/tmp/ +``` + +## tmp\_policy {#server-settings-tmp-policy} + +La politique de [`storage_configuration`](../table_engines/mergetree.md#table_engine-mergetree-multiple-volumes) pour stocker des fichiers temporaires. +Si cela n'est pas [`tmp_path`](#server-settings-tmp_path) est utilisé, sinon elle est ignorée. + +!!! note "Note" + - `move_factor` est ignoré +- `keep_free_space_bytes` est ignoré +- `max_data_part_size_bytes` est ignoré +- vous devez avoir exactement un volume dans cette politique + +## uncompressed\_cache\_size {#server-settings-uncompressed_cache_size} + +Taille du Cache (en octets) pour les données non compressées utilisées par les [MergeTree](../table_engines/mergetree.md). + +Il y a un cache partagé pour le serveur. La mémoire est allouée à la demande. Le cache est utilisé si l'option [use\_uncompressed\_cache](../settings/settings.md#setting-use_uncompressed_cache) est activé. + +Le cache non compressé est avantageux pour les requêtes très courtes dans des cas individuels. + +**Exemple** + +``` xml +8589934592 +``` + +## user\_files\_path {#server_settings-user_files_path} + +Le répertoire avec les fichiers utilisateur. Utilisé dans la fonction de table [fichier()](../../query_language/table_functions/file.md). + +**Exemple** + +``` xml +/var/lib/clickhouse/user_files/ +``` + +## users\_config {#users-config} + +Chemin d'accès au fichier qui contient: + +- Les configurations de l'utilisateur. +- Les droits d'accès. +- Les paramètres des profils. +- Les paramètres de Quota. + +**Exemple** + +``` xml +users.xml +``` + +## zookeeper {#server-settings_zookeeper} + +Contient des paramètres qui permettent à ClickHouse d'interagir avec [ZooKeeper](http://zookeeper.apache.org/) cluster. + +ClickHouse utilise ZooKeeper pour stocker les métadonnées des répliques lors de l'utilisation de tables répliquées. Si les tables répliquées ne sont pas utilisées, cette section de paramètres peut être omise. + +Cette section contient les paramètres suivants: + +- `node` — ZooKeeper endpoint. You can set multiple endpoints. + + Exemple: + + + +``` xml + + example_host + 2181 + +``` + + The `index` attribute specifies the node order when trying to connect to the ZooKeeper cluster. + +- `session_timeout` — Maximum timeout for the client session in milliseconds. +- `root` — The [znode](http://zookeeper.apache.org/doc/r3.5.5/zookeeperOver.html#Nodes+and+ephemeral+nodes) qui est utilisé comme racine pour les znodes utilisés par le serveur ClickHouse. Facultatif. +- `identity` — User and password, that can be required by ZooKeeper to give access to requested znodes. Optional. + +**Exemple de configuration** + +``` xml + + + example1 + 2181 + + + example2 + 2181 + + 30000 + 10000 + + /path/to/zookeeper/node + + user:password + +``` + +**Voir Aussi** + +- [Réplication](../../operations/table_engines/replication.md) +- [Guide du programmeur ZooKeeper](http://zookeeper.apache.org/doc/current/zookeeperProgrammers.html) + +## use\_minimalistic\_part\_header\_in\_zookeeper {#server-settings-use_minimalistic_part_header_in_zookeeper} + +Méthode de stockage pour les en-têtes de partie de données dans ZooKeeper. + +Ce paramètre s'applique uniquement à l' `MergeTree` famille. Il peut être spécifié: + +- À l'échelle mondiale dans le [merge\_tree](#server_settings-merge_tree) la section de la `config.xml` fichier. + + ClickHouse utilise le paramètre pour toutes les tables du serveur. Vous pouvez modifier le réglage à tout moment. Les tables existantes changent de comportement lorsque le paramètre change. + +- Pour chaque table. + + Lors de la création d'un tableau, indiquer la [moteur de réglage](../table_engines/mergetree.md#table_engine-mergetree-creating-a-table). Le comportement d'une table existante avec ce paramètre ne change pas, même si le paramètre global des changements. + +**Valeurs possibles** + +- 0 — Functionality is turned off. +- 1 — Functionality is turned on. + +Si `use_minimalistic_part_header_in_zookeeper = 1`, puis [répliqué](../table_engines/replication.md) les tables stockent les en-têtes des parties de données de manière compacte à l'aide `znode`. Si la table contient plusieurs colonnes, cette méthode de stockage réduit considérablement le volume des données stockées dans Zookeeper. + +!!! attention "Attention" + Après l'application de `use_minimalistic_part_header_in_zookeeper = 1`, vous ne pouvez pas rétrograder le serveur ClickHouse vers une version qui ne prend pas en charge ce paramètre. Soyez prudent lors de la mise à niveau de ClickHouse sur les serveurs d'un cluster. Ne mettez pas à niveau tous les serveurs à la fois. Il est plus sûr de tester de nouvelles versions de ClickHouse dans un environnement de test, ou sur quelques serveurs d'un cluster. + + Data part headers already stored with this setting can't be restored to their previous (non-compact) representation. + +**Valeur par défaut:** 0. + +## disable\_internal\_dns\_cache {#server-settings-disable-internal-dns-cache} + +Désactive le cache DNS interne. Recommandé pour l'utilisation de ClickHouse dans les systèmes +avec des infrastructures en constante évolution telles que Kubernetes. + +**Valeur par défaut:** 0. + +## dns\_cache\_update\_period {#server-settings-dns-cache-update-period} + +La période de mise à jour des adresses IP stockées dans le cache DNS interne de ClickHouse (en secondes). +La mise à jour est effectuée de manière asynchrone, dans un thread système séparé. + +**Valeur par défaut**: 15. + +[Article Original](https://clickhouse.tech/docs/en/operations/server_settings/settings/) diff --git a/docs/fr/operations/settings/constraints_on_settings.md b/docs/fr/operations/settings/constraints_on_settings.md new file mode 100644 index 00000000000..03bc26bf9a9 --- /dev/null +++ b/docs/fr/operations/settings/constraints_on_settings.md @@ -0,0 +1,72 @@ +--- +machine_translated: true +--- + +# Contraintes sur les paramètres {#constraints-on-settings} + +Les contraintes sur les paramètres peuvent être définis dans le `profiles` la section de la `user.xml` fichier de configuration et interdire aux utilisateurs de modifier certains `SET` requête. +Les contraintes sont définies comme suit: + +``` xml + + + + + lower_boundary + + + upper_boundary + + + lower_boundary + upper_boundary + + + + + + + +``` + +Si l'utilisateur tente de violer les contraintes une exception est levée et le réglage n'est pas modifié. +Trois types de contraintes sont pris en charge: `min`, `max`, `readonly`. Le `min` et `max` les contraintes spécifient les limites supérieure et inférieure pour un paramètre numérique et peuvent être utilisées en combinaison. Le `readonly` contrainte spécifie que l'utilisateur ne peut pas modifier le paramètre correspondant à tous. + +**Exemple:** Laisser `users.xml` comprend des lignes: + +``` xml + + + 10000000000 + 0 + ... + + + 5000000000 + 20000000000 + + + + + + + +``` + +Les requêtes suivantes toutes les exceptions throw: + +``` sql +SET max_memory_usage=20000000001; +SET max_memory_usage=4999999999; +SET force_index_by_date=1; +``` + +``` text +Code: 452, e.displayText() = DB::Exception: Setting max_memory_usage should not be greater than 20000000000. +Code: 452, e.displayText() = DB::Exception: Setting max_memory_usage should not be less than 5000000000. +Code: 452, e.displayText() = DB::Exception: Setting force_index_by_date should not be changed. +``` + +**Note:** le `default` le profil a une manipulation particulière: toutes les contraintes définies pour `default` le profil devient les contraintes par défaut, de sorte qu'ils restreignent tous les utilisateurs jusqu'à ce qu'ils soient explicitement remplacés pour ces utilisateurs. + +[Article Original](https://clickhouse.tech/docs/en/operations/settings/constraints_on_settings/) diff --git a/docs/fr/operations/settings/index.md b/docs/fr/operations/settings/index.md new file mode 100644 index 00000000000..df747df3685 --- /dev/null +++ b/docs/fr/operations/settings/index.md @@ -0,0 +1,28 @@ +--- +machine_translated: true +--- + +# Paramètre {#settings} + +Il existe plusieurs façons de faire tous les paramètres décrits ci-dessous. +Les paramètres sont configurés en couches, de sorte que chaque couche suivante redéfinit les paramètres précédents. + +Façons de configurer les paramètres, par ordre de priorité: + +- Paramètres dans l' `users.xml` fichier de configuration du serveur. + + Situé dans l'élément ``. + +- Les paramètres de la Session. + + Envoyer `SET setting=value` depuis le client de la console ClickHouse en mode interactif. + De même, vous pouvez utiliser des sessions ClickHouse dans le protocole HTTP. Pour ce faire, vous devez spécifier le `session_id` Paramètre HTTP. + +- Les paramètres de requête. + + - Lorsque vous démarrez le client clickhouse console en mode non interactif, définissez le paramètre startup `--setting=value`. + - Lors de l'utilisation de L'API HTTP, passez les paramètres CGI (`URL?setting_1=value&setting_2=value...`). + +Les paramètres qui ne peuvent être effectués que dans le fichier de configuration du serveur ne sont pas couverts dans cette section. + +[Article Original](https://clickhouse.tech/docs/en/operations/settings/) diff --git a/docs/fr/operations/settings/permissions_for_queries.md b/docs/fr/operations/settings/permissions_for_queries.md new file mode 100644 index 00000000000..02d735eb46d --- /dev/null +++ b/docs/fr/operations/settings/permissions_for_queries.md @@ -0,0 +1,58 @@ +--- +machine_translated: true +--- + +# Autorisations pour les requêtes {#permissions_for_queries} + +Les requêtes dans ClickHouse peuvent être divisées en plusieurs types: + +1. Lire les requêtes de données: `SELECT`, `SHOW`, `DESCRIBE`, `EXISTS`. +2. Écrire des requêtes de données: `INSERT`, `OPTIMIZE`. +3. Modifier les paramètres requête: `SET`, `USE`. +4. [DDL](https://en.wikipedia.org/wiki/Data_definition_language) requête: `CREATE`, `ALTER`, `RENAME`, `ATTACH`, `DETACH`, `DROP` `TRUNCATE`. +5. `KILL QUERY`. + +Les paramètres suivants règlent les autorisations utilisateur selon le type de requête: + +- [ReadOnly](#settings_readonly) — Restricts permissions for all types of queries except DDL queries. +- [allow\_ddl](#settings_allow_ddl) — Restricts permissions for DDL queries. + +`KILL QUERY` peut être réalisée avec tous les paramètres. + +## ReadOnly {#settings_readonly} + +Restreint les autorisations pour lire des données, écrire des données et modifier les requêtes de paramètres. + +Voyez comment les requêtes sont divisées en types [surtout](#permissions_for_queries). + +Valeurs possibles: + +- 0 — All queries are allowed. +- 1 — Only read data queries are allowed. +- 2 — Read data and change settings queries are allowed. + +Après le réglage de `readonly = 1` l'utilisateur ne peut pas changer `readonly` et `allow_ddl` les paramètres de la session en cours. + +Lors de l'utilisation de la `GET` méthode dans le [Interface HTTP](../../interfaces/http.md), `readonly = 1` est définie automatiquement. Pour modifier les données, utilisez `POST` méthode. + +Paramètre `readonly = 1` interdire à l'utilisateur de modifier tous les paramètres. Il y a un moyen d'interdire à l'utilisateur +de modifier uniquement des paramètres spécifiques, pour plus de détails, voir [contraintes sur les paramètres](constraints_on_settings.md). + +Valeur par défaut: 0 + +## allow\_ddl {#settings_allow_ddl} + +Permet ou interdit [DDL](https://en.wikipedia.org/wiki/Data_definition_language) requête. + +Voyez comment les requêtes sont divisées en types [surtout](#permissions_for_queries). + +Valeurs possibles: + +- 0 — DDL queries are not allowed. +- 1 — DDL queries are allowed. + +Vous ne pouvez pas exécuter `SET allow_ddl = 1` si `allow_ddl = 0` pour la session en cours. + +Valeur par défaut: 1 + +[Article Original](https://clickhouse.tech/docs/en/operations/settings/permissions_for_queries/) diff --git a/docs/fr/operations/settings/query_complexity.md b/docs/fr/operations/settings/query_complexity.md new file mode 100644 index 00000000000..bf3e7d2bba8 --- /dev/null +++ b/docs/fr/operations/settings/query_complexity.md @@ -0,0 +1,298 @@ +--- +machine_translated: true +--- + +# Restrictions sur la complexité des requêtes {#restrictions-on-query-complexity} + +Les Restrictions sur la complexité des requêtes font partie des paramètres. +Ils sont utilisés pour fournir une exécution plus sûre à partir de l'interface utilisateur. +Presque toutes les restrictions ne s'appliquent qu'à `SELECT`. Pour le traitement des requêtes distribuées, des restrictions sont appliquées sur chaque serveur séparément. + +ClickHouse vérifie les restrictions pour les parties de données, pas pour chaque ligne. Cela signifie que vous pouvez dépasser la valeur de restriction de la taille de la partie données. + +Restrictions sur l' “maximum amount of something” peut prendre la valeur 0, ce qui signifie “unrestricted”. +La plupart des restrictions ont également un ‘overflow\_mode’ paramètre signification que faire lorsque la limite est dépassée. +Il peut prendre deux valeurs: `throw` ou `break`. Les Restrictions sur l'agrégation (group\_by\_overflow\_mode) ont également la valeur `any`. + +`throw` – Throw an exception (default). + +`break` – Stop executing the query and return the partial result, as if the source data ran out. + +`any (only for group_by_overflow_mode)` – Continuing aggregation for the keys that got into the set, but don't add new keys to the set. + +## max\_memory\_usage {#settings_max_memory_usage} + +La quantité maximale de RAM à utiliser pour exécuter une requête sur un seul serveur. + +Dans le fichier de configuration par défaut, le maximum est de 10 Go. + +Le réglage ne tient pas compte du volume de mémoire disponible ou du volume total de mémoire sur la machine. +La restriction s'applique à une seule requête au sein d'un seul serveur. +Vous pouvez utiliser `SHOW PROCESSLIST` pour vérifier la consommation de mémoire pour chaque requête. +En outre, la consommation de mémoire maximale est suivie pour chaque requête et écrite dans le journal. + +L'utilisation de la mémoire n'est pas surveillée pour les membres de certaines fonctions d'agrégation. + +L'utilisation de la mémoire n'est pas totalement suivies pour les états des fonctions d'agrégation `min`, `max`, `any`, `anyLast`, `argMin`, `argMax` de `String` et `Array` argument. + +La consommation de mémoire est également limitée par les paramètres `max_memory_usage_for_user` et `max_memory_usage_for_all_queries`. + +## max\_memory\_usage\_for\_user {#max-memory-usage-for-user} + +Quantité maximale de RAM à utiliser pour exécuter les requêtes d'un utilisateur sur un seul serveur. + +Les valeurs par défaut sont définies dans [Paramètre.h](https://github.com/ClickHouse/ClickHouse/blob/master/dbms/src/Core/Settings.h#L288). Par défaut, le montant n'est pas limité (`max_memory_usage_for_user = 0`). + +Voir aussi la description de [max\_memory\_usage](#settings_max_memory_usage). + +## max\_memory\_usage\_for\_all\_queries {#max-memory-usage-for-all-queries} + +La quantité maximale de RAM à utiliser pour exécuter toutes les requêtes sur un seul serveur. + +Les valeurs par défaut sont définies dans [Paramètre.h](https://github.com/ClickHouse/ClickHouse/blob/master/dbms/src/Core/Settings.h#L289). Par défaut, le montant n'est pas limité (`max_memory_usage_for_all_queries = 0`). + +Voir aussi la description de [max\_memory\_usage](#settings_max_memory_usage). + +## max\_rows\_to\_read {#max-rows-to-read} + +Les restrictions suivantes peut être vérifiée sur chaque bloc (au lieu de sur chaque ligne). Autrement dit, les restrictions peuvent être brisées un peu. +Lors de l'exécution d'une requête dans plusieurs threads, les restrictions suivantes s'appliquent à chaque thread séparément. + +Un nombre maximum de lignes pouvant être lues à partir d'un tableau lors de l'exécution d'une requête. + +## max\_bytes\_to\_read {#max-bytes-to-read} + +Nombre maximal d'octets (données non compressées) pouvant être lus à partir d'une table lors de l'exécution d'une requête. + +## read\_overflow\_mode {#read-overflow-mode} + +Que faire lorsque le volume de lecture de données dépasse l'une des limites: ‘throw’ ou ‘break’. Par défaut, les jeter. + +## max\_rows\_to\_group\_by {#settings-max-rows-to-group-by} + +Un nombre maximum de clés uniques reçues de l'agrégation. Ce paramètre permet de limiter la consommation de mémoire lors de l'agrégation. + +## group\_by\_overflow\_mode {#group-by-overflow-mode} + +Que faire lorsque le nombre de clés uniques pour l'agrégation dépasse la limite: ‘throw’, ‘break’, ou ‘any’. Par défaut, les jeter. +À l'aide de la ‘any’ valeur vous permet d'exécuter une approximation de GROUP BY. La qualité de cette approximation dépend de la nature statistique des données. + +## max\_bytes\_before\_external\_group\_by {#settings-max_bytes_before_external_group_by} + +Active ou désactive l'exécution de `GROUP BY` clauses dans la mémoire externe. Voir [Groupe par dans la mémoire externe](../../query_language/select.md#select-group-by-in-external-memory). + +Valeurs possibles: + +- Volume maximal de RAM (en octets) pouvant être utilisé par le [GROUP BY](../../query_language/select.md#select-group-by-clause) opération. +- 0 — `GROUP BY` dans la mémoire externe désactivé. + +Valeur par défaut: 0. + +## max\_rows\_to\_sort {#max-rows-to-sort} + +Un nombre maximum de lignes avant le tri. Cela vous permet de limiter la consommation de mémoire lors du tri. + +## max\_bytes\_to\_sort {#max-bytes-to-sort} + +Un nombre maximal d'octets avant le tri. + +## sort\_overflow\_mode {#sort-overflow-mode} + +Que faire si le nombre de lignes reçues avant le tri dépasse l'une des limites: ‘throw’ ou ‘break’. Par défaut, les jeter. + +## max\_result\_rows {#setting-max_result_rows} + +Limite sur le nombre de lignes dans le résultat. Également vérifié pour les sous-requêtes, et sur des serveurs distants lors de l'exécution de parties d'une requête distribuée. + +## max\_result\_bytes {#max-result-bytes} + +Limite sur le nombre d'octets dans le résultat. Le même que le réglage précédent. + +## result\_overflow\_mode {#result-overflow-mode} + +Que faire si le volume du résultat dépasse l'une des limites: ‘throw’ ou ‘break’. Par défaut, les jeter. + +Utiliser ‘break’ est similaire à L'utilisation de LIMIT. `Break` interrompt l'exécution seulement au niveau du bloc. Cela signifie que la quantité de lignes renvoyées est supérieure à [max\_result\_rows](#setting-max_result_rows) multiples de [max\_block\_size](settings.md#setting-max_block_size) et dépend de l' [max\_threads](settings.md#settings-max_threads). + +Exemple: + +``` sql +SET max_threads = 3, max_block_size = 3333; +SET max_result_rows = 3334, result_overflow_mode = 'break'; + +SELECT * +FROM numbers_mt(100000) +FORMAT Null; +``` + +Résultat: + +``` text +6666 rows in set. ... +``` + +## max\_execution\_time {#max-execution-time} + +Durée maximale d'exécution de la requête en secondes. +Pour le moment, il n'est pas vérifié pour l'une des étapes de tri, ni lors de la fusion et de la finalisation des fonctions d'agrégat. + +## timeout\_overflow\_mode {#timeout-overflow-mode} + +Que faire si la requête est exécutée plus de ‘max\_execution\_time’: ‘throw’ ou ‘break’. Par défaut, les jeter. + +## min\_execution\_speed {#min-execution-speed} + +Vitesse d'exécution minimale en lignes par seconde. Vérifié sur chaque bloc de données quand ‘timeout\_before\_checking\_execution\_speed’ expirer. Si la vitesse d'exécution est inférieure, une exception est levée. + +## min\_execution\_speed\_bytes {#min-execution-speed-bytes} + +Un nombre minimum d'exécution d'octets par seconde. Vérifié sur chaque bloc de données quand ‘timeout\_before\_checking\_execution\_speed’ expirer. Si la vitesse d'exécution est inférieure, une exception est levée. + +## max\_execution\_speed {#max-execution-speed} + +Un nombre maximal d'exécution de lignes par seconde. Vérifié sur chaque bloc de données quand ‘timeout\_before\_checking\_execution\_speed’ expirer. Si la vitesse d'exécution est élevée, la vitesse d'exécution sera réduit. + +## max\_execution\_speed\_bytes {#max-execution-speed-bytes} + +Un nombre maximal d'exécution d'octets par seconde. Vérifié sur chaque bloc de données quand ‘timeout\_before\_checking\_execution\_speed’ expirer. Si la vitesse d'exécution est élevée, la vitesse d'exécution sera réduit. + +## timeout\_before\_checking\_execution\_speed {#timeout-before-checking-execution-speed} + +Vérifie que la vitesse d'exécution n'est pas trop lent (pas moins de ‘min\_execution\_speed’), après l'expiration du temps spécifié en secondes. + +## max\_columns\_to\_read {#max-columns-to-read} + +Nombre maximal de colonnes pouvant être lues à partir d'une table dans une seule requête. Si une requête nécessite la lecture d'un plus grand nombre de colonnes, il lève une exception. + +## max\_temporary\_columns {#max-temporary-columns} + +Nombre maximal de colonnes temporaires qui doivent être conservées en RAM en même temps lors de l'exécution d'une requête, y compris les colonnes constantes. S'il y a plus de colonnes temporaires que cela, il lève une exception. + +## max\_temporary\_non\_const\_columns {#max-temporary-non-const-columns} + +La même chose que ‘max\_temporary\_columns’ mais sans compter constante colonnes. +Notez que les colonnes constantes sont formées assez souvent lors de l'exécution d'une requête, mais elles nécessitent environ zéro ressource informatique. + +## max\_subquery\_depth {#max-subquery-depth} + +Profondeur maximale de sous-requêtes. Si les sous-requêtes sont plus profondes, une exception est levée. Par défaut, 100. + +## max\_pipeline\_depth {#max-pipeline-depth} + +Profondeur maximale du pipeline. Correspond au nombre de transformations que chaque bloc de données lors du traitement des requêtes. Compté dans les limites d'un seul serveur. Si la profondeur du pipeline est supérieure, une exception est levée. Par défaut, 1000. + +## max\_ast\_depth {#max-ast-depth} + +Profondeur maximale d'une requête arbre syntaxique. En cas de dépassement, une exception est levée. +À ce moment, il n'est pas vérifié pendant l'analyse, mais seulement après l'analyse de la requête. Autrement dit, un arbre syntaxique trop profond peut être créé pendant l'analyse, mais la requête échouera. Par défaut, 1000. + +## max\_ast\_elements {#max-ast-elements} + +Un nombre maximal d'éléments dans une requête arbre syntaxique. En cas de dépassement, une exception est levée. +De la même manière que le paramètre précédent, il est vérifié qu'après l'analyse de la requête. Par défaut, 50 000. + +## max\_rows\_in\_set {#max-rows-in-set} + +Nombre maximal de lignes pour un ensemble de données dans la clause in créée à partir d'une sous-requête. + +## max\_bytes\_in\_set {#max-bytes-in-set} + +Nombre maximal d'octets (données non compressées) utilisés par un ensemble de la clause in créé à partir d'une sous-requête. + +## set\_overflow\_mode {#set-overflow-mode} + +Que faire lorsque la quantité de données dépasse l'une des limites: ‘throw’ ou ‘break’. Par défaut, les jeter. + +## max\_rows\_in\_distinct {#max-rows-in-distinct} + +Un nombre maximum de lignes différentes lors de L'utilisation de DISTINCT. + +## max\_bytes\_in\_distinct {#max-bytes-in-distinct} + +Nombre maximal d'octets utilisés par une table de hachage lors de L'utilisation de DISTINCT. + +## distinct\_overflow\_mode {#distinct-overflow-mode} + +Que faire lorsque la quantité de données dépasse l'une des limites: ‘throw’ ou ‘break’. Par défaut, les jeter. + +## max\_rows\_to\_transfer {#max-rows-to-transfer} + +Nombre maximal de lignes pouvant être transmises à un serveur distant ou enregistrées dans une table temporaire lors de L'utilisation de GLOBAL IN. + +## max\_bytes\_to\_transfer {#max-bytes-to-transfer} + +Nombre maximal d'octets (données non compressées) pouvant être transmis à un serveur distant ou enregistrés dans une table temporaire lors de L'utilisation de GLOBAL IN. + +## transfer\_overflow\_mode {#transfer-overflow-mode} + +Que faire lorsque la quantité de données dépasse l'une des limites: ‘throw’ ou ‘break’. Par défaut, les jeter. + +## max\_rows\_in\_join {#settings-max_rows_in_join} + +Limite le nombre de lignes dans la table de hachage utilisée lors de la jonction de tables. + +Ce réglage s'applique à [SELECT … JOIN](../../query_language/select.md#select-join) les opérations et les [Rejoindre](../table_engines/join.md) tableau moteur. + +Si une requête contient plusieurs jointures, ClickHouse vérifie ce paramètre pour chaque résultat intermédiaire. + +ClickHouse peut procéder à différentes actions lorsque la limite est atteinte. L'utilisation de la [join\_overflow\_mode](#settings-join_overflow_mode) réglage pour choisir l'action. + +Valeurs possibles: + +- Entier positif. +- 0 — Unlimited number of rows. + +Valeur par défaut: 0. + +## max\_bytes\_in\_join {#settings-max_bytes_in_join} + +Limite la taille en octets de la table de hachage utilisée lors de l'assemblage de tables. + +Ce réglage s'applique à [SELECT … JOIN](../../query_language/select.md#select-join) les opérations et les [Rejoindre le moteur de table](../table_engines/join.md). + +Si la requête contient des jointures, ClickHouse vérifie ce paramètre pour chaque résultat intermédiaire. + +ClickHouse peut procéder à différentes actions lorsque la limite est atteinte. Utiliser [join\_overflow\_mode](#settings-join_overflow_mode) paramètres pour choisir l'action. + +Valeurs possibles: + +- Entier positif. +- 0 — Memory control is disabled. + +Valeur par défaut: 0. + +## join\_overflow\_mode {#settings-join_overflow_mode} + +Définit l'action que ClickHouse effectue lorsque l'une des limites de jointure suivantes est atteinte: + +- [max\_bytes\_in\_join](#settings-max_bytes_in_join) +- [max\_rows\_in\_join](#settings-max_rows_in_join) + +Valeurs possibles: + +- `THROW` — ClickHouse throws an exception and breaks operation. +- `BREAK` — ClickHouse breaks operation and doesn't throw an exception. + +Valeur par défaut: `THROW`. + +**Voir Aussi** + +- [Clause de JOINTURE](../../query_language/select.md#select-join) +- [Rejoindre le moteur de table](../table_engines/join.md) + +## max\_partitions\_per\_insert\_block {#max-partitions-per-insert-block} + +Limite le nombre maximal de partitions dans un seul bloc inséré. + +- Entier positif. +- 0 — Unlimited number of partitions. + +Valeur par défaut: 100. + +**Détail** + +Lors de l'insertion de données, ClickHouse calcule le nombre de partitions dans le bloc inséré. Si le nombre de partitions est plus que `max_partitions_per_insert_block`, ClickHouse lève une exception avec le texte suivant: + +> “Too many partitions for single INSERT block (more than” + toString (max\_parts) + “). The limit is controlled by ‘max\_partitions\_per\_insert\_block’ setting. A large number of partitions is a common misconception. It will lead to severe negative performance impact, including slow server startup, slow INSERT queries and slow SELECT queries. Recommended total number of partitions for a table is under 1000..10000. Please note, that partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast). Partitions are intended for data manipulation (DROP PARTITION, etc).” + +[Article Original](https://clickhouse.tech/docs/en/operations/settings/query_complexity/) diff --git a/docs/fr/operations/settings/settings.md b/docs/fr/operations/settings/settings.md new file mode 100644 index 00000000000..4fed20c46cd --- /dev/null +++ b/docs/fr/operations/settings/settings.md @@ -0,0 +1,1199 @@ +--- +machine_translated: true +--- + +# Paramètre {#settings} + +## distributed\_product\_mode {#distributed-product-mode} + +Modifie le comportement de [distribués sous-requêtes](../../query_language/select.md). + +ClickHouse applies this setting when the query contains the product of distributed tables, i.e. when the query for a distributed table contains a non-GLOBAL subquery for the distributed table. + +Restriction: + +- Uniquement appliqué pour les sous-requêtes IN et JOIN. +- Uniquement si la section FROM utilise une table distribuée contenant plus d'un fragment. +- Si la sous-requête concerne un distribué tableau contenant plus d'un fragment. +- Pas utilisé pour une table [distant](../../query_language/table_functions/remote.md) fonction. + +Valeurs possibles: + +- `deny` — Default value. Prohibits using these types of subqueries (returns the “Double-distributed in/JOIN subqueries is denied” exception). +- `local` — Replaces the database and table in the subquery with local ones for the destination server (shard), leaving the normal `IN`/`JOIN.` +- `global` — Replaces the `IN`/`JOIN` requête avec `GLOBAL IN`/`GLOBAL JOIN.` +- `allow` — Allows the use of these types of subqueries. + +## enable\_optimize\_predicate\_expression {#enable-optimize-predicate-expression} + +Active la poussée du prédicat `SELECT` requête. + +Prédicat pushdown peut réduire considérablement le trafic réseau pour les requêtes distribuées. + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 1. + +Utilisation + +Considérez les requêtes suivantes: + +1. `SELECT count() FROM test_table WHERE date = '2018-10-10'` +2. `SELECT count() FROM (SELECT * FROM test_table) WHERE date = '2018-10-10'` + +Si `enable_optimize_predicate_expression = 1`, alors le temps d'exécution de ces requêtes est égal car ClickHouse s'applique `WHERE` à la sous-requête lors du traitement. + +Si `enable_optimize_predicate_expression = 0` puis le temps d'exécution de la deuxième requête est beaucoup plus long, parce que le `WHERE` la clause s'applique à toutes les données après la sous-requête des finitions. + +## fallback\_to\_stale\_replicas\_for\_distributed\_queries {#settings-fallback_to_stale_replicas_for_distributed_queries} + +Force une requête à un réplica obsolète si les données mises à jour ne sont pas disponibles. Voir [Réplication](../table_engines/replication.md). + +ClickHouse sélectionne le plus pertinent parmi les répliques obsolètes de la table. + +Utilisé lors de l'exécution `SELECT` à partir d'une table distribuée qui pointe vers des tables répliquées. + +Par défaut, 1 (activé). + +## force\_index\_by\_date {#settings-force_index_by_date} + +Désactive l'exécution de la requête si l'index ne peut pas être utilisé par jour. + +Fonctionne avec les tables de la famille MergeTree. + +Si `force_index_by_date=1`, Clickhouse vérifie si la requête a une condition de clé de date qui peut être utilisée pour restreindre les plages de données. S'il n'y a pas de condition appropriée, il lève une exception. Cependant, il ne vérifie pas si la condition réduit la quantité de données à lire. Par exemple, la condition `Date != ' 2000-01-01 '` est acceptable même lorsqu'il correspond à toutes les données de la table (c'est-à-dire que l'exécution de la requête nécessite une analyse complète). Pour plus d'informations sur les plages de données dans les tables MergeTree, voir [MergeTree](../table_engines/mergetree.md). + +## force\_primary\_key {#force-primary-key} + +Désactive l'exécution de la requête si l'indexation par la clé primaire n'est pas possible. + +Fonctionne avec les tables de la famille MergeTree. + +Si `force_primary_key=1`, Clickhouse vérifie si la requête a une condition de clé primaire qui peut être utilisée pour restreindre les plages de données. S'il n'y a pas de condition appropriée, il lève une exception. Cependant, il ne vérifie pas si la condition réduit la quantité de données à lire. Pour plus d'informations sur les plages de données dans les tables MergeTree, voir [MergeTree](../table_engines/mergetree.md). + +## format\_schema {#format-schema} + +Ce paramètre est utile lorsque vous utilisez des formats nécessitant une définition de schéma, tels que [Cap'n Proto](https://capnproto.org/) ou [Protobuf](https://developers.google.com/protocol-buffers/). La valeur dépend du format. + +## fsync\_metadata {#fsync-metadata} + +Active ou désactive [fsync](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html) lors de l'écriture `.sql` fichier. Activé par défaut. + +Il est logique de le désactiver si le serveur a des millions de tables minuscules qui sont constamment créées et détruites. + +## enable\_http\_compression {#settings-enable_http_compression} + +Active ou désactive la compression de données dans la réponse à une requête HTTP. + +Pour plus d'informations, lire l' [Description de L'interface HTTP](../../interfaces/http.md). + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 0. + +## http\_zlib\_compression\_level {#settings-http_zlib_compression_level} + +Définit le niveau de compression des données dans la réponse à une requête HTTP si [enable\_http\_compression = 1](#settings-enable_http_compression). + +Valeurs possibles: nombres de 1 à 9. + +Valeur par défaut: 3. + +## http\_native\_compression\_disable\_checksumming\_on\_decompress {#settings-http_native_compression_disable_checksumming_on_decompress} + +Active ou désactive la vérification de la somme de contrôle lors de la décompression des données HTTP POST du client. Utilisé uniquement pour le format de compression natif ClickHouse (non utilisé avec `gzip` ou `deflate`). + +Pour plus d'informations, lire l' [Description de L'interface HTTP](../../interfaces/http.md). + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 0. + +## send\_progress\_in\_http\_headers {#settings-send_progress_in_http_headers} + +Active ou désactive `X-ClickHouse-Progress` - Têtes de réponse HTTP dans `clickhouse-server` réponse. + +Pour plus d'informations, lire l' [Description de L'interface HTTP](../../interfaces/http.md). + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 0. + +## max\_http\_get\_redirects {#setting-max_http_get_redirects} + +Limite le nombre maximal de sauts de redirection HTTP GET pour [URL](../table_engines/url.md)-tables de moteur. Le paramètre s'applique aux deux types de tables: celles créées par [CREATE TABLE](../../query_language/create/#create-table-query) requête et par la [URL](../../query_language/table_functions/url.md) table de fonction. + +Valeurs possibles: + +- Tout nombre entier positif de houblon. +- 0 — No hops allowed. + +Valeur par défaut: 0. + +## input\_format\_allow\_errors\_num {#settings-input_format_allow_errors_num} + +Définit le nombre maximal d'erreurs acceptables lors de la lecture à partir de formats de texte (CSV, TSV, etc.). + +La valeur par défaut est de 0. + +Toujours le coupler avec `input_format_allow_errors_ratio`. + +Si une erreur s'est produite lors de la lecture de lignes mais que le compteur d'erreurs est toujours inférieur à `input_format_allow_errors_num`, ClickHouse ignore la ligne et passe à la suivante. + +Si les deux `input_format_allow_errors_num` et `input_format_allow_errors_ratio` sont dépassés, ClickHouse lève une exception. + +## input\_format\_allow\_errors\_ratio {#settings-input_format_allow_errors_ratio} + +Définit le pourcentage maximal d'erreurs autorisées lors de la lecture à partir de formats de texte (CSV, TSV, etc.). +Le pourcentage d'erreurs est défini comme un nombre à virgule flottante compris entre 0 et 1. + +La valeur par défaut est de 0. + +Toujours le coupler avec `input_format_allow_errors_num`. + +Si une erreur s'est produite lors de la lecture de lignes mais que le compteur d'erreurs est toujours inférieur à `input_format_allow_errors_ratio`, ClickHouse ignore la ligne et passe à la suivante. + +Si les deux `input_format_allow_errors_num` et `input_format_allow_errors_ratio` sont dépassés, ClickHouse lève une exception. + +## input\_format\_values\_interpret\_expressions {#settings-input_format_values_interpret_expressions} + +Active ou désactive L'analyseur SQL complet si l'analyseur de flux rapide ne peut pas analyser les données. Ce paramètre est utilisé uniquement pour la [Valeur](../../interfaces/formats.md#data-format-values) format lors de l'insertion des données. Pour plus d'informations sur l'analyse syntaxique, consultez [Syntaxe](../../query_language/syntax.md) section. + +Valeurs possibles: + +- 0 — Disabled. + + Dans ce cas, vous devez fournir des données formatées. Voir la [Format](../../interfaces/formats.md) section. + +- 1 — Enabled. + + Dans ce cas, vous pouvez utiliser une expression SQL en tant que valeur, mais l'insertion de données est beaucoup plus lente de cette façon. Si vous insérez uniquement des données formatées, ClickHouse se comporte comme si la valeur de réglage était 0. + +Valeur par défaut: 1. + +Exemple D'utilisation + +Insérez le [DateTime](../../data_types/datetime.md) tapez valeur avec les différents paramètres. + +``` sql +SET input_format_values_interpret_expressions = 0; +INSERT INTO datetime_t VALUES (now()) +``` + +``` text +Exception on client: +Code: 27. DB::Exception: Cannot parse input: expected ) before: now()): (at row 1) +``` + +``` sql +SET input_format_values_interpret_expressions = 1; +INSERT INTO datetime_t VALUES (now()) +``` + +``` text +Ok. +``` + +La dernière requête est équivalente à la suivante: + +``` sql +SET input_format_values_interpret_expressions = 0; +INSERT INTO datetime_t SELECT now() +``` + +``` text +Ok. +``` + +## input\_format\_values\_deduce\_templates\_of\_expressions {#settings-input_format_values_deduce_templates_of_expressions} + +Active ou désactive la déduction de modèle pour une expression SQL dans [Valeur](../../interfaces/formats.md#data-format-values) format. Il permet d'analyser et d'interpréter les expressions dans `Values` beaucoup plus rapide si les expressions dans des lignes consécutives ont la même structure. ClickHouse va essayer de déduire le modèle d'une expression, analyser les lignes suivantes en utilisant ce modèle et évaluer l'expression sur un lot de lignes analysées avec succès. Pour la requête suivante: + +``` sql +INSERT INTO test VALUES (lower('Hello')), (lower('world')), (lower('INSERT')), (upper('Values')), ... +``` + +- si `input_format_values_interpret_expressions=1` et `format_values_deduce_templates_of_expressions=0` les expressions seront interprétées séparément pour chaque ligne (Ceci est très lent pour un grand nombre de lignes) +- si `input_format_values_interpret_expressions=0` et `format_values_deduce_templates_of_expressions=1` expressions dans les première, deuxième et troisième lignes seront analysées à l'aide du modèle `lower(String)` et interprété ensemble, l'expression est la quatrième ligne sera analysée avec un autre modèle (`upper(String)`) +- si `input_format_values_interpret_expressions=1` et `format_values_deduce_templates_of_expressions=1` - la même chose que dans le cas précédent, mais permet également d'interpréter les expressions séparément s'il n'est pas possible de déduire le modèle. + +Activé par défaut. + +## input\_format\_values\_accurate\_types\_of\_literals {#settings-input-format-values-accurate-types-of-literals} + +Ce paramètre est utilisé uniquement lorsque `input_format_values_deduce_templates_of_expressions = 1`. Il peut arriver que les expressions pour une colonne aient la même structure, mais contiennent des littéraux numériques de types différents, par exemple + +``` sql +(..., abs(0), ...), -- UInt64 literal +(..., abs(3.141592654), ...), -- Float64 literal +(..., abs(-1), ...), -- Int64 literal +``` + +Lorsque ce paramètre est activé, ClickHouse vérifie le type réel de littéral et utilise un modèle d'expression du type correspondant. Dans certains cas, cela peut considérablement ralentir l'évaluation de l'expression dans `Values`. +When disabled, ClickHouse may use more general type for some literals (e.g. `Float64` ou `Int64` plutôt `UInt64` pour `42`), mais cela peut causer des problèmes de débordement et de précision. +Activé par défaut. + +## input\_format\_defaults\_for\_omitted\_fields {#session_settings-input_format_defaults_for_omitted_fields} + +Lors de l'exécution de `INSERT` requêtes, remplacez les valeurs de colonne d'entrée omises par les valeurs par défaut des colonnes respectives. Cette option s'applique uniquement aux [JSONEachRow](../../interfaces/formats.md#jsoneachrow), [CSV](../../interfaces/formats.md#csv) et [TabSeparated](../../interfaces/formats.md#tabseparated) format. + +!!! note "Note" + Lorsque cette option est activée, les métadonnées de table étendues sont envoyées du serveur au client. Il consomme des ressources informatiques supplémentaires sur le serveur et peut réduire les performances. + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 1. + +## input\_format\_tsv\_empty\_as\_default {#settings-input-format-tsv-empty-as-default} + +Lorsque cette option est activée, remplacez les champs de saisie vides dans TSV par des valeurs par défaut. Pour les expressions par défaut complexes `input_format_defaults_for_omitted_fields` doit être activé en trop. + +Désactivé par défaut. + +## input\_format\_null\_as\_default {#settings-input-format-null-as-default} + +Active ou désactive l'utilisation des valeurs par défaut si les données `NULL` mais le type de données de la colonne correspondante dans pas `Nullable(T)` (pour les formats de saisie de texte). + +## input\_format\_skip\_unknown\_fields {#settings-input-format-skip-unknown-fields} + +Active ou désactive le saut d'insertion de données supplémentaires. + +Lors de l'écriture de données, ClickHouse lève une exception si les données d'entrée contiennent des colonnes qui n'existent pas dans la table cible. Si le saut est activé, ClickHouse n'insère pas de données supplémentaires et ne lance pas d'exception. + +Formats pris en charge: + +- [JSONEachRow](../../interfaces/formats.md#jsoneachrow) +- [CSVWithNames](../../interfaces/formats.md#csvwithnames) +- [TabSeparatedWithNames](../../interfaces/formats.md#tabseparatedwithnames) +- [TSKV](../../interfaces/formats.md#tskv) + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 0. + +## input\_format\_import\_nested\_json {#settings-input_format_import_nested_json} + +Active ou désactive l'insertion de données JSON avec des objets imbriqués. + +Formats pris en charge: + +- [JSONEachRow](../../interfaces/formats.md#jsoneachrow) + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 0. + +Voir aussi: + +- [Utilisation de Structures imbriquées](../../interfaces/formats.md#jsoneachrow-nested) avec l' `JSONEachRow` format. + +## input\_format\_with\_names\_use\_header {#settings-input-format-with-names-use-header} + +Active ou désactive la vérification de l'ordre des colonnes lors de l'insertion de données. + +Pour améliorer les performances d'insertion, nous vous recommandons de désactiver cette vérification si vous êtes sûr que l'ordre des colonnes des données d'entrée est le même que dans la table cible. + +Formats pris en charge: + +- [CSVWithNames](../../interfaces/formats.md#csvwithnames) +- [TabSeparatedWithNames](../../interfaces/formats.md#tabseparatedwithnames) + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 1. + +## date\_time\_input\_format {#settings-date_time_input_format} + +Permet de choisir un analyseur de la représentation textuelle de la date et de l'heure. + +Le réglage ne s'applique pas à [fonctions date et heure](../../query_language/functions/date_time_functions.md). + +Valeurs possibles: + +- `'best_effort'` — Enables extended parsing. + + ClickHouse peut analyser la base `YYYY-MM-DD HH:MM:SS` format et tous [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) formats de date et heure. Exemple, `'2018-06-08T01:02:03.000Z'`. + +- `'basic'` — Use basic parser. + + ClickHouse ne peut analyser que la base `YYYY-MM-DD HH:MM:SS` format. Exemple, `'2019-08-20 10:18:56'`. + +Valeur par défaut: `'basic'`. + +Voir aussi: + +- [Type de données DateTime.](../../data_types/datetime.md) +- [Fonctions pour travailler avec des dates et des heures.](../../query_language/functions/date_time_functions.md) + +## join\_default\_strictness {#settings-join_default_strictness} + +Définit la rigueur par défaut pour [JOIN clauses](../../query_language/select.md#select-join). + +Valeurs possibles: + +- `ALL` — If the right table has several matching rows, ClickHouse creates a [Produit cartésien](https://en.wikipedia.org/wiki/Cartesian_product) à partir des lignes correspondantes. C'est normal `JOIN` comportement de SQL standard. +- `ANY` — If the right table has several matching rows, only the first one found is joined. If the right table has only one matching row, the results of `ANY` et `ALL` sont les mêmes. +- `ASOF` — For joining sequences with an uncertain match. +- `Empty string` — If `ALL` ou `ANY` n'est pas spécifié dans la requête, ClickHouse lève une exception. + +Valeur par défaut: `ALL`. + +## join\_any\_take\_last\_row {#settings-join_any_take_last_row} + +Modifie le comportement des opérations de jointure avec `ANY` rigueur. + +!!! warning "Attention" + Ce paramètre s'applique uniquement pour `JOIN` opérations avec [Rejoindre](../table_engines/join.md) le moteur de tables. + +Valeurs possibles: + +- 0 — If the right table has more than one matching row, only the first one found is joined. +- 1 — If the right table has more than one matching row, only the last one found is joined. + +Valeur par défaut: 0. + +Voir aussi: + +- [Clause de JOINTURE](../../query_language/select.md#select-join) +- [Rejoindre le moteur de table](../table_engines/join.md) +- [join\_default\_strictness](#settings-join_default_strictness) + +## join\_use\_nulls {#join_use_nulls} + +Définit le type de [JOIN](../../query_language/select.md) comportement. Lors de la fusion de tables, des cellules vides peuvent apparaître. ClickHouse les remplit différemment en fonction de ce paramètre. + +Valeurs possibles: + +- 0 — The empty cells are filled with the default value of the corresponding field type. +- 1 — `JOIN` se comporte de la même manière que dans SQL standard. Le type du champ correspondant est converti en [Nullable](../../data_types/nullable.md#data_type-nullable) et les cellules vides sont remplis avec [NULL](../../query_language/syntax.md). + +Valeur par défaut: 0. + +## max\_block\_size {#setting-max_block_size} + +Dans ClickHouse, les données sont traitées par Blocs (Ensembles de parties de colonne). Les cycles de traitement internes pour un seul bloc sont assez efficaces, mais il y a des dépenses notables sur chaque bloc. Le `max_block_size` le paramètre est une recommandation pour la taille du bloc (dans un nombre de lignes) à charger à partir des tables. La taille du bloc ne doit pas être trop petite, de sorte que les dépenses sur chaque bloc sont toujours perceptibles, mais pas trop grande pour que la requête avec limite qui est terminée après le premier bloc soit traitée rapidement. L'objectif est d'éviter de consommer trop de mémoire lors de l'extraction d'un grand nombre de colonnes dans plusieurs threads et de préserver au moins certains localité de cache. + +Valeur par défaut: de 65 536. + +Les blocs de la taille de `max_block_size` ne sont pas toujours chargées de la table. Si il est évident que moins de données doivent être récupérées, un bloc plus petit est traitée. + +## preferred\_block\_size\_bytes {#preferred-block-size-bytes} + +Utilisé dans le même but que `max_block_size`, mais il définit la taille de bloc recommandée en octets en l'adaptant au nombre de lignes dans le bloc. +Cependant, la taille du bloc ne peut pas être supérieure à `max_block_size` rangée. +Par défaut: 1 000 000. Cela ne fonctionne que lors de la lecture des moteurs MergeTree. + +## merge\_tree\_min\_rows\_for\_concurrent\_read {#setting-merge-tree-min-rows-for-concurrent-read} + +Si le nombre de lignes à lire à partir d'un fichier d'un [MergeTree](../table_engines/mergetree.md) table dépasse `merge_tree_min_rows_for_concurrent_read` ensuite, ClickHouse essaie d'effectuer une lecture simultanée de ce fichier sur plusieurs threads. + +Valeurs possibles: + +- Tout nombre entier positif. + +Valeur par défaut: 163840. + +## merge\_tree\_min\_bytes\_for\_concurrent\_read {#setting-merge-tree-min-bytes-for-concurrent-read} + +Si le nombre d'octets à lire à partir d'un fichier d'un [MergeTree](../table_engines/mergetree.md)- table de moteur dépasse `merge_tree_min_bytes_for_concurrent_read` puis ClickHouse essaie de lire simultanément à partir de ce fichier dans plusieurs threads. + +Valeur Possible: + +- Tout nombre entier positif. + +Valeur par défaut: 251658240. + +## merge\_tree\_min\_rows\_for\_seek {#setting-merge-tree-min-rows-for-seek} + +Si la distance entre deux blocs de données à lire dans un fichier est inférieure à `merge_tree_min_rows_for_seek` lignes, puis ClickHouse ne cherche pas à travers le fichier mais lit les données séquentiellement. + +Valeurs possibles: + +- Tout nombre entier positif. + +Valeur par défaut: 0. + +## merge\_tree\_min\_bytes\_for\_seek {#setting-merge-tree-min-bytes-for-seek} + +Si la distance entre deux blocs de données à lire dans un fichier est inférieure à `merge_tree_min_bytes_for_seek` octets, puis ClickHouse lit séquentiellement une plage de fichier qui contient les deux blocs, évitant ainsi la recherche supplémentaire. + +Valeurs possibles: + +- Tout nombre entier positif. + +Valeur par défaut: 0. + +## merge\_tree\_coarse\_index\_granularité {#setting-merge-tree-coarse-index-granularity} + +Lors de la recherche de données, ClickHouse vérifie les marques de données dans le fichier d'index. Si ClickHouse trouve que les clés requises sont dans une certaine plage, il divise cette plage en `merge_tree_coarse_index_granularity` subranges et recherche les clés requises récursivement. + +Valeurs possibles: + +- Tout entier pair positif. + +Valeur par défaut: 8. + +## merge\_tree\_max\_rows\_to\_use\_cache {#setting-merge-tree-max-rows-to-use-cache} + +Si ClickHouse devrait lire plus de `merge_tree_max_rows_to_use_cache` lignes dans une requête, il n'utilise pas le cache des blocs non compressés. + +Le cache des blocs non compressés stocke les données extraites pour les requêtes. ClickHouse utilise ce cache pour accélérer les réponses aux petites requêtes répétées. Ce paramètre protège le cache contre le saccage par les requêtes qui lisent une grande quantité de données. Le [uncompressed\_cache\_size](../server_settings/settings.md#server-settings-uncompressed_cache_size) le paramètre serveur définit la taille du cache des blocs non compressés. + +Valeurs possibles: + +- Tout nombre entier positif. + +Default value: 128 ✕ 8192. + +## merge\_tree\_max\_bytes\_to\_use\_cache {#setting-merge-tree-max-bytes-to-use-cache} + +Si ClickHouse devrait lire plus de `merge_tree_max_bytes_to_use_cache` octets dans une requête, il n'utilise pas le cache de non compressé blocs. + +Le cache des blocs non compressés stocke les données extraites pour les requêtes. ClickHouse utilise ce cache pour accélérer les réponses aux petites requêtes répétées. Ce paramètre protège le cache contre le saccage par les requêtes qui lisent une grande quantité de données. Le [uncompressed\_cache\_size](../server_settings/settings.md#server-settings-uncompressed_cache_size) le paramètre serveur définit la taille du cache des blocs non compressés. + +Valeur Possible: + +- Tout nombre entier positif. + +Valeur par défaut: 2013265920. + +## min\_bytes\_to\_use\_direct\_io {#settings-min-bytes-to-use-direct-io} + +Volume de données minimum requis pour utiliser l'accès direct aux E/S sur le disque de stockage. + +ClickHouse utilise ce paramètre lors de la lecture de données à partir de tables. Si le volume total de stockage de toutes les données à lire dépasse `min_bytes_to_use_direct_io` octets, puis ClickHouse lit les données du disque de stockage avec le `O_DIRECT` option. + +Valeurs possibles: + +- 0 — Direct I/O is disabled. +- Entier positif. + +Valeur par défaut: 0. + +## log\_queries {#settings-log-queries} + +Configuration de la journalisation des requêtes. + +Les requêtes envoyées à ClickHouse avec cette configuration sont enregistrées selon les règles du [query\_log](../server_settings/settings.md#server_settings-query-log) paramètre de configuration du serveur. + +Exemple: + +``` text +log_queries=1 +``` + +## log\_query\_threads {#settings-log-query-threads} + +Configuration de la journalisation des threads de requête. + +Les threads de requêtes exécutés par ClickHouse avec cette configuration sont journalisés selon les règles du [query\_thread\_log](../server_settings/settings.md#server_settings-query-thread-log) paramètre de configuration du serveur. + +Exemple: + +``` text +log_query_threads=1 +``` + +## max\_insert\_block\_size {#settings-max_insert_block_size} + +La taille des blocs à former pour l'insertion dans une table. +Ce paramètre s'applique uniquement dans les cas où le serveur formes les blocs. +Par exemple, pour une insertion via L'interface HTTP, le serveur analyse le format de données et forme des blocs de la taille spécifiée. +Mais lors de l'utilisation de clickhouse-client, le client analyse les données ‘max\_insert\_block\_size’ le réglage sur le serveur n'affecte pas la taille des blocs insérés. +Le paramètre n'a pas non plus de but lors de L'utilisation D'INSERT SELECT, car les données sont insérées à l'aide des mêmes blocs qui sont formés après SELECT. + +Valeur par défaut: 1 048 576 octets. + +La valeur par défaut est légèrement supérieure à `max_block_size`. La raison en est que certains moteurs de table (`*MergeTree`) former une partie de données sur le disque pour chaque bloc inséré, qui est une entité assez grande. Pareillement, `*MergeTree` les tables trient les données lors de l'insertion et une taille de bloc suffisamment grande permet de trier plus de données dans la RAM. + +## max\_replica\_delay\_for\_distributed\_queries {#settings-max_replica_delay_for_distributed_queries} + +Désactive les répliques en retard pour les requêtes distribuées. Voir [Réplication](../../operations/table_engines/replication.md). + +Définit le temps en secondes. Si une réplique accuse plus de retard que la valeur définie, cette réplique n'est pas utilisée. + +Valeur par défaut: 300. + +Utilisé lors de l'exécution `SELECT` à partir d'une table distribuée qui pointe vers des tables répliquées. + +## max\_threads {#settings-max_threads} + +Nombre maximal de threads de traitement des requêtes, à l'exclusion des threads de récupération de données à partir de serveurs distants (voir ‘max\_distributed\_connections’ paramètre). + +Ce paramètre s'applique aux threads qui effectuent les mêmes étapes du pipeline de traitement des requêtes en parallèle. +Par exemple, lors de la lecture d'une table, s'il est possible d'évaluer des expressions avec des fonctions, filtrer avec WHERE et pré-agréger pour GROUP BY en parallèle en utilisant au moins ‘max\_threads’ nombre de threads, puis ‘max\_threads’ sont utilisés. + +Valeur par défaut: nombre de cœurs de processeur physiques. + +Si moins d'une requête SELECT est normalement exécutée sur un serveur à la fois, définissez ce paramètre sur une valeur légèrement inférieure au nombre réel de cœurs de processeur. + +Pour les requêtes qui sont terminées rapidement en raison d'une limite, vous pouvez définir une valeur inférieure ‘max\_threads’. Par exemple, si le nombre d'entrées se trouvent dans chaque bloc et max\_threads = 8, 8 blocs sont récupérées, même s'il aurait été suffisante pour lire un seul. + +Le plus petit de la `max_threads` valeur, moins la mémoire est consommée. + +## max\_insert\_threads {#settings-max-insert-threads} + +Nombre maximal de threads à exécuter `INSERT SELECT` requête. + +Valeurs possibles: + +- 0 (or 1) — `INSERT SELECT` pas d'exécution parallèle. +- Entier positif. Plus grand que 1. + +Valeur par défaut: 0. + +Parallèle `INSERT SELECT` n'a d'effet que si l' `SELECT` une partie est exécutée en parallèle, voir [max\_threads](#settings-max_threads) paramètre. +Des valeurs plus élevées conduiront à une utilisation de la mémoire plus élevée. + +## max\_compress\_block\_size {#max-compress-block-size} + +La taille maximale des blocs de données non compressées avant la compression pour l'écriture dans une table. Par défaut, 1 048 576 (1 MiB). Si la taille est réduite, le taux de compression est considérablement réduit, la vitesse de compression et de décompression augmente légèrement en raison de la localisation du cache, et la consommation de mémoire est réduite. Il n'y aucune raison de modifier ce paramètre. + +Ne confondez pas les blocs pour la compression (un morceau de mémoire constitué d'octets) avec des blocs pour le traitement des requêtes (Un ensemble de lignes d'une table). + +## min\_compress\_block\_size {#min-compress-block-size} + +Pour [MergeTree](../table_engines/mergetree.md)" table. Afin de réduire la latence lors du traitement des requêtes, un bloc est compressé lors de l'écriture de la marque suivante si sa taille est au moins ‘min\_compress\_block\_size’. Par défaut, 65 536. + +La taille réelle du bloc, si les données non compressées sont inférieures à ‘max\_compress\_block\_size’ pas moins de cette valeur et pas moins que le volume de données pour une marque. + +Regardons un exemple. Supposons que ‘index\_granularity’ a 8192 lors de la création de la table. + +Nous écrivons une colonne de type UInt32 (4 octets par valeur). Lors de l'écriture de 8192 lignes, le total sera de 32 KO de données. Puisque min\_compress\_block\_size = 65 536, un bloc compressé sera formé pour toutes les deux marques. + +Nous écrivons une colonne URL avec le type de chaîne (taille moyenne de 60 octets par valeur). Lors de l'écriture de 8192 lignes, la moyenne sera légèrement inférieure à 500 Ko de données. Comme il s'agit de plus de 65 536, un bloc compressé sera formé pour chaque marque. Dans ce cas, lors de la lecture de données du disque dans la plage d'une seule marque, les données supplémentaires ne seront pas décompressées. + +Il n'y aucune raison de modifier ce paramètre. + +## max\_query\_size {#settings-max_query_size} + +La partie maximale d'une requête qui peut être prise en RAM pour l'analyse avec L'analyseur SQL. +La requête INSERT contient également des données pour INSERT qui sont traitées par un analyseur de flux séparé (qui consomme O (1) RAM), qui n'est pas inclus dans cette restriction. + +Valeur par défaut: 256 Ko. + +## interactive\_delay {#interactive-delay} + +Intervalle en microsecondes pour vérifier si l'exécution de la requête a été annulée et envoyer la progression. + +Valeur par défaut: 100 000 (vérifie l'Annulation et envoie la progression dix fois par seconde). + +## connect\_timeout, receive\_timeout, send\_timeout {#connect-timeout-receive-timeout-send-timeout} + +Délais d'attente en secondes sur le socket utilisé pour communiquer avec le client. + +Valeur par défaut: 10, 300, 300. + +## cancel\_http\_readonly\_queries\_on\_client\_close {#cancel-http-readonly-queries-on-client-close} + +Cancels HTTP read-only queries (e.g. SELECT) when a client closes the connection without waiting for the response. + +Valeur par défaut: 0 + +## poll\_interval {#poll-interval} + +Verrouillez une boucle d'attente pendant le nombre de secondes spécifié. + +Valeur par défaut: 10. + +## max\_distributed\_connections {#max-distributed-connections} + +Nombre maximal de connexions simultanées avec des serveurs distants pour le traitement distribué d'une seule requête vers une seule table distribuée. Nous vous recommandons de définir une valeur au moins égale au nombre de serveurs dans le cluster. + +Valeur par défaut: 1024. + +Les paramètres suivants ne sont utilisés que lors de la création de tables distribuées (et lors du lancement d'un serveur), il n'y a donc aucune raison de les modifier lors de l'exécution. + +## distributed\_connections\_pool\_size {#distributed-connections-pool-size} + +Nombre maximal de connexions simultanées avec des serveurs distants pour le traitement distribué de toutes les requêtes vers une seule table distribuée. Nous vous recommandons de définir une valeur au moins égale au nombre de serveurs dans le cluster. + +Valeur par défaut: 1024. + +## connect\_timeout\_with\_failover\_ms {#connect-timeout-with-failover-ms} + +Délai d'attente en millisecondes pour la connexion à un serveur distant pour un moteur de table distribué, si ‘shard’ et ‘replica’ les sections sont utilisées dans la définition du cluster. +En cas d'échec, plusieurs tentatives sont faites pour se connecter à diverses répliques. + +Valeur par défaut: 50. + +## connections\_with\_failover\_max\_tries {#connections-with-failover-max-tries} + +Nombre maximal de tentatives de connexion avec chaque réplique pour le moteur de table distribué. + +Valeur par défaut: 3. + +## extrême {#extremes} + +Indique s'il faut compter les valeurs extrêmes (les minimums et les maximums dans les colonnes d'un résultat de requête). Accepte 0 ou 1. Par défaut, 0 (désactivé). +Pour plus d'informations, consultez la section “Extreme values”. + +## use\_uncompressed\_cache {#setting-use_uncompressed_cache} + +Indique s'il faut utiliser un cache de blocs non compressés. Accepte 0 ou 1. Par défaut, 0 (désactivé). +L'utilisation du cache non compressé (uniquement pour les tables de la famille MergeTree) peut réduire considérablement la latence et augmenter le débit lorsque vous travaillez avec un grand nombre de requêtes courtes. Activez ce paramètre pour les utilisateurs qui envoient des requêtes courtes fréquentes. Faites également attention à la [uncompressed\_cache\_size](../server_settings/settings.md#server-settings-uncompressed_cache_size) configuration parameter (only set in the config file) – the size of uncompressed cache blocks. By default, it is 8 GiB. The uncompressed cache is filled in as needed and the least-used data is automatically deleted. + +Pour les requêtes qui lisent au moins un volume de données assez important (un million de lignes ou plus), le cache non compressé est désactivé automatiquement pour économiser de l'espace pour les requêtes vraiment petites. Cela signifie que vous pouvez garder la ‘use\_uncompressed\_cache’ toujours la valeur 1. + +## replace\_running\_query {#replace-running-query} + +Lors de l'utilisation de L'interface HTTP, le ‘query\_id’ le paramètre peut être passé. C'est n'importe quelle chaîne qui sert d'Identificateur de requête. +Si une requête d'un utilisateur avec le même ‘query\_id’ il existe déjà à ce moment, le comportement dépend de la ‘replace\_running\_query’ paramètre. + +`0` (default) – Throw an exception (don't allow the query to run if a query with the same ‘query\_id’ est déjà en cours d'exécution). + +`1` – Cancel the old query and start running the new one. + +Yandex.Metrica utilise ce paramètre défini sur 1 pour implémenter des suggestions de conditions de segmentation. Après avoir entré le caractère suivant, si l'ancienne requête n'est pas encore terminée, elle doit être annulée. + +## stream\_flush\_interval\_ms {#stream-flush-interval-ms} + +Fonctionne pour les tables avec des flux dans le cas d'une expiration, ou lorsqu'un thread génère [max\_insert\_block\_size](#settings-max_insert_block_size) rangée. + +La valeur par défaut est 7500. + +Plus la valeur est petite, plus les données sont vidées dans la table. Régler la valeur trop faible entraîne de mauvaises performances. + +## équilibrage {#settings-load_balancing} + +Spécifie l'algorithme de sélection des réplicas utilisé pour le traitement des requêtes distribuées. + +ClickHouse prend en charge les algorithmes suivants de choix des répliques: + +- [Aléatoire](#load_balancing-random) (par défaut) +- [Nom d'hôte le plus proche](#load_balancing-nearest_hostname) +- [Afin](#load_balancing-in_order) +- [Premier ou aléatoire](#load_balancing-first_or_random) + +### Aléatoire (par défaut) {#load_balancing-random} + +``` sql +load_balancing = random +``` + +Le nombre d'erreurs est compté pour chaque réplique. La requête est envoyée au réplica avec le moins d'erreurs, et s'il y en a plusieurs, à n'importe qui d'entre eux. +Inconvénients: la proximité du serveur n'est pas prise en compte; si les répliques ont des données différentes, vous obtiendrez également des données différentes. + +### Nom D'Hôte Le Plus Proche {#load_balancing-nearest_hostname} + +``` sql +load_balancing = nearest_hostname +``` + +The number of errors is counted for each replica. Every 5 minutes, the number of errors is integrally divided by 2. Thus, the number of errors is calculated for a recent time with exponential smoothing. If there is one replica with a minimal number of errors (i.e. errors occurred recently on the other replicas), the query is sent to it. If there are multiple replicas with the same minimal number of errors, the query is sent to the replica with a hostname that is most similar to the server's hostname in the config file (for the number of different characters in identical positions, up to the minimum length of both hostnames). + +Par exemple, exemple01-01-1 et example01-01-2.yandex.ru sont différents dans une position, tandis que l'exemple01-01-1 et l'exemple01-02-2 diffèrent dans deux endroits. +Cette méthode peut sembler primitive, mais elle ne nécessite pas de données externes sur la topologie du réseau, et elle ne compare pas les adresses IP, ce qui serait compliqué pour nos adresses IPv6. + +Ainsi, s'il existe des répliques équivalentes, la plus proche par son nom est préférée. +Nous pouvons également supposer que lors de l'envoi d'une requête au même serveur, en l'absence d'Échecs, une requête distribuée ira également aux mêmes serveurs. Ainsi, même si des données différentes sont placées sur les répliques, la requête retournera principalement les mêmes résultats. + +### Afin {#load_balancing-in_order} + +``` sql +load_balancing = in_order +``` + +Répliques avec le même nombre d'erreurs sont accessibles dans le même ordre qu'ils sont définis dans la configuration. +Cette méthode est appropriée lorsque vous savez exactement quelle réplique est préférable. + +### Premier ou aléatoire {#load_balancing-first_or_random} + +``` sql +load_balancing = first_or_random +``` + +Cet algorithme choisit la première réplique de l'ensemble ou une réplique aléatoire si la première n'est pas disponible. Il est efficace dans les configurations de topologie de réplication croisée, mais inutile dans d'autres configurations. + +Le `first_or_random` algorithme résout le problème de la `in_order` algorithme. Avec `in_order`, si une réplique tombe en panne, la suivante obtient une double charge tandis que les répliques restantes gèrent la quantité habituelle de trafic. Lors de l'utilisation de la `first_or_random` algorithme, la charge est répartie uniformément entre les répliques qui sont encore disponibles. + +## prefer\_localhost\_replica {#settings-prefer-localhost-replica} + +Active / désactive préférable d'utiliser le réplica localhost lors du traitement des requêtes distribuées. + +Valeurs possibles: + +- 1 — ClickHouse always sends a query to the localhost replica if it exists. +- 0 — ClickHouse uses the balancing strategy specified by the [équilibrage](#settings-load_balancing) paramètre. + +Valeur par défaut: 1. + +!!! warning "Avertissement" + Désactivez ce paramètre si vous utilisez [max\_parallel\_replicas](#settings-max_parallel_replicas). + +## totals\_mode {#totals-mode} + +Comment calculer les totaux lorsque HAVING est présent, ainsi que lorsque max\_rows\_to\_group\_by et group\_by\_overflow\_mode = ‘any’ sont présents. +Voir la section “WITH TOTALS modifier”. + +## totals\_auto\_threshold {#totals-auto-threshold} + +Le seuil de `totals_mode = 'auto'`. +Voir la section “WITH TOTALS modifier”. + +## max\_parallel\_replicas {#settings-max_parallel_replicas} + +Nombre maximal de répliques pour chaque fragment lors de l'exécution d'une requête. +Par souci de cohérence (pour obtenir différentes parties du même partage de données), Cette option ne fonctionne que lorsque la clé d'échantillonnage est définie. +Le retard de réplique n'est pas contrôlé. + +## compiler {#compile} + +Activer la compilation des requêtes. Par défaut, 0 (désactivé). + +La compilation n'est utilisée que pour une partie du pipeline de traitement des requêtes: pour la première étape de l'agrégation (GROUP BY). +Si cette partie du pipeline a été compilée, la requête peut s'exécuter plus rapidement en raison du déploiement de cycles courts et des appels de fonction d'agrégation intégrés. L'amélioration maximale des performances (jusqu'à quatre fois plus rapide dans de rares cas) est observée pour les requêtes avec plusieurs fonctions d'agrégat simples. Typiquement, le gain de performance est insignifiant. Dans de très rares cas, il peut ralentir l'exécution de la requête. + +## min\_count\_to\_compile {#min-count-to-compile} + +Combien de fois utiliser potentiellement un morceau de code compilé avant d'exécuter la compilation. Par défaut, 3. +For testing, the value can be set to 0: compilation runs synchronously and the query waits for the end of the compilation process before continuing execution. For all other cases, use values ​​starting with 1. Compilation normally takes about 5-10 seconds. +Si la valeur est 1 ou plus, la compilation se produit de manière asynchrone dans un thread séparé. Le résultat sera utilisé dès qu'il sera prêt, y compris les requêtes en cours d'exécution. + +Le code compilé est requis pour chaque combinaison différente de fonctions d'agrégat utilisées dans la requête et le type de clés dans la clause GROUP BY. +The results of the compilation are saved in the build directory in the form of .so files. There is no restriction on the number of compilation results since they don't use very much space. Old results will be used after server restarts, except in the case of a server upgrade – in this case, the old results are deleted. + +## output\_format\_json\_quote\_64bit\_integers {#session_settings-output_format_json_quote_64bit_integers} + +Si la valeur est true, les entiers apparaissent entre guillemets lors de l'utilisation des formats JSON\* Int64 et UInt64 (pour la compatibilité avec la plupart des implémentations JavaScript); sinon, les entiers sont sortis sans les guillemets. + +## format\_csv\_delimiter {#settings-format_csv_delimiter} + +Caractère interprété comme un délimiteur dans les données CSV. Par défaut, le délimiteur est `,`. + +## input\_format\_csv\_unquoted\_null\_literal\_as\_null {#settings-input_format_csv_unquoted_null_literal_as_null} + +Pour le format D'entrée CSV active ou désactive l'analyse des `NULL` comme littéral (synonyme de `\N`). + +## output\_format\_csv\_crlf\_end\_of\_line {#settings-output-format-csv-crlf-end-of-line} + +Utilisez le séparateur de ligne de style DOS/Windows (CRLF) en CSV au lieu du style Unix (LF). + +## output\_format\_tsv\_crlf\_end\_of\_line {#settings-output-format-tsv-crlf-end-of-line} + +Utilisez le séparateur de ligne de style DOC/Windows (CRLF) dans TSV au lieu du style Unix (LF). + +## insert\_quorum {#settings-insert_quorum} + +Active les Écritures de quorum. + +- Si `insert_quorum < 2`, les Écritures de quorum sont désactivées. +- Si `insert_quorum >= 2`, les Écritures de quorum sont activées. + +Valeur par défaut: 0. + +Quorum écrit + +`INSERT` ne réussit que lorsque ClickHouse parvient à écrire correctement les données `insert_quorum` des répliques au cours de la `insert_quorum_timeout`. Si, pour une raison quelconque, le nombre de répliques avec succès écrit n'atteint pas le `insert_quorum`, l'écriture est considérée comme ayant échoué et ClickHouse supprimera le bloc inséré de toutes les répliques où les données ont déjà été écrites. + +Toutes les répliques du quorum sont cohérentes, c'est-à-dire qu'elles contiennent des données de toutes les `INSERT` requête. Le `INSERT` la séquence est linéarisé. + +Lors de la lecture des données écrites à partir du `insert_quorum`, vous pouvez utiliser le [select\_sequential\_consistency](#settings-select_sequential_consistency) option. + +Clickhouse génère une exception + +- Si le nombre de répliques au moment de la requête est inférieure à la `insert_quorum`. +- Lors d'une tentative d'écriture de données lorsque le bloc précédent n'a pas encore été inséré dans le `insert_quorum` des répliques. Cette situation peut se produire si l'utilisateur tente d'effectuer une `INSERT` avant le précédent avec le `insert_quorum` est terminé. + +Voir aussi: + +- [insert\_quorum\_timeout](#settings-insert_quorum_timeout) +- [select\_sequential\_consistency](#settings-select_sequential_consistency) + +## insert\_quorum\_timeout {#settings-insert_quorum-timeout} + +Ecrire dans quorum timeout en secondes. Si le délai d'attente est passé et qu'aucune écriture n'a encore eu lieu, ClickHouse génère une exception et le client doit répéter la requête pour écrire le même bloc dans le même réplica ou tout autre réplica. + +Valeur par défaut: 60 secondes. + +Voir aussi: + +- [insert\_quorum](#settings-insert_quorum) +- [select\_sequential\_consistency](#settings-select_sequential_consistency) + +## select\_sequential\_consistency {#settings-select_sequential_consistency} + +Active ou désactive la cohérence séquentielle pour `SELECT` requête: + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 0. + +Utilisation + +Lorsque la cohérence séquentielle est activée, ClickHouse permet au client d'exécuter `SELECT` requête uniquement pour les répliques qui contiennent des données de toutes les `INSERT` requêtes exécutées avec `insert_quorum`. Si le client fait référence à une réplique partielle, ClickHouse génère une exception. La requête SELECT n'inclut pas les données qui n'ont pas encore été écrites dans le quorum des répliques. + +Voir aussi: + +- [insert\_quorum](#settings-insert_quorum) +- [insert\_quorum\_timeout](#settings-insert_quorum_timeout) + +## insert\_deduplicate {#settings-insert-deduplicate} + +Active ou désactive la déduplication des blocs `INSERT` (Répliqués\* les tableaux). + +Valeurs possibles: + +- 0 — Disabled. +- 1 — Enabled. + +Valeur par défaut: 1. + +Par défaut, les blocs insérés dans les tables répliquées `INSERT` déclaration sont dédupliquées (voir \[Réplication de Données\] (../ table\_engines / replication. md). + +## déduplicate\_blocks\_in\_dependent\_materialized\_views {#settings-deduplicate-blocks-in-dependent-materialized-views} + +Active ou désactive la vérification de déduplication des vues matérialisées qui reçoivent des données à partir de tables\* répliquées. + +Valeurs possibles: + + 0 — Disabled. + 1 — Enabled. + +Valeur par défaut: 0. + +Utilisation + +Par défaut, la déduplication n'est pas effectuée pour les vues matérialisées mais en amont, dans la table source. +Si un bloc inséré est ignoré en raison de la déduplication dans la table source, il n'y aura pas d'insertion dans les vues matérialisées attachées. Ce comportement existe pour permettre l'insertion de données hautement agrégées dans des vues matérialisées, dans les cas où les blocs insérés sont les mêmes après l'agrégation de vues matérialisées mais dérivés de différentes insertions dans la table source. +Dans le même temps, ce comportement “breaks” `INSERT` idempotence. Si un `INSERT` dans la table principale a été un succès et `INSERT` into a materialized view failed (e.g. because of communication failure with Zookeeper) a client will get an error and can retry the operation. However, the materialized view won't receive the second insert because it will be discarded by deduplication in the main (source) table. The setting `deduplicate_blocks_in_dependent_materialized_views` permet de changer ce comportement. Lors d'une nouvelle tentative, une vue matérialisée recevra l'insertion répétée et effectuera une vérification de déduplication par elle-même, +ignorant le résultat de la vérification pour la table source, et insérera des lignes perdues en raison de la première défaillance. + +## max\_network\_bytes {#settings-max-network-bytes} + +Limite le volume de données (en octets) qui est reçu ou transmis sur le réseau lors de l'exécution d'une requête. Ce paramètre s'applique à chaque individu requête. + +Valeurs possibles: + +- Entier positif. +- 0 — Data volume control is disabled. + +Valeur par défaut: 0. + +## max\_network\_bandwidth {#settings-max-network-bandwidth} + +Limite la vitesse de l'échange de données sur le réseau en octets par seconde. Ce paramètre s'applique à toutes les requêtes. + +Valeurs possibles: + +- Entier positif. +- 0 — Bandwidth control is disabled. + +Valeur par défaut: 0. + +## max\_network\_bandwidth\_for\_user {#settings-max-network-bandwidth-for-user} + +Limite la vitesse de l'échange de données sur le réseau en octets par seconde. Ce paramètre s'applique à toutes les requêtes exécutées simultanément par un seul utilisateur. + +Valeurs possibles: + +- Entier positif. +- 0 — Control of the data speed is disabled. + +Valeur par défaut: 0. + +## max\_network\_bandwidth\_for\_all\_users {#settings-max-network-bandwidth-for-all-users} + +Limite la vitesse à laquelle les données sont échangées sur le réseau en octets par seconde. Ce paramètre s'applique à toutes les requêtes exécutées simultanément sur le serveur. + +Valeurs possibles: + +- Entier positif. +- 0 — Control of the data speed is disabled. + +Valeur par défaut: 0. + +## count\_distinct\_implementation {#settings-count_distinct_implementation} + +Spécifie de l' `uniq*` les fonctions doivent être utilisées pour [COUNT(DISTINCT …)](../../query_language/agg_functions/reference.md#agg_function-count) construction. + +Valeurs possibles: + +- [uniq](../../query_language/agg_functions/reference.md#agg_function-uniq) +- [uniqcombiné](../../query_language/agg_functions/reference.md#agg_function-uniqcombined) +- [uniqCombined64](../../query_language/agg_functions/reference.md#agg_function-uniqcombined64) +- [uniqHLL12](../../query_language/agg_functions/reference.md#agg_function-uniqhll12) +- [uniqExact](../../query_language/agg_functions/reference.md#agg_function-uniqexact) + +Valeur par défaut: `uniqExact`. + +## skip\_unavailable\_shards {#settings-skip_unavailable_shards} + +Active ou désactive le saut silencieux des fragments indisponibles. + +Tesson est considéré comme indisponible si toutes ses répliques ne sont pas disponibles. Une réplique n'est pas disponible dans les cas suivants: + +- ClickHouse ne peut pas se connecter à la réplique pour une raison quelconque. + + Lors de la connexion à une réplique, ClickHouse effectue plusieurs tentatives. Si toutes ces tentatives échouent, la réplique est considéré comme indisponible. + +- La réplique ne peut pas être résolue via le DNS. + + Si le nom d'hôte du réplica ne peut pas être résolu via DNS, il peut indiquer les situations suivantes: + + - L'hôte de la réplique n'a pas d'enregistrement DNS. Il peut se produire dans les systèmes avec DNS dynamique, par exemple, [Kubernetes](https://kubernetes.io), où les nœuds peuvent être insolubles pendant les temps d'arrêt, et ce n'est pas une erreur. + + - Erreur de Configuration. Le fichier de configuration ClickHouse contient un mauvais nom d'hôte. + +Valeurs possibles: + +- 1 — skipping enabled. + + Si un fragment n'est pas disponible, ClickHouse renvoie un résultat basé sur des données partielles et ne signale pas les problèmes de disponibilité des nœuds. + +- 0 — skipping disabled. + + Si un fragment n'est pas disponible, ClickHouse lève une exception. + +Valeur par défaut: 0. + +## optimize\_skip\_unused\_shards {#settings-optimize_skip_unused_shards} + +Active ou désactive le saut des fragments inutilisés pour les requêtes SELECT qui ont la condition de clé de sharding dans PREWHERE/WHERE (suppose que les données sont distribuées par la clé de sharding, sinon ne rien faire). + +Valeur par défaut: 0 + +## force\_optimize\_skip\_unused\_shards {#settings-force_optimize_skip_unused_shards} + +Active ou désactive l'exécution de la requête si [`optimize_skip_unused_shards`](#settings-optimize_skip_unused_shards) activé et sauter des fragments inutilisés n'est pas possible. Si le saut n'est pas possible et le paramètre est activé, une exception sera levée. + +Valeurs possibles: + +- 0 - Désactivé (ne jette) +- 1-Désactiver l'exécution de la requête uniquement si la table a une clé de sharding +- 2-Désactiver l'exécution de la requête quelle que soit la clé de sharding est définie pour la table + +Valeur par défaut: 0 + +## force\_optimize\_skip\_unused\_shards\_no\_nested {#settings-force_optimize_skip_unused_shards_no_nested} + +Réinitialiser [`optimize_skip_unused_shards`](#settings-force_optimize_skip_unused_shards) pour imbriquée `Distributed` table + +Valeurs possibles: + +- 1 — Enabled. +- 0 — Disabled. + +Valeur par défaut: 0. + +## optimize\_throw\_if\_noop {#setting-optimize_throw_if_noop} + +Active ou désactive le lancement d'une exception si [OPTIMIZE](../../query_language/misc.md#misc_operations-optimize) la requête n'a pas effectué de fusion. + +Par défaut, `OPTIMIZE` retourne avec succès même s'il n'a rien fait. Ce paramètre vous permet de différencier ces situations et d'obtenir la raison dans un message d'exception. + +Valeurs possibles: + +- 1 — Throwing an exception is enabled. +- 0 — Throwing an exception is disabled. + +Valeur par défaut: 0. + +## distributed\_replica\_error\_half\_life {#settings-distributed_replica_error_half_life} + +- Type: secondes +- Valeur par défaut: 60 secondes + +Contrôle la vitesse à laquelle les erreurs dans les tables distribuées sont mises à zéro. Si une réplique est indisponible pendant un certain temps, accumule 5 erreurs et distributed\_replica\_error\_half\_life est défini sur 1 seconde, la réplique est considérée comme normale 3 secondes après la dernière erreur. + +Voir aussi: + +- [Tableau moteur Distribués](../../operations/table_engines/distributed.md) +- [distributed\_replica\_error\_cap](#settings-distributed_replica_error_cap) + +## distributed\_replica\_error\_cap {#settings-distributed_replica_error_cap} + +- Type: unsigned int +- Valeur par défaut: 1000 + +Le nombre d'erreurs de chaque réplique est plafonné à cette valeur, empêchant une seule réplique d'accumuler trop d'erreurs. + +Voir aussi: + +- [Tableau moteur Distribués](../../operations/table_engines/distributed.md) +- [distributed\_replica\_error\_half\_life](#settings-distributed_replica_error_half_life) + +## distributed\_directory\_monitor\_sleep\_time\_ms {#distributed_directory_monitor_sleep_time_ms} + +Intervalle de Base pour le [Distribué](../table_engines/distributed.md) tableau moteur à envoyer des données. L'intervalle réel augmente de façon exponentielle en cas d'erreurs. + +Valeurs possibles: + +- Un nombre entier positif de millisecondes. + +Valeur par défaut: 100 millisecondes. + +## distributed\_directory\_monitor\_max\_sleep\_time\_ms {#distributed_directory_monitor_max_sleep_time_ms} + +Intervalle maximal pour le [Distribué](../table_engines/distributed.md) tableau moteur à envoyer des données. Limite la croissance exponentielle de l'intervalle défini dans [distributed\_directory\_monitor\_sleep\_time\_ms](#distributed_directory_monitor_sleep_time_ms) paramètre. + +Valeurs possibles: + +- Un nombre entier positif de millisecondes. + +Valeur par défaut: 30000 millisecondes (30 secondes). + +## distributed\_directory\_monitor\_batch\_inserts {#distributed_directory_monitor_batch_inserts} + +Active / désactive l'envoi des données insérées par lots. + +Lorsque l'envoi par lots est activé, le [Distribué](../table_engines/distributed.md) tableau moteur essaie d'envoyer plusieurs fichiers de données insérées dans une seule opération au lieu de les envoyer séparément. L'envoi par lots améliore les performances du cluster en utilisant mieux les ressources du serveur et du réseau. + +Valeurs possibles: + +- 1 — Enabled. +- 0 — Disabled. + +Valeur par défaut: 0. + +## os\_thread\_priority {#setting-os-thread-priority} + +Définit la priorité ([beau](https://en.wikipedia.org/wiki/Nice_(Unix))) pour les threads qui exécutent des requêtes. Le planificateur du système d'exploitation considère cette priorité lors du choix du prochain thread à exécuter sur chaque noyau CPU disponible. + +!!! warning "Avertissement" + Pour utiliser ce paramètre, vous devez définir l' `CAP_SYS_NICE` capacité. Le `clickhouse-server` paquet configure lors de l'installation. Certains environnements virtuels ne vous permettent pas de définir `CAP_SYS_NICE` capacité. Dans ce cas, `clickhouse-server` affiche un message à ce sujet au début. + +Valeurs possibles: + +- Vous pouvez définir des valeurs dans la gamme `[-20, 19]`. + +Des valeurs plus faibles signifient une priorité plus élevée. Les discussions avec des bas `nice` les valeurs de priorité sont effectués plus fréquemment que les discussions avec des valeurs élevées. Les valeurs élevées sont préférables pour les requêtes non interactives de longue durée, car elles leur permettent d'abandonner rapidement des ressources au profit de requêtes interactives courtes lorsqu'elles arrivent. + +Valeur par défaut: 0. + +## query\_profiler\_real\_time\_period\_ns {#query_profiler_real_time_period_ns} + +Définit la période pour une horloge réelle de la [requête profiler](../../operations/performance/sampling_query_profiler.md). La vraie minuterie d'horloge compte le temps d'horloge murale. + +Valeurs possibles: + +- Nombre entier positif, en nanosecondes. + + Valeurs recommandées: + + - 10000000 (100 times a second) nanoseconds and less for single queries. + - 1000000000 (once a second) for cluster-wide profiling. + +- 0 pour éteindre la minuterie. + +Type: [UInt64](../../data_types/int_uint.md). + +Valeur par défaut: 1000000000 nanosecondes (une fois par seconde). + +Voir aussi: + +- Système de table [trace\_log](../system_tables.md#system_tables-trace_log) + +## query\_profiler\_cpu\_time\_period\_ns {#query_profiler_cpu_time_period_ns} + +Définit la période pour une minuterie D'horloge CPU du [requête profiler](../../operations/performance/sampling_query_profiler.md). Cette minuterie ne compte que le temps CPU. + +Valeurs possibles: + +- Un nombre entier positif de nanosecondes. + + Valeurs recommandées: + + - 10000000 (100 times a second) nanoseconds and more for single queries. + - 1000000000 (once a second) for cluster-wide profiling. + +- 0 pour éteindre la minuterie. + +Type: [UInt64](../../data_types/int_uint.md). + +Valeur par défaut: 1000000000 nanosecondes. + +Voir aussi: + +- Système de table [trace\_log](../system_tables.md#system_tables-trace_log) + +## allow\_introspection\_functions {#settings-allow_introspection_functions} + +Active des désactive [obscures fonctions](../../query_language/functions/introspection.md) pour le profilage de requête. + +Valeurs possibles: + +- 1 — Introspection functions enabled. +- 0 — Introspection functions disabled. + +Valeur par défaut: 0. + +**Voir Aussi** + +- [Échantillonnage Du Profileur De Requête](../performance/sampling_query_profiler.md) +- Système de table [trace\_log](../system_tables.md#system_tables-trace_log) + +## input\_format\_parallel\_parsing {#input-format-parallel-parsing} + +- Type: bool +- Valeur par défaut: True + +Activer l'analyse parallèle des formats de données en préservant l'ordre. Pris en charge uniquement pour les formats TSV, TKSV, CSV et jsoneachrow. + +## min\_chunk\_bytes\_for\_parallel\_parsing {#min-chunk-bytes-for-parallel-parsing} + +- Type: unsigned int +- Valeur par défaut: 1 MiB + +La taille minimale du bloc en octets, que chaque thread analysera en parallèle. + +## output\_format\_avro\_codec {#settings-output_format_avro_codec} + +Définit le codec de compression utilisé pour le fichier Avro de sortie. + +Type: string + +Valeurs possibles: + +- `null` — No compression +- `deflate` — Compress with Deflate (zlib) +- `snappy` — Compress with [Hargneux](https://google.github.io/snappy/) + +Valeur par défaut: `snappy` (si disponible) ou `deflate`. + +## output\_format\_avro\_sync\_interval {#settings-output_format_avro_sync_interval} + +Définit la taille minimale des données (en octets) entre les marqueurs de synchronisation pour le fichier Avro de sortie. + +Type: unsigned int + +Valeurs possibles: 32 (32 octets) - 1073741824 (1 GiB) + +Valeur par défaut: 32768 (32 Ko) + +## format\_avro\_schema\_registry\_url {#settings-format_avro_schema_registry_url} + +Définit L'URL de Registre de schéma Confluent à utiliser avec [AvroConfluent](../../interfaces/formats.md#data-format-avro-confluent) format + +Type: URL + +Valeur par défaut: vide + +[Article Original](https://clickhouse.tech/docs/en/operations/settings/settings/) diff --git a/docs/fr/operations/settings/settings_profiles.md b/docs/fr/operations/settings/settings_profiles.md new file mode 100644 index 00000000000..23b36d698cb --- /dev/null +++ b/docs/fr/operations/settings/settings_profiles.md @@ -0,0 +1,68 @@ +--- +machine_translated: true +--- + +# Les Paramètres Des Profils {#settings-profiles} + +Un profil de paramètres est une collection de paramètres regroupés sous le même nom. Chaque utilisateur de ClickHouse a un profil. +Pour appliquer tous les paramètres d'un profil, définissez `profile` paramètre. + +Exemple: + +Installer le `web` profil. + +``` sql +SET profile = 'web' +``` + +Les profils de paramètres sont déclarés dans le fichier de configuration utilisateur. Ce n'est généralement `users.xml`. + +Exemple: + +``` xml + + + + + + 8 + + + + + 1000000000 + 100000000000 + + 1000000 + any + + 1000000 + 1000000000 + + 100000 + 100000000 + break + + 600 + 1000000 + 15 + + 25 + 100 + 50 + + 2 + 25 + 50 + 100 + + 1 + + +``` + +L'exemple spécifie deux profils: `default` et `web`. Le `default` profil a un but particulier: il doit toujours être présent et est appliquée lors du démarrage du serveur. En d'autres termes, l' `default` profil contient les paramètres par défaut. Le `web` profil est un profil régulier qui peut être défini à l'aide `SET` requête ou en utilisant un paramètre URL dans une requête HTTP. + +Paramètres les profils peuvent hériter les uns des autres. Pour utiliser l'héritage, indiquer un ou plusieurs `profile` paramètres avant les autres paramètres répertoriés dans le profil. Dans le cas où un paramètre est défini dans les différents profils, les dernières définie est utilisée. + +[Article Original](https://clickhouse.tech/docs/en/operations/settings/settings_profiles/) diff --git a/docs/fr/operations/settings/settings_users.md b/docs/fr/operations/settings/settings_users.md new file mode 100644 index 00000000000..13134f1a2fd --- /dev/null +++ b/docs/fr/operations/settings/settings_users.md @@ -0,0 +1,145 @@ +--- +machine_translated: true +--- + +# Les Paramètres De L'Utilisateur {#user-settings} + +Le `users` la section de la `user.xml` le fichier de configuration contient les paramètres utilisateur. + +La Structure de la `users` section: + +``` xml + + + + + + + + + + + profile_name + + default + + + + + expression + + + + + + +``` + +### nom\_utilisateur/mot de passe {#user-namepassword} + +Le mot de passe peut être spécifié en texte clair ou en SHA256 (format hexadécimal). + +- Pour attribuer un mot de passe en clair (**pas recommandé**), la placer dans un `password` élément. + + Exemple, `qwerty`. Le mot de passe peut être laissé en blanc. + + + +- Pour attribuer un mot de passe à l'aide de son hachage SHA256, placez-le dans un `password_sha256_hex` élément. + + Exemple, `65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5`. + + Exemple de génération d'un mot de passe à partir du shell: + + PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-' + + La première ligne du résultat est le mot de passe. La deuxième ligne est le hachage SHA256 correspondant. + + + +- Pour la compatibilité avec les clients MySQL, le mot de passe peut être spécifié dans le hachage double SHA1. Le placer dans `password_double_sha1_hex` élément. + + Exemple, `08b4a0f1de6ad37da17359e592c8d74788a83eb0`. + + Exemple de génération d'un mot de passe à partir du shell: + + PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-' + + La première ligne du résultat est le mot de passe. La deuxième ligne est le double hachage SHA1 correspondant. + +### nom\_utilisateur / réseaux {#user-namenetworks} + +Liste des réseaux à partir desquels L'utilisateur peut se connecter au serveur ClickHouse. + +Chaque élément de la liste peut avoir l'une des formes suivantes: + +- `` — IP address or network mask. + + Exemple: `213.180.204.3`, `10.0.0.1/8`, `10.0.0.1/255.255.255.0`, `2a02:6b8::3`, `2a02:6b8::3/64`, `2a02:6b8::3/ffff:ffff:ffff:ffff::`. + +- `` — Hostname. + + Exemple: `example01.host.ru`. + + Pour vérifier l'accès, une requête DNS est effectuée et toutes les adresses IP renvoyées sont comparées à l'adresse homologue. + +- `` — Regular expression for hostnames. + + Exemple, `^example\d\d-\d\d-\d\.host\.ru$` + + Pour vérifier l'accès, un [Requête DNS PTR](https://en.wikipedia.org/wiki/Reverse_DNS_lookup) est effectuée pour l'adresse homologue, puis l'expression rationnelle spécifiée est appliquée. Ensuite, une autre requête DNS est effectuée pour les résultats de la requête PTR et toutes les adresses reçues sont comparées à l'adresse homologue. Nous recommandons fortement que regexp se termine avec $. + +Tous les résultats des requêtes DNS sont mis en cache jusqu'au redémarrage du serveur. + +**Exemple** + +Pour ouvrir l'accès de l'utilisateur à partir de n'importe quel réseau, spécifiez: + +``` xml +::/0 +``` + +!!! warning "Avertissement" + Il n'est pas sûr d'ouvrir l'accès à partir de n'importe quel réseau, sauf si vous avez un pare-feu correctement configuré ou si le serveur n'est pas directement connecté à Internet. + +Pour ouvrir l'accès uniquement à partir de localhost, spécifier: + +``` xml +::1 +127.0.0.1 +``` + +### nom\_utilisateur / profil {#user-nameprofile} + +Vous pouvez attribuer un profil des paramètres pour l'utilisateur. Les profils de paramètres sont configurés dans une section distincte du `users.xml` fichier. Pour plus d'informations, voir [Profils des paramètres](settings_profiles.md). + +### nom\_utilisateur / quota {#user-namequota} + +Les Quotas vous permettent de suivre ou de limiter l'utilisation des ressources sur une période donnée. Les Quotas sont configurés dans le `quotas` +la section de la `users.xml` fichier de configuration. + +Vous pouvez attribuer un jeu de quotas à l'utilisateur. Pour une description détaillée de la configuration des quotas, voir [Quota](../quotas.md#quotas). + +### nom\_utilisateur/bases de données {#user-namedatabases} + +Dans cette section, vous pouvez limiter les lignes renvoyées par ClickHouse pour `SELECT` requêtes faites par l'utilisateur actuel, implémentant ainsi la sécurité de base au niveau de la ligne. + +**Exemple** + +La configuration suivante force cet utilisateur `user1` ne peut voir les lignes de `table1` comme le résultat de `SELECT` requêtes, où la valeur de la `id` le champ est 1000. + +``` xml + + + + + id = 1000 + + + + +``` + +Le `filter` peut être n'importe quelle expression résultant en un [UInt8](../../data_types/int_uint.md)-le type de la valeur. Il contient généralement des comparaisons et des opérateurs logiques. Les lignes de `database_name.table1` où filtrer les résultats à 0 ne sont pas retournés pour cet utilisateur. Le filtrage est incompatible avec `PREWHERE` opérations et désactive `WHERE→PREWHERE` optimisation. + +[Article Original](https://clickhouse.tech/docs/en/operations/settings/settings_users/) diff --git a/docs/fr/operations/system_tables.md b/docs/fr/operations/system_tables.md new file mode 100644 index 00000000000..469a0c710bd --- /dev/null +++ b/docs/fr/operations/system_tables.md @@ -0,0 +1,1051 @@ +--- +machine_translated: true +--- + +# Les tables système {#system-tables} + +Les tables système sont utilisées pour implémenter une partie des fonctionnalités du système et pour fournir un accès à des informations sur le fonctionnement du système. +Vous ne pouvez pas supprimer une table système (mais vous pouvez effectuer un détachement). +Les tables système n'ont pas de fichiers avec des données sur le disque ou de fichiers avec des métadonnées. Le serveur crée toutes les tables système au démarrage. +Les tables système sont en lecture seule. +Ils sont situés dans la ‘system’ la base de données. + +## système.asynchronous\_metrics {#system_tables-asynchronous_metrics} + +Contient des mesures qui sont calculées périodiquement en arrière-plan. Par exemple, la quantité de RAM utilisée. + +Colonne: + +- `metric` ([Chaîne](../data_types/string.md)) — Metric name. +- `value` ([Float64](../data_types/float.md)) — Metric value. + +**Exemple** + +``` sql +SELECT * FROM system.asynchronous_metrics LIMIT 10 +``` + +``` text +┌─metric──────────────────────────────────┬──────value─┐ +│ jemalloc.background_thread.run_interval │ 0 │ +│ jemalloc.background_thread.num_runs │ 0 │ +│ jemalloc.background_thread.num_threads │ 0 │ +│ jemalloc.retained │ 422551552 │ +│ jemalloc.mapped │ 1682989056 │ +│ jemalloc.resident │ 1656446976 │ +│ jemalloc.metadata_thp │ 0 │ +│ jemalloc.metadata │ 10226856 │ +│ UncompressedCacheCells │ 0 │ +│ MarkCacheFiles │ 0 │ +└─────────────────────────────────────────┴────────────┘ +``` + +**Voir Aussi** + +- [Surveiller](monitoring.md) — Base concepts of ClickHouse monitoring. +- [système.métrique](#system_tables-metrics) — Contains instantly calculated metrics. +- [système.événement](#system_tables-events) — Contains a number of events that have occurred. +- [système.metric\_log](#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` и `system.events`. + +## système.cluster {#system-clusters} + +Contient des informations sur les clusters disponibles dans le fichier de configuration et les serveurs en eux. + +Colonne: + +- `cluster` (String) — The cluster name. +- `shard_num` (UInt32) — The shard number in the cluster, starting from 1. +- `shard_weight` (UInt32) — The relative weight of the shard when writing data. +- `replica_num` (UInt32) — The replica number in the shard, starting from 1. +- `host_name` (String) — The host name, as specified in the config. +- `host_address` (String) — The host IP address obtained from DNS. +- `port` (UInt16) — The port to use for connecting to the server. +- `user` (String) — The name of the user for connecting to the server. +- `errors_count` (UInt32) - nombre de fois que cet hôte n'a pas atteint le réplica. +- `estimated_recovery_time` (UInt32) - secondes restantes jusqu'à ce que le nombre d'erreurs de réplique soit remis à zéro et qu'il soit considéré comme revenu à la normale. + +Veuillez noter que `errors_count` est mise à jour une fois par requête à la grappe, mais `estimated_recovery_time` est recalculé sur-demande. Il pourrait donc y avoir un cas de non-zéro `errors_count` et zéro `estimated_recovery_time`, cette requête suivante sera nulle `errors_count` et essayez d'utiliser des répliques comme si elle ne comporte pas d'erreurs. + +**Voir aussi** + +- [Tableau moteur Distribués](table_engines/distributed.md) +- [paramètre distributed\_replica\_error\_cap](settings/settings.md#settings-distributed_replica_error_cap) +- [paramètre distributed\_replica\_error\_half\_life](settings/settings.md#settings-distributed_replica_error_half_life) + +## système.colonne {#system-columns} + +Contient des informations sur les colonnes de toutes les tables. + +Vous pouvez utiliser ce tableau pour obtenir des informations similaires à l' [DESCRIBE TABLE](../query_language/misc.md#misc-describe-table) requête, mais pour plusieurs tables à la fois. + +Le `system.columns` le tableau contient les colonnes suivantes (la colonne type est indiqué entre parenthèses): + +- `database` (String) — Database name. +- `table` (String) — Table name. +- `name` (String) — Column name. +- `type` (String) — Column type. +- `default_kind` (String) — Expression type (`DEFAULT`, `MATERIALIZED`, `ALIAS`) pour la valeur par défaut, ou une chaîne vide si elle n'est pas définie. +- `default_expression` (String) — Expression for the default value, or an empty string if it is not defined. +- `data_compressed_bytes` (UInt64) — The size of compressed data, in bytes. +- `data_uncompressed_bytes` (UInt64) — The size of decompressed data, in bytes. +- `marks_bytes` (UInt64) — The size of marks, in bytes. +- `comment` (String) — Comment on the column, or an empty string if it is not defined. +- `is_in_partition_key` (UInt8) — Flag that indicates whether the column is in the partition expression. +- `is_in_sorting_key` (UInt8) — Flag that indicates whether the column is in the sorting key expression. +- `is_in_primary_key` (UInt8) — Flag that indicates whether the column is in the primary key expression. +- `is_in_sampling_key` (UInt8) — Flag that indicates whether the column is in the sampling key expression. + +## système.contributeur {#system-contributors} + +Contient des informations sur les donateurs. Tous les constributors dans un ordre aléatoire. L'ordre est aléatoire au moment de l'exécution de la requête. + +Colonne: + +- `name` (String) — Contributor (author) name from git log. + +**Exemple** + +``` sql +SELECT * FROM system.contributors LIMIT 10 +``` + +``` text +┌─name─────────────┐ +│ Olga Khvostikova │ +│ Max Vetrov │ +│ LiuYangkuan │ +│ svladykin │ +│ zamulla │ +│ Šimon Podlipský │ +│ BayoNet │ +│ Ilya Khomutov │ +│ Amy Krishnevsky │ +│ Loud_Scream │ +└──────────────────┘ +``` + +Trouver vous-même dans le tableau, utilisez une requête: + +``` sql +SELECT * FROM system.contributors WHERE name='Olga Khvostikova' +``` + +``` text +┌─name─────────────┐ +│ Olga Khvostikova │ +└──────────────────┘ +``` + +## système.les bases de données {#system-databases} + +Cette table contient une seule colonne de chaîne appelée ‘name’ – the name of a database. +Chaque base de données que le serveur connaît a une entrée correspondante dans la table. +Cette table système est utilisée pour implémenter `SHOW DATABASES` requête. + +## système.detached\_parts {#system_tables-detached_parts} + +Contient des informations sur les pièces détachées de [MergeTree](table_engines/mergetree.md) table. Le `reason` colonne spécifie pourquoi la pièce a été détachée. Pour les pièces détachées par l'utilisateur, la raison est vide. De telles pièces peuvent être attachées avec [ALTER TABLE ATTACH PARTITION\|PART](../query_language/query_language/alter/#alter_attach-partition) commande. Pour la description des autres colonnes, voir [système.partie](#system_tables-parts). Si le nom de pièce n'est pas valide, les valeurs de certaines colonnes peuvent être `NULL`. Ces pièces peuvent être supprimés avec [ALTER TABLE DROP DETACHED PART](../query_language/query_language/alter/#alter_drop-detached). + +## système.dictionnaire {#system-dictionaries} + +Contient des informations sur les dictionnaires externes. + +Colonne: + +- `name` (String) — Dictionary name. +- `type` (String) — Dictionary type: Flat, Hashed, Cache. +- `origin` (String) — Path to the configuration file that describes the dictionary. +- `attribute.names` (Array(String)) — Array of attribute names provided by the dictionary. +- `attribute.types` (Array(String)) — Corresponding array of attribute types that are provided by the dictionary. +- `has_hierarchy` (UInt8) — Whether the dictionary is hierarchical. +- `bytes_allocated` (UInt64) — The amount of RAM the dictionary uses. +- `hit_rate` (Float64) — For cache dictionaries, the percentage of uses for which the value was in the cache. +- `element_count` (UInt64) — The number of items stored in the dictionary. +- `load_factor` (Float64) — The percentage filled in the dictionary (for a hashed dictionary, the percentage filled in the hash table). +- `creation_time` (DateTime) — The time when the dictionary was created or last successfully reloaded. +- `last_exception` (String) — Text of the error that occurs when creating or reloading the dictionary if the dictionary couldn't be created. +- `source` (String) — Text describing the data source for the dictionary. + +Notez que la quantité de mémoire utilisée par le dictionnaire n'est pas proportionnel au nombre d'articles qui s'y trouvent. Ainsi, pour les dictionnaires plats et mis en cache, toutes les cellules de mémoire sont pré-assignées, quelle que soit la capacité du dictionnaire. + +## système.événement {#system_tables-events} + +Contient des informations sur le nombre d'événements survenus dans le système. Par exemple, dans le tableau, vous pouvez trouver combien `SELECT` les requêtes ont été traitées depuis le démarrage du serveur ClickHouse. + +Colonne: + +- `event` ([Chaîne](../data_types/string.md)) — Event name. +- `value` ([UInt64](../data_types/int_uint.md)) — Number of events occurred. +- `description` ([Chaîne](../data_types/string.md)) — Event description. + +**Exemple** + +``` sql +SELECT * FROM system.events LIMIT 5 +``` + +``` text +┌─event─────────────────────────────────┬─value─┬─description────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Query │ 12 │ Number of queries to be interpreted and potentially executed. Does not include queries that failed to parse or were rejected due to AST size limits, quota limits or limits on the number of simultaneously running queries. May include internal queries initiated by ClickHouse itself. Does not count subqueries. │ +│ SelectQuery │ 8 │ Same as Query, but only for SELECT queries. │ +│ FileOpen │ 73 │ Number of files opened. │ +│ ReadBufferFromFileDescriptorRead │ 155 │ Number of reads (read/pread) from a file descriptor. Does not include sockets. │ +│ ReadBufferFromFileDescriptorReadBytes │ 9931 │ Number of bytes read from file descriptors. If the file is compressed, this will show the compressed data size. │ +└───────────────────────────────────────┴───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**Voir Aussi** + +- [système.asynchronous\_metrics](#system_tables-asynchronous_metrics) — Contains periodically calculated metrics. +- [système.métrique](#system_tables-metrics) — Contains instantly calculated metrics. +- [système.metric\_log](#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` и `system.events`. +- [Surveiller](monitoring.md) — Base concepts of ClickHouse monitoring. + +## système.fonction {#system-functions} + +Contient des informations sur les fonctions normales et agrégées. + +Colonne: + +- `name`(`String`) – The name of the function. +- `is_aggregate`(`UInt8`) — Whether the function is aggregate. + +## système.graphite\_retentions {#system-graphite-retentions} + +Contient des informations sur les paramètres [graphite\_rollup](server_settings/settings.md#server_settings-graphite_rollup) qui sont utilisés dans les tableaux avec [\* GraphiteMergeTree](table_engines/graphitemergetree.md) moteur. + +Colonne: + +- `config_name` (Chaîne) - `graphite_rollup` nom du paramètre. +- `regexp` (Chaîne) - un modèle pour le nom de la métrique. +- `function` (Chaîne) - le nom de la fonction d'agrégation. +- `age` (UInt64) - l'âge minimum des données en secondes. +- `precision` (UInt64) - comment définir précisément l'âge des données en secondes. +- `priority` (UInt16) - priorité de motif. +- `is_default` (UInt8) - indique si le motif est la valeur par défaut. +- `Tables.database` (Array (String)) - tableau de noms de tables de base de données qui utilisent `config_name` paramètre. +- `Tables.table` (Array (String)) - tableau de noms de tables qui utilisent `config_name` paramètre. + +## système.fusionner {#system-merges} + +Contient des informations sur les fusions et les mutations de pièces actuellement en cours pour les tables de la famille MergeTree. + +Colonne: + +- `database` (String) — The name of the database the table is in. +- `table` (String) — Table name. +- `elapsed` (Float64) — The time elapsed (in seconds) since the merge started. +- `progress` (Float64) — The percentage of completed work from 0 to 1. +- `num_parts` (UInt64) — The number of pieces to be merged. +- `result_part_name` (String) — The name of the part that will be formed as the result of merging. +- `is_mutation` (UInt8) - 1 si ce processus est une mutation partielle. +- `total_size_bytes_compressed` (UInt64) — The total size of the compressed data in the merged chunks. +- `total_size_marks` (UInt64) — The total number of marks in the merged parts. +- `bytes_read_uncompressed` (UInt64) — Number of bytes read, uncompressed. +- `rows_read` (UInt64) — Number of rows read. +- `bytes_written_uncompressed` (UInt64) — Number of bytes written, uncompressed. +- `rows_written` (UInt64) — Number of rows written. + +## système.métrique {#system_tables-metrics} + +Contient des mesures qui peuvent être calculées instantanément, ou ont une valeur actuelle. Par exemple, le nombre de requêtes traitées ou en cours réplique de retard. Ce tableau est toujours à jour. + +Colonne: + +- `metric` ([Chaîne](../data_types/string.md)) — Metric name. +- `value` ([Int64](../data_types/int_uint.md)) — Metric value. +- `description` ([Chaîne](../data_types/string.md)) — Metric description. + +La liste des mesures que vous pouvez trouver dans le [SGBD / src / Common / CurrentMetrics.rpc](https://github.com/ClickHouse/ClickHouse/blob/master/dbms/src/Common/CurrentMetrics.cpp) fichier source de ClickHouse. + +**Exemple** + +``` sql +SELECT * FROM system.metrics LIMIT 10 +``` + +``` text +┌─metric─────────────────────┬─value─┬─description──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Query │ 1 │ Number of executing queries │ +│ Merge │ 0 │ Number of executing background merges │ +│ PartMutation │ 0 │ Number of mutations (ALTER DELETE/UPDATE) │ +│ ReplicatedFetch │ 0 │ Number of data parts being fetched from replicas │ +│ ReplicatedSend │ 0 │ Number of data parts being sent to replicas │ +│ ReplicatedChecks │ 0 │ Number of data parts checking for consistency │ +│ BackgroundPoolTask │ 0 │ Number of active tasks in BackgroundProcessingPool (merges, mutations, fetches, or replication queue bookkeeping) │ +│ BackgroundSchedulePoolTask │ 0 │ Number of active tasks in BackgroundSchedulePool. This pool is used for periodic ReplicatedMergeTree tasks, like cleaning old data parts, altering data parts, replica re-initialization, etc. │ +│ DiskSpaceReservedForMerge │ 0 │ Disk space reserved for currently running background merges. It is slightly more than the total size of currently merging parts. │ +│ DistributedSend │ 0 │ Number of connections to remote servers sending data that was INSERTed into Distributed tables. Both synchronous and asynchronous mode. │ +└────────────────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**Voir Aussi** + +- [système.asynchronous\_metrics](#system_tables-asynchronous_metrics) — Contains periodically calculated metrics. +- [système.événement](#system_tables-events) — Contains a number of events that occurred. +- [système.metric\_log](#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` и `system.events`. +- [Surveiller](monitoring.md) — Base concepts of ClickHouse monitoring. + +## système.metric\_log {#system_tables-metric_log} + +Contient l'historique des valeurs de métriques des tables `system.metrics` et `system.events` périodiquement vidé sur le disque. +Pour activer la collection d'historique des métriques `system.metric_log`, créer `/etc/clickhouse-server/config.d/metric_log.xml` avec le contenu suivant: + +``` xml + + + system + metric_log
+ 7500 + 1000 +
+
+``` + +**Exemple** + +``` sql +SELECT * FROM system.metric_log LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +event_date: 2020-02-18 +event_time: 2020-02-18 07:15:33 +milliseconds: 554 +ProfileEvent_Query: 0 +ProfileEvent_SelectQuery: 0 +ProfileEvent_InsertQuery: 0 +ProfileEvent_FileOpen: 0 +ProfileEvent_Seek: 0 +ProfileEvent_ReadBufferFromFileDescriptorRead: 1 +ProfileEvent_ReadBufferFromFileDescriptorReadFailed: 0 +ProfileEvent_ReadBufferFromFileDescriptorReadBytes: 0 +ProfileEvent_WriteBufferFromFileDescriptorWrite: 1 +ProfileEvent_WriteBufferFromFileDescriptorWriteFailed: 0 +ProfileEvent_WriteBufferFromFileDescriptorWriteBytes: 56 +... +CurrentMetric_Query: 0 +CurrentMetric_Merge: 0 +CurrentMetric_PartMutation: 0 +CurrentMetric_ReplicatedFetch: 0 +CurrentMetric_ReplicatedSend: 0 +CurrentMetric_ReplicatedChecks: 0 +... +``` + +**Voir aussi** + +- [système.asynchronous\_metrics](#system_tables-asynchronous_metrics) — Contains periodically calculated metrics. +- [système.événement](#system_tables-events) — Contains a number of events that occurred. +- [système.métrique](#system_tables-metrics) — Contains instantly calculated metrics. +- [Surveiller](monitoring.md) — Base concepts of ClickHouse monitoring. + +## système.nombre {#system-numbers} + +Cette table contient une seule colonne UInt64 nommée ‘number’ qui contient presque tous les nombres naturels à partir de zéro. +Vous pouvez utiliser cette table pour les tests, ou si vous avez besoin de faire une recherche de force brute. +Les lectures de cette table ne sont pas parallélisées. + +## système.numbers\_mt {#system-numbers-mt} + +Le même que ‘system.numbers’ mais les lectures sont parallélisées. Les nombres peuvent être retournés dans n'importe quel ordre. +Utilisé pour les tests. + +## système.un {#system-one} + +Cette table contient une seule ligne avec un ‘dummy’ Colonne UInt8 contenant la valeur 0. +Cette table est utilisée si une requête SELECT ne spécifie pas la clause FROM. +Ceci est similaire à la table double trouvée dans d'autres SGBD. + +## système.partie {#system_tables-parts} + +Contient des informations sur les parties de [MergeTree](table_engines/mergetree.md) table. + +Chaque ligne décrit une partie des données. + +Colonne: + +- `partition` (String) – The partition name. To learn what a partition is, see the description of the [ALTER](../query_language/alter.md#query_language_queries_alter) requête. + + Format: + + - `YYYYMM` pour le partitionnement automatique par mois. + - `any_string` lors du partitionnement manuel. + +- `name` (`String`) – Name of the data part. + +- `active` (`UInt8`) – Flag that indicates whether the data part is active. If a data part is active, it's used in a table. Otherwise, it's deleted. Inactive data parts remain after merging. + +- `marks` (`UInt64`) – The number of marks. To get the approximate number of rows in a data part, multiply `marks` par la granularité d'index (généralement 8192) (cet indice ne fonctionne pas pour la granularité adaptative). + +- `rows` (`UInt64`) – The number of rows. + +- `bytes_on_disk` (`UInt64`) – Total size of all the data part files in bytes. + +- `data_compressed_bytes` (`UInt64`) – Total size of compressed data in the data part. All the auxiliary files (for example, files with marks) are not included. + +- `data_uncompressed_bytes` (`UInt64`) – Total size of uncompressed data in the data part. All the auxiliary files (for example, files with marks) are not included. + +- `marks_bytes` (`UInt64`) – The size of the file with marks. + +- `modification_time` (`DateTime`) – The time the directory with the data part was modified. This usually corresponds to the time of data part creation.\| + +- `remove_time` (`DateTime`) – The time when the data part became inactive. + +- `refcount` (`UInt32`) – The number of places where the data part is used. A value greater than 2 indicates that the data part is used in queries or merges. + +- `min_date` (`Date`) – The minimum value of the date key in the data part. + +- `max_date` (`Date`) – The maximum value of the date key in the data part. + +- `min_time` (`DateTime`) – The minimum value of the date and time key in the data part. + +- `max_time`(`DateTime`) – The maximum value of the date and time key in the data part. + +- `partition_id` (`String`) – ID of the partition. + +- `min_block_number` (`UInt64`) – The minimum number of data parts that make up the current part after merging. + +- `max_block_number` (`UInt64`) – The maximum number of data parts that make up the current part after merging. + +- `level` (`UInt32`) – Depth of the merge tree. Zero means that the current part was created by insert rather than by merging other parts. + +- `data_version` (`UInt64`) – Number that is used to determine which mutations should be applied to the data part (mutations with a version higher than `data_version`). + +- `primary_key_bytes_in_memory` (`UInt64`) – The amount of memory (in bytes) used by primary key values. + +- `primary_key_bytes_in_memory_allocated` (`UInt64`) – The amount of memory (in bytes) reserved for primary key values. + +- `is_frozen` (`UInt8`) – Flag that shows that a partition data backup exists. 1, the backup exists. 0, the backup doesn't exist. For more details, see [FREEZE PARTITION](../query_language/alter.md#alter_freeze-partition) + +- `database` (`String`) – Name of the database. + +- `table` (`String`) – Name of the table. + +- `engine` (`String`) – Name of the table engine without parameters. + +- `path` (`String`) – Absolute path to the folder with data part files. + +- `disk` (`String`) – Name of a disk that stores the data part. + +- `hash_of_all_files` (`String`) – [sipHash128](../query_language/functions/hash_functions.md#hash_functions-siphash128) de fichiers compressés. + +- `hash_of_uncompressed_files` (`String`) – [sipHash128](../query_language/functions/hash_functions.md#hash_functions-siphash128) de fichiers non compressés (fichiers avec des marques, fichier d'index, etc.). + +- `uncompressed_hash_of_compressed_files` (`String`) – [sipHash128](../query_language/functions/hash_functions.md#hash_functions-siphash128) des données dans les fichiers compressés comme s'ils étaient non compressé. + +- `bytes` (`UInt64`) – Alias for `bytes_on_disk`. + +- `marks_size` (`UInt64`) – Alias for `marks_bytes`. + +## système.part\_log {#system_tables-part-log} + +Le `system.part_log` la table est créée uniquement si [part\_log](server_settings/settings.md#server_settings-part-log) serveur paramètre est spécifié. + +Ce tableau contient des informations sur les événements survenus avec [les parties de données](table_engines/custom_partitioning_key.md) dans le [MergeTree](table_engines/mergetree.md) table de famille, telles que l'ajout ou la fusion de données. + +Le `system.part_log` le tableau contient les colonnes suivantes: + +- `event_type` (Enum) — Type of the event that occurred with the data part. Can have one of the following values: + - `NEW_PART` — Inserting of a new data part. + - `MERGE_PARTS` — Merging of data parts. + - `DOWNLOAD_PART` — Downloading a data part. + - `REMOVE_PART` — Removing or detaching a data part using [DETACH PARTITION](../query_language/alter.md#alter_detach-partition). + - `MUTATE_PART` — Mutating of a data part. + - `MOVE_PART` — Moving the data part from the one disk to another one. +- `event_date` (Date) — Event date. +- `event_time` (DateTime) — Event time. +- `duration_ms` (UInt64) — Duration. +- `database` (String) — Name of the database the data part is in. +- `table` (String) — Name of the table the data part is in. +- `part_name` (String) — Name of the data part. +- `partition_id` (String) — ID of the partition that the data part was inserted to. The column takes the ‘all’ si le partitionnement est par `tuple()`. +- `rows` (UInt64) — The number of rows in the data part. +- `size_in_bytes` (UInt64) — Size of the data part in bytes. +- `merged_from` (Array(String)) — An array of names of the parts which the current part was made up from (after the merge). +- `bytes_uncompressed` (UInt64) — Size of uncompressed bytes. +- `read_rows` (UInt64) — The number of rows was read during the merge. +- `read_bytes` (UInt64) — The number of bytes was read during the merge. +- `error` (UInt16) — The code number of the occurred error. +- `exception` (String) — Text message of the occurred error. + +Le `system.part_log` la table est créée après la première insertion de données `MergeTree` table. + +## système.processus {#system_tables-processes} + +Cette table système est utilisée pour implémenter `SHOW PROCESSLIST` requête. + +Colonne: + +- `user` (String) – The user who made the query. Keep in mind that for distributed processing, queries are sent to remote servers under the `default` utilisateur. Le champ contient le nom d'utilisateur pour une requête spécifique, pas pour une requête que cette requête lancée. +- `address` (String) – The IP address the request was made from. The same for distributed processing. To track where a distributed query was originally made from, look at `system.processes` sur le serveur du demandeur de requête. +- `elapsed` (Float64) – The time in seconds since request execution started. +- `rows_read` (UInt64) – The number of rows read from the table. For distributed processing, on the requestor server, this is the total for all remote servers. +- `bytes_read` (UInt64) – The number of uncompressed bytes read from the table. For distributed processing, on the requestor server, this is the total for all remote servers. +- `total_rows_approx` (UInt64) – The approximation of the total number of rows that should be read. For distributed processing, on the requestor server, this is the total for all remote servers. It can be updated during request processing, when new sources to process become known. +- `memory_usage` (UInt64) – Amount of RAM the request uses. It might not include some types of dedicated memory. See the [max\_memory\_usage](../operations/settings/query_complexity.md#settings_max_memory_usage) paramètre. +- `query` (String) – The query text. For `INSERT` il n'inclut pas les données à insérer. +- `query_id` (String) – Query ID, if defined. + +## système.text\_log {#system-tables-text-log} + +Contient des entrées de journalisation. Niveau de journalisation qui va à cette table peut être limité `text_log.level` paramètre de serveur. + +Colonne: + +- `event_date` (`Date`) - Date de l'entrée. +- `event_time` (`DateTime`) - Temps de l'entrée. +- `microseconds` (`UInt32`) - Microsecondes de l'entrée. +- `thread_name` (String) — Name of the thread from which the logging was done. +- `thread_id` (UInt64) — OS thread ID. +- `level` (`Enum8`) - Niveau d'entrée. + - `'Fatal' = 1` + - `'Critical' = 2` + - `'Error' = 3` + - `'Warning' = 4` + - `'Notice' = 5` + - `'Information' = 6` + - `'Debug' = 7` + - `'Trace' = 8` +- `query_id` (`String`)- ID de la requête. +- `logger_name` (`LowCardinality(String)`) - Name of the logger (i.e. `DDLWorker`) +- `message` (`String`) - Le message lui-même. +- `revision` (`UInt32`)- Révision ClickHouse. +- `source_file` (`LowCardinality(String)`)- Fichier Source à partir duquel la journalisation a été effectuée. +- `source_line` (`UInt64`)- Ligne Source à partir de laquelle la journalisation a été effectuée. + +## système.query\_log {#system_tables-query_log} + +Contient des informations sur l'exécution de requêtes. Pour chaque requête, vous pouvez voir l'Heure de début du traitement, la durée du traitement, les messages d'erreur et d'autres informations. + +!!! note "Note" + Le tableau ne contient pas les données d'entrée pour `INSERT` requête. + +Clickhouse crée cette table uniquement si [query\_log](server_settings/settings.md#server_settings-query-log) serveur paramètre est spécifié. Ce paramètre définit les règles de journalisation, tels que l'intervalle d'enregistrement ou le nom de la table, la requête sera connecté. + +Pour activer la journalisation des requêtes, définissez [log\_queries](settings/settings.md#settings-log-queries) paramètre 1. Pour plus de détails, voir le [Paramètre](settings/settings.md) section. + +Le `system.query_log` table enregistre deux types de requêtes: + +1. Requêtes initiales qui ont été exécutées directement par le client. +2. Requêtes enfants initiées par d'autres requêtes (pour l'exécution de requêtes distribuées). Pour ces types de requêtes, des informations sur les requêtes parentes sont affichées dans `initial_*` colonne. + +Colonne: + +- `type` (`Enum8`) — Type of event that occurred when executing the query. Values: + - `'QueryStart' = 1` — Successful start of query execution. + - `'QueryFinish' = 2` — Successful end of query execution. + - `'ExceptionBeforeStart' = 3` — Exception before the start of query execution. + - `'ExceptionWhileProcessing' = 4` — Exception during the query execution. +- `event_date` (Date) — Query starting date. +- `event_time` (DateTime) — Query starting time. +- `query_start_time` (DateTime) — Start time of query execution. +- `query_duration_ms` (UInt64) — Duration of query execution. +- `read_rows` (UInt64) — Number of read rows. +- `read_bytes` (UInt64) — Number of read bytes. +- `written_rows` (UInt64) — For `INSERT` des requêtes, le nombre de lignes. Pour les autres requêtes, la valeur de la colonne est 0. +- `written_bytes` (UInt64) — For `INSERT` des requêtes, le nombre d'octets écrits. Pour les autres requêtes, la valeur de la colonne est 0. +- `result_rows` (UInt64) — Number of rows in the result. +- `result_bytes` (UInt64) — Number of bytes in the result. +- `memory_usage` (UInt64) — Memory consumption by the query. +- `query` (String) — Query string. +- `exception` (String) — Exception message. +- `stack_trace` (String) — Stack trace (a list of methods called before the error occurred). An empty string, if the query is completed successfully. +- `is_initial_query` (UInt8) — Query type. Possible values: + - 1 — Query was initiated by the client. + - 0 — Query was initiated by another query for distributed query execution. +- `user` (String) — Name of the user who initiated the current query. +- `query_id` (String) — ID of the query. +- `address` (IPv6) — IP address that was used to make the query. +- `port` (UInt16) — The client port that was used to make the query. +- `initial_user` (String) — Name of the user who ran the initial query (for distributed query execution). +- `initial_query_id` (String) — ID of the initial query (for distributed query execution). +- `initial_address` (IPv6) — IP address that the parent query was launched from. +- `initial_port` (UInt16) — The client port that was used to make the parent query. +- `interface` (UInt8) — Interface that the query was initiated from. Possible values: + - 1 — TCP. + - 2 — HTTP. +- `os_user` (String) — OS's username who runs [clickhouse-client](../interfaces/cli.md). +- `client_hostname` (String) — Hostname of the client machine where the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP est exécuté. +- `client_name` (String) — The [clickhouse-client](../interfaces/cli.md) ou un autre nom de client TCP. +- `client_revision` (UInt32) — Revision of the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP. +- `client_version_major` (UInt32) — Major version of the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP. +- `client_version_minor` (UInt32) — Minor version of the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP. +- `client_version_patch` (UInt32) — Patch component of the [clickhouse-client](../interfaces/cli.md) ou une autre version du client TCP. +- `http_method` (UInt8) — HTTP method that initiated the query. Possible values: + - 0 — The query was launched from the TCP interface. + - 1 — `GET` la méthode a été utilisée. + - 2 — `POST` la méthode a été utilisée. +- `http_user_agent` (String) — The `UserAgent` en-tête passé dans la requête HTTP. +- `quota_key` (String) — The “quota key” spécifié dans le [quota](quotas.md) (voir `keyed`). +- `revision` (UInt32) — ClickHouse revision. +- `thread_numbers` (Array(UInt32)) — Number of threads that are participating in query execution. +- `ProfileEvents.Names` (Array(String)) — Counters that measure different metrics. The description of them could be found in the table [système.événement](#system_tables-events) +- `ProfileEvents.Values` (Array(UInt64)) — Values of metrics that are listed in the `ProfileEvents.Names` colonne. +- `Settings.Names` (Array(String)) — Names of settings that were changed when the client ran the query. To enable logging changes to settings, set the `log_query_settings` paramètre 1. +- `Settings.Values` (Array(String)) — Values of settings that are listed in the `Settings.Names` colonne. + +Chaque requête crée une ou deux lignes dans le `query_log` le tableau, en fonction de l'état de la requête: + +1. Si l'exécution de la requête est réussie, deux événements de type 1 et 2 sont créés (voir `type` colonne). +2. Si une erreur s'est produite pendant le traitement de la requête, deux événements avec les types 1 et 4 sont créés. +3. Si une erreur s'est produite avant le lancement de la requête, un seul événement de type 3 est créé. + +Par défaut, les journaux sont ajoutés à la table à des intervalles de 7,5 secondes. Vous pouvez définir cet intervalle dans la [query\_log](server_settings/settings.md#server_settings-query-log) configuration du serveur (voir `flush_interval_milliseconds` paramètre). Pour vider les journaux de force du tampon mémoire dans la table, utilisez le `SYSTEM FLUSH LOGS` requête. + +Lorsque la table est supprimée manuellement, il sera automatiquement créé à la volée. Notez que tous les précédents journaux seront supprimés. + +!!! note "Note" + La période de stockage des journaux est illimitée. Les journaux ne sont pas automatiquement supprimés de la table. Vous devez organiser vous-même la suppression des journaux obsolètes. + +Vous pouvez spécifier une clé de partitionnement arbitraire pour `system.query_log` la table dans le [query\_log](server_settings/settings.md#server_settings-query-log) configuration du serveur (voir `partition_by` paramètre). + +## système.query\_thread\_log {#system_tables-query-thread-log} + +La table contient des informations sur chaque thread d'exécution de requête. + +Clickhouse crée cette table uniquement si [query\_thread\_log](server_settings/settings.md#server_settings-query-thread-log) serveur paramètre est spécifié. Ce paramètre définit les règles de journalisation, tels que l'intervalle d'enregistrement ou le nom de la table, la requête sera connecté. + +Pour activer la journalisation des requêtes, définissez [log\_query\_threads](settings/settings.md#settings-log-query-threads) paramètre 1. Pour plus de détails, voir le [Paramètre](settings/settings.md) section. + +Colonne: + +- `event_date` (Date) — the date when the thread has finished execution of the query. +- `event_time` (DateTime) — the date and time when the thread has finished execution of the query. +- `query_start_time` (DateTime) — Start time of query execution. +- `query_duration_ms` (UInt64) — Duration of query execution. +- `read_rows` (UInt64) — Number of read rows. +- `read_bytes` (UInt64) — Number of read bytes. +- `written_rows` (UInt64) — For `INSERT` des requêtes, le nombre de lignes. Pour les autres requêtes, la valeur de la colonne est 0. +- `written_bytes` (UInt64) — For `INSERT` des requêtes, le nombre d'octets écrits. Pour les autres requêtes, la valeur de la colonne est 0. +- `memory_usage` (Int64) — The difference between the amount of allocated and freed memory in context of this thread. +- `peak_memory_usage` (Int64) — The maximum difference between the amount of allocated and freed memory in context of this thread. +- `thread_name` (String) — Name of the thread. +- `thread_number` (UInt32) — Internal thread ID. +- `os_thread_id` (Int32) — OS thread ID. +- `master_thread_id` (UInt64) — OS initial ID of initial thread. +- `query` (String) — Query string. +- `is_initial_query` (UInt8) — Query type. Possible values: + - 1 — Query was initiated by the client. + - 0 — Query was initiated by another query for distributed query execution. +- `user` (String) — Name of the user who initiated the current query. +- `query_id` (String) — ID of the query. +- `address` (IPv6) — IP address that was used to make the query. +- `port` (UInt16) — The client port that was used to make the query. +- `initial_user` (String) — Name of the user who ran the initial query (for distributed query execution). +- `initial_query_id` (String) — ID of the initial query (for distributed query execution). +- `initial_address` (IPv6) — IP address that the parent query was launched from. +- `initial_port` (UInt16) — The client port that was used to make the parent query. +- `interface` (UInt8) — Interface that the query was initiated from. Possible values: + - 1 — TCP. + - 2 — HTTP. +- `os_user` (String) — OS's username who runs [clickhouse-client](../interfaces/cli.md). +- `client_hostname` (String) — Hostname of the client machine where the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP est exécuté. +- `client_name` (String) — The [clickhouse-client](../interfaces/cli.md) ou un autre nom de client TCP. +- `client_revision` (UInt32) — Revision of the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP. +- `client_version_major` (UInt32) — Major version of the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP. +- `client_version_minor` (UInt32) — Minor version of the [clickhouse-client](../interfaces/cli.md) ou un autre client TCP. +- `client_version_patch` (UInt32) — Patch component of the [clickhouse-client](../interfaces/cli.md) ou une autre version du client TCP. +- `http_method` (UInt8) — HTTP method that initiated the query. Possible values: + - 0 — The query was launched from the TCP interface. + - 1 — `GET` la méthode a été utilisée. + - 2 — `POST` la méthode a été utilisée. +- `http_user_agent` (String) — The `UserAgent` en-tête passé dans la requête HTTP. +- `quota_key` (String) — The “quota key” spécifié dans le [quota](quotas.md) (voir `keyed`). +- `revision` (UInt32) — ClickHouse revision. +- `ProfileEvents.Names` (Array(String)) — Counters that measure different metrics for this thread. The description of them could be found in the table [système.événement](#system_tables-events) +- `ProfileEvents.Values` (Array(UInt64)) — Values of metrics for this thread that are listed in the `ProfileEvents.Names` colonne. + +Par défaut, les journaux sont ajoutés à la table à des intervalles de 7,5 secondes. Vous pouvez définir cet intervalle dans la [query\_thread\_log](server_settings/settings.md#server_settings-query-thread-log) configuration du serveur (voir `flush_interval_milliseconds` paramètre). Pour vider les journaux de force du tampon mémoire dans la table, utilisez le `SYSTEM FLUSH LOGS` requête. + +Lorsque la table est supprimée manuellement, il sera automatiquement créé à la volée. Notez que tous les précédents journaux seront supprimés. + +!!! note "Note" + La période de stockage des journaux est illimitée. Les journaux ne sont pas automatiquement supprimés de la table. Vous devez organiser vous-même la suppression des journaux obsolètes. + +Vous pouvez spécifier une clé de partitionnement arbitraire pour `system.query_thread_log` la table dans le [query\_thread\_log](server_settings/settings.md#server_settings-query-thread-log) configuration du serveur (voir `partition_by` paramètre). + +## système.trace\_log {#system_tables-trace_log} + +Contient des traces de pile collectées par le profileur de requête d'échantillonnage. + +Clickhouse crée cette table lorsque le [trace\_log](server_settings/settings.md#server_settings-trace_log) la section de configuration du serveur est définie. Aussi l' [query\_profiler\_real\_time\_period\_ns](settings/settings.md#query_profiler_real_time_period_ns) et [query\_profiler\_cpu\_time\_period\_ns](settings/settings.md#query_profiler_cpu_time_period_ns) paramètres doivent être définis. + +Pour analyser les journaux, utilisez `addressToLine`, `addressToSymbol` et `demangle` fonctions d'introspection. + +Colonne: + +- `event_date`([Date](../data_types/date.md)) — Date of sampling moment. + +- `event_time`([DateTime](../data_types/datetime.md)) — Timestamp of sampling moment. + +- `revision`([UInt32](../data_types/int_uint.md)) — ClickHouse server build revision. + + Lors de la connexion au serveur par `clickhouse-client`, vous voyez la chaîne similaire à `Connected to ClickHouse server version 19.18.1 revision 54429.`. Ce champ contient le `revision` mais pas le `version` d'un serveur. + +- `timer_type`([Enum8](../data_types/enum.md)) — Timer type: + + - `Real` représente l'horloge murale. + - `CPU` représente le temps CPU. + +- `thread_number`([UInt32](../data_types/int_uint.md)) — Thread identifier. + +- `query_id`([Chaîne](../data_types/string.md)) — Query identifier that can be used to get details about a query that was running from the [query\_log](#system_tables-query_log) système de table. + +- `trace`([Tableau (UInt64)](../data_types/array.md)) — Stack trace at the moment of sampling. Each element is a virtual memory address inside ClickHouse server process. + +**Exemple** + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G +``` + +``` text +Row 1: +────── +event_date: 2019-11-15 +event_time: 2019-11-15 15:09:38 +revision: 54428 +timer_type: Real +thread_number: 48 +query_id: acc4d61f-5bd1-4a3e-bc91-2180be37c915 +trace: [94222141367858,94222152240175,94222152325351,94222152329944,94222152330796,94222151449980,94222144088167,94222151682763,94222144088167,94222151682763,94222144088167,94222144058283,94222144059248,94222091840750,94222091842302,94222091831228,94222189631488,140509950166747,140509942945935] +``` + +## système.réplique {#system_tables-replicas} + +Contient des informations et l'état des tables répliquées résidant sur le serveur local. +Ce tableau peut être utilisé pour la surveillance. La table contient une ligne pour chaque Répliqué\* table. + +Exemple: + +``` sql +SELECT * +FROM system.replicas +WHERE table = 'visits' +FORMAT Vertical +``` + +``` text +Row 1: +────── +database: merge +table: visits +engine: ReplicatedCollapsingMergeTree +is_leader: 1 +can_become_leader: 1 +is_readonly: 0 +is_session_expired: 0 +future_parts: 1 +parts_to_check: 0 +zookeeper_path: /clickhouse/tables/01-06/visits +replica_name: example01-06-1.yandex.ru +replica_path: /clickhouse/tables/01-06/visits/replicas/example01-06-1.yandex.ru +columns_version: 9 +queue_size: 1 +inserts_in_queue: 0 +merges_in_queue: 1 +part_mutations_in_queue: 0 +queue_oldest_time: 2020-02-20 08:34:30 +inserts_oldest_time: 0000-00-00 00:00:00 +merges_oldest_time: 2020-02-20 08:34:30 +part_mutations_oldest_time: 0000-00-00 00:00:00 +oldest_part_to_get: +oldest_part_to_merge_to: 20200220_20284_20840_7 +oldest_part_to_mutate_to: +log_max_index: 596273 +log_pointer: 596274 +last_queue_update: 2020-02-20 08:34:32 +absolute_delay: 0 +total_replicas: 2 +active_replicas: 2 +``` + +Colonne: + +- `database` (`String`) - Nom de base de données +- `table` (`String`)- Nom de la Table +- `engine` (`String`)- Nom du moteur de Table +- `is_leader` (`UInt8`) - Si la réplique est le chef de file. + Une seule réplique à la fois peut être le leader. Le leader est responsable de la sélection des fusions d'arrière-plan à effectuer. + Notez que les Écritures peuvent être effectuées sur n'importe quel réplica disponible et ayant une session dans ZK, qu'il s'agisse d'un leader. +- `can_become_leader` (`UInt8`)- Si la réplique peut être élue en tant que leader. +- `is_readonly` (`UInt8`) - Si la réplique est en mode lecture seule. + Ce mode est activé si la configuration n'a pas de sections avec ZooKeeper, si une erreur inconnue s'est produite lors de la réinitialisation des sessions dans ZooKeeper et lors de la réinitialisation des sessions dans ZooKeeper. +- `is_session_expired` (`UInt8`)- la session avec ZooKeeper a expiré. Fondamentalement le même que `is_readonly`. +- `future_parts` (`UInt32`)- Le nombre de parties de données qui apparaîtront à la suite D'insertions ou de fusions qui n'ont pas encore été effectuées. +- `parts_to_check` (`UInt32`) - Le nombre de parties des données dans la file d'attente pour la vérification. Une pièce est placée dans la file d'attente de vérification s'il y a un soupçon qu'elle pourrait être endommagée. +- `zookeeper_path` (`String`)- Chemin d'accès aux données de la table dans ZooKeeper. +- `replica_name` (`String`) - Réplique nom de la Gardienne. Différentes répliques d'une même table ont des noms différents. +- `replica_path` (`String`)- Chemin vers les données de réplique dans ZooKeeper. La même chose que la concaténation ‘zookeeper\_path/replicas/replica\_path’. +- `columns_version` (`Int32`)- Numéro de Version de la structure de la table. Indique combien de fois ALTER a été effectué. Si les répliques ont des versions différentes, cela signifie que certaines répliques n'ont pas encore Toutes les modifications. +- `queue_size` (`UInt32`),- La taille de la file d'attente pour les opérations en attente d'être exécuté. Les opérations comprennent l'insertion de blocs de données, les fusions et certaines autres actions. Il coïncide généralement avec `future_parts`. +- `inserts_in_queue` (`UInt32`) - Nombre d'insertions de blocs de données qui doivent être faits. Les Insertions sont généralement répliquées assez rapidement. Si ce nombre est grand, cela signifie que quelque chose est faux. +- `merges_in_queue` (`UInt32`) - Le nombre de fusions en attente d'être fait. Parfois, les fusions sont longues, donc cette valeur peut être supérieure à zéro pendant une longue période. +- `part_mutations_in_queue` (`UInt32`) - Le nombre de mutations en attente d'être fait. +- `queue_oldest_time` (`DateTime`) - Si `queue_size` supérieur à 0, indique quand l'opération la plus ancienne a été ajoutée à la file d'attente. +- `inserts_oldest_time` (`DateTime`) - Voir `queue_oldest_time` +- `merges_oldest_time` (`DateTime`) - Voir `queue_oldest_time` +- `part_mutations_oldest_time` (`DateTime`) - Voir `queue_oldest_time` + +Les 4 colonnes suivantes ont une valeur non nulle uniquement lorsqu'il y a une session active avec ZK. + +- `log_max_index` (`UInt64`) - Maximum nombre d'entrées dans le journal de l'activité générale. +- `log_pointer` (`UInt64`)- Numéro d'entrée Maximum dans le journal de l'activité générale que le réplica a copié dans sa file d'attente d'exécution, plus un. Si `log_pointer` est beaucoup plus petite que `log_max_index` quelque chose ne va pas. +- `last_queue_update` (`DateTime`) - Lorsque la file d'attente a été mise à jour la dernière fois. +- `absolute_delay` (`UInt64`)- Combien de décalage en secondes la réplique actuelle A. +- `total_replicas` (`UInt8`) - Le nombre total de répliques connues de ce tableau. +- `active_replicas` (`UInt8`) - Le nombre de répliques de cette table qui ont une session dans ZooKeeper (c'est-à-dire le nombre de répliques fonctionnelles). + +Si vous demandez toutes les colonnes, la table peut fonctionner un peu lentement, car plusieurs lectures de ZooKeeper sont faites pour chaque ligne. +Si vous ne demandez pas les 4 dernières colonnes (log\_max\_index, log\_pointer, total\_replicas, active\_replicas), la table fonctionne rapidement. + +Par exemple, vous pouvez vérifier que tout fonctionne correctement comme ceci: + +``` sql +SELECT + database, + table, + is_leader, + is_readonly, + is_session_expired, + future_parts, + parts_to_check, + columns_version, + queue_size, + inserts_in_queue, + merges_in_queue, + log_max_index, + log_pointer, + total_replicas, + active_replicas +FROM system.replicas +WHERE + is_readonly + OR is_session_expired + OR future_parts > 20 + OR parts_to_check > 10 + OR queue_size > 20 + OR inserts_in_queue > 10 + OR log_max_index - log_pointer > 10 + OR total_replicas < 2 + OR active_replicas < total_replicas +``` + +Si cette requête ne retourne rien, cela signifie que tout va bien. + +## système.paramètre {#system-settings} + +Contient des informations sur les paramètres actuellement utilisés. +I. e. utilisé pour l'exécution de la requête que vous utilisez pour lire à partir du système.les paramètres de la table. + +Colonne: + +- `name` (String) — Setting name. +- `value` (String) — Setting value. +- `changed` (UInt8) — Whether the setting was explicitly defined in the config or explicitly changed. + +Exemple: + +``` sql +SELECT * +FROM system.settings +WHERE changed +``` + +``` text +┌─name───────────────────┬─value───────┬─changed─┐ +│ max_threads │ 8 │ 1 │ +│ use_uncompressed_cache │ 0 │ 1 │ +│ load_balancing │ random │ 1 │ +│ max_memory_usage │ 10000000000 │ 1 │ +└────────────────────────┴─────────────┴─────────┘ +``` + +## système.tableau\_moteurs {#system-table-engines} + +Contient une description des moteurs de table pris en charge par le serveur et leurs informations de support de fonctionnalité. + +Ce tableau contient les colonnes suivantes (le type de colonne est indiqué entre parenthèses): + +- `name` (String) — The name of table engine. +- `supports_settings` (UInt8) — Flag that indicates if table engine supports `SETTINGS` clause. +- `supports_skipping_indices` (UInt8) — Flag that indicates if table engine supports [sauter les indices](table_engines/mergetree/#table_engine-mergetree-data_skipping-indexes). +- `supports_ttl` (UInt8) — Flag that indicates if table engine supports [TTL](table_engines/mergetree/#table_engine-mergetree-ttl). +- `supports_sort_order` (UInt8) — Flag that indicates if table engine supports clauses `PARTITION_BY`, `PRIMARY_KEY`, `ORDER_BY` et `SAMPLE_BY`. +- `supports_replication` (UInt8) — Flag that indicates if table engine supports [réplication des données](table_engines/replication/). +- `supports_duduplication` (UInt8) — Flag that indicates if table engine supports data deduplication. + +Exemple: + +``` sql +SELECT * +FROM system.table_engines +WHERE name in ('Kafka', 'MergeTree', 'ReplicatedCollapsingMergeTree') +``` + +``` text +┌─name──────────────────────────┬─supports_settings─┬─supports_skipping_indices─┬─supports_sort_order─┬─supports_ttl─┬─supports_replication─┬─supports_deduplication─┐ +│ Kafka │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ +│ MergeTree │ 1 │ 1 │ 1 │ 1 │ 0 │ 0 │ +│ ReplicatedCollapsingMergeTree │ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ +└───────────────────────────────┴───────────────────┴───────────────────────────┴─────────────────────┴──────────────┴──────────────────────┴────────────────────────┘ +``` + +**Voir aussi** + +- Famille MergeTree [les clauses de requête](table_engines/mergetree.md#mergetree-query-clauses) +- Kafka [paramètre](table_engines/kafka.md#table_engine-kafka-creating-a-table) +- Rejoindre [paramètre](table_engines/join.md#join-limitations-and-settings) + +## système.table {#system-tables} + +Contient les métadonnées de chaque table que le serveur connaît. Les tableaux détachés ne sont pas représentés dans `system.tables`. + +Ce tableau contient les colonnes suivantes (le type de colonne est indiqué entre parenthèses): + +- `database` (String) — The name of the database the table is in. +- `name` (String) — Table name. +- `engine` (String) — Table engine name (without parameters). +- `is_temporary` (UInt8) - indicateur qui indique si la table est temporaire. +- `data_path` (Chaîne) - chemin d'accès aux données de la table dans le système de fichiers. +- `metadata_path` (Chaîne) - chemin d'accès aux métadonnées de la table dans le système de fichiers. +- `metadata_modification_time` (DateTime) - Heure de la dernière modification des métadonnées de la table. +- `dependencies_database` (Array (String)) - dépendances de base de données. +- `dependencies_table` (Array (String)) - dépendances de Table ([MaterializedView](table_engines/materializedview.md) tables basées sur le tableau actuel). +- `create_table_query` (Chaîne) - la requête qui a été utilisée pour créer la table. +- `engine_full` (Chaîne) - paramètres du moteur de table. +- `partition_key` (String) - l'expression de clé de partition spécifiée dans le tableau. +- `sorting_key` (String) - l'expression de clé de tri spécifiée dans la table. +- `primary_key` (String) - l'expression de clé primaire spécifiée dans la table. +- `sampling_key` (String) - l'expression de clé d'échantillonnage spécifiée dans la table. + +Le `system.tables` le tableau est utilisé dans `SHOW TABLES` implémentation de requête. + +## système.zookeeper {#system-zookeeper} + +La table n'existe pas si ZooKeeper n'est pas configuré. Permet de lire les données du cluster Zookeeper défini dans la configuration. +La requête doit avoir un ‘path’ condition d'égalité dans la clause WHERE. C'est le chemin dans ZooKeeper pour les enfants pour lesquels vous souhaitez obtenir des données. + +Requête `SELECT * FROM system.zookeeper WHERE path = '/clickhouse'` données de sortie pour tous les enfants `/clickhouse` nœud. +Pour générer des données pour tous les nœuds racine, écrivez path = ‘/’. +Si le chemin d'accès spécifié dans ‘path’ n'existe pas, une exception sera levée. + +Colonne: + +- `name` (String) — The name of the node. +- `path` (String) — The path to the node. +- `value` (String) — Node value. +- `dataLength` (Int32) — Size of the value. +- `numChildren` (Int32) — Number of descendants. +- `czxid` (Int64) — ID of the transaction that created the node. +- `mzxid` (Int64) — ID of the transaction that last changed the node. +- `pzxid` (Int64) — ID of the transaction that last deleted or added descendants. +- `ctime` (DateTime) — Time of node creation. +- `mtime` (DateTime) — Time of the last modification of the node. +- `version` (Int32) — Node version: the number of times the node was changed. +- `cversion` (Int32) — Number of added or removed descendants. +- `aversion` (Int32) — Number of changes to the ACL. +- `ephemeralOwner` (Int64) — For ephemeral nodes, the ID of the session that owns this node. + +Exemple: + +``` sql +SELECT * +FROM system.zookeeper +WHERE path = '/clickhouse/tables/01-08/visits/replicas' +FORMAT Vertical +``` + +``` text +Row 1: +────── +name: example01-08-1.yandex.ru +value: +czxid: 932998691229 +mzxid: 932998691229 +ctime: 2015-03-27 16:49:51 +mtime: 2015-03-27 16:49:51 +version: 0 +cversion: 47 +aversion: 0 +ephemeralOwner: 0 +dataLength: 0 +numChildren: 7 +pzxid: 987021031383 +path: /clickhouse/tables/01-08/visits/replicas + +Row 2: +────── +name: example01-08-2.yandex.ru +value: +czxid: 933002738135 +mzxid: 933002738135 +ctime: 2015-03-27 16:57:01 +mtime: 2015-03-27 16:57:01 +version: 0 +cversion: 37 +aversion: 0 +ephemeralOwner: 0 +dataLength: 0 +numChildren: 7 +pzxid: 987021252247 +path: /clickhouse/tables/01-08/visits/replicas +``` + +## système.mutation {#system_tables-mutations} + +Le tableau contient des informations sur [mutation](../query_language/alter.md#alter-mutations) des tables MergeTree et leur progression. Chaque commande de mutation est représentée par une seule ligne. Le tableau comporte les colonnes suivantes: + +**base de données**, **table** - Le nom de la base de données et de la table à laquelle la mutation a été appliquée. + +**mutation\_id** - Le numéro d'identification de la mutation. Pour les tables répliquées ces ID correspondent aux noms znode dans le `/mutations/` répertoire de la Gardienne. Pour les tables non compliquées, Les Id correspondent aux noms de fichiers dans le répertoire de données de la table. + +**commande** - La chaîne de commande mutation (la partie de la requête après `ALTER TABLE [db.]table`). + +**create\_time** - Quand cette commande de mutation a été soumise pour exécution. + +**block\_numbers.partition\_id**, **block\_numbers.nombre** - Une colonne imbriquée. Pour les mutations de tables répliquées, il contient un enregistrement pour chaque partition: l'ID de partition et le numéro de bloc acquis par la mutation (dans chaque partition, seules les parties contenant des blocs avec des nombres inférieurs au numéro de bloc acquis par la mutation dans cette partition seront mutées). Dans les tables non répliquées, les numéros de bloc de toutes les partitions forment une seule séquence. Cela signifie que pour les mutations de tables non répliquées, la colonne contiendra un enregistrement avec un seul numéro de bloc acquis par la mutation. + +**parts\_to\_do** - Le nombre de parties de données qui doivent être mutées pour que la mutation se termine. + +**\_done** - La mutation est faite? Notez que même si `parts_to_do = 0` il est possible qu'une mutation d'une table répliquée ne soit pas encore effectuée en raison d'un INSERT de longue durée qui créera une nouvelle partie de données qui devra être mutée. + +S'il y avait des problèmes avec la mutation de certaines parties, les colonnes suivantes contiennent des informations supplémentaires: + +**latest\_failed\_part** - Le nom de la partie la plus récente qui n'a pas pu être mutée. + +**latest\_fail\_time** - Le temps de la partie la plus récente mutation de l'échec. + +**latest\_fail\_reason** - Le message d'exception qui a provoqué l'échec de la mutation de pièce la plus récente. + +## système.disque {#system_tables-disks} + +Contient des informations sur les disques définis dans [configuration du serveur](table_engines/mergetree.md#table_engine-mergetree-multiple-volumes_configure). + +Colonne: + +- `name` ([Chaîne](../data_types/string.md)) — Name of a disk in the server configuration. +- `path` ([Chaîne](../data_types/string.md)) — Path to the mount point in the file system. +- `free_space` ([UInt64](../data_types/int_uint.md)) — Free space on disk in bytes. +- `total_space` ([UInt64](../data_types/int_uint.md)) — Disk volume in bytes. +- `keep_free_space` ([UInt64](../data_types/int_uint.md)) — Amount of disk space that should stay free on disk in bytes. Defined in the `keep_free_space_bytes` paramètre de configuration du disque. + +## système.storage\_policies {#system_tables-storage_policies} + +Contient des informations sur les stratégies de stockage et les volumes définis [configuration du serveur](table_engines/mergetree.md#table_engine-mergetree-multiple-volumes_configure). + +Colonne: + +- `policy_name` ([Chaîne](../data_types/string.md)) — Name of the storage policy. +- `volume_name` ([Chaîne](../data_types/string.md)) — Volume name defined in the storage policy. +- `volume_priority` ([UInt64](../data_types/int_uint.md)) — Volume order number in the configuration. +- `disks` ([Tableau(String)](../data_types/array.md)) — Disk names, defined in the storage policy. +- `max_data_part_size` ([UInt64](../data_types/int_uint.md)) — Maximum size of a data part that can be stored on volume disks (0 — no limit). +- `move_factor` ([Float64](../data_types/float.md)) — Ratio of free disk space. When the ratio exceeds the value of configuration parameter, ClickHouse start to move data to the next volume in order. + +Si la stratégie de stockage contient plus d'un volume, les informations pour chaque volume sont stockées dans la ligne individuelle de la table. + +[Article Original](https://clickhouse.tech/docs/en/operations/system_tables/) diff --git a/docs/fr/operations/table_engines/aggregatingmergetree.md b/docs/fr/operations/table_engines/aggregatingmergetree.md new file mode 100644 index 00000000000..f0585261d2b --- /dev/null +++ b/docs/fr/operations/table_engines/aggregatingmergetree.md @@ -0,0 +1,99 @@ +--- +machine_translated: true +--- + +# AggregatingMergeTree {#aggregatingmergetree} + +Le moteur hérite de [MergeTree](mergetree.md#table_engines-mergetree), modifier la logique pour les parties de données Fusion. ClickHouse remplace toutes les lignes avec la même clé primaire (ou, plus précisément, avec la même [clé de tri](mergetree.md)) avec une seule ligne (dans un rayon d'une partie des données) qui stocke une combinaison d'états de fonctions d'agrégation. + +Vous pouvez utiliser `AggregatingMergeTree` tables pour l'agrégation incrémentielle des données, y compris pour les vues matérialisées agrégées. + +Le moteur traite toutes les colonnes avec [AggregateFunction](../../data_types/nested_data_structures/aggregatefunction.md) type. + +Il est approprié d'utiliser `AggregatingMergeTree` si elle réduit le nombre de lignes par commande. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = AggregatingMergeTree() +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[TTL expr] +[SETTINGS name=value, ...] +``` + +Pour une description des paramètres de requête, voir [demande de description](../../query_language/create.md). + +**Les clauses de requête** + +Lors de la création d'un `AggregatingMergeTree` la table de la même [clause](mergetree.md) sont nécessaires, comme lors de la création d'un `MergeTree` table. + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets et, si possible, remplacez les anciens projets par la méthode décrite ci-dessus. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] AggregatingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity) +``` + +Tous les paramètres ont la même signification que dans `MergeTree`. +
+ +## Sélectionner et insérer {#select-and-insert} + +Pour insérer des données, utilisez [INSERT SELECT](../../query_language/insert_into.md) requête avec l'ensemble-l'État des fonctions. +Lors de la sélection des données `AggregatingMergeTree` table, utilisez `GROUP BY` et les mêmes fonctions d'agrégat que lors de l'insertion de données, mais en utilisant `-Merge` suffixe. + +Dans les résultats de `SELECT` requête, les valeurs de `AggregateFunction` type ont une représentation binaire spécifique à l'implémentation pour tous les formats de sortie ClickHouse. Si les données de vidage dans, par exemple, `TabSeparated` format avec `SELECT` requête alors ce vidage peut être chargé en utilisant `INSERT` requête. + +## Exemple D'une vue matérialisée agrégée {#example-of-an-aggregated-materialized-view} + +`AggregatingMergeTree` vue matérialisée qui regarde le `test.visits` table: + +``` sql +CREATE MATERIALIZED VIEW test.basic +ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate) +AS SELECT + CounterID, + StartDate, + sumState(Sign) AS Visits, + uniqState(UserID) AS Users +FROM test.visits +GROUP BY CounterID, StartDate; +``` + +Insertion de données dans la `test.visits` table. + +``` sql +INSERT INTO test.visits ... +``` + +Les données sont insérées dans la table et la vue `test.basic` que va effectuer l'agrégation. + +Pour obtenir les données agrégées, nous devons exécuter une requête telle que `SELECT ... GROUP BY ...` à partir de la vue `test.basic`: + +``` sql +SELECT + StartDate, + sumMerge(Visits) AS Visits, + uniqMerge(Users) AS Users +FROM test.basic +GROUP BY StartDate +ORDER BY StartDate; +``` + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/aggregatingmergetree/) diff --git a/docs/fr/operations/table_engines/buffer.md b/docs/fr/operations/table_engines/buffer.md new file mode 100644 index 00000000000..2b7064cfc42 --- /dev/null +++ b/docs/fr/operations/table_engines/buffer.md @@ -0,0 +1,68 @@ +--- +machine_translated: true +--- + +# Tampon {#buffer} + +Met en mémoire tampon les données à écrire dans la RAM, les vidant périodiquement dans une autre table. Pendant l'opération de lecture, les données sont lues à partir de la mémoire tampon, et l'autre simultanément. + +``` sql +Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes) +``` + +Les paramètres du moteur: + +- `database` – Database name. Instead of the database name, you can use a constant expression that returns a string. +- `table` – Table to flush data to. +- `num_layers` – Parallelism layer. Physically, the table will be represented as `num_layers` indépendant de tampons. Valeur recommandée: 16. +- `min_time`, `max_time`, `min_rows`, `max_rows`, `min_bytes`, et `max_bytes` – Conditions for flushing data from the buffer. + +Les données sont vidées du tampon et écrites dans la table de destination si toutes les `min*` conditions ou au moins un `max*` conditions sont remplies. + +- `min_time`, `max_time` – Condition for the time in seconds from the moment of the first write to the buffer. +- `min_rows`, `max_rows` – Condition for the number of rows in the buffer. +- `min_bytes`, `max_bytes` – Condition for the number of bytes in the buffer. + +Pendant l'opération d'écriture, les données sont insérées dans un `num_layers` nombre aléatoire de tampons. Ou, si la partie de données à insérer est suffisamment grande (supérieure à `max_rows` ou `max_bytes`), il est écrit directement dans la table de destination, en omettant le tampon. + +Les conditions de purger les données sont calculées séparément pour chacun des `num_layers` tampon. Par exemple, si `num_layers = 16` et `max_bytes = 100000000`, la consommation maximale de RAM est de 1,6 Go. + +Exemple: + +``` sql +CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10, 100, 10000, 1000000, 10000000, 100000000) +``` + +La création d'un ‘merge.hits\_buffer’ table avec la même structure que ‘merge.hits’ et en utilisant le moteur tampon. Lors de l'écriture dans cette table, les données sont mises en mémoire tampon dans la RAM ‘merge.hits’ table. 16 tampons sont créés. Les données dans chacun d'entre eux est rincé si 100 secondes sont écoulées, ou un million de lignes ont été écrites, ou 100 MO de données ont été écrits; ou si, simultanément, 10 secondes et 10 000 lignes et 10 MO de données ont été écrites. Par exemple, si une ligne a été écrite, après 100 secondes, il sera vidé, n'importe quoi. Mais si plusieurs lignes ont été écrites, les données seront vidées plus tôt. + +Lorsque le serveur est arrêté, avec DROP TABLE ou DETACH TABLE, les données du tampon sont également vidées vers la table de destination. + +Vous pouvez définir des chaînes vides entre guillemets simples pour le nom de la base de données et de la table. Cela indique l'absence d'une table de destination. Dans ce cas, lorsque les conditions de vidage des données sont atteintes, le tampon est simplement effacé. Cela peut être utile pour garder une fenêtre de données dans la mémoire. + +Lors de la lecture à partir d'une table tampon, les données sont traitées à la fois à partir du tampon et de la table de destination (s'il y en a une). +Notez que les tables de tampon ne prennent pas en charge un index. En d'autres termes, les données dans le tampon sont entièrement analysées, ce qui peut être lent pour les grands tampons. (Pour les données dans une table subordonnée, l'index qu'il prend en charge sera utilisé.) + +Si l'ensemble de colonnes de la table tampon ne correspond pas à l'ensemble de colonnes d'une table subordonnée, un sous-ensemble de colonnes existant dans les deux tables est inséré. + +Si les types ne correspondent pas à l'une des colonnes de la table tampon et à une table subordonnée, un message d'erreur est entré dans le journal du serveur et le tampon est effacé. +La même chose se produit si la table subordonnée n'existe pas lorsque le tampon est vidé. + +Si vous devez exécuter ALTER pour une table subordonnée et la table tampon, nous vous recommandons de supprimer d'abord la table tampon, d'exécuter ALTER pour la table subordonnée, puis de créer à nouveau la table tampon. + +Si le serveur est redémarré anormalement, les données dans le tampon sont perdues. + +FINAL et SAMPLE ne fonctionnent pas correctement pour les tables tampon. Ces conditions sont transmises à la table de destination, mais ne sont pas utilisées pour traiter les données dans le tampon. Si ces fonctionnalités sont nécessaires, nous vous recommandons d'utiliser uniquement la table tampon pour l'écriture, lors de la lecture à partir de la table de destination. + +Lors de l'ajout de données à un Tampon, un des tampons est verrouillé. Cela entraîne des retards si une opération de lecture est effectuée simultanément à partir de la table. + +Les données insérées dans une table tampon peuvent se retrouver dans la table subordonnée dans un ordre différent et dans des blocs différents. Pour cette raison, une table tampon est difficile à utiliser pour écrire correctement dans un CollapsingMergeTree. Pour éviter les problèmes, vous pouvez définir ‘num\_layers’ 1. + +Si la table de destination est répliquée, certaines caractéristiques attendues des tables répliquées sont perdues lors de l'écriture dans une table tampon. Les modifications aléatoires apportées à l'ordre des lignes et des tailles des parties de données provoquent l'arrêt de la déduplication des données, ce qui signifie qu'il n'est pas possible d'avoir un ‘exactly once’ Ecrire dans des tables répliquées. + +En raison de ces inconvénients, nous ne pouvons recommander l'utilisation d'une table tampon que dans de rares cas. + +Une table tampon est utilisée lorsque trop D'insertions sont reçues d'un grand nombre de serveurs sur une unité de temps et que les données ne peuvent pas être mises en mémoire tampon avant l'insertion, ce qui signifie que les insertions ne peuvent pas s'exécuter assez rapidement. + +Notez qu'il n'est pas judicieux d'insérer des données d'une ligne de temps, même pour Tampon tables. Cela ne produira qu'une vitesse de quelques milliers de lignes par seconde, tandis que l'insertion de blocs de données plus grands peut produire plus d'un million de lignes par seconde (voir la section “Performance”). + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/buffer/) diff --git a/docs/fr/operations/table_engines/collapsingmergetree.md b/docs/fr/operations/table_engines/collapsingmergetree.md new file mode 100644 index 00000000000..9c769b4a156 --- /dev/null +++ b/docs/fr/operations/table_engines/collapsingmergetree.md @@ -0,0 +1,306 @@ +--- +machine_translated: true +--- + +# CollapsingMergeTree {#table_engine-collapsingmergetree} + +Le moteur hérite de [MergeTree](mergetree.md) et ajoute la logique de l'effondrement des lignes de données de pièces algorithme de fusion. + +`CollapsingMergeTree` supprime de manière asynchrone (réduit) les paires de lignes si tous les champs d'une clé de tri (`ORDER BY`) sont équivalents à l'exception du champ particulier `Sign` ce qui peut avoir `1` et `-1` valeur. Les lignes sans paire sont conservées. Pour plus de détails, voir le [Effondrer](#table_engine-collapsingmergetree-collapsing) la section du document. + +Le moteur peut réduire considérablement le volume de stockage et augmenter l'efficacité de `SELECT` requête en conséquence. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = CollapsingMergeTree(sign) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +Pour une description des paramètres de requête, voir [description de la requête](../../query_language/create.md). + +**Paramètres CollapsingMergeTree** + +- `sign` — Name of the column with the type of row: `1` est un “state” rangée, `-1` est un “cancel” rangée. + + Column data type — `Int8`. + +**Les clauses de requête** + +Lors de la création d'un `CollapsingMergeTree` de table, de la même [les clauses de requête](mergetree.md#table_engine-mergetree-creating-a-table) sont nécessaires, comme lors de la création d'un `MergeTree` table. + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets et, si possible, remplacez les anciens projets par la méthode décrite ci-dessus. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] CollapsingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, sign) +``` + +Tous les paramètres excepté `sign` ont la même signification que dans `MergeTree`. + +- `sign` — Name of the column with the type of row: `1` — “state” rangée, `-1` — “cancel” rangée. + + Column Data Type — `Int8`. + +
+ +## Effondrer {#table_engine-collapsingmergetree-collapsing} + +### Données {#data} + +Considérez la situation où vous devez enregistrer des données en constante évolution pour un objet. Il semble logique d'avoir une ligne pour un objet et de la mettre à jour à tout changement, mais l'opération de mise à jour est coûteuse et lente pour le SGBD car elle nécessite une réécriture des données dans le stockage. Si vous avez besoin d'écrire des données rapidement, la mise à jour n'est pas acceptable, mais vous pouvez écrire les modifications d'un objet de manière séquentielle comme suit. + +Utilisez la colonne particulière `Sign`. Si `Sign = 1` cela signifie que la ligne est un état d'un objet, appelons-la “state” rangée. Si `Sign = -1` il signifie l'annulation de l'état d'un objet avec les mêmes attributs, nous allons l'appeler “cancel” rangée. + +Par exemple, nous voulons calculer combien de pages les utilisateurs ont vérifié sur un site et combien de temps ils étaient là. À un certain moment nous écrire la ligne suivante avec l'état de l'activité de l'utilisateur: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +À un moment donné, nous enregistrons le changement d'activité de l'utilisateur et l'écrivons avec les deux lignes suivantes. + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +La première ligne annule le précédent état de l'objet (utilisateur). Il doit copier les champs de clé de tri de l'état annulé sauf `Sign`. + +La deuxième ligne contient l'état actuel. + +Comme nous avons besoin seulement le dernier état de l'activité de l'utilisateur, les lignes + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +peut être supprimé en réduisant l'état invalide (ancien) d'un objet. `CollapsingMergeTree` fait cela lors de la fusion des parties de données. + +Pourquoi nous avons besoin de 2 lignes pour chaque changement lu dans le [Algorithme](#table_engine-collapsingmergetree-collapsing-algorithm) paragraphe. + +**Propriétés particulières d'une telle approche** + +1. Le programme qui écrit les données doit se souvenir de l'état d'un objet pour pouvoir l'annuler. “Cancel” string doit contenir des copies des champs de clé de tri du “state” chaîne et le contraire `Sign`. Il augmente la taille initiale de stockage, mais permet d'écrire les données rapidement. +2. Les tableaux de plus en plus longs dans les colonnes réduisent l'efficacité du moteur en raison de la charge pour l'écriture. Plus les données sont simples, plus l'efficacité est élevée. +3. Le `SELECT` les résultats dépendent fortement de la cohérence de l'historique des modifications d'objet. Être précis lors de la préparation des données pour l'insertion. Vous pouvez obtenir des résultats imprévisibles dans des données incohérentes, par exemple des valeurs négatives pour des mesures non négatives telles que la profondeur de session. + +### Algorithme {#table_engine-collapsingmergetree-collapsing-algorithm} + +Lorsque ClickHouse fusionne des parties de données, chaque groupe de lignes consécutives avec la même clé de tri (`ORDER BY`) est réduit à pas plus de deux rangées, une avec `Sign = 1` (“state” ligne) et l'autre avec `Sign = -1` (“cancel” rangée). En d'autres termes, les entrées de l'effondrement. + +Pour chaque partie de données résultante clickhouse enregistre: + +1. Première “cancel” et la dernière “state” lignes, si le nombre de “state” et “cancel” lignes correspond et la dernière ligne est un “state” rangée. + +2. La dernière “state” ligne, si il y a plus de “state” les lignes de “cancel” rangée. + +3. Première “cancel” ligne, si il y a plus de “cancel” les lignes de “state” rangée. + +4. Aucune des lignes, dans tous les autres cas. + +Aussi quand il y a au moins 2 plus “state” les lignes de “cancel” les lignes, ou au moins 2 de plus “cancel” rangs puis “state” la fusion continue, mais ClickHouse traite cette situation comme une erreur logique et l'enregistre dans le journal du serveur. Cette erreur peut se produire si les mêmes données ont été insérées plus d'une fois. + +Ainsi, l'effondrement ne devrait pas changer les résultats du calcul des statistiques. +Les changements se sont progressivement effondrés de sorte qu'à la fin seul le dernier état de presque tous les objets à gauche. + +Le `Sign` est nécessaire car l'algorithme de fusion ne garantit pas que toutes les lignes avec la même clé de tri seront dans la même partie de données résultante et même sur le même serveur physique. Processus de ClickHouse `SELECT` les requêtes avec plusieurs threads, et il ne peut pas prédire l'ordre des lignes dans le résultat. L'agrégation est nécessaire s'il y a un besoin d'obtenir complètement “collapsed” les données de `CollapsingMergeTree` table. + +Pour finaliser la réduction, écrivez une requête avec `GROUP BY` fonctions de clause et d'agrégation qui tiennent compte du signe. Par exemple, pour calculer la quantité, l'utilisation `sum(Sign)` plutôt `count()`. Pour calculer la somme de quelque chose, utilisez `sum(Sign * x)` plutôt `sum(x)` et ainsi de suite , et également ajouter `HAVING sum(Sign) > 0`. + +Aggregate `count`, `sum` et `avg` pourrait être calculée de cette manière. Aggregate `uniq` peut être calculé si un objet a au moins un état non réduit. Aggregate `min` et `max` impossible de calculer parce que `CollapsingMergeTree` n'enregistre pas l'historique des valeurs des États réduits. + +Si vous avez besoin d'extraire des données sans agrégation (par exemple, pour vérifier si des lignes sont présentes dont les valeurs les plus récentes correspondent à certaines conditions), vous pouvez utiliser `FINAL` le modificateur du `FROM` clause. Cette approche est nettement moins efficace. + +## Exemple d'utilisation {#example-of-use} + +Les données de l'exemple: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +Création de la table: + +``` sql +CREATE TABLE UAct +( + UserID UInt64, + PageViews UInt8, + Duration UInt8, + Sign Int8 +) +ENGINE = CollapsingMergeTree(Sign) +ORDER BY UserID +``` + +Insertion des données: + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, 1) +``` + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, -1),(4324182021466249494, 6, 185, 1) +``` + +Nous utilisons deux `INSERT` requêtes pour créer deux parties de données différentes. Si nous insérons les données avec une requête, ClickHouse crée une partie de données et n'effectuera aucune fusion. + +L'obtention de données: + +``` sql +SELECT * FROM UAct +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +Que voyons-nous et où s'effondre? + +Avec deux `INSERT` requêtes, nous avons créé 2 parties de données. Le `SELECT` la requête a été effectuée dans 2 threads, et nous avons obtenu un ordre aléatoire de lignes. L'effondrement n'a pas eu lieu car il n'y avait pas encore de fusion des parties de données. ClickHouse fusionne une partie des données dans un moment inconnu que nous ne pouvons pas prédire. + +Nous avons donc besoin d'agrégation: + +``` sql +SELECT + UserID, + sum(PageViews * Sign) AS PageViews, + sum(Duration * Sign) AS Duration +FROM UAct +GROUP BY UserID +HAVING sum(Sign) > 0 +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┐ +│ 4324182021466249494 │ 6 │ 185 │ +└─────────────────────┴───────────┴──────────┘ +``` + +Si nous n'avons pas besoin d'agrégation et de vouloir forcer l'effondrement, nous pouvons utiliser `FINAL` le modificateur `FROM` clause. + +``` sql +SELECT * FROM UAct FINAL +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +Cette façon de sélectionner les données est très inefficace. Ne l'utilisez pas pour les grandes tables. + +## Exemple d'une autre approche {#example-of-another-approach} + +Les données de l'exemple: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +│ 4324182021466249494 │ -5 │ -146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +L'idée est que les fusions ne prennent en compte que les champs clés. Et dans le “Cancel” ligne nous pouvons spécifier des valeurs négatives qui égalisent la version précédente de la ligne lors de la sommation sans utiliser la colonne de signe. Pour cette approche, il est nécessaire de changer le type de données `PageViews`,`Duration` pour stocker les valeurs négatives de UInt8 - \> Int16. + +``` sql +CREATE TABLE UAct +( + UserID UInt64, + PageViews Int16, + Duration Int16, + Sign Int8 +) +ENGINE = CollapsingMergeTree(Sign) +ORDER BY UserID +``` + +Nous allons tester l'approche: + +``` sql +insert into UAct values(4324182021466249494, 5, 146, 1); +insert into UAct values(4324182021466249494, -5, -146, -1); +insert into UAct values(4324182021466249494, 6, 185, 1); + +select * from UAct final; // avoid using final in production (just for a test or small tables) +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +``` sql +SELECT + UserID, + sum(PageViews) AS PageViews, + sum(Duration) AS Duration +FROM UAct +GROUP BY UserID +```text +┌──────────────UserID─┬─PageViews─┬─Duration─┐ +│ 4324182021466249494 │ 6 │ 185 │ +└─────────────────────┴───────────┴──────────┘ +``` + +``` sqk +select count() FROM UAct +``` + +``` text +┌─count()─┐ +│ 3 │ +└─────────┘ +``` + +``` sql +optimize table UAct final; + +select * FROM UAct +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/collapsingmergetree/) diff --git a/docs/fr/operations/table_engines/custom_partitioning_key.md b/docs/fr/operations/table_engines/custom_partitioning_key.md new file mode 100644 index 00000000000..cd850f3595c --- /dev/null +++ b/docs/fr/operations/table_engines/custom_partitioning_key.md @@ -0,0 +1,124 @@ +--- +machine_translated: true +--- + +# Clé De Partitionnement Personnalisée {#custom-partitioning-key} + +Le partitionnement est disponible pour [MergeTree](mergetree.md) table de famille (y compris les [répliqué](replication.md) table). [Les vues matérialisées](materializedview.md) basé sur les tables MergeTree prennent également en charge le partitionnement. + +Une partition est une combinaison logique d'enregistrements dans une table selon un critère spécifié. Vous pouvez définir une partition par un critère arbitraire, comme, par mois, par jour, ou par type d'événement. Chaque partition est stockée séparément pour simplifier les manipulations de ces données. Lors de l'accès aux données, ClickHouse utilise le plus petit sous-ensemble de partitions possible. + +La partition est spécifiée dans le `PARTITION BY expr` clause lors de [création d'une table](mergetree.md#table_engine-mergetree-creating-a-table). La clé de partition peut être n'importe quelle expression des colonnes de la table. Par exemple, pour spécifier le partitionnement par mois, utilisez l'expression `toYYYYMM(date_column)`: + +``` sql +CREATE TABLE visits +( + VisitDate Date, + Hour UInt8, + ClientID UUID +) +ENGINE = MergeTree() +PARTITION BY toYYYYMM(VisitDate) +ORDER BY Hour; +``` + +La clé de partition peut également être un tuple d'expressions (similaire à la [clé primaire](mergetree.md#primary-keys-and-indexes-in-queries)). Exemple: + +``` sql +ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/name', 'replica1', Sign) +PARTITION BY (toMonday(StartDate), EventType) +ORDER BY (CounterID, StartDate, intHash32(UserID)); +``` + +Dans cet exemple, nous définissons le partitionnement par les types d'événements qui se sont produits au cours de la semaine en cours. + +Lors de l'insertion de nouvelles données dans une table, ces données sont stockées en tant que partie séparée (bloc) triée par la clé primaire. Dans 10-15 minutes après l'insertion, les parties de la même partition sont fusionnées dans la partie entière. + +!!! info "Info" + Une fusion ne fonctionne que pour les parties de données qui ont la même valeur pour l'expression de partitionnement. Cela signifie **vous ne devriez pas faire des partitions trop granulaires** (plus d'un millier de partitions). Sinon, l' `SELECT` la requête fonctionne mal en raison d'un nombre déraisonnablement élevé de fichiers dans le système de fichiers et des descripteurs de fichiers ouverts. + +L'utilisation de la [système.partie](../system_tables.md#system_tables-parts) table pour afficher les parties et les partitions de la table. Par exemple, supposons que nous avons une `visits` table avec partitionnement par mois. Nous allons effectuer le `SELECT` la requête pour l' `system.parts` table: + +``` sql +SELECT + partition, + name, + active +FROM system.parts +WHERE table = 'visits' +``` + +``` text +┌─partition─┬─name───────────┬─active─┐ +│ 201901 │ 201901_1_3_1 │ 0 │ +│ 201901 │ 201901_1_9_2 │ 1 │ +│ 201901 │ 201901_8_8_0 │ 0 │ +│ 201901 │ 201901_9_9_0 │ 0 │ +│ 201902 │ 201902_4_6_1 │ 1 │ +│ 201902 │ 201902_10_10_0 │ 1 │ +│ 201902 │ 201902_11_11_0 │ 1 │ +└───────────┴────────────────┴────────┘ +``` + +Le `partition` colonne contient les noms des partitions. Il y a deux partitions dans cet exemple: `201901` et `201902`. Vous pouvez utiliser cette valeur de colonne pour spécifier le nom de [ALTER … PARTITION](#alter_manipulations-with-partitions) requête. + +Le `name` colonne contient les noms des parties de données de partition. Vous pouvez utiliser cette colonne pour spécifier le nom de la partie dans la [ALTER ATTACH PART](#alter_attach-partition) requête. + +Décomposons le nom de la première partie: `201901_1_3_1`: + +- `201901` est le nom de la partition. +- `1` est le nombre minimum du bloc de données. +- `3` est le nombre maximal de blocs de données. +- `1` est le niveau de bloc (la profondeur de l'arbre de fusion à partir duquel il est formé). + +!!! info "Info" + Les parties des tables de type ancien ont le nom: `20190117_20190123_2_2_0` (date minimale - date maximale - numéro de bloc minimum - numéro de bloc maximum-niveau). + +Le `active` colonne indique le statut de la partie. `1` est active; `0` est inactif. Les parties inactives sont, par exemple, des parties source restant après la fusion à une partie plus grande. Les parties de données corrompues sont également indiquées comme inactives. + +Comme vous pouvez le voir dans l'exemple, il y a plusieurs parties séparées de la même partition (par exemple, `201901_1_3_1` et `201901_1_9_2`). Cela signifie que ces parties ne sont pas encore fusionnées. Clickhouse fusionne les parties insérées des données périodiquement, environ 15 minutes après l'insertion. En outre, vous pouvez effectuer une fusion non planifiée en utilisant [OPTIMIZE](../../query_language/misc.md#misc_operations-optimize) requête. Exemple: + +``` sql +OPTIMIZE TABLE visits PARTITION 201902; +``` + +``` text +┌─partition─┬─name───────────┬─active─┐ +│ 201901 │ 201901_1_3_1 │ 0 │ +│ 201901 │ 201901_1_9_2 │ 1 │ +│ 201901 │ 201901_8_8_0 │ 0 │ +│ 201901 │ 201901_9_9_0 │ 0 │ +│ 201902 │ 201902_4_6_1 │ 0 │ +│ 201902 │ 201902_4_11_2 │ 1 │ +│ 201902 │ 201902_10_10_0 │ 0 │ +│ 201902 │ 201902_11_11_0 │ 0 │ +└───────────┴────────────────┴────────┘ +``` + +Les parties inactives seront supprimées environ 10 minutes après la fusion. + +Une autre façon d'afficher un ensemble de pièces et de partitions est d'aller dans le répertoire de la table: `/var/lib/clickhouse/data///`. Exemple: + +``` bash +/var/lib/clickhouse/data/default/visits$ ls -l +total 40 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 1 16:48 201901_1_3_1 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201901_1_9_2 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 15:52 201901_8_8_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 15:52 201901_9_9_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201902_10_10_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201902_11_11_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:19 201902_4_11_2 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 12:09 201902_4_6_1 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 1 16:48 detached +``` + +Dossier ‘201901\_1\_1\_0’, ‘201901\_1\_7\_1’ et ainsi de suite sont les répertoires des parties. Chaque partie se rapporte à une partition correspondante et contient des données juste pour un certain mois (la table dans cet exemple a partitionnement par mois). + +Le `detached` le répertoire contient des parties qui ont été détachées de la table à l'aide [DETACH](#alter_detach-partition) requête. Les parties corrompues sont également déplacées dans ce répertoire, au lieu d'être supprimées. Le serveur n'utilise pas les pièces de la `detached` directory. You can add, delete, or modify the data in this directory at any time – the server will not know about this until you run the [ATTACH](../../query_language/alter.md#alter_attach-partition) requête. + +Notez que sur le serveur d'exploitation, vous ne pouvez pas modifier manuellement l'ensemble de pièces ou leurs données sur le système de fichiers, car le serveur ne le saura pas. Pour les tables non répliquées, vous pouvez le faire lorsque le serveur est arrêté, mais ce n'est pas recommandé. Pour les tables répliquées, l'ensemble de pièces ne peut en aucun cas être modifié. + +ClickHouse vous permet d'effectuer des opérations avec les partitions: les supprimer, copier d'une table à une autre, ou créer une sauvegarde. Voir la liste de toutes les opérations de la section [Manipulations avec des Partitions et des pièces](../../query_language/alter.md#alter_manipulations-with-partitions). + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/custom_partitioning_key/) diff --git a/docs/fr/operations/table_engines/dictionary.md b/docs/fr/operations/table_engines/dictionary.md new file mode 100644 index 00000000000..6a517449863 --- /dev/null +++ b/docs/fr/operations/table_engines/dictionary.md @@ -0,0 +1,94 @@ +--- +machine_translated: true +--- + +# Dictionnaire {#dictionary} + +Le `Dictionary` le moteur affiche le [dictionnaire](../../query_language/dicts/external_dicts.md) données comme une table ClickHouse. + +À titre d'exemple, considérons un dictionnaire de `products` avec la configuration suivante: + +``` xml + + + products + + +
products
+ DSN=some-db-server + + + + 300 + 360 + + + + + + + product_id + + + title + String + + + + + +``` + +Interroger les données du dictionnaire: + +``` sql +SELECT + name, + type, + key, + attribute.names, + attribute.types, + bytes_allocated, + element_count, + source +FROM system.dictionaries +WHERE name = 'products' +``` + +``` text +┌─name─────┬─type─┬─key────┬─attribute.names─┬─attribute.types─┬─bytes_allocated─┬─element_count─┬─source──────────┐ +│ products │ Flat │ UInt64 │ ['title'] │ ['String'] │ 23065376 │ 175032 │ ODBC: .products │ +└──────────┴──────┴────────┴─────────────────┴─────────────────┴─────────────────┴───────────────┴─────────────────┘ +``` + +Vous pouvez utiliser l' [dictGet\*](../../query_language/functions/ext_dict_functions.md#ext_dict_functions) fonction pour obtenir les données du dictionnaire dans ce format. + +Cette vue n'est pas utile lorsque vous avez besoin d'obtenir des données brutes ou `JOIN` opération. Pour ces cas, vous pouvez utiliser le `Dictionary` moteur, qui affiche les données du dictionnaire dans une table. + +Syntaxe: + +``` sql +CREATE TABLE %table_name% (%fields%) engine = Dictionary(%dictionary_name%)` +``` + +Exemple d'utilisation: + +``` sql +create table products (product_id UInt64, title String) Engine = Dictionary(products); +``` + + Ok + +Jetez un oeil à ce qui est dans le tableau. + +``` sql +select * from products limit 1; +``` + +``` text +┌────product_id─┬─title───────────┐ +│ 152689 │ Some item │ +└───────────────┴─────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/dictionary/) diff --git a/docs/fr/operations/table_engines/distributed.md b/docs/fr/operations/table_engines/distributed.md new file mode 100644 index 00000000000..60eecc8481b --- /dev/null +++ b/docs/fr/operations/table_engines/distributed.md @@ -0,0 +1,151 @@ +--- +machine_translated: true +--- + +# Distribué {#distributed} + +**Les Tables avec moteur distribué ne stockent aucune donnée par elles mêmes**, mais autoriser le traitement des requêtes distribuées sur plusieurs serveurs. +La lecture est automatiquement parallélisée. Lors d'une lecture, les index de table sur les serveurs distants sont utilisés, s'il y en a. + +Le moteur distribué accepte les paramètres: + +- le nom du cluster dans le fichier de configuration du serveur + +- le nom d'une base de données distante + +- le nom d'une table distante + +- (en option) sharding clé + +- (éventuellement) nom de la stratégie, il sera utilisé pour stocker des fichiers temporaires pour l'envoi asynchrone + + Voir aussi: + + - `insert_distributed_sync` paramètre + - [MergeTree](mergetree.md#table_engine-mergetree-multiple-volumes) pour les exemples + +Exemple: + +``` sql +Distributed(logs, default, hits[, sharding_key[, policy_name]]) +``` + +Les données seront lues à partir de tous les serveurs ‘logs’ cluster, à partir de la valeur par défaut.hits table située sur chaque serveur du cluster. +Les données ne sont pas seulement lues mais sont partiellement traitées sur les serveurs distants (dans la mesure du possible). +Par exemple, pour une requête avec GROUP BY, les données seront agrégées sur des serveurs distants et les états intermédiaires des fonctions d'agrégation seront envoyés au serveur demandeur. Ensuite, les données seront plus agrégées. + +Au lieu du nom de la base de données, vous pouvez utiliser une expression constante qui renvoie une chaîne. Par exemple: currentDatabase(). + +logs – The cluster name in the server's config file. + +Les Clusters sont définis comme ceci: + +``` xml + + + + + 1 + + false + + example01-01-1 + 9000 + + + example01-01-2 + 9000 + + + + 2 + false + + example01-02-1 + 9000 + + + example01-02-2 + 1 + 9440 + + + + +``` + +Ici un cluster est défini avec le nom ‘logs’ qui se compose de deux fragments, dont chacune contient deux répliques. +Les partitions se réfèrent aux serveurs qui contiennent différentes parties des données (pour lire toutes les données, vous devez accéder à tous les partitions). +Les répliques sont des serveurs de duplication (afin de lire toutes les données, vous pouvez accéder aux données sur l'une des répliques). + +Les noms de Cluster ne doivent pas contenir de points. + +Paramètre `host`, `port` et , éventuellement, `user`, `password`, `secure`, `compression` sont spécifiés pour chaque serveur: +- `host` – The address of the remote server. You can use either the domain or the IPv4 or IPv6 address. If you specify the domain, the server makes a DNS request when it starts, and the result is stored as long as the server is running. If the DNS request fails, the server doesn't start. If you change the DNS record, restart the server. +- `port` – The TCP port for messenger activity (‘tcp\_port’ dans la configuration, généralement définie sur 9000). Ne le confondez pas avec http\_port. +- `user` – Name of the user for connecting to a remote server. Default value: default. This user must have access to connect to the specified server. Access is configured in the users.xml file. For more information, see the section [Les droits d'accès](../../operations/access_rights.md). +- `password` – The password for connecting to a remote server (not masked). Default value: empty string. +- `secure` - Utilisez ssl pour la connexion, généralement vous devez également définir `port` = 9440. Le serveur doit écouter 9440 et avoir des certificats corrects. +- `compression` - Utiliser la compression de données. Valeur par défaut: true. + +When specifying replicas, one of the available replicas will be selected for each of the shards when reading. You can configure the algorithm for load balancing (the preference for which replica to access) – see the [équilibrage](../settings/settings.md#settings-load_balancing) paramètre. +Si la connexion avec le serveur n'est pas établie, il y aura une tentative de connexion avec un court délai. Si la connexion échoue, la réplique suivante sera sélectionnée, et ainsi de suite pour toutes les répliques. Si la tentative de connexion a échoué pour toutes les répliques, la tentative sera répété de la même façon, plusieurs fois. +Cela fonctionne en faveur de la résilience, mais ne fournit pas de tolérance aux pannes complète: un serveur distant peut accepter la connexion, mais peut ne pas fonctionner ou fonctionner mal. + +Vous pouvez spécifier un seul des fragments (dans ce cas, le traitement de la requête doit être appelé distant, plutôt que distribué) ou jusqu'à un nombre quelconque de fragments. Dans chaque fragment, vous pouvez spécifier un nombre de répliques. Vous pouvez spécifier un nombre différent de répliques pour chaque fragment. + +Vous pouvez spécifier autant de clusters que vous souhaitez dans la configuration. + +Pour afficher vos clusters, utilisez ‘system.clusters’ table. + +Le moteur distribué permet de travailler avec un cluster comme un serveur local. Cependant, le cluster est inextensible: vous devez écrire sa configuration dans le fichier de configuration du serveur (encore mieux, pour tous les serveurs du cluster). + +Il n'y a pas de support pour les tables distribuées qui regardent d'autres tables distribuées (sauf dans les cas où une table distribuée n'a qu'un seul fragment). Comme alternative, faites en sorte que la table distribuée regarde le “final” table. + +The Distributed engine requires writing clusters to the config file. Clusters from the config file are updated on the fly, without restarting the server. If you need to send a query to an unknown set of shards and replicas each time, you don't need to create a Distributed table – use the ‘remote’ fonction de table à la place. Voir la section [Les fonctions de Table](../../query_language/table_functions/index.md). + +Il existe deux méthodes pour écrire des données dans un cluster: + +Tout d'abord, vous pouvez définir les serveurs d'écrire les données à et effectuer l'écriture directement sur chaque fragment. En d'autres termes, effectuez INSERT dans les tables que la table distribuée “looks at”. C'est la solution la plus flexible car vous pouvez utiliser n'importe quel schéma de sharding, qui pourrait être non trivial en raison des exigences du sujet. C'est également la solution la plus optimale puisque les données peuvent être écrites sur différents fragments de manière complètement indépendante. + +Deuxièmement, vous pouvez effectuer INSERT dans une table distribuée. Dans ce cas, la table distribuera les données insérées sur les serveurs eux-mêmes. Pour écrire dans une table distribuée, elle doit avoir un jeu de clés de sharding (le dernier paramètre). De plus, s'il n'y a qu'un seul fragment, l'opération d'écriture fonctionne sans spécifier la clé de sharding, car cela ne signifie rien dans ce cas. + +Chaque fragment peut avoir un poids défini dans le fichier de configuration. Par défaut, le poids est égal à un. Les données sont réparties entre les fragments dans la quantité proportionnelle au poids des fragments. Par exemple, si il y a deux tessons et le premier a un poids de 9 tandis que la seconde a un poids de 10, le premier sera envoyé 9 / 19 parties de lignes, et le second sera envoyé 10 / 19. + +Chaque fragment peut avoir le ‘internal\_replication’ paramètre défini dans le fichier de configuration. + +Si ce paramètre est défini à ‘true’, l'opération d'écriture sélectionne le premier saine réplique et écrit les données. Utilisez cette option si le tableau Distribué “looks at” tables répliquées. En d'autres termes, si la table où les données seront écrites va répliquer elle-même. + +Si elle est définie sur ‘false’ (par défaut), les données sont écrites dans toutes les répliques. En substance, cela signifie que la table distribuée réplique les données elle-même. C'est pire que d'utiliser des tables répliquées, car la cohérence des répliques n'est pas vérifiée et, au fil du temps, elles contiendront des données légèrement différentes. + +Pour sélectionner le fragment auquel une ligne de données est envoyée, l'expression de sharding est analysée et son reste est extrait de la diviser par le poids total des fragments. La ligne est envoyée au fragment qui correspond au demi-intervalle des restes de ‘prev\_weight’ de ‘prev\_weights + weight’, où ‘prev\_weights’ c'est le poids total des tessons avec le plus petit nombre, et ‘weight’ est le poids de cet éclat. Par exemple, s'il y a deux fragments, et que le premier a un poids de 9 tandis que le second a un poids de 10, la ligne sera envoyée au premier fragment pour les restes de la plage \[0, 9), et au second pour les restes de la plage \[9, 19). + +L'expression de sharding peut être n'importe quelle expression de constantes et de colonnes de table qui renvoie un entier. Par exemple, vous pouvez utiliser l'expression ‘rand()’ pour la distribution aléatoire des données, ou ‘UserID’ pour la distribution par le reste de la division de L'ID de l'utilisateur (alors les données d'un seul utilisateur résideront sur un seul fragment, ce qui simplifie l'exécution et la jointure par les utilisateurs). Si l'une des colonnes n'est pas assez répartie uniformément, vous pouvez l'envelopper dans une fonction de hachage: intHash64 (UserID). + +Un simple rappel de la division est une solution limitée pour le sharding et n'est pas toujours approprié. Cela fonctionne pour des volumes de données moyens et importants (des dizaines de serveurs), mais pas pour des volumes de données très importants (des centaines de serveurs ou plus). Dans ce dernier cas, utilisez le schéma de répartition requis par le domaine, plutôt que d'utiliser des entrées dans des tableaux distribués. + +SELECT queries are sent to all the shards and work regardless of how data is distributed across the shards (they can be distributed completely randomly). When you add a new shard, you don't have to transfer the old data to it. You can write new data with a heavier weight – the data will be distributed slightly unevenly, but queries will work correctly and efficiently. + +Vous devriez être préoccupé par le système de sharding dans les cas suivants: + +- Les requêtes sont utilisées qui nécessitent des données de jointure (IN ou JOIN) par une clé spécifique. Si les données sont partagées par cette clé, vous pouvez utiliser local in ou JOIN au lieu de GLOBAL IN ou global JOIN, ce qui est beaucoup plus efficace. +- Un grand nombre de serveurs est utilisé (des centaines ou plus) avec un grand nombre de petites requêtes (requêtes de clients individuels - sites Web, annonceurs ou partenaires). Pour que les petites requêtes n'affectent pas l'ensemble du cluster, il est logique de localiser les données d'un seul client sur un seul fragment. Alternativement, comme nous l'avons fait dans Yandex.Metrica, vous pouvez configurer le sharding à deux niveaux: divisez le cluster entier en “layers”, où une couche peut être constituée de plusieurs éclats. Les données d'un seul client sont situées sur une seule couche, mais des fragments peuvent être ajoutés à une couche si nécessaire, et les données sont distribuées aléatoirement à l'intérieur de celles-ci. Des tables distribuées sont créées pour chaque couche et une seule table distribuée partagée est créée pour les requêtes globales. + +Les données sont écrites de manière asynchrone. Lorsqu'il est inséré dans la table, le bloc de données est simplement écrit dans le système de fichiers local. Les données sont envoyées aux serveurs distants en arrière-plan dès que possible. La période d'envoi des données est gérée par [distributed\_directory\_monitor\_sleep\_time\_ms](../settings/settings.md#distributed_directory_monitor_sleep_time_ms) et [distributed\_directory\_monitor\_max\_sleep\_time\_ms](../settings/settings.md#distributed_directory_monitor_max_sleep_time_ms) paramètre. Le `Distributed` moteur envoie chaque fichier de données insérées séparément, mais vous pouvez activer le lot envoi de fichiers avec l' [distributed\_directory\_monitor\_batch\_inserts](../settings/settings.md#distributed_directory_monitor_batch_inserts) paramètre. Ce paramètre améliore les performances du cluster en utilisant mieux les ressources réseau et serveur local. Vous devriez vérifier si les données sont envoyées avec succès en vérifiant la liste des fichiers (données en attente d'envoi) dans le répertoire de la table: `/var/lib/clickhouse/data/database/table/`. + +Si le serveur a cessé d'exister ou a subi un redémarrage Brutal (par exemple, après une panne de périphérique) après une insertion dans une table distribuée, les données insérées peuvent être perdues. Si une partie de données endommagée est détectée dans le répertoire de la table, elle est transférée ‘broken’ sous-répertoire et n'est plus utilisé. + +Lorsque l'option max\_parallel\_replicas est activée, le traitement des requêtes est parallélisé entre toutes les répliques d'un seul fragment. Pour plus d'informations, consultez la section [max\_parallel\_replicas](../settings/settings.md#settings-max_parallel_replicas). + +## Les Colonnes Virtuelles {#virtual-columns} + +- `_shard_num` — Contains the `shard_num` (de `system.clusters`). Type: [UInt32](../../data_types/int_uint.md). + +!!! note "Note" + Depuis [`remote`](../../query_language/table_functions/remote.md)/`cluster` les fonctions de table créent en interne une instance temporaire du même moteur distribué, `_shard_num` est disponible là-bas aussi. + +**Voir Aussi** + +- [Les colonnes virtuelles](index.md#table_engines-virtual_columns) + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/distributed/) diff --git a/docs/fr/operations/table_engines/external_data.md b/docs/fr/operations/table_engines/external_data.md new file mode 100644 index 00000000000..79b3b32076b --- /dev/null +++ b/docs/fr/operations/table_engines/external_data.md @@ -0,0 +1,65 @@ +--- +machine_translated: true +--- + +# Données externes pour le traitement des requêtes {#external-data-for-query-processing} + +ClickHouse permet d'Envoyer à un serveur les données nécessaires au traitement d'une requête, ainsi qu'une requête SELECT. Ces données sont placées dans une table temporaire (voir la section “Temporary tables”) et peut être utilisé dans la requête (par exemple, dans les DANS les opérateurs). + +Par exemple, si vous disposez d'un fichier texte avec important des identifiants d'utilisateur, vous pouvez le télécharger sur le serveur avec une requête qui utilise la filtration par cette liste. + +Si vous devez exécuter plusieurs requêtes avec un volume important de données externes, n'utilisez pas cette fonctionnalité. Il est préférable de télécharger les données sur la base de données à l'avance. + +Les données externes peuvent être téléchargées à l'aide du client de ligne de commande (en mode non interactif) ou à l'aide de L'interface HTTP. + +Dans le client de ligne de commande, vous pouvez spécifier une section paramètres du format + +``` bash +--external --file=... [--name=...] [--format=...] [--types=...|--structure=...] +``` + +Vous pouvez avoir plusieurs sections comme ça, pour le nombre de tables étant transmis. + +**–external** – Marks the beginning of a clause. +**–file** – Path to the file with the table dump, or -, which refers to stdin. +Une seule table peut être récupérée à partir de stdin. + +Les paramètres suivants sont facultatifs: **–name**– Name of the table. If omitted, \_data is used. +**–format** – Data format in the file. If omitted, TabSeparated is used. + +L'un des paramètres suivants est requis:**–types** – A list of comma-separated column types. For example: `UInt64,String`. The columns will be named \_1, \_2, … +**–structure**– The table structure in the format`UserID UInt64`, `URL String`. Définit les noms et les types de colonnes. + +Les fichiers spécifiés dans ‘file’ sera analysé par le format spécifié dans ‘format’, en utilisant les types de données spécifié dans ‘types’ ou ‘structure’. La table sera téléchargée sur le serveur et accessible en tant que table temporaire avec le nom dans ‘name’. + +Exemple: + +``` bash +$ echo -ne "1\n2\n3\n" | clickhouse-client --query="SELECT count() FROM test.visits WHERE TraficSourceID IN _data" --external --file=- --types=Int8 +849897 +$ cat /etc/passwd | sed 's/:/\t/g' | clickhouse-client --query="SELECT shell, count() AS c FROM passwd GROUP BY shell ORDER BY c DESC" --external --file=- --name=passwd --structure='login String, unused String, uid UInt16, gid UInt16, comment String, home String, shell String' +/bin/sh 20 +/bin/false 5 +/bin/bash 4 +/usr/sbin/nologin 1 +/bin/sync 1 +``` + +Lors de l'utilisation de L'interface HTTP, les données externes sont transmises au format multipart/form-data. Chaque tableau est transmis en tant que fichier séparé. Le nom de la table est tiré du nom du fichier. Le ‘query\_string’ est passé les paramètres ‘name\_format’, ‘name\_types’, et ‘name\_structure’, où ‘name’ est le nom de la table que ces paramètres correspondent. La signification des paramètres est la même que lors de l'utilisation du client de ligne de commande. + +Exemple: + +``` bash +$ cat /etc/passwd | sed 's/:/\t/g' > passwd.tsv + +$ curl -F 'passwd=@passwd.tsv;' 'http://localhost:8123/?query=SELECT+shell,+count()+AS+c+FROM+passwd+GROUP+BY+shell+ORDER+BY+c+DESC&passwd_structure=login+String,+unused+String,+uid+UInt16,+gid+UInt16,+comment+String,+home+String,+shell+String' +/bin/sh 20 +/bin/false 5 +/bin/bash 4 +/usr/sbin/nologin 1 +/bin/sync 1 +``` + +Pour le traitement des requêtes distribuées, les tables temporaires sont envoyées à tous les serveurs distants. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/external_data/) diff --git a/docs/fr/operations/table_engines/file.md b/docs/fr/operations/table_engines/file.md new file mode 100644 index 00000000000..8b2f0ada797 --- /dev/null +++ b/docs/fr/operations/table_engines/file.md @@ -0,0 +1,87 @@ +--- +machine_translated: true +--- + +# Fichier {#table_engines-file} + +Le moteur de table de fichiers conserve les données dans un fichier dans l'un des [fichier +format](../../interfaces/formats.md#formats) (TabSeparated, Native, etc.). + +Exemples d'utilisation: + +- Exportation de données de ClickHouse vers un fichier. +- Convertir des données d'un format à un autre. +- Mise à jour des données dans ClickHouse via l'édition d'un fichier sur un disque. + +## Utilisation dans le serveur ClickHouse {#usage-in-clickhouse-server} + +``` sql +File(Format) +``` + +Le `Format` paramètre spécifie l'un des formats de fichier disponibles. Effectuer +`SELECT` requêtes, le format doit être pris en charge pour l'entrée, et à effectuer +`INSERT` queries – for output. The available formats are listed in the +[Format](../../interfaces/formats.md#formats) section. + +ClickHouse ne permet pas de spécifier le chemin du système de fichiers pour`File`. Il utilisera le dossier défini par [chemin](../server_settings/settings.md) réglage dans la configuration du serveur. + +Lors de la création de la table en utilisant `File(Format)` il crée sous-répertoire vide dans ce dossier. Lorsque les données sont écrites dans cette table, elles sont mises dans `data.Format` fichier dans ce répertoire. + +Vous pouvez créer manuellement ce sous dossier et ce fichier dans le système de fichiers [ATTACH](../../query_language/misc.md) il à la table des informations avec le nom correspondant, de sorte que vous pouvez interroger les données de ce fichier. + +!!! warning "Avertissement" + Soyez prudent avec cette fonctionnalité, car ClickHouse ne garde pas trace des modifications externes apportées à ces fichiers. Le résultat des Écritures simultanées via ClickHouse et en dehors de ClickHouse n'est pas défini. + +**Exemple:** + +**1.** Configurer le `file_engine_table` table: + +``` sql +CREATE TABLE file_engine_table (name String, value UInt32) ENGINE=File(TabSeparated) +``` + +Par défaut ClickHouse va créer un dossier `/var/lib/clickhouse/data/default/file_engine_table`. + +**2.** Créer manuellement `/var/lib/clickhouse/data/default/file_engine_table/data.TabSeparated` contenant: + +``` bash +$ cat data.TabSeparated +one 1 +two 2 +``` + +**3.** Interroger les données: + +``` sql +SELECT * FROM file_engine_table +``` + +``` text +┌─name─┬─value─┐ +│ one │ 1 │ +│ two │ 2 │ +└──────┴───────┘ +``` + +## Utilisation dans Clickhouse-local {#usage-in-clickhouse-local} + +Dans [clickhouse-local](../utils/clickhouse-local.md) Fichier moteur accepte chemin d'accès au fichier en plus `Format`. Les flux d'entrée / sortie par défaut peuvent être spécifiés en utilisant des noms numériques ou lisibles par l'homme comme `0` ou `stdin`, `1` ou `stdout`. +**Exemple:** + +``` bash +$ echo -e "1,2\n3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); SELECT a, b FROM table; DROP TABLE table" +``` + +## Les détails de mise en Œuvre {#details-of-implementation} + +- Plusieurs `SELECT` les requêtes peuvent être effectuées simultanément, mais `INSERT` requêtes s'attendre les uns les autres. +- Prise en charge de la création d'un nouveau fichier par `INSERT` requête. +- Si le fichier existe, `INSERT` ajouterait de nouvelles valeurs dedans. +- Pas pris en charge: + - `ALTER` + - `SELECT ... SAMPLE` + - Index + - Réplication + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/file/) diff --git a/docs/fr/operations/table_engines/generate.md b/docs/fr/operations/table_engines/generate.md new file mode 100644 index 00000000000..4b418f39734 --- /dev/null +++ b/docs/fr/operations/table_engines/generate.md @@ -0,0 +1,58 @@ +--- +machine_translated: true +--- + +# GenerateRandom {#table_engines-generate} + +Le moteur de table GenerateRandom produit des données aléatoires pour un schéma de table donné. + +Exemples d'utilisation: + +- Utiliser dans le test pour remplir une grande table reproductible. +- Générer une entrée aléatoire pour les tests de fuzzing. + +## Utilisation dans le serveur ClickHouse {#usage-in-clickhouse-server} + +``` sql +ENGINE = GenerateRandom(random_seed, max_string_length, max_array_length) +``` + +Le `max_array_length` et `max_string_length` les paramètres spécifient la longueur maximale de tous +colonnes et chaînes de tableau en conséquence dans les données générées. + +Générer le moteur de table prend en charge uniquement `SELECT` requête. + +Il prend en charge tous les [Les types de données](../../data_types/index.md) cela peut être stocké dans une table sauf `LowCardinality` et `AggregateFunction`. + +**Exemple:** + +**1.** Configurer le `generate_engine_table` table: + +``` sql +CREATE TABLE generate_engine_table (name String, value UInt32) ENGINE = GenerateRandom(1, 5, 3) +``` + +**2.** Interroger les données: + +``` sql +SELECT * FROM generate_engine_table LIMIT 3 +``` + +``` text +┌─name─┬──────value─┐ +│ c4xJ │ 1412771199 │ +│ r │ 1791099446 │ +│ 7#$ │ 124312908 │ +└──────┴────────────┘ +``` + +## Les détails de mise en Œuvre {#details-of-implementation} + +- Pas pris en charge: + - `ALTER` + - `SELECT ... SAMPLE` + - `INSERT` + - Index + - Réplication + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/generate/) diff --git a/docs/fr/operations/table_engines/graphitemergetree.md b/docs/fr/operations/table_engines/graphitemergetree.md new file mode 100644 index 00000000000..584bb5acd5c --- /dev/null +++ b/docs/fr/operations/table_engines/graphitemergetree.md @@ -0,0 +1,171 @@ +--- +machine_translated: true +--- + +# GraphiteMergeTree {#graphitemergetree} + +Ce moteur est conçu pour l'amincissement et l'agrégation / moyenne (cumul) [Graphite](http://graphite.readthedocs.io/en/latest/index.html) données. Il peut être utile aux développeurs qui veulent utiliser ClickHouse comme un magasin de données pour Graphite. + +Vous pouvez utiliser N'importe quel moteur de table ClickHouse pour stocker les données Graphite si vous n'avez pas besoin de cumul, mais si vous avez besoin d'un cumul, utilisez `GraphiteMergeTree`. Le moteur réduit le volume de stockage et augmente l'efficacité des requêtes de Graphite. + +Le moteur hérite des propriétés de [MergeTree](mergetree.md). + +## Création d'une Table {#creating-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + Path String, + Time DateTime, + Value , + Version + ... +) ENGINE = GraphiteMergeTree(config_section) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +Voir une description détaillée de la [CREATE TABLE](../../query_language/create.md#create-table-query) requête. + +Un tableau pour les données de Graphite devrait avoir les colonnes suivantes pour les données suivantes: + +- Nom métrique (Capteur De Graphite). Type de données: `String`. + +- Temps de mesure de la métrique. Type de données: `DateTime`. + +- La valeur de la métrique. Type de données: tout numérique. + +- La Version de la métrique. Type de données: tout numérique. + + ClickHouse enregistre les lignes avec la version la plus élevée ou la dernière écrite si les versions sont les mêmes. Les autres lignes sont supprimées lors de la fusion des parties de données. + +Les noms de ces colonnes doivent être définis dans la configuration de cumul. + +**GraphiteMergeTree paramètres** + +- `config_section` — Name of the section in the configuration file, where are the rules of rollup set. + +**Les clauses de requête** + +Lors de la création d'un `GraphiteMergeTree` de table, de la même [clause](mergetree.md#table_engine-mergetree-creating-a-table) sont nécessaires, comme lors de la création d'un `MergeTree` table. + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets et, si possible, remplacez les anciens projets par la méthode décrite ci-dessus. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + EventDate Date, + Path String, + Time DateTime, + Value , + Version + ... +) ENGINE [=] GraphiteMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, config_section) +``` + +Tous les paramètres excepté `config_section` ont la même signification que dans `MergeTree`. + +- `config_section` — Name of the section in the configuration file, where are the rules of rollup set. + +
+ +## Configuration de cumul {#rollup-configuration} + +Les paramètres de cumul sont définis par [graphite\_rollup](../server_settings/settings.md#server_settings-graphite_rollup) paramètre dans la configuration du serveur. Le nom du paramètre pourrait être tout. Vous pouvez créer plusieurs configurations et les utiliser pour différentes tables. + +Structure de configuration de cumul: + + required-columns + patterns + +### Les Colonnes Requises {#required-columns} + +- `path_column_name` — The name of the column storing the metric name (Graphite sensor). Default value: `Path`. +- `time_column_name` — The name of the column storing the time of measuring the metric. Default value: `Time`. +- `value_column_name` — The name of the column storing the value of the metric at the time set in `time_column_name`. Valeur par défaut: `Value`. +- `version_column_name` — The name of the column storing the version of the metric. Default value: `Timestamp`. + +### Modèle {#patterns} + +La Structure de la `patterns` section: + +``` text +pattern + regexp + function +pattern + regexp + age + precision + ... +pattern + regexp + function + age + precision + ... +pattern + ... +default + function + age + precision + ... +``` + +!!! warning "Attention" + Les motifs doivent être strictement commandés: + + 1. Patterns without `function` or `retention`. + 1. Patterns with both `function` and `retention`. + 1. Pattern `default`. + +Lors du traitement d'une ligne, ClickHouse vérifie les règles `pattern` section. Chacun `pattern` (comprendre `default`) les articles peuvent contenir des `function` paramètre d'agrégation, `retention` les paramètres ou les deux à la fois. Si le nom de la métrique correspond `regexp` les règles de la `pattern` section (ou sections) sont appliquées; sinon, les règles de la `default` section sont utilisés. + +Champs pour `pattern` et `default` section: + +- `regexp`– A pattern for the metric name. +- `age` – The minimum age of the data in seconds. +- `precision`– How precisely to define the age of the data in seconds. Should be a divisor for 86400 (seconds in a day). +- `function` – The name of the aggregating function to apply to data whose age falls within the range `[age, age + precision]`. + +### Exemple De Configuration {#configuration-example} + +``` xml + + Version + + click_cost + any + + 0 + 5 + + + 86400 + 60 + + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + +``` + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/graphitemergetree/) diff --git a/docs/fr/operations/table_engines/hdfs.md b/docs/fr/operations/table_engines/hdfs.md new file mode 100644 index 00000000000..7fe493861d7 --- /dev/null +++ b/docs/fr/operations/table_engines/hdfs.md @@ -0,0 +1,120 @@ +--- +machine_translated: true +--- + +# HDFS {#table_engines-hdfs} + +Ce moteur fournit l'intégration avec [Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop) l'écosystème en permettant de gérer les données sur [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)via ClickHouse. Ce moteur est similaire +à l' [Fichier](file.md) et [URL](url.md) moteurs, mais fournit des fonctionnalités spécifiques Hadoop. + +## Utilisation {#usage} + +``` sql +ENGINE = HDFS(URI, format) +``` + +Le `URI` paramètre est L'URI du fichier entier dans HDFS. +Le `format` paramètre spécifie l'un des formats de fichier disponibles. Effectuer +`SELECT` requêtes, le format doit être pris en charge pour l'entrée, et à effectuer +`INSERT` queries – for output. The available formats are listed in the +[Format](../../interfaces/formats.md#formats) section. +Le chemin le cadre de `URI` peut contenir des globules. Dans ce cas, le tableau serait en lecture seule. + +**Exemple:** + +**1.** Configurer le `hdfs_engine_table` table: + +``` sql +CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV') +``` + +**2.** Remplir le fichier: + +``` sql +INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3) +``` + +**3.** Interroger les données: + +``` sql +SELECT * FROM hdfs_engine_table LIMIT 2 +``` + +``` text +┌─name─┬─value─┐ +│ one │ 1 │ +│ two │ 2 │ +└──────┴───────┘ +``` + +## Détails De Mise En Œuvre {#implementation-details} + +- Les lectures et les écritures peuvent être parallèles +- Pas pris en charge: + - `ALTER` et `SELECT...SAMPLE` opérations. + - Index. + - Réplication. + +**Globs dans le chemin** + +Plusieurs composants de chemin peuvent avoir des globs. Pour être traité, le fichier devrait exister et correspondre au modèle de chemin entier. Liste des fichiers détermine pendant `SELECT` (pas à l' `CREATE` moment). + +- `*` — Substitutes any number of any characters except `/` y compris la chaîne vide. +- `?` — Substitutes any single character. +- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. +- `{N..M}` — Substitutes any number in range from N to M including both borders. + +Les Constructions avec `{}` sont similaires à l' [distant](../../query_language/table_functions/remote.md) table de fonction. + +**Exemple** + +1. Supposons que nous ayons plusieurs fichiers au format TSV avec les URI suivants sur HDFS: + +- ‘hdfs://hdfs1:9000/some\_dir/some\_file\_1’ +- ‘hdfs://hdfs1:9000/some\_dir/some\_file\_2’ +- ‘hdfs://hdfs1:9000/some\_dir/some\_file\_3’ +- ‘hdfs://hdfs1:9000/another\_dir/some\_file\_1’ +- ‘hdfs://hdfs1:9000/another\_dir/some\_file\_2’ +- ‘hdfs://hdfs1:9000/another\_dir/some\_file\_3’ + +1. Il y a plusieurs façons de faire une table composée des six fichiers: + + + +``` sql +CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV') +``` + +Une autre façon: + +``` sql +CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV') +``` + +Table se compose de tous les fichiers dans les deux répertoires (tous les fichiers doivent satisfaire le format et le schéma décrits dans la requête): + +``` sql +CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV') +``` + +!!! warning "Avertissement" + Si la liste des fichiers contient des plages de nombres avec des zéros en tête, utilisez la construction avec des accolades pour chaque chiffre séparément ou utilisez `?`. + +**Exemple** + +Créer une table avec des fichiers nommés `file000`, `file001`, … , `file999`: + +``` sql +CREARE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV') +``` + +## Les Colonnes Virtuelles {#virtual-columns} + +- `_path` — Path to the file. +- `_file` — Name of the file. + +**Voir Aussi** + +- [Les colonnes virtuelles](https://clickhouse.tech/docs/en/operations/table_engines/#table_engines-virtual_columns) + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/hdfs/) diff --git a/docs/fr/operations/table_engines/index.md b/docs/fr/operations/table_engines/index.md new file mode 100644 index 00000000000..2056a68139d --- /dev/null +++ b/docs/fr/operations/table_engines/index.md @@ -0,0 +1,81 @@ +--- +machine_translated: true +--- + +# Moteurs de Table {#table_engines} + +Le moteur de table (type de table) détermine: + +- Comment et où les données sont stockées, où les écrire et où les lire. +- Quelles requêtes sont prises en charge et comment. +- Accès simultané aux données. +- Utilisation des index, si elle est présente. +- Indique si l'exécution d'une requête multithread est possible. +- Paramètres de réplication des données. + +## Familles De Moteurs {#engine-families} + +### MergeTree {#mergetree} + +Les moteurs de table les plus universels et fonctionnels pour les tâches à forte charge. La propriété partagée par ces moteurs est l'insertion rapide des données avec traitement ultérieur des données d'arrière-plan. `MergeTree` les moteurs de la famille prennent en charge la réplication des données (avec [Répliqué\*](replication.md) versions de moteurs), le partitionnement, et d'autres fonctionnalités non prises en charge dans d'autres moteurs. + +Moteurs dans la famille: + +- [MergeTree](mergetree.md) +- [ReplacingMergeTree](replacingmergetree.md) +- [SummingMergeTree](summingmergetree.md) +- [AggregatingMergeTree](aggregatingmergetree.md) +- [CollapsingMergeTree](collapsingmergetree.md) +- [VersionedCollapsingMergeTree](versionedcollapsingmergetree.md) +- [GraphiteMergeTree](graphitemergetree.md) + +### Journal {#log} + +Léger [moteur](log_family.md) avec une fonctionnalité minimale. Ils sont les plus efficaces lorsque vous devez écrire rapidement de nombreuses petites tables (jusqu'à environ 1 million de lignes) et les lire plus tard dans leur ensemble. + +Moteurs dans la famille: + +- [TinyLog](tinylog.md) +- [StripeLog](stripelog.md) +- [Journal](log.md) + +### Moteurs d'Intergation {#intergation-engines} + +Moteurs de communication avec d'autres systèmes de stockage et de traitement de données. + +Moteurs dans la famille: + +- [Kafka](kafka.md) +- [MySQL](mysql.md) +- [ODBC](odbc.md) +- [JDBC](jdbc.md) +- [HDFS](hdfs.md) + +### Moteurs spéciaux {#special-engines} + +Moteurs dans la famille: + +- [Distribué](distributed.md) +- [MaterializedView](materializedview.md) +- [Dictionnaire](dictionary.md) +- [Fusionner](merge.md) +- [Fichier](file.md) +- [NULL](null.md) +- [Définir](set.md) +- [Rejoindre](join.md) +- [URL](url.md) +- [Vue](view.md) +- [Mémoire](memory.md) +- [Tampon](buffer.md) + +## Les colonnes virtuelles {#table_engines-virtual-columns} + +Colonne virtuelle est un attribut de moteur de table intégrale qui est défini dans le code source du moteur. + +Vous ne devez pas spécifier de colonnes virtuelles dans `CREATE TABLE` requête et vous ne pouvez pas les voir dans `SHOW CREATE TABLE` et `DESCRIBE TABLE` les résultats de la requête. Les colonnes virtuelles sont également en lecture seule, vous ne pouvez donc pas insérer de données dans des colonnes virtuelles. + +Pour sélectionner des données dans une colonne virtuelle, vous devez spécifier son nom `SELECT` requête. `SELECT *` ne renvoie pas de valeurs à partir de colonnes virtuelles. + +Si vous créez une table avec une colonne portant le même nom que l'une des colonnes virtuelles de la table, la colonne virtuelle devient inaccessible. Nous ne recommandons pas de faire cela. Pour éviter les conflits, les noms de colonnes virtuelles sont généralement précédés d'un trait de soulignement. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/) diff --git a/docs/fr/operations/table_engines/jdbc.md b/docs/fr/operations/table_engines/jdbc.md new file mode 100644 index 00000000000..4987ca290d3 --- /dev/null +++ b/docs/fr/operations/table_engines/jdbc.md @@ -0,0 +1,87 @@ +--- +machine_translated: true +--- + +# JDBC {#table-engine-jdbc} + +Permet à ClickHouse de se connecter à des bases de données externes via [JDBC](https://en.wikipedia.org/wiki/Java_Database_Connectivity). + +Pour implémenter la connexion JDBC, ClickHouse utilise le programme séparé [clickhouse-JDBC-pont](https://github.com/alex-krash/clickhouse-jdbc-bridge) cela devrait fonctionner comme un démon. + +Ce moteur prend en charge le [Nullable](../../data_types/nullable.md) type de données. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name +( + columns list... +) +ENGINE = JDBC(dbms_uri, external_database, external_table) +``` + +**Les Paramètres Du Moteur** + +- `dbms_uri` — URI of an external DBMS. + + Format: `jdbc:://:/?user=&password=`. + Exemple pour MySQL: `jdbc:mysql://localhost:3306/?user=root&password=root`. + +- `external_database` — Database in an external DBMS. + +- `external_table` — Name of the table in `external_database`. + +## Exemple D'Utilisation {#usage-example} + +Création d'une table dans le serveur MySQL en se connectant directement avec son client console: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++--------+--------------+-------+----------------+ +| int_id | int_nullable | float | float_nullable | ++--------+--------------+-------+----------------+ +| 1 | NULL | 2 | NULL | ++--------+--------------+-------+----------------+ +1 row in set (0,00 sec) +``` + +Création d'une table dans le serveur ClickHouse et sélection des données: + +``` sql +CREATE TABLE jdbc_table +( + `int_id` Int32, + `int_nullable` Nullable(Int32), + `float` Float32, + `float_nullable` Nullable(Float32) +) +ENGINE JDBC('jdbc:mysql://localhost:3306/?user=root&password=root', 'test', 'test') +``` + +``` sql +SELECT * +FROM jdbc_table +``` + +``` text +┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐ +│ 1 │ ᴺᵁᴸᴸ │ 2 │ ᴺᵁᴸᴸ │ +└────────┴──────────────┴───────┴────────────────┘ +``` + +## Voir Aussi {#see-also} + +- [Fonction de table JDBC](../../query_language/table_functions/jdbc.md). + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/jdbc/) diff --git a/docs/fr/operations/table_engines/join.md b/docs/fr/operations/table_engines/join.md new file mode 100644 index 00000000000..a5210598195 --- /dev/null +++ b/docs/fr/operations/table_engines/join.md @@ -0,0 +1,108 @@ +--- +machine_translated: true +--- + +# Rejoindre {#join} + +Structure de données préparée pour l'utilisation dans [JOIN](../../query_language/select.md#select-join) opérations. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], +) ENGINE = Join(join_strictness, join_type, k1[, k2, ...]) +``` + +Voir la description détaillée de la [CREATE TABLE](../../query_language/create.md#create-table-query) requête. + +**Les Paramètres Du Moteur** + +- `join_strictness` – [ADHÉRER à la rigueur](../../query_language/select.md#select-join-strictness). +- `join_type` – [Type de jointure](../../query_language/select.md#select-join-types). +- `k1[, k2, ...]` – Key columns from the `USING` la clause que l' `JOIN` l'opération est faite avec de la. + +Entrer `join_strictness` et `join_type` paramètres sans guillemets, par exemple, `Join(ANY, LEFT, col1)`. Ils doivent correspondre à la `JOIN` fonctionnement que le tableau sera utilisé pour. Si les paramètres ne correspondent pas, ClickHouse ne lance pas d'exception et peut renvoyer des données incorrectes. + +## Utilisation Du Tableau {#table-usage} + +### Exemple {#example} + +Création de la table de gauche: + +``` sql +CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog +``` + +``` sql +INSERT INTO id_val VALUES (1,11)(2,12)(3,13) +``` + +Création du côté droit `Join` table: + +``` sql +CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id) +``` + +``` sql +INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23) +``` + +Rejoindre les tables: + +``` sql +SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id) SETTINGS join_use_nulls = 1 +``` + +``` text +┌─id─┬─val─┬─id_val_join.val─┐ +│ 1 │ 11 │ 21 │ +│ 2 │ 12 │ ᴺᵁᴸᴸ │ +│ 3 │ 13 │ 23 │ +└────┴─────┴─────────────────┘ +``` + +Comme alternative, vous pouvez récupérer des données de la `Join` table, spécifiant la valeur de la clé de jointure: + +``` sql +SELECT joinGet('id_val_join', 'val', toUInt32(1)) +``` + +``` text +┌─joinGet('id_val_join', 'val', toUInt32(1))─┐ +│ 21 │ +└────────────────────────────────────────────┘ +``` + +### Sélection et insertion de données {#selecting-and-inserting-data} + +Vous pouvez utiliser `INSERT` requêtes pour ajouter des données au `Join`-tables de moteur. Si la table a été créée avec `ANY` rigueur, les données pour les clés en double sont ignorées. Avec l' `ALL` rigueur, toutes les lignes sont ajoutées. + +Vous ne pouvez pas effectuer un `SELECT` requête directement à partir de la table. Au lieu de cela, utilisez l'une des méthodes suivantes: + +- Placez la table sur le côté droit dans un `JOIN` clause. +- Appelez le [joinGet](../../query_language/functions/other_functions.md#joinget) fonction, qui vous permet d'extraire des données de la table de la même manière que d'un dictionnaire. + +### Limitations et paramètres {#join-limitations-and-settings} + +Lors de la création d'un tableau, les paramètres suivants sont appliqués: + +- [join\_use\_nulls](../settings/settings.md#join_use_nulls) +- [max\_rows\_in\_join](../settings/query_complexity.md#settings-max_rows_in_join) +- [max\_bytes\_in\_join](../settings/query_complexity.md#settings-max_bytes_in_join) +- [join\_overflow\_mode](../settings/query_complexity.md#settings-join_overflow_mode) +- [join\_any\_take\_last\_row](../settings/settings.md#settings-join_any_take_last_row) + +Le `Join`- les tables de moteur ne peuvent pas être utilisées dans `GLOBAL JOIN` opérations. + +Le `Join`-moteur permet d'utiliser [join\_use\_nulls](../settings/settings.md#join_use_nulls) réglage de la `CREATE TABLE` déclaration. Et [SELECT](../../query_language/select.md) requête permet d'utiliser `join_use_nulls` trop. Si vous avez différents `join_use_nulls` paramètres, vous pouvez obtenir une table de jointure d'erreur. Il dépend de type de JOINTURE. Lorsque vous utilisez [joinGet](../../query_language/functions/other_functions.md#joinget) fonction, vous devez utiliser le même `join_use_nulls` réglage en `CRATE TABLE` et `SELECT` déclaration. + +## Le Stockage De Données {#data-storage} + +`Join` les données de la table sont toujours situées dans la RAM. Lors de l'insertion de lignes dans une table, ClickHouse écrit des blocs de données dans le répertoire du disque afin qu'ils puissent être restaurés lorsque le serveur redémarre. + +Si le serveur redémarre incorrectement, le bloc de données sur le disque peut être perdu ou endommagé. Dans ce cas, vous devrez peut-être supprimer manuellement le fichier contenant des données endommagées. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/join/) diff --git a/docs/fr/operations/table_engines/kafka.md b/docs/fr/operations/table_engines/kafka.md new file mode 100644 index 00000000000..2c9d3abff9d --- /dev/null +++ b/docs/fr/operations/table_engines/kafka.md @@ -0,0 +1,173 @@ +--- +machine_translated: true +--- + +# Kafka {#kafka} + +Ce moteur fonctionne avec [Apache Kafka](http://kafka.apache.org/). + +Kafka vous permet de: + +- Publier ou s'abonner aux flux de données. +- Organiser le stockage tolérant aux pannes. +- Traiter les flux à mesure qu'ils deviennent disponibles. + +## Création d'une Table {#table_engine-kafka-creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = Kafka() +SETTINGS + kafka_broker_list = 'host:port', + kafka_topic_list = 'topic1,topic2,...', + kafka_group_name = 'group_name', + kafka_format = 'data_format'[,] + [kafka_row_delimiter = 'delimiter_symbol',] + [kafka_schema = '',] + [kafka_num_consumers = N,] + [kafka_skip_broken_messages = N] +``` + +Les paramètres requis: + +- `kafka_broker_list` – A comma-separated list of brokers (for example, `localhost:9092`). +- `kafka_topic_list` – A list of Kafka topics. +- `kafka_group_name` – A group of Kafka consumers. Reading margins are tracked for each group separately. If you don't want messages to be duplicated in the cluster, use the same group name everywhere. +- `kafka_format` – Message format. Uses the same notation as the SQL `FORMAT` la fonction, tels que `JSONEachRow`. Pour plus d'informations, voir le [Format](../../interfaces/formats.md) section. + +Paramètres facultatifs: + +- `kafka_row_delimiter` – Delimiter character, which ends the message. +- `kafka_schema` – Parameter that must be used if the format requires a schema definition. For example, [Cap'n Proto](https://capnproto.org/) nécessite le chemin d'accès du fichier de schéma et le nom de la racine `schema.capnp:Message` objet. +- `kafka_num_consumers` – The number of consumers per table. Default: `1`. Spécifiez plus de consommateurs si le débit d'un consommateur est insuffisant. Le nombre total de consommateurs ne doit pas dépasser le nombre de partitions dans la rubrique, car un seul consommateur peut être affecté par partition. +- `kafka_skip_broken_messages` – Kafka message parser tolerance to schema-incompatible messages per block. Default: `0`. Si `kafka_skip_broken_messages = N` puis le moteur saute *N* Messages Kafka qui ne peuvent pas être analysés (un message est égal à une ligne de données). + +Exemple: + +``` sql + CREATE TABLE queue ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka('localhost:9092', 'topic', 'group1', 'JSONEachRow'); + + SELECT * FROM queue LIMIT 5; + + CREATE TABLE queue2 ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka SETTINGS kafka_broker_list = 'localhost:9092', + kafka_topic_list = 'topic', + kafka_group_name = 'group1', + kafka_format = 'JSONEachRow', + kafka_num_consumers = 4; + + CREATE TABLE queue2 ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka('localhost:9092', 'topic', 'group1') + SETTINGS kafka_format = 'JSONEachRow', + kafka_num_consumers = 4; +``` + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets. Si possible, optez anciens projets à la méthode décrite ci-dessus. + +``` sql +Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format + [, kafka_row_delimiter, kafka_schema, kafka_num_consumers, kafka_skip_broken_messages]) +``` + +
+ +## Description {#description} + +Les messages livrés sont suivis automatiquement, de sorte que chaque message d'un groupe n'est compté qu'une seule fois. Si vous souhaitez obtenir les données deux fois, créez une copie de la table avec un autre nom de groupe. + +Les groupes sont flexibles et synchronisés sur le cluster. Par exemple, si vous avez 10 thèmes et 5 copies d'une table dans un cluster, chaque copie obtient 2 sujets. Si le nombre de copies change, les rubriques sont redistribuées automatiquement entre les copies. En savoir plus à ce sujet à http://kafka.apache.org/intro. + +`SELECT` n'est pas particulièrement utile pour la lecture de messages (sauf pour le débogage), car chaque message ne peut être lu qu'une seule fois. Il est plus pratique de créer des threads en temps réel à l'aide de vues matérialisées. Pour ce faire: + +1. Utilisez le moteur pour créer un consommateur Kafka et considérez-le comme un flux de données. +2. Créez une table avec la structure souhaitée. +3. Créer une vue matérialisée qui convertit les données du moteur et le met dans une table créée précédemment. + +Lorsque l' `MATERIALIZED VIEW` rejoint le moteur, il commence à collecter des données en arrière-plan. Cela vous permet de recevoir continuellement des messages de Kafka et de les convertir au format requis en utilisant `SELECT`. +Une table kafka peut avoir autant de vues matérialisées que vous le souhaitez, elles ne lisent pas directement les données de la table kafka, mais reçoivent de nouveaux enregistrements( en blocs), de cette façon vous pouvez écrire sur plusieurs tables avec différents niveaux de détail (avec regroupement - agrégation et sans). + +Exemple: + +``` sql + CREATE TABLE queue ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka('localhost:9092', 'topic', 'group1', 'JSONEachRow'); + + CREATE TABLE daily ( + day Date, + level String, + total UInt64 + ) ENGINE = SummingMergeTree(day, (day, level), 8192); + + CREATE MATERIALIZED VIEW consumer TO daily + AS SELECT toDate(toDateTime(timestamp)) AS day, level, count() as total + FROM queue GROUP BY day, level; + + SELECT level, sum(total) FROM daily GROUP BY level; +``` + +Pour améliorer les performances, les messages reçus sont regroupées en blocs de la taille de [max\_insert\_block\_size](../settings/settings.md#settings-max_insert_block_size). Si le bloc n'a pas été formé à l'intérieur [stream\_flush\_interval\_ms](../settings/settings.md) millisecondes, les données seront vidées dans le tableau, indépendamment de l'intégralité du bloc. + +Pour arrêter de recevoir des données de rubrique ou pour modifier la logique de conversion, détachez la vue matérialisée: + +``` sql + DETACH TABLE consumer; + ATTACH MATERIALIZED VIEW consumer; +``` + +Si vous souhaitez modifier la table cible en utilisant `ALTER`, nous vous recommandons de désactiver la vue matériel pour éviter les divergences entre la table cible et les données de la vue. + +## Configuration {#configuration} + +Similaire à GraphiteMergeTree, le moteur Kafka prend en charge la configuration étendue à l'aide du fichier de configuration ClickHouse. Il y a deux clés de configuration que vous pouvez utiliser: global (`kafka`) et des rubriques (`kafka_*`). La configuration globale est appliquée en premier, puis la configuration au niveau de la rubrique est appliquée (si elle existe). + +``` xml + + + cgrp + smallest + + + + + 250 + 100000 + +``` + +Pour obtenir une liste des options de configuration possibles, consultez [librdkafka référence de configuration](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md). Utilisez le trait de soulignement (`_`) au lieu d'un point dans la configuration ClickHouse. Exemple, `check.crcs=true` sera `true`. + +## Les Colonnes Virtuelles {#virtual-columns} + +- `_topic` — Kafka topic. +- `_key` — Key of the message. +- `_offset` — Offset of the message. +- `_timestamp` — Timestamp of the message. +- `_partition` — Partition of Kafka topic. + +**Voir Aussi** + +- [Les colonnes virtuelles](index.md#table_engines-virtual_columns) + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/kafka/) diff --git a/docs/fr/operations/table_engines/log.md b/docs/fr/operations/table_engines/log.md new file mode 100644 index 00000000000..799976e66c1 --- /dev/null +++ b/docs/fr/operations/table_engines/log.md @@ -0,0 +1,13 @@ +--- +machine_translated: true +--- + +# Journal {#log} + +Moteur appartient à la famille de journal des moteurs. Voir les propriétés communes des moteurs de journal et leurs différences dans le [Famille De Moteurs En Rondins](log_family.md) article. + +Journal diffère de [TinyLog](tinylog.md) dans un petit fichier de “marks” réside avec les fichiers de colonne. Ces marques sont écrites sur chaque bloc de données et contiennent des décalages qui indiquent où commencer à lire le fichier afin d'ignorer le nombre de lignes spécifié. Cela permet de lire les données de table dans plusieurs threads. +Pour l'accès aux données simultanées, les opérations de lecture peuvent être effectuées simultanément, tandis que les opérations d'écriture bloc lit et l'autre. +Le moteur de journal ne prend pas en charge les index. De même, si l'écriture dans une table a échoué, la table est cassée et la lecture de celle-ci renvoie une erreur. Le moteur de journal est approprié pour les données temporaires, les tables en écriture unique, et à des fins de test ou de démonstration. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/log/) diff --git a/docs/fr/operations/table_engines/log_family.md b/docs/fr/operations/table_engines/log_family.md new file mode 100644 index 00000000000..99b822b5911 --- /dev/null +++ b/docs/fr/operations/table_engines/log_family.md @@ -0,0 +1,43 @@ +--- +machine_translated: true +--- + +# Famille De Moteurs En Rondins {#log-engine-family} + +Ces moteurs ont été développés pour les scénarios où vous devez écrire rapidement de nombreuses petites tables (jusqu'à environ 1 million de lignes) et les lire plus tard dans leur ensemble. + +Les moteurs de la famille: + +- [StripeLog](stripelog.md) +- [Journal](log.md) +- [TinyLog](tinylog.md) + +## Propriétés communes {#common-properties} + +Moteur: + +- Stocker des données sur un disque. + +- Ajouter des données à la fin du fichier lors de l'écriture. + +- Bloque simultanées dans l'accès aux données. + + Lors `INSERT` requêtes, la table est verrouillée, et d'autres requêtes pour la lecture et l'écriture de données attendent que la table se déverrouille. S'il n'y a pas de requêtes d'écriture de données, un certain nombre de requêtes de lecture de données peuvent être effectuées simultanément. + +- Ne prennent pas en charge [mutation](../../query_language/alter.md#alter-mutations) opérations. + +- Ne prennent pas en charge les index. + + Cela signifie que `SELECT` les requêtes pour les plages de données ne sont pas efficaces. + +- N'écrivez pas de données de manière atomique. + + Vous pouvez obtenir une table avec des données corrompues si quelque chose interrompt l'opération d'écriture, par exemple, un arrêt anormal du serveur. + +## Différence {#differences} + +Le `TinyLog` le moteur est le plus simple de la famille et offre la fonctionnalité la plus pauvre et la plus faible efficacité. Le `TinyLog` le moteur ne prend pas en charge la lecture de données parallèles par plusieurs threads. Il lit les données plus lentement que les autres moteurs de la famille qui prennent en charge la lecture parallèle et utilise presque autant de descripteurs que `Log` moteur, car il stocke chaque colonne dans un fichier séparé. Utilisez-le dans des scénarios simples à faible charge. + +Le `Log` et `StripeLog` les moteurs prennent en charge la lecture de données parallèle. Lors de la lecture de données, ClickHouse utilise plusieurs threads. Chaque thread traite un bloc de données séparé. Le `Log` le moteur utilise un fichier distinct pour chaque colonne de la table. `StripeLog` stocke toutes les données dans un seul fichier. En conséquence, la `StripeLog` moteur utilise moins de descripteurs dans le système d'exploitation, mais le `Log` moteur fournit une plus grande efficacité lors de la lecture des données. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/log_family/) diff --git a/docs/fr/operations/table_engines/materializedview.md b/docs/fr/operations/table_engines/materializedview.md new file mode 100644 index 00000000000..599b7274028 --- /dev/null +++ b/docs/fr/operations/table_engines/materializedview.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# MaterializedView {#materializedview} + +Utilisé pour implémenter des vues matérialisées (pour plus d'informations, voir [CREATE TABLE](../../query_language/create.md)). Pour stocker des données, il utilise un moteur différent qui a été spécifié lors de la création de la vue. Lors de la lecture d'une table, il utilise juste ce moteur. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/materializedview/) diff --git a/docs/fr/operations/table_engines/memory.md b/docs/fr/operations/table_engines/memory.md new file mode 100644 index 00000000000..6bd043d02ee --- /dev/null +++ b/docs/fr/operations/table_engines/memory.md @@ -0,0 +1,16 @@ +--- +machine_translated: true +--- + +# Mémoire {#memory} + +Le moteur de mémoire stocke les données en RAM, sous forme non compressée. Les données sont stockées exactement sous la même forme qu'elles sont reçues lors de la lecture. En d'autres termes, la lecture de ce tableau est entièrement gratuit. +L'accès aux données simultanées est synchronisé. Les verrous sont courts: les opérations de lecture et d'écriture ne se bloquent pas. +Les index ne sont pas pris en charge. La lecture est parallélisée. +La productivité maximale (plus de 10 Go / s) est atteinte sur les requêtes simples, car il n'y a pas de lecture à partir du disque, de décompression ou de désérialisation des données. (Il convient de noter que dans de nombreux cas, la productivité du moteur MergeTree est presque aussi élevée.) +Lors du redémarrage d'un serveur, les données disparaissent de la table et la table devient vide. +Normalement, l'utilisation de ce moteur de table n'est pas justifiée. Cependant, il peut être utilisé pour des tests, et pour des tâches où la vitesse maximale est requise sur un nombre relativement faible de lignes (jusqu'à environ 100 000 000). + +Le moteur de mémoire est utilisé par le système pour les tables temporaires avec des données de requête externes (voir la section “External data for processing a query”), et pour la mise en œuvre globale dans (voir la section “IN operators”). + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/memory/) diff --git a/docs/fr/operations/table_engines/merge.md b/docs/fr/operations/table_engines/merge.md new file mode 100644 index 00000000000..5a751251b0d --- /dev/null +++ b/docs/fr/operations/table_engines/merge.md @@ -0,0 +1,67 @@ +--- +machine_translated: true +--- + +# Fusionner {#merge} + +Le `Merge` moteur (à ne pas confondre avec `MergeTree`) ne stocke pas les données elles-mêmes, mais permet la lecture de n'importe quel nombre d'autres tables simultanément. +La lecture est automatiquement parallélisée. L'écriture dans une table n'est pas prise en charge. Lors de la lecture, les index des tables en cours de lecture sont utilisés, s'ils existent. +Le `Merge` engine accepte les paramètres: le nom de la base de données et une expression régulière pour les tables. + +Exemple: + +``` sql +Merge(hits, '^WatchLog') +``` + +Les données seront lues à partir des tableaux du `hits` base de données dont les noms correspondent à l'expression régulière ‘`^WatchLog`’. + +Au lieu du nom de la base de données, vous pouvez utiliser une expression constante qui renvoie une chaîne. Exemple, `currentDatabase()`. + +Regular expressions — [re2](https://github.com/google/re2) (prend en charge un sous-ensemble de PCRE), sensible à la casse. +Voir les notes sur les symboles d'échappement dans les expressions régulières “match” section. + +Lors de la sélection des tables à lire, le `Merge` le tableau lui-même ne sera pas choisie, même si elle correspond à l'expression rationnelle. C'est pour éviter les boucles. +Il est possible de créer deux `Merge` des tables qui essaieront sans cesse de lire les données des autres, mais ce n'est pas une bonne idée. + +L'utilisation traditionnelle de la `Merge` moteur pour travailler avec un grand nombre de `TinyLog` les tables comme si avec une seule table. + +Exemple 2: + +Disons que vous avez une ancienne table (WatchLog\_old) et que vous avez décidé de changer de partitionnement sans déplacer les données vers une nouvelle table (WatchLog\_new) et que vous devez voir les données des deux tables. + +``` sql +CREATE TABLE WatchLog_old(date Date, UserId Int64, EventType String, Cnt UInt64) +ENGINE=MergeTree(date, (UserId, EventType), 8192); +INSERT INTO WatchLog_old VALUES ('2018-01-01', 1, 'hit', 3); + +CREATE TABLE WatchLog_new(date Date, UserId Int64, EventType String, Cnt UInt64) +ENGINE=MergeTree PARTITION BY date ORDER BY (UserId, EventType) SETTINGS index_granularity=8192; +INSERT INTO WatchLog_new VALUES ('2018-01-02', 2, 'hit', 3); + +CREATE TABLE WatchLog as WatchLog_old ENGINE=Merge(currentDatabase(), '^WatchLog'); + +SELECT * +FROM WatchLog +``` + +``` text +┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐ +│ 2018-01-01 │ 1 │ hit │ 3 │ +└────────────┴────────┴───────────┴─────┘ +┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐ +│ 2018-01-02 │ 2 │ hit │ 3 │ +└────────────┴────────┴───────────┴─────┘ +``` + +## Les Colonnes Virtuelles {#virtual-columns} + +- `_table` — Contains the name of the table from which data was read. Type: [Chaîne](../../data_types/string.md). + + Vous pouvez définir les conditions constantes sur `_table` dans le `WHERE/PREWHERE` clause (par exemple, `WHERE _table='xyz'`). Dans ce cas l'opération de lecture est effectuée uniquement pour les tables où la condition sur `_table` est satisfaite, pour le `_table` colonne agit comme un index. + +**Voir Aussi** + +- [Les colonnes virtuelles](index.md#table_engines-virtual_columns) + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/merge/) diff --git a/docs/fr/operations/table_engines/mergetree.md b/docs/fr/operations/table_engines/mergetree.md new file mode 100644 index 00000000000..f44a5f596a2 --- /dev/null +++ b/docs/fr/operations/table_engines/mergetree.md @@ -0,0 +1,653 @@ +--- +machine_translated: true +--- + +# MergeTree {#table_engines-mergetree} + +Le `MergeTree` moteur et autres moteurs de cette famille (`*MergeTree`) sont les moteurs de table ClickHouse les plus robustes. + +Les moteurs de la `MergeTree` famille sont conçus pour l'insertion d'une très grande quantité de données dans une table. Les données sont rapidement écrites dans la table partie par partie, puis des règles sont appliquées pour fusionner les parties en arrière-plan. Cette méthode est beaucoup plus efficace que de réécrire continuellement les données dans le stockage pendant l'insertion. + +Principales caractéristiques: + +- Stocke les données triées par clé primaire. + + Cela vous permet de créer un petit index clairsemé qui aide à trouver les données plus rapidement. + +- Les Partitions peuvent être utilisées si [clé de partitionnement](custom_partitioning_key.md) est spécifié. + + ClickHouse prend en charge certaines opérations avec des partitions plus efficaces que les opérations générales sur les mêmes données avec le même résultat. ClickHouse Coupe également automatiquement les données de partition où la clé de partitionnement est spécifiée dans la requête. Cela améliore également les performances de la requête. + +- Prise en charge de la réplication des données. + + La famille de `ReplicatedMergeTree` tables fournit la réplication des données. Pour plus d'informations, voir [Réplication des données](replication.md). + +- Appui d'échantillonnage de données. + + Si nécessaire, vous pouvez définir la méthode d'échantillonnage des données dans le tableau. + +!!! info "Info" + Le [Fusionner](merge.md) le moteur n'appartient pas à la `*MergeTree` famille. + +## Création d'une Table {#table_engine-mergetree-creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], + ... + INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, + INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 +) ENGINE = MergeTree() +[PARTITION BY expr] +[ORDER BY expr] +[PRIMARY KEY expr] +[SAMPLE BY expr] +[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...] +[SETTINGS name=value, ...] +``` + +Pour une description des paramètres, voir [Créer une description de requête](../../query_language/create.md). + +!!! note "Note" + `INDEX` est une fonctionnalité expérimentale, voir [Index De Saut De Données](#table_engine-mergetree-data_skipping-indexes). + +### Les Clauses De Requête {#mergetree-query-clauses} + +- `ENGINE` — Name and parameters of the engine. `ENGINE = MergeTree()`. Le `MergeTree` le moteur n'a pas de paramètres. + +- `PARTITION BY` — The [clé de partitionnement](custom_partitioning_key.md). + + Pour le partitionnement par mois, utilisez les `toYYYYMM(date_column)` l'expression, où `date_column` est une colonne avec une date du type [Date](../../data_types/date.md). Les noms de partition ici ont le `"YYYYMM"` format. + +- `ORDER BY` — The sorting key. + + Un tuple de colonnes ou d'expressions arbitraires. Exemple: `ORDER BY (CounterID, EventDate)`. + +- `PRIMARY KEY` — The primary key if it [diffère de la clé de tri](mergetree.md). + + Par défaut, la clé primaire est la même que la clé de tri (qui est spécifiée par `ORDER BY` clause). Ainsi dans la plupart des cas il n'est pas nécessaire de spécifier un `PRIMARY KEY` clause. + +- `SAMPLE BY` — An expression for sampling. + + Si un échantillonnage expression est utilisée, la clé primaire doit contenir. Exemple: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`. + +- `TTL` — A list of rules specifying storage duration of rows and defining logic of automatic parts movement [entre disques et volumes](#table_engine-mergetree-multiple-volumes). + + L'Expression doit en avoir une `Date` ou `DateTime` colonne comme un résultat. Exemple: + `TTL date + INTERVAL 1 DAY` + + Le Type de la règle `DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'` spécifie une action à effectuer avec la partie si l'expression est satisfaite (atteint l'heure actuelle): suppression des Lignes expirées, déplacement d'une partie (si l'expression est satisfaite pour toutes les lignes d'une partie) sur le disque spécifié (`TO DISK 'xxx'`) ou de volume (`TO VOLUME 'xxx'`). Le type par défaut de la règle est suppression (`DELETE`). Liste de règles multiples peut spécifié, mais il ne devrait pas y avoir plus d'un `DELETE` règle. + + Pour plus de détails, voir [TTL pour les colonnes et les tableaux](#table_engine-mergetree-ttl) + +- `SETTINGS` — Additional parameters that control the behavior of the `MergeTree`: + + - `index_granularity` — Maximum number of data rows between the marks of an index. Default value: 8192. See [Le Stockage De Données](#mergetree-data-storage). + - `index_granularity_bytes` — Maximum size of data granules in bytes. Default value: 10Mb. To restrict the granule size only by number of rows, set to 0 (not recommended). See [Le Stockage De Données](#mergetree-data-storage). + - `enable_mixed_granularity_parts` — Enables or disables transitioning to control the granule size with the `index_granularity_bytes` paramètre. Avant la version 19.11, il n'y avait que le `index_granularity` réglage pour restreindre la taille des granules. Le `index_granularity_bytes` le paramètre améliore les performances de ClickHouse lors de la sélection de données à partir de tables avec de grandes lignes (des dizaines et des centaines de mégaoctets). Si vous avez des tables avec de grandes lignes, vous pouvez activer ce paramètre pour les tables d'améliorer l'efficacité de `SELECT` requête. + - `use_minimalistic_part_header_in_zookeeper` — Storage method of the data parts headers in ZooKeeper. If `use_minimalistic_part_header_in_zookeeper=1`, puis Zookeeper stocke moins de données. Pour plus d'informations, voir le [Description du réglage](../server_settings/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) dans “Server configuration parameters”. + - `min_merge_bytes_to_use_direct_io` — The minimum data volume for merge operation that is required for using direct I/O access to the storage disk. When merging data parts, ClickHouse calculates the total storage volume of all the data to be merged. If the volume exceeds `min_merge_bytes_to_use_direct_io` octets, ClickHouse lit et écrit les données sur le disque de stockage en utilisant l'interface d'E/S directe (`O_DIRECT` option). Si `min_merge_bytes_to_use_direct_io = 0`, puis les e/s directes sont désactivées. Valeur par défaut: `10 * 1024 * 1024 * 1024` octet. + + - `merge_with_ttl_timeout` — Minimum delay in seconds before repeating a merge with TTL. Default value: 86400 (1 day). + - `write_final_mark` — Enables or disables writing the final index mark at the end of data part (after the last byte). Default value: 1. Don't turn it off. + - `merge_max_block_size` — Maximum number of rows in block for merge operations. Default value: 8192. + - `storage_policy` — Storage policy. See [Utilisation de plusieurs périphériques de bloc pour le stockage de données](#table_engine-mergetree-multiple-volumes). + +**Exemple de réglage des Sections** + +``` sql +ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192 +``` + +Dans l'exemple, nous définissons le partitionnement par mois. + +Nous définissons également une expression pour l'échantillonnage en tant que hachage par l'ID utilisateur. Cela vous permet de pseudorandomiser les données dans la table pour chaque `CounterID` et `EventDate`. Si vous définissez un [SAMPLE](../../query_language/select.md#select-sample-clause) clause lors de la sélection des données, ClickHouse retournera un échantillon de données uniformément pseudo-aléatoire pour un sous-ensemble d'utilisateurs. + +Le `index_granularity` paramètre peut être omis, car 8192 est la valeur par défaut. + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets. Si possible, optez anciens projets à la méthode décrite ci-dessus. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] MergeTree(date-column [, sampling_expression], (primary, key), index_granularity) +``` + +**Paramètres MergeTree ()** + +- `date-column` — The name of a column of the [Date](../../data_types/date.md) type. ClickHouse crée automatiquement des partitions par mois en fonction de cette colonne. Les noms de partition sont dans le `"YYYYMM"` format. +- `sampling_expression` — An expression for sampling. +- `(primary, key)` — Primary key. Type: [Tuple()](../../data_types/tuple.md) +- `index_granularity` — The granularity of an index. The number of data rows between the “marks” d'un index. La valeur 8192 est appropriée pour la plupart des tâches. + +**Exemple** + +``` sql +MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192) +``` + +Le `MergeTree` le moteur est configuré de la même manière que dans l'exemple ci-dessus pour la méthode de configuration du moteur principal. +
+ +## Le Stockage De Données {#mergetree-data-storage} + +Une table se compose de parties de données triées par clé primaire. + +Lorsque des données sont insérées dans une table, des parties de données distinctes sont créées et chacune d'elles est lexicographiquement triée par clé primaire. Par exemple, si la clé primaire est `(CounterID, Date)`, les données de la pièce sont triées par `CounterID` et au sein de chaque `CounterID` il est commandé par `Date`. + +Les données appartenant à différentes partitions sont séparés en différentes parties. En arrière-plan, ClickHouse fusionne des parties de données pour un stockage plus efficace. Les parties appartenant à des partitions différentes ne sont pas fusionnées. La fusion mécanisme ne garantit pas que toutes les lignes avec la même clé primaire sera dans la même partie des données. + +Chaque partie de données est logiquement divisée en granules. Un granule est le plus petit ensemble de données indivisible que ClickHouse lit lors de la sélection des données. ClickHouse ne divise pas les lignes ou les valeurs, de sorte que chaque granule contient toujours un nombre entier de lignes. La première rangée de granules est marqué avec la valeur de la clé primaire de la ligne. Pour chaque partie de données, ClickHouse crée un fichier d'index qui stocke les marques. Pour chaque colonne, que ce soit dans la clé primaire ou non, ClickHouse stocke également les mêmes marques. Ces marques vous permettent de trouver des données directement dans les fichiers de colonnes. + +La taille de granule est limitée par `index_granularity` et `index_granularity_bytes` paramètres du moteur de table. Le nombre de lignes dans un granule jette dans la `[1, index_granularity]` gamme, en fonction de la taille des lignes. La taille des granulés peut dépasser `index_granularity_bytes` si la taille d'une seule ligne est supérieure à la valeur du paramètre. Dans ce cas, la taille du granule est égale à la taille de la ligne. + +## Clés primaires et Index dans les requêtes {#primary-keys-and-indexes-in-queries} + +Prendre la `(CounterID, Date)` clé primaire comme un exemple. Dans ce cas, le tri et l'index peuvent être illustrés comme suit: + + Whole data: [-------------------------------------------------------------------------] + CounterID: [aaaaaaaaaaaaaaaaaabbbbcdeeeeeeeeeeeeefgggggggghhhhhhhhhiiiiiiiiikllllllll] + Date: [1111111222222233331233211111222222333211111112122222223111112223311122333] + Marks: | | | | | | | | | | | + a,1 a,2 a,3 b,3 e,2 e,3 g,1 h,2 i,1 i,3 l,3 + Marks numbers: 0 1 2 3 4 5 6 7 8 9 10 + +Si la requête de données spécifie: + +- `CounterID in ('a', 'h')` le serveur lit les données dans les gammes des marques `[0, 3)` et `[6, 8)`. +- `CounterID IN ('a', 'h') AND Date = 3` le serveur lit les données dans les gammes des marques `[1, 3)` et `[7, 8)`. +- `Date = 3`, le serveur lit les données de la plage de marque `[1, 10]`. + +Les exemples ci-dessus montrent qu'il est toujours plus efficace d'utiliser un indice qu'une analyse complète. + +Un index clairsemé permet de lire des données supplémentaires. Lors de la lecture d'une plage unique de la clé primaire, jusqu'à `index_granularity * 2` lignes supplémentaires dans chaque bloc de données peut être lu. + +Les index clairsemés vous permettent de travailler avec un très grand nombre de lignes de table, car dans la plupart des cas, ces index tiennent dans la RAM de l'ordinateur. + +ClickHouse ne nécessite pas de clé primaire unique. Vous pouvez insérer plusieurs lignes avec la même clé primaire. + +### Sélection de la clé primaire {#selecting-the-primary-key} + +Le nombre de colonnes de la clé primaire n'est pas explicitement limitée. Selon la structure de données, vous pouvez inclure plus ou moins de colonnes dans la clé primaire. Cela peut: + +- Améliorer la performance d'un indice. + + Si la clé primaire est `(a, b)`, puis ajouter une autre colonne `c` pour améliorer les performances si les conditions suivantes sont réunies: + + - Il y a des requêtes avec une condition sur la colonne `c`. + - Longues plages de données (plusieurs fois plus longues que `index_granularity`) avec des valeurs identiques pour `(a, b)` sont communs. En d'autres termes, lors de l'ajout d'une autre colonne vous permet de passer très longues plages de données. + +- Améliorer la compression des données. + + ClickHouse trie les données par clé primaire, donc plus la cohérence est élevée, meilleure est la compression. + +- Fournir une logique supplémentaire lors de la fusion de parties de [CollapsingMergeTree](collapsingmergetree.md#table_engine-collapsingmergetree) et [SummingMergeTree](summingmergetree.md) moteur. + + Dans ce cas, on peut spécifier l' *clé de tri* qui est différente de la clé primaire. + +Une clé primaire longue affectera négativement les performances d'insertion et la consommation de mémoire, mais des colonnes supplémentaires dans la clé primaire n'affecteront pas les performances de ClickHouse pendant `SELECT` requête. + +### Choisir une clé primaire qui diffère de la clé de tri {#choosing-a-primary-key-that-differs-from-the-sorting-key} + +Il est possible de spécifier une clé primaire (une expression avec des valeurs qui sont écrites dans le fichier d'index pour chaque marque) qui est différente de la clé de tri (une expression pour trier les lignes dans les parties de données). Dans ce cas, le tuple d'expression de clé primaire doit être un préfixe du tuple d'expression de clé de tri. + +Cette fonctionnalité est utile lorsque vous utilisez le [SummingMergeTree](summingmergetree.md) et +[AggregatingMergeTree](aggregatingmergetree.md) table des moteurs. Dans un cas courant lors de l'utilisation de ces moteurs, la table a deux types de colonnes: *dimension* et *mesure*. Les requêtes typiques agrégent les valeurs des colonnes de mesure avec arbitraire `GROUP BY` et filtrage par dimensions. Comme SummingMergeTree et AggregatingMergeTree regroupent des lignes avec la même valeur de la clé de tri, il est naturel d'y ajouter toutes les dimensions. En conséquence, l'expression se compose d'une longue liste de colonnes, et cette liste doit être mise à jour fréquemment avec nouvellement ajoutée. + +Dans ce cas, il est logique de ne laisser que quelques colonnes dans la clé primaire qui fourniront des analyses de plage efficaces et ajouteront les colonnes de dimension restantes au tuple de clé de tri. + +[ALTER](../../query_language/alter.md) la clé de tri est une opération légère car lorsqu'une nouvelle colonne est ajoutée simultanément à la table et à la clé de tri, les parties de données existantes n'ont pas besoin d'être modifiées. Comme l'ancienne clé de tri est un préfixe de la nouvelle clé de tri et qu'il n'y a pas de données dans la colonne nouvellement ajoutée, les données sont triées à la fois par l'ancienne et la nouvelle clé de tri au moment de la modification de la table. + +### Utilisation D'Index et de Partitions dans les requêtes {#use-of-indexes-and-partitions-in-queries} + +Pour `SELECT` requêtes, clickhouse analyse si un index peut être utilisé. Un index peut être utilisé si le `WHERE/PREWHERE` clause a une expression (comme l'un des éléments de conjonction, ou entièrement) qui représente une opération de comparaison d'égalité ou d'inégalité, ou si elle a `IN` ou `LIKE` avec un préfixe fixe sur les colonnes ou les expressions qui sont dans la clé primaire ou la clé de partitionnement, ou sur certaines fonctions partiellement répétitives de ces colonnes, ou les relations logiques de ces expressions. + +Ainsi, il est possible d'exécuter des requêtes sur une ou plusieurs plages de la clé primaire. Dans cet exemple, les requêtes seront rapides lorsqu'elles sont exécutées pour une balise de suivi spécifique, pour une balise et une plage de dates spécifiques, pour une balise et une date spécifiques, pour plusieurs balises avec une plage de dates, etc. + +Regardons le moteur configuré comme suit: + + ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate) SETTINGS index_granularity=8192 + +Dans ce cas, dans les requêtes: + +``` sql +SELECT count() FROM table WHERE EventDate = toDate(now()) AND CounterID = 34 +SELECT count() FROM table WHERE EventDate = toDate(now()) AND (CounterID = 34 OR CounterID = 42) +SELECT count() FROM table WHERE ((EventDate >= toDate('2014-01-01') AND EventDate <= toDate('2014-01-31')) OR EventDate = toDate('2014-05-01')) AND CounterID IN (101500, 731962, 160656) AND (CounterID = 101500 OR EventDate != toDate('2014-05-01')) +``` + +ClickHouse utilisera l'index de clé primaire pour supprimer les données incorrectes et la clé de partitionnement mensuel pour supprimer les partitions qui se trouvent dans des plages de dates incorrectes. + +Les requêtes ci-dessus montrent que l'index est utilisé même pour les expressions complexes. La lecture de la table est organisée de sorte que l'utilisation de l'index ne peut pas être plus lente qu'une analyse complète. + +Dans l'exemple ci-dessous, l'index ne peut pas être utilisé. + +``` sql +SELECT count() FROM table WHERE CounterID = 34 OR URL LIKE '%upyachka%' +``` + +Pour vérifier si ClickHouse pouvez utiliser l'index lors de l'exécution d'une requête, utilisez les paramètres [force\_index\_by\_date](../settings/settings.md#settings-force_index_by_date) et [force\_primary\_key](../settings/settings.md). + +La clé de partitionnement par mois permet de lire uniquement les blocs de données qui contiennent des dates de la plage appropriée. Dans ce cas, le bloc de données peut contenir des données pour plusieurs dates (jusqu'à un mois entier). Dans un bloc, les données sont triées par clé primaire, qui peut ne pas contenir la date comme première colonne. Pour cette raison, l'utilisation d'une requête avec seulement une condition de date qui ne spécifie pas le préfixe de clé primaire entraînera la lecture de plus de données que pour une seule date. + +### Utilisation de L'Index pour les clés primaires partiellement monotones {#use-of-index-for-partially-monotonic-primary-keys} + +Considérons, par exemple, les jours du mois. Ils forment un [monotone de la séquence](https://en.wikipedia.org/wiki/Monotonic_function) pendant un mois, mais pas monotone pendant des périodes plus longues. C'est une séquence partiellement monotone. Si un utilisateur crée la table avec une clé primaire partiellement monotone, ClickHouse crée un index clairsemé comme d'habitude. Lorsqu'un utilisateur sélectionne des données à partir de ce type de table, ClickHouse analyse les conditions de requête. Si L'utilisateur veut obtenir des données entre deux marques de l'index et que ces deux marques tombent dans un mois, ClickHouse peut utiliser l'index dans ce cas particulier car il peut calculer la distance entre les paramètres d'une requête et les marques d'index. + +ClickHouse ne peut pas utiliser un index si les valeurs de la clé primaire dans la plage de paramètres de requête ne représentent pas une séquence monotone. Dans ce cas, ClickHouse utilise la méthode full scan. + +ClickHouse utilise cette logique non seulement pour les séquences de jours du mois, mais pour toute clé primaire qui représente une séquence partiellement monotone. + +### Index De Saut De Données (Expérimental) {#table_engine-mergetree-data_skipping-indexes} + +La déclaration d'index se trouve dans la section colonnes du `CREATE` requête. + +``` sql +INDEX index_name expr TYPE type(...) GRANULARITY granularity_value +``` + +Pour les tables de la `*MergeTree` famille, les indices de saut de données peuvent être spécifiés. + +Ces indices agrégent certaines informations sur l'expression spécifiée sur les blocs, qui consistent en `granularity_value` granules (la taille du granule est spécifiée en utilisant `index_granularity` réglage dans le moteur de table). Ensuite, ces agrégats sont utilisés dans `SELECT` requêtes pour réduire la quantité de données à lire à partir du disque en ignorant de gros blocs de données `where` la requête ne peut pas être satisfait. + +**Exemple** + +``` sql +CREATE TABLE table_name +( + u64 UInt64, + i32 Int32, + s String, + ... + INDEX a (u64 * i32, s) TYPE minmax GRANULARITY 3, + INDEX b (u64 * length(s)) TYPE set(1000) GRANULARITY 4 +) ENGINE = MergeTree() +... +``` + +Les Indices de L'exemple peuvent être utilisés par ClickHouse pour réduire la quantité de données à lire à partir du disque dans les requêtes suivantes: + +``` sql +SELECT count() FROM table WHERE s < 'z' +SELECT count() FROM table WHERE u64 * i32 == 10 AND u64 * length(s) >= 1234 +``` + +#### Types d'Indices disponibles {#available-types-of-indices} + +- `minmax` + + Magasins extrêmes de l'expression spécifiée (si l'expression est `tuple` puis il stocke les extrêmes pour chaque élément de `tuple`), utilise les informations stockées pour sauter des blocs de données comme la clé primaire. + +- `set(max_rows)` + + Stocke les valeurs uniques de l'expression spécifiée (pas plus de `max_rows` rangée, `max_rows=0` moyen “no limits”). Utilise les valeurs pour vérifier si le `WHERE` l'expression n'est pas satisfiable sur un bloc de données. + +- `ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)` + + Magasins un [Filtre de Bloom](https://en.wikipedia.org/wiki/Bloom_filter) qui contient tous les ngrams d'un bloc de données. Fonctionne uniquement avec des chaînes. Peut être utilisé pour l'optimisation de `equals`, `like` et `in` expression. + + - `n` — ngram size, + - `size_of_bloom_filter_in_bytes` — Bloom filter size in bytes (you can use large values here, for example, 256 or 512, because it can be compressed well). + - `number_of_hash_functions` — The number of hash functions used in the Bloom filter. + - `random_seed` — The seed for Bloom filter hash functions. + +- `tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)` + + Le même que `ngrambf_v1`, mais stocke des jetons au lieu de ngrams. Les jetons sont des séquences séparées par des caractères non alphanumériques. + +- `bloom_filter([false_positive])` — Stores a [Filtre de Bloom](https://en.wikipedia.org/wiki/Bloom_filter) pour les colonnes spécifiées. + + Facultatif `false_positive` le paramètre est la probabilité de recevoir une réponse faussement positive du filtre. Valeurs possibles: (0, 1). Valeur par défaut: 0.025. + + Types de données pris en charge: `Int*`, `UInt*`, `Float*`, `Enum`, `Date`, `DateTime`, `String`, `FixedString`, `Array`, `LowCardinality`, `Nullable`. + + Les fonctions suivantes peuvent l'utiliser: [égal](../../query_language/functions/comparison_functions.md), [notEquals](../../query_language/functions/comparison_functions.md), [dans](../../query_language/functions/in_functions.md), [notIn](../../query_language/functions/in_functions.md), [avoir](../../query_language/functions/array_functions.md). + + + +``` sql +INDEX sample_index (u64 * length(s)) TYPE minmax GRANULARITY 4 +INDEX sample_index2 (u64 * length(str), i32 + f64 * 100, date, str) TYPE set(100) GRANULARITY 4 +INDEX sample_index3 (lower(str), str) TYPE ngrambf_v1(3, 256, 2, 0) GRANULARITY 4 +``` + +#### Les Fonctions De Soutien {#functions-support} + +Les Conditions dans le `WHERE` la clause contient des appels des fonctions qui fonctionnent avec des colonnes. Si la colonne fait partie d'un index, ClickHouse essaie d'utiliser cet index lors de l'exécution des fonctions. ClickHouse prend en charge différents sous-ensembles de fonctions pour l'utilisation d'index. + +Le `set` l'indice peut être utilisé avec toutes les fonctions. Les sous-ensembles de fonctions pour les autres index sont présentés dans le tableau ci-dessous. + +| Fonction (opérateur) / Indice de | clé primaire | minmax | ngrambf\_v1 | tokenbf\_v1 | bloom\_filter | +|------------------------------------------------------------------------------------------------------------|--------------|--------|-------------|-------------|---------------| +| [égal (=, ==)](../../query_language/functions/comparison_functions.md#function-equals) | ✔ | ✔ | ✔ | ✔ | ✔ | +| [notEquals (!= , \<\>)](../../query_language/functions/comparison_functions.md#function-notequals) | ✔ | ✔ | ✔ | ✔ | ✔ | +| [comme](../../query_language/functions/string_search_functions.md#function-like) | ✔ | ✔ | ✔ | ✗ | ✗ | +| [notLike](../../query_language/functions/string_search_functions.md#function-notlike) | ✔ | ✔ | ✔ | ✗ | ✗ | +| [startsWith](../../query_language/functions/string_functions.md#startswith) | ✔ | ✔ | ✔ | ✔ | ✗ | +| [endsWith](../../query_language/functions/string_functions.md#endswith) | ✗ | ✗ | ✔ | ✔ | ✗ | +| [multiSearchAny](../../query_language/functions/string_search_functions.md#function-multisearchany) | ✗ | ✗ | ✔ | ✗ | ✗ | +| [dans](../../query_language/functions/in_functions.md#in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | +| [notIn](../../query_language/functions/in_functions.md#in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | +| [peu (\<)](../../query_language/functions/comparison_functions.md#function-less) | ✔ | ✔ | ✗ | ✗ | ✗ | +| [grand (\>)](../../query_language/functions/comparison_functions.md#function-greater) | ✔ | ✔ | ✗ | ✗ | ✗ | +| [lessOrEquals (\<=)](../../query_language/functions/comparison_functions.md#function-lessorequals) | ✔ | ✔ | ✗ | ✗ | ✗ | +| [greaterOrEquals ( \> =)](../../query_language/functions/comparison_functions.md#function-greaterorequals) | ✔ | ✔ | ✗ | ✗ | ✗ | +| [vide](../../query_language/functions/array_functions.md#function-empty) | ✔ | ✔ | ✗ | ✗ | ✗ | +| [notEmpty](../../query_language/functions/array_functions.md#function-notempty) | ✔ | ✔ | ✗ | ✗ | ✗ | +| hasToken | ✗ | ✗ | ✗ | ✔ | ✗ | + +Les fonctions avec un argument constant inférieur à la taille ngram ne peuvent pas être utilisées par `ngrambf_v1` pour l'optimisation de la requête. + +Les filtres Bloom peuvent avoir des correspondances faussement positives, de sorte que le `ngrambf_v1`, `tokenbf_v1`, et `bloom_filter` les index ne peuvent pas être utilisés pour optimiser les requêtes où le résultat d'une fonction est censé être faux, par exemple: + +- Peut être optimisé: + - `s LIKE '%test%'` + - `NOT s NOT LIKE '%test%'` + - `s = 1` + - `NOT s != 1` + - `startsWith(s, 'test')` +- Ne peut pas être optimisé: + - `NOT s LIKE '%test%'` + - `s NOT LIKE '%test%'` + - `NOT s = 1` + - `s != 1` + - `NOT startsWith(s, 'test')` + +## Accès Simultané Aux Données {#concurrent-data-access} + +Pour l'accès aux tables simultanées, nous utilisons le multi-versioning. En d'autres termes, lorsqu'une table est lue et mise à jour simultanément, les données sont lues à partir d'un ensemble de parties en cours au moment de la requête. Il n'y a pas de longues mèches. Les Inserts ne gênent pas les opérations de lecture. + +Lecture à partir d'un tableau est automatiquement parallélisée. + +## TTL pour les colonnes et les tableaux {#table_engine-mergetree-ttl} + +Détermine la durée de vie de des valeurs. + +Le `TTL` clause peut être définie pour la table entière et pour chaque colonne individuelle. Ttl de niveau Table peut également spécifier la logique de déplacement automatique des données entre les disques et les volumes. + +Les Expressions doivent évaluer pour [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md) type de données. + +Exemple: + +``` sql +TTL time_column +TTL time_column + interval +``` + +Définir `interval`, utiliser [intervalle](../../query_language/operators.md#operators-datetime) opérateur. + +``` sql +TTL date_time + INTERVAL 1 MONTH +TTL date_time + INTERVAL 15 HOUR +``` + +### Colonne TTL {#mergetree-column-ttl} + +Lorsque les valeurs de la colonne expirent, ClickHouse les remplace par les valeurs par défaut du type de données de la colonne. Si toutes les valeurs de colonne de la partie données expirent, ClickHouse supprime cette colonne de la partie données d'un système de fichiers. + +Le `TTL` la clause ne peut pas être utilisée pour les colonnes clés. + +Exemple: + +Création d'une table avec TTL + +``` sql +CREATE TABLE example_table +( + d DateTime, + a Int TTL d + INTERVAL 1 MONTH, + b Int TTL d + INTERVAL 1 MONTH, + c String +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(d) +ORDER BY d; +``` + +Ajout de TTL à une colonne d'une table existante + +``` sql +ALTER TABLE example_table + MODIFY COLUMN + c String TTL d + INTERVAL 1 DAY; +``` + +Modification de TTL de la colonne + +``` sql +ALTER TABLE example_table + MODIFY COLUMN + c String TTL d + INTERVAL 1 MONTH; +``` + +### Tableau TTL {#mergetree-table-ttl} + +Table peut avoir une expression pour la suppression de Lignes expirées, et plusieurs expressions pour le déplacement automatique de pièces entre [disques ou volumes](#table_engine-mergetree-multiple-volumes). Lorsque les lignes de la table expirent, ClickHouse supprime toutes les lignes correspondantes. Pour les pièces en mouvement, toutes les lignes d'une pièce doivent satisfaire aux critères d'expression de mouvement. + +``` sql +TTL expr [DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'], ... +``` + +Type de règle TTL peut suivre chaque expression TTL. Il affecte une action qui doit être faite une fois que l'expression est satisfaite (atteint l'heure actuelle): + +- `DELETE` - supprimer les Lignes expirées (action par défaut); +- `TO DISK 'aaa'` - déplacer la partie sur le disque `aaa`; +- `TO VOLUME 'bbb'` - déplacer la partie sur le disque `bbb`. + +Exemple: + +Création d'une table avec TTL + +``` sql +CREATE TABLE example_table +( + d DateTime, + a Int +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(d) +ORDER BY d +TTL d + INTERVAL 1 MONTH [DELETE], + d + INTERVAL 1 WEEK TO VOLUME 'aaa', + d + INTERVAL 2 WEEK TO DISK 'bbb'; +``` + +Modification de TTL de la table + +``` sql +ALTER TABLE example_table + MODIFY TTL d + INTERVAL 1 DAY; +``` + +**Suppression De Données** + +Les données avec un TTL expiré sont supprimées lorsque ClickHouse fusionne des parties de données. + +Lorsque ClickHouse voit que les données sont expirées, il effectue une fusion hors calendrier. Pour contrôler la fréquence de ces fusions, vous pouvez définir [merge\_with\_ttl\_timeout](#mergetree_setting-merge_with_ttl_timeout). Si la valeur est trop faible, il effectuera de nombreuses fusions hors calendrier qui peuvent consommer beaucoup de ressources. + +Si vous effectuez la `SELECT` requête entre les fusionne, vous pouvez obtenir des données expirées. Pour éviter cela, utilisez la [OPTIMIZE](../../query_language/misc.md#misc_operations-optimize) requête avant de l' `SELECT`. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/mergetree/) + +## Utilisation de plusieurs périphériques de bloc pour le stockage de données {#table_engine-mergetree-multiple-volumes} + +### Introduction {#introduction} + +`MergeTree` les moteurs de table de famille peuvent stocker des données sur plusieurs périphériques de bloc. Par exemple, il peut être utile lorsque les données d'un tableau sont implicitement divisé en “hot” et “cold”. Les données les plus récentes sont régulièrement demandées mais ne nécessitent qu'une petite quantité d'espace. Au contraire, les données historiques à queue grasse sont rarement demandées. Si plusieurs disques sont disponibles, la “hot” les données peuvent être situées sur des disques rapides (par exemple, SSD NVMe ou en mémoire), tandis que le “cold” des données relativement lente (par exemple, disque dur). + +La partie de données est l'unité mobile minimum pour `MergeTree`-tables de moteur. Les données appartenant à une partie sont stockées sur un disque. Les parties de données peuvent être déplacées entre les disques en arrière-plan (selon les paramètres de l'utilisateur) ainsi qu'au moyen du [ALTER](../../query_language/alter.md#alter_move-partition) requête. + +### Terme {#terms} + +- Disk — Block device mounted to the filesystem. +- Default disk — Disk that stores the path specified in the [chemin](../server_settings/settings.md#server_settings-path) paramètre de serveur. +- Volume — Ordered set of equal disks (similar to [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures)). +- Storage policy — Set of volumes and the rules for moving data between them. + +Les noms donnés aux entités décrites peuvent être trouvés dans les tables système, [système.storage\_policies](../system_tables.md#system_tables-storage_policies) et [système.disque](../system_tables.md#system_tables-disks). Pour appliquer l'une des stratégies de stockage configurées pour une table, utilisez `storage_policy` réglage de `MergeTree`-moteur de table de famille. + +### Configuration {#table_engine-mergetree-multiple-volumes-configure} + +Les disques, les volumes et les stratégies de stockage doivent être déclarés `` étiquette, soit dans le fichier principal `config.xml` ou dans un fichier distinct dans le `config.d` répertoire. + +Structure de Configuration: + +``` xml + + + + /mnt/fast_ssd/clickhouse + + + /mnt/hdd1/clickhouse + 10485760 + + + /mnt/hdd2/clickhouse + 10485760 + + + ... + + + ... + +``` + +Balise: + +- `` — Disk name. Names must be different for all disks. +- `path` — path under which a server will store data (`data` et `shadow` des dossiers), doit être terminé par ‘/’. +- `keep_free_space_bytes` — the amount of free disk space to be reserved. + +L'ordre du disque définition n'est pas important. + +Stratégies de stockage balisage de configuration: + +``` xml + + ... + + + + + disk_name_from_disks_configuration + 1073741824 + + + + + + + 0.2 + + + + + + + + ... + +``` + +Balise: + +- `policy_name_N` — Policy name. Policy names must be unique. +- `volume_name_N` — Volume name. Volume names must be unique. +- `disk` — a disk within a volume. +- `max_data_part_size_bytes` — the maximum size of a part that can be stored on any of the volume's disks. +- `move_factor` — when the amount of available space gets lower than this factor, data automatically start to move on the next volume if any (by default, 0.1). + +Exemples de Cofiguration: + +``` xml + + ... + + + + + disk1 + disk2 + + + + + + + + fast_ssd + 1073741824 + + + disk1 + + + 0.2 + + + ... + +``` + +Dans l'exemple donné, la `hdd_in_order` politique met en œuvre les [round-robin](https://en.wikipedia.org/wiki/Round-robin_scheduling) approche. Ainsi cette politique ne définit qu'un seul volume (`single`), les parties des données sont stockées sur tous ses disques dans l'ordre circulaire. Une telle politique peut être très utile s'il y a plusieurs disques similaires sont montés sur le système, mais RAID N'est pas configuré. Gardez à l'esprit que chaque lecteur de disque n'est pas fiable et vous pouvez compenser avec facteur de réplication de 3 ou plus. + +S'il existe différents types de disques disponibles dans le système, `moving_from_ssd_to_hdd` la stratégie peut être utilisée à la place. Volume `hot` se compose d'un disque SSD (`fast_ssd`), et la taille maximale d'une pièce qui peut être stocké sur ce volume est de 1 go. Toutes les pièces avec la taille plus grande que 1 GB sera stocké directement sur le `cold` le volume, qui contient un disque dur de disque `disk1`. +Aussi, une fois le disque `fast_ssd` est complété par plus de 80%, les données seront transférées à la `disk1` par un processus d'arrière-plan. + +L'ordre d'énumération des volumes dans une stratégie de stockage est important. Une fois qu'un volume est surchargé, les données sont déplacées vers le suivant. L'ordre d'énumération des disques est important parce que les données sont stockées dans les virages. + +Lors de la création d'une table, on peut lui appliquer l'une des stratégies de stockage configurées: + +``` sql +CREATE TABLE table_with_non_default_policy ( + EventDate Date, + OrderID UInt64, + BannerID UInt64, + SearchPhrase String +) ENGINE = MergeTree +ORDER BY (OrderID, BannerID) +PARTITION BY toYYYYMM(EventDate) +SETTINGS storage_policy = 'moving_from_ssd_to_hdd' +``` + +Le `default` la Politique de stockage implique d'utiliser un seul volume, qui se compose d'un seul disque donné dans ``. Une fois qu'une table est créée, sa stratégie de stockage ne peut pas être modifiée. + +### Détail {#details} + +Dans le cas de `MergeTree` les tableaux, les données sont sur le disque de différentes façons: + +- En tant que résultat d'un insert (`INSERT` requête). +- En arrière-plan fusionne et [mutation](../../query_language/alter.md#alter-mutations). +- Lors du téléchargement à partir d'une autre réplique. +- À la suite du gel de la partition [ALTER TABLE … FREEZE PARTITION](../../query_language/alter.md#alter_freeze-partition). + +Dans tous ces cas, à l'exception des mutations et du gel de partition, une pièce est stockée sur un volume et un disque selon la Politique de stockage donnée: + +1. Le premier volume (dans l'ordre de définition) qui a suffisamment d'espace disque pour stocker une pièce (`unreserved_space > current_part_size`) et permet de stocker des pièces d'une taille donnée (`max_data_part_size_bytes > current_part_size`) est choisi. +2. Dans ce volume, ce disque est choisi qui suit celui, qui a été utilisé pour stocker le bloc de données précédent, et qui a de l'espace libre plus que la taille de la pièce (`unreserved_space - keep_free_space_bytes > current_part_size`). + +Sous le capot, les mutations et la congélation des cloisons utilisent [des liens en dur](https://en.wikipedia.org/wiki/Hard_link). Les liens durs entre différents disques ne sont pas pris en charge, donc dans de tels cas, les pièces résultantes sont stockées sur les mêmes disques que les disques initiaux. + +En arrière - plan, les pièces sont déplacées entre les volumes en fonction de la quantité d'espace libre (`move_factor` paramètre) selon l'ordre les volumes sont déclarées dans le fichier de configuration. +Les données ne sont jamais transférées du dernier et dans le premier. On peut utiliser des tables système [système.part\_log](../system_tables.md#system_tables-part-log) (champ `type = MOVE_PART`) et [système.partie](../system_tables.md#system_tables-parts) (Fields `path` et `disk`) pour surveiller l'arrière-plan se déplace. Aussi, les informations détaillées peuvent être trouvées dans les journaux du serveur. + +L'utilisateur peut forcer le déplacement d'une partie ou d'une partition d'un volume à l'autre à l'aide de la requête [ALTER TABLE … MOVE PART\|PARTITION … TO VOLUME\|DISK …](../../query_language/alter.md#alter_move-partition), toutes les restrictions pour les opérations de fond sont prises en compte. La requête initie un mouvement seul et n'attend pas que les opérations d'arrière-plan soient terminées. L'utilisateur recevra un message d'erreur si pas assez d'espace libre est disponible ou si l'une des conditions requises ne sont pas remplies. + +Le déplacement des données n'interfère pas avec la réplication des données. Par conséquent, différentes stratégies de stockage peuvent être spécifiées pour la même table sur différents réplicas. + +Après l'achèvement des fusions d'arrière-plan et des mutations, les anciennes parties ne sont supprimées qu'après un certain temps (`old_parts_lifetime`). +Pendant ce temps, ils ne sont pas déplacés vers d'autres volumes ou des disques. Par conséquent, jusqu'à ce que les pièces soient finalement supprimées, elles sont toujours prises en compte pour l'évaluation de l'espace disque occupé. + +[Article Original](https://clickhouse.tech/docs/ru/operations/table_engines/mergetree/) diff --git a/docs/fr/operations/table_engines/mysql.md b/docs/fr/operations/table_engines/mysql.md new file mode 100644 index 00000000000..1ae36126221 --- /dev/null +++ b/docs/fr/operations/table_engines/mysql.md @@ -0,0 +1,102 @@ +--- +machine_translated: true +--- + +# MySQL {#mysql} + +Le moteur MySQL vous permet d'effectuer `SELECT` requêtes sur les données stockées sur un serveur MySQL distant. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], + ... +) ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']); +``` + +Voir une description détaillée de la [CREATE TABLE](../../query_language/create.md#create-table-query) requête. + +La structure de la table peut différer de la structure de la table MySQL d'origine: + +- Les noms de colonnes doivent être les mêmes que dans la table MySQL d'origine, mais vous pouvez utiliser seulement certaines de ces colonnes et dans n'importe quel ordre. +- Les types de colonnes peuvent différer de ceux de la table MySQL d'origine. ClickHouse essaie de [jeter](../../query_language/functions/type_conversion_functions.md#type_conversion_function-cast) valeurs des types de données ClickHouse. + +**Les Paramètres Du Moteur** + +- `host:port` — MySQL server address. + +- `database` — Remote database name. + +- `table` — Remote table name. + +- `user` — MySQL user. + +- `password` — User password. + +- `replace_query` — Flag that converts `INSERT INTO` les requêtes de `REPLACE INTO`. Si `replace_query=1` la requête est substitué. + +- `on_duplicate_clause` — The `ON DUPLICATE KEY on_duplicate_clause` expression qui est ajoutée à la `INSERT` requête. + + Exemple: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1`, où `on_duplicate_clause` être `UPDATE c2 = c2 + 1`. Voir la [Documentation de MySQL](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html) pour trouver lequel `on_duplicate_clause` vous pouvez utiliser avec le `ON DUPLICATE KEY` clause. + + Spécifier `on_duplicate_clause` vous avez besoin de passer `0` à l' `replace_query` paramètre. Si vous passez simultanément `replace_query = 1` et `on_duplicate_clause`, Clickhouse génère une exception. + +Simple `WHERE` des clauses telles que `=, !=, >, >=, <, <=` sont exécutés sur le serveur MySQL. + +Le reste des conditions et le `LIMIT` les contraintes d'échantillonnage sont exécutées dans ClickHouse uniquement après la fin de la requête à MySQL. + +## Exemple D'Utilisation {#usage-example} + +Table dans MySQL: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++--------+--------------+-------+----------------+ +| int_id | int_nullable | float | float_nullable | ++--------+--------------+-------+----------------+ +| 1 | NULL | 2 | NULL | ++--------+--------------+-------+----------------+ +1 row in set (0,00 sec) +``` + +Table dans ClickHouse, récupération des données de la table MySQL créée ci-dessus: + +``` sql +CREATE TABLE mysql_table +( + `float_nullable` Nullable(Float32), + `int_id` Int32 +) +ENGINE = MySQL('localhost:3306', 'test', 'test', 'bayonet', '123') +``` + +``` sql +SELECT * FROM mysql_table +``` + +``` text +┌─float_nullable─┬─int_id─┐ +│ ᴺᵁᴸᴸ │ 1 │ +└────────────────┴────────┘ +``` + +## Voir Aussi {#see-also} + +- [Le ‘mysql’ fonction de table](../../query_language/table_functions/mysql.md) +- [Utilisation de MySQL comme source de dictionnaire externe](../../query_language/dicts/external_dicts_dict_sources.md#dicts-external_dicts_dict_sources-mysql) + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/mysql/) diff --git a/docs/fr/operations/table_engines/null.md b/docs/fr/operations/table_engines/null.md new file mode 100644 index 00000000000..99e0a5c7126 --- /dev/null +++ b/docs/fr/operations/table_engines/null.md @@ -0,0 +1,11 @@ +--- +machine_translated: true +--- + +# NULL {#null} + +Lors de l'écriture dans une table Null, Les données sont ignorées. Lors de la lecture à partir d'une table Null, la réponse est vide. + +Toutefois, vous pouvez créer une vue matérialisée sur une table Nuls. Ainsi, les données écrites dans la table finira dans la vue. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/null/) diff --git a/docs/fr/operations/table_engines/odbc.md b/docs/fr/operations/table_engines/odbc.md new file mode 100644 index 00000000000..f0433114ea1 --- /dev/null +++ b/docs/fr/operations/table_engines/odbc.md @@ -0,0 +1,129 @@ +--- +machine_translated: true +--- + +# ODBC {#table-engine-odbc} + +Permet à ClickHouse de se connecter à des bases de données externes via [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity). + +Pour implémenter en toute sécurité les connexions ODBC, ClickHouse utilise un programme distinct `clickhouse-odbc-bridge`. Si le pilote ODBC est chargé directement depuis `clickhouse-server`, les problèmes de pilote peuvent planter le serveur ClickHouse. Clickhouse démarre automatiquement `clickhouse-odbc-bridge` lorsque cela est nécessaire. Le programme ODBC bridge est installé à partir du même package que `clickhouse-server`. + +Ce moteur prend en charge le [Nullable](../../data_types/nullable.md) type de données. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1], + name2 [type2], + ... +) +ENGINE = ODBC(connection_settings, external_database, external_table) +``` + +Voir une description détaillée de la [CREATE TABLE](../../query_language/create.md#create-table-query) requête. + +La structure de la table peut différer de la structure de la table source: + +- Les noms de colonnes doivent être les mêmes que dans la table source, mais vous pouvez utiliser quelques-unes de ces colonnes et dans n'importe quel ordre. +- Les types de colonnes peuvent différer de ceux de la table source. ClickHouse essaie de [jeter](../../query_language/functions/type_conversion_functions.md#type_conversion_function-cast) valeurs des types de données ClickHouse. + +**Les Paramètres Du Moteur** + +- `connection_settings` — Name of the section with connection settings in the `odbc.ini` fichier. +- `external_database` — Name of a database in an external DBMS. +- `external_table` — Name of a table in the `external_database`. + +## Exemple D'Utilisation {#usage-example} + +**Récupération des données de L'installation MySQL locale via ODBC** + +Cet exemple est vérifié pour Ubuntu Linux 18.04 et MySQL server 5.7. + +Assurez-vous que unixODBC et MySQL Connector sont installés. + +Par défaut (si installé à partir de paquets), ClickHouse démarre en tant qu'utilisateur `clickhouse`. Ainsi, vous devez créer et configurer cet utilisateur dans le serveur MySQL. + +``` bash +$ sudo mysql +``` + +``` sql +mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse'; +mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'clickhouse' WITH GRANT OPTION; +``` + +Puis configurez la connexion dans `/etc/odbc.ini`. + +``` bash +$ cat /etc/odbc.ini +[mysqlconn] +DRIVER = /usr/local/lib/libmyodbc5w.so +SERVER = 127.0.0.1 +PORT = 3306 +DATABASE = test +USERNAME = clickhouse +PASSWORD = clickhouse +``` + +Vous pouvez vérifier la connexion en utilisant le `isql` utilitaire de l'installation unixODBC. + +``` bash +$ isql -v mysqlconn ++---------------------------------------+ +| Connected! | +| | +... +``` + +Table dans MySQL: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++--------+--------------+-------+----------------+ +| int_id | int_nullable | float | float_nullable | ++--------+--------------+-------+----------------+ +| 1 | NULL | 2 | NULL | ++--------+--------------+-------+----------------+ +1 row in set (0,00 sec) +``` + +Table dans ClickHouse, récupération des données de la table MySQL: + +``` sql +CREATE TABLE odbc_t +( + `int_id` Int32, + `float_nullable` Nullable(Float32) +) +ENGINE = ODBC('DSN=mysqlconn', 'test', 'test') +``` + +``` sql +SELECT * FROM odbc_t +``` + +``` text +┌─int_id─┬─float_nullable─┐ +│ 1 │ ᴺᵁᴸᴸ │ +└────────┴────────────────┘ +``` + +## Voir Aussi {#see-also} + +- [Dictionnaires externes ODBC](../../query_language/dicts/external_dicts_dict_sources.md#dicts-external_dicts_dict_sources-odbc) +- [Fonction de table ODBC](../../query_language/table_functions/odbc.md) + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/odbc/) diff --git a/docs/fr/operations/table_engines/replacingmergetree.md b/docs/fr/operations/table_engines/replacingmergetree.md new file mode 100644 index 00000000000..c947dd51b42 --- /dev/null +++ b/docs/fr/operations/table_engines/replacingmergetree.md @@ -0,0 +1,66 @@ +--- +machine_translated: true +--- + +# ReplacingMergeTree {#replacingmergetree} + +Le moteur diffère de [MergeTree](mergetree.md#table_engines-mergetree) en ce qu'il supprime les doublons avec la même valeur de clé primaire (ou, plus précisément, avec la même [clé de tri](mergetree.md) valeur). + +La déduplication des données se produit uniquement lors d'une fusion. La fusion se produit en arrière-plan à un moment inconnu, vous ne pouvez donc pas le planifier. Certaines des données peuvent rester non traitées. Bien que vous puissiez exécuter une fusion imprévue en utilisant le `OPTIMIZE` requête, ne comptez pas l'utiliser, parce que la `OPTIMIZE` requête va lire et écrire une grande quantité de données. + +Ainsi, `ReplacingMergeTree` convient pour effacer les données en double en arrière-plan afin d'économiser de l'espace, mais cela ne garantit pas l'absence de doublons. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = ReplacingMergeTree([ver]) +[PARTITION BY expr] +[ORDER BY expr] +[PRIMARY KEY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +Pour une description des paramètres de requête, voir [demande de description](../../query_language/create.md). + +**ReplacingMergeTree Paramètres** + +- `ver` — column with version. Type `UInt*`, `Date` ou `DateTime`. Paramètre facultatif. + + Lors de la fusion, `ReplacingMergeTree` de toutes les lignes avec la même clé primaire ne laisse qu'un: + + - Dernier dans la sélection, si `ver` pas ensemble. + - Avec la version maximale, si `ver` défini. + +**Les clauses de requête** + +Lors de la création d'un `ReplacingMergeTree` la table de la même [clause](mergetree.md) sont nécessaires, comme lors de la création d'un `MergeTree` table. + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets et, si possible, remplacez les anciens projets par la méthode décrite ci-dessus. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] ReplacingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [ver]) +``` + +Tous les paramètres excepté `ver` ont la même signification que dans `MergeTree`. + +- `ver` - colonne avec la version. Paramètre facultatif. Pour une description, voir le texte ci-dessus. + +
+ +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/replacingmergetree/) diff --git a/docs/fr/operations/table_engines/replication.md b/docs/fr/operations/table_engines/replication.md new file mode 100644 index 00000000000..f3e485fceb9 --- /dev/null +++ b/docs/fr/operations/table_engines/replication.md @@ -0,0 +1,215 @@ +--- +machine_translated: true +--- + +# Réplication Des Données {#table_engines-replication} + +La réplication n'est prise en charge que pour les tables de la famille MergeTree: + +- ReplicatedMergeTree +- ReplicatedSummingMergeTree +- ReplicatedReplacingMergeTree +- ReplicatedAggregatingMergeTree +- ReplicatedCollapsingMergeTree +- ReplicatedVersionedCollapsingMergetree +- ReplicatedGraphiteMergeTree + +La réplication fonctionne au niveau d'une table individuelle, Pas du serveur entier. Un serveur peut stocker des tables répliquées et non répliquées en même temps. + +La réplication ne dépend pas de la fragmentation. Chaque fragment a sa propre réplication indépendante. + +Données compressées pour `INSERT` et `ALTER` les requêtes sont répliquées (pour plus d'informations, consultez la documentation de [ALTER](../../query_language/alter.md#query_language_queries_alter)). + +`CREATE`, `DROP`, `ATTACH`, `DETACH` et `RENAME` les requêtes sont exécutées sur un seul serveur et ne sont pas répliquées: + +- Le `CREATE TABLE` query crée une nouvelle table réplicable sur le serveur où la requête est exécutée. Si cette table existe déjà sur d'autres serveurs, il ajoute une nouvelle réplique. +- Le `DROP TABLE` requête supprime la réplique situé sur le serveur où l'exécution de la requête. +- Le `RENAME` requête renomme la table sur l'une des répliques. En d'autres termes, les tables répliquées peuvent avoir des noms différents sur différentes répliques. + +Clickhouse utilise [Apache ZooKeeper](https://zookeeper.apache.org) pour stocker des informations méta répliques. Utilisez ZooKeeper version 3.4.5 ou plus récente. + +Pour utiliser la réplication, définissez les paramètres [zookeeper](../server_settings/settings.md#server-settings_zookeeper) section de configuration du serveur. + +!!! attention "Attention" + Ne négligez pas la sécurité. Clickhouse soutient le `digest` [Schéma ACL](https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_ZooKeeperAccessControl) du sous-système de sécurité ZooKeeper. + +Exemple de définition des adresses du cluster ZooKeeper: + +``` xml + + + example1 + 2181 + + + example2 + 2181 + + + example3 + 2181 + + +``` + +Vous pouvez spécifier N'importe quel cluster Zookeeper existant et le système utilisera un répertoire pour ses propres données (le répertoire est spécifié lors de la création d'une table réplicable). + +Si ZooKeeper n'est pas défini dans le fichier de configuration, vous ne pouvez pas créer de tables répliquées et toutes les tables répliquées existantes seront en lecture seule. + +La gardienne n'est pas utilisé dans `SELECT` requêtes car la réplication n'affecte pas les performances de `SELECT` et les requêtes s'exécutent aussi vite que pour les tables non répliquées. Lors de l'interrogation de tables répliquées distribuées, le comportement de ClickHouse est contrôlé par les paramètres [max\_replica\_delay\_for\_distributed\_queries](../settings/settings.md#settings-max_replica_delay_for_distributed_queries) et [fallback\_to\_stale\_replicas\_for\_distributed\_queries](../settings/settings.md#settings-fallback_to_stale_replicas_for_distributed_queries). + +Pour chaque `INSERT` requête, environ dix entrées sont ajoutées à ZooKeeper par le biais de plusieurs transactions. (Pour être plus précis, c'est pour chaque bloc de données inséré; une requête D'insertion contient un bloc ou un bloc par `max_insert_block_size = 1048576` rangée.) Cela conduit à des latences légèrement plus longues pour `INSERT` par rapport aux tables non répliquées. Mais si vous suivez les recommandations pour insérer des données dans des lots de pas plus d'un `INSERT` par seconde, cela ne crée aucun problème. L'ensemble du cluster clickhouse utilisé pour coordonner un cluster ZooKeeper a un total de plusieurs centaines `INSERTs` par seconde. Le débit sur les insertions de données (le nombre de lignes par seconde) est aussi élevé que pour les non-données répliquées. + +Pour les clusters très volumineux, vous pouvez utiliser différents clusters ZooKeeper pour différents fragments. Cependant, cela ne s'est pas avéré nécessaire sur le Yandex.Cluster Metrica (environ 300 serveurs). + +La réplication est asynchrone et multi-maître. `INSERT` les requêtes (ainsi que `ALTER`) peuvent être envoyés à n'importe quel serveur disponible. Les données sont insérées sur le serveur où la requête est exécutée, puis il est copié sur les autres serveurs. Comme il est asynchrone, les données récemment insérées apparaissent sur les autres répliques avec une certaine latence. Si une partie des répliques ne sont pas disponibles, les données sont écrites lorsqu'elles sont disponibles. Si une réplique est disponible, la latence correspond au temps nécessaire pour transférer le bloc de données compressées sur le réseau. + +Par défaut, une requête INSERT attend la confirmation de l'écriture des données à partir d'un seul réplica. Si les données ont été correctement écrit sur une seule réplique et le serveur avec cette réplique cesse d'exister, les données enregistrées seront perdues. Pour activer la confirmation des Écritures de données à partir de plusieurs réplicas, utilisez `insert_quorum` option. + +Chaque bloc de données est écrit de manière atomique. La requête D'insertion est divisée en blocs jusqu'à `max_insert_block_size = 1048576` rangée. En d'autres termes, si l' `INSERT` la requête a moins de 1048576 lignes, elle est faite de manière atomique. + +Les blocs de données sont dédupliquées. Pour plusieurs écritures du même bloc de données (blocs de données de même taille contenant les mêmes lignes dans le même ordre), le bloc n'est écrit qu'une seule fois. La raison en est en cas de défaillance du réseau lorsque l'application cliente ne sait pas si les données ont été écrites dans la base de données, de sorte que le `INSERT` requête peut simplement être répété. Peu importe à quelles insertions de réplica ont été envoyées avec des données identiques. `INSERTs` sont idempotents. Les paramètres de déduplication sont contrôlés par [merge\_tree](../server_settings/settings.md#server_settings-merge_tree) les paramètres du serveur. + +Pendant la réplication, seules les données source à insérer sont transférées sur le réseau. D'autres transformations de données (fusion) sont coordonnées et effectuées sur toutes les répliques de la même manière. Cela minimise l'utilisation du réseau, ce qui signifie que la réplication fonctionne bien lorsque les répliques résident dans différents centres de données. (Notez que la duplication de données dans différents centres de données est l'objectif principal de la réplication.) + +Vous pouvez avoir n'importe quel nombre de répliques des mêmes données. Yandex.Metrica utilise la double réplication en production. Chaque serveur utilise RAID-5 ou RAID-6, et RAID-10 dans certains cas. C'est une solution relativement fiable et pratique. + +Le système surveille la synchronicité des données sur les répliques et est capable de récupérer après une défaillance. Le basculement est automatique (pour les petites différences de données) ou semi-automatique (lorsque les données diffèrent trop, ce qui peut indiquer une erreur de configuration). + +## Création De Tables Répliquées {#creating-replicated-tables} + +Le `Replicated` le préfixe est ajouté au nom du moteur de table. Exemple:`ReplicatedMergeTree`. + +**Répliqué \* MergeTree paramètres** + +- `zoo_path` — The path to the table in ZooKeeper. +- `replica_name` — The replica name in ZooKeeper. + +Exemple: + +``` sql +CREATE TABLE table_name +( + EventDate DateTime, + CounterID UInt32, + UserID UInt32 +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}') +PARTITION BY toYYYYMM(EventDate) +ORDER BY (CounterID, EventDate, intHash32(UserID)) +SAMPLE BY intHash32(UserID) +``` + +
+ +Exemple de syntaxe obsolète + +``` sql +CREATE TABLE table_name +( + EventDate DateTime, + CounterID UInt32, + UserID UInt32 +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192) +``` + +
+ +Comme le montre l'exemple, ces paramètres peuvent contenir des substitutions entre crochets. Les valeurs substituées sont tirées de la ‘macros’ section du fichier de configuration. Exemple: + +``` xml + + 05 + 02 + example05-02-1.yandex.ru + +``` + +Le chemin d'accès à la table dans ZooKeeper doit être unique pour chaque table répliquée. Les Tables sur différents fragments doivent avoir des chemins différents. +Dans ce cas, le chemin se compose des parties suivantes: + +`/clickhouse/tables/` est le préfixe commun. Nous vous recommandons d'utiliser exactement celui-ci. + +`{layer}-{shard}` est l'identificateur de fragment. Dans cet exemple, il se compose de deux parties, depuis l'Yandex.Le cluster Metrica utilise le sharding à deux niveaux. Pour la plupart des tâches, vous ne pouvez laisser que la substitution {shard}, qui sera étendue à l'Identificateur de partition. + +`table_name` est le nom du nœud de la table dans ZooKeeper. C'est une bonne idée de le rendre identique au nom de la table. Il est défini explicitement, car contrairement au nom de la table, il ne change pas après une requête de renommage. +*HINT*: vous pouvez ajouter un nom de base de données devant `table_name` Aussi. E. g. `db_name.table_name` + +Le nom du réplica identifie différentes réplicas de la même table. Vous pouvez utiliser le nom de serveur pour cela, comme dans l'exemple. Le nom doit seulement être unique dans chaque fragment. + +Vous pouvez définir les paramètres explicitement au lieu d'utiliser des substitutions. Cela peut être pratique pour tester et configurer de petits clusters. Cependant, vous ne pouvez pas utiliser de requêtes DDL distribuées (`ON CLUSTER`) dans ce cas. + +Lorsque vous travaillez avec de grands clusters, nous vous recommandons d'utiliser des substitutions car elles réduisent la probabilité d'erreur. + +Exécutez l' `CREATE TABLE` requête sur chaque réplique. Cette requête crée une nouvelle table répliquée, ou ajoute une nouvelle réplique à un existant. + +Si vous ajoutez une nouvelle réplique après que la table contient déjà des données sur d'autres répliques, les données seront copiées des autres répliques vers la nouvelle après l'exécution de la requête. En d'autres termes, la nouvelle réplique synchronise avec les autres. + +Pour supprimer une réplique, exécutez `DROP TABLE`. However, only one replica is deleted – the one that resides on the server where you run the query. + +## Récupération Après Des Échecs {#recovery-after-failures} + +Si ZooKeeper n'est pas disponible au démarrage d'un serveur, les tables répliquées passent en mode Lecture seule. Le système tente périodiquement de se connecter à ZooKeeper. + +Si ZooKeeper est indisponible pendant un `INSERT`, ou une erreur se produit lors de l'interaction avec ZooKeeper, une exception est levée. + +Après la connexion à ZooKeeper, le système vérifie si l'ensemble de données du système de fichiers local correspond à l'ensemble de données attendu (ZooKeeper stocke ces informations). S'il y a des incohérences mineures, le système les résout en synchronisant les données avec les répliques. + +Si le système détecte des parties de données brisées (avec la mauvaise taille des fichiers) ou des parties non reconnues (parties écrites dans le système de fichiers mais non enregistrées dans ZooKeeper), il les déplace vers le `detached` sous-répertoire (ils ne sont pas supprimés). Toutes les pièces manquantes sont copiées à partir des répliques. + +Notez que ClickHouse n'effectue aucune action destructrice telle que la suppression automatique d'une grande quantité de données. + +Lorsque le serveur démarre (ou établit une nouvelle session avec ZooKeeper), il vérifie uniquement la quantité et la taille de tous les fichiers. Si les tailles de fichier correspondent mais que les octets ont été modifiés quelque part au milieu, cela n'est pas détecté immédiatement, mais uniquement lorsque vous tentez de lire les données `SELECT` requête. La requête lève une exception concernant une somme de contrôle ou une taille non correspondante d'un bloc compressé. Dans ce cas, des parties de données sont ajoutées à la file d'attente de vérification et copiées à partir des répliques si nécessaire. + +Si la série de données diffère trop de celle attendue, un mécanisme de sécurité est déclenché. Le serveur entre cela dans le journal et refuse de lancer. La raison en est que ce cas peut indiquer une erreur de configuration, par exemple si une réplique sur un fragment a été accidentellement configurée comme une réplique sur un fragment différent. Cependant, les seuils pour ce mécanisme sont fixés assez bas, et cette situation peut se produire pendant la récupération normale de la défaillance. Dans ce cas, les données sont restaurées semi-automatiquement - par “pushing a button”. + +Pour démarrer la récupération, créez le nœud `/path_to_table/replica_name/flags/force_restore_data` dans ZooKeeper avec n'importe quel contenu, ou exécutez la commande pour restaurer toutes les tables répliquées: + +``` bash +sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data +``` + +Puis redémarrez le serveur. Au démarrage, le serveur supprime ces indicateurs et démarre la récupération. + +## Récupération Après La Perte De Données Complète {#recovery-after-complete-data-loss} + +Si toutes les données et métadonnées ont disparu de l'un des serveurs, procédez comme suit pour la récupération: + +1. Installez ClickHouse sur le serveur. Définissez correctement les substitutions dans le fichier de configuration qui contient l'Identificateur de fragment et les répliques, si vous les utilisez. +2. Si vous avez des tables non compliquées qui doivent être dupliquées manuellement sur les serveurs, copiez leurs données à partir d'un réplica (dans le répertoire `/var/lib/clickhouse/data/db_name/table_name/`). +3. Copier les définitions de table situées dans `/var/lib/clickhouse/metadata/` à partir d'une réplique. Si un identificateur de fragment ou de réplica est défini explicitement dans les définitions de table, corrigez-le de manière à ce qu'il corresponde à ce réplica. (Alternativement, démarrez le serveur et faites tous les `ATTACH TABLE` les requêtes qui auraient dû être dans les .les fichiers sql dans `/var/lib/clickhouse/metadata/`.) +4. Pour démarrer la récupération, créez le nœud ZooKeeper `/path_to_table/replica_name/flags/force_restore_data` tout contenu, ou d'exécuter la commande pour restaurer toutes les tables répliquées: `sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data` + +Ensuite, démarrez le serveur (redémarrez, s'il est déjà en cours d'exécution). Les données seront téléchargées à partir de répliques. + +Une autre option de récupération consiste à supprimer des informations sur la réplique perdue de ZooKeeper (`/path_to_table/replica_name`), puis créez à nouveau la réplique comme décrit dans “[Création de tables répliquées](#creating-replicated-tables)”. + +Il n'y a aucune restriction sur la bande passante réseau pendant la récupération. Gardez cela à l'esprit si vous restaurez de nombreuses répliques à la fois. + +## Conversion de MergeTree en ReplicatedMergeTree {#converting-from-mergetree-to-replicatedmergetree} + +Nous utilisons le terme `MergeTree` pour consulter tous les moteurs de la `MergeTree family` le même que pour `ReplicatedMergeTree`. + +Si vous avez eu une `MergeTree` table qui a été répliquée manuellement, vous pouvez le convertir en une table répliquée. Vous devrez peut-être le faire si vous avez déjà recueilli une grande quantité de données dans un `MergeTree` table et maintenant vous voulez activer la réplication. + +Si les données diffèrent sur différentes répliques, synchronisez-les d'abord ou supprimez-les sur toutes les répliques sauf une. + +Renommez la table mergetree existante, puis créez un `ReplicatedMergeTree` table avec l'ancien nom. +Déplacez les données de l'ancienne table vers `detached` sous-répertoire à l'intérieur du répertoire avec les nouvelles données de la table (`/var/lib/clickhouse/data/db_name/table_name/`). +Ensuite, exécutez `ALTER TABLE ATTACH PARTITION` sur l'une des répliques d'ajouter ces données à des parties de l'ensemble de travail. + +## Conversion de ReplicatedMergeTree en MergeTree {#converting-from-replicatedmergetree-to-mergetree} + +Créez une table MergeTree avec un nom différent. Déplacez toutes les données du répertoire avec le `ReplicatedMergeTree` données de la table dans le répertoire de données de la nouvelle table. Ensuite, supprimer le `ReplicatedMergeTree` table et redémarrez le serveur. + +Si vous voulez vous débarrasser d'un `ReplicatedMergeTree` table sans lancer le serveur: + +- Supprimer la `.sql` fichier dans le répertoire de métadonnées (`/var/lib/clickhouse/metadata/`). +- Supprimer le chemin correspondant dans ZooKeeper (`/path_to_table/replica_name`). + +Après cela, vous pouvez lancer le serveur, créer un `MergeTree` tableau, déplacer les données de son répertoire, puis redémarrez le serveur. + +## Récupération lorsque les métadonnées du Cluster ZooKeeper sont perdues ou endommagées {#recovery-when-metadata-in-the-zookeeper-cluster-is-lost-or-damaged} + +Si les données de ZooKeeper ont été perdues ou endommagées, vous pouvez les enregistrer en les déplaçant dans une table non compliquée comme décrit ci-dessus. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/replication/) diff --git a/docs/fr/operations/table_engines/set.md b/docs/fr/operations/table_engines/set.md new file mode 100644 index 00000000000..f564f146499 --- /dev/null +++ b/docs/fr/operations/table_engines/set.md @@ -0,0 +1,16 @@ +--- +machine_translated: true +--- + +# Définir {#set} + +Un ensemble de données qui est toujours en RAM. Il est conçu pour être utilisé sur le côté droit de l'opérateur (voir la section “IN operators”). + +Vous pouvez utiliser INSERT pour insérer des données dans la table. De nouveaux éléments seront ajoutés à l'ensemble de données, tandis que les doublons seront ignorés. +Mais vous ne pouvez pas effectuer SELECT à partir de la table. La seule façon de récupérer des données est en l'utilisant dans la moitié droite de l'opérateur. + +Les données sont toujours situées dans la RAM. Pour INSERT, les blocs de données insérées sont également écrits dans le répertoire des tables sur le disque. Lors du démarrage du serveur, ces données sont chargées dans la RAM. En d'autres termes, après le redémarrage, les données restent en place. + +Pour un redémarrage brutal du serveur, le bloc de données sur le disque peut être perdu ou endommagé. Dans ce dernier cas, vous devrez peut-être supprimer manuellement le fichier contenant des données endommagées. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/set/) diff --git a/docs/fr/operations/table_engines/stripelog.md b/docs/fr/operations/table_engines/stripelog.md new file mode 100644 index 00000000000..969569c139b --- /dev/null +++ b/docs/fr/operations/table_engines/stripelog.md @@ -0,0 +1,92 @@ +--- +machine_translated: true +--- + +# StripeLog {#stripelog} + +Ce moteur appartient à la famille des moteurs en rondins. Voir les propriétés communes des moteurs de journal et leurs différences dans le [Famille De Moteurs En Rondins](log_family.md) article. + +Utilisez ce moteur dans des scénarios lorsque vous devez écrire de nombreuses tables avec une petite quantité de données (moins de 1 million de lignes). + +## Création d'une Table {#table_engines-stripelog-creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = StripeLog +``` + +Voir la description détaillée de la [CREATE TABLE](../../query_language/create.md#create-table-query) requête. + +## L'écriture des Données {#table_engines-stripelog-writing-the-data} + +Le `StripeLog` moteur stocke toutes les colonnes dans un fichier. Pour chaque `INSERT` requête, ClickHouse ajoute le bloc de données à la fin d'un fichier de table, en écrivant des colonnes une par une. + +Pour chaque table ClickHouse écrit les fichiers: + +- `data.bin` — Data file. +- `index.mrk` — File with marks. Marks contain offsets for each column of each data block inserted. + +Le `StripeLog` moteur ne prend pas en charge la `ALTER UPDATE` et `ALTER DELETE` opérations. + +## La lecture des Données {#table_engines-stripelog-reading-the-data} + +Le fichier avec des marques permet à ClickHouse de paralléliser la lecture des données. Cela signifie qu'une `SELECT` la requête renvoie des lignes dans un ordre imprévisible. L'utilisation de la `ORDER BY` clause pour trier les lignes. + +## Exemple D'utilisation {#table_engines-stripelog-example-of-use} + +Création d'une table: + +``` sql +CREATE TABLE stripe_log_table +( + timestamp DateTime, + message_type String, + message String +) +ENGINE = StripeLog +``` + +Insertion de données: + +``` sql +INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The first regular message') +INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message') +``` + +Nous avons utilisé deux `INSERT` requêtes pour créer deux blocs de données `data.bin` fichier. + +ClickHouse utilise plusieurs threads lors de la sélection des données. Chaque thread lit un bloc de données séparé et renvoie les lignes résultantes indépendamment à la fin. En conséquence, l'ordre des blocs de lignes dans le résultat ne correspond pas à l'ordre des mêmes blocs dans l'entrée, dans la plupart des cas. Exemple: + +``` sql +SELECT * FROM stripe_log_table +``` + +``` text +┌───────────timestamp─┬─message_type─┬─message────────────────────┐ +│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │ +│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │ +└─────────────────────┴──────────────┴────────────────────────────┘ +┌───────────timestamp─┬─message_type─┬─message───────────────────┐ +│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │ +└─────────────────────┴──────────────┴───────────────────────────┘ +``` + +Trier les résultats (ordre croissant par défaut): + +``` sql +SELECT * FROM stripe_log_table ORDER BY timestamp +``` + +``` text +┌───────────timestamp─┬─message_type─┬─message────────────────────┐ +│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │ +│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │ +│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │ +└─────────────────────┴──────────────┴────────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/stripelog/) diff --git a/docs/fr/operations/table_engines/summingmergetree.md b/docs/fr/operations/table_engines/summingmergetree.md new file mode 100644 index 00000000000..098a51a6408 --- /dev/null +++ b/docs/fr/operations/table_engines/summingmergetree.md @@ -0,0 +1,138 @@ +--- +machine_translated: true +--- + +# SummingMergeTree {#summingmergetree} + +Le moteur hérite de [MergeTree](mergetree.md#table_engines-mergetree). La différence est que lors de la fusion de parties de données pour `SummingMergeTree` tables ClickHouse remplace toutes les lignes avec la même clé primaire (ou, plus précisément, avec la même [clé de tri](mergetree.md)) avec une ligne qui contient des valeurs résumées pour les colonnes avec le type de données numériques. Si la clé de tri est composée de telle sorte qu'une seule valeur de clé correspond à un grand nombre de lignes, cela réduit considérablement le volume de stockage et accélère la sélection des données. + +Nous vous recommandons d'utiliser le moteur avec `MergeTree`. Stocker des données complètes dans `MergeTree` table, et l'utilisation `SummingMergeTree` pour le stockage de données agrégées, par exemple, lors de la préparation de rapports. Une telle approche vous empêchera de perdre des données précieuses en raison d'une clé primaire mal composée. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = SummingMergeTree([columns]) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +Pour une description des paramètres de requête, voir [demande de description](../../query_language/create.md). + +**Paramètres de SummingMergeTree** + +- `columns` - un n-uplet avec les noms de colonnes où les valeurs seront résumées. Paramètre facultatif. + Les colonnes doivent être d'un type numérique et ne doit pas être dans la clé primaire. + + Si `columns` non spécifié, ClickHouse résume les valeurs dans toutes les colonnes avec un type de données numérique qui ne sont pas dans la clé primaire. + +**Les clauses de requête** + +Lors de la création d'un `SummingMergeTree` la table de la même [clause](mergetree.md) sont nécessaires, comme lors de la création d'un `MergeTree` table. + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets et, si possible, remplacez les anciens projets par la méthode décrite ci-dessus. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] SummingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns]) +``` + +Tous les paramètres excepté `columns` ont la même signification que dans `MergeTree`. + +- `columns` — tuple with names of columns values of which will be summarized. Optional parameter. For a description, see the text above. + +
+ +## Exemple D'Utilisation {#usage-example} + +Considérons le tableau suivant: + +``` sql +CREATE TABLE summtt +( + key UInt32, + value UInt32 +) +ENGINE = SummingMergeTree() +ORDER BY key +``` + +Insérer des données: + +``` sql +INSERT INTO summtt Values(1,1),(1,2),(2,1) +``` + +ClickHouse peut résumer toutes les lignes pas complètement ([voir ci-dessous](#data-processing)), nous utilisons donc une fonction d'agrégation `sum` et `GROUP BY` la clause dans la requête. + +``` sql +SELECT key, sum(value) FROM summtt GROUP BY key +``` + +``` text +┌─key─┬─sum(value)─┐ +│ 2 │ 1 │ +│ 1 │ 3 │ +└─────┴────────────┘ +``` + +## Le Traitement Des Données {#data-processing} + +Lorsque les données sont insérées dans une table, elles sont enregistrées telles quelles. Clickhouse fusionne périodiquement les parties de données insérées et c'est à ce moment que les lignes avec la même clé primaire sont additionnées et remplacées par une pour chaque partie de données résultante. + +ClickHouse can merge the data parts so that different resulting parts of data cat consist rows with the same primary key, i.e. the summation will be incomplete. Therefore (`SELECT`) une fonction d'agrégation [somme()](../../query_language/agg_functions/reference.md#agg_function-sum) et `GROUP BY` la clause doit être utilisé dans une requête comme décrit dans l'exemple ci-dessus. + +### Règles communes pour la sommation {#common-rules-for-summation} + +Les valeurs dans les colonnes avec le type de données numériques sont résumées. L'ensemble des colonnes est défini par le paramètre `columns`. + +Si les valeurs étaient 0 dans toutes les colonnes pour la sommation, la ligne est supprimée. + +Si la colonne n'est pas dans la clé primaire et n'est pas résumée, une valeur arbitraire est sélectionnée parmi celles existantes. + +Les valeurs ne sont pas résumés des colonnes de la clé primaire. + +### La somme dans les colonnes AggregateFunction {#the-summation-in-the-aggregatefunction-columns} + +Pour les colonnes de [Type AggregateFunction](../../data_types/nested_data_structures/aggregatefunction.md) ClickHouse se comporte comme [AggregatingMergeTree](aggregatingmergetree.md) moteur d'agrégation selon la fonction. + +### Structures Imbriquées {#nested-structures} + +Table peut avoir des structures de données imbriquées qui sont traitées d'une manière spéciale. + +Si le nom d'une table imbriquée se termine avec `Map` et il contient au moins deux colonnes qui répondent aux critères suivants: + +- la première colonne est numérique `(*Int*, Date, DateTime)` ou une chaîne de caractères `(String, FixedString)`, nous allons l'appeler `key`, +- les autres colonnes sont arithmétique `(*Int*, Float32/64)`, nous allons l'appeler `(values...)`, + +ensuite, cette table imbriquée est interprétée comme un mappage de `key => (values...)` et lors de la fusion de ses lignes, les éléments de deux ensembles de données sont regroupées par `key` avec une sommation du correspondant `(values...)`. + +Exemple: + +``` text +[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)] +[(1, 100)] + [(1, 150)] -> [(1, 250)] +[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)] +[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)] +``` + +Lorsque vous demandez des données, utilisez [sumMap (clé, valeur)](../../query_language/agg_functions/reference.md) fonction pour l'agrégation de `Map`. + +Pour la structure de données imbriquée, vous n'avez pas besoin de spécifier ses colonnes dans le tuple de colonnes pour la sommation. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/summingmergetree/) diff --git a/docs/fr/operations/table_engines/tinylog.md b/docs/fr/operations/table_engines/tinylog.md new file mode 100644 index 00000000000..d2f528e07ac --- /dev/null +++ b/docs/fr/operations/table_engines/tinylog.md @@ -0,0 +1,13 @@ +--- +machine_translated: true +--- + +# TinyLog {#tinylog} + +Le moteur appartient à la famille de moteurs en rondins. Voir [Famille De Moteurs En Rondins](log_family.md) pour les propriétés communes des moteurs en rondins et leurs différences. + +Ce moteur de table est généralement utilisé avec la méthode write-once: écrivez des données une fois, puis lisez-les autant de fois que nécessaire. Par exemple, vous pouvez utiliser `TinyLog`- tapez des tables pour les données intermédiaires qui sont traitées en petits lots. Notez que le stockage des données dans un grand nombre de petites tables est inefficace. + +Les requêtes sont exécutées dans un flux unique. En d'autres termes, ce moteur est destiné à des tables relativement petites (jusqu'à environ 1 000 000 de lignes). Il est logique d'utiliser ce moteur de table si vous avez beaucoup de petites tables, car il est plus simple que le [Journal](log.md) moteur (moins de fichiers doivent être ouverts). + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/tinylog/) diff --git a/docs/fr/operations/table_engines/url.md b/docs/fr/operations/table_engines/url.md new file mode 100644 index 00000000000..a7b58c4ad5d --- /dev/null +++ b/docs/fr/operations/table_engines/url.md @@ -0,0 +1,79 @@ +--- +machine_translated: true +--- + +# URL (URL, Format) {#table_engines-url} + +Gère les données sur un serveur HTTP / HTTPS distant. Ce moteur est similaire +à l' [Fichier](file.md) moteur. + +## Utilisation du moteur dans le serveur ClickHouse {#using-the-engine-in-the-clickhouse-server} + +Le `format` doit être celui que ClickHouse peut utiliser dans +`SELECT` les requêtes et, si nécessaire, en `INSERTs`. Pour la liste complète des formats pris en charge, voir +[Format](../../interfaces/formats.md#formats). + +Le `URL` doit être conforme à la structure D'un Localisateur de ressources uniforme. L'URL spécifiée doit pointer vers un serveur +qui utilise le protocole HTTP ou HTTPS. Cela ne nécessite pas de +en-têtes supplémentaires pour obtenir une réponse du serveur. + +`INSERT` et `SELECT` les requêtes sont transformées en `POST` et `GET` demande, +respectivement. Pour le traitement `POST` demandes, le serveur distant doit prendre en charge +[Encodage de transfert en morceaux](https://en.wikipedia.org/wiki/Chunked_transfer_encoding). + +Vous pouvez limiter le nombre maximal de sauts de redirection HTTP GET en utilisant [max\_http\_get\_redirects](../settings/settings.md#setting-max_http_get_redirects) paramètre. + +**Exemple:** + +**1.** Créer un `url_engine_table` table sur le serveur : + +``` sql +CREATE TABLE url_engine_table (word String, value UInt64) +ENGINE=URL('http://127.0.0.1:12345/', CSV) +``` + +**2.** Créez un serveur HTTP de base à l'aide des outils Python 3 standard et +démarrer: + +``` python3 +from http.server import BaseHTTPRequestHandler, HTTPServer + +class CSVHTTPServer(BaseHTTPRequestHandler): + def do_GET(self): + self.send_response(200) + self.send_header('Content-type', 'text/csv') + self.end_headers() + + self.wfile.write(bytes('Hello,1\nWorld,2\n', "utf-8")) + +if __name__ == "__main__": + server_address = ('127.0.0.1', 12345) + HTTPServer(server_address, CSVHTTPServer).serve_forever() +``` + +``` bash +$ python3 server.py +``` + +**3.** Les données de la demande: + +``` sql +SELECT * FROM url_engine_table +``` + +``` text +┌─word──┬─value─┐ +│ Hello │ 1 │ +│ World │ 2 │ +└───────┴───────┘ +``` + +## Les détails de mise en Œuvre {#details-of-implementation} + +- Les lectures et les écritures peuvent être parallèles +- Pas pris en charge: + - `ALTER` et `SELECT...SAMPLE` opérations. + - Index. + - Réplication. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/url/) diff --git a/docs/fr/operations/table_engines/versionedcollapsingmergetree.md b/docs/fr/operations/table_engines/versionedcollapsingmergetree.md new file mode 100644 index 00000000000..dadd4b42858 --- /dev/null +++ b/docs/fr/operations/table_engines/versionedcollapsingmergetree.md @@ -0,0 +1,235 @@ +--- +machine_translated: true +--- + +# VersionedCollapsingMergeTree {#versionedcollapsingmergetree} + +Ce moteur: + +- Permet l'écriture rapide des États d'objet qui changent continuellement. +- Supprime les anciens États d'objets en arrière-plan. Cela réduit considérablement le volume de stockage. + +Voir la section [Effondrer](#table_engines_versionedcollapsingmergetree) pour plus de détails. + +Le moteur hérite de [MergeTree](mergetree.md#table_engines-mergetree) et ajoute la logique de réduction des lignes à l'algorithme de fusion des parties de données. `VersionedCollapsingMergeTree` sert le même but que [CollapsingMergeTree](collapsingmergetree.md) mais utilise un autre effondrement algorithme qui permet d'insérer les données dans n'importe quel ordre avec plusieurs threads. En particulier, l' `Version` la colonne aide à réduire correctement les lignes même si elles sont insérées dans le mauvais ordre. Contrairement, `CollapsingMergeTree` permet uniquement une insertion strictement consécutive. + +## Création d'une Table {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = VersionedCollapsingMergeTree(sign, version) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +Pour une description des paramètres de requête, voir les [description de la requête](../../query_language/create.md). + +**Les Paramètres Du Moteur** + +``` sql +VersionedCollapsingMergeTree(sign, version) +``` + +- `sign` — Name of the column with the type of row: `1` est un “state” rangée, `-1` est un “cancel” rangée. + + Le type de données de colonne doit être `Int8`. + +- `version` — Name of the column with the version of the object state. + + Le type de données de colonne doit être `UInt*`. + +**Les Clauses De Requête** + +Lors de la création d'un `VersionedCollapsingMergeTree` de table, de la même [clause](mergetree.md) sont requis lors de la création d'un `MergeTree` table. + +
+ +Méthode obsolète pour créer une Table + +!!! attention "Attention" + N'utilisez pas cette méthode dans les nouveaux projets. Si possible, passer les anciens projets à la méthode décrite ci-dessus. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] VersionedCollapsingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, sign, version) +``` + +Tous les paramètres, à l'exception `sign` et `version` ont la même signification que dans `MergeTree`. + +- `sign` — Name of the column with the type of row: `1` est un “state” rangée, `-1` est un “cancel” rangée. + + Column Data Type — `Int8`. + +- `version` — Name of the column with the version of the object state. + + Le type de données de colonne doit être `UInt*`. + +
+ +## Effondrer {#table_engines-versionedcollapsingmergetree} + +### Données {#data} + +Considérez une situation où vous devez enregistrer des données en constante évolution pour un objet. Il est raisonnable d'avoir une ligne pour un objet et de mettre à jour la ligne chaque fois qu'il y a des modifications. Cependant, l'opération de mise à jour est coûteuse et lente pour un SGBD car elle nécessite la réécriture des données dans le stockage. La mise à jour n'est pas acceptable si vous devez écrire des données rapidement, mais vous pouvez écrire les modifications sur un objet de manière séquentielle comme suit. + +L'utilisation de la `Sign` colonne lors de l'écriture de la ligne. Si `Sign = 1` cela signifie que la ligne est un état d'un objet (appelons-la “state” rangée). Si `Sign = -1` il indique l'annulation de l'état d'un objet avec les mêmes attributs (appelons-la “cancel” rangée). Également utiliser l' `Version` colonne, qui doit identifier chaque état d'un objet avec un numéro distinct. + +Par exemple, nous voulons calculer le nombre de pages visitées sur le site et combien de temps ils étaient là. À un moment donné nous écrivons la ligne suivante avec l'état de l'activité de l'utilisateur: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +À un moment donné, nous enregistrons le changement d'activité de l'utilisateur et l'écrivons avec les deux lignes suivantes. + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +La première ligne annule le précédent état de l'objet (utilisateur). Il doit copier tous les champs de l'état annulé sauf `Sign`. + +La deuxième ligne contient l'état actuel. + +Parce que nous avons besoin seulement le dernier état de l'activité de l'utilisateur, les lignes + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +peut être supprimé, réduisant l'état invalide (ancien) de l'objet. `VersionedCollapsingMergeTree` fait cela lors de la fusion des parties de données. + +Pour savoir pourquoi nous avons besoin de deux lignes pour chaque changement, voir [Algorithme](#table_engines-versionedcollapsingmergetree-algorithm). + +**Notes sur l'Utilisation de la** + +1. Le programme qui écrit les données devraient se souvenir de l'état d'un objet afin de l'annuler. Le “cancel” chaîne doit être une copie de la “state” chaîne avec le contraire `Sign`. Cela augmente la taille initiale de stockage, mais permet d'écrire les données rapidement. +2. Les tableaux de plus en plus longs dans les colonnes réduisent l'efficacité du moteur en raison de la charge d'écriture. Plus les données sont simples, meilleure est l'efficacité. +3. `SELECT` les résultats dépendent fortement de la cohérence de l'histoire de l'objet change. Être précis lors de la préparation des données pour l'insertion. Vous pouvez obtenir des résultats imprévisibles avec des données incohérentes, telles que des valeurs négatives pour des métriques non négatives telles que la profondeur de session. + +### Algorithme {#table_engines-versionedcollapsingmergetree-algorithm} + +Lorsque ClickHouse fusionne des parties de données, il supprime chaque paire de lignes ayant la même clé primaire et la même version et différentes `Sign`. L'ordre des lignes n'a pas d'importance. + +Lorsque ClickHouse insère des données, il ordonne les lignes par la clé primaire. Si l' `Version` la colonne n'est pas dans la clé primaire, ClickHouse ajoute à la clé primaire implicitement que le dernier champ et l'utilise pour la commande. + +## La Sélection De Données {#selecting-data} + +ClickHouse ne garantit pas que toutes les lignes avec la même clé primaire sera dans la même partie des données ou même sur le même serveur physique. Cela est vrai à la fois pour l'écriture des données et pour la fusion ultérieure des parties de données. En outre, les processus ClickHouse `SELECT` requêtes avec plusieurs threads, et il ne peut pas prédire l'ordre des lignes dans le résultat. Cela signifie que le regroupement est nécessaire s'il est nécessaire pour obtenir complètement “collapsed” données à partir d'un `VersionedCollapsingMergeTree` table. + +Pour finaliser la réduction, écrivez une requête avec un `GROUP BY` fonctions de clause et d'agrégation qui tiennent compte du signe. Par exemple, pour calculer la quantité, l'utilisation `sum(Sign)` plutôt `count()`. Pour calculer la somme de quelque chose, utilisez `sum(Sign * x)` plutôt `sum(x)` et d'ajouter `HAVING sum(Sign) > 0`. + +Aggregate `count`, `sum` et `avg` peut être calculée de cette manière. Aggregate `uniq` peut être calculé si un objet a au moins un non-état effondré. Aggregate `min` et `max` ne peut pas être calculé, car `VersionedCollapsingMergeTree` ne sauvegarde pas l'historique des valeurs des États réduits. + +Si vous avez besoin d'extraire les données avec “collapsing” mais sans agrégation (par exemple, pour vérifier si des lignes sont présentes dont les valeurs les plus récentes correspondent à certaines conditions), vous pouvez utiliser `FINAL` le modificateur du `FROM` clause. Cette approche est inefficace et ne devrait pas être utilisée avec de grandes tables. + +## Exemple D'utilisation {#example-of-use} + +Les données de l'exemple: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +Création de la table: + +``` sql +CREATE TABLE UAct +( + UserID UInt64, + PageViews UInt8, + Duration UInt8, + Sign Int8, + Version UInt8 +) +ENGINE = VersionedCollapsingMergeTree(Sign, Version) +ORDER BY UserID +``` + +Insérer les données: + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, 1, 1) +``` + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, -1, 1),(4324182021466249494, 6, 185, 1, 2) +``` + +Nous utilisons deux `INSERT` requêtes pour créer deux parties de données différentes. Si nous insérons les données avec une seule requête, ClickHouse crée une partie de données et n'effectuera jamais de fusion. + +L'obtention de données: + +``` sql +SELECT * FROM UAct +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │ +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +Que voyons-nous ici et où sont les parties effondrées? +Nous avons créé deux parties de données en utilisant deux `INSERT` requête. Le `SELECT` la requête a été effectuée dans deux threads, et le résultat est un ordre aléatoire de lignes. +L'effondrement n'a pas eu lieu car les parties de données n'ont pas encore été fusionnées. ClickHouse fusionne des parties de données à un moment inconnu que nous ne pouvons pas prédire. + +C'est pourquoi nous avons besoin de l'agrégation: + +``` sql +SELECT + UserID, + sum(PageViews * Sign) AS PageViews, + sum(Duration * Sign) AS Duration, + Version +FROM UAct +GROUP BY UserID, Version +HAVING sum(Sign) > 0 +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Version─┐ +│ 4324182021466249494 │ 6 │ 185 │ 2 │ +└─────────────────────┴───────────┴──────────┴─────────┘ +``` + +Si nous n'avons pas besoin d'agrégation et que nous voulons forcer l'effondrement, nous pouvons utiliser le `FINAL` le modificateur du `FROM` clause. + +``` sql +SELECT * FROM UAct FINAL +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │ +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +C'est un moyen très inefficace de sélectionner des données. Ne l'utilisez pas pour les grandes tables. + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/versionedcollapsingmergetree/) diff --git a/docs/fr/operations/table_engines/view.md b/docs/fr/operations/table_engines/view.md new file mode 100644 index 00000000000..e6650a20399 --- /dev/null +++ b/docs/fr/operations/table_engines/view.md @@ -0,0 +1,9 @@ +--- +machine_translated: true +--- + +# Vue {#table_engines-view} + +Utilisé pour implémenter des vues (pour plus d'informations, voir `CREATE VIEW query`). Il ne stocke pas de données, mais stocke uniquement les `SELECT` requête. Lors de la lecture d'une table, il exécute cette requête (et supprime toutes les colonnes inutiles de la requête). + +[Article Original](https://clickhouse.tech/docs/en/operations/table_engines/view/) diff --git a/docs/fr/operations/tips.md b/docs/fr/operations/tips.md new file mode 100644 index 00000000000..55dbf8a065b --- /dev/null +++ b/docs/fr/operations/tips.md @@ -0,0 +1,248 @@ +--- +machine_translated: true +--- + +# Recommandations D'Utilisation {#usage-recommendations} + +## Gouverneur de mise à L'échelle du processeur {#cpu-scaling-governor} + +Utilisez toujours la `performance` mise à l'échelle gouverneur. Le `on-demand` gouverneur de mise à l'échelle fonctionne bien pire avec une demande constamment élevée. + +``` bash +$ echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor +``` + +## CPU Limitations {#cpu-limitations} + +Les processeurs peuvent surchauffer. Utiliser `dmesg` pour voir si la fréquence D'horloge du processeur était limitée en raison de la surchauffe. +La restriction peut également être définie en externe au niveau du centre de données. Vous pouvez utiliser `turbostat` à surveiller sous une charge. + +## RAM {#ram} + +Pour de petites quantités de données (jusqu'à ~200 GO en mode compressé), il est préférable d'utiliser autant de mémoire que le volume de données. +Pour de grandes quantités de données et lors du traitement de requêtes interactives (en ligne), vous devez utiliser une quantité raisonnable de RAM (128 Go ou plus) afin que le sous-ensemble de données chaudes s'intègre dans le cache des pages. +Même pour des volumes de données d'environ 50 To par serveur, l'utilisation de 128 Go de RAM améliore considérablement les performances des requêtes par rapport à 64 Go. + +Ne désactivez pas de surcharge. Valeur `cat /proc/sys/vm/overcommit_memory` devrait être 0 ou 1. Exécuter + +``` bash +$ echo 0 | sudo tee /proc/sys/vm/overcommit_memory +``` + +## Huge Pages {#huge-pages} + +Toujours désactiver les pages énormes transparentes. Il interfère avec les allocateurs de mémoire, ce qui entraîne une dégradation significative des performances. + +``` bash +$ echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled +``` + +Utiliser `perf top` pour regarder le temps passé dans le noyau pour la gestion de la mémoire. +Les pages énormes permanentes n'ont pas non plus besoin d'être allouées. + +## Sous-Système De Stockage {#storage-subsystem} + +Si votre budget vous permet D'utiliser SSD, utilisez SSD. +Sinon, utilisez un disque dur. Disques durs SATA 7200 RPM fera l'affaire. + +Donner la préférence à un grand nombre de serveurs avec des disques durs locaux sur un plus petit nombre de serveurs avec un disque attaché étagères. +Mais pour stocker des archives avec des requêtes rares, les étagères fonctionneront. + +## RAID {#raid} + +Lorsque vous utilisez le disque dur, vous pouvez combiner leur RAID-10, RAID-5, RAID-6 ou RAID-50. +Pour Linux, le RAID logiciel est meilleur (avec `mdadm`). Nous ne recommandons pas d'utiliser LVM. +Lors de la création de RAID-10, sélectionnez `far` disposition. +Si votre budget le permet, choisissez RAID-10. + +Si vous avez plus de 4 disques, Utilisez RAID-6 (préféré) ou RAID-50, au lieu de RAID-5. +Lorsque vous utilisez RAID-5, RAID-6 ou RAID-50, augmentez toujours stripe\_cache\_size, car la valeur par défaut n'est généralement pas le meilleur choix. + +``` bash +$ echo 4096 | sudo tee /sys/block/md2/md/stripe_cache_size +``` + +Calculez le nombre exact à partir du nombre de périphériques et de la taille du bloc, en utilisant la formule: `2 * num_devices * chunk_size_in_bytes / 4096`. + +Une taille de bloc de 1024 KO est suffisante pour toutes les configurations RAID. +Ne définissez jamais la taille du bloc trop petite ou trop grande. + +Vous pouvez utiliser RAID-0 sur SSD. +Quelle que soit L'utilisation du RAID, utilisez toujours la réplication pour la sécurité des données. + +Activer NCQ avec une longue file d'attente. Pour HDD, choisissez le planificateur CFQ, et pour SSD, choisissez noop. Ne pas réduire le ‘readahead’ paramètre. +Pour le disque dur, activez le cache d'écriture. + +## Système De Fichiers {#file-system} + +Ext4 est l'option la plus fiable. Définir les options de montage `noatime, nobarrier`. +XFS est également adapté, mais il n'a pas été aussi soigneusement testé avec ClickHouse. +La plupart des autres systèmes de fichiers devraient également fonctionner correctement. Les systèmes de fichiers avec allocation retardée fonctionnent mieux. + +## Le Noyau Linux {#linux-kernel} + +N'utilisez pas un noyau Linux obsolète. + +## Réseau {#network} + +Si vous utilisez IPv6, augmenter la taille du cache. +Le noyau Linux avant 3.2 avait une multitude de problèmes avec l'implémentation D'IPv6. + +Utilisez au moins un réseau de 10 Go, si possible. 1 Go fonctionnera également, mais ce sera bien pire pour patcher des répliques avec des dizaines de téraoctets de données, ou pour traiter des requêtes distribuées avec une grande quantité de données intermédiaires. + +## ZooKeeper {#zookeeper} + +Vous utilisez probablement déjà ZooKeeper à d'autres fins. Vous pouvez utiliser la même installation de ZooKeeper, si elle n'est pas déjà surchargée. + +It's best to use a fresh version of ZooKeeper – 3.4.9 or later. The version in stable Linux distributions may be outdated. + +Vous ne devez jamais utiliser de scripts écrits manuellement pour transférer des données entre différents clusters ZooKeeper, car le résultat sera incorrect pour les nœuds séquentiels. Ne jamais utiliser de l' “zkcopy” utilitaire pour la même raison: https://github.com/ksprojects/zkcopy/issues/15 + +Si vous souhaitez diviser un cluster Zookeeper existant en deux, le bon moyen est d'augmenter le nombre de ses répliques, puis de le reconfigurer en deux clusters indépendants. + +N'exécutez pas ZooKeeper sur les mêmes serveurs que ClickHouse. Parce que ZooKeeper est très sensible à la latence et ClickHouse peut utiliser toutes les ressources système disponibles. + +Avec les paramètres par défaut, ZooKeeper est une bombe à retardement: + +> Le serveur ZooKeeper ne supprime pas les fichiers des anciens snapshots et journaux lors de l'utilisation de la configuration par défaut (voir autopurge), et c'est la responsabilité de l'opérateur. + +Cette bombe doit être désamorcée. + +La configuration ZooKeeper (3.5.1) ci-dessous est utilisée dans le Yandex.Environnement de production Metrica au 20 mai 2017: + +zoo.cfg: + +``` bash +# http://hadoop.apache.org/zookeeper/docs/current/zookeeperAdmin.html + +# The number of milliseconds of each tick +tickTime=2000 +# The number of ticks that the initial +# synchronization phase can take +initLimit=30000 +# The number of ticks that can pass between +# sending a request and getting an acknowledgement +syncLimit=10 + +maxClientCnxns=2000 + +maxSessionTimeout=60000000 +# the directory where the snapshot is stored. +dataDir=/opt/zookeeper/{{ '{{' }} cluster['name'] {{ '}}' }}/data +# Place the dataLogDir to a separate physical disc for better performance +dataLogDir=/opt/zookeeper/{{ '{{' }} cluster['name'] {{ '}}' }}/logs + +autopurge.snapRetainCount=10 +autopurge.purgeInterval=1 + + +# To avoid seeks ZooKeeper allocates space in the transaction log file in +# blocks of preAllocSize kilobytes. The default block size is 64M. One reason +# for changing the size of the blocks is to reduce the block size if snapshots +# are taken more often. (Also, see snapCount). +preAllocSize=131072 + +# Clients can submit requests faster than ZooKeeper can process them, +# especially if there are a lot of clients. To prevent ZooKeeper from running +# out of memory due to queued requests, ZooKeeper will throttle clients so that +# there is no more than globalOutstandingLimit outstanding requests in the +# system. The default limit is 1,000.ZooKeeper logs transactions to a +# transaction log. After snapCount transactions are written to a log file a +# snapshot is started and a new transaction log file is started. The default +# snapCount is 10,000. +snapCount=3000000 + +# If this option is defined, requests will be will logged to a trace file named +# traceFile.year.month.day. +#traceFile= + +# Leader accepts client connections. Default value is "yes". The leader machine +# coordinates updates. For higher update throughput at thes slight expense of +# read throughput the leader can be configured to not accept clients and focus +# on coordination. +leaderServes=yes + +standaloneEnabled=false +dynamicConfigFile=/etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/zoo.cfg.dynamic +``` + +Version de Java: + +``` text +Java(TM) SE Runtime Environment (build 1.8.0_25-b17) +Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) +``` + +Les paramètres de la JVM: + +``` bash +NAME=zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }} +ZOOCFGDIR=/etc/$NAME/conf + +# TODO this is really ugly +# How to find out, which jars are needed? +# seems, that log4j requires the log4j.properties file to be in the classpath +CLASSPATH="$ZOOCFGDIR:/usr/build/classes:/usr/build/lib/*.jar:/usr/share/zookeeper/zookeeper-3.5.1-metrika.jar:/usr/share/zookeeper/slf4j-log4j12-1.7.5.jar:/usr/share/zookeeper/slf4j-api-1.7.5.jar:/usr/share/zookeeper/servlet-api-2.5-20081211.jar:/usr/share/zookeeper/netty-3.7.0.Final.jar:/usr/share/zookeeper/log4j-1.2.16.jar:/usr/share/zookeeper/jline-2.11.jar:/usr/share/zookeeper/jetty-util-6.1.26.jar:/usr/share/zookeeper/jetty-6.1.26.jar:/usr/share/zookeeper/javacc.jar:/usr/share/zookeeper/jackson-mapper-asl-1.9.11.jar:/usr/share/zookeeper/jackson-core-asl-1.9.11.jar:/usr/share/zookeeper/commons-cli-1.2.jar:/usr/src/java/lib/*.jar:/usr/etc/zookeeper" + +ZOOCFG="$ZOOCFGDIR/zoo.cfg" +ZOO_LOG_DIR=/var/log/$NAME +USER=zookeeper +GROUP=zookeeper +PIDDIR=/var/run/$NAME +PIDFILE=$PIDDIR/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +JAVA=/usr/bin/java +ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain" +ZOO_LOG4J_PROP="INFO,ROLLINGFILE" +JMXLOCALONLY=false +JAVA_OPTS="-Xms{{ '{{' }} cluster.get('xms','128M') {{ '}}' }} \ + -Xmx{{ '{{' }} cluster.get('xmx','1G') {{ '}}' }} \ + -Xloggc:/var/log/$NAME/zookeeper-gc.log \ + -XX:+UseGCLogFileRotation \ + -XX:NumberOfGCLogFiles=16 \ + -XX:GCLogFileSize=16M \ + -verbose:gc \ + -XX:+PrintGCTimeStamps \ + -XX:+PrintGCDateStamps \ + -XX:+PrintGCDetails + -XX:+PrintTenuringDistribution \ + -XX:+PrintGCApplicationStoppedTime \ + -XX:+PrintGCApplicationConcurrentTime \ + -XX:+PrintSafepointStatistics \ + -XX:+UseParNewGC \ + -XX:+UseConcMarkSweepGC \ +-XX:+CMSParallelRemarkEnabled" +``` + +Sel init: + +``` text +description "zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }} centralized coordination service" + +start on runlevel [2345] +stop on runlevel [!2345] + +respawn + +limit nofile 8192 8192 + +pre-start script + [ -r "/etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/environment" ] || exit 0 + . /etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/environment + [ -d $ZOO_LOG_DIR ] || mkdir -p $ZOO_LOG_DIR + chown $USER:$GROUP $ZOO_LOG_DIR +end script + +script + . /etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/environment + [ -r /etc/default/zookeeper ] && . /etc/default/zookeeper + if [ -z "$JMXDISABLE" ]; then + JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY" + fi + exec start-stop-daemon --start -c $USER --exec $JAVA --name zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }} \ + -- -cp $CLASSPATH $JAVA_OPTS -Dzookeeper.log.dir=${ZOO_LOG_DIR} \ + -Dzookeeper.root.logger=${ZOO_LOG4J_PROP} $ZOOMAIN $ZOOCFG +end script +``` + +[Article Original](https://clickhouse.tech/docs/en/operations/tips/) diff --git a/docs/fr/operations/troubleshooting.md b/docs/fr/operations/troubleshooting.md new file mode 100644 index 00000000000..d8214cdcddc --- /dev/null +++ b/docs/fr/operations/troubleshooting.md @@ -0,0 +1,143 @@ +--- +machine_translated: true +--- + +# Dépannage {#troubleshooting} + +- [Installation](#troubleshooting-installation-errors) +- [Connexion au serveur](#troubleshooting-accepts-no-connections) +- [Traitement des requêtes](#troubleshooting-does-not-process-queries) +- [Efficacité du traitement des requêtes](#troubleshooting-too-slow) + +## Installation {#troubleshooting-installation-errors} + +### Vous ne pouvez pas obtenir de paquets deb à partir du référentiel ClickHouse avec apt-get {#you-cannot-get-deb-packages-from-clickhouse-repository-with-apt-get} + +- Vérifiez les paramètres du pare-feu. +- Si vous ne pouvez pas accéder au référentiel pour quelque raison que ce soit, téléchargez les packages comme décrit dans [Prise en main](../getting_started/index.md) article et les installer manuellement en utilisant le `sudo dpkg -i ` commande. Vous aurez aussi besoin d' `tzdata` paquet. + +## Connexion au Serveur {#troubleshooting-accepts-no-connections} + +Problèmes possibles: + +- Le serveur n'est pas en cours d'exécution. +- Paramètres de configuration inattendus ou incorrects. + +### Le Serveur N'Est Pas En Cours D'Exécution {#server-is-not-running} + +**Vérifiez si le serveur est runnnig** + +Commande: + +``` bash +$ sudo service clickhouse-server status +``` + +Si le serveur n'est pas en cours d'exécution, démarrez-le avec la commande: + +``` bash +$ sudo service clickhouse-server start +``` + +**Vérifier les journaux** + +Le journal principal de `clickhouse-server` est dans `/var/log/clickhouse-server/clickhouse-server.log` par défaut. + +Si le serveur a démarré avec succès, vous devriez voir les chaînes: + +- ` Application: starting up.` — Server started. +- ` Application: Ready for connections.` — Server is running and ready for connections. + +Si `clickhouse-server` démarrage a échoué avec une erreur de configuration, vous devriez voir la `` chaîne avec une description de l'erreur. Exemple: + +``` text +2019.01.11 15:23:25.549505 [ 45 ] {} ExternalDictionaries: Failed reloading 'event2id' external dictionary: Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused, e.what() = Connection refused +``` + +Si vous ne voyez pas d'erreur à la fin du fichier, parcourez le fichier entier à partir de la chaîne: + +``` text + Application: starting up. +``` + +Si vous essayez de démarrer une deuxième instance de `clickhouse-server` sur le serveur, vous voyez le journal suivant: + +``` text +2019.01.11 15:25:11.151730 [ 1 ] {} : Starting ClickHouse 19.1.0 with revision 54413 +2019.01.11 15:25:11.154578 [ 1 ] {} Application: starting up +2019.01.11 15:25:11.156361 [ 1 ] {} StatusFile: Status file ./status already exists - unclean restart. Contents: +PID: 8510 +Started at: 2019-01-11 15:24:23 +Revision: 54413 + +2019.01.11 15:25:11.156673 [ 1 ] {} Application: DB::Exception: Cannot lock file ./status. Another server instance in same directory is already running. +2019.01.11 15:25:11.156682 [ 1 ] {} Application: shutting down +2019.01.11 15:25:11.156686 [ 1 ] {} Application: Uninitializing subsystem: Logging Subsystem +2019.01.11 15:25:11.156716 [ 2 ] {} BaseDaemon: Stop SignalListener thread +``` + +**Voir système.d les journaux** + +Si vous ne trouvez aucune information utile dans `clickhouse-server` journaux ou il n'y a pas de journaux, vous pouvez afficher `system.d` journaux à l'aide de la commande: + +``` bash +$ sudo journalctl -u clickhouse-server +``` + +**Démarrer clickhouse-server en mode interactif** + +``` bash +$ sudo -u clickhouse /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml +``` + +Cette commande démarre le serveur en tant qu'application interactive avec les paramètres standard du script de démarrage automatique. Dans ce mode `clickhouse-server` imprime tous les messages d'événement dans la console. + +### Paramètres De Configuration {#configuration-parameters} + +Vérifier: + +- Le panneau paramètres. + + Si vous exécutez ClickHouse dans Docker dans un réseau IPv6, assurez-vous que `network=host` est définie. + +- Paramètres du point de terminaison. + + Vérifier [listen\_host](server_settings/settings.md#server_settings-listen_host) et [tcp\_port](server_settings/settings.md#server_settings-tcp_port) paramètre. + + Clickhouse server accepte les connexions localhost uniquement par défaut. + +- Paramètres du protocole HTTP. + + Vérifiez les paramètres de protocole pour L'API HTTP. + +- Paramètres de connexion sécurisés. + + Vérifier: + + - Le [tcp\_port\_secure](server_settings/settings.md#server_settings-tcp_port_secure) paramètre. + - Paramètres pour [SSL sertificates](server_settings/settings.md#server_settings-openssl). + + Utilisez les paramètres appropriés lors de la connexion. Par exemple, l'utilisation de la `port_secure` paramètre avec `clickhouse_client`. + +- Les paramètres de l'utilisateur. + + Vous utilisez peut-être un mauvais nom d'utilisateur ou mot de passe. + +## Traitement Des Requêtes {#troubleshooting-does-not-process-queries} + +Si ClickHouse ne peut pas traiter la requête, il envoie une description d'erreur au client. Dans le `clickhouse-client` vous obtenez une description de l'erreur dans la console. Si vous utilisez L'interface HTTP, ClickHouse envoie la description de l'erreur dans le corps de la réponse. Exemple: + +``` bash +$ curl 'http://localhost:8123/' --data-binary "SELECT a" +Code: 47, e.displayText() = DB::Exception: Unknown identifier: a. Note that there are no tables (FROM clause) in your query, context: required_names: 'a' source_tables: table_aliases: private_aliases: column_aliases: public_columns: 'a' masked_columns: array_join_columns: source_columns: , e.what() = DB::Exception +``` + +Si vous commencez à `clickhouse-client` avec l' `stack-trace` paramètre, ClickHouse renvoie la trace de la pile du serveur avec la description d'une erreur. + +Vous pouvez voir un message sur une connexion rompue. Dans ce cas, vous pouvez répéter la requête. Si la connexion se rompt chaque fois que vous effectuez la requête, vérifiez les journaux du serveur pour détecter les erreurs. + +## Efficacité du traitement des requêtes {#troubleshooting-too-slow} + +Si vous voyez que ClickHouse fonctionne trop lentement, vous devez profiler la charge sur les ressources du serveur et le réseau pour vos requêtes. + +Vous pouvez utiliser l'utilitaire clickhouse-benchmark pour profiler les requêtes. Il indique le nombre de requêtes traitées par seconde, le nombre de lignes traitées par seconde, et les percentiles de temps de traitement des requêtes. diff --git a/docs/fr/operations/update.md b/docs/fr/operations/update.md new file mode 100644 index 00000000000..e92147e2d65 --- /dev/null +++ b/docs/fr/operations/update.md @@ -0,0 +1,17 @@ +--- +machine_translated: true +--- + +# Mise À Jour De ClickHouse {#clickhouse-update} + +Si ClickHouse a été installé à partir de paquets deb, exécutez les commandes suivantes sur le serveur: + +``` bash +$ sudo apt-get update +$ sudo apt-get install clickhouse-client clickhouse-server +$ sudo service clickhouse-server restart +``` + +Si vous avez installé ClickHouse en utilisant autre chose que les paquets deb recommandés, utilisez la méthode de mise à jour appropriée. + +ClickHouse ne prend pas en charge une mise à jour distribuée. L'opération doit être effectuée consécutivement sur chaque serveur séparé. Ne pas mettre à jour tous les serveurs d'un cluster simultanément, ou le cluster sera indisponible pendant un certain temps. diff --git a/docs/fr/operations/utils/clickhouse-benchmark.md b/docs/fr/operations/utils/clickhouse-benchmark.md new file mode 100644 index 00000000000..00c3f588039 --- /dev/null +++ b/docs/fr/operations/utils/clickhouse-benchmark.md @@ -0,0 +1,153 @@ +--- +machine_translated: true +--- + +# clickhouse-benchmark {#clickhouse-benchmark} + +Se connecte à un serveur ClickHouse et envoie à plusieurs reprises des requêtes spécifiées. + +Syntaxe: + +``` bash +$ echo "single query" | clickhouse-benchmark [keys] +``` + +ou + +``` bash +$ clickhouse-benchmark [keys] <<< "single query" +``` + +Si vous souhaitez envoyer un ensemble de requêtes, créez un fichier texte et placez chaque requête sur la chaîne individuelle de ce fichier. Exemple: + +``` sql +SELECT * FROM system.numbers LIMIT 10000000 +SELECT 1 +``` + +Ensuite, passez ce fichier à une entrée standard de `clickhouse-benchmark`. + +``` bash +clickhouse-benchmark [keys] < queries_file +``` + +## Touches {#clickhouse-benchmark-keys} + +- `-c N`, `--concurrency=N` — Number of queries that `clickhouse-benchmark` envoie simultanément. Valeur par défaut: 1. +- `-d N`, `--delay=N` — Interval in seconds between intermediate reports (set 0 to disable reports). Default value: 1. +- `-h WORD`, `--host=WORD` — Server host. Default value: `localhost`. Pour l' [mode de comparaison](#clickhouse-benchmark-comparison-mode) vous pouvez utiliser plusieurs `-h` touches. +- `-p N`, `--port=N` — Server port. Default value: 9000. For the [mode de comparaison](#clickhouse-benchmark-comparison-mode) vous pouvez utiliser plusieurs `-p` touches. +- `-i N`, `--iterations=N` — Total number of queries. Default value: 0. +- `-r`, `--randomize` — Random order of queries execution if there is more then one input query. +- `-s`, `--secure` — Using TLS connection. +- `-t N`, `--timelimit=N` — Time limit in seconds. `clickhouse-benchmark` arrête d'envoyer des requêtes lorsque le délai spécifié est atteint. Valeur par défaut: 0 (limite de temps désactivée). +- `--confidence=N` — Level of confidence for T-test. Possible values: 0 (80%), 1 (90%), 2 (95%), 3 (98%), 4 (99%), 5 (99.5%). Default value: 5. In the [mode de comparaison](#clickhouse-benchmark-comparison-mode) `clickhouse-benchmark` effectue les [Test T de L'étudiant indépendant à deux échantillons](https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test) tester pour déterminer si les deux distributions ne sont pas différentes avec le niveau de confiance sélectionné. +- `--cumulative` — Printing cumulative data instead of data per interval. +- `--database=DATABASE_NAME` — ClickHouse database name. Default value: `default`. +- `--json=FILEPATH` — JSON output. When the key is set, `clickhouse-benchmark` génère un rapport dans le fichier JSON spécifié. +- `--user=USERNAME` — ClickHouse user name. Default value: `default`. +- `--password=PSWD` — ClickHouse user password. Default value: empty string. +- `--stacktrace` — Stack traces output. When the key is set, `clickhouse-bencmark` affiche les traces d'exceptions de la pile. +- `--stage=WORD` — Query processing stage at server. ClickHouse stops query processing and returns answer to `clickhouse-benchmark` à l'étape spécifiée. Valeurs possibles: `complete`, `fetch_columns`, `with_mergeable_state`. Valeur par défaut: `complete`. +- `--help` — Shows the help message. + +Si vous voulez appliquer des [paramètre](../../operations/settings/index.md) pour les requêtes, les passer comme une clé `--= SETTING_VALUE`. Exemple, `--max_memory_usage=1048576`. + +## Sortie {#clickhouse-benchmark-output} + +Par défaut, `clickhouse-benchmark` les rapports de chaque `--delay` intervalle. + +Exemple de rapport: + +``` text +Queries executed: 10. + +localhost:9000, queries 10, QPS: 6.772, RPS: 67904487.440, MiB/s: 518.070, result RPS: 67721584.984, result MiB/s: 516.675. + +0.000% 0.145 sec. +10.000% 0.146 sec. +20.000% 0.146 sec. +30.000% 0.146 sec. +40.000% 0.147 sec. +50.000% 0.148 sec. +60.000% 0.148 sec. +70.000% 0.148 sec. +80.000% 0.149 sec. +90.000% 0.150 sec. +95.000% 0.150 sec. +99.000% 0.150 sec. +99.900% 0.150 sec. +99.990% 0.150 sec. +``` + +Dans le rapport, vous pouvez trouver: + +- Nombre de requêtes dans le `Queries executed:` champ. + +- Le statut de chaîne de caractères contenant (dans l'ordre): + + - Point de terminaison du serveur ClickHouse. + - Nombre de requêtes traitées. + - QPS: QPS: combien de requêtes serveur effectuées par seconde pendant une période spécifiée dans le `--delay` argument. + - RPS: combien de lignes le serveur a lues par seconde pendant une période spécifiée dans `--delay` argument. + - MiB/ s: combien de mebibytes serveur lus par seconde pendant une période spécifiée dans le `--delay` argument. + - résultat RPS: combien de lignes placées par le serveur au résultat d'une requête par seconde pendant une période spécifiée dans le `--delay` argument. + - MiB / s de résultat. combien de mibibytes placés par le serveur au résultat d'une requête par seconde pendant une période spécifiée dans `--delay` argument. + +- Percentiles du temps d'exécution des requêtes. + +## Mode de comparaison {#clickhouse-benchmark-comparison-mode} + +`clickhouse-benchmark` peut comparer les performances pour deux serveurs clickhouse en cours d'exécution. + +Pour utiliser le mode de comparaison, spécifiez les points de terminaison des deux serveurs par deux paires de `--host`, `--port` touches. Clés appariées ensemble par position dans la liste des arguments, la première `--host` est assorti avec le premier `--port` et ainsi de suite. `clickhouse-benchmark` établit les connexions aux serveurs, puis envoie des requêtes. Chaque requête adressée à un serveur sélectionné au hasard. Les résultats sont présentés pour chaque serveur séparément. + +## Exemple {#clickhouse-benchmark-example} + +``` bash +$ echo "SELECT * FROM system.numbers LIMIT 10000000 OFFSET 10000000" | clickhouse-benchmark -i 10 +``` + +``` text +Loaded 1 queries. + +Queries executed: 6. + +localhost:9000, queries 6, QPS: 6.153, RPS: 123398340.957, MiB/s: 941.455, result RPS: 61532982.200, result MiB/s: 469.459. + +0.000% 0.159 sec. +10.000% 0.159 sec. +20.000% 0.159 sec. +30.000% 0.160 sec. +40.000% 0.160 sec. +50.000% 0.162 sec. +60.000% 0.164 sec. +70.000% 0.165 sec. +80.000% 0.166 sec. +90.000% 0.166 sec. +95.000% 0.167 sec. +99.000% 0.167 sec. +99.900% 0.167 sec. +99.990% 0.167 sec. + + + +Queries executed: 10. + +localhost:9000, queries 10, QPS: 6.082, RPS: 121959604.568, MiB/s: 930.478, result RPS: 60815551.642, result MiB/s: 463.986. + +0.000% 0.159 sec. +10.000% 0.159 sec. +20.000% 0.160 sec. +30.000% 0.163 sec. +40.000% 0.164 sec. +50.000% 0.165 sec. +60.000% 0.166 sec. +70.000% 0.166 sec. +80.000% 0.167 sec. +90.000% 0.167 sec. +95.000% 0.170 sec. +99.000% 0.172 sec. +99.900% 0.172 sec. +99.990% 0.172 sec. +``` diff --git a/docs/fr/operations/utils/clickhouse-copier.md b/docs/fr/operations/utils/clickhouse-copier.md new file mode 100644 index 00000000000..de7bb56f32b --- /dev/null +++ b/docs/fr/operations/utils/clickhouse-copier.md @@ -0,0 +1,173 @@ +--- +machine_translated: true +--- + +# clickhouse-copieur {#clickhouse-copier} + +Copie les données des tables d'un cluster vers des tables d'un autre cluster (ou du même cluster). + +Vous pouvez exécuter plusieurs `clickhouse-copier` instances sur différents serveurs pour effectuer le même travail. ZooKeeper est utilisé pour synchroniser les processus. + +Après le démarrage de, `clickhouse-copier`: + +- Se connecte à ZooKeeper et reçoit: + + - La copie de tâches. + - L'état de la copie d'emplois. + +- Il effectue les travaux. + + Chaque processus en cours choisit le “closest” eclat du cluster source et copie les données dans le cluster de destination, la refragmentation les données si nécessaire. + +`clickhouse-copier` suit les changements dans ZooKeeper et les applique à la volée. + +Pour réduire le trafic réseau, nous vous recommandons de `clickhouse-copier` sur le même serveur où se trouvent les données source. + +## Course clickhouse-copieur {#running-clickhouse-copier} + +L'utilitaire doit être exécuté manuellement: + +``` bash +$ clickhouse-copier copier --daemon --config zookeeper.xml --task-path /task/path --base-dir /path/to/dir +``` + +Paramètre: + +- `daemon` — Starts `clickhouse-copier` en mode démon. +- `config` — The path to the `zookeeper.xml` fichier avec les paramètres pour la connexion à la Gardienne. +- `task-path` — The path to the ZooKeeper node. This node is used for syncing `clickhouse-copier` processus et stockage des tâches. Les tâches sont stockées dans `$task-path/description`. +- `task-file` — Optional path to file with task configuration for initial upload to ZooKeeper. +- `task-upload-force` — Force upload `task-file` même si le nœud existe déjà. +- `base-dir` — The path to logs and auxiliary files. When it starts, `clickhouse-copier` crée `clickhouse-copier_YYYYMMHHSS_` les sous-répertoires `$base-dir`. Si ce paramètre est omis, les répertoires sont créés dans le répertoire où `clickhouse-copier` a été lancé. + +## Format de zookeeper.XML {#format-of-zookeeper-xml} + +``` xml + + + trace + 100M + 3 + + + + + 127.0.0.1 + 2181 + + + +``` + +## Configuration des tâches de copie {#configuration-of-copying-tasks} + +``` xml + + + + + + false + + 127.0.0.1 + 9000 + + + ... + + + + ... + + + + + 2 + + + + 1 + + + + + 0 + + + + + 3 + + 1 + + + + + + + + source_cluster + test + hits + + + destination_cluster + test + hits2 + + + + ENGINE=ReplicatedMergeTree('/clickhouse/tables/{cluster}/{shard}/hits2', '{replica}') + PARTITION BY toMonday(date) + ORDER BY (CounterID, EventDate) + + + + jumpConsistentHash(intHash64(UserID), 2) + + + CounterID != 0 + + + + '2018-02-26' + '2018-03-05' + ... + + + + + + ... + + ... + + +``` + +`clickhouse-copier` suit les changements dans `/task/path/description` et les applique à la volée. Par exemple, si vous modifiez la valeur de `max_workers`, le nombre de processus exécutant des tâches changera également. + +[Article Original](https://clickhouse.tech/docs/en/operations/utils/clickhouse-copier/) diff --git a/docs/fr/operations/utils/clickhouse-local.md b/docs/fr/operations/utils/clickhouse-local.md new file mode 100644 index 00000000000..60e3c885d57 --- /dev/null +++ b/docs/fr/operations/utils/clickhouse-local.md @@ -0,0 +1,78 @@ +--- +machine_translated: true +--- + +# clickhouse-local {#clickhouse-local} + +Le `clickhouse-local` programme vous permet d'effectuer un traitement rapide sur les fichiers locaux, sans avoir à déployer et configurer le serveur ClickHouse. + +Accepte les données qui représentent des tables et les interroge en utilisant [Clickhouse dialecte SQL](../../query_language/index.md). + +`clickhouse-local` utilise le même noyau que clickhouse server, de sorte qu'il prend en charge la plupart des fonctionnalités et le même ensemble de formats et de moteurs de table. + +Par défaut `clickhouse-local` n'a pas accès aux données sur le même hôte, mais il prend en charge le chargement de la configuration du serveur à l'aide `--config-file` argument. + +!!! warning "Avertissement" + Il n'est pas recommandé de charger la configuration du serveur de production dans `clickhouse-local` parce que les données peuvent être endommagées en cas d'erreur humaine. + +## Utilisation {#usage} + +Utilisation de base: + +``` bash +$ clickhouse-local --structure "table_structure" --input-format "format_of_incoming_data" -q "query" +``` + +Argument: + +- `-S`, `--structure` — table structure for input data. +- `-if`, `--input-format` — input format, `TSV` par défaut. +- `-f`, `--file` — path to data, `stdin` par défaut. +- `-q` `--query` — queries to execute with `;` comme délimiteur. +- `-N`, `--table` — table name where to put output data, `table` par défaut. +- `-of`, `--format`, `--output-format` — output format, `TSV` par défaut. +- `--stacktrace` — whether to dump debug output in case of exception. +- `--verbose` — more details on query execution. +- `-s` — disables `stderr` journalisation. +- `--config-file` — path to configuration file in same format as for ClickHouse server, by default the configuration empty. +- `--help` — arguments references for `clickhouse-local`. + +Il existe également des arguments pour chaque variable de configuration de ClickHouse qui sont plus couramment utilisés à la place de `--config-file`. + +## Exemple {#examples} + +``` bash +$ echo -e "1,2\n3,4" | clickhouse-local -S "a Int64, b Int64" -if "CSV" -q "SELECT * FROM table" +Read 2 rows, 32.00 B in 0.000 sec., 5182 rows/sec., 80.97 KiB/sec. +1 2 +3 4 +``` + +Exemple précédent est le même que: + +``` bash +$ echo -e "1,2\n3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); SELECT a, b FROM table; DROP TABLE table" +Read 2 rows, 32.00 B in 0.000 sec., 4987 rows/sec., 77.93 KiB/sec. +1 2 +3 4 +``` + +Maintenant, nous allons sortie utilisateur de mémoire pour chaque utilisateur Unix: + +``` bash +$ ps aux | tail -n +2 | awk '{ printf("%s\t%s\n", $1, $4) }' | clickhouse-local -S "user String, mem Float64" -q "SELECT user, round(sum(mem), 2) as memTotal FROM table GROUP BY user ORDER BY memTotal DESC FORMAT Pretty" +``` + +``` text +Read 186 rows, 4.15 KiB in 0.035 sec., 5302 rows/sec., 118.34 KiB/sec. +┏━━━━━━━━━━┳━━━━━━━━━━┓ +┃ user ┃ memTotal ┃ +┡━━━━━━━━━━╇━━━━━━━━━━┩ +│ bayonet │ 113.5 │ +├──────────┼──────────┤ +│ root │ 8.8 │ +├──────────┼──────────┤ +... +``` + +[Article Original](https://clickhouse.tech/docs/en/operations/utils/clickhouse-local/) diff --git a/docs/fr/operations/utils/index.md b/docs/fr/operations/utils/index.md new file mode 100644 index 00000000000..29f9b647301 --- /dev/null +++ b/docs/fr/operations/utils/index.md @@ -0,0 +1,11 @@ +--- +machine_translated: true +--- + +# Clickhouse Utilitaire {#clickhouse-utility} + +- [clickhouse-local](clickhouse-local.md) — Allows running SQL queries on data without stopping the ClickHouse server, similar to how `awk` ne ce. +- [clickhouse-copieur](clickhouse-copier.md) — Copies (and reshards) data from one cluster to another cluster. +- [clickhouse-benchmark](clickhouse-benchmark.md) — Loads server with the custom queries and settings. + +[Article Original](https://clickhouse.tech/docs/en/operations/utils/) diff --git a/docs/fr/query_language/agg_functions/combinators.md b/docs/fr/query_language/agg_functions/combinators.md new file mode 100644 index 00000000000..bbf28b12c96 --- /dev/null +++ b/docs/fr/query_language/agg_functions/combinators.md @@ -0,0 +1,163 @@ +--- +machine_translated: true +--- + +# Combinateurs de fonction d'agrégat {#aggregate_functions_combinators} + +Le nom d'une fonction d'agrégat peut avoir un suffixe ajouté. Cela change la façon dont la fonction d'agrégation fonctionne. + +## -Si {#agg-functions-combinator-if} + +The suffix -If can be appended to the name of any aggregate function. In this case, the aggregate function accepts an extra argument – a condition (Uint8 type). The aggregate function processes only the rows that trigger the condition. If the condition was not triggered even once, it returns a default value (usually zeros or empty strings). + +Exemple: `sumIf(column, cond)`, `countIf(cond)`, `avgIf(x, cond)`, `quantilesTimingIf(level1, level2)(x, cond)`, `argMinIf(arg, val, cond)` et ainsi de suite. + +Avec les fonctions d'agrégat conditionnel, vous pouvez calculer des agrégats pour plusieurs conditions à la fois, sans utiliser de sous-requêtes et `JOIN`s. Par exemple, dans Yandex.Metrica, les fonctions d'agrégat conditionnel sont utilisées pour implémenter la fonctionnalité de comparaison de segment. + +## -Tableau {#agg-functions-combinator-array} + +Le Tableau suffixe peut être ajouté à toute fonction d'agrégation. Dans ce cas, la fonction d'agrégation des arguments de la ‘Array(T)’ type (tableaux) au lieu de ‘T’ tapez les arguments. Si la fonction aggregate accepte plusieurs arguments, il doit s'agir de tableaux de longueurs égales. Lors du traitement des tableaux, la fonction d'agrégation fonctionne comme la fonction d'agrégation d'origine sur tous les éléments du tableau. + +Exemple 1: `sumArray(arr)` - Totalise tous les éléments de tous ‘arr’ tableau. Dans cet exemple, il aurait pu être écrit plus simplement: `sum(arraySum(arr))`. + +Exemple 2: `uniqArray(arr)` – Counts the number of unique elements in all ‘arr’ tableau. Cela pourrait être fait d'une manière plus facile: `uniq(arrayJoin(arr))` mais ce n'est pas toujours possible d'ajouter des ‘arrayJoin’ pour une requête. + +\- Si et-tableau peut être combiné. Cependant, ‘Array’ doit venir en premier, puis ‘If’. Exemple: `uniqArrayIf(arr, cond)`, `quantilesTimingArrayIf(level1, level2)(arr, cond)`. En raison de cet ordre, le ‘cond’ argument ne sera pas un tableau. + +## -État {#agg-functions-combinator-state} + +Si vous appliquez ce combinateur, la fonction d'agrégation ne renvoie pas la valeur résultante (par exemple le nombre de valeurs uniques pour [uniq](reference.md#agg_function-uniq) la fonction), mais un état intermédiaire de l'agrégation (pour `uniq`, c'est la table de hachage pour calculer le nombre de valeurs uniques). C'est un `AggregateFunction(...)` qui peuvent être utilisés pour un traitement ultérieur ou stockés dans un tableau pour terminer l'agrégation plus tard. + +Pour travailler avec ces états, utilisez: + +- [AggregatingMergeTree](../../operations/table_engines/aggregatingmergetree.md) tableau moteur. +- [finalizeAggregation](../functions/other_functions.md#function-finalizeaggregation) fonction. +- [runningAccumulate](../functions/other_functions.md#function-runningaccumulate) fonction. +- [-Fusionner](#aggregate_functions_combinators_merge) combinator. +- [-MergeState](#aggregate_functions_combinators_mergestate) combinator. + +## -Fusionner {#aggregate_functions_combinators-merge} + +Si vous appliquez ce combinateur, la fonction d'agrégation prend l'état d'agrégation intermédiaire comme argument, combine les États pour terminer l'agrégation et renvoie la valeur résultante. + +## -MergeState {#aggregate_functions_combinators-mergestate} + +Fusionne les États d'agrégation intermédiaires de la même manière que le combinateur-Merge. Cependant, il ne renvoie pas la valeur résultante, mais un État d'agrégation intermédiaire, similaire au combinateur-State. + +## - ForEach {#agg-functions-combinator-foreach} + +Convertit une fonction d'agrégation pour les tables en une fonction d'agrégation pour les tableaux qui agrège les éléments de tableau correspondants et renvoie un tableau de résultats. Exemple, `sumForEach` pour les tableaux `[1, 2]`, `[3, 4, 5]`et`[6, 7]`renvoie le résultat `[10, 13, 5]` après avoir additionné les éléments de tableau correspondants. + +## - OrDefault {#agg-functions-combinator-ordefault} + +Remplit la valeur par défaut du type de retour de la fonction d'agrégation s'il n'y a rien à agréger. + +``` sql +SELECT avg(number), avgOrDefault(number) FROM numbers(0) +``` + +``` text +┌─avg(number)─┬─avgOrDefault(number)─┐ +│ nan │ 0 │ +└─────────────┴──────────────────────┘ +``` + +## - OrNull {#agg-functions-combinator-ornull} + +Remplir `null` si il n'y a rien à s'agréger. La colonne de retour sera nullable. + +``` sql +SELECT avg(number), avgOrNull(number) FROM numbers(0) +``` + +``` text +┌─avg(number)─┬─avgOrNull(number)─┐ +│ nan │ ᴺᵁᴸᴸ │ +└─────────────┴───────────────────┘ +``` + +\- OrDefault et-OrNull peuvent être combinés avec d'autres combinateurs. Il est utile lorsque la fonction d'agrégation n'accepte pas l'entrée vide. + +``` sql +SELECT avgOrNullIf(x, x > 10) +FROM +( + SELECT toDecimal32(1.23, 2) AS x +) +``` + +``` text +┌─avgOrNullIf(x, greater(x, 10))─┐ +│ ᴺᵁᴸᴸ │ +└────────────────────────────────┘ +``` + +## -Resample {#agg-functions-combinator-resample} + +Permet de diviser les données en groupes, puis séparément agrège les données de ces groupes. Les groupes sont créés en divisant les valeurs d'une colonne en intervalles. + +``` sql +Resample(start, end, step)(, resampling_key) +``` + +**Paramètre** + +- `start` — Starting value of the whole required interval for `resampling_key` valeur. +- `stop` — Ending value of the whole required interval for `resampling_key` valeur. L'ensemble de l'intervalle ne comprend pas les `stop` valeur `[start, stop)`. +- `step` — Step for separating the whole interval into subintervals. The `aggFunction` est exécuté sur chacun de ces sous-intervalles indépendamment. +- `resampling_key` — Column whose values are used for separating data into intervals. +- `aggFunction_params` — `aggFunction` paramètre. + +**Valeurs renvoyées** + +- Tableau de `aggFunction` les résultats pour chaque subinterval. + +**Exemple** + +Envisager l' `people` le tableau avec les données suivantes: + +``` text +┌─name───┬─age─┬─wage─┐ +│ John │ 16 │ 10 │ +│ Alice │ 30 │ 15 │ +│ Mary │ 35 │ 8 │ +│ Evelyn │ 48 │ 11.5 │ +│ David │ 62 │ 9.9 │ +│ Brian │ 60 │ 16 │ +└────────┴─────┴──────┘ +``` + +Obtenons les noms des personnes dont l'âge se trouve dans les intervalles de `[30,60)` et `[60,75)`. Puisque nous utilisons la représentation entière pour l'âge, nous obtenons des âges dans le `[30, 59]` et `[60,74]` intervalle. + +Pour agréger des noms dans un tableau, nous utilisons [grouperay](reference.md#agg_function-grouparray) fonction d'agrégation. Il faut un argument. Dans notre cas, c'est l' `name` colonne. Le `groupArrayResample` fonction devrait utiliser le `age` colonne pour agréger les noms par âge. Pour définir les intervalles requis, nous passons le `30, 75, 30` des arguments dans la `groupArrayResample` fonction. + +``` sql +SELECT groupArrayResample(30, 75, 30)(name, age) FROM people +``` + +``` text +┌─groupArrayResample(30, 75, 30)(name, age)─────┐ +│ [['Alice','Mary','Evelyn'],['David','Brian']] │ +└───────────────────────────────────────────────┘ +``` + +Considérez les résultats. + +`Jonh` est hors de l'échantillon parce qu'il est trop jeune. D'autres personnes sont distribués selon les intervalles d'âge. + +Maintenant, nous allons compter le nombre total de personnes et leur salaire moyen dans les intervalles d'âge. + +``` sql +SELECT + countResample(30, 75, 30)(name, age) AS amount, + avgResample(30, 75, 30)(wage, age) AS avg_wage +FROM people +``` + +``` text +┌─amount─┬─avg_wage──────────────────┐ +│ [3,2] │ [11.5,12.949999809265137] │ +└────────┴───────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/agg_functions/combinators/) diff --git a/docs/fr/query_language/agg_functions/index.md b/docs/fr/query_language/agg_functions/index.md new file mode 100644 index 00000000000..c8d24c2c241 --- /dev/null +++ b/docs/fr/query_language/agg_functions/index.md @@ -0,0 +1,58 @@ +--- +machine_translated: true +--- + +# Les fonctions d'agrégation {#aggregate-functions} + +Les fonctions d'agrégation fonctionnent dans le [normal](http://www.sql-tutorial.com/sql-aggregate-functions-sql-tutorial) comme prévu par les experts de la base de données. + +Clickhouse prend également en charge: + +- [Fonctions d'agrégat paramétriques](parametric_functions.md#aggregate_functions_parametric) qui acceptent d'autres paramètres en plus des colonnes. +- [Combinators](combinators.md#aggregate_functions_combinators), qui modifient le comportement des fonctions d'agrégation. + +## Le traitement NULL {#null-processing} + +Au cours de l'agrégation, tous les `NULL`s sont ignorés. + +**Exemple:** + +Considérez ce tableau: + +``` text +┌─x─┬────y─┐ +│ 1 │ 2 │ +│ 2 │ ᴺᵁᴸᴸ │ +│ 3 │ 2 │ +│ 3 │ 3 │ +│ 3 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +Disons que vous devez totaliser les valeurs dans le `y` colonne: + +``` sql +SELECT sum(y) FROM t_null_big +``` + + ┌─sum(y)─┐ + │ 7 │ + └────────┘ + +Le `sum` la fonction d'interprète `NULL` comme `0`. En particulier, cela signifie que si la fonction reçoit en entrée d'une sélection où toutes les valeurs sont `NULL`, alors le résultat sera `0`, pas `NULL`. + +Maintenant, vous pouvez utiliser le `groupArray` fonction pour créer un tableau à partir `y` colonne: + +``` sql +SELECT groupArray(y) FROM t_null_big +``` + +``` text +┌─groupArray(y)─┐ +│ [2,2,3] │ +└───────────────┘ +``` + +`groupArray` ne comprend pas `NULL` dans le tableau résultant. + +[Article Original](https://clickhouse.tech/docs/en/query_language/agg_functions/) diff --git a/docs/fr/query_language/agg_functions/parametric_functions.md b/docs/fr/query_language/agg_functions/parametric_functions.md new file mode 100644 index 00000000000..51a2c755cdc --- /dev/null +++ b/docs/fr/query_language/agg_functions/parametric_functions.md @@ -0,0 +1,496 @@ +--- +machine_translated: true +--- + +# Fonctions d'agrégat paramétriques {#aggregate_functions_parametric} + +Some aggregate functions can accept not only argument columns (used for compression), but a set of parameters – constants for initialization. The syntax is two pairs of brackets instead of one. The first is for parameters, and the second is for arguments. + +## histogramme {#histogram} + +Calcule un histogramme adaptatif. Cela ne garantit pas des résultats précis. + +``` sql +histogram(number_of_bins)(values) +``` + +Les fonctions utilise [Un Algorithme D'Arbre De Décision Parallèle En Continu](http://jmlr.org/papers/volume11/ben-haim10a/ben-haim10a.pdf). Les bordures des bacs d'histogramme sont ajustées au fur et à mesure que de nouvelles données entrent dans une fonction. Dans le cas courant, les largeurs des bacs ne sont pas égales. + +**Paramètre** + +`number_of_bins` — Upper limit for the number of bins in the histogram. The function automatically calculates the number of bins. It tries to reach the specified number of bins, but if it fails, it uses fewer bins. +`values` — [Expression](../syntax.md#syntax-expressions) résultant en valeurs d'entrée. + +**Valeurs renvoyées** + +- [Tableau](../../data_types/array.md) de [Tuple](../../data_types/tuple.md) de le format suivant: + + ``` + [(lower_1, upper_1, height_1), ... (lower_N, upper_N, height_N)] + ``` + + - `lower` — Lower bound of the bin. + - `upper` — Upper bound of the bin. + - `height` — Calculated height of the bin. + +**Exemple** + +``` sql +SELECT histogram(5)(number + 1) +FROM ( + SELECT * + FROM system.numbers + LIMIT 20 +) +``` + +``` text +┌─histogram(5)(plus(number, 1))───────────────────────────────────────────┐ +│ [(1,4.5,4),(4.5,8.5,4),(8.5,12.75,4.125),(12.75,17,4.625),(17,20,3.25)] │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +Vous pouvez visualiser un histogramme avec la [bar](../functions/other_functions.md#function-bar) fonction, par exemple: + +``` sql +WITH histogram(5)(rand() % 100) AS hist +SELECT + arrayJoin(hist).3 AS height, + bar(height, 0, 6, 5) AS bar +FROM +( + SELECT * + FROM system.numbers + LIMIT 20 +) +``` + +``` text +┌─height─┬─bar───┐ +│ 2.125 │ █▋ │ +│ 3.25 │ ██▌ │ +│ 5.625 │ ████▏ │ +│ 5.625 │ ████▏ │ +│ 3.375 │ ██▌ │ +└────────┴───────┘ +``` + +Dans ce cas, vous devez vous rappeler que vous ne connaissez pas les frontières de la corbeille d'histogramme. + +## sequenceMatch(pattern)(timestamp, cond1, cond2, …) {#function-sequencematch} + +Vérifie si la séquence contient une chaîne d'événements qui correspond au modèle. + +``` sql +sequenceMatch(pattern)(timestamp, cond1, cond2, ...) +``` + +!!! warning "Avertissement" + Les événements qui se produisent à la même seconde peuvent se situer dans la séquence dans un ordre indéfini affectant le résultat. + +**Paramètre** + +- `pattern` — Pattern string. See [Syntaxe du motif](#sequence-function-pattern-syntax). + +- `timestamp` — Column considered to contain time data. Typical data types are `Date` et `DateTime`. Vous pouvez également utiliser les prises en charge [UInt](../../data_types/int_uint.md) types de données. + +- `cond1`, `cond2` — Conditions that describe the chain of events. Data type: `UInt8`. Vous pouvez passer jusqu'à 32 arguments de condition. La fonction ne prend en compte que les événements décrits dans ces conditions. Si la séquence contient des données qui ne sont pas décrites dans une condition, la fonction les ignore. + +**Valeurs renvoyées** + +- 1, si le profil correspond. +- 0, si le motif ne correspond pas. + +Type: `UInt8`. + + +**Syntaxe du motif** + +- `(?N)` — Matches the condition argument at position `N`. Les Conditions sont numérotées dans le `[1, 32]` gamme. Exemple, `(?1)` correspond à l'argument passé au `cond1` paramètre. + +- `.*` — Matches any number of events. You don't need conditional arguments to match this element of the pattern. + +- `(?t operator value)` — Sets the time in seconds that should separate two events. For example, pattern `(?1)(?t>1800)(?2)` correspond à des événements qui se produisent plus de 1800 secondes les uns des autres. Un nombre arbitraire d'événements peut se trouver entre ces événements. Vous pouvez utiliser l' `>=`, `>`, `<`, `<=` opérateur. + +**Exemple** + +Considérer les données dans le `t` table: + +``` text +┌─time─┬─number─┐ +│ 1 │ 1 │ +│ 2 │ 3 │ +│ 3 │ 2 │ +└──────┴────────┘ +``` + +Effectuer la requête: + +``` sql +SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2) FROM t +``` + +``` text +┌─sequenceMatch('(?1)(?2)')(time, equals(number, 1), equals(number, 2))─┐ +│ 1 │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +La fonction a trouvé la chaîne d'événements où le numéro 2 suit le numéro 1. Il a sauté le numéro 3 entre eux, car le nombre n'est pas décrit comme un événement. Si nous voulons prendre ce nombre en compte lors de la recherche de l'événement de la chaîne donnée dans l'exemple, nous devrions en faire une condition. + +``` sql +SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 3) FROM t +``` + +``` text +┌─sequenceMatch('(?1)(?2)')(time, equals(number, 1), equals(number, 2), equals(number, 3))─┐ +│ 0 │ +└──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +Dans ce cas, la fonction n'a pas pu trouver la chaîne d'événements correspondant au modèle, car l'événement pour le numéro 3 s'est produit entre 1 et 2. Si dans le même cas nous vérifions la condition pour le numéro 4, la séquence correspondrait au motif. + +``` sql +SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 4) FROM t +``` + +``` text +┌─sequenceMatch('(?1)(?2)')(time, equals(number, 1), equals(number, 2), equals(number, 4))─┐ +│ 1 │ +└──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**Voir Aussi** + +- [sequenceCount](#function-sequencecount) + +## sequenceCount(pattern)(time, cond1, cond2, …) {#function-sequencecount} + +Compte le nombre de chaînes d'événements correspondant au motif. La fonction recherche les chaînes d'événements qui ne se chevauchent pas. Il commence à rechercher la chaîne suivante après que la chaîne actuelle est appariée. + +!!! warning "Avertissement" + Les événements qui se produisent à la même seconde peuvent se situer dans la séquence dans un ordre indéfini affectant le résultat. + +``` sql +sequenceCount(pattern)(timestamp, cond1, cond2, ...) +``` + +**Paramètre** + +- `pattern` — Pattern string. See [Syntaxe du motif](#sequence-function-pattern-syntax). + +- `timestamp` — Column considered to contain time data. Typical data types are `Date` et `DateTime`. Vous pouvez également utiliser les prises en charge [UInt](../../data_types/int_uint.md) types de données. + +- `cond1`, `cond2` — Conditions that describe the chain of events. Data type: `UInt8`. Vous pouvez passer jusqu'à 32 arguments de condition. La fonction ne prend en compte que les événements décrits dans ces conditions. Si la séquence contient des données qui ne sont pas décrites dans une condition, la fonction les ignore. + +**Valeurs renvoyées** + +- Nombre de chaînes d'événements qui ne se chevauchent pas et qui sont mises en correspondance. + +Type: `UInt64`. + +**Exemple** + +Considérer les données dans le `t` table: + +``` text +┌─time─┬─number─┐ +│ 1 │ 1 │ +│ 2 │ 3 │ +│ 3 │ 2 │ +│ 4 │ 1 │ +│ 5 │ 3 │ +│ 6 │ 2 │ +└──────┴────────┘ +``` + +Comptez combien de fois le nombre 2 se produit après le nombre 1 avec n'importe quelle quantité d'autres nombres entre eux: + +``` sql +SELECT sequenceCount('(?1).*(?2)')(time, number = 1, number = 2) FROM t +``` + +``` text +┌─sequenceCount('(?1).*(?2)')(time, equals(number, 1), equals(number, 2))─┐ +│ 2 │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +**Voir Aussi** + +- [sequenceMatch](#function-sequencematch) + +## fenêtrefunnel {#windowfunnel} + +Recherche les chaînes d'événements dans une fenêtre de temps coulissante et calcule le nombre maximum d'événements qui se sont produits à partir de la chaîne. + +La fonction fonctionne selon l'algorithme: + +- La fonction recherche les données qui déclenchent la première condition de la chaîne et définit le compteur d'événements sur 1. C'est le moment où la fenêtre coulissante commence. + +- Si les événements de la chaîne se produisent séquentiellement dans la fenêtre, le compteur est incrémenté. Si la séquence d'événements est perturbée, le compteur n'est pas incrémenté. + +- Si les données ont plusieurs chaînes d'événements à différents points d'achèvement, la fonction affichera uniquement la taille de la chaîne la plus longue. + +**Syntaxe** + +``` sql +windowFunnel(window, [mode])(timestamp, cond1, cond2, ..., condN) +``` + +**Paramètre** + +- `window` — Length of the sliding window in seconds. +- `mode` - C'est un argument facultatif. + - `'strict'` - Lorsque le `'strict'` est défini, le windowFunnel() applique des conditions uniquement pour les valeurs uniques. +- `timestamp` — Name of the column containing the timestamp. Data types supported: [Date](../../data_types/date.md), [DateTime](../../data_types/datetime.md#data_type-datetime) et d'autres types entiers non signés (notez que même si timestamp prend en charge le `UInt64` type, sa valeur ne peut pas dépasser le maximum Int64, qui est 2^63 - 1). +- `cond` — Conditions or data describing the chain of events. [UInt8](../../data_types/int_uint.md). + +**Valeur renvoyée** + +Nombre maximal de conditions déclenchées consécutives de la chaîne dans la fenêtre de temps de glissement. +Toutes les chaînes de la sélection sont analysés. + +Type: `Integer`. + +**Exemple** + +Déterminer si une période de temps est suffisant pour l'utilisateur de sélectionner un téléphone et d'acheter deux fois dans la boutique en ligne. + +Définissez la chaîne d'événements suivante: + +1. L'utilisateur s'est connecté à son compte sur le magasin (`eventID = 1003`). +2. L'utilisateur recherche un téléphone (`eventID = 1007, product = 'phone'`). +3. Toute commande de l'utilisateur (`eventID = 1009`). +4. L'Utilisateur a fait la commande à nouveau (`eventID = 1010`). + +Table d'entrée: + +``` text +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-01-28 │ 1 │ 2019-01-29 10:00:00 │ 1003 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-01-31 │ 1 │ 2019-01-31 09:00:00 │ 1007 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-01-30 │ 1 │ 2019-01-30 08:00:00 │ 1009 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-02-01 │ 1 │ 2019-02-01 08:00:00 │ 1010 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +``` + +Savoir dans quelle mesure l'utilisateur `user_id` pourrait passer à travers la chaîne dans une période en Janvier-Février de 2019. + +Requête: + +``` sql +SELECT + level, + count() AS c +FROM +( + SELECT + user_id, + windowFunnel(6048000000000000)(timestamp, eventID = 1003, eventID = 1009, eventID = 1007, eventID = 1010) AS level + FROM trend + WHERE (event_date >= '2019-01-01') AND (event_date <= '2019-02-02') + GROUP BY user_id +) +GROUP BY level +ORDER BY level ASC +``` + +Résultat: + +``` text +┌─level─┬─c─┐ +│ 4 │ 1 │ +└───────┴───┘ +``` + +## rétention {#retention} + +La fonction prend comme arguments un ensemble de conditions de 1 à 32 arguments de type `UInt8` qui indiquent si une certaine condition est remplie pour l'événement. +Toute condition peut être spécifiée comme argument (comme dans [WHERE](../../query_language/select.md#select-where)). + +Les conditions, à l'exception de la première, s'appliquent par paires: le résultat de la seconde sera vrai si la première et la deuxième sont remplies, le troisième si la première et la fird sont vraies, etc. + +**Syntaxe** + +``` sql +retention(cond1, cond2, ..., cond32); +``` + +**Paramètre** + +- `cond` — an expression that returns a `UInt8` résultat (1 ou 0). + +**Valeur renvoyée** + +Le tableau de 1 ou 0. + +- 1 — condition was met for the event. +- 0 — condition wasn't met for the event. + +Type: `UInt8`. + +**Exemple** + +Prenons un exemple de calcul de la `retention` fonction pour déterminer le trafic du site. + +**1.** Сreate a table to illustrate an example. + +``` sql +CREATE TABLE retention_test(date Date, uid Int32) ENGINE = Memory; + +INSERT INTO retention_test SELECT '2020-01-01', number FROM numbers(5); +INSERT INTO retention_test SELECT '2020-01-02', number FROM numbers(10); +INSERT INTO retention_test SELECT '2020-01-03', number FROM numbers(15); +``` + +Table d'entrée: + +Requête: + +``` sql +SELECT * FROM retention_test +``` + +Résultat: + +``` text +┌───────date─┬─uid─┐ +│ 2020-01-01 │ 0 │ +│ 2020-01-01 │ 1 │ +│ 2020-01-01 │ 2 │ +│ 2020-01-01 │ 3 │ +│ 2020-01-01 │ 4 │ +└────────────┴─────┘ +┌───────date─┬─uid─┐ +│ 2020-01-02 │ 0 │ +│ 2020-01-02 │ 1 │ +│ 2020-01-02 │ 2 │ +│ 2020-01-02 │ 3 │ +│ 2020-01-02 │ 4 │ +│ 2020-01-02 │ 5 │ +│ 2020-01-02 │ 6 │ +│ 2020-01-02 │ 7 │ +│ 2020-01-02 │ 8 │ +│ 2020-01-02 │ 9 │ +└────────────┴─────┘ +┌───────date─┬─uid─┐ +│ 2020-01-03 │ 0 │ +│ 2020-01-03 │ 1 │ +│ 2020-01-03 │ 2 │ +│ 2020-01-03 │ 3 │ +│ 2020-01-03 │ 4 │ +│ 2020-01-03 │ 5 │ +│ 2020-01-03 │ 6 │ +│ 2020-01-03 │ 7 │ +│ 2020-01-03 │ 8 │ +│ 2020-01-03 │ 9 │ +│ 2020-01-03 │ 10 │ +│ 2020-01-03 │ 11 │ +│ 2020-01-03 │ 12 │ +│ 2020-01-03 │ 13 │ +│ 2020-01-03 │ 14 │ +└────────────┴─────┘ +``` + +**2.** Grouper les utilisateurs par ID unique `uid` à l'aide de la `retention` fonction. + +Requête: + +``` sql +SELECT + uid, + retention(date = '2020-01-01', date = '2020-01-02', date = '2020-01-03') AS r +FROM retention_test +WHERE date IN ('2020-01-01', '2020-01-02', '2020-01-03') +GROUP BY uid +ORDER BY uid ASC +``` + +Résultat: + +``` text +┌─uid─┬─r───────┐ +│ 0 │ [1,1,1] │ +│ 1 │ [1,1,1] │ +│ 2 │ [1,1,1] │ +│ 3 │ [1,1,1] │ +│ 4 │ [1,1,1] │ +│ 5 │ [0,0,0] │ +│ 6 │ [0,0,0] │ +│ 7 │ [0,0,0] │ +│ 8 │ [0,0,0] │ +│ 9 │ [0,0,0] │ +│ 10 │ [0,0,0] │ +│ 11 │ [0,0,0] │ +│ 12 │ [0,0,0] │ +│ 13 │ [0,0,0] │ +│ 14 │ [0,0,0] │ +└─────┴─────────┘ +``` + +**3.** Calculer le nombre total de visites par jour. + +Requête: + +``` sql +SELECT + sum(r[1]) AS r1, + sum(r[2]) AS r2, + sum(r[3]) AS r3 +FROM +( + SELECT + uid, + retention(date = '2020-01-01', date = '2020-01-02', date = '2020-01-03') AS r + FROM retention_test + WHERE date IN ('2020-01-01', '2020-01-02', '2020-01-03') + GROUP BY uid +) +``` + +Résultat: + +``` text +┌─r1─┬─r2─┬─r3─┐ +│ 5 │ 5 │ 5 │ +└────┴────┴────┘ +``` + +Où: + +- `r1`- le nombre de visiteurs uniques qui ont visité le site au cours du 2020-01-01 (le `cond1` condition). +- `r2`- le nombre de visiteurs uniques qui ont visité le site au cours d'une période donnée entre 2020-01-01 et 2020-01-02 (`cond1` et `cond2` condition). +- `r3`- le nombre de visiteurs uniques qui ont visité le site au cours d'une période donnée entre 2020-01-01 et 2020-01-03 (`cond1` et `cond3` condition). + +## uniqUpTo (N) (x) {#uniquptonx} + +Calculates the number of different argument values ​​if it is less than or equal to N. If the number of different argument values is greater than N, it returns N + 1. + +Recommandé pour une utilisation avec de petites Ns, jusqu'à 10. La valeur maximale de N est de 100. + +Pour l'état d'une fonction d'agrégation, il utilise la quantité de mémoire égale à 1 + N \* de la taille d'une valeur d'octets. +Pour les chaînes, il stocke un hachage non cryptographique de 8 octets. Soit le calcul est approchée pour les chaînes. + +La fonction fonctionne également pour plusieurs arguments. + +Cela fonctionne aussi vite que possible, sauf dans les cas où une grande valeur N est utilisée et le nombre de valeurs uniques est légèrement inférieur à N. + +Exemple d'utilisation: + +``` text +Problem: Generate a report that shows only keywords that produced at least 5 unique users. +Solution: Write in the GROUP BY query SearchPhrase HAVING uniqUpTo(4)(UserID) >= 5 +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/agg_functions/parametric_functions/) + +## sumMapFiltered(keys\_to\_keep) (clés, valeurs) {#summapfilteredkeys-to-keepkeys-values} + +Même comportement que [sumMap](reference.md#agg_functions-summap) sauf qu'un tableau de clés est passé en paramètre. Cela peut être particulièrement utile lorsque vous travaillez avec une forte cardinalité de touches. diff --git a/docs/fr/query_language/agg_functions/reference.md b/docs/fr/query_language/agg_functions/reference.md new file mode 100644 index 00000000000..347b68dd3f4 --- /dev/null +++ b/docs/fr/query_language/agg_functions/reference.md @@ -0,0 +1,1834 @@ +--- +machine_translated: true +--- + +# La Fonction De Référence {#function-reference} + +## compter {#agg_function-count} + +Compte le nombre de lignes ou de valeurs non NULL. + +ClickHouse prend en charge les syntaxes suivantes pour `count`: +- `count(expr)` ou `COUNT(DISTINCT expr)`. +- `count()` ou `COUNT(*)`. Le `count()` la syntaxe est spécifique à ClickHouse. + +**Paramètre** + +La fonction peut prendre: + +- Zéro des paramètres. +- Un [expression](../syntax.md#syntax-expressions). + +**Valeur renvoyée** + +- Si la fonction est appelée sans paramètres, il compte le nombre de lignes. +- Si l' [expression](../syntax.md#syntax-expressions) est passé, alors la fonction compte combien de fois cette expression retournée not null. Si l'expression renvoie un [Nullable](../../data_types/nullable.md)- tapez la valeur, puis le résultat de `count` séjours pas `Nullable`. La fonction renvoie 0 si l'expression est retournée `NULL` pour toutes les lignes. + +Dans les deux cas le type de la valeur renvoyée est [UInt64](../../data_types/int_uint.md). + +**Détail** + +Clickhouse soutient le `COUNT(DISTINCT ...)` syntaxe. Le comportement de cette construction dépend de la [count\_distinct\_implementation](../../operations/settings/settings.md#settings-count_distinct_implementation) paramètre. Il définit lequel des [uniq\*](#agg_function-uniq) fonctions est utilisée pour effectuer l'opération. La valeur par défaut est la [uniqExact](#agg_function-uniqexact) fonction. + +Le `SELECT count() FROM table` la requête n'est pas optimisé, car le nombre d'entrées dans la table n'est pas stockée séparément. Il choisit une petite colonne de la table et compte le nombre de valeurs qu'il contient. + +**Exemple** + +Exemple 1: + +``` sql +SELECT count() FROM t +``` + +``` text +┌─count()─┐ +│ 5 │ +└─────────┘ +``` + +Exemple 2: + +``` sql +SELECT name, value FROM system.settings WHERE name = 'count_distinct_implementation' +``` + +``` text +┌─name──────────────────────────┬─value─────┐ +│ count_distinct_implementation │ uniqExact │ +└───────────────────────────────┴───────────┘ +``` + +``` sql +SELECT count(DISTINCT num) FROM t +``` + +``` text +┌─uniqExact(num)─┐ +│ 3 │ +└────────────────┘ +``` + +Cet exemple montre que `count(DISTINCT num)` est effectuée par le `uniqExact` en fonction de l' `count_distinct_implementation` valeur de réglage. + +## tout(x) {#agg_function-any} + +Sélectionne la première valeur rencontrée. +La requête peut être exécutée dans n'importe quel ordre, et même dans un ordre différent à chaque fois, de sorte que le résultat de cette fonction est indéterminée. +Pour obtenir un résultat déterminé, vous pouvez utiliser le ‘min’ ou ‘max’ fonction au lieu de ‘any’. + +Dans certains cas, vous pouvez compter sur l'ordre de l'exécution. Cela s'applique aux cas où SELECT provient d'une sous-requête qui utilise ORDER BY. + +Lorsqu'un `SELECT` la requête a l' `GROUP BY` ou au moins une fonction d'agrégat, ClickHouse (contrairement à MySQL) exige que toutes les expressions du `SELECT`, `HAVING`, et `ORDER BY` clauses être calculée à partir de clés ou de fonctions d'agrégation. En d'autres termes, chaque colonne sélectionnée dans la table doit être utilisée soit dans les clés, soit dans les fonctions d'agrégation. Pour obtenir un comportement comme dans MySQL, vous pouvez mettre les autres colonnes dans le `any` fonction d'agrégation. + +## anyHeavy (x) {#anyheavyx} + +Sélectionne une valeur fréquente à l'aide [poids lourds](http://www.cs.umd.edu/~samir/498/karp.pdf) algorithme. S'il y a une valeur qui se produit plus de la moitié des cas dans chacun des threads d'exécution de la requête, cette valeur est renvoyée. Normalement, le résultat est non déterministe. + +``` sql +anyHeavy(column) +``` + +**Argument** + +- `column` – The column name. + +**Exemple** + +Prendre la [OnTime](../../getting_started/example_datasets/ontime.md) ensemble de données et sélectionnez n'importe quelle valeur `AirlineID` colonne. + +``` sql +SELECT anyHeavy(AirlineID) AS res +FROM ontime +``` + +``` text +┌───res─┐ +│ 19690 │ +└───────┘ +``` + +## anyLast (x) {#anylastx} + +Sélectionne la dernière valeur rencontrés. +Le résultat est tout aussi indéterminé que pour le `any` fonction. + +## groupBitAnd {#groupbitand} + +S'applique au niveau du BIT `AND` pour les séries de nombres. + +``` sql +groupBitAnd(expr) +``` + +**Paramètre** + +`expr` – An expression that results in `UInt*` type. + +**Valeur de retour** + +La valeur de la `UInt*` type. + +**Exemple** + +Des données de Test: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +Requête: + +``` sql +SELECT groupBitAnd(num) FROM t +``` + +Où `num` est la colonne avec les données de test. + +Résultat: + +``` text +binary decimal +00000100 = 4 +``` + +## groupBitOr {#groupbitor} + +S'applique au niveau du BIT `OR` pour les séries de nombres. + +``` sql +groupBitOr(expr) +``` + +**Paramètre** + +`expr` – An expression that results in `UInt*` type. + +**Valeur de retour** + +La valeur de la `UInt*` type. + +**Exemple** + +Des données de Test: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +Requête: + +``` sql +SELECT groupBitOr(num) FROM t +``` + +Où `num` est la colonne avec les données de test. + +Résultat: + +``` text +binary decimal +01111101 = 125 +``` + +## groupBitXor {#groupbitxor} + +S'applique au niveau du BIT `XOR` pour les séries de nombres. + +``` sql +groupBitXor(expr) +``` + +**Paramètre** + +`expr` – An expression that results in `UInt*` type. + +**Valeur de retour** + +La valeur de la `UInt*` type. + +**Exemple** + +Des données de Test: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +Requête: + +``` sql +SELECT groupBitXor(num) FROM t +``` + +Où `num` est la colonne avec les données de test. + +Résultat: + +``` text +binary decimal +01101000 = 104 +``` + +## groupBitmap {#groupbitmap} + +Calculs Bitmap ou agrégés à partir d'une colonne entière non signée, retour cardinalité de type UInt64, si Ajouter suffixe-State, puis retour [objet bitmap](../functions/bitmap_functions.md). + +``` sql +groupBitmap(expr) +``` + +**Paramètre** + +`expr` – An expression that results in `UInt*` type. + +**Valeur de retour** + +La valeur de la `UInt64` type. + +**Exemple** + +Des données de Test: + +``` text +UserID +1 +1 +2 +3 +``` + +Requête: + +``` sql +SELECT groupBitmap(UserID) as num FROM t +``` + +Résultat: + +``` text +num +3 +``` + +## min (x) {#agg_function-min} + +Calcule le minimum. + +## max (x) {#agg_function-max} + +Calcule le maximum. + +## argMin (arg, val) {#agg-function-argmin} + +Calcule la ‘arg’ valeur pour un minimum ‘val’ valeur. S'il y a plusieurs valeurs différentes de ‘arg’ pour des valeurs minimales de ‘val’ la première de ces valeurs rencontrées est de sortie. + +**Exemple:** + +``` text +┌─user─────┬─salary─┐ +│ director │ 5000 │ +│ manager │ 3000 │ +│ worker │ 1000 │ +└──────────┴────────┘ +``` + +``` sql +SELECT argMin(user, salary) FROM salary +``` + +``` text +┌─argMin(user, salary)─┐ +│ worker │ +└──────────────────────┘ +``` + +## argMax(arg, val) {#agg-function-argmax} + +Calcule la ‘arg’ valeur pour un maximum ‘val’ valeur. S'il y a plusieurs valeurs différentes de ‘arg’ pour les valeurs maximales de ‘val’ la première de ces valeurs rencontrées est de sortie. + +## sum(x) {#agg_function-sum} + +Calcule la somme. +Ne fonctionne que pour les numéros. + +## sumWithOverflow (x) {#sumwithoverflowx} + +Calcule la somme des nombres, en utilisant le même type de données pour le résultat que pour les paramètres d'entrée. Si la somme dépasse la valeur maximale pour ce type de données, la fonction renvoie une erreur. + +Ne fonctionne que pour les numéros. + +## sumMap (clé, valeur) {#agg_functions-summap} + +Les totaux de la ‘value’ tableau selon les clés spécifiés dans le ‘key’ tableau. +Le nombre d'éléments dans ‘key’ et ‘value’ doit être identique pour chaque ligne totalisée. +Returns a tuple of two arrays: keys in sorted order, and values ​​summed for the corresponding keys. + +Exemple: + +``` sql +CREATE TABLE sum_map( + date Date, + timeslot DateTime, + statusMap Nested( + status UInt16, + requests UInt64 + ) +) ENGINE = Log; +INSERT INTO sum_map VALUES + ('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10]); +SELECT + timeslot, + sumMap(statusMap.status, statusMap.requests) +FROM sum_map +GROUP BY timeslot +``` + +``` text +┌────────────timeslot─┬─sumMap(statusMap.status, statusMap.requests)─┐ +│ 2000-01-01 00:00:00 │ ([1,2,3,4,5],[10,10,20,10,10]) │ +│ 2000-01-01 00:01:00 │ ([4,5,6,7,8],[10,10,20,10,10]) │ +└─────────────────────┴──────────────────────────────────────────────┘ +``` + +## skewPop {#skewpop} + +Calcule la [asymétrie](https://en.wikipedia.org/wiki/Skewness) d'une séquence. + +``` sql +skewPop(expr) +``` + +**Paramètre** + +`expr` — [Expression](../syntax.md#syntax-expressions) retour d'un nombre. + +**Valeur renvoyée** + +The skewness of the given distribution. Type — [Float64](../../data_types/float.md) + +**Exemple** + +``` sql +SELECT skewPop(value) FROM series_with_value_column +``` + +## skewSamp {#skewsamp} + +Calcule la [asymétrie de l'échantillon](https://en.wikipedia.org/wiki/Skewness) d'une séquence. + +Il représente une estimation non biaisée de l'asymétrie d'une variable aléatoire si les valeurs passées forme de son échantillon. + +``` sql +skewSamp(expr) +``` + +**Paramètre** + +`expr` — [Expression](../syntax.md#syntax-expressions) retour d'un nombre. + +**Valeur renvoyée** + +The skewness of the given distribution. Type — [Float64](../../data_types/float.md). Si `n <= 1` (`n` est la taille de l'échantillon), alors la fonction renvoie `nan`. + +**Exemple** + +``` sql +SELECT skewSamp(value) FROM series_with_value_column +``` + +## kurtPop {#kurtpop} + +Calcule la [kurtosis](https://en.wikipedia.org/wiki/Kurtosis) d'une séquence. + +``` sql +kurtPop(expr) +``` + +**Paramètre** + +`expr` — [Expression](../syntax.md#syntax-expressions) retour d'un nombre. + +**Valeur renvoyée** + +The kurtosis of the given distribution. Type — [Float64](../../data_types/float.md) + +**Exemple** + +``` sql +SELECT kurtPop(value) FROM series_with_value_column +``` + +## kurtSamp {#kurtsamp} + +Calcule la [l'échantillon le coefficient d'aplatissement](https://en.wikipedia.org/wiki/Kurtosis) d'une séquence. + +Il représente une estimation non biaisée de la kurtose d'une variable aléatoire si les valeurs passées forment son échantillon. + +``` sql +kurtSamp(expr) +``` + +**Paramètre** + +`expr` — [Expression](../syntax.md#syntax-expressions) retour d'un nombre. + +**Valeur renvoyée** + +The kurtosis of the given distribution. Type — [Float64](../../data_types/float.md). Si `n <= 1` (`n` la taille de l'échantillon), alors la fonction renvoie `nan`. + +**Exemple** + +``` sql +SELECT kurtSamp(value) FROM series_with_value_column +``` + +## timeSeriesGroupSum(uid, horodatage, valeur) {#agg-function-timeseriesgroupsum} + +`timeSeriesGroupSum` peut agréger différentes séries temporelles qui échantillonnent l'horodatage et non l'alignement. +Il utilisera une interpolation linéaire entre deux échantillons d'horodatage, puis additionnera les séries temporelles ensemble. + +- `uid` la série temporelle est elle unique, `UInt64`. +- `timestamp` est de type Int64 afin de prendre en charge la milliseconde ou la microseconde. +- `value` est la métrique. + +La fonction renvoie un tableau de tuples avec `(timestamp, aggregated_value)` pair. + +Avant d'utiliser cette fonction, assurez-vous `timestamp` est dans l'ordre croissant. + +Exemple: + +``` text +┌─uid─┬─timestamp─┬─value─┐ +│ 1 │ 2 │ 0.2 │ +│ 1 │ 7 │ 0.7 │ +│ 1 │ 12 │ 1.2 │ +│ 1 │ 17 │ 1.7 │ +│ 1 │ 25 │ 2.5 │ +│ 2 │ 3 │ 0.6 │ +│ 2 │ 8 │ 1.6 │ +│ 2 │ 12 │ 2.4 │ +│ 2 │ 18 │ 3.6 │ +│ 2 │ 24 │ 4.8 │ +└─────┴───────────┴───────┘ +``` + +``` sql +CREATE TABLE time_series( + uid UInt64, + timestamp Int64, + value Float64 +) ENGINE = Memory; +INSERT INTO time_series VALUES + (1,2,0.2),(1,7,0.7),(1,12,1.2),(1,17,1.7),(1,25,2.5), + (2,3,0.6),(2,8,1.6),(2,12,2.4),(2,18,3.6),(2,24,4.8); + +SELECT timeSeriesGroupSum(uid, timestamp, value) +FROM ( + SELECT * FROM time_series order by timestamp ASC +); +``` + +Et le résultat sera: + +``` text +[(2,0.2),(3,0.9),(7,2.1),(8,2.4),(12,3.6),(17,5.1),(18,5.4),(24,7.2),(25,2.5)] +``` + +## timeSeriesGroupRateSum(uid, ts, val) {#agg-function-timeseriesgroupratesum} + +De même timeSeriesGroupRateSum, timeSeriesGroupRateSum calculera le taux de séries temporelles, puis additionnera les taux ensemble. +En outre, l'horodatage doit être dans l'ordre croissant avant d'utiliser cette fonction. + +Utilisez cette fonction, le résultat ci-dessus sera: + +``` text +[(2,0),(3,0.1),(7,0.3),(8,0.3),(12,0.3),(17,0.3),(18,0.3),(24,0.3),(25,0.1)] +``` + +## avg (x) {#agg_function-avg} + +Calcule la moyenne. +Ne fonctionne que pour les numéros. +Le résultat est toujours Float64. + +## uniq {#agg_function-uniq} + +Calcule le nombre approximatif des différentes valeurs de l'argument. + +``` sql +uniq(x[, ...]) +``` + +**Paramètre** + +La fonction prend un nombre variable de paramètres. Les paramètres peuvent être `Tuple`, `Array`, `Date`, `DateTime`, `String` ou des types numériques. + +**Valeur renvoyée** + +- A [UInt64](../../data_types/int_uint.md)numéro de type. + +**Détails de mise en œuvre** + +Fonction: + +- Calcule un hachage pour tous les paramètres de l'agrégat, puis l'utilise dans les calculs. + +- Utilise un algorithme d'échantillonnage adaptatif. Pour l'état de calcul, La fonction utilise un échantillon de valeurs de hachage d'éléments jusqu'à 65536. + + This algorithm is very accurate and very efficient on the CPU. When the query contains several of these functions, using `uniq` is almost as fast as using other aggregate functions. + +- Fournit le résultat de manière déterministe (cela ne dépend pas de l'ordre de traitement de la requête). + +Nous vous recommandons d'utiliser cette fonction dans presque tous les scénarios. + +**Voir Aussi** + +- [uniqcombiné](#agg_function-uniqcombined) +- [uniqCombined64](#agg_function-uniqcombined64) +- [uniqHLL12](#agg_function-uniqhll12) +- [uniqExact](#agg_function-uniqexact) + +## uniqcombiné {#agg_function-uniqcombined} + +Calcule le nombre approximatif de différentes valeurs d'argument. + +``` sql +uniqCombined(HLL_precision)(x[, ...]) +``` + +Le `uniqCombined` la fonction est un bon choix pour calculer le nombre de valeurs différentes. + +**Paramètre** + +La fonction prend un nombre variable de paramètres. Les paramètres peuvent être `Tuple`, `Array`, `Date`, `DateTime`, `String` ou des types numériques. + +`HLL_precision` est le logarithme en base 2 du nombre de cellules dans [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog). Facultatif, vous pouvez utiliser la fonction comme `uniqCombined(x[, ...])`. La valeur par défaut pour `HLL_precision` est 17, qui est effectivement 96 Ko d'espace(2 ^ 17 cellules, 6 bits chacune). + +**Valeur renvoyée** + +- Nombre [UInt64](../../data_types/int_uint.md)numéro de type. + +**Détails de mise en œuvre** + +Fonction: + +- Calcule un hachage (hachage 64 bits pour `String` et 32 bits sinon) pour tous les paramètres dans l'agrégat, puis l'utilise dans les calculs. + +- Utilise une combinaison de trois algorithmes: tableau, table de hachage et HyperLogLog avec une table de correction d'erreur. + + For a small number of distinct elements, an array is used. When the set size is larger, a hash table is used. For a larger number of elements, HyperLogLog is used, which will occupy a fixed amount of memory. + +- Fournit le résultat de manière déterministe (cela ne dépend pas de l'ordre de traitement de la requête). + +!!! note "Note" + Comme il utilise le hachage 32 bits pour non-`String` type, le résultat aura une erreur très élevée pour les cardinalités significativement plus grandes que `UINT_MAX` (erreur va augmenter rapidement après quelques dizaines de milliards de valeurs distinctes), donc dans ce cas, vous devez utiliser [uniqCombined64](#agg_function-uniqcombined64) + +Par rapport à la [uniq](#agg_function-uniq) la fonction, la `uniqCombined`: + +- Consomme plusieurs fois moins de mémoire. +- Calcule avec plusieurs fois plus de précision. +- A généralement des performances légèrement inférieures. Dans certains scénarios, `uniqCombined` peut faire mieux que `uniq` par exemple, avec des requêtes distribuées qui transmettent un grand nombre d'agrégation des états sur le réseau. + +**Voir Aussi** + +- [uniq](#agg_function-uniq) +- [uniqCombined64](#agg_function-uniqcombined64) +- [uniqHLL12](#agg_function-uniqhll12) +- [uniqExact](#agg_function-uniqexact) + +## uniqCombined64 {#agg_function-uniqcombined64} + +Même que [uniqcombiné](#agg_function-uniqcombined), mais utilise le hachage 64 bits pour tous les types de données. + +## uniqHLL12 {#agg_function-uniqhll12} + +Calcule le nombre approximatif de différentes valeurs d'argument, en utilisant [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog) algorithme. + +``` sql +uniqHLL12(x[, ...]) +``` + +**Paramètre** + +La fonction prend un nombre variable de paramètres. Les paramètres peuvent être `Tuple`, `Array`, `Date`, `DateTime`, `String` ou des types numériques. + +**Valeur renvoyée** + +- A [UInt64](../../data_types/int_uint.md)numéro de type. + +**Détails de mise en œuvre** + +Fonction: + +- Calcule un hachage pour tous les paramètres de l'agrégat, puis l'utilise dans les calculs. + +- Utilise L'algorithme HyperLogLog pour approximer le nombre de valeurs d'argument différentes. + + 212 5-bit cells are used. The size of the state is slightly more than 2.5 KB. The result is not very accurate (up to ~10% error) for small data sets (<10K elements). However, the result is fairly accurate for high-cardinality data sets (10K-100M), with a maximum error of ~1.6%. Starting from 100M, the estimation error increases, and the function will return very inaccurate results for data sets with extremely high cardinality (1B+ elements). + +- Fournit le résultat déterminé (il ne dépend pas de l'ordre de traitement de la requête). + +Nous ne recommandons pas d'utiliser cette fonction. Dans la plupart des cas, l'utilisation de la [uniq](#agg_function-uniq) ou [uniqcombiné](#agg_function-uniqcombined) fonction. + +**Voir Aussi** + +- [uniq](#agg_function-uniq) +- [uniqcombiné](#agg_function-uniqcombined) +- [uniqExact](#agg_function-uniqexact) + +## uniqExact {#agg_function-uniqexact} + +Calcule le nombre exact de différentes valeurs d'argument. + +``` sql +uniqExact(x[, ...]) +``` + +L'utilisation de la `uniqExact` fonction si vous avez absolument besoin d'un résultat exact. Sinon l'utilisation de la [uniq](#agg_function-uniq) fonction. + +Le `uniqExact` la fonction utilise plus de mémoire que `uniq` parce que la taille de l'état a surabondance de croissance que le nombre de valeurs différentes augmente. + +**Paramètre** + +La fonction prend un nombre variable de paramètres. Les paramètres peuvent être `Tuple`, `Array`, `Date`, `DateTime`, `String` ou des types numériques. + +**Voir Aussi** + +- [uniq](#agg_function-uniq) +- [uniqcombiné](#agg_function-uniqcombined) +- [uniqHLL12](#agg_function-uniqhll12) + +## groupArray(x), groupArray (max\_size) (x) {#agg_function-grouparray} + +Crée un tableau de valeurs de l'argument. +Les valeurs peuvent être ajoutées au tableau dans une (indéterminée) de commande. + +La deuxième version (avec le `max_size` paramètre) limite la taille du tableau résultant à `max_size` élément. +Exemple, `groupArray (1) (x)` est équivalent à `[any (x)]`. + +Dans certains cas, vous pouvez toujours compter sur l'ordre de l'exécution. Cela s'applique aux cas où `SELECT` provient d'une sous-requête qui utilise `ORDER BY`. + +## groupeparrayinsertat(valeur, position) {#grouparrayinsertatvalue-position} + +Insère une valeur dans le tableau à la position spécifiée. + +!!! note "Note" + Cette fonction utilise des positions à base zéro, contrairement aux positions à base unique classiques pour les tableaux SQL. + +Accepts the value and position as input. If several values ​​are inserted into the same position, any of them might end up in the resulting array (the first one will be used in the case of single-threaded execution). If no value is inserted into a position, the position is assigned the default value. + +Paramètres facultatifs: + +- Valeur par défaut pour la substitution dans des positions vides. +- La longueur du tableau résultant. Cela vous permet de recevoir des tableaux de la même taille pour tous les agrégats clés. Lorsque vous utilisez ce paramètre, la valeur par défaut doit être spécifiée. + +## groupeparraymovingsum {#agg_function-grouparraymovingsum} + +Calcule la somme mobile des valeurs d'entrée. + +``` sql +groupArrayMovingSum(numbers_for_summing) +groupArrayMovingSum(window_size)(numbers_for_summing) +``` + +La fonction peut prendre la taille de la fenêtre comme paramètre. Si spécifié, la fonction prend la taille de la fenêtre égal au nombre de lignes dans la colonne. + +**Paramètre** + +- `numbers_for_summing` — [Expression](../syntax.md#syntax-expressions) résultant en une valeur de type de données Numérique. +- `window_size` — Size of the calculation window. + +**Valeurs renvoyées** + +- Tableau de la même taille et de même type que les données d'entrée. + +**Exemple** + +La table d'échantillon: + +``` sql +CREATE TABLE t +( + `int` UInt8, + `float` Float32, + `dec` Decimal32(2) +) +ENGINE = TinyLog +``` + +``` text +┌─int─┬─float─┬──dec─┐ +│ 1 │ 1.1 │ 1.10 │ +│ 2 │ 2.2 │ 2.20 │ +│ 4 │ 4.4 │ 4.40 │ +│ 7 │ 7.77 │ 7.77 │ +└─────┴───────┴──────┘ +``` + +Requête: + +``` sql +SELECT + groupArrayMovingSum(int) AS I, + groupArrayMovingSum(float) AS F, + groupArrayMovingSum(dec) AS D +FROM t +``` + +``` text +┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐ +│ [1,3,7,14] │ [1.1,3.3000002,7.7000003,15.47] │ [1.10,3.30,7.70,15.47] │ +└────────────┴─────────────────────────────────┴────────────────────────┘ +``` + +``` sql +SELECT + groupArrayMovingSum(2)(int) AS I, + groupArrayMovingSum(2)(float) AS F, + groupArrayMovingSum(2)(dec) AS D +FROM t +``` + +``` text +┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐ +│ [1,3,6,11] │ [1.1,3.3000002,6.6000004,12.17] │ [1.10,3.30,6.60,12.17] │ +└────────────┴─────────────────────────────────┴────────────────────────┘ +``` + +## groupArrayMovingAvg {#agg_function-grouparraymovingavg} + +Calcule la moyenne mobile des valeurs d'entrée. + +``` sql +groupArrayMovingAvg(numbers_for_summing) +groupArrayMovingAvg(window_size)(numbers_for_summing) +``` + +La fonction peut prendre la taille de la fenêtre comme paramètre. Si spécifié, la fonction prend la taille de la fenêtre égal au nombre de lignes dans la colonne. + +**Paramètre** + +- `numbers_for_summing` — [Expression](../syntax.md#syntax-expressions) résultant en une valeur de type de données Numérique. +- `window_size` — Size of the calculation window. + +**Valeurs renvoyées** + +- Tableau de la même taille et de même type que les données d'entrée. + +La fonction utilise [l'arrondi vers zéro](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero). Il tronque les décimales insignifiantes pour le type de données résultant. + +**Exemple** + +La table d'échantillon `b`: + +``` sql +CREATE TABLE t +( + `int` UInt8, + `float` Float32, + `dec` Decimal32(2) +) +ENGINE = TinyLog +``` + +``` text +┌─int─┬─float─┬──dec─┐ +│ 1 │ 1.1 │ 1.10 │ +│ 2 │ 2.2 │ 2.20 │ +│ 4 │ 4.4 │ 4.40 │ +│ 7 │ 7.77 │ 7.77 │ +└─────┴───────┴──────┘ +``` + +Requête: + +``` sql +SELECT + groupArrayMovingAvg(int) AS I, + groupArrayMovingAvg(float) AS F, + groupArrayMovingAvg(dec) AS D +FROM t +``` + +``` text +┌─I─────────┬─F───────────────────────────────────┬─D─────────────────────┐ +│ [0,0,1,3] │ [0.275,0.82500005,1.9250001,3.8675] │ [0.27,0.82,1.92,3.86] │ +└───────────┴─────────────────────────────────────┴───────────────────────┘ +``` + +``` sql +SELECT + groupArrayMovingAvg(2)(int) AS I, + groupArrayMovingAvg(2)(float) AS F, + groupArrayMovingAvg(2)(dec) AS D +FROM t +``` + +``` text +┌─I─────────┬─F────────────────────────────────┬─D─────────────────────┐ +│ [0,1,3,5] │ [0.55,1.6500001,3.3000002,6.085] │ [0.55,1.65,3.30,6.08] │ +└───────────┴──────────────────────────────────┴───────────────────────┘ +``` + +## groupUniqArray(x), groupUniqArray (max\_size) (x) {#groupuniqarrayx-groupuniqarraymax-sizex} + +Crée un tableau à partir de différentes valeurs d'argument. La consommation de mémoire est la même que pour la `uniqExact` fonction. + +La deuxième version (avec le `max_size` paramètre) limite la taille du tableau résultant à `max_size` élément. +Exemple, `groupUniqArray(1)(x)` est équivalent à `[any(x)]`. + +## quantile {#quantile} + +Calcule une approximation [quantile](https://en.wikipedia.org/wiki/Quantile) des données numériques de la séquence. + +Cette fonction s'applique [réservoir d'échantillonnage](https://en.wikipedia.org/wiki/Reservoir_sampling) avec une taille de réservoir jusqu'à 8192 et un générateur de nombres aléatoires pour l'échantillonnage. Le résultat est non-déterministe. Pour obtenir un quantile exact, Utilisez le [quantileExact](#quantileexact) fonction. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantile(level)(expr) +``` + +Alias: `median`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [types de données](../../data_types/index.md#data_types), [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). + +**Valeur renvoyée** + +- Approximative de quantiles de niveau spécifié. + +Type: + +- [Float64](../../data_types/float.md) pour l'entrée de type de données numériques. +- [Date](../../data_types/date.md) si les valeurs d'entrée ont le `Date` type. +- [DateTime](../../data_types/datetime.md) si les valeurs d'entrée ont le `DateTime` type. + +**Exemple** + +Table d'entrée: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +Requête: + +``` sql +SELECT quantile(val) FROM t +``` + +Résultat: + +``` text +┌─quantile(val)─┐ +│ 1.5 │ +└───────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## quantileDeterministic {#quantiledeterministic} + +Calcule une approximation [quantile](https://en.wikipedia.org/wiki/Quantile) des données numériques de la séquence. + +Cette fonction s'applique [réservoir d'échantillonnage](https://en.wikipedia.org/wiki/Reservoir_sampling) avec une taille de réservoir jusqu'à 8192 et un algorithme déterministe d'échantillonnage. Le résultat est déterministe. Pour obtenir un quantile exact, Utilisez le [quantileExact](#quantileexact) fonction. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantileDeterministic(level)(expr, determinator) +``` + +Alias: `medianDeterministic`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [types de données](../../data_types/index.md#data_types), [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). +- `determinator` — Number whose hash is used instead of a random number generator in the reservoir sampling algorithm to make the result of sampling deterministic. As a determinator you can use any deterministic positive number, for example, a user id or an event id. If the same determinator value occures too often, the function works incorrectly. + +**Valeur renvoyée** + +- Approximative de quantiles de niveau spécifié. + +Type: + +- [Float64](../../data_types/float.md) pour l'entrée de type de données numériques. +- [Date](../../data_types/date.md) si les valeurs d'entrée ont le `Date` type. +- [DateTime](../../data_types/datetime.md) si les valeurs d'entrée ont le `DateTime` type. + +**Exemple** + +Table d'entrée: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +Requête: + +``` sql +SELECT quantileDeterministic(val, 1) FROM t +``` + +Résultat: + +``` text +┌─quantileDeterministic(val, 1)─┐ +│ 1.5 │ +└───────────────────────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## quantileExact {#quantileexact} + +Exactement calcule l' [quantile](https://en.wikipedia.org/wiki/Quantile) des données numériques de la séquence. + +To get exact value, all the passed values ​​are combined into an array, which is then partially sorted. Therefore, the function consumes `O(n)` de mémoire, où `n` est un nombre de valeurs qui ont été passées. Cependant, pour un petit nombre de valeurs, la fonction est très efficace. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantileExact(level)(expr) +``` + +Alias: `medianExact`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [types de données](../../data_types/index.md#data_types), [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). + +**Valeur renvoyée** + +- Quantiles de niveau spécifié. + +Type: + +- [Float64](../../data_types/float.md) pour l'entrée de type de données numériques. +- [Date](../../data_types/date.md) si les valeurs d'entrée ont le `Date` type. +- [DateTime](../../data_types/datetime.md) si les valeurs d'entrée ont le `DateTime` type. + +**Exemple** + +Requête: + +``` sql +SELECT quantileExact(number) FROM numbers(10) +``` + +Résultat: + +``` text +┌─quantileExact(number)─┐ +│ 5 │ +└───────────────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## quantileExactWeighted {#quantileexactweighted} + +Exactement calcule l' [quantile](https://en.wikipedia.org/wiki/Quantile) d'une séquence de données numériques, en tenant compte du poids de chaque élément. + +To get exact value, all the passed values ​​are combined into an array, which is then partially sorted. Each value is counted with its weight, as if it is present `weight` times. A hash table is used in the algorithm. Because of this, if the passed values ​​are frequently repeated, the function consumes less RAM than [quantileExact](#quantileexact). Vous pouvez utiliser cette fonction au lieu de `quantileExact` et spécifiez le poids 1. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantileExactWeighted(level)(expr, weight) +``` + +Alias: `medianExactWeighted`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [types de données](../../data_types/index.md#data_types), [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). +- `weight` — Column with weights of sequence members. Weight is a number of value occurrences. + +**Valeur renvoyée** + +- Quantiles de niveau spécifié. + +Type: + +- [Float64](../../data_types/float.md) pour l'entrée de type de données numériques. +- [Date](../../data_types/date.md) si les valeurs d'entrée ont le `Date` type. +- [DateTime](../../data_types/datetime.md) si les valeurs d'entrée ont le `DateTime` type. + +**Exemple** + +Table d'entrée: + +``` text +┌─n─┬─val─┐ +│ 0 │ 3 │ +│ 1 │ 2 │ +│ 2 │ 1 │ +│ 5 │ 4 │ +└───┴─────┘ +``` + +Requête: + +``` sql +SELECT quantileExactWeighted(n, val) FROM t +``` + +Résultat: + +``` text +┌─quantileExactWeighted(n, val)─┐ +│ 1 │ +└───────────────────────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## quantileTiming {#quantiletiming} + +Avec la précision déterminée calcule le [quantile](https://en.wikipedia.org/wiki/Quantile) des données numériques de la séquence. + +Le résultat est déterministe (il ne dépend pas de l'ordre de traitement de la requête). La fonction est optimisée pour travailler avec des séquences qui décrivent des distributions comme les temps de chargement des pages web ou les temps de réponse du backend. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantileTiming(level)(expr) +``` + +Alias: `medianTiming`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). + +- `expr` — [Expression](../syntax.md#syntax-expressions) sur une colonne Valeurs renvoyant un [Flottant\*](../../data_types/float.md)numéro de type. + + - If negative values are passed to the function, the behavior is undefined. + - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000. + +**Exactitude** + +Le calcul est précis si: + +- Le nombre Total de valeurs ne dépasse pas 5670. +- Le nombre Total de valeurs dépasse 5670, mais le temps de chargement de la page est inférieur à 1024ms. + +Sinon, le résultat du calcul est arrondi au plus proche multiple de 16 ms. + +!!! note "Note" + Pour calculer les quantiles de temps de chargement de page, cette fonction est plus efficace et précise que [quantile](#quantile). + +**Valeur renvoyée** + +- Quantiles de niveau spécifié. + +Type: `Float32`. + +!!! note "Note" + Si aucune valeur n'est transmise à la fonction (lors de l'utilisation de `quantileTimingIf`), [Nan](../../data_types/float.md#data_type-float-nan-inf) est retourné. Le but est de différencier ces cas de cas qui aboutissent à zéro. Voir [Clause ORDER BY](../select.md#select-order-by) pour des notes sur le tri `NaN` valeur. + +**Exemple** + +Table d'entrée: + +``` text +┌─response_time─┐ +│ 72 │ +│ 112 │ +│ 126 │ +│ 145 │ +│ 104 │ +│ 242 │ +│ 313 │ +│ 168 │ +│ 108 │ +└───────────────┘ +``` + +Requête: + +``` sql +SELECT quantileTiming(response_time) FROM t +``` + +Résultat: + +``` text +┌─quantileTiming(response_time)─┐ +│ 126 │ +└───────────────────────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## quantileTimingWeighted {#quantiletimingweighted} + +Avec la précision déterminée calcule le [quantile](https://en.wikipedia.org/wiki/Quantile) d'une séquence de données numériques en fonction du poids de chaque élément de séquence. + +Le résultat est déterministe (il ne dépend pas de l'ordre de traitement de la requête). La fonction est optimisée pour travailler avec des séquences qui décrivent des distributions comme les temps de chargement des pages web ou les temps de réponse du backend. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantileTimingWeighted(level)(expr, weight) +``` + +Alias: `medianTimingWeighted`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). + +- `expr` — [Expression](../syntax.md#syntax-expressions) sur une colonne Valeurs renvoyant un [Flottant\*](../../data_types/float.md)numéro de type. + + - If negative values are passed to the function, the behavior is undefined. + - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000. + +- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. + +**Exactitude** + +Le calcul est précis si: + +- Le nombre Total de valeurs ne dépasse pas 5670. +- Le nombre Total de valeurs dépasse 5670, mais le temps de chargement de la page est inférieur à 1024ms. + +Sinon, le résultat du calcul est arrondi au plus proche multiple de 16 ms. + +!!! note "Note" + Pour calculer les quantiles de temps de chargement de page, cette fonction est plus efficace et précise que [quantile](#quantile). + +**Valeur renvoyée** + +- Quantiles de niveau spécifié. + +Type: `Float32`. + +!!! note "Note" + Si aucune valeur n'est transmise à la fonction (lors de l'utilisation de `quantileTimingIf`), [Nan](../../data_types/float.md#data_type-float-nan-inf) est retourné. Le but est de différencier ces cas de cas qui aboutissent à zéro. Voir [Clause ORDER BY](../select.md#select-order-by) pour des notes sur le tri `NaN` valeur. + +**Exemple** + +Table d'entrée: + +``` text +┌─response_time─┬─weight─┐ +│ 68 │ 1 │ +│ 104 │ 2 │ +│ 112 │ 3 │ +│ 126 │ 2 │ +│ 138 │ 1 │ +│ 162 │ 1 │ +└───────────────┴────────┘ +``` + +Requête: + +``` sql +SELECT quantileTimingWeighted(response_time, weight) FROM t +``` + +Résultat: + +``` text +┌─quantileTimingWeighted(response_time, weight)─┐ +│ 112 │ +└───────────────────────────────────────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## quantileTDigest {#quantiletdigest} + +Calcule une approximation [quantile](https://en.wikipedia.org/wiki/Quantile) d'une séquence de données numériques utilisant [t-digest](https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf) algorithme. + +L'erreur maximale est de 1%. La consommation de mémoire est `log(n)`, où `n` est un certain nombre de valeurs. Le résultat dépend de l'ordre d'exécution de la requête et n'est pas déterministe. + +La performance de la fonction est inférieure à la performance de [quantile](#quantile) ou [quantileTiming](#quantiletiming). En termes de rapport entre la taille de L'état et la précision, cette fonction est bien meilleure que `quantile`. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantileTDigest(level)(expr) +``` + +Alias: `medianTDigest`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [types de données](../../data_types/index.md#data_types), [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). + +**Valeur renvoyée** + +- Approximative de quantiles de niveau spécifié. + +Type: + +- [Float64](../../data_types/float.md) pour l'entrée de type de données numériques. +- [Date](../../data_types/date.md) si les valeurs d'entrée ont le `Date` type. +- [DateTime](../../data_types/datetime.md) si les valeurs d'entrée ont le `DateTime` type. + +**Exemple** + +Requête: + +``` sql +SELECT quantileTDigest(number) FROM numbers(10) +``` + +Résultat: + +``` text +┌─quantileTDigest(number)─┐ +│ 4.5 │ +└─────────────────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## quantileTDigestWeighted {#quantiletdigestweighted} + +Calcule une approximation [quantile](https://en.wikipedia.org/wiki/Quantile) d'une séquence de données numériques utilisant [t-digest](https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf) algorithme. La fonction prend en compte le poids de chaque séquence de membre. L'erreur maximale est de 1%. La consommation de mémoire est `log(n)`, où `n` est un certain nombre de valeurs. + +La performance de la fonction est inférieure à la performance de [quantile](#quantile) ou [quantileTiming](#quantiletiming). En termes de rapport entre la taille de L'état et la précision, cette fonction est bien meilleure que `quantile`. + +Le résultat dépend de l'ordre d'exécution de la requête et n'est pas déterministe. + +Lorsque vous utilisez plusieurs `quantile*` fonctionne avec différents niveaux dans une requête, les états internes ne sont pas combinées (qui est, la requête fonctionne moins efficacement qu'il le pouvait). Dans ce cas, utilisez la [les quantiles](#quantiles) fonction. + +**Syntaxe** + +``` sql +quantileTDigest(level)(expr) +``` + +Alias: `medianTDigest`. + +**Paramètre** + +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` la valeur dans la plage de `[0.01, 0.99]`. Valeur par défaut: 0.5. À `level=0.5` la fonction calcule [médian](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [types de données](../../data_types/index.md#data_types), [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). +- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. + +**Valeur renvoyée** + +- Approximative de quantiles de niveau spécifié. + +Type: + +- [Float64](../../data_types/float.md) pour l'entrée de type de données numériques. +- [Date](../../data_types/date.md) si les valeurs d'entrée ont le `Date` type. +- [DateTime](../../data_types/datetime.md) si les valeurs d'entrée ont le `DateTime` type. + +**Exemple** + +Requête: + +``` sql +SELECT quantileTDigestWeighted(number, 1) FROM numbers(10) +``` + +Résultat: + +``` text +┌─quantileTDigestWeighted(number, 1)─┐ +│ 4.5 │ +└────────────────────────────────────┘ +``` + +**Voir Aussi** + +- [médian](#median) +- [les quantiles](#quantiles) + +## médian {#median} + +Le `median*` les fonctions sont les Alias pour le correspondant `quantile*` fonction. Ils calculent la médiane d'un échantillon de données numériques. + +Fonction: + +- `median` — Alias for [quantile](#quantile). +- `medianDeterministic` — Alias for [quantileDeterministic](#quantiledeterministic). +- `medianExact` — Alias for [quantileExact](#quantileexact). +- `medianExactWeighted` — Alias for [quantileExactWeighted](#quantileexactweighted). +- `medianTiming` — Alias for [quantileTiming](#quantiletiming). +- `medianTimingWeighted` — Alias for [quantileTimingWeighted](#quantiletimingweighted). +- `medianTDigest` — Alias for [quantileTDigest](#quantiletdigest). +- `medianTDigestWeighted` — Alias for [quantileTDigestWeighted](#quantiletdigestweighted). + +**Exemple** + +Table d'entrée: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +Requête: + +``` sql +SELECT medianDeterministic(val, 1) FROM t +``` + +Résultat: + +``` text +┌─medianDeterministic(val, 1)─┐ +│ 1.5 │ +└─────────────────────────────┘ +``` + +## quantiles(level1, level2, …)(x) {#quantiles} + +Toutes les fonctions quantiles ont également des fonctions quantiles correspondantes: `quantiles`, `quantilesDeterministic`, `quantilesTiming`, `quantilesTimingWeighted`, `quantilesExact`, `quantilesExactWeighted`, `quantilesTDigest`. Ces fonctions calculent tous les quantiles des niveaux listés en une seule passe et renvoient un tableau des valeurs résultantes. + +## varSamp (x) {#varsampx} + +Calcule le montant `Σ((x - x̅)^2) / (n - 1)`, où `n` est la taille de l'échantillon et `x̅`est la valeur moyenne de `x`. + +Il représente une estimation non biaisée de la variance d'une variable aléatoire si les valeurs passées forment son échantillon. + +Retourner `Float64`. Lorsque `n <= 1`, retourner `+∞`. + +## varPop (x) {#varpopx} + +Calcule le montant `Σ((x - x̅)^2) / n`, où `n` est la taille de l'échantillon et `x̅`est la valeur moyenne de `x`. + +En d'autres termes, dispersion pour un ensemble de valeurs. Retourner `Float64`. + +## stddevSamp (x) {#stddevsampx} + +Le résultat est égal à la racine carrée de `varSamp(x)`. + +## stddevPop (x) {#stddevpopx} + +Le résultat est égal à la racine carrée de `varPop(x)`. + +## topK (N) (x) {#topknx} + +Renvoie un tableau des valeurs approximativement les plus fréquentes dans la colonne spécifiée. Le tableau est trié par ordre décroissant de fréquence approximative des valeurs (et non par les valeurs elles-mêmes). + +Met en œuvre la [Gain De Place Filtré](http://www.l2f.inesc-id.pt/~fmmb/wiki/uploads/Work/misnis.ref0a.pdf) algorithme d'analyse de TopK, basé sur l'algorithme de réduction et de combinaison de [Économie D'Espace Parallèle](https://arxiv.org/pdf/1401.0702.pdf). + +``` sql +topK(N)(column) +``` + +Cette fonction ne fournit pas un résultat garanti. Dans certaines situations, des erreurs peuvent se produire et renvoyer des valeurs fréquentes qui ne sont pas les valeurs les plus fréquentes. + +Nous vous recommandons d'utiliser l' `N < 10` valeur; performance est réduite avec grand `N` valeur. Valeur maximale de `N = 65536`. + +**Paramètre** + +- ‘N’ est le nombre d'éléments de retour. + +Si le paramètre est omis, la valeur par défaut 10 est utilisé. + +**Argument** + +- ' x ' – The value to calculate frequency. + +**Exemple** + +Prendre la [OnTime](../../getting_started/example_datasets/ontime.md) ensemble de données et sélectionnez les trois valeurs les plus fréquentes `AirlineID` colonne. + +``` sql +SELECT topK(3)(AirlineID) AS res +FROM ontime +``` + +``` text +┌─res─────────────────┐ +│ [19393,19790,19805] │ +└─────────────────────┘ +``` + +## topKWeighted {#topkweighted} + +Semblable à `topK` mais prend un argument de type entier - `weight`. Chaque valeur est comptabilisée `weight` les temps de calcul de fréquence. + +**Syntaxe** + +``` sql +topKWeighted(N)(x, weight) +``` + +**Paramètre** + +- `N` — The number of elements to return. + +**Argument** + +- `x` – The value. +- `weight` — The weight. [UInt8](../../data_types/int_uint.md). + +**Valeur renvoyée** + +Renvoie un tableau des valeurs avec la somme approximative maximale des poids. + +**Exemple** + +Requête: + +``` sql +SELECT topKWeighted(10)(number, number) FROM numbers(1000) +``` + +Résultat: + +``` text +┌─topKWeighted(10)(number, number)──────────┐ +│ [999,998,997,996,995,994,993,992,991,990] │ +└───────────────────────────────────────────┘ +``` + +## covarSamp(x, y) {#covarsampx-y} + +Calcule la valeur de `Σ((x - x̅)(y - y̅)) / (n - 1)`. + +Renvoie Float64. Lorsque `n <= 1`, returns +∞. + +## covarPop (x, y) {#covarpopx-y} + +Calcule la valeur de `Σ((x - x̅)(y - y̅)) / n`. + +## corr (x, y) {#corrx-y} + +Calcule le coefficient de corrélation de Pearson: `Σ((x - x̅)(y - y̅)) / sqrt(Σ((x - x̅)^2) * Σ((y - y̅)^2))`. + +## categoricalInformationValue {#categoricalinformationvalue} + +Calcule la valeur de `(P(tag = 1) - P(tag = 0))(log(P(tag = 1)) - log(P(tag = 0)))` pour chaque catégorie. + +``` sql +categoricalInformationValue(category1, category2, ..., tag) +``` + +Le résultat indique comment une caractéristique discrète (catégorique) `[category1, category2, ...]` contribuer à un modèle d'apprentissage qui prédit la valeur de `tag`. + +## simplelineearregression {#simplelinearregression} + +Effectue une régression linéaire simple (unidimensionnelle). + +``` sql +simpleLinearRegression(x, y) +``` + +Paramètre: + +- `x` — Column with dependent variable values. +- `y` — Column with explanatory variable values. + +Valeurs renvoyées: + +Constant `(a, b)` de la ligne `y = a*x + b`. + +**Exemple** + +``` sql +SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3]) +``` + +``` text +┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3])─┐ +│ (1,0) │ +└───────────────────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6]) +``` + +``` text +┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6])─┐ +│ (1,3) │ +└───────────────────────────────────────────────────────────────────┘ +``` + +## stochasticLinearRegression {#agg_functions-stochasticlinearregression} + +Cette fonction implémente la régression linéaire stochastique. Il prend en charge les paramètres personnalisés pour le taux d'apprentissage, le coefficient de régularisation L2, la taille de mini-lot et a peu de méthodes pour mettre à jour les poids ([Adam](https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Adam) (utilisé par défaut), [simple SGD](https://en.wikipedia.org/wiki/Stochastic_gradient_descent), [Élan](https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum), [Nesterov](https://mipt.ru/upload/medialibrary/d7e/41-91.pdf)). + +### Paramètre {#agg_functions-stochasticlinearregression-parameters} + +Il y a 4 paramètres personnalisables. Ils sont passés à la fonction séquentiellement, mais il n'est pas nécessaire de passer tous les quatre-les valeurs par défaut seront utilisées, mais un bon modèle nécessite un réglage des paramètres. + +``` text +stochasticLinearRegression(1.0, 1.0, 10, 'SGD') +``` + +1. `learning rate` est le coefficient sur la longueur de l'étape, lorsque l'étape de descente de gradient est effectuée. Un taux d'apprentissage trop élevé peut entraîner des poids infinis du modèle. Par défaut est `0.00001`. +2. `l2 regularization coefficient` ce qui peut aider à éviter le surajustement. Par défaut est `0.1`. +3. `mini-batch size` définit le nombre d'éléments, dont les gradients seront calculés et additionnés pour effectuer une étape de descente de gradient. La descente stochastique Pure utilise un élément, mais avoir de petits lots (environ 10 éléments) rend les étapes de gradient plus stables. Par défaut est `15`. +4. `method for updating weights` ils sont: `Adam` (par défaut), `SGD`, `Momentum`, `Nesterov`. `Momentum` et `Nesterov` nécessitent un peu plus de calculs et de mémoire, mais ils sont utiles en termes de vitesse de convergence et de stabilité des méthodes de gradient stochastique. + +### Utilisation {#agg_functions-stochasticlinearregression-usage} + +`stochasticLinearRegression` est utilisé en deux étapes: ajustement du modèle et prédiction sur de nouvelles données. Afin de correspondre le modèle et l'enregistrer son état pour utilisation ultérieure nous utilisons `-State` combinator, qui enregistre essentiellement l'état (poids du modèle, etc.). +Pour prédire nous utilisons la fonction [evalMLMethod](../functions/machine_learning_functions.md#machine_learning_methods-evalmlmethod) qui prend un état comme un argument ainsi que des fonctionnalités à prévoir sur. + + + +**1.** Raccord + +Une telle requête peut être utilisé. + +``` sql +CREATE TABLE IF NOT EXISTS train_data +( + param1 Float64, + param2 Float64, + target Float64 +) ENGINE = Memory; + +CREATE TABLE your_model ENGINE = Memory AS SELECT +stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, param1, param2) +AS state FROM train_data; +``` + +Ici, nous devons également insérer des données dans `train_data` table. Le nombre de paramètres n'est pas fixe, il dépend uniquement du nombre d'arguments, passés dans `linearRegressionState`. Ils doivent tous être des valeurs numériques. +Notez que la colonne avec la valeur cible (que nous aimerions apprendre à prédire) est insérée comme premier argument. + +**2.** Prédire + +Après avoir enregistré un État dans la table, nous pouvons l'utiliser plusieurs fois pour la prédiction, ou même fusionner avec d'autres États et créer de nouveaux modèles encore meilleurs. + +``` sql +WITH (SELECT state FROM your_model) AS model SELECT +evalMLMethod(model, param1, param2) FROM test_data +``` + +La requête renvoie une colonne de valeurs prédites. Notez que le premier argument de `evalMLMethod` être `AggregateFunctionState` objet, sont ensuite des colonnes de fonctionnalités. + +`test_data` est un tableau comme `train_data` mais peut ne pas contenir de valeur cible. + +### Note {#agg_functions-stochasticlinearregression-notes} + +1. Pour fusionner deux modèles l'utilisateur peut créer une telle requête: + `sql SELECT state1 + state2 FROM your_models` + où `your_models` le tableau contient les deux modèles. Cette requête renvoie la nouvelle `AggregateFunctionState` objet. + +2. L'utilisateur peut récupérer les poids du modèle pour ses propres fins, sans enregistrer le modèle, si aucune `-State` combinator est utilisé. + `sql SELECT stochasticLinearRegression(0.01)(target, param1, param2) FROM train_data` + Une telle requête s'adaptera au Modèle et retournera ses poids-d'abord sont des poids, qui correspondent aux paramètres du modèle, le dernier est un biais. Ainsi, dans l'exemple ci-dessus, la requête renvoie une colonne avec 3 valeurs. + +**Voir Aussi** + +- [stochasticLogisticRegression](#agg_functions-stochasticlogisticregression) +- [Différence entre les régressions linéaires et logistiques](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) + +## stochasticLogisticRegression {#agg_functions-stochasticlogisticregression} + +Cette fonction implémente la régression logistique stochastique. Il peut être utilisé pour le problème de classification binaire, prend en charge les mêmes paramètres personnalisés que stochasticLinearRegression et fonctionne de la même manière. + +### Paramètre {#agg_functions-stochasticlogisticregression-parameters} + +Les paramètres sont exactement les mêmes que dans stochasticLinearRegression: +`learning rate`, `l2 regularization coefficient`, `mini-batch size`, `method for updating weights`. +Pour plus d'informations, voir [paramètre](#agg_functions-stochasticlinearregression-parameters). + +``` text +stochasticLogisticRegression(1.0, 1.0, 10, 'SGD') +``` + +1. Raccord + + + + See the `Fitting` section in the [stochasticLinearRegression](#stochasticlinearregression-usage-fitting) description. + + Predicted labels have to be in \[-1, 1\]. + +1. Prédire + + + + Using saved state we can predict probability of object having label `1`. + + ``` sql + WITH (SELECT state FROM your_model) AS model SELECT + evalMLMethod(model, param1, param2) FROM test_data + ``` + + The query will return a column of probabilities. Note that first argument of `evalMLMethod` is `AggregateFunctionState` object, next are columns of features. + + We can also set a bound of probability, which assigns elements to different labels. + + ``` sql + SELECT ans < 1.1 AND ans > 0.5 FROM + (WITH (SELECT state FROM your_model) AS model SELECT + evalMLMethod(model, param1, param2) AS ans FROM test_data) + ``` + + Then the result will be labels. + + `test_data` is a table like `train_data` but may not contain target value. + +**Voir Aussi** + +- [stochasticLinearRegression](#agg_functions-stochasticlinearregression) +- [Différence entre les régressions linéaires et logistiques.](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) + +## groupBitmapAnd {#groupbitmapand} + +Calculs le et d'une colonne bitmap, retour cardinalité de type UInt64, si Ajouter suffixe-État, puis retour [objet bitmap](../functions/bitmap_functions.md). + +``` sql +groupBitmapAnd(expr) +``` + +**Paramètre** + +`expr` – An expression that results in `AggregateFunction(groupBitmap, UInt*)` type. + +**Valeur de retour** + +La valeur de la `UInt64` type. + +**Exemple** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapAnd(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapAnd(z)─┐ +│ 3 │ +└───────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapAndState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapAndState(z)))─┐ +│ [6,8,10] │ +└──────────────────────────────────────────────────┘ +``` + +## groupBitmapOr {#groupbitmapor} + +Calculs le ou d'une colonne bitmap, retour cardinalité de type UInt64, si Ajouter suffixe-État, puis retour [objet bitmap](../functions/bitmap_functions.md). C'est l'équivalent de `groupBitmapMerge`. + +``` sql +groupBitmapOr(expr) +``` + +**Paramètre** + +`expr` – An expression that results in `AggregateFunction(groupBitmap, UInt*)` type. + +**Valeur de retour** + +La valeur de la `UInt64` type. + +**Exemple** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapOr(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapOr(z)─┐ +│ 15 │ +└──────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapOrState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapOrState(z)))─┐ +│ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] │ +└─────────────────────────────────────────────────┘ +``` + +## groupBitmapXor {#groupbitmapxor} + +Calculs le XOR d'une colonne bitmap, retour cardinalité de type UInt64, si Ajouter suffixe-État, puis retour [objet bitmap](../functions/bitmap_functions.md). + +``` sql +groupBitmapOr(expr) +``` + +**Paramètre** + +`expr` – An expression that results in `AggregateFunction(groupBitmap, UInt*)` type. + +**Valeur de retour** + +La valeur de la `UInt64` type. + +**Exemple** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapXor(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapXor(z)─┐ +│ 10 │ +└───────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapXorState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapXorState(z)))─┐ +│ [1,3,5,6,8,10,11,13,14,15] │ +└──────────────────────────────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/agg_functions/reference/) diff --git a/docs/fr/query_language/alter.md b/docs/fr/query_language/alter.md new file mode 100644 index 00000000000..13c57c0ec0c --- /dev/null +++ b/docs/fr/query_language/alter.md @@ -0,0 +1,502 @@ +--- +machine_translated: true +--- + +## ALTER {#query_language_queries_alter} + +Le `ALTER` la requête est prise en charge uniquement pour `*MergeTree` des tables, ainsi que `Merge`et`Distributed`. La requête a plusieurs variantes. + +### Manipulations De Colonne {#column-manipulations} + +Modification de la structure de la table. + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ... +``` + +Dans la requête, spécifiez une liste d'une ou plusieurs actions séparées par des virgules. +Chaque action est une opération sur une colonne. + +Les actions suivantes sont prises en charge: + +- [ADD COLUMN](#alter_add-column) — Adds a new column to the table. +- [DROP COLUMN](#alter_drop-column) — Deletes the column. +- [CLEAR COLUMN](#alter_clear-column) — Resets column values. +- [COMMENT COLUMN](#alter_comment-column) — Adds a text comment to the column. +- [MODIFY COLUMN](#alter_modify-column) — Changes column's type, default expression and TTL. + +Ces actions sont décrites en détail ci-dessous. + +#### ADD COLUMN {#alter_add-column} + +``` sql +ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after] +``` + +Ajoute une nouvelle colonne à la table spécifiée `name`, `type`, [`codec`](create.md#codecs) et `default_expr` (voir la section [Expressions par défaut](create.md#create-default-values)). + +Si l' `IF NOT EXISTS` la clause est incluse, la requête ne retournera pas d'erreur si la colonne existe déjà. Si vous spécifiez `AFTER name_after` (le nom d'une autre colonne), la colonne est ajoutée après celle spécifiée dans la liste des colonnes de la table. Sinon, la colonne est ajoutée à la fin de la table. Notez qu'il n'existe aucun moyen d'ajouter une colonne au début d'un tableau. Pour une chaîne d'actions, `name_after` peut être le nom d'une colonne est ajoutée dans l'une des actions précédentes. + +L'ajout d'une colonne modifie simplement la structure de la table, sans effectuer d'actions avec des données. Les données n'apparaissent pas sur le disque après la `ALTER`. Si les données sont manquantes pour une colonne lors de la lecture de la table, elles sont remplies avec des valeurs par défaut (en exécutant l'expression par défaut s'il y en a une, ou en utilisant des zéros ou des chaînes vides). La colonne apparaît sur le disque après la fusion des parties de données (voir [MergeTree](../operations/table_engines/mergetree.md)). + +Cette approche nous permet de compléter le `ALTER` requête instantanément, sans augmenter le volume de données anciennes. + +Exemple: + +``` sql +ALTER TABLE visits ADD COLUMN browser String AFTER user_id +``` + +#### DROP COLUMN {#alter_drop-column} + +``` sql +DROP COLUMN [IF EXISTS] name +``` + +Supprime la colonne avec le nom `name`. Si l' `IF EXISTS` la clause est spécifiée, la requête ne retournera pas d'erreur si la colonne n'existe pas. + +Supprime les données du système de fichiers. Comme cela supprime des fichiers entiers, la requête est terminée presque instantanément. + +Exemple: + +``` sql +ALTER TABLE visits DROP COLUMN browser +``` + +#### CLEAR COLUMN {#alter_clear-column} + +``` sql +CLEAR COLUMN [IF EXISTS] name IN PARTITION partition_name +``` + +Réinitialise toutes les données dans une colonne pour une partition spécifiée. En savoir plus sur la définition du nom de la partition dans la section [Comment spécifier l'expression de partition](#alter-how-to-specify-part-expr). + +Si l' `IF EXISTS` la clause est spécifiée, la requête ne retournera pas d'erreur si la colonne n'existe pas. + +Exemple: + +``` sql +ALTER TABLE visits CLEAR COLUMN browser IN PARTITION tuple() +``` + +#### COMMENT COLUMN {#alter_comment-column} + +``` sql +COMMENT COLUMN [IF EXISTS] name 'comment' +``` + +Ajoute un commentaire à la colonne. Si l' `IF EXISTS` la clause est spécifiée, la requête ne retournera pas d'erreur si la colonne n'existe pas. + +Chaque colonne peut avoir un commentaire. Si un commentaire existe déjà pour la colonne, un nouveau commentaire remplace le précédent commentaire. + +Les commentaires sont stockés dans le `comment_expression` colonne renvoyée par le [DESCRIBE TABLE](misc.md#misc-describe-table) requête. + +Exemple: + +``` sql +ALTER TABLE visits COMMENT COLUMN browser 'The table shows the browser used for accessing the site.' +``` + +#### MODIFY COLUMN {#alter_modify-column} + +``` sql +MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [TTL] +``` + +Cette requête modifie le `name` les propriétés de la colonne: + +- Type + +- Expression par défaut + +- TTL + + For examples of columns TTL modifying, see [Column TTL](../operations/table_engines/mergetree.md#mergetree-column-ttl). + +Si l' `IF EXISTS` la clause est spécifiée, la requête ne retournera pas d'erreur si la colonne n'existe pas. + +Lors de la modification du type, les valeurs sont converties comme si [toType](functions/type_conversion_functions.md) les fonctions ont été appliquées. Si seule l'expression par défaut est modifiée, la requête ne fait rien de complexe et est terminée presque instantanément. + +Exemple: + +``` sql +ALTER TABLE visits MODIFY COLUMN browser Array(String) +``` + +Changing the column type is the only complex action – it changes the contents of files with data. For large tables, this may take a long time. + +Il y a plusieurs étapes de traitement: + +- Préparation de (nouveaux) fichiers temporaires avec des données modifiées. +- Renommer les anciens fichiers. +- Renommer les (nouveaux) fichiers temporaires en anciens noms. +- Suppression des anciens fichiers. + +Seule la première étape prend du temps. Si il y a un échec à ce stade, les données ne sont pas modifiées. +En cas d'échec au cours d'une des étapes successives, les données peuvent être restaurées manuellement. L'exception est si les anciens fichiers ont été supprimés du système de fichiers mais que les données des nouveaux fichiers n'ont pas été écrites sur le disque et ont été perdues. + +Le `ALTER` la requête de modification des colonnes est répliquée. Les instructions sont enregistrées dans ZooKeeper, puis chaque réplique les applique. Tout `ALTER` les requêtes sont exécutées dans le même ordre. La requête attend que les actions appropriées soient terminées sur les autres répliques. Cependant, une requête pour modifier des colonnes dans une table répliquée peut être interrompue, et toutes les actions seront effectuées de manière asynchrone. + +#### Modifier les limites de la requête {#alter-query-limitations} + +Le `ALTER` query vous permet de créer et de supprimer des éléments distincts (colonnes) dans des structures de données imbriquées, mais pas des structures de données imbriquées entières. Pour ajouter une structure de données imbriquée, vous pouvez ajouter des colonnes avec un nom comme `name.nested_name` et le type `Array(T)`. Une structure de données imbriquée est équivalente à plusieurs colonnes de tableau avec un nom qui a le même préfixe avant le point. + +Il n'y a pas de support pour supprimer des colonnes dans la clé primaire ou la clé d'échantillonnage (colonnes qui sont utilisées dans le `ENGINE` expression). La modification du type des colonnes incluses dans la clé primaire n'est possible que si cette modification n'entraîne pas la modification des données (par exemple, vous êtes autorisé à ajouter des valeurs à une énumération ou à modifier un type de `DateTime` de `UInt32`). + +Si l' `ALTER` la requête n'est pas suffisante pour apporter les modifications de table dont vous avez besoin, vous pouvez créer une nouvelle table, y copier les données en utilisant le [INSERT SELECT](insert_into.md#insert_query_insert-select) requête, puis changer les tables en utilisant le [RENAME](misc.md#misc_operations-rename) requête et supprimer l'ancienne table. Vous pouvez utiliser l' [clickhouse-copieur](../operations/utils/clickhouse-copier.md) comme une alternative à la `INSERT SELECT` requête. + +Le `ALTER` query bloque toutes les lectures et écritures pour la table. En d'autres termes, si une longue `SELECT` est en cours d'exécution au moment de la `ALTER` requête, la `ALTER` la requête va attendre qu'elle se termine. Dans le même temps, toutes les nouvelles requêtes à la même table attendre que ce `ALTER` est en cours d'exécution. + +Pour les tables qui ne stockent pas les données elles-mêmes (telles que `Merge` et `Distributed`), `ALTER` change simplement la structure de la table, et ne change pas la structure des tables subordonnées. Par exemple, lors de L'exécution de ALTER pour un `Distributed` table, vous devrez également exécuter `ALTER` pour les tables sur tous les serveurs distants. + +### Manipulations Avec Des Expressions Clés {#manipulations-with-key-expressions} + +La commande suivante est prise en charge: + +``` sql +MODIFY ORDER BY new_expression +``` + +Cela ne fonctionne que pour les tables du [`MergeTree`](../operations/table_engines/mergetree.md) de la famille (y compris les +[répliqué](../operations/table_engines/replication.md) table). La commande change l' +[clé de tri](../operations/table_engines/mergetree.md) de la table +de `new_expression` (une expression ou un tuple d'expressions). Clé primaire reste le même. + +La commande est légère en ce sens qu'elle ne modifie que les métadonnées. Pour conserver la propriété cette partie de données +les lignes sont ordonnées par l'expression de clé de tri vous ne pouvez pas ajouter d'expressions contenant des colonnes existantes +à la clé de tri (seules les colonnes ajoutées par `ADD COLUMN` commande dans le même `ALTER` requête). + +### Manipulations Avec Des Indices De Saut De Données {#manipulations-with-data-skipping-indices} + +Cela ne fonctionne que pour les tables du [`*MergeTree`](../operations/table_engines/mergetree.md) de la famille (y compris les +[répliqué](../operations/table_engines/replication.md) table). Les opérations suivantes +sont disponibles: + +- `ALTER TABLE [db].name ADD INDEX name expression TYPE type GRANULARITY value AFTER name [AFTER name2]` - Ajoute la description de l'index aux métadonnées des tables. + +- `ALTER TABLE [db].name DROP INDEX name` - Supprime la description de l'index des métadonnées des tables et supprime les fichiers d'index du disque. + +Ces commandes sont légères dans le sens où elles ne modifient que les métadonnées ou suppriment des fichiers. +En outre, ils sont répliqués (synchronisation des métadonnées des indices via ZooKeeper). + +### Manipulations avec contraintes {#manipulations-with-constraints} + +En voir plus sur [contraintes](create.md#constraints) + +Les contraintes peuvent être ajoutées ou supprimées à l'aide de la syntaxe suivante: + +``` sql +ALTER TABLE [db].name ADD CONSTRAINT constraint_name CHECK expression; +ALTER TABLE [db].name DROP CONSTRAINT constraint_name; +``` + +Les requêtes ajouteront ou supprimeront des métadonnées sur les contraintes de la table afin qu'elles soient traitées immédiatement. + +Contrainte de vérifier *ne sera pas exécuté* sur les données existantes si elle a été ajoutée. + +Toutes les modifications sur les tables répliquées sont diffusées sur ZooKeeper et seront donc appliquées sur d'autres répliques. + +### Manipulations avec des Partitions et des pièces {#alter_manipulations-with-partitions} + +Les opérations suivantes avec [partition](../operations/table_engines/custom_partitioning_key.md) sont disponibles: + +- [DETACH PARTITION](#alter_detach-partition) – Moves a partition to the `detached` répertoire et de l'oublier. +- [DROP PARTITION](#alter_drop-partition) – Deletes a partition. +- [ATTACH PART\|PARTITION](#alter_attach-partition) – Adds a part or partition from the `detached` répertoire à la table. +- [REPLACE PARTITION](#alter_replace-partition) - Copie la partition de données d'une table à l'autre. +- [ATTACH PARTITION FROM](#alter_attach-partition-from) – Copies the data partition from one table to another and adds. +- [REPLACE PARTITION](#alter_replace-partition) - Copie la partition de données d'une table à l'autre et la remplace. +- [MOVE PARTITION TO TABLE](#alter_move_to_table-partition) (\#alter\_move\_to\_table-partition) - déplace la partition de données d'une table à l'autre. +- [CLEAR COLUMN IN PARTITION](#alter_clear-column-partition) - Rétablit la valeur d'une colonne spécifiée dans une partition. +- [CLEAR INDEX IN PARTITION](#alter_clear-index-partition) - Réinitialise l'index secondaire spécifié dans une partition. +- [FREEZE PARTITION](#alter_freeze-partition) – Creates a backup of a partition. +- [FETCH PARTITION](#alter_fetch-partition) – Downloads a partition from another server. +- [MOVE PARTITION\|PART](#alter_move-partition) – Move partition/data part to another disk or volume. + + + +#### Détacher la PARTITION {\#alter\_detach-partition} {#detach-partition-alter-detach-partition} + +``` sql +ALTER TABLE table_name DETACH PARTITION partition_expr +``` + +Déplace toutes les données de la partition spécifiée vers `detached` répertoire. Le serveur oublie la partition de données détachée comme si elle n'existait pas. Le serveur ne connaîtra pas ces données tant que vous n'aurez pas [ATTACH](#alter_attach-partition) requête. + +Exemple: + +``` sql +ALTER TABLE visits DETACH PARTITION 201901 +``` + +Lisez à propos de la définition de l'expression de partition dans une section [Comment spécifier l'expression de partition](#alter-how-to-specify-part-expr). + +Une fois la requête exécutée, vous pouvez faire ce que vous voulez avec les données du `detached` directory — delete it from the file system, or just leave it. + +This query is replicated – it moves the data to the `detached` répertoire sur toutes les répliques. Notez que vous ne pouvez exécuter cette requête que sur un réplica leader. Pour savoir si une réplique est un leader, effectuez le `SELECT` requête à l' [système.réplique](../operations/system_tables.md#system_tables-replicas) table. Alternativement, il est plus facile de faire une `DETACH` requête sur toutes les répliques - toutes les répliques lancent une exception, à l'exception de la réplique leader. + +#### DROP PARTITION {#alter_drop-partition} + +``` sql +ALTER TABLE table_name DROP PARTITION partition_expr +``` + +Supprime la partition spécifiée de la table. Cette requête marque la partition comme inactive et supprime complètement les données, environ en 10 minutes. + +Lisez à propos de la définition de l'expression de partition dans une section [Comment spécifier l'expression de partition](#alter-how-to-specify-part-expr). + +The query is replicated – it deletes data on all replicas. + +#### DROP DETACHED PARTITION\|PART {#alter_drop-detached} + +``` sql +ALTER TABLE table_name DROP DETACHED PARTITION|PART partition_expr +``` + +Supprime la partie spécifiée ou toutes les parties de la partition spécifiée de `detached`. +En savoir plus sur la définition de l'expression de partition dans une section [Comment spécifier l'expression de partition](#alter-how-to-specify-part-expr). + +#### ATTACH PARTITION\|PART {#alter_attach-partition} + +``` sql +ALTER TABLE table_name ATTACH PARTITION|PART partition_expr +``` + +Ajoute des données à la table à partir du `detached` répertoire. Il est possible d'ajouter des données dans une partition entière ou pour une partie distincte. Exemple: + +``` sql +ALTER TABLE visits ATTACH PARTITION 201901; +ALTER TABLE visits ATTACH PART 201901_2_2_0; +``` + +En savoir plus sur la définition de l'expression de partition dans une section [Comment spécifier l'expression de partition](#alter-how-to-specify-part-expr). + +Cette requête est répliquée. L'initiateur de réplica vérifie s'il y a des données dans le `detached` répertoire. Si des données existent, la requête vérifie son intégrité. Si tout est correct, la requête ajoute les données à la table. Tous les autres réplicas téléchargent les données de l'initiateur de réplica. + +Ainsi, vous pouvez mettre des données à la `detached` répertoire sur une réplique, et utilisez le `ALTER ... ATTACH` requête pour l'ajouter à la table sur tous les réplicas. + +#### ATTACH PARTITION FROM {#alter_attach-partition-from} + +``` sql +ALTER TABLE table2 ATTACH PARTITION partition_expr FROM table1 +``` + +Cette requête copie la partition de données du `table1` de `table2` ajoute des données de gratuit dans la `table2`. Notez que les données ne seront pas supprimées de `table1`. + +Pour que la requête s'exécute correctement, les conditions suivantes doivent être remplies: + +- Les deux tables doivent avoir la même structure. +- Les deux tables doivent avoir la même clé de partition. + +#### REPLACE PARTITION {#alter_replace-partition} + +``` sql +ALTER TABLE table2 REPLACE PARTITION partition_expr FROM table1 +``` + +Cette requête copie la partition de données du `table1` de `table2` et remplace la partition existante dans le `table2`. Notez que les données ne seront pas supprimées de `table1`. + +Pour que la requête s'exécute correctement, les conditions suivantes doivent être remplies: + +- Les deux tables doivent avoir la même structure. +- Les deux tables doivent avoir la même clé de partition. + +#### MOVE PARTITION TO TABLE {#alter_move_to_table-partition} + +``` sql +ALTER TABLE table_source MOVE PARTITION partition_expr TO TABLE table_dest +``` + +Cette requête déplace la partition de données du `table_source` de `table_dest` avec la suppression des données de `table_source`. + +Pour que la requête s'exécute correctement, les conditions suivantes doivent être remplies: + +- Les deux tables doivent avoir la même structure. +- Les deux tables doivent avoir la même clé de partition. +- Les deux tables doivent appartenir à la même famille de moteurs. (répliqué ou non répliqué) +- Les deux tables doivent avoir la même stratégie de stockage. + +#### CLEAR COLUMN IN PARTITION {#alter_clear-column-partition} + +``` sql +ALTER TABLE table_name CLEAR COLUMN column_name IN PARTITION partition_expr +``` + +Réinitialise toutes les valeurs de la colonne spécifiée dans une partition. Si l' `DEFAULT` la clause a été déterminée lors de la création d'une table, cette requête définit la valeur de la colonne à une valeur par défaut spécifiée. + +Exemple: + +``` sql +ALTER TABLE visits CLEAR COLUMN hour in PARTITION 201902 +``` + +#### FREEZE PARTITION {#alter_freeze-partition} + +``` sql +ALTER TABLE table_name FREEZE [PARTITION partition_expr] +``` + +Cette requête crée une sauvegarde locale d'une partition spécifiée. Si l' `PARTITION` la clause est omise, la requête crée la sauvegarde de toutes les partitions à la fois. + +!!! note "Note" + L'ensemble du processus de sauvegarde est effectuée sans arrêter le serveur. + +Notez que pour les tables de style ancien, vous pouvez spécifier le préfixe du nom de la partition (par exemple, ‘2019’)- ensuite, la requête crée la sauvegarde pour toutes les partitions correspondantes. Lisez à propos de la définition de l'expression de partition dans une section [Comment spécifier l'expression de partition](#alter-how-to-specify-part-expr). + +Au moment de l'exécution, pour un instantané de données, la requête crée des liens rigides vers des données de table. Les liens sont placés dans le répertoire `/var/lib/clickhouse/shadow/N/...`, où: + +- `/var/lib/clickhouse/` est le répertoire de travail clickhouse spécifié dans la configuration. +- `N` est le numéro incrémental de la sauvegarde. + +!!! note "Note" + Si vous utilisez [un ensemble de disques pour le stockage des données dans une table](../operations/table_engines/mergetree.md#table_engine-mergetree-multiple-volumes), le `shadow/N` le répertoire apparaît sur chaque disque, stockant les parties de données correspondant `PARTITION` expression. + +La même structure de répertoires est créée à l'intérieur de la sauvegarde qu'à l'intérieur `/var/lib/clickhouse/`. La requête effectue ‘chmod’ pour tous les fichiers, interdisant d'écrire en eux. + +Après avoir créé la sauvegarde, vous pouvez copier les données depuis `/var/lib/clickhouse/shadow/` sur le serveur distant, puis supprimez-le du serveur local. Notez que l' `ALTER t FREEZE PARTITION` la requête n'est pas répliqué. Il crée une sauvegarde locale uniquement sur le serveur local. + +La requête crée une sauvegarde presque instantanément (mais elle attend d'abord que les requêtes en cours à la table correspondante se terminent). + +`ALTER TABLE t FREEZE PARTITION` copie uniquement les données, pas les métadonnées de la table. Faire une sauvegarde des métadonnées de la table, copiez le fichier `/var/lib/clickhouse/metadata/database/table.sql` + +Pour restaurer des données à partir d'une sauvegarde, procédez comme suit: + +1. Créer la table si elle n'existe pas. Pour afficher la requête, utilisez la .fichier sql (remplacer `ATTACH` avec `CREATE`). +2. Copier les données de la `data/database/table/` répertoire à l'intérieur de la sauvegarde `/var/lib/clickhouse/data/database/table/detached/` répertoire. +3. Exécuter `ALTER TABLE t ATTACH PARTITION` les requêtes pour ajouter les données à une table. + +La restauration à partir d'une sauvegarde ne nécessite pas l'arrêt du serveur. + +Pour plus d'informations sur les sauvegardes et la restauration [La Sauvegarde Des Données](../operations/backup.md) section. + +#### CLEAR INDEX IN PARTITION {#alter_clear-index-partition} + +``` sql +ALTER TABLE table_name CLEAR INDEX index_name IN PARTITION partition_expr +``` + +La requête fonctionne de manière similaire à `CLEAR COLUMN` mais il remet un index au lieu d'une colonne de données. + +#### FETCH PARTITION {#alter_fetch-partition} + +``` sql +ALTER TABLE table_name FETCH PARTITION partition_expr FROM 'path-in-zookeeper' +``` + +Télécharge une partition depuis un autre serveur. Cette requête ne fonctionne que pour les tables répliquées. + +La requête effectue les opérations suivantes: + +1. Télécharge la partition à partir du fragment spécifié. Dans ‘path-in-zookeeper’ vous devez spécifier un chemin vers le fragment dans ZooKeeper. +2. Ensuite, la requête met les données téléchargées dans le `detached` répertoire de la `table_name` table. L'utilisation de la [ATTACH PARTITION\|PART](#alter_attach-partition) requête pour ajouter les données à la table. + +Exemple: + +``` sql +ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits'; +ALTER TABLE users ATTACH PARTITION 201902; +``` + +Notez que: + +- Le `ALTER ... FETCH PARTITION` la requête n'est pas répliqué. Il place la partition à la `detached` répertoire sur le serveur local. +- Le `ALTER TABLE ... ATTACH` la requête est répliquée. Il ajoute les données à toutes les répliques. Les données sont ajoutées à l'une des répliques `detached` répertoire, et aux autres-des répliques voisines. + +Avant le téléchargement, le système vérifie si la partition existe et si la structure de la table correspond. La réplique la plus appropriée est sélectionnée automatiquement parmi les répliques saines. + +Bien que la requête soit appelée `ALTER TABLE`, il ne modifie pas la structure de la table et ne modifie pas immédiatement les données disponibles dans la table. + +#### MOVE PARTITION\|PART {#alter_move-partition} + +Déplace des partitions ou des parties de données vers un autre volume ou disque pour `MergeTree`-tables de moteur. Voir [Utilisation de plusieurs périphériques de bloc pour le stockage de données](../operations/table_engines/mergetree.md#table_engine-mergetree-multiple-volumes). + +``` sql +ALTER TABLE table_name MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name' +``` + +Le `ALTER TABLE t MOVE` requête: + +- Non répliqué, car différentes répliques peuvent avoir des stratégies de stockage différentes. +- Renvoie une erreur si le disque ou le volume n'est pas configuré. Query renvoie également une erreur si les conditions de déplacement des données, spécifiées dans la stratégie de stockage, ne peuvent pas être appliquées. +- Peut renvoyer une erreur dans le cas, lorsque les données à déplacer sont déjà déplacées par un processus en arrière-plan, simultané `ALTER TABLE t MOVE` requête ou à la suite de la fusion de données d'arrière-plan. Un utilisateur ne doit effectuer aucune action supplémentaire dans ce cas. + +Exemple: + +``` sql +ALTER TABLE hits MOVE PART '20190301_14343_16206_438' TO VOLUME 'slow' +ALTER TABLE hits MOVE PARTITION '2019-09-01' TO DISK 'fast_ssd' +``` + +#### Comment Définir L'Expression De La Partition {#alter-how-to-specify-part-expr} + +Vous pouvez spécifier l'expression de partition dans `ALTER ... PARTITION` requêtes de différentes manières: + +- Comme une valeur de l' `partition` la colonne de la `system.parts` table. Exemple, `ALTER TABLE visits DETACH PARTITION 201901`. +- Comme expression de la colonne de la table. Les constantes et les expressions constantes sont prises en charge. Exemple, `ALTER TABLE visits DETACH PARTITION toYYYYMM(toDate('2019-01-25'))`. +- À l'aide de l'ID de partition. Partition ID est un identifiant de chaîne de la partition (lisible par l'homme, si possible) qui est utilisé comme noms de partitions dans le système de fichiers et dans ZooKeeper. L'ID de partition doit être spécifié dans `PARTITION ID` clause, entre guillemets simples. Exemple, `ALTER TABLE visits DETACH PARTITION ID '201901'`. +- Dans le [ALTER ATTACH PART](#alter_attach-partition) et [DROP DETACHED PART](#alter_drop-detached) requête, pour spécifier le nom d'une partie, utilisez le littéral de chaîne avec une valeur de `name` la colonne de la [système.detached\_parts](../operations/system_tables.md#system_tables-detached_parts) table. Exemple, `ALTER TABLE visits ATTACH PART '201901_1_1_0'`. + +L'utilisation de guillemets lors de la spécification de la partition dépend du type d'expression de partition. Par exemple, pour la `String` type, vous devez spécifier son nom entre guillemets (`'`). Pour l' `Date` et `Int*` types aucune citation n'est nécessaire. + +Pour les tables de style ancien, vous pouvez spécifier la partition sous forme de nombre `201901` ou une chaîne de caractères `'201901'`. La syntaxe des tables new-style est plus stricte avec les types (similaire à l'analyseur pour le format D'entrée des valeurs). + +Toutes les règles ci-dessus sont aussi valables pour la [OPTIMIZE](misc.md#misc_operations-optimize) requête. Si vous devez spécifier la seule partition lors de l'optimisation d'une table non partitionnée, définissez l'expression `PARTITION tuple()`. Exemple: + +``` sql +OPTIMIZE TABLE table_not_partitioned PARTITION tuple() FINAL; +``` + +Les exemples de `ALTER ... PARTITION` les requêtes sont démontrées dans les tests [`00502_custom_partitioning_local`](https://github.com/ClickHouse/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00502_custom_partitioning_local.sql) et [`00502_custom_partitioning_replicated_zookeeper`](https://github.com/ClickHouse/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00502_custom_partitioning_replicated_zookeeper.sql). + +### Manipulations avec Table TTL {#manipulations-with-table-ttl} + +Vous pouvez modifier [tableau TTL](../operations/table_engines/mergetree.md#mergetree-table-ttl) avec une demande du formulaire suivant: + +``` sql +ALTER TABLE table-name MODIFY TTL ttl-expression +``` + +### Synchronicité des requêtes ALTER {#synchronicity-of-alter-queries} + +Pour les tables non réplicables, tous `ALTER` les requêtes sont exécutées simultanément. Pour les tables réplicables, la requête ajoute simplement des instructions pour les actions appropriées à `ZooKeeper` et les actions elles-mêmes sont effectuées dès que possible. Cependant, la requête peut attendre que ces actions soient terminées sur tous les réplicas. + +Pour `ALTER ... ATTACH|DETACH|DROP` les requêtes, vous pouvez utiliser le `replication_alter_partitions_sync` configuration pour configurer l'attente. +Valeurs possibles: `0` – do not wait; `1` – only wait for own execution (default); `2` – wait for all. + +### Mutation {#alter-mutations} + +Les Mutations sont une variante ALTER query qui permet de modifier ou de supprimer des lignes dans une table. Contrairement à la norme `UPDATE` et `DELETE` les requêtes qui sont destinées aux changements de données de point, les mutations sont destinées aux opérations lourdes qui modifient beaucoup de lignes dans une table. Pris en charge pour le `MergeTree` famille de moteurs de table, y compris les moteurs avec support de réplication. + +Les tables existantes sont prêtes pour les mutations telles quelles (aucune conversion nécessaire), mais après l'application de la première mutation à une table, son format de métadonnées devient incompatible avec les versions précédentes du serveur et il devient impossible de revenir à une version précédente. + +Commandes actuellement disponibles: + +``` sql +ALTER TABLE [db.]table DELETE WHERE filter_expr +``` + +Le `filter_expr` doit être de type `UInt8`. La requête supprime les lignes de la table pour lesquelles cette expression prend une valeur différente de zéro. + +``` sql +ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr +``` + +Le `filter_expr` doit être de type `UInt8`. Cette requête met à jour les valeurs des colonnes spécifiées en les valeurs des expressions correspondantes dans les lignes pour lesquelles `filter_expr` prend une valeur non nulle. Les valeurs sont converties en type de colonne à l'aide `CAST` opérateur. La mise à jour des colonnes utilisées dans le calcul de la clé primaire ou de la clé de partition n'est pas prise en charge. + +``` sql +ALTER TABLE [db.]table MATERIALIZE INDEX name IN PARTITION partition_name +``` + +La requête reconstruit l'index secondaire `name` dans la partition `partition_name`. + +Une requête peut contenir plusieurs commandes séparées par des virgules. + +Pour les tables \* MergeTree, les mutations s'exécutent en réécrivant des parties de données entières. Il n'y a pas d'atomicité-les pièces sont substituées aux pièces mutées dès qu'elles sont prêtes et un `SELECT` la requête qui a commencé à s'exécuter pendant une mutation verra les données des parties qui ont déjà été mutées ainsi que les données des parties qui n'ont pas encore été mutées. + +Les Mutations sont totalement ordonnées par leur ordre de création et sont appliquées à chaque partie dans cet ordre. Les Mutations sont également partiellement ordonnées avec des insertions - les données insérées dans la table avant la soumission de la mutation seront mutées et les données insérées après ne seront pas mutées. Notez que les mutations ne bloquent en aucune façon les INSERTs. + +Une requête de mutation retourne immédiatement après l'ajout de l'entrée de mutation (dans le cas de tables répliquées à ZooKeeper, pour les tables non compliquées - au système de fichiers). La mutation elle-même s'exécute de manière asynchrone en utilisant les paramètres du profil système. Pour suivre l'avancement des mutations vous pouvez utiliser la [`system.mutations`](../operations/system_tables.md#system_tables-mutations) table. Une mutation qui a été soumise avec succès continuera à s'exécuter même si les serveurs ClickHouse sont redémarrés. Il n'y a aucun moyen de faire reculer la mutation une fois qu'elle est soumise, mais si la mutation est bloquée pour une raison quelconque, elle peut être annulée avec le [`KILL MUTATION`](misc.md#kill-mutation) requête. + +Les entrées pour les mutations finies ne sont pas supprimées immédiatement (le nombre d'entrées conservées est déterminé par `finished_mutations_to_keep` le moteur de stockage de paramètre). Les anciennes entrées de mutation sont supprimées. + +[Article Original](https://clickhouse.tech/docs/en/query_language/alter/) diff --git a/docs/fr/query_language/create.md b/docs/fr/query_language/create.md new file mode 100644 index 00000000000..b4a6dea29fb --- /dev/null +++ b/docs/fr/query_language/create.md @@ -0,0 +1,306 @@ +--- +machine_translated: true +--- + +# Créer des requêtes {#create-queries} + +## CREATE DATABASE {#query-language-create-database} + +Crée la base de données. + +``` sql +CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)] +``` + +### Clause {#clauses} + +- `IF NOT EXISTS` + + If the `db_name` database already exists, then ClickHouse doesn't create a new database and: + + - Doesn't throw an exception if clause is specified. + - Throws an exception if clause isn't specified. + +- `ON CLUSTER` + + ClickHouse creates the `db_name` database on all the servers of a specified cluster. + +- `ENGINE` + + - [MySQL](../database_engines/mysql.md) + + Allows you to retrieve data from the remote MySQL server. + + By default, ClickHouse uses its own [database engine](../database_engines/index.md). + +## CREATE TABLE {#create-table-query} + +Le `CREATE TABLE` la requête peut avoir plusieurs formes. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [compression_codec] [TTL expr2], + ... +) ENGINE = engine +``` + +Crée une table nommée ‘name’ dans le ‘db’ base de données ou la base de données actuelle si ‘db’ n'est pas définie, avec la structure spécifiée entre parenthèses et l' ‘engine’ moteur. +La structure de la table est une liste de descriptions de colonnes. Si les index sont pris en charge par le moteur, ils sont indiqués comme paramètres pour le moteur de table. + +Une description de colonne est `name type` dans le cas le plus simple. Exemple: `RegionID UInt32`. +Des Expressions peuvent également être définies pour les valeurs par défaut (voir ci-dessous). + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine] +``` + +Crée une table avec la même structure qu'une autre table. Vous pouvez spécifier un moteur différent pour la table. Si le moteur n'est pas spécifié, le même moteur sera utilisé que pour la `db2.name2` table. + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name AS table_function() +``` + +Crée une table avec la structure et les données renvoyées par [fonction de table](table_functions/index.md). + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ... +``` + +Crée une table avec une structure comme le résultat de l' `SELECT` une requête avec les ‘engine’ moteur, et le remplit avec des données de SELECT. + +Dans tous les cas, si `IF NOT EXISTS` est spécifié, la requête ne renvoie pas une erreur si la table existe déjà. Dans ce cas, la requête ne font rien. + +Il peut y avoir d'autres clauses après le `ENGINE` la clause dans la requête. Voir la documentation détaillée sur la façon de créer des tables dans les descriptions de [moteurs de table](../operations/table_engines/index.md#table_engines). + +### Les Valeurs Par Défaut {#create-default-values} + +La description de colonne peut spécifier une expression pour une valeur par défaut, de l'une des manières suivantes:`DEFAULT expr`, `MATERIALIZED expr`, `ALIAS expr`. +Exemple: `URLDomain String DEFAULT domain(URL)`. + +Si une expression pour la valeur par défaut n'est pas définie, les valeurs par défaut seront définies sur zéros pour les nombres, chaînes vides pour les chaînes, tableaux vides pour les tableaux et `0000-00-00` pour les dates ou `0000-00-00 00:00:00` pour les dates avec le temps. Les valeurs NULL ne sont pas prises en charge. + +Si l'expression par défaut est définie, le type de colonne est facultatif. S'il n'y a pas de type explicitement défini, le type d'expression par défaut est utilisé. Exemple: `EventDate DEFAULT toDate(EventTime)` – the ‘Date’ type sera utilisé pour la ‘EventDate’ colonne. + +Si le type de données et l'expression par défaut sont définis explicitement, cette expression sera convertie au type spécifié à l'aide des fonctions de conversion de type. Exemple: `Hits UInt32 DEFAULT 0` signifie la même chose que `Hits UInt32 DEFAULT toUInt32(0)`. + +Default expressions may be defined as an arbitrary expression from table constants and columns. When creating and changing the table structure, it checks that expressions don't contain loops. For INSERT, it checks that expressions are resolvable – that all columns they can be calculated from have been passed. + +`DEFAULT expr` + +Valeur par défaut normale. Si la requête INSERT ne spécifie pas la colonne correspondante, elle sera remplie en calculant l'expression correspondante. + +`MATERIALIZED expr` + +Expression matérialisée. Une telle colonne ne peut pas être spécifiée pour INSERT, car elle est toujours calculée. +Pour un INSERT sans Liste de colonnes, ces colonnes ne sont pas prises en compte. +De plus, cette colonne n'est pas substituée lors de l'utilisation d'un astérisque dans une requête SELECT. C'est pour préserver l'invariant que le dump obtenu en utilisant `SELECT *` peut être inséré dans la table en utilisant INSERT sans spécifier la liste des colonnes. + +`ALIAS expr` + +Synonyme. Une telle colonne n'est pas du tout stockée dans la table. +Ses valeurs ne peuvent pas être insérées dans une table et elles ne sont pas substituées lors de l'utilisation d'un astérisque dans une requête SELECT. +Il peut être utilisé dans SELECTs si l'alias est développé pendant l'analyse des requêtes. + +Lorsque vous utilisez la requête ALTER pour ajouter de nouvelles colonnes, les anciennes données de ces colonnes ne sont pas écrites. Au lieu de cela, lors de la lecture d'anciennes données qui n'ont pas de valeurs pour les nouvelles colonnes, les expressions sont calculées à la volée par défaut. Cependant, si l'exécution des expressions nécessite différentes colonnes qui ne sont pas indiquées dans la requête, ces colonnes seront en outre lues, mais uniquement pour les blocs de données qui en ont besoin. + +Si vous ajoutez une nouvelle colonne à une table mais modifiez ultérieurement son expression par défaut, les valeurs utilisées pour les anciennes données changeront (pour les données où les valeurs n'ont pas été stockées sur le disque). Notez que lors de l'exécution de fusions d'arrière-plan, les données des colonnes manquantes dans l'une des parties de fusion sont écrites dans la partie fusionnée. + +Il n'est pas possible de définir des valeurs par défaut pour les éléments dans les structures de données. + +### Contraintes {#constraints} + +Avec les descriptions de colonnes des contraintes peuvent être définies: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1], + ... + CONSTRAINT constraint_name_1 CHECK boolean_expr_1, + ... +) ENGINE = engine +``` + +`boolean_expr_1` pourrait par n'importe quelle expression booléenne. Si les contraintes sont définies pour la table, chacun d'eux sera vérifiée pour chaque ligne `INSERT` query. If any constraint is not satisfied — server will raise an exception with constraint name and checking expression. + +L'ajout d'une grande quantité de contraintes peut affecter négativement les performances de big `INSERT` requête. + +### Expression TTL {#ttl-expression} + +Définit la durée de stockage des valeurs. Peut être spécifié uniquement pour les tables mergetree-family. Pour la description détaillée, voir [TTL pour les colonnes et les tableaux](../operations/table_engines/mergetree.md#table_engine-mergetree-ttl). + +### Codecs De Compression De Colonne {#codecs} + +Par défaut, ClickHouse applique le `lz4` méthode de compression. Pour `MergeTree`- famille de moteurs Vous pouvez modifier la méthode de compression par défaut dans le [compression](../operations/server_settings/settings.md#server-settings-compression) section d'une configuration de serveur. Vous pouvez également définir la méthode de compression pour chaque colonne `CREATE TABLE` requête. + +``` sql +CREATE TABLE codec_example +( + dt Date CODEC(ZSTD), + ts DateTime CODEC(LZ4HC), + float_value Float32 CODEC(NONE), + double_value Float64 CODEC(LZ4HC(9)) + value Float32 CODEC(Delta, ZSTD) +) +ENGINE = +... +``` + +Si un codec est spécifié, le codec par défaut ne s'applique pas. Les Codecs peuvent être combinés dans un pipeline, par exemple, `CODEC(Delta, ZSTD)`. Pour sélectionner la meilleure combinaison de codecs pour votre projet, passez des benchmarks similaires à ceux décrits dans Altinity [Nouveaux encodages pour améliorer L'efficacité du ClickHouse](https://www.altinity.com/blog/2019/7/new-encodings-to-improve-clickhouse) article. + +!!! warning "Avertissement" + Vous ne pouvez pas décompresser les fichiers de base de données ClickHouse avec des utilitaires externes tels que `lz4`. Au lieu de cela, utilisez le spécial [clickhouse-compresseur](https://github.com/ClickHouse/ClickHouse/tree/master/dbms/programs/compressor) utilitaire. + +La Compression est prise en charge pour les moteurs de tableau suivants: + +- [MergeTree](../operations/table_engines/mergetree.md) famille. Prend en charge les codecs de compression de colonne et la sélection de la méthode de compression par défaut par [compression](../operations/server_settings/settings.md#server-settings-compression) paramètre. +- [Journal](../operations/table_engines/log_family.md) famille. Utilise la `lz4` méthode de compression par défaut et prend en charge les codecs de compression de colonne. +- [Définir](../operations/table_engines/set.md). Uniquement pris en charge la compression par défaut. +- [Rejoindre](../operations/table_engines/join.md). Uniquement pris en charge la compression par défaut. + +ClickHouse prend en charge les codecs à usage commun et les codecs spécialisés. + +#### Codecs Spécialisés {#create-query-specialized-codecs} + +Ces codecs sont conçus pour rendre la compression plus efficace en utilisant des fonctionnalités spécifiques des données. Certains de ces codecs ne compressent pas les données eux-mêmes. Au lieu de cela, ils préparent les données pour un codec à usage commun, qui les compresse mieux que sans cette préparation. + +Spécialisé codecs: + +- `Delta(delta_bytes)` — Compression approach in which raw values are replaced by the difference of two neighboring values, except for the first value that stays unchanged. Up to `delta_bytes` sont utilisés pour stocker des valeurs delta, donc `delta_bytes` est la taille maximale des valeurs brutes. Possible `delta_bytes` valeurs: 1, 2, 4, 8. La valeur par défaut pour `delta_bytes` être `sizeof(type)` si égale à 1, 2, 4 ou 8. Dans tous les autres cas, c'est 1. +- `DoubleDelta` — Calculates delta of deltas and writes it in compact binary form. Optimal compression rates are achieved for monotonic sequences with a constant stride, such as time series data. Can be used with any fixed-width type. Implements the algorithm used in Gorilla TSDB, extending it to support 64-bit types. Uses 1 extra bit for 32-byte deltas: 5-bit prefixes instead of 4-bit prefixes. For additional information, see Compressing Time Stamps in [Gorilla: Une Base De Données De Séries Chronologiques Rapide, Évolutive Et En Mémoire](http://www.vldb.org/pvldb/vol8/p1816-teller.pdf). +- `Gorilla` — Calculates XOR between current and previous value and writes it in compact binary form. Efficient when storing a series of floating point values that change slowly, because the best compression rate is achieved when neighboring values are binary equal. Implements the algorithm used in Gorilla TSDB, extending it to support 64-bit types. For additional information, see Compressing Values in [Gorilla: Une Base De Données De Séries Chronologiques Rapide, Évolutive Et En Mémoire](http://www.vldb.org/pvldb/vol8/p1816-teller.pdf). +- `T64` — Compression approach that crops unused high bits of values in integer data types (including `Enum`, `Date` et `DateTime`). À chaque étape de son algorithme, le codec prend un bloc de 64 valeurs, les place dans une matrice de 64x64 bits, le transpose, recadre les bits de valeurs inutilisés et renvoie le reste sous forme de séquence. Les bits inutilisés sont les bits, qui ne diffèrent pas entre les valeurs maximum et minimum dans la partie de données entière pour laquelle la compression est utilisée. + +`DoubleDelta` et `Gorilla` les codecs sont utilisés dans Gorilla TSDB comme composants de son algorithme de compression. L'approche Gorilla est efficace dans les scénarios où il y a une séquence de valeurs qui changent lentement avec leurs horodatages. Les horodatages sont effectivement compressés par le `DoubleDelta` codec, et les valeurs sont effectivement comprimé par le `Gorilla` codec. Par exemple, pour obtenir une table stockée efficacement, vous pouvez la créer dans la configuration suivante: + +``` sql +CREATE TABLE codec_example +( + timestamp DateTime CODEC(DoubleDelta), + slow_values Float32 CODEC(Gorilla) +) +ENGINE = MergeTree() +``` + +#### Codecs à usage commun {#create-query-common-purpose-codecs} + +Codec: + +- `NONE` — No compression. +- `LZ4` — Lossless [algorithme de compression de données](https://github.com/lz4/lz4) utilisé par défaut. Applique la compression rapide LZ4. +- `LZ4HC[(level)]` — LZ4 HC (high compression) algorithm with configurable level. Default level: 9. Setting `level <= 0` s'applique le niveau par défaut. Niveaux possibles: \[1, 12\]. Plage de niveau recommandée: \[4, 9\]. +- `ZSTD[(level)]` — [Algorithme de compression ZSTD](https://en.wikipedia.org/wiki/Zstandard) avec configurables `level`. Niveaux possibles: \[1, 22\]. Valeur par défaut: 1. + +Des niveaux de compression élevés sont utiles pour les scénarios asymétriques, comme compresser une fois, décompresser à plusieurs reprises. Des niveaux plus élevés signifient une meilleure compression et une utilisation plus élevée du processeur. + +## Les Tables Temporaires {#temporary-tables} + +Clickhouse prend en charge les tables temporaires qui ont les caractéristiques suivantes: + +- Les tables temporaires disparaissent à la fin de la session, y compris si la connexion est perdue. +- Une table temporaire utilise uniquement le moteur de mémoire. +- La base de données ne peut pas être spécifiée pour une table temporaire. Il est créé en dehors des bases de données. +- Impossible de créer une table temporaire avec une requête DDL distribuée sur tous les serveurs de cluster (en utilisant `ON CLUSTER`): ce tableau n'existe que dans la session en cours. +- Si une table temporaire a le même nom qu'une autre et qu'une requête spécifie le nom de la table sans spécifier la base de données, la table temporaire sera utilisée. +- Pour le traitement des requêtes distribuées, les tables temporaires utilisées dans une requête sont transmises à des serveurs distants. + +Pour créer une table temporaire, utilisez la syntaxe suivante: + +``` sql +CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) +``` + +Dans la plupart des cas, les tables temporaires ne sont pas créées manuellement, mais lors de l'utilisation de données externes pour une requête ou pour `(GLOBAL) IN`. Pour plus d'informations, consultez les sections appropriées + +Il est possible d'utiliser des tables avec [Moteur = mémoire](../operations/table_engines/memory.md) au lieu de tables temporaires. + +## Requêtes DDL distribuées (sur la clause CLUSTER) {#distributed-ddl-queries-on-cluster-clause} + +Le `CREATE`, `DROP`, `ALTER`, et `RENAME` les requêtes prennent en charge l'exécution distribuée sur un cluster. +Par exemple, la requête suivante crée la `all_hits` `Distributed` tableau sur chaque ordinateur hôte `cluster`: + +``` sql +CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits) +``` + +Pour exécuter ces requêtes correctement, chaque hôte doit avoir la même définition de cluster (pour simplifier la synchronisation des configs, vous pouvez utiliser des substitutions de ZooKeeper). Ils doivent également se connecter aux serveurs ZooKeeper. +La version locale de la requête sera finalement implémentée sur chaque hôte du cluster, même si certains hôtes ne sont actuellement pas disponibles. L'ordre d'exécution des requêtes au sein d'un seul hôte est garanti. + +## CREATE VIEW {#create-view} + +``` sql +CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ... +``` + +Crée une vue. Il existe deux types de vues: normale et matérialisée. + +Les vues normales ne stockent aucune donnée, mais effectuent simplement une lecture à partir d'une autre table. En d'autres termes, une vue normale n'est rien de plus qu'une requête enregistrée. Lors de la lecture à partir d'une vue, cette requête enregistrée est utilisée comme sous-requête dans la clause FROM. + +Par exemple, supposons que vous avez créé une vue: + +``` sql +CREATE VIEW view AS SELECT ... +``` + +et écrit une requête: + +``` sql +SELECT a, b, c FROM view +``` + +Cette requête est entièrement équivalente à l'utilisation de la sous requête: + +``` sql +SELECT a, b, c FROM (SELECT ...) +``` + +Les vues matérialisées stockent les données transformées par la requête SELECT correspondante. + +Lors de la création d'une vue matérialisée sans `TO [db].[table]`, you must specify ENGINE – the table engine for storing data. + +Lors de la création d'une vue matérialisée avec `TO [db].[table]` vous ne devez pas utiliser `POPULATE`. + +Une vue matérialisée est agencée comme suit: lors de l'insertion de données dans la table spécifiée dans SELECT, une partie des données insérées est convertie par cette requête SELECT, et le résultat est inséré dans la vue. + +Si vous spécifiez POPULATE, les données de table existantes sont insérées dans la vue lors de sa création, comme si `CREATE TABLE ... AS SELECT ...` . Sinon, la requête ne contient que les données insérées dans la table après la création de la vue. Nous ne recommandons pas D'utiliser POPULATE, car les données insérées dans la table lors de la création de la vue ne seront pas insérées dedans. + +A `SELECT` la requête peut contenir `DISTINCT`, `GROUP BY`, `ORDER BY`, `LIMIT`… Note that the corresponding conversions are performed independently on each block of inserted data. For example, if `GROUP BY` est définie, les données sont agrégées lors de l'insertion, mais uniquement dans un seul paquet de données insérées. Les données ne seront pas agrégées davantage. L'exception concerne l'utilisation d'un moteur qui effectue indépendamment l'agrégation de données, par exemple `SummingMergeTree`. + +L'exécution de `ALTER` les requêtes sur les vues matérialisées n'ont pas été complètement développées, elles pourraient donc être gênantes. Si la vue matérialisée utilise la construction `TO [db.]name` vous pouvez `DETACH` la vue, exécutez `ALTER` pour la table cible, puis `ATTACH` précédemment détaché (`DETACH`) vue. + +Les vues ressemblent aux tables normales. Par exemple, ils sont répertoriés dans le résultat de la `SHOW TABLES` requête. + +Il n'y a pas de requête séparée pour supprimer des vues. Pour supprimer une vue, utilisez `DROP TABLE`. + +## CREATE DICTIONARY {#create-dictionary-query} + +``` sql +CREATE DICTIONARY [IF NOT EXISTS] [db.]dictionary_name [ON CLUSTER cluster] +( + key1 type1 [DEFAULT|EXPRESSION expr1] [HIERARCHICAL|INJECTIVE|IS_OBJECT_ID], + key2 type2 [DEFAULT|EXPRESSION expr2] [HIERARCHICAL|INJECTIVE|IS_OBJECT_ID], + attr1 type2 [DEFAULT|EXPRESSION expr3], + attr2 type2 [DEFAULT|EXPRESSION expr4] +) +PRIMARY KEY key1, key2 +SOURCE(SOURCE_NAME([param1 value1 ... paramN valueN])) +LAYOUT(LAYOUT_NAME([param_name param_value])) +LIFETIME([MIN val1] MAX val2) +``` + +Crée [externe dictionnaire](dicts/external_dicts.md) avec le [structure](dicts/external_dicts_dict_structure.md), [source](dicts/external_dicts_dict_sources.md), [disposition](dicts/external_dicts_dict_layout.md) et [vie](dicts/external_dicts_dict_lifetime.md). + +Structure de dictionnaire externe se compose d'attributs. Les attributs du dictionnaire sont spécifiés de la même manière que les colonnes du tableau. La seule propriété d'attribut requise est son type, toutes les autres propriétés peuvent avoir des valeurs par défaut. + +Selon le dictionnaire [disposition](dicts/external_dicts_dict_layout.md) un ou plusieurs attributs peuvent être spécifiés comme les clés de dictionnaire. + +Pour plus d'informations, voir [Dictionnaires Externes](dicts/external_dicts.md) section. + +[Article Original](https://clickhouse.tech/docs/en/query_language/create/) diff --git a/docs/fr/query_language/dicts/external_dicts.md b/docs/fr/query_language/dicts/external_dicts.md new file mode 100644 index 00000000000..eb6829206b3 --- /dev/null +++ b/docs/fr/query_language/dicts/external_dicts.md @@ -0,0 +1,53 @@ +--- +machine_translated: true +--- + +# Dictionnaires Externes {#dicts-external-dicts} + +Vous pouvez ajouter vos propres dictionnaires à partir de diverses sources de données. La source de données d'un dictionnaire peut être un texte local ou un fichier exécutable, une ressource HTTP(S) ou un autre SGBD. Pour plus d'informations, voir “[Sources pour les dictionnaires externes](external_dicts_dict_sources.md)”. + +ClickHouse: + +- Stocke entièrement ou partiellement les dictionnaires en RAM. +- Met à jour périodiquement les dictionnaires et charge dynamiquement les valeurs manquantes. En d'autres mots, les dictionnaires peuvent être chargés dynamiquement. +- Permet de créer des dictionnaires externes avec des fichiers xml ou [Les requêtes DDL](../create.md#create-dictionary-query). + +La configuration des dictionnaires externes peut être située dans un ou plusieurs fichiers xml. Le chemin d'accès à la configuration spécifiée dans le [dictionaries\_config](../../operations/server_settings/settings.md#server_settings-dictionaries_config) paramètre. + +Les dictionnaires peuvent être chargés au démarrage du serveur ou à la première utilisation, en fonction [dictionaries\_lazy\_load](../../operations/server_settings/settings.md#server_settings-dictionaries_lazy_load) paramètre. + +Le fichier de configuration du dictionnaire a le format suivant: + +``` xml + + An optional element with any content. Ignored by the ClickHouse server. + + + /etc/metrika.xml + + + + + + + + +``` + +Vous pouvez [configurer](external_dicts_dict.md) le nombre de dictionnaires dans le même fichier. + +[Requêtes DDL pour les dictionnaires](../create.md#create-dictionary-query) ne nécessite aucun enregistrement supplémentaire dans la configuration du serveur. Ils permettent de travailler avec des dictionnaires en tant qu'entités de première classe, comme des tables ou des vues. + +!!! attention "Attention" + Vous pouvez convertir les valeurs pour un petit dictionnaire en le décrivant dans un `SELECT` requête (voir la [transformer](../functions/other_functions.md) fonction). Cette fonctionnalité n'est pas liée aux dictionnaires externes. + +## Voir aussi {#ext-dicts-see-also} + +- [Configuration D'un dictionnaire externe](external_dicts_dict.md) +- [Stockage des dictionnaires en mémoire](external_dicts_dict_layout.md) +- [Mises À Jour Du Dictionnaire](external_dicts_dict_lifetime.md) +- [Sources de dictionnaires externes](external_dicts_dict_sources.md) +- [Clé et champs du dictionnaire](external_dicts_dict_structure.md) +- [Fonctions pour travailler avec des dictionnaires externes](../functions/ext_dict_functions.md) + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/external_dicts/) diff --git a/docs/fr/query_language/dicts/external_dicts_dict.md b/docs/fr/query_language/dicts/external_dicts_dict.md new file mode 100644 index 00000000000..8012fc15cef --- /dev/null +++ b/docs/fr/query_language/dicts/external_dicts_dict.md @@ -0,0 +1,50 @@ +--- +machine_translated: true +--- + +# Configuration D'un dictionnaire externe {#dicts-external-dicts-dict} + +Si dictionary est configuré à l'aide d'un fichier xml, than dictionary configuration a la structure suivante: + +``` xml + + dict_name + + + + + + + + + + + + + + + + + +``` + +Correspondant [DDL-requête](../create.md#create-dictionary-query) a la structure suivante: + +``` sql +CREATE DICTIONARY dict_name +( + ... -- attributes +) +PRIMARY KEY ... -- complex or single key configuration +SOURCE(...) -- Source configuration +LAYOUT(...) -- Memory layout configuration +LIFETIME(...) -- Lifetime of dictionary in memory +``` + +- `name` – The identifier that can be used to access the dictionary. Use the characters `[a-zA-Z0-9_\-]`. +- [source](external_dicts_dict_sources.md) — Source of the dictionary. +- [disposition](external_dicts_dict_layout.md) — Dictionary layout in memory. +- [structure](external_dicts_dict_structure.md) — Structure of the dictionary . A key and attributes that can be retrieved by this key. +- [vie](external_dicts_dict_lifetime.md) — Frequency of dictionary updates. + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/external_dicts_dict/) diff --git a/docs/fr/query_language/dicts/external_dicts_dict_hierarchical.md b/docs/fr/query_language/dicts/external_dicts_dict_hierarchical.md new file mode 100644 index 00000000000..923e231e6b5 --- /dev/null +++ b/docs/fr/query_language/dicts/external_dicts_dict_hierarchical.md @@ -0,0 +1,67 @@ +--- +machine_translated: true +--- + +# Dictionnaires Hiérarchiques {#hierarchical-dictionaries} + +Clickhouse prend en charge les dictionnaires hiérarchiques avec un [touche numérique](external_dicts_dict_structure.md#ext_dict-numeric-key). + +Voici une structure hiérarchique: + +``` text +0 (Common parent) +│ +├── 1 (Russia) +│ │ +│ └── 2 (Moscow) +│ │ +│ └── 3 (Center) +│ +└── 4 (Great Britain) + │ + └── 5 (London) +``` + +Cette hiérarchie peut être exprimée comme la table de dictionnaire suivante. + +| id\_région | région\_parent | nom\_région | +|------------|----------------|--------------------| +| 1 | 0 | Russie | +| 2 | 1 | Moscou | +| 3 | 2 | Center | +| 4 | 0 | La Grande-Bretagne | +| 5 | 4 | Londres | + +Ce tableau contient une colonne `parent_region` qui contient la clé du parent le plus proche de l'élément. + +Clickhouse soutient le [hiérarchique](external_dicts_dict_structure.md#hierarchical-dict-attr) propriété pour [externe dictionnaire](index.md) attribut. Cette propriété vous permet de configurer le dictionnaire hiérarchique comme décrit ci-dessus. + +Le [dictGetHierarchy](../functions/ext_dict_functions.md#dictgethierarchy) la fonction vous permet d'obtenir la chaîne parent d'un élément. + +Pour notre exemple, la structure du dictionnaire peut être la suivante: + +``` xml + + + + region_id + + + + parent_region + UInt64 + 0 + true + + + + region_name + String + + + + + +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/external_dicts_dict_hierarchical/) diff --git a/docs/fr/query_language/dicts/external_dicts_dict_layout.md b/docs/fr/query_language/dicts/external_dicts_dict_layout.md new file mode 100644 index 00000000000..1132af859af --- /dev/null +++ b/docs/fr/query_language/dicts/external_dicts_dict_layout.md @@ -0,0 +1,370 @@ +--- +machine_translated: true +--- + +# Stockage des dictionnaires en mémoire {#dicts-external-dicts-dict-layout} + +Il existe une variété de façons de stocker les dictionnaires en mémoire. + +Nous vous recommandons [plat](#flat), [haché](#dicts-external_dicts_dict_layout-hashed) et [complex\_key\_hashed](#complex-key-hashed). qui fournissent la vitesse de traitement optimale. + +La mise en cache n'est pas recommandée en raison de performances potentiellement médiocres et de difficultés à sélectionner les paramètres optimaux. En savoir plus dans la section “[cache](#cache)”. + +Il existe plusieurs façons d'améliorer les performances du dictionnaire: + +- Appelez la fonction pour travailler avec le dictionnaire après `GROUP BY`. +- Marquer les attributs à extraire comme injectifs. Un attribut est appelé injectif si différentes valeurs d'attribut correspondent à différentes clés. Alors, quand `GROUP BY` utilise une fonction qui récupère une valeur d'attribut par la clé, cette fonction est automatiquement retirée de `GROUP BY`. + +ClickHouse génère une exception pour les erreurs avec les dictionnaires. Des exemples d'erreurs: + +- Le dictionnaire accessible n'a pas pu être chargé. +- Erreur de la requête d'une `cached` dictionnaire. + +Vous pouvez afficher la liste des dictionnaires externes et leurs statuts dans le `system.dictionaries` table. + +La configuration ressemble à ceci: + +``` xml + + + ... + + + + + + ... + + +``` + +Correspondant [DDL-requête](../create.md#create-dictionary-query): + +``` sql +CREATE DICTIONARY (...) +... +LAYOUT(LAYOUT_TYPE(param value)) -- layout settings +... +``` + +## Façons de stocker des dictionnaires en mémoire {#ways-to-store-dictionaries-in-memory} + +- [plat](#flat) +- [haché](#dicts-external_dicts_dict_layout-hashed) +- [sparse\_hashed](#dicts-external_dicts_dict_layout-sparse_hashed) +- [cache](#cache) +- [range\_hashed](#range-hashed) +- [complex\_key\_hashed](#complex-key-hashed) +- [complex\_key\_cache](#complex-key-cache) +- [ip\_trie](#ip-trie) + +### plat {#flat} + +Le dictionnaire est complètement stocké en mémoire sous la forme de tableaux plats. Combien de mémoire le dictionnaire utilise-t-il? Le montant est proportionnel à la taille de la plus grande clé (dans l'espace). + +La clé du dictionnaire a le `UInt64` type et la valeur est limitée à 500 000. Si une clé plus grande est découverte lors de la création du dictionnaire, ClickHouse lève une exception et ne crée pas le dictionnaire. + +Tous les types de sources sont pris en charge. Lors de la mise à jour, les données (à partir d'un fichier ou d'une table) sont lues dans leur intégralité. + +Cette méthode fournit les meilleures performances parmi toutes les méthodes disponibles de stockage du dictionnaire. + +Exemple de Configuration: + +``` xml + + + +``` + +ou + +``` sql +LAYOUT(FLAT()) +``` + +### haché {#dicts-external_dicts_dict_layout-hashed} + +Le dictionnaire est entièrement stockée en mémoire sous la forme d'une table de hachage. Le dictionnaire peut contenir n'importe quel nombre d'éléments avec tous les identificateurs Dans la pratique, le nombre de clés peut atteindre des dizaines de millions d'articles. + +Tous les types de sources sont pris en charge. Lors de la mise à jour, les données (à partir d'un fichier ou d'une table) sont lues dans leur intégralité. + +Exemple de Configuration: + +``` xml + + + +``` + +ou + +``` sql +LAYOUT(HASHED()) +``` + +### sparse\_hashed {#dicts-external_dicts_dict_layout-sparse_hashed} + +Semblable à `hashed`, mais utilise moins de mémoire en faveur de plus D'utilisation du processeur. + +Exemple de Configuration: + +``` xml + + + +``` + +``` sql +LAYOUT(SPARSE_HASHED()) +``` + +### complex\_key\_hashed {#complex-key-hashed} + +Ce type de stockage est pour une utilisation avec composite [touches](external_dicts_dict_structure.md). Semblable à `hashed`. + +Exemple de Configuration: + +``` xml + + + +``` + +``` sql +LAYOUT(COMPLEX_KEY_HASHED()) +``` + +### range\_hashed {#range-hashed} + +Le dictionnaire est stocké en mémoire sous la forme d'une table de hachage avec un tableau ordonné de gammes et leurs valeurs correspondantes. + +Cette méthode de stockage fonctionne de la même manière que hachée et permet d'utiliser des plages de date / heure (Type numérique arbitraire) en plus de la clé. + +Exemple: Le tableau contient des réductions pour chaque annonceur dans le format: + +``` text ++---------------|---------------------|-------------------|--------+ +| advertiser id | discount start date | discount end date | amount | ++===============+=====================+===================+========+ +| 123 | 2015-01-01 | 2015-01-15 | 0.15 | ++---------------|---------------------|-------------------|--------+ +| 123 | 2015-01-16 | 2015-01-31 | 0.25 | ++---------------|---------------------|-------------------|--------+ +| 456 | 2015-01-01 | 2015-01-15 | 0.05 | ++---------------|---------------------|-------------------|--------+ +``` + +Pour utiliser un échantillon pour les plages de dates, définissez `range_min` et `range_max` éléments dans le [structure](external_dicts_dict_structure.md). Ces éléments doivent contenir des éléments `name` et`type` (si `type` n'est pas spécifié, le type par défaut sera utilisé-Date). `type` peut être n'importe quel type numérique (Date / DateTime / UInt64 / Int32 / autres). + +Exemple: + +``` xml + + + Id + + + first + Date + + + last + Date + + ... +``` + +ou + +``` sql +CREATE DICTIONARY somedict ( + id UInt64, + first Date, + last Date +) +PRIMARY KEY id +LAYOUT(RANGE_HASHED()) +RANGE(MIN first MAX last) +``` + +Pour travailler avec ces dictionnaires, vous devez passer un argument supplémentaire à l' `dictGetT` fonction, pour laquelle une plage est sélectionnée: + +``` sql +dictGetT('dict_name', 'attr_name', id, date) +``` + +Cette fonction retourne la valeur pour l' `id`s et la plage de dates qui inclut la date passée. + +Détails de l'algorithme: + +- Si l' `id` est introuvable ou une plage n'est pas trouvé pour l' `id` il retourne la valeur par défaut pour le dictionnaire. +- S'il y a des plages qui se chevauchent, vous pouvez en utiliser. +- Si le délimiteur est `NULL` ou une date non valide (telle que 1900-01-01 ou 2039-01-01), la plage est laissée ouverte. La gamme peut être ouverte des deux côtés. + +Exemple de Configuration: + +``` xml + + + + ... + + + + + + + + Abcdef + + + StartTimeStamp + UInt64 + + + EndTimeStamp + UInt64 + + + XXXType + String + + + + + + +``` + +ou + +``` sql +CREATE DICTIONARY somedict( + Abcdef UInt64, + StartTimeStamp UInt64, + EndTimeStamp UInt64, + XXXType String DEFAULT '' +) +PRIMARY KEY Abcdef +RANGE(MIN StartTimeStamp MAX EndTimeStamp) +``` + +### cache {#cache} + +Le dictionnaire est stocké dans un cache qui a un nombre fixe de cellules. Ces cellules contiennent des éléments fréquemment utilisés. + +Lors de la recherche d'un dictionnaire, le cache est recherché en premier. Pour chaque bloc de données, toutes les clés qui ne sont pas trouvées dans le cache ou qui sont obsolètes sont demandées à la source en utilisant `SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...)`. Les données reçues sont ensuite écrites dans le cache. + +Pour les dictionnaires de cache, l'expiration [vie](external_dicts_dict_lifetime.md) des données dans le cache peuvent être définies. Si plus de temps que `lifetime` passé depuis le chargement des données dans une cellule, la valeur de la cellule n'est pas utilisée et elle est demandée à nouveau la prochaine fois qu'elle doit être utilisée. +C'est la moins efficace de toutes les façons de stocker les dictionnaires. La vitesse du cache dépend fortement des paramètres corrects et que le scénario d'utilisation. Un dictionnaire de type de cache fonctionne bien uniquement lorsque les taux de réussite sont suffisamment élevés (recommandé 99% et plus). Vous pouvez afficher le taux de réussite moyen dans le `system.dictionaries` table. + +Pour améliorer les performances du cache, utilisez une sous-requête avec `LIMIT`, et appelez la fonction avec le dictionnaire en externe. + +Soutenu [source](external_dicts_dict_sources.md): MySQL, ClickHouse, exécutable, HTTP. + +Exemple de paramètres: + +``` xml + + + + 1000000000 + + +``` + +ou + +``` sql +LAYOUT(CACHE(SIZE_IN_CELLS 1000000000)) +``` + +Définissez une taille de cache suffisamment grande. Vous devez expérimenter pour sélectionner le nombre de cellules: + +1. Définissez une valeur. +2. Exécutez les requêtes jusqu'à ce que le cache soit complètement plein. +3. Évaluer la consommation de mémoire en utilisant le `system.dictionaries` table. +4. Augmentez ou diminuez le nombre de cellules jusqu'à ce que la consommation de mémoire requise soit atteinte. + +!!! warning "Avertissement" + N'utilisez pas ClickHouse comme source, car le traitement des requêtes avec des lectures aléatoires est lent. + +### complex\_key\_cache {#complex-key-cache} + +Ce type de stockage est pour une utilisation avec composite [touches](external_dicts_dict_structure.md). Semblable à `cache`. + +### ip\_trie {#ip-trie} + +Ce type de stockage permet de mapper des préfixes de réseau (adresses IP) à des métadonnées telles que ASN. + +Exemple: la table contient les préfixes de réseau et leur correspondant en tant que numéro et Code de pays: + +``` text + +-----------------|-------|--------+ + | prefix | asn | cca2 | + +=================+=======+========+ + | 202.79.32.0/20 | 17501 | NP | + +-----------------|-------|--------+ + | 2620:0:870::/48 | 3856 | US | + +-----------------|-------|--------+ + | 2a02:6b8:1::/48 | 13238 | RU | + +-----------------|-------|--------+ + | 2001:db8::/32 | 65536 | ZZ | + +-----------------|-------|--------+ +``` + +Lorsque vous utilisez ce type de mise en page, la structure doit avoir une clé composite. + +Exemple: + +``` xml + + + + prefix + String + + + + asn + UInt32 + + + + cca2 + String + ?? + + ... +``` + +ou + +``` sql +CREATE DICTIONARY somedict ( + prefix String, + asn UInt32, + cca2 String DEFAULT '??' +) +PRIMARY KEY prefix +``` + +La clé ne doit avoir qu'un seul attribut de type chaîne contenant un préfixe IP autorisé. Les autres types ne sont pas encore pris en charge. + +Pour les requêtes, vous devez utiliser les mêmes fonctions (`dictGetT` avec un n-uplet) comme pour les dictionnaires avec des clés composites: + +``` sql +dictGetT('dict_name', 'attr_name', tuple(ip)) +``` + +La fonction prend soit `UInt32` pour IPv4, ou `FixedString(16)` pour IPv6: + +``` sql +dictGetString('prefix', 'asn', tuple(IPv6StringToNum('2001:db8::1'))) +``` + +Les autres types ne sont pas encore pris en charge. La fonction renvoie l'attribut du préfixe correspondant à cette adresse IP. S'il y a chevauchement des préfixes, le plus spécifique est retourné. + +Les données sont stockées dans une `trie`. Il doit complètement s'intégrer dans la RAM. + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/external_dicts_dict_layout/) diff --git a/docs/fr/query_language/dicts/external_dicts_dict_lifetime.md b/docs/fr/query_language/dicts/external_dicts_dict_lifetime.md new file mode 100644 index 00000000000..ee4d1717a26 --- /dev/null +++ b/docs/fr/query_language/dicts/external_dicts_dict_lifetime.md @@ -0,0 +1,83 @@ +--- +machine_translated: true +--- + +# Mises À Jour Du Dictionnaire {#dictionary-updates} + +ClickHouse met périodiquement à jour les dictionnaires. L'intervalle de mise à jour pour les dictionnaires entièrement téléchargés et l'intervalle d'invalidation pour les dictionnaires `` tag en quelques secondes. + +Les mises à jour du dictionnaire (autres que le chargement pour la première utilisation) ne bloquent pas les requêtes. Lors des mises à jour, l'ancienne version d'un dictionnaire est utilisée. Si une erreur se produit pendant une mise à jour, l'erreur est écrite dans le journal du serveur et les requêtes continuent d'utiliser l'ancienne version des dictionnaires. + +Exemple de paramètres: + +``` xml + + ... + 300 + ... + +``` + +``` sql +CREATE DICTIONARY (...) +... +LIFETIME(300) +... +``` + +Paramètre `0` (`LIFETIME(0)`) empêche la mise à jour des dictionnaires. + +Vous pouvez définir un intervalle de temps pour les mises à niveau, et ClickHouse choisira un temps uniformément aléatoire dans cette plage. Ceci est nécessaire pour répartir la charge sur la source du dictionnaire lors de la mise à niveau sur un grand nombre de serveurs. + +Exemple de paramètres: + +``` xml + + ... + + 300 + 360 + + ... + +``` + +ou + +``` sql +LIFETIME(MIN 300 MAX 360) +``` + +Lors de la mise à niveau des dictionnaires, le serveur ClickHouse applique une logique différente selon le type de [source](external_dicts_dict_sources.md): + +- Pour un fichier texte, il vérifie l'heure de la modification. Si l'heure diffère de l'heure enregistrée précédemment, le dictionnaire est mis à jour. +- Pour les tables MyISAM, l'Heure de modification est vérifiée à l'aide d'un `SHOW TABLE STATUS` requête. +- Les dictionnaires d'autres sources sont mis à jour à chaque fois par défaut. + +Pour les sources MySQL (InnoDB), ODBC et ClickHouse, vous pouvez configurer une requête qui mettra à jour les dictionnaires uniquement s'ils ont vraiment changé, plutôt que chaque fois. Pour ce faire, suivez ces étapes: + +- La table de dictionnaire doit avoir un champ qui change toujours lorsque les données source sont mises à jour. +- Les paramètres de la source doivent spécifier une requête qui récupère le champ de modification. Le serveur ClickHouse interprète le résultat de la requête comme une ligne, et si cette ligne a changé par rapport à son état précédent, le dictionnaire est mis à jour. Spécifier la requête dans le `` champ dans les paramètres pour le [source](external_dicts_dict_sources.md). + +Exemple de paramètres: + +``` xml + + ... + + ... + SELECT update_time FROM dictionary_source where id = 1 + + ... + +``` + +ou + +``` sql +... +SOURCE(ODBC(... invalidate_query 'SELECT update_time FROM dictionary_source where id = 1')) +... +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/external_dicts_dict_lifetime/) diff --git a/docs/fr/query_language/dicts/external_dicts_dict_sources.md b/docs/fr/query_language/dicts/external_dicts_dict_sources.md new file mode 100644 index 00000000000..2c25aed19f2 --- /dev/null +++ b/docs/fr/query_language/dicts/external_dicts_dict_sources.md @@ -0,0 +1,605 @@ +--- +machine_translated: true +--- + +# Sources de dictionnaires externes {#dicts-external-dicts-dict-sources} + +Externe dictionnaire peut être connecté à partir de nombreuses sources différentes. + +Si dictionary est configuré à l'aide de xml-file, la configuration ressemble à ceci: + +``` xml + + + ... + + + + + + ... + + ... + +``` + +En cas de [DDL-requête](../create.md#create-dictionary-query), configuration égale ressemblera à: + +``` sql +CREATE DICTIONARY dict_name (...) +... +SOURCE(SOURCE_TYPE(param1 val1 ... paramN valN)) -- Source configuration +... +``` + +La source est configurée dans le `source` section. + +Les Types de sources (`source_type`): + +- [Fichier Local](#dicts-external_dicts_dict_sources-local_file) +- [Fichier exécutable](#dicts-external_dicts_dict_sources-executable) +- [HTTP(S)](#dicts-external_dicts_dict_sources-http) +- DBMS + - [ODBC](#dicts-external_dicts_dict_sources-odbc) + - [MySQL](#dicts-external_dicts_dict_sources-mysql) + - [ClickHouse](#dicts-external_dicts_dict_sources-clickhouse) + - [MongoDB](#dicts-external_dicts_dict_sources-mongodb) + - [Redis](#dicts-external_dicts_dict_sources-redis) + +## Fichier Local {#dicts-external_dicts_dict_sources-local_file} + +Exemple de paramètres: + +``` xml + + + /opt/dictionaries/os.tsv + TabSeparated + + +``` + +ou + +``` sql +SOURCE(FILE(path '/opt/dictionaries/os.tsv' format 'TabSeparated')) +``` + +Définition des champs: + +- `path` – The absolute path to the file. +- `format` – The file format. All the formats described in “[Format](../../interfaces/formats.md#formats)” sont pris en charge. + +## Fichier Exécutable {#dicts-external_dicts_dict_sources-executable} + +Travailler avec des fichiers exécutables en dépend [comment le dictionnaire est stocké dans la mémoire](external_dicts_dict_layout.md). Si le dictionnaire est stocké en utilisant `cache` et `complex_key_cache`, Clickhouse demande les clés nécessaires en envoyant une requête au STDIN du fichier exécutable. Sinon, ClickHouse démarre le fichier exécutable et traite sa sortie comme des données de dictionnaire. + +Exemple de paramètres: + +``` xml + + + cat /opt/dictionaries/os.tsv + TabSeparated + + +``` + +ou + +``` sql +SOURCE(EXECUTABLE(command 'cat /opt/dictionaries/os.tsv' format 'TabSeparated')) +``` + +Définition des champs: + +- `command` – The absolute path to the executable file, or the file name (if the program directory is written to `PATH`). +- `format` – The file format. All the formats described in “[Format](../../interfaces/formats.md#formats)” sont pris en charge. + +## HTTP(S) {#dicts-external_dicts_dict_sources-http} + +Travailler avec un serveur HTTP (S) dépend de [comment le dictionnaire est stocké dans la mémoire](external_dicts_dict_layout.md). Si le dictionnaire est stocké en utilisant `cache` et `complex_key_cache`, Clickhouse demande les clés nécessaires en envoyant une demande via le `POST` méthode. + +Exemple de paramètres: + +``` xml + + + http://[::1]/os.tsv + TabSeparated + + user + password + + +
+ API-KEY + key +
+
+
+ +``` + +ou + +``` sql +SOURCE(HTTP( + url 'http://[::1]/os.tsv' + format 'TabSeparated' + credentials(user 'user' password 'password') + headers(header(name 'API-KEY' value 'key')) +)) +``` + +Pour que ClickHouse accède à une ressource HTTPS, vous devez [configurer openSSL](../../operations/server_settings/settings.md#server_settings-openssl) dans la configuration du serveur. + +Définition des champs: + +- `url` – The source URL. +- `format` – The file format. All the formats described in “[Format](../../interfaces/formats.md#formats)” sont pris en charge. +- `credentials` – Basic HTTP authentication. Optional parameter. + - `user` – Username required for the authentication. + - `password` – Password required for the authentication. +- `headers` – All custom HTTP headers entries used for the HTTP request. Optional parameter. + - `header` – Single HTTP header entry. + - `name` – Identifiant name used for the header send on the request. + - `value` – Value set for a specific identifiant name. + +## ODBC {#dicts-external_dicts_dict_sources-odbc} + +Vous pouvez utiliser cette méthode pour connecter n'importe quelle base de données dotée d'un pilote ODBC. + +Exemple de paramètres: + +``` xml + + + DatabaseName + ShemaName.TableName
+ DSN=some_parameters + SQL_QUERY +
+ +``` + +ou + +``` sql +SOURCE(ODBC( + db 'DatabaseName' + table 'SchemaName.TableName' + connection_string 'DSN=some_parameters' + invalidate_query 'SQL_QUERY' +)) +``` + +Définition des champs: + +- `db` – Name of the database. Omit it if the database name is set in the `` paramètre. +- `table` – Name of the table and schema if exists. +- `connection_string` – Connection string. +- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Mise à jour des dictionnaires](external_dicts_dict_lifetime.md). + +ClickHouse reçoit des symboles de citation D'ODBC-driver et cite tous les paramètres des requêtes au pilote, il est donc nécessaire de définir le nom de la table en conséquence sur le cas du nom de la table dans la base de données. + +Si vous avez des problèmes avec des encodages lors de l'utilisation d'Oracle, consultez le [FAQ](../../faq/general.md#oracle-odbc-encodings) article. + +### Vulnérabilité connue de la fonctionnalité du dictionnaire ODBC {#known-vulnerability-of-the-odbc-dictionary-functionality} + +!!! attention "Attention" + Lors de la connexion à la base de données via le paramètre de connexion du pilote ODBC `Servername` peut être substitué. Dans ce cas, les valeurs de `USERNAME` et `PASSWORD` de `odbc.ini` sont envoyés au serveur distant et peuvent être compromis. + +**Exemple d'utilisation non sécurisée** + +Configurons unixODBC pour PostgreSQL. Le contenu de `/etc/odbc.ini`: + +``` text +[gregtest] +Driver = /usr/lib/psqlodbca.so +Servername = localhost +PORT = 5432 +DATABASE = test_db +#OPTION = 3 +USERNAME = test +PASSWORD = test +``` + +Si vous faites alors une requête telle que + +``` sql +SELECT * FROM odbc('DSN=gregtest;Servername=some-server.com', 'test_db'); +``` + +Le pilote ODBC enverra des valeurs de `USERNAME` et `PASSWORD` de `odbc.ini` de `some-server.com`. + +### Exemple de connexion PostgreSQL {#example-of-connecting-postgresql} + +Ubuntu OS. + +Installation d'unixODBC et du pilote ODBC pour PostgreSQL: + +``` bash +$ sudo apt-get install -y unixodbc odbcinst odbc-postgresql +``` + +Configuration `/etc/odbc.ini` (ou `~/.odbc.ini`): + +``` text + [DEFAULT] + Driver = myconnection + + [myconnection] + Description = PostgreSQL connection to my_db + Driver = PostgreSQL Unicode + Database = my_db + Servername = 127.0.0.1 + UserName = username + Password = password + Port = 5432 + Protocol = 9.3 + ReadOnly = No + RowVersioning = No + ShowSystemTables = No + ConnSettings = +``` + +La configuration du dictionnaire dans ClickHouse: + +``` xml + + + table_name + + + + + DSN=myconnection + postgresql_table
+
+ + + 300 + 360 + + + + + + + id + + + some_column + UInt64 + 0 + + +
+
+``` + +ou + +``` sql +CREATE DICTIONARY table_name ( + id UInt64, + some_column UInt64 DEFAULT 0 +) +PRIMARY KEY id +SOURCE(ODBC(connection_string 'DSN=myconnection' table 'postgresql_table')) +LAYOUT(HASHED()) +LIFETIME(MIN 300 MAX 360) +``` + +Vous devrez peut-être modifier `odbc.ini` pour spécifier le chemin d'accès complet à la bibliothèque avec le conducteur `DRIVER=/usr/local/lib/psqlodbcw.so`. + +### Exemple de connexion à MS SQL Server {#example-of-connecting-ms-sql-server} + +Ubuntu OS. + +Installation du pilote: : + +``` bash +$ sudo apt-get install tdsodbc freetds-bin sqsh +``` + +Configuration du pilote: + +``` bash + $ cat /etc/freetds/freetds.conf + ... + + [MSSQL] + host = 192.168.56.101 + port = 1433 + tds version = 7.0 + client charset = UTF-8 + + $ cat /etc/odbcinst.ini + ... + + [FreeTDS] + Description = FreeTDS + Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so + Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so + FileUsage = 1 + UsageCount = 5 + + $ cat ~/.odbc.ini + ... + + [MSSQL] + Description = FreeTDS + Driver = FreeTDS + Servername = MSSQL + Database = test + UID = test + PWD = test + Port = 1433 +``` + +Configuration du dictionnaire dans ClickHouse: + +``` xml + + + test + + + dict
+ DSN=MSSQL;UID=test;PWD=test +
+ + + + 300 + 360 + + + + + + + + + k + + + s + String + + + +
+
+``` + +ou + +``` sql +CREATE DICTIONARY test ( + k UInt64, + s String DEFAULT '' +) +PRIMARY KEY k +SOURCE(ODBC(table 'dict' connection_string 'DSN=MSSQL;UID=test;PWD=test')) +LAYOUT(FLAT()) +LIFETIME(MIN 300 MAX 360) +``` + +## DBMS {#dbms} + +### MySQL {#dicts-external_dicts_dict_sources-mysql} + +Exemple de paramètres: + +``` xml + + + 3306 + clickhouse + qwerty + + example01-1 + 1 + + + example01-2 + 1 + + db_name + table_name
+ id=10 + SQL_QUERY +
+ +``` + +ou + +``` sql +SOURCE(MYSQL( + port 3306 + user 'clickhouse' + password 'qwerty' + replica(host 'example01-1' priority 1) + replica(host 'example01-2' priority 1) + db 'db_name' + table 'table_name' + where 'id=10' + invalidate_query 'SQL_QUERY' +)) +``` + +Définition des champs: + +- `port` – The port on the MySQL server. You can specify it for all replicas, or for each one individually (inside ``). + +- `user` – Name of the MySQL user. You can specify it for all replicas, or for each one individually (inside ``). + +- `password` – Password of the MySQL user. You can specify it for all replicas, or for each one individually (inside ``). + +- `replica` – Section of replica configurations. There can be multiple sections. + + - `replica/host` – The MySQL host. + - `replica/priority` – The replica priority. When attempting to connect, ClickHouse traverses the replicas in order of priority. The lower the number, the higher the priority. + +- `db` – Name of the database. + +- `table` – Name of the table. + +- `where` – The selection criteria. The syntax for conditions is the same as for `WHERE` clause dans MySQL, par exemple, `id > 10 AND id < 20`. Paramètre facultatif. + +- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Mise à jour des dictionnaires](external_dicts_dict_lifetime.md). + +MySQL peut être connecté sur un hôte local via des sockets. Pour ce faire, définissez `host` et `socket`. + +Exemple de paramètres: + +``` xml + + + localhost + /path/to/socket/file.sock + clickhouse + qwerty + db_name + table_name
+ id=10 + SQL_QUERY +
+ +``` + +ou + +``` sql +SOURCE(MYSQL( + host 'localhost' + socket '/path/to/socket/file.sock' + user 'clickhouse' + password 'qwerty' + db 'db_name' + table 'table_name' + where 'id=10' + invalidate_query 'SQL_QUERY' +)) +``` + +### ClickHouse {#dicts-external_dicts_dict_sources-clickhouse} + +Exemple de paramètres: + +``` xml + + + example01-01-1 + 9000 + default + + default + ids
+ id=10 +
+ +``` + +ou + +``` sql +SOURCE(CLICKHOUSE( + host 'example01-01-1' + port 9000 + user 'default' + password '' + db 'default' + table 'ids' + where 'id=10' +)) +``` + +Définition des champs: + +- `host` – The ClickHouse host. If it is a local host, the query is processed without any network activity. To improve fault tolerance, you can create a [Distribué](../../operations/table_engines/distributed.md) table et entrez-le dans les configurations suivantes. +- `port` – The port on the ClickHouse server. +- `user` – Name of the ClickHouse user. +- `password` – Password of the ClickHouse user. +- `db` – Name of the database. +- `table` – Name of the table. +- `where` – The selection criteria. May be omitted. +- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Mise à jour des dictionnaires](external_dicts_dict_lifetime.md). + +### MongoDB {#dicts-external_dicts_dict_sources-mongodb} + +Exemple de paramètres: + +``` xml + + + localhost + 27017 + + + test + dictionary_source + + +``` + +ou + +``` sql +SOURCE(MONGO( + host 'localhost' + port 27017 + user '' + password '' + db 'test' + collection 'dictionary_source' +)) +``` + +Définition des champs: + +- `host` – The MongoDB host. +- `port` – The port on the MongoDB server. +- `user` – Name of the MongoDB user. +- `password` – Password of the MongoDB user. +- `db` – Name of the database. +- `collection` – Name of the collection. + +### Redis {#dicts-external_dicts_dict_sources-redis} + +Exemple de paramètres: + +``` xml + + + localhost + 6379 + simple + 0 + + +``` + +ou + +``` sql +SOURCE(REDIS( + host 'localhost' + port 6379 + storage_type 'simple' + db_index 0 +)) +``` + +Définition des champs: + +- `host` – The Redis host. +- `port` – The port on the Redis server. +- `storage_type` – The structure of internal Redis storage using for work with keys. `simple` est pour les sources simples et pour les sources à clé unique hachées, `hash_map` est pour les sources hachées avec deux clés. Les sources À Distance et les sources de cache à clé complexe ne sont pas prises en charge. Peut être omis, la valeur par défaut est `simple`. +- `db_index` – The specific numeric index of Redis logical database. May be omitted, default value is 0. + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/external_dicts_dict_sources/) diff --git a/docs/fr/query_language/dicts/external_dicts_dict_structure.md b/docs/fr/query_language/dicts/external_dicts_dict_structure.md new file mode 100644 index 00000000000..bca7b07f7d9 --- /dev/null +++ b/docs/fr/query_language/dicts/external_dicts_dict_structure.md @@ -0,0 +1,172 @@ +--- +machine_translated: true +--- + +# Clé et champs du dictionnaire {#dictionary-key-and-fields} + +Le `` la clause décrit la clé du dictionnaire et les champs disponibles pour les requêtes. + +Description XML: + +``` xml + + + + Id + + + + + + + ... + + + +``` + +Les attributs sont décrits dans les éléments: + +- `` — [La colonne de la clé](external_dicts_dict_structure.md#ext_dict_structure-key). +- `` — [Colonne de données](external_dicts_dict_structure.md#ext_dict_structure-attributes). Il peut y avoir un certain nombre d'attributs. + +Requête DDL: + +``` sql +CREATE DICTIONARY dict_name ( + Id UInt64, + -- attributes +) +PRIMARY KEY Id +... +``` + +Les attributs sont décrits dans le corps de la requête: + +- `PRIMARY KEY` — [La colonne de la clé](external_dicts_dict_structure.md#ext_dict_structure-key) +- `AttrName AttrType` — [Colonne de données](external_dicts_dict_structure.md#ext_dict_structure-attributes). Il peut y avoir un certain nombre d'attributs. + +## Clé {#ext_dict_structure-key} + +ClickHouse prend en charge les types de clés suivants: + +- Touche numérique. `UInt64`. Défini dans le `` tag ou en utilisant `PRIMARY KEY` mot. +- Clé Composite. Ensemble de valeurs de types différents. Défini dans la balise `` ou `PRIMARY KEY` mot. + +Une structure xml peut contenir `` ou ``. DDL-requête doit contenir unique `PRIMARY KEY`. + +!!! warning "Avertissement" + Vous ne devez pas décrire clé comme un attribut. + +### Touche Numérique {#ext_dict-numeric-key} + +Type: `UInt64`. + +Exemple de Configuration: + +``` xml + + Id + +``` + +Champs de Configuration: + +- `name` – The name of the column with keys. + +Pour DDL-requête: + +``` sql +CREATE DICTIONARY ( + Id UInt64, + ... +) +PRIMARY KEY Id +... +``` + +- `PRIMARY KEY` – The name of the column with keys. + +### Clé Composite {#composite-key} + +La clé peut être un `tuple` de tous les types de champs. Le [disposition](external_dicts_dict_layout.md) dans ce cas, doit être `complex_key_hashed` ou `complex_key_cache`. + +!!! tip "Conseil" + Une clé composite peut être constitué d'un seul élément. Cela permet d'utiliser une chaîne comme clé, par exemple. + +La structure de clé est définie dans l'élément ``. Les principaux champs sont spécifiés dans le même format que le dictionnaire [attribut](external_dicts_dict_structure.md). Exemple: + +``` xml + + + + field1 + String + + + field2 + UInt32 + + ... + +... +``` + +ou + +``` sql +CREATE DICTIONARY ( + field1 String, + field2 String + ... +) +PRIMARY KEY field1, field2 +... +``` + +Pour une requête à l' `dictGet*` fonction, un tuple est passé comme clé. Exemple: `dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2))`. + +## Attribut {#ext_dict_structure-attributes} + +Exemple de Configuration: + +``` xml + + ... + + Name + ClickHouseDataType + + rand64() + true + true + true + + +``` + +ou + +``` sql +CREATE DICTIONARY somename ( + Name ClickHouseDataType DEFAULT '' EXPRESSION rand64() HIERARCHICAL INJECTIVE IS_OBJECT_ID +) +``` + +Champs de Configuration: + +| Balise | Description | Requis | +|------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------| +| `name` | Nom de la colonne. | Oui | +| `type` | Type de données ClickHouse.
ClickHouse tente de convertir la valeur du dictionnaire vers le type de données spécifié. Par exemple, pour MySQL, le champ peut être `TEXT`, `VARCHAR`, ou `BLOB` dans la table source MySQL, mais il peut être téléchargé comme `String` à ClickHouse.
[Nullable](../../data_types/nullable.md) n'est pas pris en charge. | Oui | +| `null_value` | Valeur par défaut pour un élément inexistant.
Dans l'exemple, c'est une chaîne vide. Vous ne pouvez pas utiliser `NULL` dans ce domaine. | Oui | +| `expression` | [Expression](../syntax.md#syntax-expressions) que ClickHouse s'exécute sur la valeur.
L'expression peut être un nom de colonne dans la base de données SQL distante. Ainsi, vous pouvez l'utiliser pour créer un alias pour la colonne à distance.

Valeur par défaut: aucune expression. | Aucun | +| `hierarchical` | Si `true`, l'attribut contient la valeur d'un parent clé de la clé actuelle. Voir [Dictionnaires Hiérarchiques](external_dicts_dict_hierarchical.md).

Valeur par défaut: `false`. | Aucun | +| `injective` | Indicateur qui indique si le `id -> attribute` l'image est [injective](https://en.wikipedia.org/wiki/Injective_function).
Si `true`, ClickHouse peut automatiquement placer après le `GROUP BY` clause les requêtes aux dictionnaires avec injection. Habituellement, il réduit considérablement le montant de ces demandes.

Valeur par défaut: `false`. | Aucun | +| `is_object_id` | Indicateur qui indique si la requête est exécutée pour un document MongoDB par `ObjectID`.

Valeur par défaut: `false`. | Aucun | + +## Voir Aussi {#see-also} + +- [Fonctions pour travailler avec des dictionnaires externes](../functions/ext_dict_functions.md). + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/external_dicts_dict_structure/) diff --git a/docs/fr/query_language/dicts/index.md b/docs/fr/query_language/dicts/index.md new file mode 100644 index 00000000000..dc48bf5d4e6 --- /dev/null +++ b/docs/fr/query_language/dicts/index.md @@ -0,0 +1,18 @@ +--- +machine_translated: true +--- + +# Dictionnaire {#dictionaries} + +Un dictionnaire est une cartographie (`key -> attributes`) qui est pratique pour différents types de listes de référence. + +ClickHouse prend en charge des fonctions spéciales pour travailler avec des dictionnaires qui peuvent être utilisés dans les requêtes. Il est plus facile et plus efficace d'utiliser des dictionnaires avec des fonctions que par une `JOIN` avec des tableaux de référence. + +[NULL](../syntax.md#null) les valeurs ne peuvent pas être stockées dans un dictionnaire. + +Supports ClickHouse: + +- [Construit-dans les dictionnaires](internal_dicts.md#internal_dicts) avec un [ensemble de fonctions](../functions/ym_dict_functions.md). +- [Plug-in (externe) dictionnaires](external_dicts.md) avec un [ensemble de fonctions](../functions/ext_dict_functions.md). + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/) diff --git a/docs/fr/query_language/dicts/internal_dicts.md b/docs/fr/query_language/dicts/internal_dicts.md new file mode 100644 index 00000000000..a678254a39a --- /dev/null +++ b/docs/fr/query_language/dicts/internal_dicts.md @@ -0,0 +1,52 @@ +--- +machine_translated: true +--- + +# Dictionnaires internes {#internal_dicts} + +ClickHouse contient une fonction intégrée pour travailler avec une géobase. + +Cela vous permet de: + +- Utilisez L'ID d'une région pour obtenir son nom dans la langue souhaitée. +- Utilisez L'ID d'une région pour obtenir L'ID d'une ville, d'une région, d'un district fédéral, d'un pays ou d'un continent. +- Vérifiez si une région fait partie d'une autre région. +- Obtenez une chaîne de régions parentes. + +Toutes les fonctions prennent en charge “translocality,” la capacité d'utiliser simultanément différentes perspectives sur la propriété de la région. Pour plus d'informations, consultez la section “Functions for working with Yandex.Metrica dictionaries”. + +Les dictionnaires internes sont désactivés dans le package par défaut. +Pour les activer, décommentez les paramètres `path_to_regions_hierarchy_file` et `path_to_regions_names_files` dans le fichier de configuration du serveur. + +La géobase est chargée à partir de fichiers texte. + +Place de la `regions_hierarchy*.txt` les fichiers dans le `path_to_regions_hierarchy_file` répertoire. Ce paramètre de configuration doit contenir le chemin `regions_hierarchy.txt` fichier (la hiérarchie régionale par défaut), et les autres fichiers (`regions_hierarchy_ua.txt`) doit être situé dans le même répertoire. + +Mettre le `regions_names_*.txt` les fichiers dans le `path_to_regions_names_files` répertoire. + +Vous pouvez également créer ces fichiers vous-même. Le format de fichier est le suivant: + +`regions_hierarchy*.txt`: TabSeparated (pas d'en-tête), colonnes: + +- région de l'ID (`UInt32`) +- ID de région parent (`UInt32`) +- type de région (`UInt8`): 1-continent, 3-pays, 4-district fédéral, 5-région, 6-ville; les autres types n'ont pas de valeurs +- population (`UInt32`) — optional column + +`regions_names_*.txt`: TabSeparated (pas d'en-tête), colonnes: + +- région de l'ID (`UInt32`) +- nom de la région (`String`) — Can't contain tabs or line feeds, even escaped ones. + +Un tableau plat est utilisé pour stocker dans la RAM. Pour cette raison, les ID ne devraient pas dépasser un million. + +Les dictionnaires peuvent être mis à jour sans redémarrer le serveur. Cependant, l'ensemble des dictionnaires n'est pas mis à jour. +Pour les mises à jour, les temps de modification du fichier sont vérifiés. Si un fichier a été modifié, le dictionnaire est mis à jour. +L'intervalle de vérification des modifications est configuré dans le `builtin_dictionaries_reload_interval` paramètre. +Les mises à jour du dictionnaire (autres que le chargement lors de la première utilisation) ne bloquent pas les requêtes. Lors des mises à jour, les requêtes utilisent les anciennes versions des dictionnaires. Si une erreur se produit pendant une mise à jour, l'erreur est écrite dans le journal du serveur et les requêtes continuent d'utiliser l'ancienne version des dictionnaires. + +Nous vous recommandons de mettre à jour périodiquement les dictionnaires avec la géobase. Lors d'une mise à jour, générez de nouveaux fichiers et écrivez-les dans un emplacement séparé. Lorsque tout est prêt, renommez - les en fichiers utilisés par le serveur. + +Il existe également des fonctions pour travailler avec les identifiants du système d'exploitation et Yandex.Moteurs de recherche Metrica, mais ils ne devraient pas être utilisés. + +[Article Original](https://clickhouse.tech/docs/en/query_language/dicts/internal_dicts/) diff --git a/docs/fr/query_language/functions/arithmetic_functions.md b/docs/fr/query_language/functions/arithmetic_functions.md new file mode 100644 index 00000000000..3cb55bc1103 --- /dev/null +++ b/docs/fr/query_language/functions/arithmetic_functions.md @@ -0,0 +1,84 @@ +--- +machine_translated: true +--- + +# Fonctions arithmétiques {#arithmetic-functions} + +Pour toutes les fonctions arithmétiques, le type de résultat est calculé comme le plus petit type de nombre dans lequel le résultat correspond, s'il existe un tel type. Le minimum est pris simultanément sur la base du nombre de bits, s'il est signé, et s'il flotte. S'il n'y a pas assez de bits, le type de bits le plus élevé est pris. + +Exemple: + +``` sql +SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0) +``` + +``` text +┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐ +│ UInt8 │ UInt16 │ UInt32 │ UInt64 │ +└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘ +``` + +Les fonctions arithmétiques fonctionnent pour n'importe quelle paire de types de UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32 ou Float64. + +Le débordement est produit de la même manière qu'en C++. + +## plus (A, B), opérateur a + b {#plusa-b-a-b-operator} + +Calcule la somme des nombres. +Vous pouvez également ajouter des nombres entiers avec une date ou la date et l'heure. Dans le cas d'une date, Ajouter un entier signifie ajouter le nombre de jours correspondant. Pour une date avec l'heure, cela signifie ajouter le nombre de secondes correspondant. + +## moins (A, B), opérateur a - b {#minusa-b-a-b-operator} + +Calcule la différence. Le résultat est toujours signé. + +You can also calculate integer numbers from a date or date with time. The idea is the same – see above for ‘plus’. + +## la multiplication(a, b), a \* et b \* de l'opérateur {#multiplya-b-a-b-operator} + +Calcule le produit des nombres. + +## diviser (A, B), opérateur a / b {#dividea-b-a-b-operator} + +Calcule le quotient des nombres. Le type de résultat est toujours un type à virgule flottante. +Il n'est pas de division entière. Pour la division entière, utilisez le ‘intDiv’ fonction. +En divisant par zéro vous obtenez ‘inf’, ‘-inf’, ou ‘nan’. + +## intDiv (a, b) {#intdiva-b} + +Calcule le quotient des nombres. Divise en entiers, arrondi vers le bas (par la valeur absolue). +Une exception est levée en divisant par zéro ou en divisant un nombre négatif minimal par moins un. + +## intDivOrZero(a, b) {#intdivorzeroa-b} + +Diffère de ‘intDiv’ en ce sens qu'il renvoie zéro en divisant par zéro ou en divisant un nombre négatif minimal par moins un. + +## opérateur modulo(A, B), A % B {#moduloa-b-a-b-operator} + +Calcule le reste après la division. +Si les arguments sont des nombres à virgule flottante, ils sont pré-convertis en entiers en supprimant la partie décimale. +Le reste est pris dans le même sens qu'en C++. La division tronquée est utilisée pour les nombres négatifs. +Une exception est levée en divisant par zéro ou en divisant un nombre négatif minimal par moins un. + +## moduloOrZero (a, b) {#moduloorzeroa-b} + +Diffère de ‘modulo’ en ce sens qu'il renvoie zéro lorsque le diviseur est nul. + +## annuler (a), - un opérateur {#negatea-a-operator} + +Calcule un nombre avec le signe inverse. Le résultat est toujours signé. + +## abs(un) {#arithm_func-abs} + +Calcule la valeur absolue d'un nombre (un). Autrement dit, si un \< 0, Il renvoie-A. pour les types non signés, il ne fait rien. Pour les types entiers signés, il renvoie un nombre non signé. + +## pgcd(a, b) {#gcda-b} + +Renvoie le plus grand diviseur commun des nombres. +Une exception est levée en divisant par zéro ou en divisant un nombre négatif minimal par moins un. + +## ppcm(a, b) {#lcma-b} + +Renvoie le multiple le moins commun des nombres. +Une exception est levée en divisant par zéro ou en divisant un nombre négatif minimal par moins un. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/arithmetic_functions/) diff --git a/docs/fr/query_language/functions/array_functions.md b/docs/fr/query_language/functions/array_functions.md new file mode 100644 index 00000000000..81951e5ee62 --- /dev/null +++ b/docs/fr/query_language/functions/array_functions.md @@ -0,0 +1,1010 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des tableaux {#functions-for-working-with-arrays} + +## vide {#function-empty} + +Retourne 1 pour un tableau vide, ou 0 pour un non-vide. +Le type de résultat est UInt8. +La fonction fonctionne également pour les chaînes. + +## notEmpty {#function-notempty} + +Retourne 0 pour un tableau vide, ou 1 pour un non-vide. +Le type de résultat est UInt8. +La fonction fonctionne également pour les chaînes. + +## longueur {#array_functions-length} + +Retourne le nombre d'éléments dans le tableau. +Le type de résultat est UInt64. +La fonction fonctionne également pour les chaînes. + +## emptyArrayUInt8, emptyArrayUInt16, emptyArrayUInt32, emptyArrayUInt64 {#emptyarrayuint8-emptyarrayuint16-emptyarrayuint32-emptyarrayuint64} + +## emptyArrayInt8, emptyArrayInt16, emptyArrayInt32, emptyArrayInt64 {#emptyarrayint8-emptyarrayint16-emptyarrayint32-emptyarrayint64} + +## emptyArrayFloat32, emptyArrayFloat64 {#emptyarrayfloat32-emptyarrayfloat64} + +## emptyArrayDate, emptyArrayDateTime {#emptyarraydate-emptyarraydatetime} + +## emptyArrayString {#emptyarraystring} + +Accepte zéro argument et renvoie un tableau vide du type approprié. + +## emptyArrayToSingle {#emptyarraytosingle} + +Accepte un tableau vide et renvoie un élément de tableau qui est égal à la valeur par défaut. + +## plage (fin), Plage(début, fin \[, étape\]) {#rangeend-rangestart-end-step} + +Retourne un tableau de nombres du début à la fin-1 par étape. +Si l'argument `start` n'est pas spécifié, la valeur par défaut est 0. +Si l'argument `step` n'est pas spécifié, la valeur par défaut est 1. +Il se comporte presque comme pythonic `range`. Mais la différence est que tous les types d'arguments doivent être `UInt` nombre. +Juste au cas où, une exception est levée si des tableaux d'une longueur totale de plus de 100 000 000 d'éléments sont créés dans un bloc de données. + +## array(x1, …), operator \[x1, …\] {#arrayx1-operator-x1} + +Crée un tableau à partir des arguments de la fonction. +Les arguments doivent être des constantes et avoir des types qui ont le plus petit type commun. Au moins un argument doit être passé, sinon il n'est pas clair quel type de tableau créer. Qui est, vous ne pouvez pas utiliser cette fonction pour créer un tableau vide (pour ce faire, utilisez la ‘emptyArray\*’ la fonction décrite ci-dessus). +Retourne un ‘Array(T)’ type de résultat, où ‘T’ est le plus petit type commun parmi les arguments passés. + +## arrayConcat {#arrayconcat} + +Combine des tableaux passés comme arguments. + +``` sql +arrayConcat(arrays) +``` + +**Paramètre** + +- `arrays` – Arbitrary number of arguments of [Tableau](../../data_types/array.md) type. + **Exemple** + + + +``` sql +SELECT arrayConcat([1, 2], [3, 4], [5, 6]) AS res +``` + +``` text +┌─res───────────┐ +│ [1,2,3,4,5,6] │ +└───────────────┘ +``` + +## arrayElement(arr, n), opérateur arr\[n\] {#arrayelementarr-n-operator-arrn} + +Récupérer l'élément avec l'index `n` à partir du tableau `arr`. `n` doit être n'importe quel type entier. +Les index dans un tableau commencent à partir d'un. +Les index négatifs sont pris en charge. Dans ce cas, il sélectionne l'élément correspondant numérotées à partir de la fin. Exemple, `arr[-1]` est le dernier élément du tableau. + +Si l'index est en dehors des limites d'un tableau, il renvoie une valeur (0 pour les nombres, une chaîne vide pour les cordes, etc.), sauf pour le cas avec un tableau non constant et un index constant 0 (dans ce cas, il y aura une erreur `Array indices are 1-based`). + +## a (arr, elem) {#hasarr-elem} + +Vérifie si le ‘arr’ tableau a la ‘elem’ élément. +Retourne 0 si l'élément n'est pas dans le tableau, ou 1 si elle l'est. + +`NULL` est traitée comme une valeur. + +``` sql +SELECT has([1, 2, NULL], NULL) +``` + +``` text +┌─has([1, 2, NULL], NULL)─┐ +│ 1 │ +└─────────────────────────┘ +``` + +## hasAll {#hasall} + +Vérifie si un tableau est un sous-ensemble de l'autre. + +``` sql +hasAll(set, subset) +``` + +**Paramètre** + +- `set` – Array of any type with a set of elements. +- `subset` – Array of any type with elements that should be tested to be a subset of `set`. + +**Les valeurs de retour** + +- `1`, si `set` contient tous les éléments de `subset`. +- `0`, autrement. + +**Propriétés particulières** + +- Un tableau vide est un sous-ensemble d'un tableau quelconque. +- `Null` traitée comme une valeur. +- Ordre des valeurs dans les deux tableaux n'a pas d'importance. + +**Exemple** + +`SELECT hasAll([], [])` retours 1. + +`SELECT hasAll([1, Null], [Null])` retours 1. + +`SELECT hasAll([1.0, 2, 3, 4], [1, 3])` retours 1. + +`SELECT hasAll(['a', 'b'], ['a'])` retours 1. + +`SELECT hasAll([1], ['a'])` renvoie 0. + +`SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [3, 5]])` renvoie 0. + +## hasAny {#hasany} + +Vérifie si deux tableaux ont une intersection par certains éléments. + +``` sql +hasAny(array1, array2) +``` + +**Paramètre** + +- `array1` – Array of any type with a set of elements. +- `array2` – Array of any type with a set of elements. + +**Les valeurs de retour** + +- `1`, si `array1` et `array2` avoir un élément similaire au moins. +- `0`, autrement. + +**Propriétés particulières** + +- `Null` traitée comme une valeur. +- Ordre des valeurs dans les deux tableaux n'a pas d'importance. + +**Exemple** + +`SELECT hasAny([1], [])` retourner `0`. + +`SELECT hasAny([Null], [Null, 1])` retourner `1`. + +`SELECT hasAny([-128, 1., 512], [1])` retourner `1`. + +`SELECT hasAny([[1, 2], [3, 4]], ['a', 'c'])` retourner `0`. + +`SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [1, 2]])` retourner `1`. + +## indexOf (arr, x) {#indexofarr-x} + +Renvoie l'index de la première ‘x’ élément (à partir de 1) s'il est dans le tableau, ou 0 s'il ne l'est pas. + +Exemple: + +``` sql +SELECT indexOf([1, 3, NULL, NULL], NULL) +``` + +``` text + +┌─indexOf([1, 3, NULL, NULL], NULL)─┐ +│ 3 │ +└───────────────────────────────────┘ +``` + +Ensemble d'éléments de `NULL` sont traités comme des valeurs normales. + +## countEqual (arr, x) {#countequalarr-x} + +Renvoie le nombre d'éléments dans le tableau égal à X. équivalent à arrayCount (elem - \> elem = x, arr). + +`NULL` les éléments sont traités comme des valeurs distinctes. + +Exemple: + +``` sql +SELECT countEqual([1, 2, NULL, NULL], NULL) +``` + +``` text +┌─countEqual([1, 2, NULL, NULL], NULL)─┐ +│ 2 │ +└──────────────────────────────────────┘ +``` + +## arrayEnumerate (arr) {#array_functions-arrayenumerate} + +Returns the array \[1, 2, 3, …, length (arr) \] + +Cette fonction est normalement utilisée avec ARRAY JOIN. Il permet de compter quelque chose une seule fois pour chaque tableau après l'application de la jointure de tableau. Exemple: + +``` sql +SELECT + count() AS Reaches, + countIf(num = 1) AS Hits +FROM test.hits +ARRAY JOIN + GoalsReached, + arrayEnumerate(GoalsReached) AS num +WHERE CounterID = 160656 +LIMIT 10 +``` + +``` text +┌─Reaches─┬──Hits─┐ +│ 95606 │ 31406 │ +└─────────┴───────┘ +``` + +Dans cet exemple, Reaches est le nombre de conversions (les chaînes reçues après l'application de la jointure de tableau), et Hits est le nombre de pages vues (chaînes avant la jointure de tableau). Dans ce cas particulier, vous pouvez obtenir le même résultat dans une voie plus facile: + +``` sql +SELECT + sum(length(GoalsReached)) AS Reaches, + count() AS Hits +FROM test.hits +WHERE (CounterID = 160656) AND notEmpty(GoalsReached) +``` + +``` text +┌─Reaches─┬──Hits─┐ +│ 95606 │ 31406 │ +└─────────┴───────┘ +``` + +Cette fonction peut également être utilisée dans les fonctions d'ordre supérieur. Par exemple, vous pouvez l'utiliser pour obtenir les indices de tableau pour les éléments qui correspondent à une condition. + +## arrayEnumerateUniq(arr, …) {#arrayenumerateuniqarr} + +Renvoie un tableau de la même taille que le tableau source, indiquant pour chaque élément Quelle est sa position parmi les éléments de même valeur. +Par exemple: arrayEnumerateUniq(\[10, 20, 10, 30\]) = \[1, 1, 2, 1\]. + +Cette fonction est utile lors de L'utilisation de la jointure de tableau et de l'agrégation d'éléments de tableau. +Exemple: + +``` sql +SELECT + Goals.ID AS GoalID, + sum(Sign) AS Reaches, + sumIf(Sign, num = 1) AS Visits +FROM test.visits +ARRAY JOIN + Goals, + arrayEnumerateUniq(Goals.ID) AS num +WHERE CounterID = 160656 +GROUP BY GoalID +ORDER BY Reaches DESC +LIMIT 10 +``` + +``` text +┌──GoalID─┬─Reaches─┬─Visits─┐ +│ 53225 │ 3214 │ 1097 │ +│ 2825062 │ 3188 │ 1097 │ +│ 56600 │ 2803 │ 488 │ +│ 1989037 │ 2401 │ 365 │ +│ 2830064 │ 2396 │ 910 │ +│ 1113562 │ 2372 │ 373 │ +│ 3270895 │ 2262 │ 812 │ +│ 1084657 │ 2262 │ 345 │ +│ 56599 │ 2260 │ 799 │ +│ 3271094 │ 2256 │ 812 │ +└─────────┴─────────┴────────┘ +``` + +Dans cet exemple, chaque ID d'objectif a un calcul du nombre de conversions (chaque élément de la structure de données imbriquées objectifs est un objectif atteint, que nous appelons une conversion) et le nombre de sessions. Sans array JOIN, nous aurions compté le nombre de sessions comme sum(signe). Mais dans ce cas particulier, les lignes ont été multipliées par la structure des objectifs imbriqués, donc pour compter chaque session une fois après cela, nous appliquons une condition à la valeur de arrayEnumerateUniq(Goals.ID) fonction. + +La fonction arrayEnumerateUniq peut prendre plusieurs tableaux de la même taille que les arguments. Dans ce cas, l'unicité est considérée pour les tuples d'éléments dans les mêmes positions dans tous les tableaux. + +``` sql +SELECT arrayEnumerateUniq([1, 1, 1, 2, 2, 2], [1, 1, 2, 1, 1, 2]) AS res +``` + +``` text +┌─res───────────┐ +│ [1,2,1,1,2,1] │ +└───────────────┘ +``` + +Ceci est nécessaire lors de L'utilisation de Array JOIN avec une structure de données imbriquée et une agrégation supplémentaire entre plusieurs éléments de cette structure. + +## arrayPopBack {#arraypopback} + +Supprime le dernier élément du tableau. + +``` sql +arrayPopBack(array) +``` + +**Paramètre** + +- `array` – Array. + +**Exemple** + +``` sql +SELECT arrayPopBack([1, 2, 3]) AS res +``` + +``` text +┌─res───┐ +│ [1,2] │ +└───────┘ +``` + +## arrayPopFront {#arraypopfront} + +Supprime le premier élément de la matrice. + +``` sql +arrayPopFront(array) +``` + +**Paramètre** + +- `array` – Array. + +**Exemple** + +``` sql +SELECT arrayPopFront([1, 2, 3]) AS res +``` + +``` text +┌─res───┐ +│ [2,3] │ +└───────┘ +``` + +## arrayPushBack {#arraypushback} + +Ajoute un élément à la fin du tableau. + +``` sql +arrayPushBack(array, single_value) +``` + +**Paramètre** + +- `array` – Array. +- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type pour le type de données du tableau. Pour plus d'informations sur les types de données dans ClickHouse, voir “[Types de données](../../data_types/index.md#data_types)”. Peut être `NULL`. La fonction ajoute un `NULL` tableau, et le type d'éléments de tableau convertit en `Nullable`. + +**Exemple** + +``` sql +SELECT arrayPushBack(['a'], 'b') AS res +``` + +``` text +┌─res───────┐ +│ ['a','b'] │ +└───────────┘ +``` + +## arrayPushFront {#arraypushfront} + +Ajoute un élément au début du tableau. + +``` sql +arrayPushFront(array, single_value) +``` + +**Paramètre** + +- `array` – Array. +- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type pour le type de données du tableau. Pour plus d'informations sur les types de données dans ClickHouse, voir “[Types de données](../../data_types/index.md#data_types)”. Peut être `NULL`. La fonction ajoute un `NULL` tableau, et le type d'éléments de tableau convertit en `Nullable`. + +**Exemple** + +``` sql +SELECT arrayPushFront(['b'], 'a') AS res +``` + +``` text +┌─res───────┐ +│ ['a','b'] │ +└───────────┘ +``` + +## arrayResize {#arrayresize} + +Les changements de la longueur du tableau. + +``` sql +arrayResize(array, size[, extender]) +``` + +**Paramètre:** + +- `array` — Array. +- `size` — Required length of the array. + - Si `size` est inférieure à la taille d'origine du tableau, le tableau est tronqué à partir de la droite. +- Si `size` est plus grande que la taille initiale du tableau, le tableau est étendu vers la droite avec `extender` valeurs ou valeurs par défaut pour le type de données des éléments du tableau. +- `extender` — Value for extending an array. Can be `NULL`. + +**Valeur renvoyée:** + +Un tableau de longueur `size`. + +**Exemples d'appels** + +``` sql +SELECT arrayResize([1], 3) +``` + +``` text +┌─arrayResize([1], 3)─┐ +│ [1,0,0] │ +└─────────────────────┘ +``` + +``` sql +SELECT arrayResize([1], 3, NULL) +``` + +``` text +┌─arrayResize([1], 3, NULL)─┐ +│ [1,NULL,NULL] │ +└───────────────────────────┘ +``` + +## arraySlice {#arrayslice} + +Retourne une tranche du tableau. + +``` sql +arraySlice(array, offset[, length]) +``` + +**Paramètre** + +- `array` – Array of data. +- `offset` – Indent from the edge of the array. A positive value indicates an offset on the left, and a negative value is an indent on the right. Numbering of the array items begins with 1. +- `length` - La longueur de la nécessaire tranche. Si vous spécifiez une valeur négative, la fonction renvoie un ouvert tranche `[offset, array_length - length)`. Si vous omettez la valeur, la fonction renvoie la tranche `[offset, the_end_of_array]`. + +**Exemple** + +``` sql +SELECT arraySlice([1, 2, NULL, 4, 5], 2, 3) AS res +``` + +``` text +┌─res────────┐ +│ [2,NULL,4] │ +└────────────┘ +``` + +Éléments de tableau définis sur `NULL` sont traités comme des valeurs normales. + +## arraySort(\[func,\] arr, …) {#array_functions-sort} + +Trie les éléments de la `arr` tableau dans l'ordre croissant. Si l' `func` fonction est spécifiée, l'ordre de tri est déterminé par le résultat de la `func` fonction appliquée aux éléments du tableau. Si `func` accepte plusieurs arguments, le `arraySort` la fonction est passé plusieurs tableaux que les arguments de `func` correspond à. Des exemples détaillés sont présentés à la fin de `arraySort` Description. + +Exemple de tri de valeurs entières: + +``` sql +SELECT arraySort([1, 3, 3, 0]); +``` + +``` text +┌─arraySort([1, 3, 3, 0])─┐ +│ [0,1,3,3] │ +└─────────────────────────┘ +``` + +Exemple de tri des valeurs de chaîne: + +``` sql +SELECT arraySort(['hello', 'world', '!']); +``` + +``` text +┌─arraySort(['hello', 'world', '!'])─┐ +│ ['!','hello','world'] │ +└────────────────────────────────────┘ +``` + +Considérez l'ordre de tri suivant pour le `NULL`, `NaN` et `Inf` valeur: + +``` sql +SELECT arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]); +``` + +``` text +┌─arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf])─┐ +│ [-inf,-4,1,2,3,inf,nan,nan,NULL,NULL] │ +└───────────────────────────────────────────────────────────┘ +``` + +- `-Inf` les valeurs sont d'abord dans le tableau. +- `NULL` les valeurs sont les derniers dans le tableau. +- `NaN` les valeurs sont juste avant `NULL`. +- `Inf` les valeurs sont juste avant `NaN`. + +Notez que `arraySort` est un [fonction d'ordre supérieur](higher_order_functions.md). Vous pouvez passer d'une fonction lambda comme premier argument. Dans ce cas, l'ordre de classement est déterminé par le résultat de la fonction lambda appliquée aux éléments de la matrice. + +Considérons l'exemple suivant: + +``` sql +SELECT arraySort((x) -> -x, [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [3,2,1] │ +└─────────┘ +``` + +For each element of the source array, the lambda function returns the sorting key, that is, \[1 –\> -1, 2 –\> -2, 3 –\> -3\]. Since the `arraySort` fonction trie les touches dans l'ordre croissant, le résultat est \[3, 2, 1\]. Ainsi, l' `(x) –> -x` fonction lambda définit le [l'ordre décroissant](#array_functions-reverse-sort) dans un tri. + +La fonction lambda peut accepter plusieurs arguments. Dans ce cas, vous avez besoin de passer l' `arraySort` fonction plusieurs tableaux de longueur identique à laquelle correspondront les arguments de la fonction lambda. Le tableau résultant sera composé d'éléments du premier tableau d'entrée; les éléments du(des) Tableau (s) d'entrée suivant (s) spécifient les clés de tri. Exemple: + +``` sql +SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; +``` + +``` text +┌─res────────────────┐ +│ ['world', 'hello'] │ +└────────────────────┘ +``` + +Ici, les éléments qui sont passés dans le deuxième tableau (\[2, 1\]) définissent une clé de tri pour l'élément correspondant à partir du tableau source (\[‘hello’, ‘world’\]), qui est, \[‘hello’ –\> 2, ‘world’ –\> 1\]. Since the lambda function doesn't use `x`, les valeurs réelles du tableau source n'affectent pas l'ordre dans le résultat. Si, ‘hello’ sera le deuxième élément du résultat, et ‘world’ sera le premier. + +D'autres exemples sont présentés ci-dessous. + +``` sql +SELECT arraySort((x, y) -> y, [0, 1, 2], ['c', 'b', 'a']) as res; +``` + +``` text +┌─res─────┐ +│ [2,1,0] │ +└─────────┘ +``` + +``` sql +SELECT arraySort((x, y) -> -y, [0, 1, 2], [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [2,1,0] │ +└─────────┘ +``` + +!!! note "Note" + Pour améliorer l'efficacité du tri, de la [Transformation schwartzienne](https://en.wikipedia.org/wiki/Schwartzian_transform) est utilisée. + +## arrayReverseSort(\[func,\] arr, …) {#array_functions-reverse-sort} + +Trie les éléments de la `arr` tableau dans l'ordre décroissant. Si l' `func` la fonction est spécifiée, `arr` est trié en fonction du résultat de la `func` fonction appliquée aux éléments du tableau, puis le tableau trié est inversé. Si `func` accepte plusieurs arguments, le `arrayReverseSort` la fonction est passé plusieurs tableaux que les arguments de `func` correspond à. Des exemples détaillés sont présentés à la fin de `arrayReverseSort` Description. + +Exemple de tri de valeurs entières: + +``` sql +SELECT arrayReverseSort([1, 3, 3, 0]); +``` + +``` text +┌─arrayReverseSort([1, 3, 3, 0])─┐ +│ [3,3,1,0] │ +└────────────────────────────────┘ +``` + +Exemple de tri des valeurs de chaîne: + +``` sql +SELECT arrayReverseSort(['hello', 'world', '!']); +``` + +``` text +┌─arrayReverseSort(['hello', 'world', '!'])─┐ +│ ['world','hello','!'] │ +└───────────────────────────────────────────┘ +``` + +Considérez l'ordre de tri suivant pour le `NULL`, `NaN` et `Inf` valeur: + +``` sql +SELECT arrayReverseSort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]) as res; +``` + +``` text +┌─res───────────────────────────────────┐ +│ [inf,3,2,1,-4,-inf,nan,nan,NULL,NULL] │ +└───────────────────────────────────────┘ +``` + +- `Inf` les valeurs sont d'abord dans le tableau. +- `NULL` les valeurs sont les derniers dans le tableau. +- `NaN` les valeurs sont juste avant `NULL`. +- `-Inf` les valeurs sont juste avant `NaN`. + +Notez que l' `arrayReverseSort` est un [fonction d'ordre supérieur](higher_order_functions.md). Vous pouvez passer d'une fonction lambda comme premier argument. Exemple est montré ci-dessous. + +``` sql +SELECT arrayReverseSort((x) -> -x, [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [1,2,3] │ +└─────────┘ +``` + +Le tableau est trié de la façon suivante: + +1. Dans un premier temps, le tableau source (\[1, 2, 3\]) est trié en fonction du résultat de la fonction lambda appliquée aux éléments du tableau. Le résultat est un tableau \[3, 2, 1\]. +2. Tableau qui est obtenu à l'étape précédente, est renversé. Donc, le résultat final est \[1, 2, 3\]. + +La fonction lambda peut accepter plusieurs arguments. Dans ce cas, vous avez besoin de passer l' `arrayReverseSort` fonction plusieurs tableaux de longueur identique à laquelle correspondront les arguments de la fonction lambda. Le tableau résultant sera composé d'éléments du premier tableau d'entrée; les éléments du(des) Tableau (s) d'entrée suivant (s) spécifient les clés de tri. Exemple: + +``` sql +SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; +``` + +``` text +┌─res───────────────┐ +│ ['hello','world'] │ +└───────────────────┘ +``` + +Dans cet exemple, le tableau est trié de la façon suivante: + +1. Au début, le tableau source (\[‘hello’, ‘world’\]) est triée selon le résultat de la fonction lambda appliquée aux éléments de tableaux. Les éléments qui sont passés dans le deuxième tableau (\[2, 1\]), définissent les clés de tri pour les éléments correspondants du tableau source. Le résultat est un tableau \[‘world’, ‘hello’\]. +2. Tableau trié lors de l'étape précédente, est renversé. Donc, le résultat final est \[‘hello’, ‘world’\]. + +D'autres exemples sont présentés ci-dessous. + +``` sql +SELECT arrayReverseSort((x, y) -> y, [4, 3, 5], ['a', 'b', 'c']) AS res; +``` + +``` text +┌─res─────┐ +│ [5,3,4] │ +└─────────┘ +``` + +``` sql +SELECT arrayReverseSort((x, y) -> -y, [4, 3, 5], [1, 2, 3]) AS res; +``` + +``` text +┌─res─────┐ +│ [4,3,5] │ +└─────────┘ +``` + +## arrayUniq(arr, …) {#arrayuniqarr} + +Si un argument est passé, il compte le nombre de différents éléments dans le tableau. +Si plusieurs arguments sont passés, il compte le nombre de tuples différents d'éléments aux positions correspondantes dans plusieurs tableaux. + +Si vous souhaitez obtenir une liste des éléments dans un tableau, vous pouvez utiliser arrayReduce(‘groupUniqArray’, arr). + +## arrayJoin (arr) {#array-functions-join} + +Une fonction spéciale. Voir la section [“ArrayJoin function”](array_join.md#functions_arrayjoin). + +## tableaudifférence {#arraydifference} + +Calcule la différence entre les éléments de tableau adjacents. Renvoie un tableau où le premier élément sera 0, le second est la différence entre `a[1] - a[0]`, etc. The type of elements in the resulting array is determined by the type inference rules for subtraction (e.g. `UInt8` - `UInt8` = `Int16`). + +**Syntaxe** + +``` sql +arrayDifference(array) +``` + +**Paramètre** + +- `array` – [Tableau](https://clickhouse.yandex/docs/en/data_types/array/). + +**Valeurs renvoyées** + +Renvoie un tableau de différences entre les éléments adjacents. + +Type: [UInt\*](https://clickhouse.yandex/docs/en/data_types/int_uint/#uint-ranges), [Int\*](https://clickhouse.yandex/docs/en/data_types/int_uint/#int-ranges), [Flottant\*](https://clickhouse.yandex/docs/en/data_types/float/). + +**Exemple** + +Requête: + +``` sql +SELECT arrayDifference([1, 2, 3, 4]) +``` + +Résultat: + +``` text +┌─arrayDifference([1, 2, 3, 4])─┐ +│ [0,1,1,1] │ +└───────────────────────────────┘ +``` + +Exemple de débordement dû au type de résultat Int64: + +Requête: + +``` sql +SELECT arrayDifference([0, 10000000000000000000]) +``` + +Résultat: + +``` text +┌─arrayDifference([0, 10000000000000000000])─┐ +│ [0,-8446744073709551616] │ +└────────────────────────────────────────────┘ +``` + +## arrayDistinct {#arraydistinct} + +Prend un tableau, retourne un tableau contenant les différents éléments seulement. + +**Syntaxe** + +``` sql +arrayDistinct(array) +``` + +**Paramètre** + +- `array` – [Tableau](https://clickhouse.yandex/docs/en/data_types/array/). + +**Valeurs renvoyées** + +Retourne un tableau contenant les éléments distincts. + +**Exemple** + +Requête: + +``` sql +SELECT arrayDistinct([1, 2, 2, 3, 1]) +``` + +Résultat: + +``` text +┌─arrayDistinct([1, 2, 2, 3, 1])─┐ +│ [1,2,3] │ +└────────────────────────────────┘ +``` + +## arrayEnumerateDense(arr) {#array_functions-arrayenumeratedense} + +Renvoie un tableau de la même taille que le tableau source, indiquant où chaque élément apparaît en premier dans le tableau source. + +Exemple: + +``` sql +SELECT arrayEnumerateDense([10, 20, 10, 30]) +``` + +``` text +┌─arrayEnumerateDense([10, 20, 10, 30])─┐ +│ [1,2,1,3] │ +└───────────────────────────────────────┘ +``` + +## arrayIntersect (arr) {#array-functions-arrayintersect} + +Prend plusieurs tableaux, retourne un tableau avec des éléments présents dans tous les tableaux source. L'ordre des éléments dans le tableau résultant est le même que dans le premier tableau. + +Exemple: + +``` sql +SELECT + arrayIntersect([1, 2], [1, 3], [2, 3]) AS no_intersect, + arrayIntersect([1, 2], [1, 3], [1, 4]) AS intersect +``` + +``` text +┌─no_intersect─┬─intersect─┐ +│ [] │ [1] │ +└──────────────┴───────────┘ +``` + +## arrayReduce(agg\_func, arr1, …) {#array-functions-arrayreduce} + +Applique une fonction d'agrégation aux éléments du tableau et renvoie son résultat. Le nom de la fonction d'agrégation est passé sous forme de chaîne entre guillemets simples `'max'`, `'sum'`. Lorsque vous utilisez des fonctions d'agrégat paramétriques, le paramètre est indiqué après le nom de la fonction entre parenthèses `'uniqUpTo(6)'`. + +Exemple: + +``` sql +SELECT arrayReduce('max', [1, 2, 3]) +``` + +``` text +┌─arrayReduce('max', [1, 2, 3])─┐ +│ 3 │ +└───────────────────────────────┘ +``` + +Si une fonction d'agrégation prend plusieurs arguments, cette fonction doit être appliqué à plusieurs ensembles de même taille. + +Exemple: + +``` sql +SELECT arrayReduce('maxIf', [3, 5], [1, 0]) +``` + +``` text +┌─arrayReduce('maxIf', [3, 5], [1, 0])─┐ +│ 3 │ +└──────────────────────────────────────┘ +``` + +Exemple avec une fonction d'agrégat paramétrique: + +``` sql +SELECT arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) +``` + +``` text +┌─arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])─┐ +│ 4 │ +└─────────────────────────────────────────────────────────────┘ +``` + +## arrayReverse(arr) {#array_functions-arrayreverse} + +Retourne un tableau de la même taille que l'original tableau contenant les éléments dans l'ordre inverse. + +Exemple: + +``` sql +SELECT arrayReverse([1, 2, 3]) +``` + +``` text +┌─arrayReverse([1, 2, 3])─┐ +│ [3,2,1] │ +└─────────────────────────┘ +``` + +## inverse (arr) {#array-functions-reverse} + +Synonyme de [“arrayReverse”](#array_functions-arrayreverse) + +## arrayFlatten {#arrayflatten} + +Convertit un tableau de tableaux dans un tableau associatif. + +Fonction: + +- S'applique à toute profondeur de tableaux imbriqués. +- Ne change pas les tableaux qui sont déjà plats. + +Le tableau aplati contient tous les éléments de tous les tableaux source. + +**Syntaxe** + +``` sql +flatten(array_of_arrays) +``` + +Alias: `flatten`. + +**Paramètre** + +- `array_of_arrays` — [Tableau](../../data_types/array.md) de tableaux. Exemple, `[[1,2,3], [4,5]]`. + +**Exemple** + +``` sql +SELECT flatten([[[1]], [[2], [3]]]) +``` + +``` text +┌─flatten(array(array([1]), array([2], [3])))─┐ +│ [1,2,3] │ +└─────────────────────────────────────────────┘ +``` + +## arrayCompact {#arraycompact} + +Supprime les éléments en double consécutifs d'un tableau. L'ordre des valeurs de résultat est déterminée par l'ordre dans le tableau source. + +**Syntaxe** + +``` sql +arrayCompact(arr) +``` + +**Paramètre** + +`arr` — The [tableau](../../data_types/array.md) inspecter. + +**Valeur renvoyée** + +Le tableau sans doublon. + +Type: `Array`. + +**Exemple** + +Requête: + +``` sql +SELECT arrayCompact([1, 1, nan, nan, 2, 3, 3, 3]) +``` + +Résultat: + +``` text +┌─arrayCompact([1, 1, nan, nan, 2, 3, 3, 3])─┐ +│ [1,nan,nan,2,3] │ +└────────────────────────────────────────────┘ +``` + +## arrayZip {#arrayzip} + +Combine multiple Array type columns into one Array\[Tuple(…)\] column + +**Syntaxe** + +``` sql +arrayZip(arr1, arr2, ..., arrN) +``` + +**Paramètre** + +`arr` — Any number of [tableau](../../data_types/array.md) tapez les colonnes à combiner. + +**Valeur renvoyée** + +The result of Array\[Tuple(…)\] type after the combination of these arrays + +**Exemple** + +Requête: + +``` sql +SELECT arrayZip(['a', 'b', 'c'], ['d', 'e', 'f']); +``` + +Résultat: + +``` text +┌─arrayZip(['a', 'b', 'c'], ['d', 'e', 'f'])─┐ +│ [('a','d'),('b','e'),('c','f')] │ +└────────────────────────────────────────────┘ +``` + +## arrayAUC {#arrayauc} + +Calculer AUC (zone sous la courbe, qui est un concept dans l'apprentissage automatique, voir plus de détails: https://en.wikipedia.org/wiki/Receiver\_operating\_characteristic\#Area\_under\_the\_curve). + +**Syntaxe** + +``` sql +arrayAUC(arr_scores, arr_labels) +``` + +**Paramètre** +- `arr_scores` — scores prediction model gives. +- `arr_labels` — labels of samples, usually 1 for positive sample and 0 for negtive sample. + +**Valeur renvoyée** +Renvoie la valeur AUC avec le type Float64. + +**Exemple** +Requête: + +``` sql +select arrayAUC([0.1, 0.4, 0.35, 0.8], [0, 0, 1, 1]) +``` + +Résultat: + +``` text +┌─arrayAUC([0.1, 0.4, 0.35, 0.8], [0, 0, 1, 1])─┐ +│ 0.75 │ +└────────────────────────────────────────-----──┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/array_functions/) diff --git a/docs/fr/query_language/functions/array_join.md b/docs/fr/query_language/functions/array_join.md new file mode 100644 index 00000000000..1985191b319 --- /dev/null +++ b/docs/fr/query_language/functions/array_join.md @@ -0,0 +1,34 @@ +--- +machine_translated: true +--- + +# fonction arrayJoin {#functions_arrayjoin} + +C'est un très inhabituelle de la fonction. + +Les fonctions normales ne modifient pas un ensemble de lignes, mais modifient simplement les valeurs de chaque ligne (map). +Les fonctions d'agrégation compriment un ensemble de lignes (plier ou réduire). +Le ‘arrayJoin’ la fonction prend chaque ligne et génère un ensemble de lignes (dépliante). + +Cette fonction prend un tableau comme argument et propage la ligne source à plusieurs lignes pour le nombre d'éléments dans le tableau. +Toutes les valeurs des colonnes sont simplement copiés, sauf les valeurs dans la colonne où cette fonction est appliquée; elle est remplacée par la valeur correspondante de tableau. + +Une requête peut utiliser plusieurs `arrayJoin` fonction. Dans ce cas, la transformation est effectuée plusieurs fois. + +Notez la syntaxe de jointure de tableau dans la requête SELECT, qui offre des possibilités plus larges. + +Exemple: + +``` sql +SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src +``` + +``` text +┌─dst─┬─\'Hello\'─┬─src─────┐ +│ 1 │ Hello │ [1,2,3] │ +│ 2 │ Hello │ [1,2,3] │ +│ 3 │ Hello │ [1,2,3] │ +└─────┴───────────┴─────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/array_join/) diff --git a/docs/fr/query_language/functions/bit_functions.md b/docs/fr/query_language/functions/bit_functions.md new file mode 100644 index 00000000000..c04c0a77cf7 --- /dev/null +++ b/docs/fr/query_language/functions/bit_functions.md @@ -0,0 +1,252 @@ +--- +machine_translated: true +--- + +# Peu de fonctions {#bit-functions} + +Les fonctions Bit fonctionnent pour n'importe quelle paire de types de UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32 ou Float64. + +Le type de résultat est un entier avec des bits égaux aux bits maximum de ses arguments. Si au moins l'un des arguments est signé, le résultat est un signé nombre. Si un argument est un nombre à virgule flottante, Il est converti en Int64. + +## bitAnd (a, b) {#bitanda-b} + +## bitOr (a, b) {#bitora-b} + +## bitXor (a, b) {#bitxora-b} + +## bitNot (a) {#bitnota} + +## bitShiftLeft (A, b) {#bitshiftlefta-b} + +## bitShiftRight (A, b) {#bitshiftrighta-b} + +## bitRotateLeft (a, b) {#bitrotatelefta-b} + +## bitRotateRight (a, b) {#bitrotaterighta-b} + +## bitTest {#bittest} + +Prend tout entier et le convertit en [forme binaire](https://en.wikipedia.org/wiki/Binary_number) renvoie la valeur d'un bit à la position spécifiée. Le compte à rebours commence à partir de 0 de la droite vers la gauche. + +**Syntaxe** + +``` sql +SELECT bitTest(number, index) +``` + +**Paramètre** + +- `number` – integer number. +- `index` – position of bit. + +**Valeurs renvoyées** + +Renvoie une valeur de bit à la position spécifiée. + +Type: `UInt8`. + +**Exemple** + +Par exemple, le nombre 43 dans le système numérique de base-2 (binaire) est 101011. + +Requête: + +``` sql +SELECT bitTest(43, 1) +``` + +Résultat: + +``` text +┌─bitTest(43, 1)─┐ +│ 1 │ +└────────────────┘ +``` + +Un autre exemple: + +Requête: + +``` sql +SELECT bitTest(43, 2) +``` + +Résultat: + +``` text +┌─bitTest(43, 2)─┐ +│ 0 │ +└────────────────┘ +``` + +## bitTestAll {#bittestall} + +Renvoie le résultat de [logique de conjonction](https://en.wikipedia.org/wiki/Logical_conjunction) (Et opérateur) de tous les bits à des positions données. Le compte à rebours commence à partir de 0 de la droite vers la gauche. + +La conjonction pour les opérations bit à bit: + +0 AND 0 = 0 + +0 AND 1 = 0 + +1 AND 0 = 0 + +1 AND 1 = 1 + +**Syntaxe** + +``` sql +SELECT bitTestAll(number, index1, index2, index3, index4, ...) +``` + +**Paramètre** + +- `number` – integer number. +- `index1`, `index2`, `index3`, `index4` – positions of bit. For example, for set of positions (`index1`, `index2`, `index3`, `index4`) est vrai si et seulement si toutes ses positions sont remplies (`index1` ⋀ `index2`, ⋀ `index3` ⋀ `index4`). + +**Valeurs renvoyées** + +Retourne le résultat de la conjonction logique. + +Type: `UInt8`. + +**Exemple** + +Par exemple, le nombre 43 dans le système numérique de base-2 (binaire) est 101011. + +Requête: + +``` sql +SELECT bitTestAll(43, 0, 1, 3, 5) +``` + +Résultat: + +``` text +┌─bitTestAll(43, 0, 1, 3, 5)─┐ +│ 1 │ +└────────────────────────────┘ +``` + +Un autre exemple: + +Requête: + +``` sql +SELECT bitTestAll(43, 0, 1, 3, 5, 2) +``` + +Résultat: + +``` text +┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐ +│ 0 │ +└───────────────────────────────┘ +``` + +## bitTestAny {#bittestany} + +Renvoie le résultat de [disjonction logique](https://en.wikipedia.org/wiki/Logical_disjunction) (Ou opérateur) de tous les bits à des positions données. Le compte à rebours commence à partir de 0 de la droite vers la gauche. + +La disjonction pour les opérations binaires: + +0 OR 0 = 0 + +0 OR 1 = 1 + +1 OR 0 = 1 + +1 OR 1 = 1 + +**Syntaxe** + +``` sql +SELECT bitTestAny(number, index1, index2, index3, index4, ...) +``` + +**Paramètre** + +- `number` – integer number. +- `index1`, `index2`, `index3`, `index4` – positions of bit. + +**Valeurs renvoyées** + +Renvoie le résultat de la disjuction logique. + +Type: `UInt8`. + +**Exemple** + +Par exemple, le nombre 43 dans le système numérique de base-2 (binaire) est 101011. + +Requête: + +``` sql +SELECT bitTestAny(43, 0, 2) +``` + +Résultat: + +``` text +┌─bitTestAny(43, 0, 2)─┐ +│ 1 │ +└──────────────────────┘ +``` + +Un autre exemple: + +Requête: + +``` sql +SELECT bitTestAny(43, 4, 2) +``` + +Résultat: + +``` text +┌─bitTestAny(43, 4, 2)─┐ +│ 0 │ +└──────────────────────┘ +``` + +## bitCount {#bitcount} + +Calcule le nombre de bits mis à un dans la représentation binaire d'un nombre. + +**Syntaxe** + +``` sql +bitCount(x) +``` + +**Paramètre** + +- `x` — [Entier](../../data_types/int_uint.md) ou [virgule flottante](../../data_types/float.md) nombre. La fonction utilise la représentation de la valeur en mémoire. Il permet de financer les nombres à virgule flottante. + +**Valeur renvoyée** + +- Nombre de bits défini sur un dans le numéro d'entrée. + +La fonction ne convertit pas la valeur d'entrée en un type plus grand ([l'extension du signe](https://en.wikipedia.org/wiki/Sign_extension)). Ainsi, par exemple, `bitCount(toUInt8(-1)) = 8`. + +Type: `UInt8`. + +**Exemple** + +Prenez par exemple le numéro 333. Sa représentation binaire: 0000000101001101. + +Requête: + +``` sql +SELECT bitCount(333) +``` + +Résultat: + +``` text +┌─bitCount(333)─┐ +│ 5 │ +└───────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/bit_functions/) diff --git a/docs/fr/query_language/functions/bitmap_functions.md b/docs/fr/query_language/functions/bitmap_functions.md new file mode 100644 index 00000000000..38d3c17211e --- /dev/null +++ b/docs/fr/query_language/functions/bitmap_functions.md @@ -0,0 +1,493 @@ +--- +machine_translated: true +--- + +# Fonctions de Bitmap {#bitmap-functions} + +Les fonctions Bitmap fonctionnent pour le calcul de la valeur de L'objet de deux bitmaps, il s'agit de renvoyer un nouveau bitmap ou une cardinalité tout en utilisant le calcul de la formule, tel que and, or, xor, and not, etc. + +Il existe 2 types de méthodes de construction pour L'objet Bitmap. L'un doit être construit par la fonction d'agrégation groupBitmap avec-State, l'autre doit être construit par L'objet Array. Il est également de convertir L'objet Bitmap en objet tableau. + +RoaringBitmap est enveloppé dans une structure de données pendant le stockage réel des objets Bitmap. Lorsque la cardinalité est inférieure ou égale à 32, elle utilise Set objet. Lorsque la cardinalité est supérieure à 32, elle utilise l'objet RoaringBitmap. C'est pourquoi le stockage de faible cardinalité jeu est plus rapide. + +Pour plus d'informations sur RoaringBitmap, voir: [CRoaring](https://github.com/RoaringBitmap/CRoaring). + +## bitmapBuild {#bitmap_functions-bitmapbuild} + +Construire un bitmap à partir d'un tableau entier non signé. + +``` sql +bitmapBuild(array) +``` + +**Paramètre** + +- `array` – unsigned integer array. + +**Exemple** + +``` sql +SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res) +``` + +``` text +┌─res─┬─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─────┐ +│  │ AggregateFunction(groupBitmap, UInt8) │ +└─────┴──────────────────────────────────────────────┘ +``` + +## bitmapToArray {#bitmaptoarray} + +Convertir bitmap en tableau entier. + +``` sql +bitmapToArray(bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res +``` + +``` text +┌─res─────────┐ +│ [1,2,3,4,5] │ +└─────────────┘ +``` + +## bitmapSubsetInRange {#bitmap-functions-bitmapsubsetinrange} + +Retourne le sous-ensemble dans la plage spécifiée (n'inclut pas le range\_end). + +``` sql +bitmapSubsetInRange(bitmap, range_start, range_end) +``` + +**Paramètre** + +- `bitmap` – [Objet Bitmap](#bitmap_functions-bitmapbuild). +- `range_start` – range start point. Type: [UInt32](../../data_types/int_uint.md). +- `range_end` – range end point(excluded). Type: [UInt32](../../data_types/int_uint.md). + +**Exemple** + +``` sql +SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res +``` + +``` text +┌─res───────────────┐ +│ [30,31,32,33,100] │ +└───────────────────┘ +``` + +## bitmapSubsetLimit {#bitmapsubsetlimit} + +Crée un sous-ensemble de bitmap avec n éléments pris entre `range_start` et `cardinality_limit`. + +**Syntaxe** + +``` sql +bitmapSubsetLimit(bitmap, range_start, cardinality_limit) +``` + +**Paramètre** + +- `bitmap` – [Objet Bitmap](#bitmap_functions-bitmapbuild). +- `range_start` – The subset starting point. Type: [UInt32](../../data_types/int_uint.md). +- `cardinality_limit` – The subset cardinality upper limit. Type: [UInt32](../../data_types/int_uint.md). + +**Valeur renvoyée** + +Ensemble. + +Type: `Bitmap object`. + +**Exemple** + +Requête: + +``` sql +SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res +``` + +Résultat: + +``` text +┌─res───────────────────────┐ +│ [30,31,32,33,100,200,500] │ +└───────────────────────────┘ +``` + +## bitmapContains {#bitmap_functions-bitmapcontains} + +Vérifie si le bitmap contient un élément. + +``` sql +bitmapContains(haystack, needle) +``` + +**Paramètre** + +- `haystack` – [Objet Bitmap](#bitmap_functions-bitmapbuild) où la fonction recherche. +- `needle` – Value that the function searches. Type: [UInt32](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- 0 — If `haystack` ne contient pas de `needle`. +- 1 — If `haystack` contenir `needle`. + +Type: `UInt8`. + +**Exemple** + +``` sql +SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res +``` + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## bitmapHasAny {#bitmaphasany} + +Vérifie si deux bitmaps ont une intersection par certains éléments. + +``` sql +bitmapHasAny(bitmap1, bitmap2) +``` + +Si vous êtes sûr que `bitmap2` contient strictement un élément, envisagez d'utiliser le [bitmapContains](#bitmap_functions-bitmapcontains) fonction. Cela fonctionne plus efficacement. + +**Paramètre** + +- `bitmap*` – bitmap object. + +**Les valeurs de retour** + +- `1`, si `bitmap1` et `bitmap2` avoir un élément similaire au moins. +- `0`, autrement. + +**Exemple** + +``` sql +SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res +``` + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## bitmapHasAll {#bitmaphasall} + +Analogue à `hasAll(array, array)` renvoie 1 si le premier bitmap contient tous les éléments du second, 0 sinon. +Si le deuxième argument est un bitmap vide, alors renvoie 1. + +``` sql +bitmapHasAll(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res +``` + +``` text +┌─res─┐ +│ 0 │ +└─────┘ +``` + +## bitmapCardinality {#bitmapcardinality} + +Retrun bitmap cardinalité de type UInt64. + +``` sql +bitmapCardinality(bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res +``` + +``` text +┌─res─┐ +│ 5 │ +└─────┘ +``` + +## bitmapMin {#bitmapmin} + +Retrun la plus petite valeur de type UInt64 dans l'ensemble, UINT32\_MAX si l'ensemble est vide. + + bitmapMin(bitmap) + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res +``` + + ┌─res─┐ + │ 1 │ + └─────┘ + +## bitmapMax {#bitmapmax} + +Retrun la plus grande valeur de type UInt64 dans l'ensemble, 0 si l'ensemble est vide. + + bitmapMax(bitmap) + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res +``` + + ┌─res─┐ + │ 5 │ + └─────┘ + +## bitmapTransform {#bitmaptransform} + +Transformer un tableau de valeurs d'une image à l'autre tableau de valeurs, le résultat est une nouvelle image. + + bitmapTransform(bitmap, from_array, to_array) + +**Paramètre** + +- `bitmap` – bitmap object. +- `from_array` – UInt32 array. For idx in range \[0, from\_array.size()), if bitmap contains from\_array\[idx\], then replace it with to\_array\[idx\]. Note that the result depends on array ordering if there are common elements between from\_array and to\_array. +- `to_array` – UInt32 array, its size shall be the same to from\_array. + +**Exemple** + +``` sql +SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), cast([5,999,2] as Array(UInt32)), cast([2,888,20] as Array(UInt32)))) AS res +``` + + ┌─res───────────────────┐ + │ [1,3,4,6,7,8,9,10,20] │ + └───────────────────────┘ + +## bitmapAnd {#bitmapand} + +Deux bitmap et calcul, le résultat est un nouveau bitmap. + +``` sql +bitmapAnd(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res +``` + +``` text +┌─res─┐ +│ [3] │ +└─────┘ +``` + +## bitmapOr {#bitmapor} + +Deux bitmap ou calcul, le résultat est un nouveau bitmap. + +``` sql +bitmapOr(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res +``` + +``` text +┌─res─────────┐ +│ [1,2,3,4,5] │ +└─────────────┘ +``` + +## bitmapXor {#bitmapxor} + +Deux bitmap xor calcul, le résultat est une nouvelle image. + +``` sql +bitmapXor(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res +``` + +``` text +┌─res───────┐ +│ [1,2,4,5] │ +└───────────┘ +``` + +## bitmapetnot {#bitmapandnot} + +Deux Bitmap andnot calcul, le résultat est un nouveau bitmap. + +``` sql +bitmapAndnot(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res +``` + +``` text +┌─res───┐ +│ [1,2] │ +└───────┘ +``` + +## bitmapetcardinalité {#bitmapandcardinality} + +Deux bitmap et calcul, retour cardinalité de type UInt64. + +``` sql +bitmapAndCardinality(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## bitmapOrCardinality {#bitmaporcardinality} + +Deux bitmap ou calcul, retour cardinalité de type UInt64. + +``` sql +bitmapOrCardinality(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +``` text +┌─res─┐ +│ 5 │ +└─────┘ +``` + +## bitmapXorCardinality {#bitmapxorcardinality} + +Deux bitmap XOR calcul, retour cardinalité de type UInt64. + +``` sql +bitmapXorCardinality(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +``` text +┌─res─┐ +│ 4 │ +└─────┘ +``` + +## bitmapetnotcardinality {#bitmapandnotcardinality} + +Deux bitmap andnot calcul, retour cardinalité de type UInt64. + +``` sql +bitmapAndnotCardinality(bitmap,bitmap) +``` + +**Paramètre** + +- `bitmap` – bitmap object. + +**Exemple** + +``` sql +SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +``` text +┌─res─┐ +│ 2 │ +└─────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/bitmap_functions/) diff --git a/docs/fr/query_language/functions/comparison_functions.md b/docs/fr/query_language/functions/comparison_functions.md new file mode 100644 index 00000000000..50477b89596 --- /dev/null +++ b/docs/fr/query_language/functions/comparison_functions.md @@ -0,0 +1,36 @@ +--- +machine_translated: true +--- + +# Fonctions de comparaison {#comparison-functions} + +Les fonctions de comparaison renvoient toujours 0 ou 1 (Uint8). + +Les types suivants peuvent être comparés: + +- nombre +- cordes et cordes fixes +- date +- dates avec heures + +au sein de chaque groupe, mais pas entre différents groupes. + +Par exemple, vous ne pouvez pas comparer une date avec une chaîne. Vous devez utiliser une fonction pour convertir la chaîne en une date, ou vice versa. + +Les chaînes sont comparées par octets. Une courte chaîne est plus petite que toutes les chaînes qui commencent par elle et qui contiennent au moins un caractère de plus. + +Note. Jusqu'à la version 1.1.54134, les numéros signés et non signés étaient comparés de la même manière qu'en C++. En d'autres termes, vous pourriez obtenir un résultat incorrect dans des cas comme SELECT 9223372036854775807 \> -1. Ce comportement a changé dans la version 1.1.54134 et est maintenant mathématiquement correct. + +## égal, A = B et a = = b opérateur {#function-equals} + +## notEquals, a ! opérateur= b et a `<>` b {#function-notequals} + +## peu, `< operator` {#function-less} + +## grand, `> operator` {#function-greater} + +## lessOrEquals, `<= operator` {#function-lessorequals} + +## greaterOrEquals, `>= operator` {#function-greaterorequals} + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/comparison_functions/) diff --git a/docs/fr/query_language/functions/conditional_functions.md b/docs/fr/query_language/functions/conditional_functions.md new file mode 100644 index 00000000000..18c2c5ef081 --- /dev/null +++ b/docs/fr/query_language/functions/conditional_functions.md @@ -0,0 +1,204 @@ +--- +machine_translated: true +--- + +# Fonctions conditionnelles {#conditional-functions} + +## si {#if} + +Contrôle la ramification conditionnelle. Contrairement à la plupart des systèmes, ClickHouse évalue toujours les deux expressions `then` et `else`. + +**Syntaxe** + +``` sql +SELECT if(cond, then, else) +``` + +Si la condition `cond` renvoie une valeur non nulle, retourne le résultat de l'expression `then` et le résultat de l'expression `else`, si présent, est ignoré. Si l' `cond` est égal à zéro ou `NULL` alors le résultat de la `then` l'expression est ignorée et le résultat de `else` expression, si elle est présente, est renvoyée. + +**Paramètre** + +- `cond` – The condition for evaluation that can be zero or not. The type is UInt8, Nullable(UInt8) or NULL. +- `then` - L'expression à renvoyer si la condition est remplie. +- `else` - L'expression à renvoyer si la condition n'est pas remplie. + +**Valeurs renvoyées** + +La fonction s'exécute `then` et `else` expressions et retourne son résultat, selon que la condition `cond` fini par être zéro ou pas. + +**Exemple** + +Requête: + +``` sql +SELECT if(1, plus(2, 2), plus(2, 6)) +``` + +Résultat: + +``` text +┌─plus(2, 2)─┐ +│ 4 │ +└────────────┘ +``` + +Requête: + +``` sql +SELECT if(0, plus(2, 2), plus(2, 6)) +``` + +Résultat: + +``` text +┌─plus(2, 6)─┐ +│ 8 │ +└────────────┘ +``` + +- `then` et `else` doit avoir le type commun le plus bas. + +**Exemple:** + +Prendre cette `LEFT_RIGHT` table: + +``` sql +SELECT * +FROM LEFT_RIGHT + +┌─left─┬─right─┐ +│ ᴺᵁᴸᴸ │ 4 │ +│ 1 │ 3 │ +│ 2 │ 2 │ +│ 3 │ 1 │ +│ 4 │ ᴺᵁᴸᴸ │ +└──────┴───────┘ +``` + +La requête suivante compare `left` et `right` valeur: + +``` sql +SELECT + left, + right, + if(left < right, 'left is smaller than right', 'right is greater or equal than left') AS is_smaller +FROM LEFT_RIGHT +WHERE isNotNull(left) AND isNotNull(right) + +┌─left─┬─right─┬─is_smaller──────────────────────────┐ +│ 1 │ 3 │ left is smaller than right │ +│ 2 │ 2 │ right is greater or equal than left │ +│ 3 │ 1 │ right is greater or equal than left │ +└──────┴───────┴─────────────────────────────────────┘ +``` + +Note: `NULL` les valeurs ne sont pas utilisés dans cet exemple, vérifier [Valeurs nulles dans les conditions](#null-values-in-conditionals) section. + +## Opérateur Ternaire {#ternary-operator} + +Il fonctionne même comme `if` fonction. + +Syntaxe: `cond ? then : else` + +Retourner `then` si l' `cond` renvoie la valeur vrai (supérieur à zéro), sinon renvoie `else`. + +- `cond` doit être de type de `UInt8`, et `then` et `else` doit avoir le type commun le plus bas. + +- `then` et `else` peut être `NULL` + +**Voir aussi** + +- [ifNotFinite](other_functions.md#ifnotfinite). + +## multiIf {#multiif} + +Permet d'écrire le [CASE](../operators.md#operator_case) opérateur plus compacte dans la requête. + +Syntaxe: `multiIf(cond_1, then_1, cond_2, then_2, ..., else)` + +**Paramètre:** + +- `cond_N` — The condition for the function to return `then_N`. +- `then_N` — The result of the function when executed. +- `else` — The result of the function if none of the conditions is met. + +La fonction accepte `2N+1` paramètre. + +**Valeurs renvoyées** + +La fonction renvoie l'une des valeurs `then_N` ou `else` selon les conditions `cond_N`. + +**Exemple** + +En utilisant à nouveau `LEFT_RIGHT` table. + +``` sql +SELECT + left, + right, + multiIf(left < right, 'left is smaller', left > right, 'left is greater', left = right, 'Both equal', 'Null value') AS result +FROM LEFT_RIGHT + +┌─left─┬─right─┬─result──────────┐ +│ ᴺᵁᴸᴸ │ 4 │ Null value │ +│ 1 │ 3 │ left is smaller │ +│ 2 │ 2 │ Both equal │ +│ 3 │ 1 │ left is greater │ +│ 4 │ ᴺᵁᴸᴸ │ Null value │ +└──────┴───────┴─────────────────┘ +``` + +## Utilisation directe des résultats conditionnels {#using-conditional-results-directly} + +Les conditions entraînent toujours `0`, `1` ou `NULL`. Vous pouvez donc utiliser des résultats conditionnels directement comme ceci: + +``` sql +SELECT left < right AS is_small +FROM LEFT_RIGHT + +┌─is_small─┐ +│ ᴺᵁᴸᴸ │ +│ 1 │ +│ 0 │ +│ 0 │ +│ ᴺᵁᴸᴸ │ +└──────────┘ +``` + +## Valeurs nulles dans les conditions {#null-values-in-conditionals} + +Lorsque `NULL` les valeurs sont impliqués dans des conditions, le résultat sera également `NULL`. + +``` sql +SELECT + NULL < 1, + 2 < NULL, + NULL < NULL, + NULL = NULL + +┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +└───────────────┴───────────────┴──────────────────┴────────────────────┘ +``` + +Donc, vous devriez construire vos requêtes avec soin si les types sont `Nullable`. + +L'exemple suivant le démontre en omettant d'ajouter la condition égale à `multiIf`. + +``` sql +SELECT + left, + right, + multiIf(left < right, 'left is smaller', left > right, 'right is smaller', 'Both equal') AS faulty_result +FROM LEFT_RIGHT + +┌─left─┬─right─┬─faulty_result────┐ +│ ᴺᵁᴸᴸ │ 4 │ Both equal │ +│ 1 │ 3 │ left is smaller │ +│ 2 │ 2 │ Both equal │ +│ 3 │ 1 │ right is smaller │ +│ 4 │ ᴺᵁᴸᴸ │ Both equal │ +└──────┴───────┴──────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/conditional_functions/) diff --git a/docs/fr/query_language/functions/date_time_functions.md b/docs/fr/query_language/functions/date_time_functions.md new file mode 100644 index 00000000000..be36b0477f7 --- /dev/null +++ b/docs/fr/query_language/functions/date_time_functions.md @@ -0,0 +1,447 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des dates et des heures {#functions-for-working-with-dates-and-times} + +Support des fuseaux horaires + +Toutes les fonctions pour travailler avec la date et l'heure qui ont une logique d'utilisation pour le fuseau horaire peut accepter un second fuseau horaire argument. Exemple: Asie / Ekaterinbourg. Dans ce cas, ils utilisent le fuseau horaire spécifié au lieu du fuseau horaire local (par défaut). + +``` sql +SELECT + toDateTime('2016-06-15 23:00:00') AS time, + toDate(time) AS date_local, + toDate(time, 'Asia/Yekaterinburg') AS date_yekat, + toString(time, 'US/Samoa') AS time_samoa +``` + +``` text +┌────────────────time─┬─date_local─┬─date_yekat─┬─time_samoa──────────┐ +│ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-16 │ 2016-06-15 09:00:00 │ +└─────────────────────┴────────────┴────────────┴─────────────────────┘ +``` + +Seuls les fuseaux horaires qui diffèrent de L'UTC par un nombre entier d'heures sont pris en charge. + +## toTimeZone {#totimezone} + +Convertir l'heure ou la date et de l'heure au fuseau horaire spécifié. + +## toYear {#toyear} + +Convertit une date ou une date avec l'heure en un numéro UInt16 contenant le numéro d'année (AD). + +## toQuarter {#toquarter} + +Convertit une date ou une date avec l'heure en un numéro UInt8 contenant le numéro de trimestre. + +## toMonth {#tomonth} + +Convertit une date ou une date avec l'heure en un numéro UInt8 contenant le numéro de mois (1-12). + +## toDayOfYear {#todayofyear} + +Convertit une date ou une date avec l'heure en un numéro UInt16 contenant le numéro du jour de l'année (1-366). + +## toDayOfMonth {#todayofmonth} + +Convertit une date ou une date avec le temps à un UInt8 contenant le numéro du jour du mois (1-31). + +## toDayOfWeek {#todayofweek} + +Convertit une date ou une date avec l'heure en un numéro UInt8 contenant le numéro du jour de la semaine (lundi est 1, et dimanche est 7). + +## toHour {#tohour} + +Convertit une date avec l'heure en un nombre UInt8 contenant le numéro de l'heure dans l'Heure de 24 heures (0-23). +This function assumes that if clocks are moved ahead, it is by one hour and occurs at 2 a.m., and if clocks are moved back, it is by one hour and occurs at 3 a.m. (which is not always true – even in Moscow the clocks were twice changed at a different time). + +## toMinute {#tominute} + +Convertit une date avec l'heure en un numéro UInt8 contenant le numéro de la minute de l'heure (0-59). + +## toseconde {#tosecond} + +Convertit une date avec l'heure en un nombre UInt8 contenant le numéro de la seconde dans la minute (0-59). +Les secondes intercalaires ne sont pas comptabilisés. + +## toUnixTimestamp {#to-unix-timestamp} + +Pour L'argument DateTime: convertit la valeur en sa représentation numérique interne (horodatage Unix). +For String argument: analyse datetime from string en fonction du fuseau horaire (second argument optionnel, le fuseau horaire du serveur est utilisé par défaut) et renvoie l'horodatage unix correspondant. +Pour L'argument Date: le comportement n'est pas spécifié. + +**Syntaxe** + +``` sql +toUnixTimestamp(datetime) +toUnixTimestamp(str, [timezone]) +``` + +**Valeur renvoyée** + +- Renvoie l'horodatage unix. + +Type: `UInt32`. + +**Exemple** + +Requête: + +``` sql +SELECT toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo') AS unix_timestamp +``` + +Résultat: + +``` text +┌─unix_timestamp─┐ +│ 1509836867 │ +└────────────────┘ +``` + +## toStartOfYear {#tostartofyear} + +Arrondit une date ou une date avec l'heure jusqu'au premier jour de l'année. +Renvoie la date. + +## toStartOfISOYear {#tostartofisoyear} + +Arrondit une date ou une date avec l'heure jusqu'au premier jour de L'année ISO. +Renvoie la date. + +## toStartOfQuarter {#tostartofquarter} + +Arrondit une date ou une date avec l'heure jusqu'au premier jour du trimestre. +Le premier jour du trimestre, soit le 1er janvier, 1er avril, 1er juillet ou 1er octobre. +Renvoie la date. + +## toStartOfMonth {#tostartofmonth} + +Arrondit une date ou une date avec l'heure jusqu'au premier jour du mois. +Renvoie la date. + +!!! attention "Attention" + Le comportement de l'analyse des dates incorrectes est spécifique à l'implémentation. ClickHouse peut renvoyer la date zéro, lancer une exception ou faire “natural” débordement. + +## toMonday {#tomonday} + +Arrondit une date ou une date avec l'heure au lundi le plus proche. +Renvoie la date. + +## toStartOfWeek (t \[, mode\]) {#tostartofweektmode} + +Arrondit une date ou une date avec l'heure au dimanche ou au lundi le plus proche par mode. +Renvoie la date. +L'argument mode fonctionne exactement comme l'argument mode de toWeek(). Pour la syntaxe à argument unique, une valeur de mode de 0 est utilisée. + +## toStartOfDay {#tostartofday} + +Arrondit une date avec le temps au début de la journée. + +## toStartOfHour {#tostartofhour} + +Arrondit une date avec le temps au début de l " heure. + +## toStartOfMinute {#tostartofminute} + +Arrondit une date avec le temps au début de la minute. + +## toStartOfFiveMinute {#tostartoffiveminute} + +Arrondit à une date avec l'heure de début de l'intervalle de cinq minutes. + +## toStartOfTenMinutes {#tostartoftenminutes} + +Arrondit une date avec le temps au début de l " intervalle de dix minutes. + +## toStartOfFifteenMinutes {#tostartoffifteenminutes} + +Arrondit la date avec le temps jusqu'au début de l'intervalle de quinze minutes. + +## toStartOfInterval(time\_or\_data, intervalle x Unité \[, time\_zone\]) {#tostartofintervaltime-or-data-interval-x-unit-time-zone} + +Ceci est une généralisation d'autres fonctions nommées `toStartOf*`. Exemple, +`toStartOfInterval(t, INTERVAL 1 year)` renvoie la même chose que `toStartOfYear(t)`, +`toStartOfInterval(t, INTERVAL 1 month)` renvoie la même chose que `toStartOfMonth(t)`, +`toStartOfInterval(t, INTERVAL 1 day)` renvoie la même chose que `toStartOfDay(t)`, +`toStartOfInterval(t, INTERVAL 15 minute)` renvoie la même chose que `toStartOfFifteenMinutes(t)` etc. + +## toTime {#totime} + +Convertit une date avec l'heure en une certaine date fixe, tout en préservant l'heure. + +## toRelativeYearNum {#torelativeyearnum} + +Convertit une date avec l'heure ou la date, le numéro de l'année, à partir d'un certain point fixe dans le passé. + +## toRelativeQuarterNum {#torelativequarternum} + +Convertit une date avec l'heure ou la date au numéro du trimestre, à partir d'un certain point fixe dans le passé. + +## toRelativeMonthNum {#torelativemonthnum} + +Convertit une date avec l'heure ou la date au numéro du mois, à partir d'un certain point fixe dans le passé. + +## toRelativeWeekNum {#torelativeweeknum} + +Convertit une date avec l'heure ou la date, le numéro de la semaine, à partir d'un certain point fixe dans le passé. + +## toRelativeDayNum {#torelativedaynum} + +Convertit une date avec l'heure ou la date au numéro du jour, à partir d'un certain point fixe dans le passé. + +## toRelativeHourNum {#torelativehournum} + +Convertit une date avec l'heure ou la date au nombre de l'heure, à partir d'un certain point fixe dans le passé. + +## toRelativeMinuteNum {#torelativeminutenum} + +Convertit une date avec l'heure ou la date au numéro de la minute, à partir d'un certain point fixe dans le passé. + +## toRelativeSecondNum {#torelativesecondnum} + +Convertit une date avec l'heure ou la date au numéro de la seconde, à partir d'un certain point fixe dans le passé. + +## toISOYear {#toisoyear} + +Convertit une date ou une date avec l'heure en un numéro UInt16 contenant le numéro D'année ISO. + +## toISOWeek {#toisoweek} + +Convertit une date ou une date avec l'heure en un numéro UInt8 contenant le numéro de semaine ISO. + +## toWeek (date \[, mode\]) {#toweekdatemode} + +Cette fonction renvoie le numéro de semaine pour date ou datetime. La forme à deux arguments de toWeek() vous permet de spécifier si la semaine commence le dimanche ou le lundi et si la valeur de retour doit être comprise entre 0 et 53 ou entre 1 et 53. Si l'argument mode est omis, le mode par défaut est 0. +`toISOWeek()`est une fonction de compatibilité équivalente à `toWeek(date,3)`. +Le tableau suivant décrit le fonctionnement de l'argument mode. + +| Mode | Premier jour de la semaine | Gamme | Week 1 is the first week … | +|------|----------------------------|-------|----------------------------------| +| 0 | Dimanche | 0-53 | avec un dimanche cette année | +| 1 | Lundi | 0-53 | avec 4 jours ou plus cette année | +| 2 | Dimanche | 1-53 | avec un dimanche cette année | +| 3 | Lundi | 1-53 | avec 4 jours ou plus cette année | +| 4 | Dimanche | 0-53 | avec 4 jours ou plus cette année | +| 5 | Lundi | 0-53 | avec un lundi cette année | +| 6 | Dimanche | 1-53 | avec 4 jours ou plus cette année | +| 7 | Lundi | 1-53 | avec un lundi cette année | +| 8 | Dimanche | 1-53 | contient Janvier 1 | +| 9 | Lundi | 1-53 | contient Janvier 1 | + +Pour les valeurs de mode avec une signification de “with 4 or more days this year,” les semaines sont numérotées selon ISO 8601: 1988: + +- Si la semaine contenant Janvier 1 A 4 jours ou plus dans la nouvelle année, il est Semaine 1. + +- Sinon, c'est la dernière semaine de l'année précédente, et la semaine prochaine est la semaine 1. + +Pour les valeurs de mode avec une signification de “contains January 1”, la semaine contient Janvier 1 est Semaine 1. Peu importe combien de jours dans la nouvelle année la semaine contenait, même si elle contenait seulement un jour. + +``` sql +toWeek(date, [, mode][, Timezone]) +``` + +**Paramètre** + +- `date` – Date or DateTime. +- `mode` – Optional parameter, Range of values is \[0,9\], default is 0. +- `Timezone` – Optional parameter, it behaves like any other conversion function. + +**Exemple** + +``` sql +SELECT toDate('2016-12-27') AS date, toWeek(date) AS week0, toWeek(date,1) AS week1, toWeek(date,9) AS week9; +``` + +``` text +┌───────date─┬─week0─┬─week1─┬─week9─┐ +│ 2016-12-27 │ 52 │ 52 │ 1 │ +└────────────┴───────┴───────┴───────┘ +``` + +## toYearWeek (date \[, mode\]) {#toyearweekdatemode} + +Retourne l'année et la semaine pour une date. L'année dans le résultat peut être différente de l'année dans l'argument date pour la première et la dernière semaine de l'année. + +L'argument mode fonctionne exactement comme l'argument mode de toWeek(). Pour la syntaxe à argument unique, une valeur de mode de 0 est utilisée. + +`toISOYear()`est une fonction de compatibilité équivalente à `intDiv(toYearWeek(date,3),100)`. + +**Exemple** + +``` sql +SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(date,1) AS yearWeek1, toYearWeek(date,9) AS yearWeek9; +``` + +``` text +┌───────date─┬─yearWeek0─┬─yearWeek1─┬─yearWeek9─┐ +│ 2016-12-27 │ 201652 │ 201652 │ 201701 │ +└────────────┴───────────┴───────────┴───────────┘ +``` + +## maintenant {#now} + +Accepte zéro argument et renvoie l'heure actuelle à l'un des moments de l'exécution de la requête. +Cette fonction renvoie une constante, même si la requête a pris beaucoup de temps à compléter. + +## aujourd' {#today} + +Accepte zéro argument et renvoie la date actuelle à l'un des moments de l'exécution de la requête. +Le même que ‘toDate(now())’. + +## hier {#yesterday} + +Accepte zéro argument et renvoie la date d'hier à l'un des moments de l'exécution de la requête. +Le même que ‘today() - 1’. + +## l'horaire de diffusion {#timeslot} + +Arrondit le temps à la demi-heure. +Cette fonction est spécifique à Yandex.Metrica, car une demi-heure est le temps minimum pour diviser une session en deux sessions si une balise de suivi affiche les pages vues consécutives d'un seul utilisateur qui diffèrent dans le temps de strictement plus que ce montant. Cela signifie que les tuples (l'ID de balise, l'ID utilisateur et l'intervalle de temps) peuvent être utilisés pour rechercher les pages vues incluses dans la session correspondante. + +## toYYYYMM {#toyyyymm} + +Convertit une date ou une date avec l'heure en un numéro UInt32 contenant le numéro d'année et de mois (AAAA \* 100 + MM). + +## toYYYYMMDD {#toyyyymmdd} + +Convertit une date ou une date avec l'heure en un numéro UInt32 contenant le numéro d'année et de mois (AAAA \* 10000 + MM \* 100 + JJ). + +## toYYYYMMDDhhmmss {#toyyyymmddhhmmss} + +Convertit une date ou une date avec l'heure en un numéro UInt64 contenant le numéro d'année et de mois (AAAA \* 10000000000 + MM \* 100000000 + DD \* 1000000 + hh \* 10000 + mm \* 100 + ss). + +## addYears, addMonths, addWeeks, addDays, addHours, addMinutes, addSeconds, addQuarters {#addyears-addmonths-addweeks-adddays-addhours-addminutes-addseconds-addquarters} + +Fonction ajoute une date / DateTime intervalle à une Date / DateTime, puis retourner la Date / DateTime. Exemple: + +``` sql +WITH + toDate('2018-01-01') AS date, + toDateTime('2018-01-01 00:00:00') AS date_time +SELECT + addYears(date, 1) AS add_years_with_date, + addYears(date_time, 1) AS add_years_with_date_time +``` + +``` text +┌─add_years_with_date─┬─add_years_with_date_time─┐ +│ 2019-01-01 │ 2019-01-01 00:00:00 │ +└─────────────────────┴──────────────────────────┘ +``` + +## subtractYears, subtractMonths, subtractWeeks, subtractDays, subtractHours, subtractMinutes, subtractSeconds, subtractQuarters {#subtractyears-subtractmonths-subtractweeks-subtractdays-subtracthours-subtractminutes-subtractseconds-subtractquarters} + +Fonction soustrayez un intervalle de Date / DateTime à une Date / DateTime, puis renvoyez la Date / DateTime. Exemple: + +``` sql +WITH + toDate('2019-01-01') AS date, + toDateTime('2019-01-01 00:00:00') AS date_time +SELECT + subtractYears(date, 1) AS subtract_years_with_date, + subtractYears(date_time, 1) AS subtract_years_with_date_time +``` + +``` text +┌─subtract_years_with_date─┬─subtract_years_with_date_time─┐ +│ 2018-01-01 │ 2018-01-01 00:00:00 │ +└──────────────────────────┴───────────────────────────────┘ +``` + +## dateDiff {#datediff} + +Renvoie la différence entre deux valeurs Date ou DateTime. + +**Syntaxe** + +``` sql +dateDiff('unit', startdate, enddate, [timezone]) +``` + +**Paramètre** + +- `unit` — Time unit, in which the returned value is expressed. [Chaîne](../syntax.md#syntax-string-literal). + + Supported values: + + | unit | + | ------ | + |second | + |minute | + |hour | + |day | + |week | + |month | + |quarter | + |year | + +- `startdate` — The first time value to compare. [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). + +- `enddate` — The second time value to compare. [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). + +- `timezone` — Optional parameter. If specified, it is applied to both `startdate` et `enddate`. Si non spécifié, fuseaux horaires de l' `startdate` et `enddate` sont utilisés. Si elles ne sont pas identiques, le résultat n'est pas spécifié. + +**Valeur renvoyée** + +Différence entre `startdate` et `enddate` exprimé en `unit`. + +Type: `int`. + +**Exemple** + +Requête: + +``` sql +SELECT dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00')); +``` + +Résultat: + +``` text +┌─dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'))─┐ +│ 25 │ +└────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## intervalle de temps (StartTime, Duration, \[, Size\]) {#timeslotsstarttime-duration-size} + +Pour un intervalle de temps commençant à ‘StartTime’ et de poursuivre pour ‘Duration’ secondes, il renvoie un tableau de moments dans le temps, composé de points de cet intervalle arrondis vers le bas à la ‘Size’ en quelques secondes. ‘Size’ est un paramètre optionnel: une constante UInt32, définie sur 1800 par défaut. +Exemple, `timeSlots(toDateTime('2012-01-01 12:20:00'), 600) = [toDateTime('2012-01-01 12:00:00'), toDateTime('2012-01-01 12:30:00')]`. +Ceci est nécessaire pour rechercher les pages vues dans la session correspondante. + +## formatDateTime(Heure, Format \[, fuseau horaire\]) {#formatdatetime} + +Function formats a Time according given Format string. N.B.: Format is a constant expression, e.g. you can not have multiple formats for single result column. + +Modificateurs pris en charge pour le Format: +(“Example” colonne affiche le résultat de formatage pour le temps `2018-01-02 22:33:44`) + +| Modificateur | Description | Exemple | +|--------------|------------------------------------------------------------------------|------------| +| %C | année divisée par 100 et tronquée en entier (00-99) | 20 | +| %d | jour du mois, zero-rembourré (01-31) | 02 | +| %D | Date courte MM / JJ / AA, équivalente à %m / % d / % y | 01/02/18 | +| % e | jour du mois, rembourré dans l'espace ( 1-31) | 2 | +| %F | date courte AAAA-MM-JJ, équivalente à % Y - % m - % d | 2018-01-02 | +| %H | heure en format 24h (00-23) | 22 | +| %I | heure en format 12h (01-12) | 10 | +| %j | les jours de l'année (001-366) | 002 | +| %m | mois en nombre décimal (01-12) | 01 | +| %M | minute (00-59) | 33 | +| %et | caractère de nouvelle ligne (") | | +| %p | Désignation AM ou PM | PM | +| %R | 24 heures HH:MM temps, équivalent à %H: % M | 22:33 | +| %S | deuxième (00-59) | 44 | +| % t | horizontal-caractère de tabulation (') | | +| %T | Format d'heure ISO 8601 (HH:MM:SS), équivalent à %H: % M:%S | 22:33:44 | +| % u | ISO 8601 jour de la semaine comme numéro avec Lundi comme 1 (1-7) | 2 | +| %V | Numéro de semaine ISO 8601 (01-53) | 01 | +| %W | jour de la semaine comme un nombre décimal avec dimanche comme 0 (0-6) | 2 | +| % y | Année, deux derniers chiffres (00-99) | 18 | +| %Y | An | 2018 | +| %% | signe | % | + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/date_time_functions/) diff --git a/docs/fr/query_language/functions/encoding_functions.md b/docs/fr/query_language/functions/encoding_functions.md new file mode 100644 index 00000000000..87a848cf1a8 --- /dev/null +++ b/docs/fr/query_language/functions/encoding_functions.md @@ -0,0 +1,172 @@ +--- +machine_translated: true +--- + +# L'encodage des fonctions {#encoding-functions} + +## char {#char} + +Retourne la chaîne avec la longueur que le nombre d'arguments passés et chaque octet a la valeur de l'argument correspondant. Accepte plusieurs arguments de types numériques. Si la valeur de l'argument est hors de portée du type de données UInt8, elle est convertie en UInt8 avec arrondi et débordement possibles. + +**Syntaxe** + +``` sql +char(number_1, [number_2, ..., number_n]); +``` + +**Paramètre** + +- `number_1, number_2, ..., number_n` — Numerical arguments interpreted as integers. Types: [Int](../../data_types/int_uint.md), [Flottant](../../data_types/float.md). + +**Valeur renvoyée** + +- une chaîne d'octets. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello +``` + +Résultat: + +``` text +┌─hello─┐ +│ hello │ +└───────┘ +``` + +Vous pouvez construire une chaîne de codage arbitraire en passant les octets correspondants. Voici un exemple pour UTF-8: + +Requête: + +``` sql +SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello; +``` + +Résultat: + +``` text +┌─hello──┐ +│ привет │ +└────────┘ +``` + +Requête: + +``` sql +SELECT char(0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD) AS hello; +``` + +Résultat: + +``` text +┌─hello─┐ +│ 你好 │ +└───────┘ +``` + +## Hex {#hex} + +Renvoie une chaîne contenant la représentation hexadécimale de l'argument. + +**Syntaxe** + +``` sql +hex(arg) +``` + +La fonction utilise des lettres majuscules `A-F` et ne pas utiliser de préfixes (comme `0x`) ou suffixes (comme `h`). + +Pour les arguments entiers, il imprime des chiffres hexadécimaux (“nibbles”) du plus significatif au moins significatif (big endian ou “human readable” ordre). Il commence par l'octet non nul le plus significatif (les octets de début zéro sont omis) mais imprime toujours les deux chiffres de chaque octet même si le chiffre de début est nul. + +Exemple: + +**Exemple** + +Requête: + +``` sql +SELECT hex(1); +``` + +Résultat: + +``` text +01 +``` + +Les valeurs de type `Date` et `DateTime` sont formatés comme des entiers correspondants (le nombre de jours depuis Epoch pour Date et la valeur de L'horodatage Unix pour DateTime). + +Pour `String` et `FixedString`, tous les octets sont simplement codés en deux nombres hexadécimaux. Zéro octets ne sont pas omis. + +Les valeurs des types virgule flottante et décimale sont codées comme leur représentation en mémoire. Comme nous soutenons l'architecture little endian, ils sont codés dans little endian. Zéro octets de début / fin ne sont pas omis. + +**Paramètre** + +- `arg` — A value to convert to hexadecimal. Types: [Chaîne](../../data_types/string.md), [UInt](../../data_types/int_uint.md), [Flottant](../../data_types/float.md), [Décimal](../../data_types/decimal.md), [Date](../../data_types/date.md) ou [DateTime](../../data_types/datetime.md). + +**Valeur renvoyée** + +- Une chaîne avec la représentation hexadécimale de l'argument. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT hex(toFloat32(number)) as hex_presentation FROM numbers(15, 2); +``` + +Résultat: + +``` text +┌─hex_presentation─┐ +│ 00007041 │ +│ 00008041 │ +└──────────────────┘ +``` + +Requête: + +``` sql +SELECT hex(toFloat64(number)) as hex_presentation FROM numbers(15, 2); +``` + +Résultat: + +``` text +┌─hex_presentation─┐ +│ 0000000000002E40 │ +│ 0000000000003040 │ +└──────────────────┘ +``` + +## unhex (str) {#unhexstr} + +Accepte une chaîne contenant un nombre quelconque de chiffres hexadécimaux, et renvoie une chaîne contenant le correspondant octets. Prend en charge les lettres majuscules et minuscules A-F. Le nombre de chiffres hexadécimaux ne doit pas être pair. S'il est impair, le dernier chiffre est interprété comme la moitié la moins significative de l'octet 00-0F. Si la chaîne d'argument contient autre chose que des chiffres hexadécimaux, un résultat défini par l'implémentation est renvoyé (une exception n'est pas levée). +Si vous voulez convertir le résultat en un nombre, vous pouvez utiliser le ‘reverse’ et ‘reinterpretAsType’ fonction. + +## UUIDStringToNum (str) {#uuidstringtonumstr} + +Accepte une chaîne contenant 36 caractères dans le format `123e4567-e89b-12d3-a456-426655440000`, et le renvoie comme un ensemble d'octets dans un FixedString (16). + +## UUIDNumToString (str) {#uuidnumtostringstr} + +Accepte une valeur FixedString (16). Renvoie une chaîne contenant 36 caractères au format texte. + +## bitmaskToList(num) {#bitmasktolistnum} + +Accepte un entier. Renvoie une chaîne contenant la liste des puissances de deux qui totalisent le nombre source lorsqu'il est additionné. Ils sont séparés par des virgules sans espaces au format texte, dans l'ordre croissant. + +## bitmaskToArray(num) {#bitmasktoarraynum} + +Accepte un entier. Renvoie un tableau de nombres UInt64 contenant la liste des puissances de deux qui totalisent le nombre source lorsqu'il est additionné. Les numéros dans le tableau sont dans l'ordre croissant. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/encoding_functions/) diff --git a/docs/fr/query_language/functions/ext_dict_functions.md b/docs/fr/query_language/functions/ext_dict_functions.md new file mode 100644 index 00000000000..40d606b18bd --- /dev/null +++ b/docs/fr/query_language/functions/ext_dict_functions.md @@ -0,0 +1,202 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des dictionnaires externes {#ext_dict_functions} + +Pour plus d'informations sur la connexion et la configuration de dictionnaires externes, voir [Dictionnaires externes](../dicts/external_dicts.md). + +## dictGet {#dictget} + +Récupère une valeur d'un dictionnaire externe. + +``` sql +dictGet('dict_name', 'attr_name', id_expr) +dictGetOrDefault('dict_name', 'attr_name', id_expr, default_value_expr) +``` + +**Paramètre** + +- `dict_name` — Name of the dictionary. [Chaîne littérale](../syntax.md#syntax-string-literal). +- `attr_name` — Name of the column of the dictionary. [Chaîne littérale](../syntax.md#syntax-string-literal). +- `id_expr` — Key value. [Expression](../syntax.md#syntax-expressions) de retour d'un [UInt64](../../data_types/int_uint.md) ou [Tuple](../../data_types/tuple.md)- tapez la valeur en fonction de la configuration du dictionnaire. +- `default_value_expr` — Value returned if the dictionary doesn't contain a row with the `id_expr` clé. [Expression](../syntax.md#syntax-expressions) renvoyer la valeur dans le type de données configuré pour `attr_name` attribut. + +**Valeur renvoyée** + +- Si ClickHouse analyse l'attribut avec succès dans le [l'attribut type de données](../../query_language/dicts/external_dicts_dict_structure.md#ext_dict_structure-attributes), les fonctions renvoient la valeur du dictionnaire de l'attribut qui correspond à `id_expr`. + +- Si il n'y a pas la clé, correspondant à `id_expr` dans le dictionnaire, puis: + + - `dictGet` returns the content of the `` element specified for the attribute in the dictionary configuration. + - `dictGetOrDefault` returns the value passed as the `default_value_expr` parameter. + +ClickHouse lève une exception si elle ne peut pas analyser la valeur de l'attribut ou si la valeur ne correspond pas au type de données d'attribut. + +**Exemple** + +Créer un fichier texte `ext-dict-text.csv` contenant les éléments suivants: + +``` text +1,1 +2,2 +``` + +La première colonne est `id` la deuxième colonne est `c1`. + +Configurer le dictionnaire externe: + +``` xml + + + ext-dict-test + + + /path-to/ext-dict-test.csv + CSV + + + + + + + + id + + + c1 + UInt32 + + + + 0 + + +``` + +Effectuer la requête: + +``` sql +SELECT + dictGetOrDefault('ext-dict-test', 'c1', number + 1, toUInt32(number * 10)) AS val, + toTypeName(val) AS type +FROM system.numbers +LIMIT 3 +``` + +``` text +┌─val─┬─type───┐ +│ 1 │ UInt32 │ +│ 2 │ UInt32 │ +│ 20 │ UInt32 │ +└─────┴────────┘ +``` + +**Voir Aussi** + +- [Dictionnaires Externes](../dicts/external_dicts.md) + +## dictHas {#dicthas} + +Vérifie si une clé est présente dans un dictionnaire. + +``` sql +dictHas('dict_name', id_expr) +``` + +**Paramètre** + +- `dict_name` — Name of the dictionary. [Chaîne littérale](../syntax.md#syntax-string-literal). +- `id_expr` — Key value. [Expression](../syntax.md#syntax-expressions) de retour d'un [UInt64](../../data_types/int_uint.md)-le type de la valeur. + +**Valeur renvoyée** + +- 0, si il n'y a pas de clé. +- 1, si il y a une clé. + +Type: `UInt8`. + +## dictGetHierarchy {#dictgethierarchy} + +Crée un tableau contenant tous les parents d'une clé dans le [hiérarchique dictionnaire](../dicts/external_dicts_dict_hierarchical.md). + +**Syntaxe** + +``` sql +dictGetHierarchy('dict_name', key) +``` + +**Paramètre** + +- `dict_name` — Name of the dictionary. [Chaîne littérale](../syntax.md#syntax-string-literal). +- `key` — Key value. [Expression](../syntax.md#syntax-expressions) de retour d'un [UInt64](../../data_types/int_uint.md)-le type de la valeur. + +**Valeur renvoyée** + +- Les Parents pour la clé. + +Type: [Tableau (UInt64)](../../data_types/array.md). + +## dictisine {#dictisin} + +Vérifie l'ancêtre d'une clé à travers toute la chaîne hiérarchique dans le dictionnaire. + +``` sql +dictIsIn('dict_name', child_id_expr, ancestor_id_expr) +``` + +**Paramètre** + +- `dict_name` — Name of the dictionary. [Chaîne littérale](../syntax.md#syntax-string-literal). +- `child_id_expr` — Key to be checked. [Expression](../syntax.md#syntax-expressions) de retour d'un [UInt64](../../data_types/int_uint.md)-le type de la valeur. +- `ancestor_id_expr` — Alleged ancestor of the `child_id_expr` clé. [Expression](../syntax.md#syntax-expressions) de retour d'un [UInt64](../../data_types/int_uint.md)-le type de la valeur. + +**Valeur renvoyée** + +- 0, si `child_id_expr` n'est pas un enfant de `ancestor_id_expr`. +- 1, si `child_id_expr` est un enfant de `ancestor_id_expr` ou si `child_id_expr` est un `ancestor_id_expr`. + +Type: `UInt8`. + +## D'autres fonctions {#ext_dict_functions-other} + +ClickHouse prend en charge des fonctions spécialisées qui convertissent les valeurs d'attribut de dictionnaire en un type de données spécifique, quelle que soit la configuration du dictionnaire. + +Fonction: + +- `dictGetInt8`, `dictGetInt16`, `dictGetInt32`, `dictGetInt64` +- `dictGetUInt8`, `dictGetUInt16`, `dictGetUInt32`, `dictGetUInt64` +- `dictGetFloat32`, `dictGetFloat64` +- `dictGetDate` +- `dictGetDateTime` +- `dictGetUUID` +- `dictGetString` + +Toutes ces fonctions ont le `OrDefault` modification. Exemple, `dictGetDateOrDefault`. + +Syntaxe: + +``` sql +dictGet[Type]('dict_name', 'attr_name', id_expr) +dictGet[Type]OrDefault('dict_name', 'attr_name', id_expr, default_value_expr) +``` + +**Paramètre** + +- `dict_name` — Name of the dictionary. [Chaîne littérale](../syntax.md#syntax-string-literal). +- `attr_name` — Name of the column of the dictionary. [Chaîne littérale](../syntax.md#syntax-string-literal). +- `id_expr` — Key value. [Expression](../syntax.md#syntax-expressions) de retour d'un [UInt64](../../data_types/int_uint.md)-le type de la valeur. +- `default_value_expr` — Value which is returned if the dictionary doesn't contain a row with the `id_expr` clé. [Expression](../syntax.md#syntax-expressions) renvoyer une valeur dans le type de données configuré pour `attr_name` attribut. + +**Valeur renvoyée** + +- Si ClickHouse analyse l'attribut avec succès dans le [l'attribut type de données](../../query_language/dicts/external_dicts_dict_structure.md#ext_dict_structure-attributes), les fonctions renvoient la valeur du dictionnaire de l'attribut qui correspond à `id_expr`. + +- Si il n'est pas demandé `id_expr` dans le dictionnaire,: + + - `dictGet[Type]` returns the content of the `` element specified for the attribute in the dictionary configuration. + - `dictGet[Type]OrDefault` returns the value passed as the `default_value_expr` parameter. + +ClickHouse lève une exception si elle ne peut pas analyser la valeur de l'attribut ou si la valeur ne correspond pas au type de données d'attribut. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/ext_dict_functions/) diff --git a/docs/fr/query_language/functions/functions_for_nulls.md b/docs/fr/query_language/functions/functions_for_nulls.md new file mode 100644 index 00000000000..361c758765c --- /dev/null +++ b/docs/fr/query_language/functions/functions_for_nulls.md @@ -0,0 +1,309 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des agrégats nullables {#functions-for-working-with-nullable-aggregates} + +## isNull {#isnull} + +Vérifie si l'argument est [NULL](../syntax.md#null). + +``` sql +isNull(x) +``` + +**Paramètre** + +- `x` — A value with a non-compound data type. + +**Valeur renvoyée** + +- `1` si `x` être `NULL`. +- `0` si `x` n'est pas `NULL`. + +**Exemple** + +Table d'entrée + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +Requête + +``` sql +SELECT x FROM t_null WHERE isNull(y) +``` + +``` text +┌─x─┐ +│ 1 │ +└───┘ +``` + +## isNotNull {#isnotnull} + +Vérifie si l'argument est [NULL](../syntax.md#null). + +``` sql +isNotNull(x) +``` + +**Paramètre:** + +- `x` — A value with a non-compound data type. + +**Valeur renvoyée** + +- `0` si `x` être `NULL`. +- `1` si `x` n'est pas `NULL`. + +**Exemple** + +Table d'entrée + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +Requête + +``` sql +SELECT x FROM t_null WHERE isNotNull(y) +``` + +``` text +┌─x─┐ +│ 2 │ +└───┘ +``` + +## fusionner {#coalesce} + +Vérifie de gauche à droite si `NULL` les arguments ont été passés et renvoie le premier non-`NULL` argument. + +``` sql +coalesce(x,...) +``` + +**Paramètre:** + +- N'importe quel nombre de paramètres d'un type non composé. Tous les paramètres doivent être compatibles par type de données. + +**Valeurs renvoyées** + +- Le premier non-`NULL` argument. +- `NULL` si tous les arguments sont `NULL`. + +**Exemple** + +Considérez une liste de contacts qui peuvent spécifier plusieurs façons de contacter un client. + +``` text +┌─name─────┬─mail─┬─phone─────┬──icq─┐ +│ client 1 │ ᴺᵁᴸᴸ │ 123-45-67 │ 123 │ +│ client 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +└──────────┴──────┴───────────┴──────┘ +``` + +Le `mail` et `phone` les champs sont de type Chaîne de caractères, mais la `icq` le terrain est `UInt32`, de sorte qu'il doit être converti en `String`. + +Obtenir la première méthode de contact pour le client à partir de la liste de contacts: + +``` sql +SELECT coalesce(mail, phone, CAST(icq,'Nullable(String)')) FROM aBook +``` + +``` text +┌─name─────┬─coalesce(mail, phone, CAST(icq, 'Nullable(String)'))─┐ +│ client 1 │ 123-45-67 │ +│ client 2 │ ᴺᵁᴸᴸ │ +└──────────┴──────────────────────────────────────────────────────┘ +``` + +## ifNull {#ifnull} + +Renvoie une valeur alternative si l'argument principal est `NULL`. + +``` sql +ifNull(x,alt) +``` + +**Paramètre:** + +- `x` — The value to check for `NULL`. +- `alt` — The value that the function returns if `x` être `NULL`. + +**Valeurs renvoyées** + +- Valeur `x`, si `x` n'est pas `NULL`. +- Valeur `alt`, si `x` être `NULL`. + +**Exemple** + +``` sql +SELECT ifNull('a', 'b') +``` + +``` text +┌─ifNull('a', 'b')─┐ +│ a │ +└──────────────────┘ +``` + +``` sql +SELECT ifNull(NULL, 'b') +``` + +``` text +┌─ifNull(NULL, 'b')─┐ +│ b │ +└───────────────────┘ +``` + +## nullIf {#nullif} + +Retourner `NULL` si les arguments sont égaux. + +``` sql +nullIf(x, y) +``` + +**Paramètre:** + +`x`, `y` — Values for comparison. They must be compatible types, or ClickHouse will generate an exception. + +**Valeurs renvoyées** + +- `NULL` si les arguments sont égaux. +- Le `x` valeur, si les arguments ne sont pas égaux. + +**Exemple** + +``` sql +SELECT nullIf(1, 1) +``` + +``` text +┌─nullIf(1, 1)─┐ +│ ᴺᵁᴸᴸ │ +└──────────────┘ +``` + +``` sql +SELECT nullIf(1, 2) +``` + +``` text +┌─nullIf(1, 2)─┐ +│ 1 │ +└──────────────┘ +``` + +## assumeNotNull {#assumenotnull} + +Résultats dans une valeur de type [Nullable](../../data_types/nullable.md) pour un non- `Nullable` si la valeur n'est pas `NULL`. + +``` sql +assumeNotNull(x) +``` + +**Paramètre:** + +- `x` — The original value. + +**Valeurs renvoyées** + +- La valeur d'origine du non-`Nullable` type, si elle n'est pas `NULL`. +- La valeur par défaut pour le non-`Nullable` Tapez si la valeur d'origine était `NULL`. + +**Exemple** + +Envisager l' `t_null` table. + +``` sql +SHOW CREATE TABLE t_null +``` + +``` text +┌─statement─────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE default.t_null ( x Int8, y Nullable(Int8)) ENGINE = TinyLog │ +└───────────────────────────────────────────────────────────────────────────┘ +``` + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +Appliquer le `assumeNotNull` la fonction de la `y` colonne. + +``` sql +SELECT assumeNotNull(y) FROM t_null +``` + +``` text +┌─assumeNotNull(y)─┐ +│ 0 │ +│ 3 │ +└──────────────────┘ +``` + +``` sql +SELECT toTypeName(assumeNotNull(y)) FROM t_null +``` + +``` text +┌─toTypeName(assumeNotNull(y))─┐ +│ Int8 │ +│ Int8 │ +└──────────────────────────────┘ +``` + +## toNullable {#tonullable} + +Convertit le type d'argument en `Nullable`. + +``` sql +toNullable(x) +``` + +**Paramètre:** + +- `x` — The value of any non-compound type. + +**Valeur renvoyée** + +- La valeur d'entrée avec un `Nullable` type. + +**Exemple** + +``` sql +SELECT toTypeName(10) +``` + +``` text +┌─toTypeName(10)─┐ +│ UInt8 │ +└────────────────┘ +``` + +``` sql +SELECT toTypeName(toNullable(10)) +``` + +``` text +┌─toTypeName(toNullable(10))─┐ +│ Nullable(UInt8) │ +└────────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/functions_for_nulls/) diff --git a/docs/fr/query_language/functions/geo.md b/docs/fr/query_language/functions/geo.md new file mode 100644 index 00000000000..1bff6d147d9 --- /dev/null +++ b/docs/fr/query_language/functions/geo.md @@ -0,0 +1,507 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des coordonnées géographiques {#functions-for-working-with-geographical-coordinates} + +## greatCircleDistance {#greatcircledistance} + +Calculer la distance entre deux points sur la surface de la Terre en utilisant [la formule du grand cercle](https://en.wikipedia.org/wiki/Great-circle_distance). + +``` sql +greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg) +``` + +**Les paramètres d'entrée** + +- `lon1Deg` — Longitude of the first point in degrees. Range: `[-180°, 180°]`. +- `lat1Deg` — Latitude of the first point in degrees. Range: `[-90°, 90°]`. +- `lon2Deg` — Longitude of the second point in degrees. Range: `[-180°, 180°]`. +- `lat2Deg` — Latitude of the second point in degrees. Range: `[-90°, 90°]`. + +Les valeurs positives correspondent à la latitude nord et à la longitude Est, et les valeurs négatives à la latitude Sud et à la longitude ouest. + +**Valeur renvoyée** + +La distance entre deux points sur la surface de la Terre, en mètres. + +Génère une exception lorsque les valeurs des paramètres d'entrée se situent en dehors de la plage. + +**Exemple** + +``` sql +SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) +``` + +``` text +┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐ +│ 14132374.194975413 │ +└───────────────────────────────────────────────────────────────────┘ +``` + +## pointInEllipses {#pointinellipses} + +Vérifie si le point appartient à au moins une des ellipses. +Coordonnées géométriques sont dans le système de coordonnées Cartésiennes. + +``` sql +pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ) +``` + +**Les paramètres d'entrée** + +- `x, y` — Coordinates of a point on the plane. +- `xᵢ, yᵢ` — Coordinates of the center of the `i`-ème points de suspension. +- `aᵢ, bᵢ` — Axes of the `i`- e ellipse en unités de coordonnées x, Y. + +Les paramètres d'entrée doivent être `2+4⋅n`, où `n` est le nombre de points de suspension. + +**Valeurs renvoyées** + +`1` si le point est à l'intérieur d'au moins l'un des ellipses; `0`si elle ne l'est pas. + +**Exemple** + +``` sql +SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999) +``` + +``` text +┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐ +│ 1 │ +└─────────────────────────────────────────────────┘ +``` + +## pointtinpolygon {#pointinpolygon} + +Vérifie si le point appartient au polygone sur l'avion. + +``` sql +pointInPolygon((x, y), [(a, b), (c, d) ...], ...) +``` + +**Les valeurs d'entrée** + +- `(x, y)` — Coordinates of a point on the plane. Data type — [Tuple](../../data_types/tuple.md) — A tuple of two numbers. +- `[(a, b), (c, d) ...]` — Polygon vertices. Data type — [Tableau](../../data_types/array.md). Chaque sommet est représenté par une paire de coordonnées `(a, b)`. Les sommets doivent être spécifiés dans le sens horaire ou antihoraire. Le nombre minimum de sommets est 3. Le polygone doit être constante. +- La fonction prend également en charge les polygones avec des trous (découper des sections). Dans ce cas, ajoutez des polygones qui définissent les sections découpées en utilisant des arguments supplémentaires de la fonction. La fonction ne prend pas en charge les polygones non simplement connectés. + +**Valeurs renvoyées** + +`1` si le point est à l'intérieur du polygone, `0` si elle ne l'est pas. +Si le point est sur la limite du polygone, la fonction peut renvoyer 0 ou 1. + +**Exemple** + +``` sql +SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res +``` + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## geohashEncode {#geohashencode} + +Encode la latitude et la longitude en tant que chaîne geohash, voir (http://geohash.org/, https://en.wikipedia.org/wiki/Geohash). + +``` sql +geohashEncode(longitude, latitude, [precision]) +``` + +**Les valeurs d'entrée** + +- longitude longitude partie de la coordonnée que vous souhaitez encoder. Flottant dans la gamme`[-180°, 180°]` +- latitude latitude partie de la coordonnée que vous souhaitez encoder. Flottant dans la gamme `[-90°, 90°]` +- precision-facultatif, longueur de la chaîne codée résultante, par défaut `12`. Entier dans la gamme `[1, 12]`. Toute valeur inférieure à `1` ou supérieure à `12` silencieusement converti à `12`. + +**Valeurs renvoyées** + +- alphanumérique `String` de coordonnées codées (la version modifiée de l'alphabet de codage base32 est utilisée). + +**Exemple** + +``` sql +SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res +``` + +``` text +┌─res──────────┐ +│ ezs42d000000 │ +└──────────────┘ +``` + +## geohashDecode {#geohashdecode} + +Décode toute chaîne codée geohash en longitude et latitude. + +**Les valeurs d'entrée** + +- chaîne codée-chaîne codée geohash. + +**Valeurs renvoyées** + +- (longitude, latitude) - 2-n-uplet de `Float64` les valeurs de longitude et de latitude. + +**Exemple** + +``` sql +SELECT geohashDecode('ezs42') AS res +``` + +``` text +┌─res─────────────────────────────┐ +│ (-5.60302734375,42.60498046875) │ +└─────────────────────────────────┘ +``` + +## geoToH3 {#geotoh3} + +Retourner [H3](https://uber.github.io/h3/#/documentation/overview/introduction) point d'indice `(lon, lat)` avec une résolution spécifiée. + +[H3](https://uber.github.io/h3/#/documentation/overview/introduction) est un système d'indexation géographique où la surface de la Terre divisée en carreaux hexagonaux même. Ce système est hiérarchique, c'est-à-dire que chaque hexagone au niveau supérieur peut être divisé en sept, même mais plus petits, etc. + +Cet indice est principalement utilisé pour les emplacements de bucketing et d'autres manipulations géospatiales. + +**Syntaxe** + +``` sql +geoToH3(lon, lat, resolution) +``` + +**Paramètre** + +- `lon` — Longitude. Type: [Float64](../../data_types/float.md). +- `lat` — Latitude. Type: [Float64](../../data_types/float.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- Numéro d'indice hexagonal. +- 0 en cas d'erreur. + +Type: `UInt64`. + +**Exemple** + +Requête: + +``` sql +SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index +``` + +Résultat: + +``` text +┌────────────h3Index─┐ +│ 644325524701193974 │ +└────────────────────┘ +``` + +## geohashesInBox {#geohashesinbox} + +Renvoie un tableau de chaînes codées geohash de précision donnée qui tombent à l'intérieur et croisent les limites d'une boîte donnée, essentiellement une grille 2D aplatie en tableau. + +**Les valeurs d'entrée** + +- longitude\_min-longitude min, valeur flottante dans la plage `[-180°, 180°]` +- latitude\_min-latitude min, valeur flottante dans la plage `[-90°, 90°]` +- longitude\_max-longitude maximale, valeur flottante dans la plage `[-180°, 180°]` +- latitude\_max-latitude maximale, valeur flottante dans la plage `[-90°, 90°]` +- précision - geohash précision, `UInt8` dans la gamme `[1, 12]` + +Veuillez noter que tous les paramètres de coordonnées doit être du même type: soit `Float32` ou `Float64`. + +**Valeurs renvoyées** + +- gamme de précision de longues chaînes de geohash-boîtes couvrant la zone, vous ne devriez pas compter sur l'ordre des éléments. +- \[\] - tableau vide si *min* les valeurs de *latitude* et *longitude* ne sont pas moins de correspondant *Max* valeur. + +Veuillez noter que la fonction lancera une exception si le tableau résultant a plus de 10'000'000 éléments. + +**Exemple** + +``` sql +SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos +``` + +``` text +┌─thasos──────────────────────────────────────┐ +│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │ +└─────────────────────────────────────────────┘ +``` + +## h3GetBaseCell {#h3getbasecell} + +Renvoie le numéro de cellule de base de l'index. + +**Syntaxe** + +``` sql +h3GetBaseCell(index) +``` + +**Paramètre** + +- `index` — Hexagon index number. Type: [UInt64](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- Numéro de cellule de base hexagonale. Type: [UInt8](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT h3GetBaseCell(612916788725809151) as basecell +``` + +Résultat: + +``` text +┌─basecell─┐ +│ 12 │ +└──────────┘ +``` + +## h3HexAreaM2 {#h3hexaream2} + +Surface hexagonale Moyenne en mètres carrés à la résolution donnée. + +**Syntaxe** + +``` sql +h3HexAreaM2(resolution) +``` + +**Paramètre** + +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- Area in m². Type: [Float64](../../data_types/float.md). + +**Exemple** + +Requête: + +``` sql +SELECT h3HexAreaM2(13) as area +``` + +Résultat: + +``` text +┌─area─┐ +│ 43.9 │ +└──────┘ +``` + +## h3IndexesAreNeighbors {#h3indexesareneighbors} + +Renvoie si les H3Indexes fournis sont voisins ou non. + +**Syntaxe** + +``` sql +h3IndexesAreNeighbors(index1, index2) +``` + +**Paramètre** + +- `index1` — Hexagon index number. Type: [UInt64](../../data_types/int_uint.md). +- `index2` — Hexagon index number. Type: [UInt64](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- Retourner `1` si les index sont voisins, `0` autrement. Type: [UInt8](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n +``` + +Résultat: + +``` text +┌─n─┐ +│ 1 │ +└───┘ +``` + +## h3enfants {#h3tochildren} + +Retourne un tableau avec les index enfants de l'index donné. + +**Syntaxe** + +``` sql +h3ToChildren(index, resolution) +``` + +**Paramètre** + +- `index` — Hexagon index number. Type: [UInt64](../../data_types/int_uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- Tableau avec les index H3 enfants. Tableau de type: [UInt64](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT h3ToChildren(599405990164561919, 6) AS children +``` + +Résultat: + +``` text +┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## h3ToParent {#h3toparent} + +Renvoie l'index parent (plus grossier) contenant l'index donné. + +**Syntaxe** + +``` sql +h3ToParent(index, resolution) +``` + +**Paramètre** + +- `index` — Hexagon index number. Type: [UInt64](../../data_types/int_uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- Parent H3 index. Type: [UInt64](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT h3ToParent(599405990164561919, 3) as parent +``` + +Résultat: + +``` text +┌─────────────parent─┐ +│ 590398848891879423 │ +└────────────────────┘ +``` + +## h3ToString {#h3tostring} + +Convertit la représentation H3Index de l'index en représentation de chaîne. + +``` sql +h3ToString(index) +``` + +**Paramètre** + +- `index` — Hexagon index number. Type: [UInt64](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- Représentation en chaîne de l'index H3. Type: [Chaîne](../../data_types/string.md). + +**Exemple** + +Requête: + +``` sql +SELECT h3ToString(617420388352917503) as h3_string +``` + +Résultat: + +``` text +┌─h3_string───────┐ +│ 89184926cdbffff │ +└─────────────────┘ +``` + +## stringToH3 {#stringtoh3} + +Convertit la représentation de chaîne en représentation H3Index (UInt64). + +``` sql +stringToH3(index_str) +``` + +**Paramètre** + +- `index_str` — String representation of the H3 index. Type: [Chaîne](../../data_types/string.md). + +**Valeurs renvoyées** + +- Numéro d'indice hexagonal. Renvoie 0 en cas d'erreur. Type: [UInt64](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT stringToH3('89184926cc3ffff') as index +``` + +Résultat: + +``` text +┌──────────────index─┐ +│ 617420388351344639 │ +└────────────────────┘ +``` + +## h3grésolution {#h3getresolution} + +Retourne la résolution de l'index. + +**Syntaxe** + +``` sql +h3GetResolution(index) +``` + +**Paramètre** + +- `index` — Hexagon index number. Type: [UInt64](../../data_types/int_uint.md). + +**Valeurs renvoyées** + +- L'indice de la résolution. Gamme: `[0, 15]`. Type: [UInt8](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT h3GetResolution(617420388352917503) as res +``` + +Résultat: + +``` text +┌─res─┐ +│ 9 │ +└─────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/geo/) diff --git a/docs/fr/query_language/functions/hash_functions.md b/docs/fr/query_language/functions/hash_functions.md new file mode 100644 index 00000000000..82ea213fdcd --- /dev/null +++ b/docs/fr/query_language/functions/hash_functions.md @@ -0,0 +1,443 @@ +--- +machine_translated: true +--- + +# Les fonctions de hachage {#hash-functions} + +Les fonctions de hachage peuvent être utilisées pour le brassage pseudo-aléatoire déterministe des éléments. + +## halfMD5 {#hash-functions-halfmd5} + +[Interpréter](../../query_language/functions/type_conversion_functions.md#type_conversion_functions-reinterpretAsString) tous les paramètres d'entrée sous forme de chaînes et calcule le [MD5](https://en.wikipedia.org/wiki/MD5) la valeur de hachage pour chacun d'eux. Puis combine les hachages, prend les 8 premiers octets du hachage de la chaîne résultante, et les interprète comme `UInt64` dans l'ordre des octets big-endian. + +``` sql +halfMD5(par1, ...) +``` + +La fonction est relativement lente (5 millions de chaînes courtes par seconde par cœur de processeur). +Envisager l'utilisation de la [sipHash64](#hash_functions-siphash64) la fonction la place. + +**Paramètre** + +La fonction prend un nombre variable de paramètres d'entrée. Les paramètres peuvent être tout de la [types de données pris en charge](../../data_types/index.md). + +**Valeur Renvoyée** + +A [UInt64](../../data_types/int_uint.md) valeur de hachage du type de données. + +**Exemple** + +``` sql +SELECT halfMD5(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS halfMD5hash, toTypeName(halfMD5hash) AS type +``` + +``` text +┌────────halfMD5hash─┬─type───┐ +│ 186182704141653334 │ UInt64 │ +└────────────────────┴────────┘ +``` + +## MD5 {#hash_functions-md5} + +Calcule le MD5 à partir d'une chaîne et renvoie L'ensemble d'octets résultant en tant que FixedString(16). +Si vous n'avez pas besoin de MD5 en particulier, mais que vous avez besoin d'un hachage cryptographique 128 bits décent, utilisez le ‘sipHash128’ la fonction la place. +Si vous voulez obtenir le même résultat que la sortie de l'utilitaire md5sum, utilisez lower (hex(MD5 (s))). + +## sipHash64 {#hash_functions-siphash64} + +Produit un 64 bits [SipHash](https://131002.net/siphash/) la valeur de hachage. + +``` sql +sipHash64(par1,...) +``` + +C'est une fonction de hachage cryptographique. Il fonctionne au moins trois fois plus vite que le [MD5](#hash_functions-md5) fonction. + +Fonction [interpréter](../../query_language/functions/type_conversion_functions.md#type_conversion_functions-reinterpretAsString) tous les paramètres d'entrée sous forme de chaînes et calcule la valeur de hachage pour chacun d'eux. Puis combine les hachages par l'algorithme suivant: + +1. Après avoir haché tous les paramètres d'entrée, la fonction obtient le tableau de hachages. +2. La fonction prend le premier et le second éléments et calcule un hachage pour le tableau d'entre eux. +3. Ensuite, la fonction prend la valeur de hachage, calculée à l'étape précédente, et le troisième élément du tableau de hachage initial, et calcule un hachage pour le tableau d'entre eux. +4. L'étape précédente est répétée pour tous les éléments restants de la période initiale de hachage tableau. + +**Paramètre** + +La fonction prend un nombre variable de paramètres d'entrée. Les paramètres peuvent être tout de la [types de données pris en charge](../../data_types/index.md). + +**Valeur Renvoyée** + +A [UInt64](../../data_types/int_uint.md) valeur de hachage du type de données. + +**Exemple** + +``` sql +SELECT sipHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS SipHash, toTypeName(SipHash) AS type +``` + +``` text +┌──────────────SipHash─┬─type───┐ +│ 13726873534472839665 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## sipHash128 {#hash_functions-siphash128} + +Calcule SipHash à partir d'une chaîne. +Accepte un argument de type chaîne. Renvoie FixedString (16). +Diffère de sipHash64 en ce que l'état de pliage xor final n'est effectué que jusqu'à 128 bits. + +## cityHash64 {#cityhash64} + +Produit un 64 bits [CityHash](https://github.com/google/cityhash) la valeur de hachage. + +``` sql +cityHash64(par1,...) +``` + +Ceci est une fonction de hachage non cryptographique rapide. Il utilise L'algorithme CityHash pour les paramètres de chaîne et la fonction de hachage rapide non cryptographique spécifique à l'implémentation pour les paramètres avec d'autres types de données. La fonction utilise le combinateur CityHash pour obtenir les résultats finaux. + +**Paramètre** + +La fonction prend un nombre variable de paramètres d'entrée. Les paramètres peuvent être tout de la [types de données pris en charge](../../data_types/index.md). + +**Valeur Renvoyée** + +A [UInt64](../../data_types/int_uint.md) valeur de hachage du type de données. + +**Exemple** + +Appelez exemple: + +``` sql +SELECT cityHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS CityHash, toTypeName(CityHash) AS type +``` + +``` text +┌─────────────CityHash─┬─type───┐ +│ 12072650598913549138 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +L'exemple suivant montre comment calculer la somme de l'ensemble de la table avec précision jusqu'à la ligne de commande: + +``` sql +SELECT groupBitXor(cityHash64(*)) FROM table +``` + +## intHash32 {#inthash32} + +Calcule un code de hachage 32 bits à partir de n'importe quel type d'entier. +C'est une fonction de hachage non cryptographique relativement rapide de qualité moyenne pour les nombres. + +## intHash64 {#inthash64} + +Calcule un code de hachage 64 bits à partir de n'importe quel type d'entier. +Il fonctionne plus vite que intHash32. Qualité moyenne. + +## SHA1 {#sha1} + +## SHA224 {#sha224} + +## SHA256 {#sha256} + +Calcule SHA-1, SHA-224 ou SHA-256 à partir d'une chaîne et renvoie l'ensemble d'octets résultant en tant que FixedString(20), FixedString(28) ou FixedString(32). +La fonction fonctionne assez lentement (SHA-1 traite environ 5 millions de chaînes courtes par seconde par cœur de processeur, tandis que SHA-224 et SHA-256 traitent environ 2,2 millions). +Nous vous recommandons d'utiliser cette fonction uniquement dans les cas où vous avez besoin d'une fonction de hachage spécifique et que vous ne pouvez pas la sélectionner. +Même dans ces cas, nous vous recommandons d'appliquer la fonction hors ligne et de pré-calculer les valeurs lors de leur insertion dans la table, au lieu de l'appliquer dans SELECTS. + +## URLHash(url \[, N\]) {#urlhashurl-n} + +Une fonction de hachage non cryptographique rapide et de qualité décente pour une chaîne obtenue à partir d'une URL en utilisant un type de normalisation. +`URLHash(s)` – Calculates a hash from a string without one of the trailing symbols `/`,`?` ou `#` à la fin, si elle est présente. +`URLHash(s, N)` – Calculates a hash from a string up to the N level in the URL hierarchy, without one of the trailing symbols `/`,`?` ou `#` à la fin, si elle est présente. +Les niveaux sont les mêmes que dans URLHierarchy. Cette fonction est spécifique à Yandex.Metrica. + +## farmHash64 {#farmhash64} + +Produit un 64 bits [FarmHash](https://github.com/google/farmhash) la valeur de hachage. + +``` sql +farmHash64(par1, ...) +``` + +La fonction utilise le `Hash64` la méthode de tous les [les méthodes disponibles](https://github.com/google/farmhash/blob/master/src/farmhash.h). + +**Paramètre** + +La fonction prend un nombre variable de paramètres d'entrée. Les paramètres peuvent être tout de la [types de données pris en charge](../../data_types/index.md). + +**Valeur Renvoyée** + +A [UInt64](../../data_types/int_uint.md) valeur de hachage du type de données. + +**Exemple** + +``` sql +SELECT farmHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS FarmHash, toTypeName(FarmHash) AS type +``` + +``` text +┌─────────────FarmHash─┬─type───┐ +│ 17790458267262532859 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## javaHash {#hash_functions-javahash} + +Calculer [JavaHash](http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/String.java#l1452) à partir d'une chaîne. Cette fonction de hachage n'est ni rapide ni de bonne qualité. La seule raison de l'utiliser est lorsque cet algorithme est déjà utilisé dans un autre système et que vous devez calculer exactement le même résultat. + +**Syntaxe** + +``` sql +SELECT javaHash(''); +``` + +**Valeur renvoyée** + +A `Int32` valeur de hachage du type de données. + +**Exemple** + +Requête: + +``` sql +SELECT javaHash('Hello, world!'); +``` + +Résultat: + +``` text +┌─javaHash('Hello, world!')─┐ +│ -1880044555 │ +└───────────────────────────┘ +``` + +## javaHashUTF16LE {#javahashutf16le} + +Calculer [JavaHash](http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/String.java#l1452) à partir d'une chaîne, en supposant qu'elle contient des octets représentant une chaîne en encodage UTF-16LE. + +**Syntaxe** + +``` sql +javaHashUTF16LE(stringUtf16le) +``` + +**Paramètre** + +- `stringUtf16le` — a string in UTF-16LE encoding. + +**Valeur renvoyée** + +A `Int32` valeur de hachage du type de données. + +**Exemple** + +Requête correcte avec une chaîne codée UTF-16LE. + +Requête: + +``` sql +SELECT javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le')) +``` + +Résultat: + +``` text +┌─javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))─┐ +│ 3556498 │ +└──────────────────────────────────────────────────────────────┘ +``` + +## hiveHash {#hash-functions-hivehash} + +Calculer `HiveHash` à partir d'une chaîne. + +``` sql +SELECT hiveHash(''); +``` + +C'est juste [JavaHash](#hash_functions-javahash) avec le bit de signe mis à zéro. Cette fonction est utilisée dans [Apache Hive](https://en.wikipedia.org/wiki/Apache_Hive) pour les versions antérieures à la version 3.0. Cette fonction de hachage n'est ni rapide ni de bonne qualité. La seule raison de l'utiliser est lorsque cet algorithme est déjà utilisé dans un autre système et que vous devez calculer exactement le même résultat. + +**Valeur renvoyée** + +A `Int32` valeur de hachage du type de données. + +Type: `hiveHash`. + +**Exemple** + +Requête: + +``` sql +SELECT hiveHash('Hello, world!'); +``` + +Résultat: + +``` text +┌─hiveHash('Hello, world!')─┐ +│ 267439093 │ +└───────────────────────────┘ +``` + +## metroHash64 {#metrohash64} + +Produit un 64 bits [MetroHash](http://www.jandrewrogers.com/2015/05/27/metrohash/) la valeur de hachage. + +``` sql +metroHash64(par1, ...) +``` + +**Paramètre** + +La fonction prend un nombre variable de paramètres d'entrée. Les paramètres peuvent être tout de la [types de données pris en charge](../../data_types/index.md). + +**Valeur Renvoyée** + +A [UInt64](../../data_types/int_uint.md) valeur de hachage du type de données. + +**Exemple** + +``` sql +SELECT metroHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MetroHash, toTypeName(MetroHash) AS type +``` + +``` text +┌────────────MetroHash─┬─type───┐ +│ 14235658766382344533 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## jumpConsistentHash {#jumpconsistenthash} + +Calcule JumpConsistentHash forme un UInt64. +Accepte deux arguments: une clé de type UInt64 et le nombre de compartiments. Renvoie Int32. +Pour plus d'informations, voir le lien: [JumpConsistentHash](https://arxiv.org/pdf/1406.2294.pdf) + +## murmurHash2\_32, murmurHash2\_64 {#murmurhash2-32-murmurhash2-64} + +Produit un [MurmurHash2](https://github.com/aappleby/smhasher) la valeur de hachage. + +``` sql +murmurHash2_32(par1, ...) +murmurHash2_64(par1, ...) +``` + +**Paramètre** + +Les deux fonctions prennent un nombre variable de paramètres d'entrée. Les paramètres peuvent être tout de la [types de données pris en charge](../../data_types/index.md). + +**Valeur Renvoyée** + +- Le `murmurHash2_32` fonction renvoie la valeur de hachage ayant le [UInt32](../../data_types/int_uint.md) type de données. +- Le `murmurHash2_64` fonction renvoie la valeur de hachage ayant le [UInt64](../../data_types/int_uint.md) type de données. + +**Exemple** + +``` sql +SELECT murmurHash2_64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash2, toTypeName(MurmurHash2) AS type +``` + +``` text +┌──────────MurmurHash2─┬─type───┐ +│ 11832096901709403633 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## murmurHash3\_32, murmurHash3\_64 {#murmurhash3-32-murmurhash3-64} + +Produit un [MurmurHash3](https://github.com/aappleby/smhasher) la valeur de hachage. + +``` sql +murmurHash3_32(par1, ...) +murmurHash3_64(par1, ...) +``` + +**Paramètre** + +Les deux fonctions prennent un nombre variable de paramètres d'entrée. Les paramètres peuvent être tout de la [types de données pris en charge](../../data_types/index.md). + +**Valeur Renvoyée** + +- Le `murmurHash3_32` la fonction retourne un [UInt32](../../data_types/int_uint.md) valeur de hachage du type de données. +- Le `murmurHash3_64` la fonction retourne un [UInt64](../../data_types/int_uint.md) valeur de hachage du type de données. + +**Exemple** + +``` sql +SELECT murmurHash3_32(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash3, toTypeName(MurmurHash3) AS type +``` + +``` text +┌─MurmurHash3─┬─type───┐ +│ 2152717 │ UInt32 │ +└─────────────┴────────┘ +``` + +## murmurHash3\_128 {#murmurhash3-128} + +Produit de 128 bits [MurmurHash3](https://github.com/aappleby/smhasher) la valeur de hachage. + +``` sql +murmurHash3_128( expr ) +``` + +**Paramètre** + +- `expr` — [Expression](../syntax.md#syntax-expressions) de retour d'un [Chaîne](../../data_types/string.md)-le type de la valeur. + +**Valeur Renvoyée** + +A [FixedString (16)](../../data_types/fixedstring.md) valeur de hachage du type de données. + +**Exemple** + +``` sql +SELECT murmurHash3_128('example_string') AS MurmurHash3, toTypeName(MurmurHash3) AS type +``` + +``` text +┌─MurmurHash3──────┬─type────────────┐ +│ 6�1�4"S5KT�~~q │ FixedString(16) │ +└──────────────────┴─────────────────┘ +``` + +## xxHash32, xxHash64 {#hash-functions-xxhash32} + +Calculer `xxHash` à partir d'une chaîne. Il est proposé en deux saveurs, 32 et 64 bits. + +``` sql +SELECT xxHash32(''); + +OR + +SELECT xxHash64(''); +``` + +**Valeur renvoyée** + +A `Uint32` ou `Uint64` valeur de hachage du type de données. + +Type: `xxHash`. + +**Exemple** + +Requête: + +``` sql +SELECT xxHash32('Hello, world!'); +``` + +Résultat: + +``` text +┌─xxHash32('Hello, world!')─┐ +│ 834093149 │ +└───────────────────────────┘ +``` + +**Voir Aussi** + +- [xxHash](http://cyan4973.github.io/xxHash/). + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/hash_functions/) diff --git a/docs/fr/query_language/functions/higher_order_functions.md b/docs/fr/query_language/functions/higher_order_functions.md new file mode 100644 index 00000000000..6abdb7d4280 --- /dev/null +++ b/docs/fr/query_language/functions/higher_order_functions.md @@ -0,0 +1,261 @@ +--- +machine_translated: true +--- + +# Fonctions d'ordre supérieur {#higher-order-functions} + +## `->` opérateur, fonction lambda (params, expr) {#operator-lambdaparams-expr-function} + +Allows describing a lambda function for passing to a higher-order function. The left side of the arrow has a formal parameter, which is any ID, or multiple formal parameters – any IDs in a tuple. The right side of the arrow has an expression that can use these formal parameters, as well as any table columns. + +Exemple: `x -> 2 * x, str -> str != Referer.` + +Les fonctions d'ordre supérieur ne peuvent accepter que les fonctions lambda comme argument fonctionnel. + +Une fonction lambda qui accepte plusieurs arguments peuvent être passés à une fonction d'ordre supérieur. Dans ce cas, la fonction d'ordre supérieur est passé plusieurs tableaux de longueur identique que ces arguments correspondent. + +Pour certaines fonctions, telles que [arrayCount](#higher_order_functions-array-count) ou [arraySum](#higher_order_functions-array-count) le premier argument (la fonction lambda) peut être omis. Dans ce cas, un mappage identique est supposé. + +Une fonction lambda ne peut pas être omise pour les fonctions suivantes: + +- [arrayMap](#higher_order_functions-array-map) +- [arrayFilter](#higher_order_functions-array-filter) +- [arrayFill](#higher_order_functions-array-fill) +- [arrayReverseFill](#higher_order_functions-array-reverse-fill) +- [arraySplit](#higher_order_functions-array-split) +- [arrayReverseSplit](#higher_order_functions-array-reverse-split) +- [arrayFirst](#higher_order_functions-array-first) +- [arrayFirstIndex](#higher_order_functions-array-first-index) + +### arrayMap(func, arr1, …) {#higher_order_functions-array-map} + +Renvoie un tableau obtenu à partir de l'application d'origine `func` fonction à chaque élément dans le `arr` tableau. + +Exemple: + +``` sql +SELECT arrayMap(x -> (x + 2), [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [3,4,5] │ +└─────────┘ +``` + +L'exemple suivant montre comment créer un n-uplet d'éléments de différents tableaux: + +``` sql +SELECT arrayMap((x, y) -> (x, y), [1, 2, 3], [4, 5, 6]) AS res +``` + +``` text +┌─res─────────────────┐ +│ [(1,4),(2,5),(3,6)] │ +└─────────────────────┘ +``` + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arrayMap` fonction. + +### arrayFilter(func, arr1, …) {#higher_order_functions-array-filter} + +Renvoie un tableau contenant uniquement les éléments `arr1` pour ce qui `func` retourne autre chose que 0. + +Exemple: + +``` sql +SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res +``` + +``` text +┌─res───────────┐ +│ ['abc World'] │ +└───────────────┘ +``` + +``` sql +SELECT + arrayFilter( + (i, x) -> x LIKE '%World%', + arrayEnumerate(arr), + ['Hello', 'abc World'] AS arr) + AS res +``` + +``` text +┌─res─┐ +│ [2] │ +└─────┘ +``` + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arrayFilter` fonction. + +### arrayFill(func, arr1, …) {#higher_order_functions-array-fill} + +Analyse par le biais de `arr1` du premier élément au dernier élément et remplacer `arr1[i]` par `arr1[i - 1]` si `func` renvoie 0. Le premier élément de `arr1` ne sera pas remplacé. + +Exemple: + +``` sql +SELECT arrayFill(x -> not isNull(x), [1, null, 3, 11, 12, null, null, 5, 6, 14, null, null]) AS res +``` + +``` text +┌─res──────────────────────────────┐ +│ [1,1,3,11,12,12,12,5,6,14,14,14] │ +└──────────────────────────────────┘ +``` + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arrayFill` fonction. + +### arrayReverseFill(func, arr1, …) {#higher_order_functions-array-reverse-fill} + +Analyse par le biais de `arr1` du dernier élément au premier élément et remplacer `arr1[i]` par `arr1[i + 1]` si `func` renvoie 0. Le dernier élément de `arr1` ne sera pas remplacé. + +Exemple: + +``` sql +SELECT arrayReverseFill(x -> not isNull(x), [1, null, 3, 11, 12, null, null, 5, 6, 14, null, null]) AS res +``` + +``` text +┌─res────────────────────────────────┐ +│ [1,3,3,11,12,5,5,5,6,14,NULL,NULL] │ +└────────────────────────────────────┘ +``` + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arrayReverseFill` fonction. + +### arraySplit(func, arr1, …) {#higher_order_functions-array-split} + +Split `arr1` en plusieurs tableaux. Lorsque `func` retourne autre chose que 0, la matrice sera de split sur le côté gauche de l'élément. Le tableau ne sera pas partagé avant le premier élément. + +Exemple: + +``` sql +SELECT arraySplit((x, y) -> y, [1, 2, 3, 4, 5], [1, 0, 0, 1, 0]) AS res +``` + +``` text +┌─res─────────────┐ +│ [[1,2,3],[4,5]] │ +└─────────────────┘ +``` + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arraySplit` fonction. + +### arrayReverseSplit(func, arr1, …) {#higher_order_functions-array-reverse-split} + +Split `arr1` en plusieurs tableaux. Lorsque `func` retourne autre chose que 0, la matrice sera de split sur le côté droit de l'élément. Le tableau ne sera pas divisé après le dernier élément. + +Exemple: + +``` sql +SELECT arrayReverseSplit((x, y) -> y, [1, 2, 3, 4, 5], [1, 0, 0, 1, 0]) AS res +``` + +``` text +┌─res───────────────┐ +│ [[1],[2,3,4],[5]] │ +└───────────────────┘ +``` + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arraySplit` fonction. + +### arrayCount(\[func,\] arr1, …) {#higher_order_functions-array-count} + +Renvoie le nombre d'éléments dans l'arr tableau pour lequel func renvoie autre chose que 0. Si ‘func’ n'est pas spécifié, il renvoie le nombre d'éléments non nuls dans le tableau. + +### arrayExists(\[func,\] arr1, …) {#arrayexistsfunc-arr1} + +Renvoie 1 s'il existe au moins un élément ‘arr’ pour ce qui ‘func’ retourne autre chose que 0. Sinon, il renvoie 0. + +### arrayAll(\[func,\] arr1, …) {#arrayallfunc-arr1} + +Renvoie 1 si ‘func’ retourne autre chose que 0 pour tous les éléments de ‘arr’. Sinon, il renvoie 0. + +### arraySum(\[func,\] arr1, …) {#higher-order-functions-array-sum} + +Renvoie la somme de la ‘func’ valeur. Si la fonction est omise, elle retourne la somme des éléments du tableau. + +### arrayFirst(func, arr1, …) {#higher_order_functions-array-first} + +Renvoie le premier élément du ‘arr1’ tableau pour lequel ‘func’ retourne autre chose que 0. + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arrayFirst` fonction. + +### arrayFirstIndex(func, arr1, …) {#higher_order_functions-array-first-index} + +Renvoie l'index du premier élément de la ‘arr1’ tableau pour lequel ‘func’ retourne autre chose que 0. + +Notez que le premier argument (fonction lambda) ne peut pas être omis dans le `arrayFirstIndex` fonction. + +### arrayCumSum(\[func,\] arr1, …) {#arraycumsumfunc-arr1} + +Retourne un tableau des sommes partielles d'éléments dans le tableau source (une somme). Si l' `func` la fonction est spécifiée, les valeurs des éléments du tableau sont convertis par cette fonction avant l'addition. + +Exemple: + +``` sql +SELECT arrayCumSum([1, 1, 1, 1]) AS res +``` + +``` text +┌─res──────────┐ +│ [1, 2, 3, 4] │ +└──────────────┘ +``` + +### arrayCumSumNonNegative (arr) {#arraycumsumnonnegativearr} + +Même que `arrayCumSum`, renvoie un tableau des sommes partielles d'éléments dans le tableau source (une somme). Différent `arrayCumSum`, lorsque la valeur renvoyée contient une valeur inférieure à zéro, la valeur est remplacée par zéro et le calcul ultérieur est effectué avec des paramètres zéro. Exemple: + +``` sql +SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res +``` + +``` text +┌─res───────┐ +│ [1,2,0,1] │ +└───────────┘ +``` + +### arraySort(\[func,\] arr1, …) {#arraysortfunc-arr1} + +Renvoie un tableau à la suite du tri des éléments de `arr1` dans l'ordre croissant. Si l' `func` la fonction est spécifiée, l'ordre de classement est déterminé par le résultat de la fonction `func` appliquée aux éléments du tableau (tableaux) + +Le [Transformation schwartzienne](https://en.wikipedia.org/wiki/Schwartzian_transform) est utilisé pour améliorer l'efficacité du tri. + +Exemple: + +``` sql +SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]); +``` + +``` text +┌─res────────────────┐ +│ ['world', 'hello'] │ +└────────────────────┘ +``` + +Pour plus d'informations sur la `arraySort` la méthode, voir l' [Fonctions pour travailler avec des tableaux](array_functions.md#array_functions-sort) section. + +### arrayReverseSort(\[func,\] arr1, …) {#arrayreversesortfunc-arr1} + +Renvoie un tableau à la suite du tri des éléments de `arr1` dans l'ordre décroissant. Si l' `func` la fonction est spécifiée, l'ordre de classement est déterminé par le résultat de la fonction `func` appliquée aux éléments du tableau (tableaux). + +Exemple: + +``` sql +SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; +``` + +``` text +┌─res───────────────┐ +│ ['hello','world'] │ +└───────────────────┘ +``` + +Pour plus d'informations sur la `arrayReverseSort` la méthode, voir l' [Fonctions pour travailler avec des tableaux](array_functions.md#array_functions-reverse-sort) section. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/higher_order_functions/) diff --git a/docs/fr/query_language/functions/in_functions.md b/docs/fr/query_language/functions/in_functions.md new file mode 100644 index 00000000000..aa9b9b04e8c --- /dev/null +++ b/docs/fr/query_language/functions/in_functions.md @@ -0,0 +1,23 @@ +--- +machine_translated: true +--- + +# Fonctions pour la mise en œuvre de l'opérateur {#functions-for-implementing-the-in-operator} + +## in, notin, globalIn, globalNotIn {#in-functions} + +Voir la section [Dans les opérateurs](../select.md#select-in-operators). + +## tuple(x, y, …), operator (x, y, …) {#tuplex-y-operator-x-y} + +Une fonction qui permet de regrouper plusieurs colonnes. +For columns with the types T1, T2, …, it returns a Tuple(T1, T2, …) type tuple containing these columns. There is no cost to execute the function. +Les Tuples sont normalement utilisés comme valeurs intermédiaires pour un argument D'opérateurs IN, ou pour créer une liste de paramètres formels de fonctions lambda. Les Tuples ne peuvent pas être écrits sur une table. + +## tupleElement (tuple, n), opérateur X. N {#tupleelementtuple-n-operator-x-n} + +Une fonction qui permet d'obtenir une colonne à partir d'un tuple. +‘N’ est l'index de colonne, à partir de 1. N doit être une constante. ‘N’ doit être une constante. ‘N’ doit être un entier postif strict ne dépassant pas la taille du tuple. +Il n'y a aucun coût pour exécuter la fonction. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/in_functions/) diff --git a/docs/fr/query_language/functions/index.md b/docs/fr/query_language/functions/index.md new file mode 100644 index 00000000000..717d0605656 --- /dev/null +++ b/docs/fr/query_language/functions/index.md @@ -0,0 +1,70 @@ +--- +machine_translated: true +--- + +# Fonction {#functions} + +Il y a au moins\* deux types de fonctions - des fonctions régulières (elles sont simplement appelées “functions”) and aggregate functions. These are completely different concepts. Regular functions work as if they are applied to each row separately (for each row, the result of the function doesn't depend on the other rows). Aggregate functions accumulate a set of values from various rows (i.e. they depend on the entire set of rows). + +Dans cette section, nous discutons des fonctions classiques. Pour les fonctions d'agrégation, voir la section “Aggregate functions”. + +\* - Il existe un troisième type de fonction ‘arrayJoin’ la fonction appartient à; les fonctions de table peuvent également être mentionnées séparément.\* + +## Typage fort {#strong-typing} + +Contrairement à SQL standard, ClickHouse a une forte typage. En d'autres termes, il ne fait pas de conversions implicites entre les types. Chaque fonction fonctionne pour un ensemble spécifique de types. Cela signifie que vous devez parfois utiliser des fonctions de conversion de type. + +## Élimination des sous-expressions courantes {#common-subexpression-elimination} + +Toutes les expressions d'une requête qui ont le même AST (le même enregistrement ou le même résultat d'analyse syntaxique) sont considérées comme ayant des valeurs identiques. De telles expressions sont concaténées et exécutées une fois. Les sous-requêtes identiques sont également éliminées de cette façon. + +## Types de résultats {#types-of-results} + +Toutes les fonctions renvoient un seul retour comme résultat (pas plusieurs valeurs, et pas des valeurs nulles). Le type de résultat est généralement défini uniquement par les types d'arguments, pas par les valeurs. Les Exceptions sont la fonction tupleElement (l'opérateur A. N) et la fonction toFixedString. + +## Constant {#constants} + +Pour simplifier, certaines fonctions ne peuvent fonctionner qu'avec des constantes pour certains arguments. Par exemple, le bon argument de L'opérateur LIKE doit être une constante. +Presque toutes les fonctions renvoient une constante pour des arguments constants. L'exception est les fonctions qui génèrent des nombres aléatoires. +Le ‘now’ function renvoie des valeurs différentes pour les requêtes qui ont été exécutées à des moments différents, mais le résultat est considéré comme une constante, car la constance n'est importante que dans une seule requête. +Une expression constante est également considérée comme une constante (par exemple, la moitié droite de L'opérateur LIKE peut être construite à partir de plusieurs constantes). + +Les fonctions peuvent être implémentées de différentes manières pour des arguments constants et non constants (un code différent est exécuté). Mais les résultats pour une constante et pour une colonne vraie Ne contenant que la même valeur doivent correspondre les uns aux autres. + +## Le traitement NULL {#null-processing} + +Les fonctions ont les comportements suivants: + +- Si au moins l'un des arguments de la fonction est `NULL` le résultat de la fonction est également `NULL`. +- Comportement spécial spécifié individuellement dans la description de chaque fonction. Dans le code source de ClickHouse, ces fonctions ont `UseDefaultImplementationForNulls=false`. + +## Constance {#constancy} + +Functions can't change the values of their arguments – any changes are returned as the result. Thus, the result of calculating separate functions does not depend on the order in which the functions are written in the query. + +## Erreur de manipulation {#error-handling} + +Certaines fonctions peuvent lancer une exception si les données ne sont pas valides. Dans ce cas, la requête est annulée et un message d'erreur est retourné au client. Pour le traitement distribué, lorsqu'une exception se produit sur l'un des serveurs, les autres serveurs aussi tenté d'interrompre la requête. + +## Évaluation des expressions d'argument {#evaluation-of-argument-expressions} + +Dans presque tous les langages de programmation, l'un des arguments peut pas être évalué pour certains opérateurs. Ce sont généralement les opérateurs `&&`, `||`, et `?:`. +Mais dans ClickHouse, les arguments des fonctions (opérateurs) sont toujours évalués. En effet, des parties entières de colonnes sont évaluées à la fois, au lieu de calculer chaque ligne séparément. + +## Exécution de fonctions pour le traitement de requêtes distribuées {#performing-functions-for-distributed-query-processing} + +Pour le traitement de requête distribué, autant d'étapes de traitement de requête que possible sont effectuées sur des serveurs distants, et le reste des étapes (fusion des résultats intermédiaires et tout ce qui suit) sont effectuées sur le serveur demandeur. + +Cela signifie que les fonctions peuvent être effectuées sur différents serveurs. +Par exemple, dans la requête `SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),` + +- si un `distributed_table` a au moins deux fragments, les fonctions ‘g’ et ‘h’ sont effectuées sur des serveurs distants, et la fonction ‘f’ est effectuée sur le serveur demandeur. +- si un `distributed_table` a un seul fragment, tous les ‘f’, ‘g’, et ‘h’ les fonctions sont exécutées sur le serveur de ce fragment. + +Le résultat d'une fonction habituellement ne dépendent pas le serveur sur lequel elle est exécutée. Cependant, parfois c'est important. +Par exemple, les fonctions qui fonctionnent avec des dictionnaires utilisent le dictionnaire qui existe sur le serveur sur lequel elles s'exécutent. +Un autre exemple est l' `hostName` fonction, qui renvoie le nom du serveur sur lequel il s'exécute afin de `GROUP BY` par les serveurs dans un `SELECT` requête. + +Si une fonction dans une requête est effectuée sur le demandeur serveur, mais vous devez l'exécuter sur des serveurs distants, vous pouvez l'envelopper dans un ‘any’ fonction d'agrégation ou l'ajouter à une clé dans `GROUP BY`. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/) diff --git a/docs/fr/query_language/functions/introspection.md b/docs/fr/query_language/functions/introspection.md new file mode 100644 index 00000000000..e724c155d51 --- /dev/null +++ b/docs/fr/query_language/functions/introspection.md @@ -0,0 +1,307 @@ +--- +machine_translated: true +--- + +# Fonctions D'Introspection {#introspection-functions} + +Vous pouvez utiliser les fonctions décrites dans ce chapitre pour introspecter [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) et [DWARF](https://en.wikipedia.org/wiki/DWARF) pour le profilage de requête. + +!!! warning "Avertissement" + Ces fonctions sont lentes et peuvent imposer des considérations de sécurité. + +Pour le bon fonctionnement des fonctions d'introspection: + +- Installer le `clickhouse-common-static-dbg` paquet. + +- Définir le [allow\_introspection\_functions](../../operations/settings/settings.md#settings-allow_introspection_functions) réglage sur 1. + + For security reasons introspection functions are disabled by default. + +Clickhouse enregistre les rapports du profileur [trace\_log](../../operations/system_tables.md#system_tables-trace_log) système de table. Assurez-vous que la table et le profileur sont correctement configurés. + +## addressToLine {#addresstoline} + +Convertit l'adresse de mémoire virtuelle dans le processus de serveur ClickHouse en nom de fichier et en numéro de ligne dans le code source de ClickHouse. + +Si vous utilisez des paquets clickhouse officiels, vous devez installer le `clickhouse-common-static-dbg` paquet. + +**Syntaxe** + +``` sql +addressToLine(address_of_binary_instruction) +``` + +**Paramètre** + +- `address_of_binary_instruction` ([UInt64](../../data_types/int_uint.md)) — Address of instruction in a running process. + +**Valeur renvoyée** + +- Nom de fichier du code Source et le numéro de ligne dans ce fichier délimité par deux-points. + + For example, `/build/obj-x86_64-linux-gnu/../dbms/src/Common/ThreadPool.cpp:199`, where `199` is a line number. + +- Nom d'un binaire, si la fonction n'a pas pu trouver les informations de débogage. + +- Chaîne vide, si l'adresse n'est pas valide. + +Type: [Chaîne](../../data_types/string.md). + +**Exemple** + +Activation des fonctions d'introspection: + +``` sql +SET allow_introspection_functions=1 +``` + +Sélection de la première chaîne de `trace_log` système de table: + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G +``` + +``` text +Row 1: +────── +event_date: 2019-11-19 +event_time: 2019-11-19 18:57:23 +revision: 54429 +timer_type: Real +thread_number: 48 +query_id: 421b6855-1858-45a5-8f37-f383409d6d72 +trace: [140658411141617,94784174532828,94784076370703,94784076372094,94784076361020,94784175007680,140658411116251,140658403895439] +``` + +Le `trace` champ contient la trace de pile au moment de l'échantillonnage. + +Obtenir le nom de fichier du code source et le numéro de ligne pour une seule adresse: + +``` sql +SELECT addressToLine(94784076370703) \G +``` + +``` text +Row 1: +────── +addressToLine(94784076370703): /build/obj-x86_64-linux-gnu/../dbms/src/Common/ThreadPool.cpp:199 +``` + +Application de la fonction à la trace de la pile entière: + +``` sql +SELECT + arrayStringConcat(arrayMap(x -> addressToLine(x), trace), '\n') AS trace_source_code_lines +FROM system.trace_log +LIMIT 1 +\G +``` + +Le [arrayMap](higher_order_functions.md#higher_order_functions-array-map) permet de traiter chaque élément individuel de l' `trace` tableau par la `addressToLine` fonction. Le résultat de ce traitement que vous voyez dans l' `trace_source_code_lines` colonne de sortie. + +``` text +Row 1: +────── +trace_source_code_lines: /lib/x86_64-linux-gnu/libpthread-2.27.so +/usr/lib/debug/usr/bin/clickhouse +/build/obj-x86_64-linux-gnu/../dbms/src/Common/ThreadPool.cpp:199 +/build/obj-x86_64-linux-gnu/../dbms/src/Common/ThreadPool.h:155 +/usr/include/c++/9/bits/atomic_base.h:551 +/usr/lib/debug/usr/bin/clickhouse +/lib/x86_64-linux-gnu/libpthread-2.27.so +/build/glibc-OTsEL5/glibc-2.27/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:97 +``` + +## adressetosymbol {#addresstosymbol} + +Convertit l'adresse de mémoire virtuelle dans le processus de serveur ClickHouse en symbole à partir des fichiers d'objets ClickHouse. + +**Syntaxe** + +``` sql +addressToSymbol(address_of_binary_instruction) +``` + +**Paramètre** + +- `address_of_binary_instruction` ([UInt64](../../data_types/int_uint.md)) — Address of instruction in a running process. + +**Valeur renvoyée** + +- Symbole des fichiers D'objets ClickHouse. +- Chaîne vide, si l'adresse n'est pas valide. + +Type: [Chaîne](../../data_types/string.md). + +**Exemple** + +Activation des fonctions d'introspection: + +``` sql +SET allow_introspection_functions=1 +``` + +Sélection de la première chaîne de `trace_log` système de table: + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G +``` + +``` text +Row 1: +────── +event_date: 2019-11-20 +event_time: 2019-11-20 16:57:59 +revision: 54429 +timer_type: Real +thread_number: 48 +query_id: 724028bf-f550-45aa-910d-2af6212b94ac +trace: [94138803686098,94138815010911,94138815096522,94138815101224,94138815102091,94138814222988,94138806823642,94138814457211,94138806823642,94138814457211,94138806823642,94138806795179,94138806796144,94138753770094,94138753771646,94138753760572,94138852407232,140399185266395,140399178045583] +``` + +Le `trace` champ contient la trace de pile au moment de l'échantillonnage. + +Obtenir un symbole pour une seule adresse: + +``` sql +SELECT addressToSymbol(94138803686098) \G +``` + +``` text +Row 1: +────── +addressToSymbol(94138803686098): _ZNK2DB24IAggregateFunctionHelperINS_20AggregateFunctionSumImmNS_24AggregateFunctionSumDataImEEEEE19addBatchSinglePlaceEmPcPPKNS_7IColumnEPNS_5ArenaE +``` + +Application de la fonction à la trace de la pile entière: + +``` sql +SELECT + arrayStringConcat(arrayMap(x -> addressToSymbol(x), trace), '\n') AS trace_symbols +FROM system.trace_log +LIMIT 1 +\G +``` + +Le [arrayMap](higher_order_functions.md#higher_order_functions-array-map) permet de traiter chaque élément individuel de l' `trace` tableau par la `addressToSymbols` fonction. Le résultat de ce traitement que vous voyez dans l' `trace_symbols` colonne de sortie. + +``` text +Row 1: +────── +trace_symbols: _ZNK2DB24IAggregateFunctionHelperINS_20AggregateFunctionSumImmNS_24AggregateFunctionSumDataImEEEEE19addBatchSinglePlaceEmPcPPKNS_7IColumnEPNS_5ArenaE +_ZNK2DB10Aggregator21executeWithoutKeyImplERPcmPNS0_28AggregateFunctionInstructionEPNS_5ArenaE +_ZN2DB10Aggregator14executeOnBlockESt6vectorIN3COWINS_7IColumnEE13immutable_ptrIS3_EESaIS6_EEmRNS_22AggregatedDataVariantsERS1_IPKS3_SaISC_EERS1_ISE_SaISE_EERb +_ZN2DB10Aggregator14executeOnBlockERKNS_5BlockERNS_22AggregatedDataVariantsERSt6vectorIPKNS_7IColumnESaIS9_EERS6_ISB_SaISB_EERb +_ZN2DB10Aggregator7executeERKSt10shared_ptrINS_17IBlockInputStreamEERNS_22AggregatedDataVariantsE +_ZN2DB27AggregatingBlockInputStream8readImplEv +_ZN2DB17IBlockInputStream4readEv +_ZN2DB26ExpressionBlockInputStream8readImplEv +_ZN2DB17IBlockInputStream4readEv +_ZN2DB26ExpressionBlockInputStream8readImplEv +_ZN2DB17IBlockInputStream4readEv +_ZN2DB28AsynchronousBlockInputStream9calculateEv +_ZNSt17_Function_handlerIFvvEZN2DB28AsynchronousBlockInputStream4nextEvEUlvE_E9_M_invokeERKSt9_Any_data +_ZN14ThreadPoolImplI20ThreadFromGlobalPoolE6workerESt14_List_iteratorIS0_E +_ZZN20ThreadFromGlobalPoolC4IZN14ThreadPoolImplIS_E12scheduleImplIvEET_St8functionIFvvEEiSt8optionalImEEUlvE1_JEEEOS4_DpOT0_ENKUlvE_clEv +_ZN14ThreadPoolImplISt6threadE6workerESt14_List_iteratorIS0_E +execute_native_thread_routine +start_thread +clone +``` + +## demangle {#demangle} + +Convertit un symbole que vous pouvez obtenir en utilisant le [adressetosymbol](#addresstosymbol) fonction au nom de la fonction c++. + +**Syntaxe** + +``` sql +demangle(symbol) +``` + +**Paramètre** + +- `symbol` ([Chaîne](../../data_types/string.md)) — Symbol from an object file. + +**Valeur renvoyée** + +- Nom de la fonction C++. +- Chaîne vide si un symbole n'est pas valide. + +Type: [Chaîne](../../data_types/string.md). + +**Exemple** + +Activation des fonctions d'introspection: + +``` sql +SET allow_introspection_functions=1 +``` + +Sélection de la première chaîne de `trace_log` système de table: + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G +``` + +``` text +Row 1: +────── +event_date: 2019-11-20 +event_time: 2019-11-20 16:57:59 +revision: 54429 +timer_type: Real +thread_number: 48 +query_id: 724028bf-f550-45aa-910d-2af6212b94ac +trace: [94138803686098,94138815010911,94138815096522,94138815101224,94138815102091,94138814222988,94138806823642,94138814457211,94138806823642,94138814457211,94138806823642,94138806795179,94138806796144,94138753770094,94138753771646,94138753760572,94138852407232,140399185266395,140399178045583] +``` + +Le `trace` champ contient la trace de pile au moment de l'échantillonnage. + +Obtenir un nom de fonction pour une seule adresse: + +``` sql +SELECT demangle(addressToSymbol(94138803686098)) \G +``` + +``` text +Row 1: +────── +demangle(addressToSymbol(94138803686098)): DB::IAggregateFunctionHelper > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) const +``` + +Application de la fonction à la trace de la pile entière: + +``` sql +SELECT + arrayStringConcat(arrayMap(x -> demangle(addressToSymbol(x)), trace), '\n') AS trace_functions +FROM system.trace_log +LIMIT 1 +\G +``` + +Le [arrayMap](higher_order_functions.md#higher_order_functions-array-map) permet de traiter chaque élément individuel de l' `trace` tableau par la `demangle` fonction. Le résultat de ce traitement que vous voyez dans l' `trace_functions` colonne de sortie. + +``` text +Row 1: +────── +trace_functions: DB::IAggregateFunctionHelper > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) const +DB::Aggregator::executeWithoutKeyImpl(char*&, unsigned long, DB::Aggregator::AggregateFunctionInstruction*, DB::Arena*) const +DB::Aggregator::executeOnBlock(std::vector::immutable_ptr, std::allocator::immutable_ptr > >, unsigned long, DB::AggregatedDataVariants&, std::vector >&, std::vector >, std::allocator > > >&, bool&) +DB::Aggregator::executeOnBlock(DB::Block const&, DB::AggregatedDataVariants&, std::vector >&, std::vector >, std::allocator > > >&, bool&) +DB::Aggregator::execute(std::shared_ptr const&, DB::AggregatedDataVariants&) +DB::AggregatingBlockInputStream::readImpl() +DB::IBlockInputStream::read() +DB::ExpressionBlockInputStream::readImpl() +DB::IBlockInputStream::read() +DB::ExpressionBlockInputStream::readImpl() +DB::IBlockInputStream::read() +DB::AsynchronousBlockInputStream::calculate() +std::_Function_handler::_M_invoke(std::_Any_data const&) +ThreadPoolImpl::worker(std::_List_iterator) +ThreadFromGlobalPool::ThreadFromGlobalPool::scheduleImpl(std::function, int, std::optional)::{lambda()#3}>(ThreadPoolImpl::scheduleImpl(std::function, int, std::optional)::{lambda()#3}&&)::{lambda()#1}::operator()() const +ThreadPoolImpl::worker(std::_List_iterator) +execute_native_thread_routine +start_thread +clone +``` diff --git a/docs/fr/query_language/functions/ip_address_functions.md b/docs/fr/query_language/functions/ip_address_functions.md new file mode 100644 index 00000000000..f9541e7d247 --- /dev/null +++ b/docs/fr/query_language/functions/ip_address_functions.md @@ -0,0 +1,245 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des adresses IP {#functions-for-working-with-ip-addresses} + +## IPv4NumToString (num) {#ipv4numtostringnum} + +Prend un numéro UInt32. Interprète comme une adresse IPv4 dans big endian. Renvoie une chaîne contenant l'adresse IPv4 correspondante au format A. B. C. d (Nombres séparés par des points sous forme décimale). + +## IPv4StringToNum (s) {#ipv4stringtonums} + +La fonction inverse de IPv4NumToString. Si L'adresse IPv4 a un format non valide, elle renvoie 0. + +## IPv4NumToStringClassC(num) {#ipv4numtostringclasscnum} + +Similaire à IPv4NumToString, mais en utilisant xxx au lieu du dernier octet. + +Exemple: + +``` sql +SELECT + IPv4NumToStringClassC(ClientIP) AS k, + count() AS c +FROM test.hits +GROUP BY k +ORDER BY c DESC +LIMIT 10 +``` + +``` text +┌─k──────────────┬─────c─┐ +│ 83.149.9.xxx │ 26238 │ +│ 217.118.81.xxx │ 26074 │ +│ 213.87.129.xxx │ 25481 │ +│ 83.149.8.xxx │ 24984 │ +│ 217.118.83.xxx │ 22797 │ +│ 78.25.120.xxx │ 22354 │ +│ 213.87.131.xxx │ 21285 │ +│ 78.25.121.xxx │ 20887 │ +│ 188.162.65.xxx │ 19694 │ +│ 83.149.48.xxx │ 17406 │ +└────────────────┴───────┘ +``` + +Depuis l'utilisation de ‘xxx’ est très inhabituel, cela peut être changé à l'avenir. Nous vous recommandons de ne pas compter sur le format exact de ce fragment. + +### IPv6NumToString (x) {#ipv6numtostringx} + +Accepte une valeur FixedString (16) contenant L'adresse IPv6 au format binaire. Renvoie une chaîne contenant cette adresse au format texte. +Les adresses IPv4 mappées IPv6 sont sorties au format:: ffff: 111.222.33.44. Exemple: + +``` sql +SELECT IPv6NumToString(toFixedString(unhex('2A0206B8000000000000000000000011'), 16)) AS addr +``` + +``` text +┌─addr─────────┐ +│ 2a02:6b8::11 │ +└──────────────┘ +``` + +``` sql +SELECT + IPv6NumToString(ClientIP6 AS k), + count() AS c +FROM hits_all +WHERE EventDate = today() AND substring(ClientIP6, 1, 12) != unhex('00000000000000000000FFFF') +GROUP BY k +ORDER BY c DESC +LIMIT 10 +``` + +``` text +┌─IPv6NumToString(ClientIP6)──────────────┬─────c─┐ +│ 2a02:2168:aaa:bbbb::2 │ 24695 │ +│ 2a02:2698:abcd:abcd:abcd:abcd:8888:5555 │ 22408 │ +│ 2a02:6b8:0:fff::ff │ 16389 │ +│ 2a01:4f8:111:6666::2 │ 16016 │ +│ 2a02:2168:888:222::1 │ 15896 │ +│ 2a01:7e00::ffff:ffff:ffff:222 │ 14774 │ +│ 2a02:8109:eee:ee:eeee:eeee:eeee:eeee │ 14443 │ +│ 2a02:810b:8888:888:8888:8888:8888:8888 │ 14345 │ +│ 2a02:6b8:0:444:4444:4444:4444:4444 │ 14279 │ +│ 2a01:7e00::ffff:ffff:ffff:ffff │ 13880 │ +└─────────────────────────────────────────┴───────┘ +``` + +``` sql +SELECT + IPv6NumToString(ClientIP6 AS k), + count() AS c +FROM hits_all +WHERE EventDate = today() +GROUP BY k +ORDER BY c DESC +LIMIT 10 +``` + +``` text +┌─IPv6NumToString(ClientIP6)─┬──────c─┐ +│ ::ffff:94.26.111.111 │ 747440 │ +│ ::ffff:37.143.222.4 │ 529483 │ +│ ::ffff:5.166.111.99 │ 317707 │ +│ ::ffff:46.38.11.77 │ 263086 │ +│ ::ffff:79.105.111.111 │ 186611 │ +│ ::ffff:93.92.111.88 │ 176773 │ +│ ::ffff:84.53.111.33 │ 158709 │ +│ ::ffff:217.118.11.22 │ 154004 │ +│ ::ffff:217.118.11.33 │ 148449 │ +│ ::ffff:217.118.11.44 │ 148243 │ +└────────────────────────────┴────────┘ +``` + +## IPv6StringToNum (s) {#ipv6stringtonums} + +La fonction inverse de IPv6NumToString. Si L'adresse IPv6 a un format non valide, elle renvoie une chaîne d'octets null. +HEX peut être en majuscules ou en minuscules. + +## IPv4ToIPv6 (x) {#ipv4toipv6x} + +Prend un `UInt32` nombre. Interprète comme une adresse IPv4 dans [big endian](https://en.wikipedia.org/wiki/Endianness). Retourne un `FixedString(16)` valeur contenant l'adresse IPv6 au format binaire. Exemple: + +``` sql +SELECT IPv6NumToString(IPv4ToIPv6(IPv4StringToNum('192.168.0.1'))) AS addr +``` + +``` text +┌─addr───────────────┐ +│ ::ffff:192.168.0.1 │ +└────────────────────┘ +``` + +## cutIPv6 (x, bitsToCutForIPv6, bitsToCutForIPv4) {#cutipv6x-bitstocutforipv6-bitstocutforipv4} + +Accepte une valeur FixedString (16) contenant L'adresse IPv6 au format binaire. Renvoie une chaîne contenant l'adresse du nombre spécifié de bits retiré au format texte. Exemple: + +``` sql +WITH + IPv6StringToNum('2001:0DB8:AC10:FE01:FEED:BABE:CAFE:F00D') AS ipv6, + IPv4ToIPv6(IPv4StringToNum('192.168.0.1')) AS ipv4 +SELECT + cutIPv6(ipv6, 2, 0), + cutIPv6(ipv4, 0, 2) +``` + +``` text +┌─cutIPv6(ipv6, 2, 0)─────────────────┬─cutIPv6(ipv4, 0, 2)─┐ +│ 2001:db8:ac10:fe01:feed:babe:cafe:0 │ ::ffff:192.168.0.0 │ +└─────────────────────────────────────┴─────────────────────┘ +``` + +## Ipv4cirtorange (ipv4, cidr), {#ipv4cidrtorangeipv4-cidr} + +Accepte un IPv4 et une valeur UInt8 contenant [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing). Renvoie un tuple avec deux IPv4 contenant la plage inférieure et la plage supérieure du sous-réseau. + +``` sql +SELECT IPv4CIDRToRange(toIPv4('192.168.5.2'), 16) +``` + +``` text +┌─IPv4CIDRToRange(toIPv4('192.168.5.2'), 16)─┐ +│ ('192.168.0.0','192.168.255.255') │ +└────────────────────────────────────────────┘ +``` + +## Ipv6cirtorange (ipv6, cidr), {#ipv6cidrtorangeipv6-cidr} + +Accepte un IPv6 et une valeur UInt8 contenant le CIDR. Renvoie un tuple avec deux IPv6 contenant la plage inférieure et la plage supérieure du sous-réseau. + +``` sql +SELECT IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32); +``` + +``` text +┌─IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32)─┐ +│ ('2001:db8::','2001:db8:ffff:ffff:ffff:ffff:ffff:ffff') │ +└────────────────────────────────────────────────────────────────────────┘ +``` + +## toipv4 (chaîne) {#toipv4string} + +Un alias `IPv4StringToNum()` cela prend une forme de chaîne D'adresse IPv4 et renvoie la valeur de [IPv4](../../data_types/domains/ipv4.md) type, qui est binaire égal à la valeur renvoyée par `IPv4StringToNum()`. + +``` sql +WITH + '171.225.130.45' as IPv4_string +SELECT + toTypeName(IPv4StringToNum(IPv4_string)), + toTypeName(toIPv4(IPv4_string)) +``` + +``` text +┌─toTypeName(IPv4StringToNum(IPv4_string))─┬─toTypeName(toIPv4(IPv4_string))─┐ +│ UInt32 │ IPv4 │ +└──────────────────────────────────────────┴─────────────────────────────────┘ +``` + +``` sql +WITH + '171.225.130.45' as IPv4_string +SELECT + hex(IPv4StringToNum(IPv4_string)), + hex(toIPv4(IPv4_string)) +``` + +``` text +┌─hex(IPv4StringToNum(IPv4_string))─┬─hex(toIPv4(IPv4_string))─┐ +│ ABE1822D │ ABE1822D │ +└───────────────────────────────────┴──────────────────────────┘ +``` + +## toipv6 (chaîne) {#toipv6string} + +Un alias `IPv6StringToNum()` cela prend une forme de chaîne D'adresse IPv6 et renvoie la valeur de [IPv6](../../data_types/domains/ipv6.md) type, qui est binaire égal à la valeur renvoyée par `IPv6StringToNum()`. + +``` sql +WITH + '2001:438:ffff::407d:1bc1' as IPv6_string +SELECT + toTypeName(IPv6StringToNum(IPv6_string)), + toTypeName(toIPv6(IPv6_string)) +``` + +``` text +┌─toTypeName(IPv6StringToNum(IPv6_string))─┬─toTypeName(toIPv6(IPv6_string))─┐ +│ FixedString(16) │ IPv6 │ +└──────────────────────────────────────────┴─────────────────────────────────┘ +``` + +``` sql +WITH + '2001:438:ffff::407d:1bc1' as IPv6_string +SELECT + hex(IPv6StringToNum(IPv6_string)), + hex(toIPv6(IPv6_string)) +``` + +``` text +┌─hex(IPv6StringToNum(IPv6_string))─┬─hex(toIPv6(IPv6_string))─────────┐ +│ 20010438FFFF000000000000407D1BC1 │ 20010438FFFF000000000000407D1BC1 │ +└───────────────────────────────────┴──────────────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/ip_address_functions/) diff --git a/docs/fr/query_language/functions/json_functions.md b/docs/fr/query_language/functions/json_functions.md new file mode 100644 index 00000000000..137df62dfce --- /dev/null +++ b/docs/fr/query_language/functions/json_functions.md @@ -0,0 +1,228 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec JSON {#functions-for-working-with-json} + +Dans Yandex.Metrica, JSON est transmis par les utilisateurs en tant que paramètres de session. Il y a quelques fonctions spéciales pour travailler avec ce JSON. (Bien que dans la plupart des cas, les JSONs soient en outre prétraités et les valeurs résultantes sont placées dans des colonnes séparées dans leur format traité.) Toutes ces fonctions sont basées sur des hypothèses fortes sur ce que le JSON peut être, mais elles essaient de faire le moins possible pour faire le travail. + +Les hypothèses suivantes sont apportées: + +1. Le nom du champ (argument de fonction) doit être une constante. +2. Le nom du champ est en quelque sorte codé canoniquement dans JSON. Exemple: `visitParamHas('{"abc":"def"}', 'abc') = 1`, mais `visitParamHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0` +3. Les champs sont recherchés à n'importe quel niveau d'imbrication, sans discrimination. S'il y a plusieurs champs correspondants, la première occurrence est utilisé. +4. Le JSON n'a pas de caractères d'espace en dehors des littéraux de chaîne. + +## visitParamHas(params, nom) {#visitparamhasparams-name} + +Vérifie s'il existe un champ avec ‘name’ nom. + +## visitParamExtractUInt(params, nom) {#visitparamextractuintparams-name} + +Analyse UInt64 à partir de la valeur du champ nommé ‘name’. Si c'est un champ de type chaîne, il tente d'analyser un numéro à partir du début de la chaîne. Si le champ n'existe pas, ou s'il existe mais ne contient pas de nombre, il renvoie 0. + +## visitParamExtractInt(params, name) {#visitparamextractintparams-name} + +Le même que pour Int64. + +## visitParamExtractFloat(params, nom) {#visitparamextractfloatparams-name} + +Le même que pour Float64. + +## visitParamExtractBool(params, nom) {#visitparamextractboolparams-name} + +Analyse d'une valeur vrai/faux. Le résultat est UInt8. + +## visitParamExtractRaw(params, nom) {#visitparamextractrawparams-name} + +Retourne la valeur d'un champ, y compris les séparateurs. + +Exemple: + +``` sql +visitParamExtractRaw('{"abc":"\\n\\u0000"}', 'abc') = '"\\n\\u0000"' +visitParamExtractRaw('{"abc":{"def":[1,2,3]}}', 'abc') = '{"def":[1,2,3]}' +``` + +## visitParamExtractString(params, nom) {#visitparamextractstringparams-name} + +Analyse la chaîne entre guillemets doubles. La valeur est sans échappement. Si l'échappement échoue, il renvoie une chaîne vide. + +Exemple: + +``` sql +visitParamExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0' +visitParamExtractString('{"abc":"\\u263a"}', 'abc') = '☺' +visitParamExtractString('{"abc":"\\u263"}', 'abc') = '' +visitParamExtractString('{"abc":"hello}', 'abc') = '' +``` + +Il n'y a actuellement aucun support pour les points de code dans le format `\uXXXX\uYYYY` qui ne proviennent pas du plan multilingue de base (ils sont convertis en CESU-8 au lieu de UTF-8). + +Les fonctions suivantes sont basées sur [simdjson](https://github.com/lemire/simdjson) conçu pour des exigences D'analyse JSON plus complexes. L'hypothèse 2 mentionnée ci-dessus s'applique toujours. + +## isValidJSON (json) {#isvalidjsonjson} + +Vérifie que la chaîne est un json valide. + +Exemple: + +``` sql +SELECT isValidJSON('{"a": "hello", "b": [-100, 200.0, 300]}') = 1 +SELECT isValidJSON('not a json') = 0 +``` + +## JSONHas(json\[, indices\_or\_keys\]…) {#jsonhasjson-indices-or-keys} + +Si la valeur existe dans le document JSON, `1` sera retourné. + +Si la valeur n'existe pas, `0` sera retourné. + +Exemple: + +``` sql +SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 1 +SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0 +``` + +`indices_or_keys` est une liste de zéro ou plusieurs arguments chacun d'entre eux peut être une chaîne ou un entier. + +- String = membre d'objet d'accès par clé. +- Entier positif = accédez au n-ème membre / clé depuis le début. +- Entier négatif = accédez au n-ème membre / clé à partir de la fin. + +Minimum de l'indice de l'élément est 1. Ainsi, l'élément 0 n'existe pas. + +Vous pouvez utiliser des entiers pour accéder à la fois aux tableaux JSON et aux objets JSON. + +Ainsi, par exemple: + +``` sql +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'a' +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 2) = 'b' +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -1) = 'b' +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -2) = 'a' +SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'hello' +``` + +## JSONLength(json\[, indices\_or\_keys\]…) {#jsonlengthjson-indices-or-keys} + +Renvoie la longueur D'un tableau JSON ou d'un objet JSON. + +Si la valeur n'existe pas ou a un mauvais type, `0` sera retourné. + +Exemple: + +``` sql +SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 3 +SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}') = 2 +``` + +## JSONType(json\[, indices\_or\_keys\]…) {#jsontypejson-indices-or-keys} + +De retour le type d'une valeur JSON. + +Si la valeur n'existe pas, `Null` sera retourné. + +Exemple: + +``` sql +SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}') = 'Object' +SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'String' +SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 'Array' +``` + +## JSONExtractUInt(json\[, indices\_or\_keys\]…) {#jsonextractuintjson-indices-or-keys} + +## JSONExtractInt(json\[, indices\_or\_keys\]…) {#jsonextractintjson-indices-or-keys} + +## JSONExtractFloat(json\[, indices\_or\_keys\]…) {#jsonextractfloatjson-indices-or-keys} + +## JSONExtractBool(json\[, indices\_or\_keys\]…) {#jsonextractbooljson-indices-or-keys} + +Analyse un JSON et extrait une valeur. Ces fonctions sont similaires à `visitParam` fonction. + +Si la valeur n'existe pas ou a un mauvais type, `0` sera retourné. + +Exemple: + +``` sql +SELECT JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 1) = -100 +SELECT JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) = 200.0 +SELECT JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) = 300 +``` + +## JSONExtractString(json\[, indices\_or\_keys\]…) {#jsonextractstringjson-indices-or-keys} + +Analyse un JSON et extrait une chaîne. Cette fonction est similaire à `visitParamExtractString` fonction. + +Si la valeur n'existe pas ou a un mauvais type, une chaîne vide est retournée. + +La valeur est sans échappement. Si l'échappement échoue, il renvoie une chaîne vide. + +Exemple: + +``` sql +SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'hello' +SELECT JSONExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0' +SELECT JSONExtractString('{"abc":"\\u263a"}', 'abc') = '☺' +SELECT JSONExtractString('{"abc":"\\u263"}', 'abc') = '' +SELECT JSONExtractString('{"abc":"hello}', 'abc') = '' +``` + +## JSONExtract(json\[, indices\_or\_keys…\], return\_type) {#jsonextractjson-indices-or-keys-return-type} + +Analyse un JSON et extrait une valeur du type de données clickhouse donné. + +C'est une généralisation de la précédente `JSONExtract` fonction. +Cela signifie +`JSONExtract(..., 'String')` retourne exactement le même que `JSONExtractString()`, +`JSONExtract(..., 'Float64')` retourne exactement le même que `JSONExtractFloat()`. + +Exemple: + +``` sql +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(String, Array(Float64))') = ('hello',[-100,200,300]) +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(b Array(Float64), a String)') = ([-100,200,300],'hello') +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 'Array(Nullable(Int8))') = [-100, NULL, NULL] +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4, 'Nullable(Int64)') = NULL +SELECT JSONExtract('{"passed": true}', 'passed', 'UInt8') = 1 +SELECT JSONExtract('{"day": "Thursday"}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Thursday' +SELECT JSONExtract('{"day": 5}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Friday' +``` + +## JSONExtractKeysAndValues(json\[, indices\_or\_keys…\], value\_type) {#jsonextractkeysandvaluesjson-indices-or-keys-value-type} + +Analyser les paires clé-valeur à partir D'un JSON où les valeurs sont du type de données clickhouse donné. + +Exemple: + +``` sql +SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'x', 'Int8') = [('a',5),('b',7),('c',11)]; +``` + +## JSONExtractRaw(json\[, indices\_or\_keys\]…) {#jsonextractrawjson-indices-or-keys} + +Retourne une partie de JSON. + +Si la pièce n'existe pas ou a un mauvais type, une chaîne vide est retournée. + +Exemple: + +``` sql +SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]' +``` + +## JSONExtractArrayRaw(json\[, indices\_or\_keys\]…) {#jsonextractarrayrawjson-indices-or-keys} + +Retourne un tableau avec des éléments de tableau JSON, chacun représenté comme une chaîne non analysée. + +Si la pièce n'existe pas ou n'est pas de tableau, un tableau vide sera retournée. + +Exemple: + +``` sql +SELECT JSONExtractArrayRaw('{"a": "hello", "b": [-100, 200.0, "hello"]}', 'b') = ['-100', '200.0', '"hello"']' +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/json_functions/) diff --git a/docs/fr/query_language/functions/logical_functions.md b/docs/fr/query_language/functions/logical_functions.md new file mode 100644 index 00000000000..bae864784d3 --- /dev/null +++ b/docs/fr/query_language/functions/logical_functions.md @@ -0,0 +1,19 @@ +--- +machine_translated: true +--- + +# Les fonctions logiques {#logical-functions} + +Les fonctions logiques acceptent tous les types numériques, mais renvoient un nombre UInt8 égal à 0 ou 1. + +Zéro comme argument est considéré “false,” alors que toute valeur non nulle est considérée comme “true”. + +## et, et opérateur {#and-and-operator} + +## ou, ou opérateur {#or-or-operator} + +## pas, pas opérateur {#not-not-operator} + +## xor {#xor} + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/logical_functions/) diff --git a/docs/fr/query_language/functions/machine_learning_functions.md b/docs/fr/query_language/functions/machine_learning_functions.md new file mode 100644 index 00000000000..9a348958ece --- /dev/null +++ b/docs/fr/query_language/functions/machine_learning_functions.md @@ -0,0 +1,17 @@ +--- +machine_translated: true +--- + +# Fonctions d'apprentissage automatique {#machine-learning-functions} + +## evalMLMethod (prédiction) {#machine_learning_methods-evalmlmethod} + +Prédiction utilisant des modèles de régression ajustés utilise `evalMLMethod` fonction. Voir le lien dans la `linearRegression`. + +### Régression Linéaire Stochastique {#stochastic-linear-regression} + +Le [stochasticLinearRegression](../agg_functions/reference.md#agg_functions-stochasticlinearregression) la fonction d'agrégat implémente une méthode de descente de gradient stochastique utilisant un modèle linéaire et une fonction de perte MSE. Utiliser `evalMLMethod` prédire sur de nouvelles données. + +### Régression Logistique Stochastique {#stochastic-logistic-regression} + +Le [stochasticLogisticRegression](../agg_functions/reference.md#agg_functions-stochasticlogisticregression) la fonction d'agrégation implémente la méthode de descente de gradient stochastique pour le problème de classification binaire. Utiliser `evalMLMethod` prédire sur de nouvelles données. diff --git a/docs/fr/query_language/functions/math_functions.md b/docs/fr/query_language/functions/math_functions.md new file mode 100644 index 00000000000..4696eb1438a --- /dev/null +++ b/docs/fr/query_language/functions/math_functions.md @@ -0,0 +1,113 @@ +--- +machine_translated: true +--- + +# Fonctions mathématiques {#mathematical-functions} + +Toutes les fonctions renvoient un nombre Float64. La précision du résultat est proche de la précision maximale possible, mais le résultat peut ne pas coïncider avec le nombre représentable de la machine le plus proche du nombre réel correspondant. + +## e() {#e} + +Renvoie un nombre Float64 proche du nombre E. + +## pi() {#pi} + +Returns a Float64 number that is close to the number π. + +## exp (x) {#expx} + +Accepte un argument numérique et renvoie un Float64 nombre proche de l'exposant de l'argument. + +## log(x), ln (x) {#logx-lnx} + +Accepte un argument numérique et renvoie un nombre Float64 proche du logarithme naturel de l'argument. + +## exp2 (x) {#exp2x} + +Accepte un argument numérique et renvoie un nombre Float64 proche de 2 à la puissance de X. + +## log2 (x) {#log2x} + +Accepte un argument numérique et renvoie un Float64 nombre proximité du logarithme binaire de l'argument. + +## exp10 (x) {#exp10x} + +Accepte un argument numérique et renvoie un nombre Float64 proche de 10 à la puissance de X. + +## log10 (x) {#log10x} + +Accepte un argument numérique et renvoie un nombre Float64 proche du logarithme décimal de l'argument. + +## sqrt (x) {#sqrtx} + +Accepte un argument numérique et renvoie un Float64 nombre proche de la racine carrée de l'argument. + +## cbrt (x) {#cbrtx} + +Accepte un argument numérique et renvoie un Float64 nombre proche de la racine cubique de l'argument. + +## erf (x) {#erfx} + +Si ‘x’ is non-negative, then erf(x / σ√2) est la probabilité qu'une variable aléatoire ayant une distribution normale avec un écart type ‘σ’ prend la valeur qui est séparée de la valeur attendue par plus de ‘x’. + +Exemple (règle de trois sigma): + +``` sql +SELECT erf(3 / sqrt(2)) +``` + +``` text +┌─erf(divide(3, sqrt(2)))─┐ +│ 0.9973002039367398 │ +└─────────────────────────┘ +``` + +## erfc (x) {#erfcx} + +Accepte un argument numérique et renvoie un nombre Float64 proche de 1-erf (x), mais sans perte de précision pour ‘x’ valeur. + +## lgamma (x) {#lgammax} + +Le logarithme de la fonction gamma. + +## tgamma (x) {#tgammax} + +La fonction Gamma. + +## sin (x) {#sinx} + +Sine. + +## cos (x) {#cosx} + +Cosinus. + +## tan (x) {#tanx} + +Tangente. + +## asin (x) {#asinx} + +Le sinus d'arc. + +## acos (x) {#acosx} + +Le cosinus de l'arc. + +## atan (x) {#atanx} + +L'arc tangente. + +## pow(x, y), la puissance(x, y) {#powx-y-powerx-y} + +Prend deux arguments numériques x et Y. renvoie un nombre Float64 proche de x à la puissance de Y. + +## intExp2 {#intexp2} + +Accepte un argument numérique et renvoie un nombre UInt64 proche de 2 à la puissance de X. + +## intExp10 {#intexp10} + +Accepte un argument numérique et renvoie un nombre UInt64 proche de 10 à la puissance de X. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/math_functions/) diff --git a/docs/fr/query_language/functions/other_functions.md b/docs/fr/query_language/functions/other_functions.md new file mode 100644 index 00000000000..50a2d9f7e35 --- /dev/null +++ b/docs/fr/query_language/functions/other_functions.md @@ -0,0 +1,1076 @@ +--- +machine_translated: true +--- + +# D'autres fonctions {#other-functions} + +## hôte() {#hostname} + +Renvoie une chaîne avec le nom de l'hôte sur lequel cette fonction a été exécutée. Pour le traitement distribué, c'est le nom du serveur distant, si la fonction est exécutée sur un serveur distant. + +## FQDN {#fqdn} + +Retourne le nom de domaine pleinement qualifié. + +**Syntaxe** + +``` sql +fqdn(); +``` + +Cette fonction est insensible à la casse. + +**Valeur renvoyée** + +- Chaîne avec le nom de domaine complet. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT FQDN(); +``` + +Résultat: + +``` text +┌─FQDN()──────────────────────────┐ +│ clickhouse.ru-central1.internal │ +└─────────────────────────────────┘ +``` + +## basename {#basename} + +Extrait la partie finale d'une chaîne après la dernière barre oblique ou barre oblique inverse. Cette fonction est souvent utilisée pour extraire le nom de fichier d'un chemin. + +``` sql +basename( expr ) +``` + +**Paramètre** + +- `expr` — Expression resulting in a [Chaîne](../../data_types/string.md) type de valeur. Tous les antislashs doivent être échappés dans la valeur résultante. + +**Valeur Renvoyée** + +Une chaîne de caractères qui contient: + +- La partie finale d'une chaîne après la dernière barre oblique ou barre oblique inverse. + + If the input string contains a path ending with slash or backslash, for example, `/` or `c:\`, the function returns an empty string. + +- La chaîne d'origine s'il n'y a pas de barres obliques ou de barres obliques inverses. + +**Exemple** + +``` sql +SELECT 'some/long/path/to/file' AS a, basename(a) +``` + +``` text +┌─a──────────────────────┬─basename('some\\long\\path\\to\\file')─┐ +│ some\long\path\to\file │ file │ +└────────────────────────┴────────────────────────────────────────┘ +``` + +``` sql +SELECT 'some\\long\\path\\to\\file' AS a, basename(a) +``` + +``` text +┌─a──────────────────────┬─basename('some\\long\\path\\to\\file')─┐ +│ some\long\path\to\file │ file │ +└────────────────────────┴────────────────────────────────────────┘ +``` + +``` sql +SELECT 'some-file-name' AS a, basename(a) +``` + +``` text +┌─a──────────────┬─basename('some-file-name')─┐ +│ some-file-name │ some-file-name │ +└────────────────┴────────────────────────────┘ +``` + +## visibleWidth (x) {#visiblewidthx} + +Calcule la largeur approximative lors de la sortie des valeurs vers la console au format texte (séparé par des tabulations). +Cette fonction est utilisée par le système pour implémenter de jolis formats. + +`NULL` est représenté comme une chaîne correspondant à `NULL` dans `Pretty` format. + +``` sql +SELECT visibleWidth(NULL) +``` + +``` text +┌─visibleWidth(NULL)─┐ +│ 4 │ +└────────────────────┘ +``` + +## toTypeName (x) {#totypenamex} + +Renvoie une chaîne contenant le nom du type de l'argument passé. + +Si `NULL` est passé à la fonction en entrée, puis il renvoie le `Nullable(Nothing)` type, ce qui correspond à un interne `NULL` représentation à ClickHouse. + +## la taille de bloc() {#function-blocksize} + +Récupère la taille du bloc. +Dans ClickHouse, les requêtes sont toujours exécutées sur des blocs (ensembles de parties de colonne). Cette fonction permet d'obtenir la taille du bloc pour lequel vous l'avez appelé. + +## matérialiser (x) {#materializex} + +Transforme une constante dans une colonne contenant une seule valeur. +Dans ClickHouse, les colonnes complètes et les constantes sont représentées différemment en mémoire. Les fonctions fonctionnent différemment pour les arguments constants et les arguments normaux (un code différent est exécuté), bien que le résultat soit presque toujours le même. Cette fonction sert à déboguer ce comportement. + +## ignore(…) {#ignore} + +Accepte tous les arguments, y compris `NULL`. Renvoie toujours 0. +Cependant, l'argument est toujours évalué. Cela peut être utilisé pour les benchmarks. + +## sommeil(secondes) {#sleepseconds} + +Dormir ‘seconds’ secondes sur chaque bloc de données. Vous pouvez spécifier un nombre entier ou un nombre à virgule flottante. + +## sleepEachRow (secondes) {#sleepeachrowseconds} + +Dormir ‘seconds’ secondes sur chaque ligne. Vous pouvez spécifier un nombre entier ou un nombre à virgule flottante. + +## currentDatabase() {#currentdatabase} + +Retourne le nom de la base de données actuelle. +Vous pouvez utiliser cette fonction dans les paramètres du moteur de table dans une requête CREATE TABLE où vous devez spécifier la base de données. + +## currentUser() {#other-function-currentuser} + +Renvoie la connexion de l'utilisateur actuel. La connexion de l'utilisateur, cette requête initiée, sera renvoyée en cas de requête distibuted. + +``` sql +SELECT currentUser(); +``` + +Alias: `user()`, `USER()`. + +**Valeurs renvoyées** + +- Connexion de l'utilisateur actuel. +- Connexion de l'utilisateur qui a lancé la requête en cas de requête distribuée. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT currentUser(); +``` + +Résultat: + +``` text +┌─currentUser()─┐ +│ default │ +└───────────────┘ +``` + +## isFinite (x) {#isfinitex} + +Accepte Float32 et Float64 et renvoie UInt8 égal à 1 si l'argument n'est pas infini et pas un NaN, sinon 0. + +## isInfinite (x) {#isinfinitex} + +Accepte Float32 et Float64 et renvoie UInt8 égal à 1 si l'argument est infini, sinon 0. Notez que 0 est retourné pour un NaN. + +## ifNotFinite {#ifnotfinite} + +Vérifie si la valeur à virgule flottante est finie. + +**Syntaxe** + + ifNotFinite(x,y) + +**Paramètre** + +- `x` — Value to be checked for infinity. Type: [Flottant\*](../../data_types/float.md). +- `y` — Fallback value. Type: [Flottant\*](../../data_types/float.md). + +**Valeur renvoyée** + +- `x` si `x` est finie. +- `y` si `x` n'est pas finie. + +**Exemple** + +Requête: + + SELECT 1/0 as infimum, ifNotFinite(infimum,42) + +Résultat: + + ┌─infimum─┬─ifNotFinite(divide(1, 0), 42)─┐ + │ inf │ 42 │ + └─────────┴───────────────────────────────┘ + +Vous pouvez obtenir un résultat similaire en utilisant [opérateur ternaire](conditional_functions.md#ternary-operator): `isFinite(x) ? x : y`. + +## isNaN (x) {#isnanx} + +Accepte Float32 et Float64 et renvoie UInt8 égal à 1 si l'argument est un NaN, sinon 0. + +## hasColumnInTable(\[‘hostname’\[, ‘username’\[, ‘password’\]\],\] ‘database’, ‘table’, ‘column’) {#hascolumnintablehostname-username-password-database-table-column} + +Accepte les chaînes constantes: nom de la base de données, nom de la table et nom de la colonne. Renvoie une expression constante UInt8 égale à 1 s'il y a une colonne, sinon 0. Si le paramètre hostname est défini, le test s'exécutera sur un serveur distant. +La fonction renvoie une exception si la table n'existe pas. +Pour les éléments imbriqués structure des données, la fonction vérifie l'existence d'une colonne. Pour la structure de données imbriquée elle-même, la fonction renvoie 0. + +## bar {#function-bar} + +Permet de construire un diagramme unicode-art. + +`bar(x, min, max, width)` dessine une bande avec une largeur proportionnelle à `(x - min)` et égale à `width` les caractères lors de la `x = max`. + +Paramètre: + +- `x` — Size to display. +- `min, max` — Integer constants. The value must fit in `Int64`. +- `width` — Constant, positive integer, can be fractional. + +La bande dessinée avec précision à un huitième d'un symbole. + +Exemple: + +``` sql +SELECT + toHour(EventTime) AS h, + count() AS c, + bar(c, 0, 600000, 20) AS bar +FROM test.hits +GROUP BY h +ORDER BY h ASC +``` + +``` text +┌──h─┬──────c─┬─bar────────────────┐ +│ 0 │ 292907 │ █████████▋ │ +│ 1 │ 180563 │ ██████ │ +│ 2 │ 114861 │ ███▋ │ +│ 3 │ 85069 │ ██▋ │ +│ 4 │ 68543 │ ██▎ │ +│ 5 │ 78116 │ ██▌ │ +│ 6 │ 113474 │ ███▋ │ +│ 7 │ 170678 │ █████▋ │ +│ 8 │ 278380 │ █████████▎ │ +│ 9 │ 391053 │ █████████████ │ +│ 10 │ 457681 │ ███████████████▎ │ +│ 11 │ 493667 │ ████████████████▍ │ +│ 12 │ 509641 │ ████████████████▊ │ +│ 13 │ 522947 │ █████████████████▍ │ +│ 14 │ 539954 │ █████████████████▊ │ +│ 15 │ 528460 │ █████████████████▌ │ +│ 16 │ 539201 │ █████████████████▊ │ +│ 17 │ 523539 │ █████████████████▍ │ +│ 18 │ 506467 │ ████████████████▊ │ +│ 19 │ 520915 │ █████████████████▎ │ +│ 20 │ 521665 │ █████████████████▍ │ +│ 21 │ 542078 │ ██████████████████ │ +│ 22 │ 493642 │ ████████████████▍ │ +│ 23 │ 400397 │ █████████████▎ │ +└────┴────────┴────────────────────┘ +``` + +## transformer {#transform} + +Transforme une valeur en fonction explicitement définis cartographie de certains éléments à l'autre. +Il existe deux variantes de cette fonction: + +### de transformation(x, array\_from, array\_to, par défaut) {#transformx-array-from-array-to-default} + +`x` – What to transform. + +`array_from` – Constant array of values for converting. + +`array_to` – Constant array of values to convert the values in ‘from’ de. + +`default` – Which value to use if ‘x’ n'est pas égale à une des valeurs de ‘from’. + +`array_from` et `array_to` – Arrays of the same size. + +Type: + +`transform(T, Array(T), Array(U), U) -> U` + +`T` et `U` peuvent être des types numériques, chaîne ou Date ou DateTime. +Lorsque la même lettre est indiquée (T ou U), pour les types numériques, il se peut qu'il ne s'agisse pas de types correspondants, mais de types ayant un type commun. +Par exemple, le premier argument peut avoir le type Int64, tandis que le second a le type Array(UInt16). + +Si l' ‘x’ la valeur est égale à l'un des éléments dans la ‘array\_from’ tableau, elle renvoie l'élément existant (qui est numéroté de même) de la ‘array\_to’ tableau. Sinon, elle renvoie ‘default’. S'il y a plusieurs éléments correspondants dans ‘array\_from’ il renvoie l'un des matches. + +Exemple: + +``` sql +SELECT + transform(SearchEngineID, [2, 3], ['Yandex', 'Google'], 'Other') AS title, + count() AS c +FROM test.hits +WHERE SearchEngineID != 0 +GROUP BY title +ORDER BY c DESC +``` + +``` text +┌─title─────┬──────c─┐ +│ Yandex │ 498635 │ +│ Google │ 229872 │ +│ Other │ 104472 │ +└───────────┴────────┘ +``` + +### de transformation(x, array\_from, array\_to) {#transformx-array-from-array-to} + +Diffère de la première variation en ce que le ‘default’ l'argument est omis. +Si l' ‘x’ la valeur est égale à l'un des éléments dans la ‘array\_from’ tableau, elle renvoie l'élément correspondant (qui est numéroté de même) de la ‘array\_to’ tableau. Sinon, elle renvoie ‘x’. + +Type: + +`transform(T, Array(T), Array(T)) -> T` + +Exemple: + +``` sql +SELECT + transform(domain(Referer), ['yandex.ru', 'google.ru', 'vk.com'], ['www.yandex', 'example.com']) AS s, + count() AS c +FROM test.hits +GROUP BY domain(Referer) +ORDER BY count() DESC +LIMIT 10 +``` + +``` text +┌─s──────────────┬───────c─┐ +│ │ 2906259 │ +│ www.yandex │ 867767 │ +│ ███████.ru │ 313599 │ +│ mail.yandex.ru │ 107147 │ +│ ██████.ru │ 100355 │ +│ █████████.ru │ 65040 │ +│ news.yandex.ru │ 64515 │ +│ ██████.net │ 59141 │ +│ example.com │ 57316 │ +└────────────────┴─────────┘ +``` + +## formatReadableSize (x) {#formatreadablesizex} + +Accepte la taille (nombre d'octets). Renvoie une taille arrondie avec un suffixe (KiB, MiB, etc.) comme une chaîne de caractères. + +Exemple: + +``` sql +SELECT + arrayJoin([1, 1024, 1024*1024, 192851925]) AS filesize_bytes, + formatReadableSize(filesize_bytes) AS filesize +``` + +``` text +┌─filesize_bytes─┬─filesize───┐ +│ 1 │ 1.00 B │ +│ 1024 │ 1.00 KiB │ +│ 1048576 │ 1.00 MiB │ +│ 192851925 │ 183.92 MiB │ +└────────────────┴────────────┘ +``` + +## moins (a, b) {#leasta-b} + +Renvoie la plus petite valeur de a et b. + +## la plus grande(a, b) {#greatesta-b} + +Renvoie la plus grande valeur de a et B. + +## le temps de disponibilité() {#uptime} + +Renvoie la disponibilité du serveur en quelques secondes. + +## version() {#version} + +Renvoie la version du serveur sous forme de chaîne. + +## fuseau() {#timezone} + +Retourne le fuseau horaire du serveur. + +## blockNumber {#blocknumber} + +Renvoie le numéro de séquence du bloc de données où se trouve la ligne. + +## rowNumberInBlock {#function-rownumberinblock} + +Renvoie le numéro de séquence de la ligne dans le bloc de données. Différents blocs de données sont toujours recalculés. + +## rowNumberInAllBlocks() {#rownumberinallblocks} + +Renvoie le numéro de séquence de la ligne dans le bloc de données. Cette fonction ne prend en compte que les blocs de données affectés. + +## voisin {#neighbor} + +La fonction de fenêtre qui donne accès à une ligne à un décalage spécifié qui vient avant ou après la ligne actuelle d'une colonne donnée. + +**Syntaxe** + +``` sql +neighbor(column, offset[, default_value]) +``` + +Le résultat de la fonction dépend du touché des blocs de données et l'ordre des données dans le bloc. +Si vous créez une sous-requête avec ORDER BY et appelez la fonction depuis l'extérieur de la sous-requête, vous pouvez obtenir le résultat attendu. + +**Paramètre** + +- `column` — A column name or scalar expression. +- `offset` — The number of rows forwards or backwards from the current row of `column`. [Int64](../../data_types/int_uint.md). +- `default_value` — Optional. The value to be returned if offset goes beyond the scope of the block. Type of data blocks affected. + +**Valeurs renvoyées** + +- De la valeur pour `column` dans `offset` distance de la ligne actuelle si `offset` la valeur n'est pas en dehors des limites du bloc. +- La valeur par défaut pour `column` si `offset` la valeur est en dehors des limites du bloc. Si `default_value` est donné, alors il sera utilisé. + +Type: type de blocs de données affectés ou type de valeur par défaut. + +**Exemple** + +Requête: + +``` sql +SELECT number, neighbor(number, 2) FROM system.numbers LIMIT 10; +``` + +Résultat: + +``` text +┌─number─┬─neighbor(number, 2)─┐ +│ 0 │ 2 │ +│ 1 │ 3 │ +│ 2 │ 4 │ +│ 3 │ 5 │ +│ 4 │ 6 │ +│ 5 │ 7 │ +│ 6 │ 8 │ +│ 7 │ 9 │ +│ 8 │ 0 │ +│ 9 │ 0 │ +└────────┴─────────────────────┘ +``` + +Requête: + +``` sql +SELECT number, neighbor(number, 2, 999) FROM system.numbers LIMIT 10; +``` + +Résultat: + +``` text +┌─number─┬─neighbor(number, 2, 999)─┐ +│ 0 │ 2 │ +│ 1 │ 3 │ +│ 2 │ 4 │ +│ 3 │ 5 │ +│ 4 │ 6 │ +│ 5 │ 7 │ +│ 6 │ 8 │ +│ 7 │ 9 │ +│ 8 │ 999 │ +│ 9 │ 999 │ +└────────┴──────────────────────────┘ +``` + +Cette fonction peut être utilisée pour calculer une année à valeur métrique: + +Requête: + +``` sql +WITH toDate('2018-01-01') AS start_date +SELECT + toStartOfMonth(start_date + (number * 32)) AS month, + toInt32(month) % 100 AS money, + neighbor(money, -12) AS prev_year, + round(prev_year / money, 2) AS year_over_year +FROM numbers(16) +``` + +Résultat: + +``` text +┌──────month─┬─money─┬─prev_year─┬─year_over_year─┐ +│ 2018-01-01 │ 32 │ 0 │ 0 │ +│ 2018-02-01 │ 63 │ 0 │ 0 │ +│ 2018-03-01 │ 91 │ 0 │ 0 │ +│ 2018-04-01 │ 22 │ 0 │ 0 │ +│ 2018-05-01 │ 52 │ 0 │ 0 │ +│ 2018-06-01 │ 83 │ 0 │ 0 │ +│ 2018-07-01 │ 13 │ 0 │ 0 │ +│ 2018-08-01 │ 44 │ 0 │ 0 │ +│ 2018-09-01 │ 75 │ 0 │ 0 │ +│ 2018-10-01 │ 5 │ 0 │ 0 │ +│ 2018-11-01 │ 36 │ 0 │ 0 │ +│ 2018-12-01 │ 66 │ 0 │ 0 │ +│ 2019-01-01 │ 97 │ 32 │ 0.33 │ +│ 2019-02-01 │ 28 │ 63 │ 2.25 │ +│ 2019-03-01 │ 56 │ 91 │ 1.62 │ +│ 2019-04-01 │ 87 │ 22 │ 0.25 │ +└────────────┴───────┴───────────┴────────────────┘ +``` + +## runningDifference(x) {#other_functions-runningdifference} + +Calculates the difference between successive row values ​​in the data block. +Renvoie 0 pour la première ligne et la différence par rapport à la rangée précédente pour chaque nouvelle ligne. + +Le résultat de la fonction dépend du touché des blocs de données et l'ordre des données dans le bloc. +Si vous créez une sous-requête avec ORDER BY et appelez la fonction depuis l'extérieur de la sous-requête, vous pouvez obtenir le résultat attendu. + +Exemple: + +``` sql +SELECT + EventID, + EventTime, + runningDifference(EventTime) AS delta +FROM +( + SELECT + EventID, + EventTime + FROM events + WHERE EventDate = '2016-11-24' + ORDER BY EventTime ASC + LIMIT 5 +) +``` + +``` text +┌─EventID─┬───────────EventTime─┬─delta─┐ +│ 1106 │ 2016-11-24 00:00:04 │ 0 │ +│ 1107 │ 2016-11-24 00:00:05 │ 1 │ +│ 1108 │ 2016-11-24 00:00:05 │ 0 │ +│ 1109 │ 2016-11-24 00:00:09 │ 4 │ +│ 1110 │ 2016-11-24 00:00:10 │ 1 │ +└─────────┴─────────────────────┴───────┘ +``` + +Veuillez noter que la taille du bloc affecte le résultat. Avec chaque nouveau bloc, le `runningDifference` l'état est réinitialisé. + +``` sql +SELECT + number, + runningDifference(number + 1) AS diff +FROM numbers(100000) +WHERE diff != 1 +``` + +``` text +┌─number─┬─diff─┐ +│ 0 │ 0 │ +└────────┴──────┘ +┌─number─┬─diff─┐ +│ 65536 │ 0 │ +└────────┴──────┘ +``` + +``` sql +set max_block_size=100000 -- default value is 65536! + +SELECT + number, + runningDifference(number + 1) AS diff +FROM numbers(100000) +WHERE diff != 1 +``` + +``` text +┌─number─┬─diff─┐ +│ 0 │ 0 │ +└────────┴──────┘ +``` + +## runningDifferenceStartingWithFirstvalue {#runningdifferencestartingwithfirstvalue} + +De même que pour [runningDifference](./other_functions.md#other_functions-runningdifference) la différence est la valeur de la première ligne, est retourné à la valeur de la première ligne, et chaque rangée suivante renvoie la différence de la rangée précédente. + +## MACNumToString (num) {#macnumtostringnum} + +Accepte un numéro UInt64. Interprète comme une adresse MAC dans big endian. Renvoie une chaîne contenant l'adresse MAC correspondante au format AA:BB:CC: DD:EE: FF (Nombres séparés par deux points sous forme hexadécimale). + +## MACStringToNum (s) {#macstringtonums} + +La fonction inverse de MACNumToString. Si l'adresse MAC a un format non valide, elle renvoie 0. + +## MACStringToOUI (s) {#macstringtoouis} + +Accepte une adresse MAC au format AA:BB:CC: DD:EE: FF (Nombres séparés par deux points sous forme hexadécimale). Renvoie les trois premiers octets sous la forme D'un nombre UInt64. Si l'adresse MAC a un format non valide, elle renvoie 0. + +## getSizeOfEnumType {#getsizeofenumtype} + +Retourne le nombre de champs dans [Enum](../../data_types/enum.md). + +``` sql +getSizeOfEnumType(value) +``` + +**Paramètre:** + +- `value` — Value of type `Enum`. + +**Valeurs renvoyées** + +- Le nombre de champs avec `Enum` les valeurs d'entrée. +- Une exception est levée si le type n'est pas `Enum`. + +**Exemple** + +``` sql +SELECT getSizeOfEnumType( CAST('a' AS Enum8('a' = 1, 'b' = 2) ) ) AS x +``` + +``` text +┌─x─┐ +│ 2 │ +└───┘ +``` + +## blockSerializedSize {#blockserializedsize} + +Retourne la taille sur le disque (sans tenir compte de la compression). + +``` sql +blockSerializedSize(value[, value[, ...]]) +``` + +**Paramètre:** + +- `value` — Any value. + +**Valeurs renvoyées** + +- Le nombre d'octets qui seront écrites sur le disque pour le bloc de valeurs (sans compression). + +**Exemple** + +``` sql +SELECT blockSerializedSize(maxState(1)) as x +``` + +``` text +┌─x─┐ +│ 2 │ +└───┘ +``` + +## toColumnTypeName {#tocolumntypename} + +Renvoie le nom de la classe qui représente le type de données de la colonne dans la RAM. + +``` sql +toColumnTypeName(value) +``` + +**Paramètre:** + +- `value` — Any type of value. + +**Valeurs renvoyées** + +- Une chaîne avec le nom de la classe utilisée pour représenter `value` type de données dans la mémoire RAM. + +**Exemple de la différence entre`toTypeName ' and ' toColumnTypeName`** + +``` sql +SELECT toTypeName(CAST('2018-01-01 01:02:03' AS DateTime)) +``` + +``` text +┌─toTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐ +│ DateTime │ +└─────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT toColumnTypeName(CAST('2018-01-01 01:02:03' AS DateTime)) +``` + +``` text +┌─toColumnTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐ +│ Const(UInt32) │ +└───────────────────────────────────────────────────────────┘ +``` + +L'exemple montre que le `DateTime` type de données est stocké dans la mémoire comme `Const(UInt32)`. + +## dumpColumnStructure {#dumpcolumnstructure} + +Affiche une description détaillée des structures de données en RAM + +``` sql +dumpColumnStructure(value) +``` + +**Paramètre:** + +- `value` — Any type of value. + +**Valeurs renvoyées** + +- Une chaîne décrivant la structure utilisée pour représenter `value` type de données dans la mémoire RAM. + +**Exemple** + +``` sql +SELECT dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime')) +``` + +``` text +┌─dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime'))─┐ +│ DateTime, Const(size = 1, UInt32(size = 1)) │ +└──────────────────────────────────────────────────────────────┘ +``` + +## defaultValueOfArgumentType {#defaultvalueofargumenttype} + +Affiche la valeur par défaut du type de données. + +Ne pas inclure des valeurs par défaut pour les colonnes personnalisées définies par l'utilisateur. + +``` sql +defaultValueOfArgumentType(expression) +``` + +**Paramètre:** + +- `expression` — Arbitrary type of value or an expression that results in a value of an arbitrary type. + +**Valeurs renvoyées** + +- `0` pour les nombres. +- Chaîne vide pour les chaînes. +- `ᴺᵁᴸᴸ` pour [Nullable](../../data_types/nullable.md). + +**Exemple** + +``` sql +SELECT defaultValueOfArgumentType( CAST(1 AS Int8) ) +``` + +``` text +┌─defaultValueOfArgumentType(CAST(1, 'Int8'))─┐ +│ 0 │ +└─────────────────────────────────────────────┘ +``` + +``` sql +SELECT defaultValueOfArgumentType( CAST(1 AS Nullable(Int8) ) ) +``` + +``` text +┌─defaultValueOfArgumentType(CAST(1, 'Nullable(Int8)'))─┐ +│ ᴺᵁᴸᴸ │ +└───────────────────────────────────────────────────────┘ +``` + +## reproduire {#other-functions-replicate} + +Crée un tableau avec une seule valeur. + +Utilisé pour la mise en œuvre interne de [arrayJoin](array_join.md#functions_arrayjoin). + +``` sql +SELECT replicate(x, arr); +``` + +**Paramètre:** + +- `arr` — Original array. ClickHouse creates a new array of the same length as the original and fills it with the value `x`. +- `x` — The value that the resulting array will be filled with. + +**Valeur renvoyée** + +Un tableau rempli de la valeur `x`. + +Type: `Array`. + +**Exemple** + +Requête: + +``` sql +SELECT replicate(1, ['a', 'b', 'c']) +``` + +Résultat: + +``` text +┌─replicate(1, ['a', 'b', 'c'])─┐ +│ [1,1,1] │ +└───────────────────────────────┘ +``` + +## filesystemAvailable {#filesystemavailable} + +Renvoie la quantité d'espace restant sur le système de fichiers où se trouvent les fichiers des bases de données. Il est toujours plus petit que l'espace libre total ([filesystemFree](#filesystemfree)) parce qu'un peu d'espace est réservé au système D'exploitation. + +**Syntaxe** + +``` sql +filesystemAvailable() +``` + +**Valeur renvoyée** + +- La quantité d'espace restant disponible en octets. + +Type: [UInt64](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT formatReadableSize(filesystemAvailable()) AS "Available space", toTypeName(filesystemAvailable()) AS "Type"; +``` + +Résultat: + +``` text +┌─Available space─┬─Type───┐ +│ 30.75 GiB │ UInt64 │ +└─────────────────┴────────┘ +``` + +## filesystemFree {#filesystemfree} + +Retourne montant total de l'espace libre sur le système de fichiers où les fichiers des bases de données. Voir aussi `filesystemAvailable` + +**Syntaxe** + +``` sql +filesystemFree() +``` + +**Valeur renvoyée** + +- Quantité d'espace libre en octets. + +Type: [UInt64](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT formatReadableSize(filesystemFree()) AS "Free space", toTypeName(filesystemFree()) AS "Type"; +``` + +Résultat: + +``` text +┌─Free space─┬─Type───┐ +│ 32.39 GiB │ UInt64 │ +└────────────┴────────┘ +``` + +## filesystemCapacity {#filesystemcapacity} + +Renvoie la capacité du système de fichiers en octets. Pour l'évaluation, la [chemin](../../operations/server_settings/settings.md#server_settings-path) le répertoire de données doit être configuré. + +**Syntaxe** + +``` sql +filesystemCapacity() +``` + +**Valeur renvoyée** + +- Informations de capacité du système de fichiers en octets. + +Type: [UInt64](../../data_types/int_uint.md). + +**Exemple** + +Requête: + +``` sql +SELECT formatReadableSize(filesystemCapacity()) AS "Capacity", toTypeName(filesystemCapacity()) AS "Type" +``` + +Résultat: + +``` text +┌─Capacity──┬─Type───┐ +│ 39.32 GiB │ UInt64 │ +└───────────┴────────┘ +``` + +## finalizeAggregation {#function-finalizeaggregation} + +Prend de l'état de la fonction d'agrégation. Renvoie le résultat de l'agrégation (état finalisé). + +## runningAccumulate {#function-runningaccumulate} + +Prend les membres de la fonction d'agrégation et renvoie une colonne avec des valeurs, sont le résultat de l'accumulation de ces états pour un ensemble de bloc de lignes, de la première à la ligne actuelle. +Par exemple, prend l'état de la fonction d'agrégat (exemple runningAccumulate(uniqState(UserID))), et pour chaque ligne de bloc, retourne le résultat de la fonction d'agrégat lors de la fusion des états de toutes les lignes précédentes et de la ligne actuelle. +Ainsi, le résultat de la fonction dépend de la partition des données aux blocs et de l'ordre des données dans le bloc. + +## joinGet {#joinget} + +La fonction vous permet d'extraire les données de la table de la même manière qu'à partir d'un [dictionnaire](../../query_language/dicts/index.md). + +Obtient les données de [Rejoindre](../../operations/table_engines/join.md#creating-a-table) tables utilisant la clé de jointure spécifiée. + +Ne prend en charge que les tables créées avec `ENGINE = Join(ANY, LEFT, )` déclaration. + +**Syntaxe** + +``` sql +joinGet(join_storage_table_name, `value_column`, join_keys) +``` + +**Paramètre** + +- `join_storage_table_name` — an [identificateur](../syntax.md#syntax-identifiers) indique l'endroit où la recherche est effectuée. L'identificateur est recherché dans la base de données par défaut (voir paramètre `default_database` dans le fichier de config). Pour remplacer la base de données par défaut, utilisez `USE db_name` ou spécifiez la base de données et la table via le séparateur `db_name.db_table` voir l'exemple. +- `value_column` — name of the column of the table that contains required data. +- `join_keys` — list of keys. + +**Valeur renvoyée** + +Retourne la liste des valeurs correspond à la liste des clés. + +Si certain n'existe pas dans la table source alors `0` ou `null` seront renvoyés basé sur [join\_use\_nulls](../../operations/settings/settings.md#join_use_nulls) paramètre. + +Plus d'infos sur `join_use_nulls` dans [Opération de jointure](../../operations/table_engines/join.md). + +**Exemple** + +Table d'entrée: + +``` sql +CREATE DATABASE db_test +CREATE TABLE db_test.id_val(`id` UInt32, `val` UInt32) ENGINE = Join(ANY, LEFT, id) SETTINGS join_use_nulls = 1 +INSERT INTO db_test.id_val VALUES (1,11)(2,12)(4,13) +``` + +``` text +┌─id─┬─val─┐ +│ 4 │ 13 │ +│ 2 │ 12 │ +│ 1 │ 11 │ +└────┴─────┘ +``` + +Requête: + +``` sql +SELECT joinGet(db_test.id_val,'val',toUInt32(number)) from numbers(4) SETTINGS join_use_nulls = 1 +``` + +Résultat: + +``` text +┌─joinGet(db_test.id_val, 'val', toUInt32(number))─┐ +│ 0 │ +│ 11 │ +│ 12 │ +│ 0 │ +└──────────────────────────────────────────────────┘ +``` + +## modelEvaluate(model\_name, …) {#function-modelevaluate} + +Évaluer le modèle externe. +Accepte un nom de modèle et le modèle de l'argumentation. Renvoie Float64. + +## throwIf (x \[, custom\_message\]) {#throwifx-custom-message} + +Lever une exception si l'argument est non nul. +custom\_message - est un paramètre optionnel: une chaîne constante, fournit un message d'erreur + +``` sql +SELECT throwIf(number = 3, 'Too many') FROM numbers(10); +``` + +``` text +↙ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) Received exception from server (version 19.14.1): +Code: 395. DB::Exception: Received from localhost:9000. DB::Exception: Too many. +``` + +## identité {#identity} + +Renvoie la même valeur qui a été utilisée comme argument. Utilisé pour le débogage et les tests, permet d'annuler l'utilisation de l'index et d'obtenir les performances de requête d'une analyse complète. Lorsque la requête est analysée pour une utilisation possible de l'index, l'analyseur ne regarde pas à l'intérieur `identity` fonction. + +**Syntaxe** + +``` sql +identity(x) +``` + +**Exemple** + +Requête: + +``` sql +SELECT identity(42) +``` + +Résultat: + +``` text +┌─identity(42)─┐ +│ 42 │ +└──────────────┘ +``` + +## randomPrintableASCII {#randomascii} + +Génère une chaîne avec un ensemble aléatoire de [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) caractères imprimables. + +**Syntaxe** + +``` sql +randomPrintableASCII(length) +``` + +**Paramètre** + +- `length` — Resulting string length. Positive integer. + + If you pass `length < 0`, behavior of the function is undefined. + +**Valeur renvoyée** + +- Chaîne avec un ensemble aléatoire de [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) caractères imprimables. + +Type: [Chaîne](../../data_types/string.md) + +**Exemple** + +``` sql +SELECT number, randomPrintableASCII(30) as str, length(str) FROM system.numbers LIMIT 3 +``` + +``` text +┌─number─┬─str────────────────────────────┬─length(randomPrintableASCII(30))─┐ +│ 0 │ SuiCOSTvC0csfABSw=UcSzp2.`rv8x │ 30 │ +│ 1 │ 1Ag NlJ &RCN:*>HVPG;PE-nO"SUFD │ 30 │ +│ 2 │ /"+<"wUTh:=LjJ Vm!c&hI*m#XTfzz │ 30 │ +└────────┴────────────────────────────────┴──────────────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/other_functions/) diff --git a/docs/fr/query_language/functions/random_functions.md b/docs/fr/query_language/functions/random_functions.md new file mode 100644 index 00000000000..386ad3953bc --- /dev/null +++ b/docs/fr/query_language/functions/random_functions.md @@ -0,0 +1,27 @@ +--- +machine_translated: true +--- + +# Fonctions pour générer des nombres pseudo-aléatoires {#functions-for-generating-pseudo-random-numbers} + +Des générateurs Non cryptographiques de nombres pseudo-aléatoires sont utilisés. + +Toutes les fonctions acceptent zéro argument ou un argument. +Si un argument est passé, il peut être de n'importe quel type, et sa valeur n'est utilisée pour rien. +Le seul but de cet argument est d'empêcher l'élimination des sous-expressions courantes, de sorte que deux instances différentes de la même fonction renvoient des colonnes différentes avec des nombres aléatoires différents. + +## Rand {#rand} + +Renvoie un nombre UInt32 pseudo-aléatoire, réparti uniformément entre tous les nombres de type UInt32. +Utilise un générateur congruentiel linéaire. + +## rand64 {#rand64} + +Renvoie un nombre UInt64 pseudo-aléatoire, réparti uniformément entre tous les nombres de type UInt64. +Utilise un générateur congruentiel linéaire. + +## randConstant {#randconstant} + +Renvoie un nombre UInt32 pseudo-aléatoire, la valeur est une pour différents blocs. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/random_functions/) diff --git a/docs/fr/query_language/functions/rounding_functions.md b/docs/fr/query_language/functions/rounding_functions.md new file mode 100644 index 00000000000..7ad425c0ebb --- /dev/null +++ b/docs/fr/query_language/functions/rounding_functions.md @@ -0,0 +1,187 @@ +--- +machine_translated: true +--- + +# Fonctions d'arrondi {#rounding-functions} + +## floor(x\[, N\]) {#floorx-n} + +Renvoie le plus grand nombre rond inférieur ou égal à `x`. Un nombre rond est un multiple de 1 / 10N, ou le nombre le plus proche du type de données approprié si 1 / 10N n'est pas exact. +‘N’ est une constante entière, paramètre facultatif. Par défaut, il est zéro, ce qui signifie arrondir à un entier. +‘N’ peut être négative. + +Exemple: `floor(123.45, 1) = 123.4, floor(123.45, -1) = 120.` + +`x` est n'importe quel type numérique. Le résultat est un nombre du même type. +Pour les arguments entiers, il est logique d'arrondir avec un négatif `N` valeur (pour non négatif `N`, la fonction ne fait rien). +Si l'arrondi provoque un débordement (par exemple, floor(-128, -1)), un résultat spécifique à l'implémentation est renvoyé. + +## ceil(x\[, n\]), plafond (x\[, n\]) {#ceilx-n-ceilingx-n} + +Renvoie le plus petit nombre rond supérieur ou égal à `x`. Dans tous les autres sens, il est le même que le `floor` fonction (voir ci-dessus). + +## trunc(x \[, N\]), truncate(x \[, N\]) {#truncx-n-truncatex-n} + +Renvoie le nombre rond avec la plus grande valeur absolue qui a une valeur absolue inférieure ou égale à `x`‘s. In every other way, it is the same as the ’floor’ fonction (voir ci-dessus). + +## round(x\[, N\]) {#rounding_functions-round} + +Arrondit une valeur à un nombre spécifié de décimales. + +La fonction renvoie le nombre plus proche de l'ordre spécifié. Dans le cas où un nombre donné a une distance égale aux nombres environnants, la fonction utilise l'arrondi de banquier pour les types de nombres flottants et arrondit à partir de zéro pour les autres types de nombres. + +``` sql +round(expression [, decimal_places]) +``` + +**Paramètre:** + +- `expression` — A number to be rounded. Can be any [expression](../syntax.md#syntax-expressions) retour du numérique [type de données](../../data_types/index.md#data_types). +- `decimal-places` — An integer value. + - Si `decimal-places > 0` alors la fonction arrondit la valeur à droite du point décimal. + - Si `decimal-places < 0` alors la fonction arrondit la valeur à gauche de la virgule décimale. + - Si `decimal-places = 0` alors la fonction arrondit la valeur à l'entier. Dans ce cas, l'argument peut être omis. + +**Valeur renvoyée:** + +Le nombre arrondi du même type que le nombre d'entrée. + +### Exemple {#examples} + +**Exemple d'utilisation** + +``` sql +SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3 +``` + +``` text +┌───x─┬─round(divide(number, 2))─┐ +│ 0 │ 0 │ +│ 0.5 │ 0 │ +│ 1 │ 1 │ +└─────┴──────────────────────────┘ +``` + +**Des exemples de l'arrondissement** + +Le résultat est arrondi au plus proche. + +``` text +round(3.2, 0) = 3 +round(4.1267, 2) = 4.13 +round(22,-1) = 20 +round(467,-2) = 500 +round(-467,-2) = -500 +``` + +Le Banquier arrondit. + +``` text +round(3.5) = 4 +round(4.5) = 4 +round(3.55, 1) = 3.6 +round(3.65, 1) = 3.6 +``` + +**Voir Aussi** + +- [roundBankers](#roundbankers) + +## roundBankers {#roundbankers} + +Arrondit un nombre à une position décimale spécifiée. + +- Si le nombre est arrondi à mi-chemin entre deux nombres, la fonction utilise l'arrondi. + + Banker's rounding is a method of rounding fractional numbers. When the rounding number is halfway between two numbers, it's rounded to the nearest even digit at the specified decimal position. For example: 3.5 rounds up to 4, 2.5 rounds down to 2. + + It's the default rounding method for floating point numbers defined in [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754#Roundings_to_nearest). The [round](#rounding_functions-round) function performs the same rounding for floating point numbers. The `roundBankers` function also rounds integers the same way, for example, `roundBankers(45, -1) = 40`. + +- Dans d'autres cas, la fonction arrondit les nombres à l'entier le plus proche. + +À l'aide de l'arrondi, vous pouvez réduire l'effet qu'arrondir les nombres sur les résultats d'additionner ou de soustraire ces chiffres. + +Par exemple, les nombres de somme 1.5, 2.5, 3.5, 4.5 avec des arrondis différents: + +- Pas d'arrondi: 1.5 + 2.5 + 3.5 + 4.5 = 12. +- Arrondi du banquier: 2 + 2 + 4 + 4 = 12. +- Arrondi à l'entier le plus proche: 2 + 3 + 4 + 5 = 14. + +**Syntaxe** + +``` sql +roundBankers(expression [, decimal_places]) +``` + +**Paramètre** + +- `expression` — A number to be rounded. Can be any [expression](../syntax.md#syntax-expressions) retour du numérique [type de données](../../data_types/index.md#data_types). +- `decimal-places` — Decimal places. An integer number. + - `decimal-places > 0` — The function rounds the number to the given position right of the decimal point. Example: `roundBankers(3.55, 1) = 3.6`. + - `decimal-places < 0` — The function rounds the number to the given position left of the decimal point. Example: `roundBankers(24.55, -1) = 20`. + - `decimal-places = 0` — The function rounds the number to an integer. In this case the argument can be omitted. Example: `roundBankers(2.5) = 2`. + +**Valeur renvoyée** + +Valeur arrondie par la méthode d'arrondi du banquier. + +### Exemple {#examples-1} + +**Exemple d'utilisation** + +Requête: + +``` sql + SELECT number / 2 AS x, roundBankers(x, 0) AS b fROM system.numbers limit 10 +``` + +Résultat: + +``` text +┌───x─┬─b─┐ +│ 0 │ 0 │ +│ 0.5 │ 0 │ +│ 1 │ 1 │ +│ 1.5 │ 2 │ +│ 2 │ 2 │ +│ 2.5 │ 2 │ +│ 3 │ 3 │ +│ 3.5 │ 4 │ +│ 4 │ 4 │ +│ 4.5 │ 4 │ +└─────┴───┘ +``` + +**Exemples d'arrondi bancaire** + +``` text +roundBankers(0.4) = 0 +roundBankers(-3.5) = -4 +roundBankers(4.5) = 4 +roundBankers(3.55, 1) = 3.6 +roundBankers(3.65, 1) = 3.6 +roundBankers(10.35, 1) = 10.4 +roundBankers(10.755, 2) = 11,76 +``` + +**Voir Aussi** + +- [rond](#rounding_functions-round) + +## roundToExp2 (num) {#roundtoexp2num} + +Accepte un certain nombre. Si le nombre est inférieur à un, elle renvoie 0. Sinon, il arrondit le nombre au degré le plus proche (entier non négatif) de deux. + +## roundDuration (num) {#rounddurationnum} + +Accepte un certain nombre. Si le nombre est inférieur à un, elle renvoie 0. Sinon, il arrondit le nombre vers le bas pour les nombres de l'ensemble: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000. Cette fonction est spécifique à Yandex.Metrica et utilisé pour la mise en œuvre du rapport sur la durée de la session. + +## roundAge (num) {#roundagenum} + +Accepte un certain nombre. Si le nombre est inférieur à 18, il renvoie 0. Sinon, il arrondit le nombre à un nombre de l'ensemble: 18, 25, 35, 45, 55. Cette fonction est spécifique à Yandex.Metrica et utilisé pour la mise en œuvre du rapport sur l'âge des utilisateurs. + +## roundDown(num, arr) {#rounddownnum-arr} + +Accepte un nombre et l'arrondit à un élément dans le tableau spécifié. Si la valeur est inférieure à la plus basse, la plus basse lié est retourné. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/rounding_functions/) diff --git a/docs/fr/query_language/functions/splitting_merging_functions.md b/docs/fr/query_language/functions/splitting_merging_functions.md new file mode 100644 index 00000000000..8f207f38259 --- /dev/null +++ b/docs/fr/query_language/functions/splitting_merging_functions.md @@ -0,0 +1,113 @@ +--- +machine_translated: true +--- + +# Fonctions pour diviser et fusionner des chaînes et des tableaux {#functions-for-splitting-and-merging-strings-and-arrays} + +## splitByChar (séparateur, s) {#splitbycharseparator-s} + +Divise une chaîne en sous-chaînes séparées par un caractère spécifique. Il utilise une chaîne constante `separator` qui composé d'un seul caractère. +Retourne un tableau de certaines chaînes. Les sous-chaînes vides peuvent être sélectionnées si le séparateur se produit au début ou à la fin de la chaîne, ou s'il existe plusieurs séparateurs consécutifs. + +**Syntaxe** + +``` sql +splitByChar(, ) +``` + +**Paramètre** + +- `separator` — The separator which should contain exactly one character. [Chaîne](../../data_types/string.md). +- `s` — The string to split. [Chaîne](../../data_types/string.md). + +**Valeur renvoyée(s)** + +Retourne un tableau de certaines chaînes. Des sous-chaînes vides peuvent être sélectionnées lorsque: + +- Un séparateur se produit au début ou à la fin de la chaîne; +- Il existe plusieurs séparateurs consécutifs; +- La chaîne d'origine `s` est vide. + +Type: [Tableau](../../data_types/array.md) de [Chaîne](../../data_types/string.md). + +**Exemple** + +``` sql +SELECT splitByChar(',', '1,2,3,abcde') +``` + +``` text +┌─splitByChar(',', '1,2,3,abcde')─┐ +│ ['1','2','3','abcde'] │ +└─────────────────────────────────┘ +``` + +## splitByString(séparateur, s) {#splitbystringseparator-s} + +Divise une chaîne en sous-chaînes séparées par une chaîne. Il utilise une chaîne constante `separator` de plusieurs caractères comme séparateur. Si la chaîne `separator` est vide, il va diviser la chaîne `s` dans un tableau de caractères uniques. + +**Syntaxe** + +``` sql +splitByString(, ) +``` + +**Paramètre** + +- `separator` — The separator. [Chaîne](../../data_types/string.md). +- `s` — The string to split. [Chaîne](../../data_types/string.md). + +**Valeur renvoyée(s)** + +Retourne un tableau de certaines chaînes. Des sous-chaînes vides peuvent être sélectionnées lorsque: + +Type: [Tableau](../../data_types/array.md) de [Chaîne](../../data_types/string.md). + +- Un séparateur non vide se produit au début ou à la fin de la chaîne; +- Il existe plusieurs séparateurs consécutifs non vides; +- La chaîne d'origine `s` est vide tandis que le séparateur n'est pas vide. + +**Exemple** + +``` sql +SELECT splitByString(', ', '1, 2 3, 4,5, abcde') +``` + +``` text +┌─splitByString(', ', '1, 2 3, 4,5, abcde')─┐ +│ ['1','2 3','4,5','abcde'] │ +└───────────────────────────────────────────┘ +``` + +``` sql +SELECT splitByString('', 'abcde') +``` + +``` text +┌─splitByString('', 'abcde')─┐ +│ ['a','b','c','d','e'] │ +└────────────────────────────┘ +``` + +## arrayStringConcat(arr \[, séparateur\]) {#arraystringconcatarr-separator} + +Concatène les chaînes répertoriées dans le tableau avec le séparateur."séparateur" est un paramètre facultatif: une chaîne constante, définie à une chaîne vide par défaut. +Retourne une chaîne de caractères. + +## alphaTokens (s) {#alphatokenss} + +Sélectionne des sous-chaînes d'octets consécutifs dans les plages A-z et A-Z. retourne un tableau de sous-chaînes. + +**Exemple** + +``` sql +SELECT alphaTokens('abca1abc') +``` + +``` text +┌─alphaTokens('abca1abc')─┐ +│ ['abca','abc'] │ +└─────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/splitting_merging_functions/) diff --git a/docs/fr/query_language/functions/string_functions.md b/docs/fr/query_language/functions/string_functions.md new file mode 100644 index 00000000000..fb6c5d608d1 --- /dev/null +++ b/docs/fr/query_language/functions/string_functions.md @@ -0,0 +1,486 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des chaînes {#functions-for-working-with-strings} + +## vide {#empty} + +Renvoie 1 pour une chaîne vide ou 0 pour une chaîne non vide. +Le type de résultat est UInt8. +Une chaîne est considérée comme non vide si elle contient au moins un octet, même s'il s'agit d'un espace ou d'un octet nul. +La fonction fonctionne également pour les tableaux. + +## notEmpty {#notempty} + +Renvoie 0 pour une chaîne vide ou 1 pour une chaîne non vide. +Le type de résultat est UInt8. +La fonction fonctionne également pour les tableaux. + +## longueur {#length} + +Renvoie la longueur d'une chaîne en octets (pas en caractères, et pas en points de code). +Le type de résultat est UInt64. +La fonction fonctionne également pour les tableaux. + +## lengthUTF8 {#lengthutf8} + +Renvoie la longueur d'une chaîne en points de code Unicode (pas en caractères), en supposant que la chaîne contient un ensemble d'octets qui composent le texte codé en UTF-8. Si cette hypothèse n'est pas remplie, elle renvoie un résultat (elle ne lance pas d'exception). +Le type de résultat est UInt64. + +## char\_length, CHAR\_LENGTH {#char-length} + +Renvoie la longueur d'une chaîne en points de code Unicode (pas en caractères), en supposant que la chaîne contient un ensemble d'octets qui composent le texte codé en UTF-8. Si cette hypothèse n'est pas remplie, elle renvoie un résultat (elle ne lance pas d'exception). +Le type de résultat est UInt64. + +## character\_length, CHARACTER\_LENGTH {#character-length} + +Renvoie la longueur d'une chaîne en points de code Unicode (pas en caractères), en supposant que la chaîne contient un ensemble d'octets qui composent le texte codé en UTF-8. Si cette hypothèse n'est pas remplie, elle renvoie un résultat (elle ne lance pas d'exception). +Le type de résultat est UInt64. + +## plus bas, lcase {#lower} + +Convertit les symboles latins ASCII dans une chaîne en minuscules. + +## supérieur, ucase {#upper} + +Convertit les symboles latins ASCII dans une chaîne en majuscules. + +## lowerUTF8 {#lowerutf8} + +Convertit une chaîne en minuscules, en supposant que la chaîne de caractères contient un ensemble d'octets qui composent un texte UTF-8. +Il ne détecte pas la langue. Donc, pour le turc, le résultat pourrait ne pas être exactement correct. +Si la longueur de la séquence d'octets UTF-8 est différente pour les majuscules et les minuscules d'un point de code, le résultat peut être incorrect pour ce point de code. +Si la chaîne contient un ensemble d'octets qui N'est pas UTF-8, le comportement n'est pas défini. + +## upperUTF8 {#upperutf8} + +Convertit une chaîne en majuscules, en supposant que la chaîne de caractères contient un ensemble d'octets qui composent un texte UTF-8. +Il ne détecte pas la langue. Donc, pour le turc, le résultat pourrait ne pas être exactement correct. +Si la longueur de la séquence d'octets UTF-8 est différente pour les majuscules et les minuscules d'un point de code, le résultat peut être incorrect pour ce point de code. +Si la chaîne contient un ensemble d'octets qui N'est pas UTF-8, le comportement n'est pas défini. + +## isValidUTF8 {#isvalidutf8} + +Renvoie 1, si l'ensemble d'octets est codé en UTF-8 valide, sinon 0. + +## toValidUTF8 {#tovalidutf8} + +Remplace les caractères UTF-8 non valides par `�` (U+FFFD) caractère. Tous les caractères non valides s'exécutant dans une rangée sont réduits en un seul caractère de remplacement. + +``` sql +toValidUTF8( input_string ) +``` + +Paramètre: + +- input\_string — Any set of bytes represented as the [Chaîne](../../data_types/string.md) type de données objet. + +Valeur renvoyée: chaîne UTF-8 valide. + +**Exemple** + +``` sql +SELECT toValidUTF8('\x61\xF0\x80\x80\x80b') +``` + +``` text +┌─toValidUTF8('a����b')─┐ +│ a�b │ +└───────────────────────┘ +``` + +## répéter {#repeat} + +Répète une corde autant de fois que spécifié et concatène les valeurs répliquées comme une seule chaîne. + +**Syntaxe** + +``` sql +repeat(s, n) +``` + +**Paramètre** + +- `s` — The string to repeat. [Chaîne](../../data_types/string.md). +- `n` — The number of times to repeat the string. [UInt](../../data_types/int_uint.md). + +**Valeur renvoyée** + +La chaîne unique, qui contient la chaîne `s` répéter `n` temps. Si `n` \< 1, la fonction renvoie une chaîne vide. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT repeat('abc', 10) +``` + +Résultat: + +``` text +┌─repeat('abc', 10)──────────────┐ +│ abcabcabcabcabcabcabcabcabcabc │ +└────────────────────────────────┘ +``` + +## inverser {#reverse} + +Inverse la chaîne (comme une séquence d'octets). + +## reverseUTF8 {#reverseutf8} + +Inverse une séquence de points de code Unicode, en supposant que la chaîne contient un ensemble d'octets représentant un texte UTF-8. Sinon, il fait autre chose (il ne lance pas d'exception). + +## format(pattern, s0, s1, …) {#format} + +Formatage du motif constant avec la chaîne listée dans les arguments. `pattern` est un modèle de format Python simplifié. Chaîne de Format contient “replacement fields” entouré par des accolades `{}`. Tout ce qui n'est pas contenu dans les accolades est considéré comme du texte littéral, qui est copié inchangé dans la sortie. Si vous devez inclure un caractère d'Accolade dans le texte littéral, il peut être échappé en doublant: `{{ '{{' }}` et `{{ '}}' }}`. Les noms de champs peuvent être des nombres (à partir de zéro) ou vides (ils sont alors traités comme des nombres de conséquence). + +``` sql +SELECT format('{1} {0} {1}', 'World', 'Hello') +``` + +``` text +┌─format('{1} {0} {1}', 'World', 'Hello')─┐ +│ Hello World Hello │ +└─────────────────────────────────────────┘ +``` + +``` sql +SELECT format('{} {}', 'Hello', 'World') +``` + +``` text +┌─format('{} {}', 'Hello', 'World')─┐ +│ Hello World │ +└───────────────────────────────────┘ +``` + +## concat {#concat} + +Concatène les chaînes répertoriées dans les arguments, sans séparateur. + +**Syntaxe** + +``` sql +concat(s1, s2, ...) +``` + +**Paramètre** + +Valeurs de type String ou FixedString. + +**Valeurs renvoyées** + +Renvoie la chaîne qui résulte de la concaténation des arguments. + +Si l'une des valeurs d'argument est `NULL`, `concat` retourner `NULL`. + +**Exemple** + +Requête: + +``` sql +SELECT concat('Hello, ', 'World!') +``` + +Résultat: + +``` text +┌─concat('Hello, ', 'World!')─┐ +│ Hello, World! │ +└─────────────────────────────┘ +``` + +## concatAssumeInjective {#concatassumeinjective} + +Même que [concat](#concat) la différence est que vous devez vous assurer que `concat(s1, s2, ...) → sn` est injectif, il sera utilisé pour l'optimisation du groupe par. + +La fonction est nommée “injective” si elle renvoie toujours un résultat différent pour différentes valeurs d'arguments. En d'autres termes: des arguments différents ne donnent jamais un résultat identique. + +**Syntaxe** + +``` sql +concatAssumeInjective(s1, s2, ...) +``` + +**Paramètre** + +Valeurs de type String ou FixedString. + +**Valeurs renvoyées** + +Renvoie la chaîne qui résulte de la concaténation des arguments. + +Si l'une des valeurs d'argument est `NULL`, `concatAssumeInjective` retourner `NULL`. + +**Exemple** + +Table d'entrée: + +``` sql +CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog; +INSERT INTO key_val VALUES ('Hello, ','World',1), ('Hello, ','World',2), ('Hello, ','World!',3), ('Hello',', World!',2); +SELECT * from key_val; +``` + +``` text +┌─key1────┬─key2─────┬─value─┐ +│ Hello, │ World │ 1 │ +│ Hello, │ World │ 2 │ +│ Hello, │ World! │ 3 │ +│ Hello │ , World! │ 2 │ +└─────────┴──────────┴───────┘ +``` + +Requête: + +``` sql +SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY concatAssumeInjective(key1, key2) +``` + +Résultat: + +``` text +┌─concat(key1, key2)─┬─sum(value)─┐ +│ Hello, World! │ 3 │ +│ Hello, World! │ 2 │ +│ Hello, World │ 3 │ +└────────────────────┴────────────┘ +``` + +## substring(s, offset, longueur), mid(s, offset, longueur), substr(s, offset, longueur) {#substring} + +Renvoie une sous-chaîne commençant par l'octet du ‘offset’ index ‘length’ octets de long. L'indexation des caractères commence à partir d'un (comme dans SQL standard). Le ‘offset’ et ‘length’ les arguments doivent être des constantes. + +## substringUTF8(s, offset, longueur) {#substringutf8} + +Le même que ‘substring’, mais pour les points de code Unicode. Fonctionne sous l'hypothèse que la chaîne contient un ensemble d'octets représentant un texte codé en UTF-8. Si cette hypothèse n'est pas remplie, elle renvoie un résultat (elle ne lance pas d'exception). + +## appendTrailingCharIfAbsent (s, c) {#appendtrailingcharifabsent} + +Si l' ‘s’ la chaîne n'est pas vide et ne contient pas ‘c’ personnage à la fin, il ajoute le ‘c’ personnage à la fin. + +## convertCharset(s, à partir de, à) {#convertcharset} + +Retourne une chaîne de caractères ‘s’ qui a été converti à partir de l'encodage dans ‘from’ pour l'encodage dans ‘to’. + +## base64Encode(s) {#base64encode} + +Encodage ‘s’ chaîne dans base64 + +## base64Decode(s) {#base64decode} + +Décoder la chaîne codée en base64 ‘s’ dans la chaîne d'origine. En cas d'échec, une exception est levée. + +## tryBase64Decode(s) {#trybase64decode} + +Semblable à base64Decode, mais en cas d'erreur, une chaîne vide serait renvoyé. + +## endsWith (s, suffixe) {#endswith} + +Renvoie s'il faut se terminer par le suffixe spécifié. Retourne 1 si la chaîne se termine par le suffixe spécifié, sinon elle renvoie 0. + +## startsWith (STR, préfixe) {#startswith} + +Retourne 1 si la chaîne commence par le préfixe spécifié, sinon elle renvoie 0. + +``` sql +SELECT startsWith('Spider-Man', 'Spi'); +``` + +**Valeurs renvoyées** + +- 1, si la chaîne commence par le préfixe spécifié. +- 0, si la chaîne ne commence pas par le préfixe spécifié. + +**Exemple** + +Requête: + +``` sql +SELECT startsWith('Hello, world!', 'He'); +``` + +Résultat: + +``` text +┌─startsWith('Hello, world!', 'He')─┐ +│ 1 │ +└───────────────────────────────────┘ +``` + +## coupe {#trim} + +Supprime tous les caractères spécifiés du début ou de la fin d'une chaîne. +Par défaut supprime toutes les occurrences consécutives d'espaces communs (caractère ASCII 32) des deux extrémités d'une chaîne. + +**Syntaxe** + +``` sql +trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string) +``` + +**Paramètre** + +- `trim_character` — specified characters for trim. [Chaîne](../../data_types/string.md). +- `input_string` — string for trim. [Chaîne](../../data_types/string.md). + +**Valeur renvoyée** + +Une chaîne sans caractères de début et (ou) de fin spécifiés. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT trim(BOTH ' ()' FROM '( Hello, world! )') +``` + +Résultat: + +``` text +┌─trim(BOTH ' ()' FROM '( Hello, world! )')─┐ +│ Hello, world! │ +└───────────────────────────────────────────────┘ +``` + +## trimLeft {#trimleft} + +Supprime toutes les occurrences consécutives d'espaces communs (caractère ASCII 32) depuis le début d'une chaîne. Il ne supprime pas d'autres types de caractères d'espaces (tabulation, espace sans pause, etc.). + +**Syntaxe** + +``` sql +trimLeft(input_string) +``` + +Alias: `ltrim(input_string)`. + +**Paramètre** + +- `input_string` — string to trim. [Chaîne](../../data_types/string.md). + +**Valeur renvoyée** + +Une chaîne sans ouvrir les espaces communs. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT trimLeft(' Hello, world! ') +``` + +Résultat: + +``` text +┌─trimLeft(' Hello, world! ')─┐ +│ Hello, world! │ +└─────────────────────────────────────┘ +``` + +## trimRight {#trimright} + +Supprime toutes les occurrences consécutives d'espaces communs (caractère ASCII 32) de la fin d'une chaîne. Il ne supprime pas d'autres types de caractères d'espaces (tabulation, espace sans pause, etc.). + +**Syntaxe** + +``` sql +trimRight(input_string) +``` + +Alias: `rtrim(input_string)`. + +**Paramètre** + +- `input_string` — string to trim. [Chaîne](../../data_types/string.md). + +**Valeur renvoyée** + +Une chaîne sans espaces communs de fin. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT trimRight(' Hello, world! ') +``` + +Résultat: + +``` text +┌─trimRight(' Hello, world! ')─┐ +│ Hello, world! │ +└──────────────────────────────────────┘ +``` + +## trimBoth {#trimboth} + +Supprime toutes les occurrences consécutives d'espaces communs (caractère ASCII 32) des deux extrémités d'une chaîne. Il ne supprime pas d'autres types de caractères d'espaces (tabulation, espace sans pause, etc.). + +**Syntaxe** + +``` sql +trimBoth(input_string) +``` + +Alias: `trim(input_string)`. + +**Paramètre** + +- `input_string` — string to trim. [Chaîne](../../data_types/string.md). + +**Valeur renvoyée** + +Une chaîne sans espaces communs de début et de fin. + +Type: `String`. + +**Exemple** + +Requête: + +``` sql +SELECT trimBoth(' Hello, world! ') +``` + +Résultat: + +``` text +┌─trimBoth(' Hello, world! ')─┐ +│ Hello, world! │ +└─────────────────────────────────────┘ +``` + +## CRC32 (s) {#crc32} + +Renvoie la somme de contrôle CRC32 d'une chaîne, en utilisant le polynôme CRC-32-IEEE 802.3 et la valeur initiale `0xffffffff` (zlib mise en œuvre). + +Le type de résultat est UInt32. + +## CRC32IEEE (s) {#crc32ieee} + +Renvoie la somme de contrôle CRC32 d'une chaîne, en utilisant le polynôme CRC-32-IEEE 802.3. + +Le type de résultat est UInt32. + +## CRC64 (s) {#crc64} + +Renvoie la somme de contrôle CRC64 d'une chaîne, en utilisant le polynôme CRC-64-ECMA. + +Le type de résultat est UInt64. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/string_functions/) diff --git a/docs/fr/query_language/functions/string_replace_functions.md b/docs/fr/query_language/functions/string_replace_functions.md new file mode 100644 index 00000000000..522451ef910 --- /dev/null +++ b/docs/fr/query_language/functions/string_replace_functions.md @@ -0,0 +1,91 @@ +--- +machine_translated: true +--- + +# Les fonctions de recherche et de remplacement dans les chaînes {#functions-for-searching-and-replacing-in-strings} + +## replaceOne(botte de foin, modèle, remplacement) {#replaceonehaystack-pattern-replacement} + +Remplace la première occurrence, si elle existe, ‘pattern’ sous-chaîne dans ‘haystack’ avec l' ‘replacement’ substring. +Ci-après, ‘pattern’ et ‘replacement’ doivent être constantes. + +## replaceAll(botte de foin, motif, remplacement), Remplacer(botte de foin, motif, remplacement) {#replaceallhaystack-pattern-replacement-replacehaystack-pattern-replacement} + +Remplace toutes les occurrences du ‘pattern’ sous-chaîne dans ‘haystack’ avec l' ‘replacement’ substring. + +## replaceRegexpOne(botte de foin, modèle, remplacement) {#replaceregexponehaystack-pattern-replacement} + +Remplacement en utilisant le ‘pattern’ expression régulière. Une expression régulière re2. +Remplace seulement la première occurrence, si elle existe. +Un motif peut être spécifié comme ‘replacement’. Ce modèle peut inclure des substitutions `\0-\9`. +Substitution `\0` inclut l'expression régulière entière. Substitution `\1-\9` correspond au sous-modèle numbers.To utilisez le `\` caractère dans un modèle, échappez-le en utilisant `\`. +Aussi garder à l'esprit qu'un littéral de chaîne nécessite une évasion. + +Exemple 1. Conversion de la date au format américain: + +``` sql +SELECT DISTINCT + EventDate, + replaceRegexpOne(toString(EventDate), '(\\d{4})-(\\d{2})-(\\d{2})', '\\2/\\3/\\1') AS res +FROM test.hits +LIMIT 7 +FORMAT TabSeparated +``` + +``` text +2014-03-17 03/17/2014 +2014-03-18 03/18/2014 +2014-03-19 03/19/2014 +2014-03-20 03/20/2014 +2014-03-21 03/21/2014 +2014-03-22 03/22/2014 +2014-03-23 03/23/2014 +``` + +Exemple 2. Copier une chaîne dix fois: + +``` sql +SELECT replaceRegexpOne('Hello, World!', '.*', '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0') AS res +``` + +``` text +┌─res────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World! │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## replaceRegexpAll(botte de foin, modèle, remplacement) {#replaceregexpallhaystack-pattern-replacement} + +Cela fait la même chose, mais remplace toutes les occurrences. Exemple: + +``` sql +SELECT replaceRegexpAll('Hello, World!', '.', '\\0\\0') AS res +``` + +``` text +┌─res────────────────────────┐ +│ HHeelllloo,, WWoorrlldd!! │ +└────────────────────────────┘ +``` + +Par exception, si une expression régulière travaillé sur un vide sous-chaîne, le remplacement n'est pas effectué plus d'une fois. +Exemple: + +``` sql +SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res +``` + +``` text +┌─res─────────────────┐ +│ here: Hello, World! │ +└─────────────────────┘ +``` + +## regexpQuoteMeta (s) {#regexpquotemetas} + +La fonction ajoute une barre oblique inverse avant certains caractères prédéfinis dans la chaîne. +Les personnages prédéfinis: ‘0’, ‘\\’, ‘\|’, ‘(’, ‘)’, ‘^’, ‘$’, ‘.’, ‘\[’, '\]', ‘?’, '\*‘,’+‘,’{‘,’:‘,’-'. +Cette implémentation diffère légèrement de re2:: RE2:: QuoteMeta. Il échappe à zéro octet comme \\0 au lieu de 00 et il échappe uniquement les caractères requis. +Pour plus d'informations, voir le lien: [RE2](https://github.com/google/re2/blob/master/re2/re2.cc#L473) + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/string_replace_functions/) diff --git a/docs/fr/query_language/functions/string_search_functions.md b/docs/fr/query_language/functions/string_search_functions.md new file mode 100644 index 00000000000..d519005ef58 --- /dev/null +++ b/docs/fr/query_language/functions/string_search_functions.md @@ -0,0 +1,376 @@ +--- +machine_translated: true +--- + +# Fonctions de recherche de chaînes {#functions-for-searching-strings} + +La recherche est sensible à la casse par défaut dans toutes ces fonctions. Il existe des variantes pour la recherche insensible à la casse. + +## position(botte de foin, aiguille), localiser( botte de foin, aiguille) {#position} + +Renvoie la position (en octets) de la sous-chaîne trouvée dans la chaîne, à partir de 1. + +Fonctionne sous l'hypothèse que la chaîne de caractères contient un ensemble d'octets représentant un octet texte codé. Si cette hypothèse n'est pas remplie et qu'un caractère ne peut pas être représenté à l'aide d'un seul octet, la fonction ne lance pas d'exception et renvoie un résultat inattendu. Si le caractère peut être représenté en utilisant deux octets, il utilisera deux octets et ainsi de suite. + +Pour une recherche insensible à la casse, utilisez la fonction [positioncaseinsensible](#positioncaseinsensitive). + +**Syntaxe** + +``` sql +position(haystack, needle) +``` + +Alias: `locate(haystack, needle)`. + +**Paramètre** + +- `haystack` — string, in which substring will to be searched. [Chaîne](../syntax.md#syntax-string-literal). +- `needle` — substring to be searched. [Chaîne](../syntax.md#syntax-string-literal). + +**Valeurs renvoyées** + +- Position de départ en octets (à partir de 1), si la sous-chaîne a été trouvée. +- 0, si la sous-chaîne n'a pas été trouvé. + +Type: `Integer`. + +**Exemple** + +Phrase “Hello, world!” contient un ensemble d'octets représentant un octet texte codé. La fonction renvoie un résultat attendu: + +Requête: + +``` sql +SELECT position('Hello, world!', '!') +``` + +Résultat: + +``` text +┌─position('Hello, world!', '!')─┐ +│ 13 │ +└────────────────────────────────┘ +``` + +La même phrase en russe contient des caractères qui ne peuvent pas être représentés en utilisant un seul octet. La fonction renvoie un résultat inattendu (utilisation [positionUTF8](#positionutf8) fonction pour le texte codé sur plusieurs octets): + +Requête: + +``` sql +SELECT position('Привет, мир!', '!') +``` + +Résultat: + +``` text +┌─position('Привет, мир!', '!')─┐ +│ 21 │ +└───────────────────────────────┘ +``` + +## positioncaseinsensible {#positioncaseinsensitive} + +Le même que [position](#position) renvoie la position (en octets) de la sous-chaîne trouvée dans la chaîne, à partir de 1. Utilisez la fonction pour une recherche insensible à la casse. + +Fonctionne sous l'hypothèse que la chaîne de caractères contient un ensemble d'octets représentant un octet texte codé. Si cette hypothèse n'est pas remplie et qu'un caractère ne peut pas être représenté à l'aide d'un seul octet, la fonction ne lance pas d'exception et renvoie un résultat inattendu. Si le caractère peut être représenté en utilisant deux octets, il utilisera deux octets et ainsi de suite. + +**Syntaxe** + +``` sql +positionCaseInsensitive(haystack, needle) +``` + +**Paramètre** + +- `haystack` — string, in which substring will to be searched. [Chaîne](../syntax.md#syntax-string-literal). +- `needle` — substring to be searched. [Chaîne](../syntax.md#syntax-string-literal). + +**Valeurs renvoyées** + +- Position de départ en octets (à partir de 1), si la sous-chaîne a été trouvée. +- 0, si la sous-chaîne n'a pas été trouvé. + +Type: `Integer`. + +**Exemple** + +Requête: + +``` sql +SELECT positionCaseInsensitive('Hello, world!', 'hello') +``` + +Résultat: + +``` text +┌─positionCaseInsensitive('Hello, world!', 'hello')─┐ +│ 1 │ +└───────────────────────────────────────────────────┘ +``` + +## positionUTF8 {#positionutf8} + +Renvoie la position (en points Unicode) de la sous-chaîne trouvée dans la chaîne, à partir de 1. + +Fonctionne sous l'hypothèse que la chaîne contient un ensemble d'octets représentant un texte codé en UTF-8. Si cette hypothèse n'est pas remplie, la fonction ne lance pas d'exception et renvoie un résultat inattendu. Si le caractère peut être représenté en utilisant deux points Unicode, il en utilisera deux et ainsi de suite. + +Pour une recherche insensible à la casse, utilisez la fonction [positionCaseInsensitiveUTF8](#positioncaseinsensitiveutf8). + +**Syntaxe** + +``` sql +positionUTF8(haystack, needle) +``` + +**Paramètre** + +- `haystack` — string, in which substring will to be searched. [Chaîne](../syntax.md#syntax-string-literal). +- `needle` — substring to be searched. [Chaîne](../syntax.md#syntax-string-literal). + +**Valeurs renvoyées** + +- Position de départ dans les points Unicode (à partir de 1), si la sous-chaîne a été trouvée. +- 0, si la sous-chaîne n'a pas été trouvé. + +Type: `Integer`. + +**Exemple** + +Phrase “Hello, world!” en russe contient un ensemble de points Unicode représentant un texte codé à un seul point. La fonction renvoie un résultat attendu: + +Requête: + +``` sql +SELECT positionUTF8('Привет, мир!', '!') +``` + +Résultat: + +``` text +┌─positionUTF8('Привет, мир!', '!')─┐ +│ 12 │ +└───────────────────────────────────┘ +``` + +Phrase “Salut, étudiante!” où le caractère `é` peut être représenté en utilisant un point (`U+00E9`) ou deux points (`U+0065U+0301`) la fonction peut être retournée un résultat inattendu: + +Requête pour la lettre `é` qui est représenté un point Unicode `U+00E9`: + +``` sql +SELECT positionUTF8('Salut, étudiante!', '!') +``` + +Résultat: + +``` text +┌─positionUTF8('Salut, étudiante!', '!')─┐ +│ 17 │ +└────────────────────────────────────────┘ +``` + +Requête pour la lettre `é` qui est représenté deux points Unicode `U+0065U+0301`: + +``` sql +SELECT positionUTF8('Salut, étudiante!', '!') +``` + +Résultat: + +``` text +┌─positionUTF8('Salut, étudiante!', '!')─┐ +│ 18 │ +└────────────────────────────────────────┘ +``` + +## positionCaseInsensitiveUTF8 {#positioncaseinsensitiveutf8} + +Le même que [positionUTF8](#positionutf8) mais est sensible à la casse. Renvoie la position (en points Unicode) de la sous-chaîne trouvée dans la chaîne, à partir de 1. + +Fonctionne sous l'hypothèse que la chaîne contient un ensemble d'octets représentant un texte codé en UTF-8. Si cette hypothèse n'est pas remplie, la fonction ne lance pas d'exception et renvoie un résultat inattendu. Si le caractère peut être représenté en utilisant deux points Unicode, il en utilisera deux et ainsi de suite. + +**Syntaxe** + +``` sql +positionCaseInsensitiveUTF8(haystack, needle) +``` + +**Paramètre** + +- `haystack` — string, in which substring will to be searched. [Chaîne](../syntax.md#syntax-string-literal). +- `needle` — substring to be searched. [Chaîne](../syntax.md#syntax-string-literal). + +**Valeur renvoyée** + +- Position de départ dans les points Unicode (à partir de 1), si la sous-chaîne a été trouvée. +- 0, si la sous-chaîne n'a pas été trouvé. + +Type: `Integer`. + +**Exemple** + +Requête: + +``` sql +SELECT positionCaseInsensitiveUTF8('Привет, мир!', 'Мир') +``` + +Résultat: + +``` text +┌─positionCaseInsensitiveUTF8('Привет, мир!', 'Мир')─┐ +│ 9 │ +└────────────────────────────────────────────────────┘ +``` + +## multirecherchallpositions {#multisearchallpositions} + +Le même que [position](string_search_functions.md#position) mais les retours `Array` des positions (en octets) des sous-chaînes correspondantes trouvées dans la chaîne. Les Positions sont indexées à partir de 1. + +La recherche est effectuée sur des séquences d'octets sans tenir compte de l'encodage et du classement des chaînes. + +- Pour une recherche ASCII insensible à la casse, utilisez la fonction `multiSearchAllPositionsCaseInsensitive`. +- Pour la recherche en UTF-8, Utilisez la fonction [multiSearchAllPositionsUTF8](#multiSearchAllPositionsUTF8). +- Pour la recherche UTF-8 insensible à la casse, utilisez la fonction multiSearchAllPositionsCaseInsensitiveutf8. + +**Syntaxe** + +``` sql +multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen]) +``` + +**Paramètre** + +- `haystack` — string, in which substring will to be searched. [Chaîne](../syntax.md#syntax-string-literal). +- `needle` — substring to be searched. [Chaîne](../syntax.md#syntax-string-literal). + +**Valeurs renvoyées** + +- Tableau de positions de départ en octets (à partir de 1), si la sous-chaîne correspondante a été trouvée et 0 si elle n'est pas trouvée. + +**Exemple** + +Requête: + +``` sql +SELECT multiSearchAllPositions('Hello, World!', ['hello', '!', 'world']) +``` + +Résultat: + +``` text +┌─multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])─┐ +│ [0,13,0] │ +└───────────────────────────────────────────────────────────────────┘ +``` + +## multiSearchAllPositionsUTF8 {#multiSearchAllPositionsUTF8} + +Voir `multiSearchAllPositions`. + +## multiSearchFirstPosition(botte de foin, \[aiguille1, aiguille2, …, needleet\]) {#multisearchfirstposition} + +Le même que `position` mais renvoie le décalage le plus à gauche de la chaîne `haystack` et qui correspond à certains des aiguilles. + +Pour une recherche insensible à la casse ou/et au format UTF-8, utilisez les fonctions `multiSearchFirstPositionCaseInsensitive, multiSearchFirstPositionUTF8, multiSearchFirstPositionCaseInsensitiveUTF8`. + +## multiSearchFirstIndex(botte de foin, \[aiguille1, aiguille2, …, needleet\]) {#multisearchfirstindexhaystack-needle1-needle2-needlen} + +Renvoie l'index `i` (à partir de 1) de l'aiguille trouvée la plus à gaucheje dans la chaîne `haystack` et 0 sinon. + +Pour une recherche insensible à la casse ou/et au format UTF-8, utilisez les fonctions `multiSearchFirstIndexCaseInsensitive, multiSearchFirstIndexUTF8, multiSearchFirstIndexCaseInsensitiveUTF8`. + +## multiSearchAny(botte de foin, \[aiguille1, aiguille2, …, needleet\]) {#function-multisearchany} + +Renvoie 1, si au moins une aiguille de chaîneje correspond à la chaîne `haystack` et 0 sinon. + +Pour une recherche insensible à la casse ou/et au format UTF-8, utilisez les fonctions `multiSearchAnyCaseInsensitive, multiSearchAnyUTF8, multiSearchAnyCaseInsensitiveUTF8`. + +!!! note "Note" + Dans tous les `multiSearch*` fonctions le nombre d'aiguilles doit être d'au moins 28 en raison de la spécification de mise en œuvre. + +## match (botte de foin, motif) {#matchhaystack-pattern} + +Vérifie si la chaîne correspond au `pattern` expression régulière. Un `re2` expression régulière. Le [syntaxe](https://github.com/google/re2/wiki/Syntax) de la `re2` les expressions régulières sont plus limitées que la syntaxe des expressions régulières Perl. + +Renvoie 0 si elle ne correspond pas, ou 1 si elle correspond. + +Notez que le symbole antislash (`\`) est utilisé pour s'échapper dans l'expression régulière. Le même symbole est utilisé pour échapper dans les littéraux de chaîne. Donc, pour échapper au symbole dans une expression régulière, vous devez écrire deux barres obliques inverses ( \\ ) dans un littéral de chaîne. + +L'expression régulière travaille à la chaîne, comme si c'est un ensemble d'octets. L'expression régulière ne peut pas contenir d'octets nuls. +Pour que les modèles recherchent des sous-chaînes dans une chaîne, il est préférable D'utiliser LIKE ou ‘position’ depuis ils travaillent beaucoup plus vite. + +## multiMatchAny(botte de foin, \[motif1, modèle2, …, patternet\]) {#multimatchanyhaystack-pattern1-pattern2-patternn} + +Le même que `match` mais renvoie 0 si aucune des expressions régulières sont appariés et 1 si l'un des modèles les matchs. Il utilise [hyperscan](https://github.com/intel/hyperscan) bibliothèque. Pour que les modèles recherchent des sous-chaînes dans une chaîne, il est préférable d'utiliser `multiSearchAny` comme cela fonctionne beaucoup plus vite. + +!!! note "Note" + La longueur de l'un des `haystack` la chaîne doit être inférieure à 232 octets sinon l'exception est levée. Cette restriction a lieu en raison de l'API hyperscan. + +## multiMatchAnyIndex(botte de foin, \[motif1, modèle2, …, patternet\]) {#multimatchanyindexhaystack-pattern1-pattern2-patternn} + +Le même que `multiMatchAny` mais retourne un index qui correspond à la botte de foin. + +## multiMatchAllIndices(botte de foin, \[motif1, modèle2, …, patternet\]) {#multimatchallindiceshaystack-pattern1-pattern2-patternn} + +Le même que `multiMatchAny`, mais renvoie le tableau de tous les indices qui correspondent à la botte de foin dans n'importe quel ordre. + +## multiFuzzyMatchAny(botte de foin, distance, \[motif1, modèle2, …, patternet\]) {#multifuzzymatchanyhaystack-distance-pattern1-pattern2-patternn} + +Le même que `multiMatchAny`, mais renvoie 1 si un motif correspond à la botte de foin dans une constante [distance d'édition](https://en.wikipedia.org/wiki/Edit_distance). Cette fonction est également en mode expérimental et peut être extrêmement lente. Pour plus d'informations, voir [documentation hyperscan](https://intel.github.io/hyperscan/dev-reference/compilation.html#approximate-matching). + +## multiFuzzyMatchAnyIndex(botte de foin, distance, \[motif1, modèle2, …, patternet\]) {#multifuzzymatchanyindexhaystack-distance-pattern1-pattern2-patternn} + +Le même que `multiFuzzyMatchAny`, mais renvoie tout index qui correspond à la botte de foin à une distance d'édition constante. + +## multiFuzzyMatchAllIndices(botte de foin, distance, \[motif1, modèle2, …, patternet\]) {#multifuzzymatchallindiceshaystack-distance-pattern1-pattern2-patternn} + +Le même que `multiFuzzyMatchAny`, mais renvoie le tableau de tous les indices dans n'importe quel ordre qui correspond à la botte de foin à une distance d'édition constante. + +!!! note "Note" + `multiFuzzyMatch*` les fonctions ne prennent pas en charge les expressions régulières UTF-8, et ces expressions sont traitées comme des octets en raison de la restriction hyperscan. + +!!! note "Note" + Pour désactiver toutes les fonctions qui utilisent hyperscan, utilisez le réglage `SET allow_hyperscan = 0;`. + +## extrait(botte de foin, motif) {#extracthaystack-pattern} + +Extraits d'un fragment d'une chaîne à l'aide d'une expression régulière. Si ‘haystack’ ne correspond pas à l' ‘pattern’ regex, une chaîne vide est renvoyée. Si l'expression rationnelle ne contient pas de sous-modèles, elle prend le fragment qui correspond à l'expression rationnelle entière. Sinon, il prend le fragment qui correspond au premier sous-masque. + +## extractAll(botte de foin, motif) {#extractallhaystack-pattern} + +Extrait tous les fragments d'une chaîne à l'aide d'une expression régulière. Si ‘haystack’ ne correspond pas à l' ‘pattern’ regex, une chaîne vide est renvoyée. Renvoie un tableau de chaînes composé de toutes les correspondances à l'expression rationnelle. En général, le comportement est le même que le ‘extract’ fonction (il prend le premier sous-masque, ou l'expression entière s'il n'y a pas de sous-masque). + +## comme (botte de foin, motif), botte de foin comme opérateur de motif {#function-like} + +Vérifie si une chaîne correspond à une expression régulière simple. +L'expression régulière peut contenir les métasymboles `%` et `_`. + +`%` indique n'importe quelle quantité d'octets (y compris zéro caractère). + +`_` indique un octet. + +Utilisez la barre oblique inverse (`\`) pour échapper aux métasymboles. Voir la note sur l'échappement dans la description du ‘match’ fonction. + +Pour les expressions régulières comme `%needle%`, le code est plus optimale et fonctionne aussi vite que le `position` fonction. +Pour d'autres expressions régulières, le code est le même que pour la ‘match’ fonction. + +## notLike (botte de foin, motif), botte de foin pas comme opérateur de motif {#function-notlike} + +La même chose que ‘like’ mais négative. + +## ngramDistance(botte de foin, aiguille) {#ngramdistancehaystack-needle} + +Calcule la distance de 4 grammes entre `haystack` et `needle`: counts the symmetric difference between two multisets of 4-grams and normalizes it by the sum of their cardinalities. Returns float number from 0 to 1 – the closer to zero, the more strings are similar to each other. If the constant `needle` ou `haystack` est plus de 32Kb, jette une exception. Si une partie de la non-constante `haystack` ou `needle` les chaînes sont plus que 32Kb, la distance est toujours un. + +Pour une recherche insensible à la casse ou/et au format UTF-8, utilisez les fonctions `ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8`. + +## ngramSearch(botte de foin, aiguille) {#ngramsearchhaystack-needle} + +Même que `ngramDistance` mais calcule la différence non symétrique entre `needle` et `haystack` – the number of n-grams from needle minus the common number of n-grams normalized by the number of `needle` n-grammes. Le plus proche d'un, le plus probable `needle` est dans le `haystack`. Peut être utile pour la recherche de chaîne floue. + +Pour une recherche insensible à la casse ou/et au format UTF-8, utilisez les fonctions `ngramSearchCaseInsensitive, ngramSearchUTF8, ngramSearchCaseInsensitiveUTF8`. + +!!! note "Note" + For UTF-8 case we use 3-gram distance. All these are not perfectly fair n-gram distances. We use 2-byte hashes to hash n-grams and then calculate the (non-)symmetric difference between these hash tables – collisions may occur. With UTF-8 case-insensitive format we do not use fair `tolower` function – we zero the 5-th bit (starting from zero) of each codepoint byte and first bit of zeroth byte if bytes more than one – this works for Latin and mostly for all Cyrillic letters. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/string_search_functions/) diff --git a/docs/fr/query_language/functions/type_conversion_functions.md b/docs/fr/query_language/functions/type_conversion_functions.md new file mode 100644 index 00000000000..23c84e9fb40 --- /dev/null +++ b/docs/fr/query_language/functions/type_conversion_functions.md @@ -0,0 +1,423 @@ +--- +machine_translated: true +--- + +# Fonctions De Conversion De Type {#type-conversion-functions} + +## Problèmes courants des Conversions numériques {#numeric-conversion-issues} + +Lorsque vous convertissez une valeur d'un type de données à un autre, vous devez vous rappeler que dans le cas courant, il s'agit d'une opération dangereuse qui peut entraîner une perte de données. Une perte de données peut se produire si vous essayez d'ajuster la valeur d'un type de données plus grand à un type de données plus petit, ou si vous convertissez des valeurs entre différents types de données. + +ClickHouse a le [même comportement que les programmes C++ ](https://en.cppreference.com/w/cpp/language/implicit_conversion). + +## toInt (8/16/32/64) {#toint8163264} + +Convertit une valeur d'entrée en [Int](../../data_types/int_uint.md) type de données. Cette fonction comprend: + +- `toInt8(expr)` — Results in the `Int8` type de données. +- `toInt16(expr)` — Results in the `Int16` type de données. +- `toInt32(expr)` — Results in the `Int32` type de données. +- `toInt64(expr)` — Results in the `Int64` type de données. + +**Paramètre** + +- `expr` — [Expression](../syntax.md#syntax-expressions) renvoyer un nombre ou une chaîne avec la représentation décimale d'un nombre. Les représentations binaires, octales et hexadécimales des nombres ne sont pas prises en charge. Les zéros principaux sont dépouillés. + +**Valeur renvoyée** + +Valeur entière dans le `Int8`, `Int16`, `Int32`, ou `Int64` type de données. + +Fonctions d'utilisation [l'arrondi vers zéro](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero), ce qui signifie qu'ils tronquent des chiffres fractionnaires de nombres. + +Le comportement des fonctions pour le [NaN et Inf](../../data_types/float.md#data_type-float-nan-inf) arguments est indéfini. Rappelez-vous sur [problèmes de conversion numérique](#numeric-conversion-issues), lorsque vous utilisez les fonctions. + +**Exemple** + +``` sql +SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8) +``` + +``` text +┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐ +│ -9223372036854775808 │ 32 │ 16 │ 8 │ +└──────────────────────┴─────────────┴───────────────┴─────────────┘ +``` + +## toInt (8/16/32/64)OrZero {#toint8163264orzero} + +Il prend un argument de type String et essaie de l'analyser en Int (8 \| 16 \| 32 \| 64). En cas d'échec, renvoie 0. + +**Exemple** + +``` sql +select toInt64OrZero('123123'), toInt8OrZero('123qwe123') +``` + +``` text +┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐ +│ 123123 │ 0 │ +└─────────────────────────┴───────────────────────────┘ +``` + +## toInt (8/16/32/64)OrNull {#toint8163264ornull} + +Il prend un argument de type String et essaie de l'analyser en Int (8 \| 16 \| 32 \| 64). En cas d'échec, renvoie NULL. + +**Exemple** + +``` sql +select toInt64OrNull('123123'), toInt8OrNull('123qwe123') +``` + +``` text +┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐ +│ 123123 │ ᴺᵁᴸᴸ │ +└─────────────────────────┴───────────────────────────┘ +``` + +## toUInt (8/16/32/64) {#touint8163264} + +Convertit une valeur d'entrée en [UInt](../../data_types/int_uint.md) type de données. Cette fonction comprend: + +- `toUInt8(expr)` — Results in the `UInt8` type de données. +- `toUInt16(expr)` — Results in the `UInt16` type de données. +- `toUInt32(expr)` — Results in the `UInt32` type de données. +- `toUInt64(expr)` — Results in the `UInt64` type de données. + +**Paramètre** + +- `expr` — [Expression](../syntax.md#syntax-expressions) renvoyer un nombre ou une chaîne avec la représentation décimale d'un nombre. Les représentations binaires, octales et hexadécimales des nombres ne sont pas prises en charge. Les zéros principaux sont dépouillés. + +**Valeur renvoyée** + +Valeur entière dans le `UInt8`, `UInt16`, `UInt32`, ou `UInt64` type de données. + +Fonctions d'utilisation [l'arrondi vers zéro](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero), ce qui signifie qu'ils tronquent des chiffres fractionnaires de nombres. + +Le comportement des fonctions pour les agruments négatifs et pour le [NaN et Inf](../../data_types/float.md#data_type-float-nan-inf) arguments est indéfini. Si vous passez une chaîne avec un nombre négatif, par exemple `'-32'`, ClickHouse soulève une exception. Rappelez-vous sur [problèmes de conversion numérique](#numeric-conversion-issues), lorsque vous utilisez les fonctions. + +**Exemple** + +``` sql +SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8) +``` + +``` text +┌───────toUInt64(nan)─┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐ +│ 9223372036854775808 │ 4294967264 │ 16 │ 8 │ +└─────────────────────┴───────────────┴────────────────┴──────────────┘ +``` + +## toUInt (8/16/32/64)OrZero {#touint8163264orzero} + +## toUInt (8/16/32/64)OrNull {#touint8163264ornull} + +## toFloat (32/64) {#tofloat3264} + +## toFloat (32/64)OrZero {#tofloat3264orzero} + +## toFloat (32/64) OrNull {#tofloat3264ornull} + +## jour {#todate} + +## toDateOrZero {#todateorzero} + +## toDateOrNull {#todateornull} + +## toDateTime {#todatetime} + +## toDateTimeOrZero {#todatetimeorzero} + +## toDateTimeOrNull {#todatetimeornull} + +## toDecimal (32/64/128) {#todecimal3264128} + +Convertir `value` à l' [Décimal](../../data_types/decimal.md) type de données avec précision de `S`. Le `value` peut être un nombre ou une chaîne. Le `S` (l'échelle) paramètre spécifie le nombre de décimales. + +- `toDecimal32(value, S)` +- `toDecimal64(value, S)` +- `toDecimal128(value, S)` + +## toDecimal (32/64/128) OrNull {#todecimal3264128ornull} + +Convertit une chaîne d'entrée en [Nullable (Décimal (P, S))](../../data_types/decimal.md) valeur de type de données. Cette famille de fonctions comprennent: + +- `toDecimal32OrNull(expr, S)` — Results in `Nullable(Decimal32(S))` type de données. +- `toDecimal64OrNull(expr, S)` — Results in `Nullable(Decimal64(S))` type de données. +- `toDecimal128OrNull(expr, S)` — Results in `Nullable(Decimal128(S))` type de données. + +Ces fonctions devraient être utilisées à la place de `toDecimal*()` fonctions, si vous préférez obtenir un `NULL` la valeur au lieu d'une exception dans le cas d'une valeur d'entrée erreur d'analyse. + +**Paramètre** + +- `expr` — [Expression](../syntax.md#syntax-expressions), retourne une valeur dans l' [Chaîne](../../data_types/string.md) type de données. ClickHouse attend la représentation textuelle du nombre décimal. Exemple, `'1.111'`. +- `S` — Scale, the number of decimal places in the resulting value. + +**Valeur renvoyée** + +Une valeur dans l' `Nullable(Decimal(P,S))` type de données. La valeur contient: + +- Numéro `S` décimales, si ClickHouse interprète la chaîne d'entrée comme un nombre. +- `NULL` si ClickHouse ne peut pas interpréter la chaîne d'entrée comme un nombre ou si le nombre d'entrée contient plus de `S` décimale. + +**Exemple** + +``` sql +SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val) +``` + +``` text +┌──────val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐ +│ -1.11100 │ Nullable(Decimal(9, 5)) │ +└──────────┴────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT toDecimal32OrNull(toString(-1.111), 2) AS val, toTypeName(val) +``` + +``` text +┌──val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 2))─┐ +│ ᴺᵁᴸᴸ │ Nullable(Decimal(9, 2)) │ +└──────┴────────────────────────────────────────────────────┘ +``` + +## toDecimal (32/64/128)OrZero {#todecimal3264128orzero} + +Convertit une valeur d'entrée en [Decimal(P,S)](../../data_types/decimal.md) type de données. Cette famille de fonctions comprennent: + +- `toDecimal32OrZero( expr, S)` — Results in `Decimal32(S)` type de données. +- `toDecimal64OrZero( expr, S)` — Results in `Decimal64(S)` type de données. +- `toDecimal128OrZero( expr, S)` — Results in `Decimal128(S)` type de données. + +Ces fonctions devraient être utilisées à la place de `toDecimal*()` fonctions, si vous préférez obtenir un `0` la valeur au lieu d'une exception dans le cas d'une valeur d'entrée erreur d'analyse. + +**Paramètre** + +- `expr` — [Expression](../syntax.md#syntax-expressions), retourne une valeur dans l' [Chaîne](../../data_types/string.md) type de données. ClickHouse attend la représentation textuelle du nombre décimal. Exemple, `'1.111'`. +- `S` — Scale, the number of decimal places in the resulting value. + +**Valeur renvoyée** + +Une valeur dans l' `Nullable(Decimal(P,S))` type de données. La valeur contient: + +- Numéro `S` décimales, si ClickHouse interprète la chaîne d'entrée comme un nombre. +- 0 avec `S` décimales, si ClickHouse ne peut pas interpréter la chaîne d'entrée comme un nombre ou si le nombre d'entrée contient plus de `S` décimale. + +**Exemple** + +``` sql +SELECT toDecimal32OrZero(toString(-1.111), 5) AS val, toTypeName(val) +``` + +``` text +┌──────val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐ +│ -1.11100 │ Decimal(9, 5) │ +└──────────┴────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT toDecimal32OrZero(toString(-1.111), 2) AS val, toTypeName(val) +``` + +``` text +┌──val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 2))─┐ +│ 0.00 │ Decimal(9, 2) │ +└──────┴────────────────────────────────────────────────────┘ +``` + +## toString {#tostring} + +Fonctions de conversion entre des nombres, des chaînes (mais pas des chaînes fixes), des dates et des dates avec des heures. +Toutes ces fonctions acceptent un argument. + +Lors de la conversion vers ou à partir d'une chaîne, la valeur est formatée ou analysée en utilisant les mêmes règles que pour le format TabSeparated (et presque tous les autres formats de texte). Si la chaîne ne peut pas être analysée, une exception est levée et la demande est annulée. + +Lors de la conversion de dates en nombres ou vice versa, la date correspond au nombre de jours depuis le début de L'époque Unix. +Lors de la conversion de dates avec des heures en nombres ou vice versa, la date avec l'heure correspond au nombre de secondes depuis le début de L'époque Unix. + +Les formats date et date-avec-heure pour les fonctions toDate/toDateTime sont définis comme suit: + +``` text +YYYY-MM-DD +YYYY-MM-DD hh:mm:ss +``` + +À titre d'exception, si vous convertissez des types numériques UInt32, Int32, UInt64 ou Int64 à Date, et si le nombre est supérieur ou égal à 65536, le nombre est interprété comme un horodatage Unix (et non comme le nombre de jours) et est arrondi à la date. Cela permet de prendre en charge l'occurrence commune de l'écriture ‘toDate(unix\_timestamp)’, qui autrement serait une erreur et nécessiterait d'écrire le plus lourd ‘toDate(toDateTime(unix\_timestamp))’. + +La Conversion entre une date et une date avec l'heure est effectuée de manière naturelle: en ajoutant une heure nulle ou en supprimant l'heure. + +La Conversion entre types numériques utilise les mêmes règles que les affectations entre différents types numériques en C++. + +De plus, la fonction ToString de L'argument DateTime peut prendre un deuxième argument de chaîne contenant le nom du fuseau horaire. Exemple: `Asia/Yekaterinburg` Dans ce cas, l'heure est formatée en fonction du fuseau horaire spécifié. + +``` sql +SELECT + now() AS now_local, + toString(now(), 'Asia/Yekaterinburg') AS now_yekat +``` + +``` text +┌───────────now_local─┬─now_yekat───────────┐ +│ 2016-06-15 00:11:21 │ 2016-06-15 02:11:21 │ +└─────────────────────┴─────────────────────┘ +``` + +Voir aussi l' `toUnixTimestamp` fonction. + +## toFixedString (s, N) {#tofixedstrings-n} + +Convertit un argument de type String en un type FixedString (N) (une chaîne de longueur fixe N). N doit être une constante. +Si la chaîne a moins d'octets que N, elle est passée avec des octets null à droite. Si la chaîne a plus d'octets que N, une exception est levée. + +## toStringCutToZero(s) {#tostringcuttozeros} + +Accepte un argument String ou FixedString. Renvoie la chaîne avec le contenu tronqué au premier octet zéro trouvé. + +Exemple: + +``` sql +SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut +``` + +``` text +┌─s─────────────┬─s_cut─┐ +│ foo\0\0\0\0\0 │ foo │ +└───────────────┴───────┘ +``` + +``` sql +SELECT toFixedString('foo\0bar', 8) AS s, toStringCutToZero(s) AS s_cut +``` + +``` text +┌─s──────────┬─s_cut─┐ +│ foo\0bar\0 │ foo │ +└────────────┴───────┘ +``` + +## reinterpretAsUInt (8/16/32/64) {#reinterpretasuint8163264} + +## reinterpretAsInt (8/16/32/64) {#reinterpretasint8163264} + +## reinterpretAsFloat (32/64) {#reinterpretasfloat3264} + +## réinterprétasdate {#reinterpretasdate} + +## reinterpretAsDateTime {#reinterpretasdatetime} + +Ces fonctions acceptent une chaîne et interprètent les octets placés au début de la chaîne comme un nombre dans l'ordre de l'hôte (little endian). Si la chaîne n'est pas assez longue, les fonctions fonctionnent comme si la chaîne était remplie avec le nombre nécessaire d'octets nuls. Si la chaîne est plus longue que nécessaire, les octets supplémentaires sont ignorés. Une date est interprétée comme le nombre de jours depuis le début de l'Époque Unix, et une date avec le temps, est interprété comme le nombre de secondes écoulées depuis le début de l'Époque Unix. + +## reinterpretAsString {#type_conversion_functions-reinterpretAsString} + +Cette fonction accepte un nombre ou une date ou une date avec l'heure, et renvoie une chaîne contenant des octets représentant la valeur correspondante dans l'ordre de l'hôte (little endian). Les octets nuls sont supprimés de la fin. Par exemple, une valeur de type uint32 de 255 est une chaîne longue d'un octet. + +## reinterpretAsFixedString {#reinterpretasfixedstring} + +Cette fonction accepte un nombre ou une date ou une date avec l'heure, et renvoie une chaîne fixe contenant des octets représentant la valeur correspondante dans l'ordre de l'hôte (little endian). Les octets nuls sont supprimés de la fin. Par exemple, une valeur de type uint32 de 255 est une chaîne fixe longue d'un octet. + +## CAST (x, t) {#type_conversion_function-cast} + +Convertir ‘x’ à l' ‘t’ type de données. La syntaxe CAST (X comme t) est également prise en charge. + +Exemple: + +``` sql +SELECT + '2016-06-15 23:00:00' AS timestamp, + CAST(timestamp AS DateTime) AS datetime, + CAST(timestamp AS Date) AS date, + CAST(timestamp, 'String') AS string, + CAST(timestamp, 'FixedString(22)') AS fixed_string +``` + +``` text +┌─timestamp───────────┬────────────datetime─┬───────date─┬─string──────────────┬─fixed_string──────────────┐ +│ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00\0\0\0 │ +└─────────────────────┴─────────────────────┴────────────┴─────────────────────┴───────────────────────────┘ +``` + +La Conversion en FixedString (N) ne fonctionne que pour les arguments de type String ou FixedString (N). + +Type conversion en [Nullable](../../data_types/nullable.md) et le dos est pris en charge. Exemple: + +``` sql +SELECT toTypeName(x) FROM t_null +``` + +``` text +┌─toTypeName(x)─┐ +│ Int8 │ +│ Int8 │ +└───────────────┘ +``` + +``` sql +SELECT toTypeName(CAST(x, 'Nullable(UInt16)')) FROM t_null +``` + +``` text +┌─toTypeName(CAST(x, 'Nullable(UInt16)'))─┐ +│ Nullable(UInt16) │ +│ Nullable(UInt16) │ +└─────────────────────────────────────────┘ +``` + +## toInterval (année / trimestre / Mois / Semaine / Jour / Heure / Minute / Seconde) {#function-tointerval} + +Convertit un argument de type Number en [Intervalle](../../data_types/special_data_types/interval.md) type de données. + +**Syntaxe** + +``` sql +toIntervalSecond(number) +toIntervalMinute(number) +toIntervalHour(number) +toIntervalDay(number) +toIntervalWeek(number) +toIntervalMonth(number) +toIntervalQuarter(number) +toIntervalYear(number) +``` + +**Paramètre** + +- `number` — Duration of interval. Positive integer number. + +**Valeurs renvoyées** + +- La valeur de `Interval` type de données. + +**Exemple** + +``` sql +WITH + toDate('2019-01-01') AS date, + INTERVAL 1 WEEK AS interval_week, + toIntervalWeek(1) AS interval_to_week +SELECT + date + interval_week, + date + interval_to_week +``` + +``` text +┌─plus(date, interval_week)─┬─plus(date, interval_to_week)─┐ +│ 2019-01-08 │ 2019-01-08 │ +└───────────────────────────┴──────────────────────────────┘ +``` + +## parseDateTimeBestEffort {#type_conversion_functions-parsedatetimebesteffort} + +Analysez un argument de type number en un type Date ou DateTime. +différent de toDate et toDateTime, parseDateTimeBestEffort peut progresser format de date plus complexe. +Pour plus d'informations, voir le lien: [Format De Date Complexe](https://xkcd.com/1179/) + +## parseDateTimeBestEffortOrNull {#parsedatetimebesteffortornull} + +De même que pour [parseDateTimeBestEffort](#type_conversion_functions-parsedatetimebesteffort) sauf qu'il renvoie null lorsqu'il rencontre un format de date qui ne peut pas être traité. + +## parseDateTimeBestEffortOrZero {#parsedatetimebesteffortorzero} + +De même que pour [parseDateTimeBestEffort](#type_conversion_functions-parsedatetimebesteffort) sauf qu'il renvoie une date zéro ou une date zéro lorsqu'il rencontre un format de date qui ne peut pas être traité. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/type_conversion_functions/) diff --git a/docs/fr/query_language/functions/url_functions.md b/docs/fr/query_language/functions/url_functions.md new file mode 100644 index 00000000000..72e239ad38f --- /dev/null +++ b/docs/fr/query_language/functions/url_functions.md @@ -0,0 +1,206 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec des URL {#functions-for-working-with-urls} + +Toutes ces fonctions ne suivent pas la RFC. Ils sont simplifiés au maximum pour améliorer les performances. + +## Fonctions qui extraient des parties d'une URL {#functions-that-extract-parts-of-a-url} + +Si la partie pertinente n'est pas présente dans une URL, une chaîne vide est renvoyée. + +### protocole {#protocol} + +Extrait le protocole d'une URL. + +Examples of typical returned values: http, https, ftp, mailto, tel, magnet… + +### domaine {#domain} + +Extrait le nom d'hôte d'une URL. + +``` sql +domain(url) +``` + +**Paramètre** + +- `url` — URL. Type: [Chaîne](../../data_types/string.md). + +L'URL peut être spécifiée avec ou sans schéma. Exemple: + +``` text +svn+ssh://some.svn-hosting.com:80/repo/trunk +some.svn-hosting.com:80/repo/trunk +https://yandex.com/time/ +``` + +Pour ces exemples, le `domain` la fonction renvoie les résultats suivants: + +``` text +some.svn-hosting.com +some.svn-hosting.com +yandex.com +``` + +**Valeurs renvoyées** + +- Nom d'hôte. Si ClickHouse peut analyser la chaîne d'entrée en tant QU'URL. +- Chaîne vide. Si ClickHouse ne peut pas analyser la chaîne d'entrée en tant QU'URL. + +Type: `String`. + +**Exemple** + +``` sql +SELECT domain('svn+ssh://some.svn-hosting.com:80/repo/trunk') +``` + +``` text +┌─domain('svn+ssh://some.svn-hosting.com:80/repo/trunk')─┐ +│ some.svn-hosting.com │ +└────────────────────────────────────────────────────────┘ +``` + +### domainWithoutWWW {#domainwithoutwww} + +Renvoie le domaine et ne supprime pas plus d'un ‘www.’ dès le début de celui-ci, si présent. + +### topLevelDomain {#topleveldomain} + +Extrait le domaine de premier niveau d'une URL. + +``` sql +topLevelDomain(url) +``` + +**Paramètre** + +- `url` — URL. Type: [Chaîne](../../data_types/string.md). + +L'URL peut être spécifiée avec ou sans schéma. Exemple: + +``` text +svn+ssh://some.svn-hosting.com:80/repo/trunk +some.svn-hosting.com:80/repo/trunk +https://yandex.com/time/ +``` + +**Valeurs renvoyées** + +- Nom de domaine. Si ClickHouse peut analyser la chaîne d'entrée en tant QU'URL. +- Chaîne vide. Si ClickHouse ne peut pas analyser la chaîne d'entrée en tant QU'URL. + +Type: `String`. + +**Exemple** + +``` sql +SELECT topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk') +``` + +``` text +┌─topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk')─┐ +│ com │ +└────────────────────────────────────────────────────────────────────┘ +``` + +### firstSignificantSubdomain {#firstsignificantsubdomain} + +Renvoie la “first significant subdomain”. C'est un concept non standard spécifique à Yandex.Metrica. Le premier sous-domaine significatif est un domaine de deuxième niveau s'il est ‘com’, ‘net’, ‘org’, ou ‘co’. Sinon, il est un domaine de troisième niveau. Exemple, `firstSignificantSubdomain (‘https://news.yandex.ru/’) = ‘yandex’, firstSignificantSubdomain (‘https://news.yandex.com.tr/’) = ‘yandex’`. La liste des “insignificant” les domaines de deuxième niveau et d'autres détails de mise en œuvre peuvent changer à l'avenir. + +### cutToFirstSignificantSubdomain {#cuttofirstsignificantsubdomain} + +Renvoie la partie du domaine qui inclut les sous-domaines de premier niveau “first significant subdomain” (voir l'explication ci-dessus). + +Exemple, `cutToFirstSignificantSubdomain('https://news.yandex.com.tr/') = 'yandex.com.tr'`. + +### chemin {#path} + +Retourne le chemin d'accès. Exemple: `/top/news.html` Le chemin n'inclut pas la chaîne de requête. + +### pathFull {#pathfull} + +La même chose que ci-dessus, mais y compris la chaîne de requête et le fragment. Exemple: / top / nouvelles.le html?page = 2 \# commentaires + +### queryString {#querystring} + +Retourne la chaîne de requête. Exemple: page = 1 & lr=213. query-string n'inclut pas le point d'interrogation initial, ainsi que \# et tout ce qui suit \#. + +### fragment {#fragment} + +Renvoie l'identificateur de fragment. fragment n'inclut pas le symbole de hachage initial. + +### queryStringAndFragment {#querystringandfragment} + +Renvoie la chaîne de requête et l'Identificateur de fragment. Exemple: page = 1 \# 29390. + +### extractURLParameter (URL, nom) {#extracturlparameterurl-name} + +Renvoie la valeur de la ‘name’ paramètre dans l'URL, le cas échéant. Sinon, une chaîne vide. S'il y a beaucoup de paramètres avec ce nom, il renvoie la première occurrence. Cette fonction fonctionne en supposant que le nom du paramètre est codé dans L'URL exactement de la même manière que dans l'argument passé. + +### extractURLParameters (URL) {#extracturlparametersurl} + +Renvoie un tableau de chaînes name = value correspondant aux paramètres D'URL. Les valeurs ne sont en aucun cas décodées. + +### extractURLParameterNames (URL) {#extracturlparameternamesurl} + +Retourne un tableau de chaînes de noms correspondant aux noms des paramètres d'URL. Les valeurs ne sont en aucun cas décodées. + +### URLHierarchy (URL) {#urlhierarchyurl} + +Retourne un tableau contenant L'URL, tronquée à la fin par les symboles /,? dans le chemin et la chaîne de requête. Les caractères séparateurs consécutifs sont comptés comme un. La coupe est faite dans la position après tous les caractères de séparation consécutifs. + +### URLPathHierarchy (URL) {#urlpathhierarchyurl} + +La même chose que ci-dessus, mais sans le protocole et l'hôte dans le résultat. Le / les élément (racine) n'est pas inclus. Exemple: la fonction est utilisée pour implémenter l'arborescence des rapports de L'URL dans Yandex. Métrique. + +``` text +URLPathHierarchy('https://example.com/browse/CONV-6788') = +[ + '/browse/', + '/browse/CONV-6788' +] +``` + +### decodeURLComponent (URL) {#decodeurlcomponenturl} + +Renvoie L'URL décodée. +Exemple: + +``` sql +SELECT decodeURLComponent('http://127.0.0.1:8123/?query=SELECT%201%3B') AS DecodedURL; +``` + +``` text +┌─DecodedURL─────────────────────────────┐ +│ http://127.0.0.1:8123/?query=SELECT 1; │ +└────────────────────────────────────────┘ +``` + +## Fonctions qui suppriment une partie D'une URL. {#functions-that-remove-part-of-a-url} + +Si L'URL n'a rien de similaire, L'URL reste inchangée. + +### cutWWW {#cutwww} + +Supprime pas plus d'une ‘www.’ depuis le début du domaine de L'URL, s'il est présent. + +### cutQueryString {#cutquerystring} + +Supprime la chaîne de requête. Le point d'interrogation est également supprimé. + +### cutFragment {#cutfragment} + +Supprime l'identificateur de fragment. Le signe est également supprimé. + +### couperystringandfragment {#cutquerystringandfragment} + +Supprime la chaîne de requête et l'Identificateur de fragment. Le point d'interrogation et le signe numérique sont également supprimés. + +### cutURLParameter (URL, nom) {#cuturlparameterurl-name} + +Supprime le ‘name’ Paramètre URL, si présent. Cette fonction fonctionne en supposant que le nom du paramètre est codé dans L'URL exactement de la même manière que dans l'argument passé. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/url_functions/) diff --git a/docs/fr/query_language/functions/uuid_functions.md b/docs/fr/query_language/functions/uuid_functions.md new file mode 100644 index 00000000000..1cd5645b660 --- /dev/null +++ b/docs/fr/query_language/functions/uuid_functions.md @@ -0,0 +1,120 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec UUID {#functions-for-working-with-uuid} + +Les fonctions pour travailler avec UUID sont listées ci-dessous. + +## generateUUIDv4 {#uuid-function-generate} + +Génère le [UUID](../../data_types/uuid.md) de [la version 4](https://tools.ietf.org/html/rfc4122#section-4.4). + +``` sql +generateUUIDv4() +``` + +**Valeur renvoyée** + +La valeur de type UUID. + +**Exemple d'utilisation** + +Cet exemple montre la création d'une table avec la colonne de type UUID et l'insertion d'une valeur dans la table. + +``` sql +CREATE TABLE t_uuid (x UUID) ENGINE=TinyLog + +INSERT INTO t_uuid SELECT generateUUIDv4() + +SELECT * FROM t_uuid +``` + +``` text +┌────────────────────────────────────x─┐ +│ f4bf890f-f9dc-4332-ad5c-0c18e73f28e9 │ +└──────────────────────────────────────┘ +``` + +## toUUID (x) {#touuid-x} + +Convertit la valeur de type de chaîne en type UUID. + +``` sql +toUUID(String) +``` + +**Valeur renvoyée** + +La valeur de type UUID. + +**Exemple d'utilisation** + +``` sql +SELECT toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0') AS uuid +``` + +``` text +┌─────────────────────────────────uuid─┐ +│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │ +└──────────────────────────────────────┘ +``` + +## UUIDStringToNum {#uuidstringtonum} + +Accepte une chaîne contenant 36 caractères dans le format `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`, et le renvoie comme un ensemble d'octets dans un [FixedString (16)](../../data_types/fixedstring.md). + +``` sql +UUIDStringToNum(String) +``` + +**Valeur renvoyée** + +FixedString (16) + +**Exemples d'utilisation** + +``` sql +SELECT + '612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid, + UUIDStringToNum(uuid) AS bytes +``` + +``` text + +┌─uuid─────────────────────────────────┬─bytes────────────┐ +│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │ +└──────────────────────────────────────┴──────────────────┘ +``` + +## UUIDNumToString {#uuidnumtostring} + +Accepte un [FixedString (16)](../../data_types/fixedstring.md) valeur, et renvoie une chaîne contenant 36 caractères au format texte. + +``` sql +UUIDNumToString(FixedString(16)) +``` + +**Valeur renvoyée** + +Chaîne. + +**Exemple d'utilisation** + +``` sql +SELECT + 'a/<@];!~p{jTj={)' AS bytes, + UUIDNumToString(toFixedString(bytes, 16)) AS uuid +``` + +``` text +┌─bytes────────────┬─uuid─────────────────────────────────┐ +│ a/<@];!~p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ +└──────────────────┴──────────────────────────────────────┘ +``` + +## Voir aussi {#see-also} + +- [dictGetUUID](ext_dict_functions.md#ext_dict_functions-other) + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/uuid_function/) diff --git a/docs/fr/query_language/functions/ym_dict_functions.md b/docs/fr/query_language/functions/ym_dict_functions.md new file mode 100644 index 00000000000..df4a6fc5c10 --- /dev/null +++ b/docs/fr/query_language/functions/ym_dict_functions.md @@ -0,0 +1,130 @@ +--- +machine_translated: true +--- + +# Fonctions pour travailler avec Yandex.Dictionnaires Metrica {#functions-for-working-with-yandex-metrica-dictionaries} + +Pour que les fonctions ci-dessous fonctionnent, la configuration du serveur doit spécifier les chemins et les adresses pour obtenir tous les Yandex.Dictionnaires Metrica. Les dictionnaires sont chargés au premier appel de l'une de ces fonctions. Si les listes de référence ne peuvent pas être chargées, une exception est levée. + +Pour plus d'informations sur la création de listes de références, consultez la section “Dictionaries”. + +## Plusieurs geobases {#multiple-geobases} + +ClickHouse soutient le travail avec plusieurs géobases alternatives (hiérarchies régionales) simultanément, afin de soutenir diverses perspectives sur les pays auxquels appartiennent certaines régions. + +Le ‘clickhouse-server’ config spécifie le fichier avec l'échelon régional::`/opt/geo/regions_hierarchy.txt` + +Outre ce fichier, il recherche également les fichiers à proximité qui ont le symbole \_ et tout suffixe ajouté au nom (avant l'extension de fichier). +Par exemple, il trouvera également le fichier `/opt/geo/regions_hierarchy_ua.txt` si présente. + +`ua` est appelée la clé du dictionnaire. Pour un dictionnaire sans suffixe, la clé est une chaîne vide. + +Tous les dictionnaires sont rechargés dans l'exécution (une fois toutes les secondes, comme défini dans le paramètre de configuration builtin\_dictionaries\_reload\_interval, ou une fois par heure par défaut). Cependant, la liste des dictionnaires disponibles est définie une fois, lorsque le serveur démarre. + +All functions for working with regions have an optional argument at the end – the dictionary key. It is referred to as the geobase. +Exemple: + +``` sql +regionToCountry(RegionID) – Uses the default dictionary: /opt/geo/regions_hierarchy.txt +regionToCountry(RegionID, '') – Uses the default dictionary: /opt/geo/regions_hierarchy.txt +regionToCountry(RegionID, 'ua') – Uses the dictionary for the 'ua' key: /opt/geo/regions_hierarchy_ua.txt +``` + +### regionToCity (id \[, geobase\]) {#regiontocityid-geobase} + +Accepts a UInt32 number – the region ID from the Yandex geobase. If this region is a city or part of a city, it returns the region ID for the appropriate city. Otherwise, returns 0. + +### regionToArea (id \[, geobase\]) {#regiontoareaid-geobase} + +Convertit une région en une zone (tapez 5 dans la géobase). Dans tous les autres cas, cette fonction est la même que ‘regionToCity’. + +``` sql +SELECT DISTINCT regionToName(regionToArea(toUInt32(number), 'ua')) +FROM system.numbers +LIMIT 15 +``` + +``` text +┌─regionToName(regionToArea(toUInt32(number), \'ua\'))─┐ +│ │ +│ Moscow and Moscow region │ +│ St. Petersburg and Leningrad region │ +│ Belgorod region │ +│ Ivanovsk region │ +│ Kaluga region │ +│ Kostroma region │ +│ Kursk region │ +│ Lipetsk region │ +│ Orlov region │ +│ Ryazan region │ +│ Smolensk region │ +│ Tambov region │ +│ Tver region │ +│ Tula region │ +└──────────────────────────────────────────────────────┘ +``` + +### regionToDistrict(id \[, geobase\]) {#regiontodistrictid-geobase} + +Convertit une région en district fédéral (type 4 dans la géobase). Dans tous les autres cas, cette fonction est la même que ‘regionToCity’. + +``` sql +SELECT DISTINCT regionToName(regionToDistrict(toUInt32(number), 'ua')) +FROM system.numbers +LIMIT 15 +``` + +``` text +┌─regionToName(regionToDistrict(toUInt32(number), \'ua\'))─┐ +│ │ +│ Central federal district │ +│ Northwest federal district │ +│ South federal district │ +│ North Caucases federal district │ +│ Privolga federal district │ +│ Ural federal district │ +│ Siberian federal district │ +│ Far East federal district │ +│ Scotland │ +│ Faroe Islands │ +│ Flemish region │ +│ Brussels capital region │ +│ Wallonia │ +│ Federation of Bosnia and Herzegovina │ +└──────────────────────────────────────────────────────────┘ +``` + +### regionToCountry (id \[, geobase\]) {#regiontocountryid-geobase} + +Convertit une région en un pays. Dans tous les autres cas, cette fonction est la même que ‘regionToCity’. +Exemple: `regionToCountry(toUInt32(213)) = 225` convertit Moscou (213) en Russie (225). + +### regionToContinent(id \[, géobase\]) {#regiontocontinentid-geobase} + +Convertit une région en continent. Dans tous les autres cas, cette fonction est la même que ‘regionToCity’. +Exemple: `regionToContinent(toUInt32(213)) = 10001` convertit Moscou (213) en Eurasie (10001). + +### regionToPopulation (id \[, geobase\]) {#regiontopopulationid-geobase} + +Obtient la population d'une région. +La population peut être enregistrée dans des fichiers avec la géobase. Voir la section “External dictionaries”. +Si la population n'est pas enregistrée pour la région, elle renvoie 0. +Dans la géobase Yandex, la population peut être enregistrée pour les régions enfants, mais pas pour les régions parentes. + +### regionIn(lhs, rhs \[, géobase\]) {#regioninlhs-rhs-geobase} + +Vérifie si un ‘lhs’ région appartient à une ‘rhs’ région. Renvoie un nombre UInt8 égal à 1 s'il appartient, Ou 0 s'il n'appartient pas. +The relationship is reflexive – any region also belongs to itself. + +### regionHierarchy (id \[, geobase\]) {#regionhierarchyid-geobase} + +Accepts a UInt32 number – the region ID from the Yandex geobase. Returns an array of region IDs consisting of the passed region and all parents along the chain. +Exemple: `regionHierarchy(toUInt32(213)) = [213,1,3,225,10001,10000]`. + +### regionToName(id \[, lang\]) {#regiontonameid-lang} + +Accepts a UInt32 number – the region ID from the Yandex geobase. A string with the name of the language can be passed as a second argument. Supported languages are: ru, en, ua, uk, by, kz, tr. If the second argument is omitted, the language ‘ru’ is used. If the language is not supported, an exception is thrown. Returns a string – the name of the region in the corresponding language. If the region with the specified ID doesn't exist, an empty string is returned. + +`ua` et `uk` les deux signifient ukrainien. + +[Article Original](https://clickhouse.tech/docs/en/query_language/functions/ym_dict_functions/) diff --git a/docs/fr/query_language/index.md b/docs/fr/query_language/index.md new file mode 100644 index 00000000000..cf135585ea4 --- /dev/null +++ b/docs/fr/query_language/index.md @@ -0,0 +1,13 @@ +--- +machine_translated: true +--- + +# Référence SQL {#sql-reference} + +- [SELECT](select.md) +- [INSERT INTO](insert_into.md) +- [CREATE](create.md) +- [ALTER](alter.md#query_language_queries_alter) +- [Autres types de requêtes](misc.md) + +[Article Original](https://clickhouse.tech/docs/en/query_language/) diff --git a/docs/fr/query_language/insert_into.md b/docs/fr/query_language/insert_into.md new file mode 100644 index 00000000000..9169c71240b --- /dev/null +++ b/docs/fr/query_language/insert_into.md @@ -0,0 +1,77 @@ +--- +machine_translated: true +--- + +## INSERT {#insert} + +L'ajout de données. + +Format de requête de base: + +``` sql +INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ... +``` + +La requête peut spécifier une liste de colonnes à insérer `[(c1, c2, c3)]`. Dans ce cas, le reste des colonnes sont remplis avec: + +- Les valeurs calculées à partir `DEFAULT` expressions spécifiées dans la définition de la table. +- Zéros et chaînes vides, si `DEFAULT` les expressions ne sont pas définies. + +Si [strict\_insert\_defaults=1](../operations/settings/settings.md), les colonnes qui n'ont pas `DEFAULT` défini doit être répertorié dans la requête. + +Les données peuvent être transmises à L'INSERT dans n'importe quel [format](../interfaces/formats.md#formats) soutenu par ClickHouse. Le format doit être spécifié explicitement dans la requête: + +``` sql +INSERT INTO [db.]table [(c1, c2, c3)] FORMAT format_name data_set +``` + +For example, the following query format is identical to the basic version of INSERT … VALUES: + +``` sql +INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ... +``` + +ClickHouse supprime tous les espaces et un saut de ligne (s'il y en a un) avant les données. Lors de la formation d'une requête, nous recommandons de placer les données sur une nouvelle ligne après les opérateurs de requête (ceci est important si les données commencent par des espaces). + +Exemple: + +``` sql +INSERT INTO t FORMAT TabSeparated +11 Hello, world! +22 Qwerty +``` + +Vous pouvez insérer des données séparément de la requête à l'aide du client de ligne de commande ou de L'interface HTTP. Pour plus d'informations, consultez la section “[Interface](../interfaces/index.md#interfaces)”. + +### Contraintes {#constraints} + +Si la table a [contraintes](create.md#constraints), their expressions will be checked for each row of inserted data. If any of those constraints is not satisfied — server will raise an exception containing constraint name and expression, the query will be stopped. + +### Insertion des résultats de `SELECT` {#insert_query_insert-select} + +``` sql +INSERT INTO [db.]table [(c1, c2, c3)] SELECT ... +``` + +Les colonnes sont mappées en fonction de leur position dans la clause SELECT. Cependant, leurs noms dans L'expression SELECT et la table pour INSERT peuvent différer. Si nécessaire, la coulée de type est effectuée. + +Aucun des formats de données à l'exception des Valeurs permettent de définir des valeurs d'expressions telles que `now()`, `1 + 2` et ainsi de suite. Le format des valeurs permet une utilisation limitée des expressions, mais ce n'est pas recommandé, car dans ce cas, un code inefficace est utilisé pour leur exécution. + +Les autres requêtes de modification des parties de données ne sont pas prises en charge: `UPDATE`, `DELETE`, `REPLACE`, `MERGE`, `UPSERT`, `INSERT UPDATE`. +Cependant, vous pouvez supprimer les anciennes données en utilisant `ALTER TABLE ... DROP PARTITION`. + +`FORMAT` la clause doit être spécifié à la fin de la requête si `SELECT` la clause contient la fonction de table [entrée()](table_functions/input.md). + +### Considérations De Performance {#performance-considerations} + +`INSERT` trie les données d'entrée par la clé primaire et les divise en partitions par une clé de partition. Si vous insérez des données dans plusieurs partitions à la fois, cela peut réduire considérablement les performances de l' `INSERT` requête. Pour éviter cela: + +- Ajoutez des données en lots assez importants, tels que 100 000 lignes à la fois. +- Groupez les données par une clé de partition avant de les télécharger sur ClickHouse. + +Les performances ne diminueront pas si: + +- Les données sont ajoutées en temps réel. +- Vous téléchargez des données qui sont généralement triées par heure. + +[Article Original](https://clickhouse.tech/docs/en/query_language/insert_into/) diff --git a/docs/fr/query_language/misc.md b/docs/fr/query_language/misc.md new file mode 100644 index 00000000000..3ca724f57d3 --- /dev/null +++ b/docs/fr/query_language/misc.md @@ -0,0 +1,249 @@ +--- +machine_translated: true +--- + +# Diverses Requêtes {#miscellaneous-queries} + +## ATTACH {#attach} + +Cette requête est exactement la même que `CREATE`, mais + +- Au lieu de la parole `CREATE` il utilise le mot `ATTACH`. +- La requête ne crée pas de données sur le disque, mais suppose que les données sont déjà aux endroits appropriés, et ajoute simplement des informations sur la table au serveur. + Après avoir exécuté une requête ATTACH, le serveur connaîtra l'existence de la table. + +Si la table a été précédemment détachée (`DETACH`), ce qui signifie que sa structure est connue, vous pouvez utiliser un raccourci sans définir la structure. + +``` sql +ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] +``` + +Cette requête est utilisée lors du démarrage du serveur. Le serveur stocke les métadonnées de la table sous forme de fichiers avec `ATTACH` requêtes, qu'il exécute simplement au lancement (à l'exception des tables système, qui sont explicitement créées sur le serveur). + +## CHECK TABLE {#check-table} + +Vérifie si les données de la table sont corrompues. + +``` sql +CHECK TABLE [db.]name +``` + +Le `CHECK TABLE` requête compare réelle des tailles de fichier avec les valeurs attendues qui sont stockés sur le serveur. Si le fichier tailles ne correspondent pas aux valeurs stockées, cela signifie que les données sont endommagées. Cela peut être causé, par exemple, par un plantage du système lors de l'exécution de la requête. + +La réponse de la requête contient `result` colonne avec une seule ligne. La ligne a une valeur de +[Booléen](../data_types/boolean.md) type: + +- 0 - les données de la table sont corrompues. +- 1 - les données maintiennent l'intégrité. + +Le `CHECK TABLE` query prend en charge les moteurs de table suivants: + +- [Journal](../operations/table_engines/log.md) +- [TinyLog](../operations/table_engines/tinylog.md) +- [StripeLog](../operations/table_engines/stripelog.md) +- [Famille MergeTree](../operations/table_engines/mergetree.md) + +Effectué sur les tables avec un autre moteur de table provoque une exception. + +Les moteurs de la `*Log` la famille ne fournit pas de récupération automatique des données en cas d'échec. L'utilisation de la `CHECK TABLE` requête pour suivre la perte de données en temps opportun. + +Pour `MergeTree` moteurs de la famille, le `CHECK TABLE` query affiche un État de vérification pour chaque partie de données individuelle d'une table sur le serveur local. + +**Si les données sont corrompues** + +Si la table est corrompue, vous pouvez copier les données non corrompues dans une autre table. Pour ce faire: + +1. Créez une nouvelle table avec la même structure que la table endommagée. Pour ce faire exécutez la requête `CREATE TABLE AS `. +2. Définir le [max\_threads](../operations/settings/settings.md#settings-max_threads) la valeur 1 pour traiter la requête suivante dans un seul thread. Pour ce faire, exécutez la requête `SET max_threads = 1`. +3. Exécuter la requête `INSERT INTO SELECT * FROM `. Cette demande copie les données non corrompues de la table endommagée vers une autre table. Seules les données avant la partie corrompue seront copiées. +4. Redémarrez l' `clickhouse-client` pour réinitialiser l' `max_threads` valeur. + +## DESCRIBE TABLE {#misc-describe-table} + +``` sql +DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format] +``` + +Renvoie ce qui suit `String` les colonnes de type: + +- `name` — Column name. +- `type`— Column type. +- `default_type` — Clause that is used in [expression par défaut](create.md#create-default-values) (`DEFAULT`, `MATERIALIZED` ou `ALIAS`). Column contient une chaîne vide, si l'expression par défaut n'est pas spécifiée. +- `default_expression` — Value specified in the `DEFAULT` clause. +- `comment_expression` — Comment text. + +Les structures de données imbriquées sont sorties dans “expanded” format. Chaque colonne est affichée séparément, avec le nom après un point. + +## DETACH {#detach} + +Supprime les informations sur le ‘name’ table du serveur. Le serveur cesse de connaître l'existence de la table. + +``` sql +DETACH TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] +``` + +Cela ne supprime pas les données ou les métadonnées de la table. Lors du prochain lancement du serveur, le serveur Lira les métadonnées et découvrira à nouveau la table. +De même, un “detached” tableau peut être re-attaché en utilisant le `ATTACH` requête (à l'exception des tables système, qui n'ont pas de stocker les métadonnées pour eux). + +Il n'y a pas de `DETACH DATABASE` requête. + +## DROP {#drop} + +Cette requête a deux types: `DROP DATABASE` et `DROP TABLE`. + +``` sql +DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster] +``` + +Supprime toutes les tables à l'intérieur de la ‘db’ la base de données, puis supprime le ‘db’ la base de données elle-même. +Si `IF EXISTS` est spécifié, il ne renvoie pas d'erreur si la base de données n'existe pas. + +``` sql +DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] +``` + +Supprime la table. +Si `IF EXISTS` est spécifié, il ne renvoie pas d'erreur si la table n'existe pas ou si la base de données n'existe pas. + + DROP DICTIONARY [IF EXISTS] [db.]name + +Delets le dictionnaire. +Si `IF EXISTS` est spécifié, il ne renvoie pas d'erreur si la table n'existe pas ou si la base de données n'existe pas. + +## EXISTS {#exists} + +``` sql +EXISTS [TEMPORARY] [TABLE|DICTIONARY] [db.]name [INTO OUTFILE filename] [FORMAT format] +``` + +Renvoie un seul `UInt8`- type colonne, qui contient la valeur unique `0` si la table ou base de données n'existe pas, ou `1` si la table existe dans la base de données spécifiée. + +## KILL QUERY {#kill-query} + +``` sql +KILL QUERY [ON CLUSTER cluster] + WHERE + [SYNC|ASYNC|TEST] + [FORMAT format] +``` + +Tente de mettre fin de force aux requêtes en cours d'exécution. +Les requêtes à terminer sont sélectionnées dans le système.processus en utilisant les critères définis dans le `WHERE` la clause de la `KILL` requête. + +Exemple: + +``` sql +-- Forcibly terminates all queries with the specified query_id: +KILL QUERY WHERE query_id='2-857d-4a57-9ee0-327da5d60a90' + +-- Synchronously terminates all queries run by 'username': +KILL QUERY WHERE user='username' SYNC +``` + +Les utilisateurs en lecture seule peuvent uniquement arrêter leurs propres requêtes. + +Par défaut, la version asynchrone des requêtes est utilisé (`ASYNC`), qui n'attend pas la confirmation que les requêtes se sont arrêtées. + +La version synchrone (`SYNC`) attend que toutes les requêtes d'arrêter et affiche des informations sur chaque processus s'arrête. +La réponse contient l' `kill_status` la colonne, qui peut prendre les valeurs suivantes: + +1. ‘finished’ – The query was terminated successfully. +2. ‘waiting’ – Waiting for the query to end after sending it a signal to terminate. +3. The other values ​​explain why the query can't be stopped. + +Une requête de test (`TEST`) vérifie uniquement les droits de l'utilisateur et affiche une liste de requêtes à arrêter. + +## KILL MUTATION {#kill-mutation} + +``` sql +KILL MUTATION [ON CLUSTER cluster] + WHERE + [TEST] + [FORMAT format] +``` + +Essaie d'annuler et supprimer [mutation](alter.md#alter-mutations) actuellement en cours d'exécution. Les Mutations à annuler sont sélectionnées parmi [`system.mutations`](../operations/system_tables.md#system_tables-mutations) tableau à l'aide du filtre spécifié par le `WHERE` la clause de la `KILL` requête. + +Une requête de test (`TEST`) vérifie uniquement les droits de l'utilisateur et affiche une liste de requêtes à arrêter. + +Exemple: + +``` sql +-- Cancel and remove all mutations of the single table: +KILL MUTATION WHERE database = 'default' AND table = 'table' + +-- Cancel the specific mutation: +KILL MUTATION WHERE database = 'default' AND table = 'table' AND mutation_id = 'mutation_3.txt' +``` + +The query is useful when a mutation is stuck and cannot finish (e.g. if some function in the mutation query throws an exception when applied to the data contained in the table). + +Les modifications déjà apportées par la mutation ne sont pas annulées. + +## OPTIMIZE {#misc_operations-optimize} + +``` sql +OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE] +``` + +Cette requête tente d'initialiser une fusion non programmée de parties de données pour les tables avec un moteur de [MergeTree](../operations/table_engines/mergetree.md) famille. + +Le `OPTMIZE` la requête est également prise en charge pour [MaterializedView](../operations/table_engines/materializedview.md) et la [Tampon](../operations/table_engines/buffer.md) moteur. Les autres moteurs de table ne sont pas pris en charge. + +Lorsque `OPTIMIZE` est utilisé avec le [ReplicatedMergeTree](../operations/table_engines/replication.md) famille de moteurs de table, ClickHouse crée une tâche pour la fusion et attend l'exécution sur tous les nœuds (si le `replication_alter_partitions_sync` paramètre est activé). + +- Si `OPTIMIZE` n'effectue pas de fusion pour une raison quelconque, il ne notifie pas le client. Pour activer les notifications, utilisez [optimize\_throw\_if\_noop](../operations/settings/settings.md#setting-optimize_throw_if_noop) paramètre. +- Si vous spécifiez un `PARTITION`, seule la partition spécifiée est optimisé. [Comment définir l'expression de la partition](alter.md#alter-how-to-specify-part-expr). +- Si vous spécifiez `FINAL`, l'optimisation est effectuée, même lorsque toutes les données sont déjà dans une partie. +- Si vous spécifiez `DEDUPLICATE`, alors des lignes complètement identiques seront dédupliquées (toutes les colonnes sont comparées), cela n'a de sens que pour le moteur MergeTree. + +!!! warning "Avertissement" + `OPTIMIZE` ne peut pas réparer le “Too many parts” erreur. + +## RENAME {#misc_operations-rename} + +Renomme une ou plusieurs tables. + +``` sql +RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster] +``` + +Toutes les tables sont renommées sous verrouillage global. Renommer des tables est une opération légère. Si vous avez indiqué une autre base de données après TO, la table sera déplacée vers cette base de données. Cependant, les répertoires contenant des bases de données doivent résider dans le même système de fichiers (sinon, une erreur est renvoyée). + +## SET {#query-set} + +``` sql +SET param = value +``` + +Assigner `value` à l' `param` [paramètre](../operations/settings/index.md) pour la session en cours. Vous ne pouvez pas modifier [les paramètres du serveur](../operations/server_settings/index.md) de cette façon. + +Vous pouvez également définir toutes les valeurs de certains paramètres de profil dans une seule requête. + +``` sql +SET profile = 'profile-name-from-the-settings-file' +``` + +Pour plus d'informations, voir [Paramètre](../operations/settings/settings.md). + +## TRUNCATE {#truncate} + +``` sql +TRUNCATE TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] +``` + +Supprime toutes les données d'une table. Lorsque la clause `IF EXISTS` est omis, la requête renvoie une erreur si la table n'existe pas. + +Le `TRUNCATE` la requête n'est pas prise en charge pour [Vue](../operations/table_engines/view.md), [Fichier](../operations/table_engines/file.md), [URL](../operations/table_engines/url.md) et [NULL](../operations/table_engines/null.md) table des moteurs. + +## USE {#use} + +``` sql +USE db +``` + +Vous permet de définir la base de données actuelle pour la session. +La base de données actuelle est utilisée pour rechercher des tables si la base de données n'est pas explicitement définie dans la requête avec un point avant le nom de la table. +Cette requête ne peut pas être faite lors de l'utilisation du protocole HTTP, car il n'y a pas de concept de session. + +[Article Original](https://clickhouse.tech/docs/en/query_language/misc/) diff --git a/docs/fr/query_language/operators.md b/docs/fr/query_language/operators.md new file mode 100644 index 00000000000..76477cfae4a --- /dev/null +++ b/docs/fr/query_language/operators.md @@ -0,0 +1,275 @@ +--- +machine_translated: true +--- + +# Opérateur {#operators} + +Tous les opérateurs sont transformés en leurs fonctions correspondantes à l'étape d'analyse des requêtes en fonction de leur priorité et de leur associativité. +Les groupes d'opérateurs sont listés par ordre de priorité (plus il est élevé dans la liste, plus tôt l'opérateur est connecté à ses arguments). + +## Des Opérateurs D'Accès {#access-operators} + +`a[N]` – Access to an element of an array. The `arrayElement(a, N)` fonction. + +`a.N` – Access to a tuple element. The `tupleElement(a, N)` fonction. + +## Opérateur De Négation Numérique {#numeric-negation-operator} + +`-a` – The `negate (a)` fonction. + +## Opérateurs de Multiplication et de Division {#multiplication-and-division-operators} + +`a * b` – The `multiply (a, b)` fonction. + +`a / b` – The `divide(a, b)` fonction. + +`a % b` – The `modulo(a, b)` fonction. + +## Opérateurs d'Addition et de soustraction {#addition-and-subtraction-operators} + +`a + b` – The `plus(a, b)` fonction. + +`a - b` – The `minus(a, b)` fonction. + +## Opérateurs De Comparaison {#comparison-operators} + +`a = b` – The `equals(a, b)` fonction. + +`a == b` – The `equals(a, b)` fonction. + +`a != b` – The `notEquals(a, b)` fonction. + +`a <> b` – The `notEquals(a, b)` fonction. + +`a <= b` – The `lessOrEquals(a, b)` fonction. + +`a >= b` – The `greaterOrEquals(a, b)` fonction. + +`a < b` – The `less(a, b)` fonction. + +`a > b` – The `greater(a, b)` fonction. + +`a LIKE s` – The `like(a, b)` fonction. + +`a NOT LIKE s` – The `notLike(a, b)` fonction. + +`a BETWEEN b AND c` – The same as `a >= b AND a <= c`. + +`a NOT BETWEEN b AND c` – The same as `a < b OR a > c`. + +## Opérateurs pour travailler avec des ensembles de données {#operators-for-working-with-data-sets} + +*Voir [Dans les opérateurs](select.md#select-in-operators).* + +`a IN ...` – The `in(a, b)` fonction. + +`a NOT IN ...` – The `notIn(a, b)` fonction. + +`a GLOBAL IN ...` – The `globalIn(a, b)` fonction. + +`a GLOBAL NOT IN ...` – The `globalNotIn(a, b)` fonction. + +## Opérateurs pour travailler avec des Dates et des heures {#operators-datetime} + +### EXTRACT {#operator-extract} + +``` sql +EXTRACT(part FROM date); +``` + +Extrait une partie d'une date donnée. Par exemple, vous pouvez récupérer un mois à partir d'une date donnée, ou d'une seconde à partir d'un moment. + +Le `part` paramètre spécifie la partie de la date à récupérer. Les valeurs suivantes sont disponibles: + +- `DAY` — The day of the month. Possible values: 1–31. +- `MONTH` — The number of a month. Possible values: 1–12. +- `YEAR` — The year. +- `SECOND` — The second. Possible values: 0–59. +- `MINUTE` — The minute. Possible values: 0–59. +- `HOUR` — The hour. Possible values: 0–23. + +Le `part` le paramètre est insensible à la casse. + +Le `date` paramètre spécifie la date ou l'heure à traiter. Soit [Date](../data_types/date.md) ou [DateTime](../data_types/datetime.md) le type est pris en charge. + +Exemple: + +``` sql +SELECT EXTRACT(DAY FROM toDate('2017-06-15')); +SELECT EXTRACT(MONTH FROM toDate('2017-06-15')); +SELECT EXTRACT(YEAR FROM toDate('2017-06-15')); +``` + +Dans l'exemple suivant, nous créons un tableau et de les insérer dans une valeur avec le `DateTime` type. + +``` sql +CREATE TABLE test.Orders +( + OrderId UInt64, + OrderName String, + OrderDate DateTime +) +ENGINE = Log; +``` + +``` sql +INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44')); +``` + +``` sql +SELECT + toYear(OrderDate) AS OrderYear, + toMonth(OrderDate) AS OrderMonth, + toDayOfMonth(OrderDate) AS OrderDay, + toHour(OrderDate) AS OrderHour, + toMinute(OrderDate) AS OrderMinute, + toSecond(OrderDate) AS OrderSecond +FROM test.Orders; +``` + +``` text +┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐ +│ 2008 │ 10 │ 11 │ 13 │ 23 │ 44 │ +└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘ +``` + +Vous pouvez voir plus d'exemples de [test](https://github.com/ClickHouse/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00619_extract.sql). + +### INTERVAL {#operator-interval} + +Crée un [Intervalle](../data_types/special_data_types/interval.md)- valeur de type qui doit être utilisée dans les opérations arithmétiques avec [Date](../data_types/date.md) et [DateTime](../data_types/datetime.md)-type de valeurs. + +Types d'intervalles: +- `SECOND` +- `MINUTE` +- `HOUR` +- `DAY` +- `WEEK` +- `MONTH` +- `QUARTER` +- `YEAR` + +!!! warning "Avertissement" + Les intervalles avec différents types ne peuvent pas être combinés. Vous ne pouvez pas utiliser des expressions comme `INTERVAL 4 DAY 1 HOUR`. Exprimer des intervalles en unités plus petites ou égales à la plus petite unité de l'intervalle, par exemple `INTERVAL 25 HOUR`. Vous pouvez utiliser des opérations conséquentes comme dans l'exemple ci-dessous. + +Exemple: + +``` sql +SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR +``` + +``` text +┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐ +│ 2019-10-23 11:16:28 │ 2019-10-27 14:16:28 │ +└─────────────────────┴────────────────────────────────────────────────────────┘ +``` + +**Voir Aussi** + +- [Intervalle](../data_types/special_data_types/interval.md) type de données +- [toInterval](functions/type_conversion_functions.md#function-tointerval) type fonctions de conversion + +## Opérateur De Négation Logique {#logical-negation-operator} + +`NOT a` – The `not(a)` fonction. + +## Logique ET de l'Opérateur {#logical-and-operator} + +`a AND b` – The`and(a, b)` fonction. + +## Logique ou opérateur {#logical-or-operator} + +`a OR b` – The `or(a, b)` fonction. + +## Opérateur Conditionnel {#conditional-operator} + +`a ? b : c` – The `if(a, b, c)` fonction. + +Note: + +L'opérateur conditionnel calcule les valeurs de b et c, puis vérifie si la condition a est remplie, puis renvoie la valeur correspondante. Si `b` ou `C` est un [arrayJoin()](functions/array_join.md#functions_arrayjoin) fonction, chaque ligne sera répliquée indépendamment de la “a” condition. + +## Expression Conditionnelle {#operator_case} + +``` sql +CASE [x] + WHEN a THEN b + [WHEN ... THEN ...] + [ELSE c] +END +``` + +Si `x` est spécifié, alors `transform(x, [a, ...], [b, ...], c)` function is used. Otherwise – `multiIf(a, b, ..., c)`. + +Si il n'y a pas de `ELSE c` dans l'expression, la valeur par défaut est `NULL`. + +Le `transform` la fonction ne fonctionne pas avec `NULL`. + +## Opérateur De Concaténation {#concatenation-operator} + +`s1 || s2` – The `concat(s1, s2) function.` + +## Opérateur De Création Lambda {#lambda-creation-operator} + +`x -> expr` – The `lambda(x, expr) function.` + +Les opérateurs suivants n'ont pas de priorité, puisqu'ils sont des parenthèses: + +## Opérateur De Création De Tableau {#array-creation-operator} + +`[x1, ...]` – The `array(x1, ...) function.` + +## Opérateur De Création De Tuple {#tuple-creation-operator} + +`(x1, x2, ...)` – The `tuple(x2, x2, ...) function.` + +## Associativité {#associativity} + +Tous les opérateurs binaires ont associativité gauche. Exemple, `1 + 2 + 3` est transformé à `plus(plus(1, 2), 3)`. +Parfois, cela ne fonctionne pas de la façon que vous attendez. Exemple, `SELECT 4 > 2 > 3` résultat sera 0. + +Pour l'efficacité, le `and` et `or` les fonctions acceptent n'importe quel nombre d'arguments. Les chaînes de `AND` et `OR` les opérateurs sont transformés en un seul appel de ces fonctions. + +## La vérification de `NULL` {#checking-for-null} + +Clickhouse soutient le `IS NULL` et `IS NOT NULL` opérateur. + +### IS NULL {#operator-is-null} + +- Pour [Nullable](../data_types/nullable.md) type de valeurs, l' `IS NULL` opérateur retourne: + - `1` si la valeur est `NULL`. + - `0` autrement. +- Pour les autres valeurs, la `IS NULL` l'opérateur renvoie toujours `0`. + + + +``` sql +SELECT x+100 FROM t_null WHERE y IS NULL +``` + +``` text +┌─plus(x, 100)─┐ +│ 101 │ +└──────────────┘ +``` + +### IS NOT NULL {#is-not-null} + +- Pour [Nullable](../data_types/nullable.md) type de valeurs, l' `IS NOT NULL` opérateur retourne: + - `0` si la valeur est `NULL`. + - `1` autrement. +- Pour les autres valeurs, la `IS NOT NULL` l'opérateur renvoie toujours `1`. + + + +``` sql +SELECT * FROM t_null WHERE y IS NOT NULL +``` + +``` text +┌─x─┬─y─┐ +│ 2 │ 3 │ +└───┴───┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/operators/) diff --git a/docs/fr/query_language/select.md b/docs/fr/query_language/select.md new file mode 100644 index 00000000000..c5955b5f45d --- /dev/null +++ b/docs/fr/query_language/select.md @@ -0,0 +1,1379 @@ +--- +machine_translated: true +--- + +# Sélectionnez la syntaxe des requêtes {#select-queries-syntax} + +`SELECT` effectue la récupération des données. + +``` sql +[WITH expr_list|(subquery)] +SELECT [DISTINCT] expr_list +[FROM [db.]table | (subquery) | table_function] [FINAL] +[SAMPLE sample_coeff] +[ARRAY JOIN ...] +[GLOBAL] [ANY|ALL] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER] JOIN (subquery)|table USING columns_list +[PREWHERE expr] +[WHERE expr] +[GROUP BY expr_list] [WITH TOTALS] +[HAVING expr] +[ORDER BY expr_list] +[LIMIT [offset_value, ]n BY columns] +[LIMIT [n, ]m] +[UNION ALL ...] +[INTO OUTFILE filename] +[FORMAT format] +``` + +Toutes les clauses sont facultatives, à l'exception de la liste d'expressions requise immédiatement après SELECT. +Les clauses ci-dessous sont décrites dans presque le même ordre que dans l'exécution de la requête convoyeur. + +Si la requête omet le `DISTINCT`, `GROUP BY` et `ORDER BY` les clauses et les `IN` et `JOIN` sous-requêtes, la requête sera complètement traitée en flux, en utilisant O (1) quantité de RAM. +Sinon, la requête peut consommer beaucoup de RAM si les restrictions appropriées ne sont pas spécifiées: `max_memory_usage`, `max_rows_to_group_by`, `max_rows_to_sort`, `max_rows_in_distinct`, `max_bytes_in_distinct`, `max_rows_in_set`, `max_bytes_in_set`, `max_rows_in_join`, `max_bytes_in_join`, `max_bytes_before_external_sort`, `max_bytes_before_external_group_by`. Pour plus d'informations, consultez la section “Settings”. Il est possible d'utiliser le tri externe (sauvegarde des tables temporaires sur un disque) et l'agrégation externe. `The system does not have "merge join"`. + +### AVEC la Clause {#with-clause} + +Cette section prend en charge les Expressions de Table courantes ([CTE](https://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL)), avec quelques limitations: +1. Les requêtes récursives ne sont pas prises en charge +2. Lorsque la sous-requête est utilisée à l'intérieur avec section, son résultat doit être scalaire avec exactement une ligne +3. Les résultats d'Expression ne sont pas disponibles dans les sous requêtes +Les résultats des expressions de clause WITH peuvent être utilisés dans la clause SELECT. + +Exemple 1: Utilisation d'une expression constante comme “variable” + +``` sql +WITH '2019-08-01 15:23:00' as ts_upper_bound +SELECT * +FROM hits +WHERE + EventDate = toDate(ts_upper_bound) AND + EventTime <= ts_upper_bound +``` + +Exemple 2: Expulsion de la somme(octets) résultat de l'expression de clause SELECT de la liste de colonnes + +``` sql +WITH sum(bytes) as s +SELECT + formatReadableSize(s), + table +FROM system.parts +GROUP BY table +ORDER BY s +``` + +Exemple 3: Utilisation des résultats de la sous-requête scalaire + +``` sql +/* this example would return TOP 10 of most huge tables */ +WITH + ( + SELECT sum(bytes) + FROM system.parts + WHERE active + ) AS total_disk_usage +SELECT + (sum(bytes) / total_disk_usage) * 100 AS table_disk_usage, + table +FROM system.parts +GROUP BY table +ORDER BY table_disk_usage DESC +LIMIT 10 +``` + +Exemple 4: réutilisation de l'expression dans la sous-requête +Comme solution de contournement pour la limitation actuelle de l'utilisation de l'expression dans les sous-requêtes, Vous pouvez la dupliquer. + +``` sql +WITH ['hello'] AS hello +SELECT + hello, + * +FROM +( + WITH ['hello'] AS hello + SELECT hello +) +``` + +``` text +┌─hello─────┬─hello─────┐ +│ ['hello'] │ ['hello'] │ +└───────────┴───────────┘ +``` + +### De la Clause {#select-from} + +Si la clause FROM est omise, les données seront lues à partir `system.one` table. +Le `system.one` table contient exactement une ligne (cette table remplit le même but que la table double trouvée dans d'autres SGBD). + +Le `FROM` clause spécifie la source à partir de laquelle lire les données: + +- Table +- Sous-requête +- [Fonction de Table](table_functions/index.md) + +`ARRAY JOIN` et le régulier `JOIN` peuvent également être inclus (voir ci-dessous). + +Au lieu d'une table, l' `SELECT` sous-requête peut être spécifiée entre parenthèses. +Contrairement à SQL standard, un synonyme n'a pas besoin d'être spécifié après une sous-requête. + +Pour exécuter une requête, toutes les colonnes mentionnées dans la requête sont extraites de la table appropriée. Toutes les colonnes non nécessaires pour la requête externe sont rejetées des sous-requêtes. +Si une requête ne répertorie aucune colonne (par exemple, `SELECT count() FROM t`), une colonne est extraite de la table de toute façon (la plus petite est préférée), afin de calculer le nombre de lignes. + +#### Modificateur FINAL {#select-from-final} + +Applicable lors de la sélection de données à partir de tables [MergeTree](../operations/table_engines/mergetree.md)-famille de moteurs autres que `GraphiteMergeTree`. Lorsque `FINAL` est spécifié, ClickHouse fusionne complètement les données avant de renvoyer le résultat et effectue ainsi toutes les transformations de données qui se produisent lors des fusions pour le moteur de table donné. + +Également pris en charge pour: +- [Répliqué](../operations/table_engines/replication.md) les versions de `MergeTree` moteur. +- [Vue](../operations/table_engines/view.md), [Tampon](../operations/table_engines/buffer.md), [Distribué](../operations/table_engines/distributed.md), et [MaterializedView](../operations/table_engines/materializedview.md) moteurs qui fonctionnent sur d'autres moteurs, à condition qu'ils aient été créés sur `MergeTree`-tables de moteur. + +Requêtes qui utilisent `FINAL` sont exécutés pas aussi vite que les requêtes similaires qui ne le font pas, car: + +- La requête est exécutée dans un seul thread et les données sont fusionnées lors de l'exécution de la requête. +- Les requêtes avec `FINAL` lire les colonnes de clé primaire en plus des colonnes spécifiées dans la requête. + +Dans la plupart des cas, évitez d'utiliser `FINAL`. + +### Exemple de Clause {#select-sample-clause} + +Le `SAMPLE` la clause permet un traitement de requête approximatif. + +Lorsque l'échantillonnage de données est activé, la requête n'est pas effectuée sur toutes les données, mais uniquement sur une certaine fraction de données (échantillon). Par exemple, si vous avez besoin de calculer des statistiques pour toutes les visites, il suffit d'exécuter la requête sur le 1/10 de la fraction de toutes les visites, puis multiplier le résultat par 10. + +Le traitement approximatif des requêtes peut être utile dans les cas suivants: + +- Lorsque vous avez des exigences de synchronisation strictes (comme \<100ms), mais que vous ne pouvez pas justifier le coût des ressources matérielles supplémentaires pour y répondre. +- Lorsque vos données brutes ne sont pas précises, l'approximation ne dégrade pas sensiblement la qualité. +- Les exigences commerciales ciblent des résultats approximatifs (pour la rentabilité, ou afin de commercialiser des résultats exacts aux utilisateurs premium). + +!!! note "Note" + Vous ne pouvez utiliser l'échantillonnage qu'avec les tables [MergeTree](../operations/table_engines/mergetree.md) famille, et seulement si l'expression d'échantillonnage a été spécifiée lors de la création de la table (voir [Moteur MergeTree](../operations/table_engines/mergetree.md#table_engine-mergetree-creating-a-table)). + +Les caractéristiques de l'échantillonnage des données sont énumérées ci-dessous: + +- L'échantillonnage de données est un mécanisme déterministe. Le résultat de la même `SELECT .. SAMPLE` la requête est toujours le même. +- L'échantillonnage fonctionne de manière cohérente pour différentes tables. Pour les tables avec une seule clé d'échantillonnage, un échantillon avec le même coefficient sélectionne toujours le même sous-ensemble de données possibles. Par exemple, un exemple d'ID utilisateur prend des lignes avec le même sous-ensemble de tous les ID utilisateur possibles de différentes tables. Cela signifie que vous pouvez utiliser l'exemple dans les sous-requêtes dans la [IN](#select-in-operators) clause. En outre, vous pouvez joindre des échantillons en utilisant le [JOIN](#select-join) clause. +- L'échantillonnage permet de lire moins de données à partir d'un disque. Notez que vous devez spécifier l'échantillonnage clé correctement. Pour plus d'informations, voir [Création d'une Table MergeTree](../operations/table_engines/mergetree.md#table_engine-mergetree-creating-a-table). + +Pour l' `SAMPLE` clause la syntaxe suivante est prise en charge: + +| SAMPLE Clause Syntax | Description | +|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `SAMPLE k` | Ici `k` est le nombre de 0 à 1.
La requête est exécutée sur `k` fraction des données. Exemple, `SAMPLE 0.1` exécute la requête sur 10% des données. [Lire plus](#select-sample-k) | +| `SAMPLE n` | Ici `n` est un entier suffisamment grand.
La requête est exécutée sur un échantillon d'au moins `n` lignes (mais pas significativement plus que cela). Exemple, `SAMPLE 10000000` exécute la requête sur un minimum de 10 000 000 lignes. [Lire plus](#select-sample-n) | +| `SAMPLE k OFFSET m` | Ici `k` et `m` sont les nombres de 0 à 1.
La requête est exécutée sur un échantillon de `k` fraction des données. Les données utilisées pour l'échantillon est compensée par `m` fraction. [Lire plus](#select-sample-offset) | + +#### L'ÉCHANTILLON k {#select-sample-k} + +Ici `k` est le nombre de 0 à 1 (les notations fractionnaires et décimales sont prises en charge). Exemple, `SAMPLE 1/2` ou `SAMPLE 0.5`. + +Dans un `SAMPLE k` clause, l'échantillon est prélevé à partir de la `k` fraction des données. L'exemple est illustré ci-dessous: + +``` sql +SELECT + Title, + count() * 10 AS PageViews +FROM hits_distributed +SAMPLE 0.1 +WHERE + CounterID = 34 +GROUP BY Title +ORDER BY PageViews DESC LIMIT 1000 +``` + +Dans cet exemple, la requête est exécutée sur un échantillon de 0,1 (10%) de données. Les valeurs des fonctions d'agrégat ne sont pas corrigées automatiquement, donc pour obtenir un résultat approximatif, la valeur `count()` est multiplié manuellement par 10. + +#### Échantillon n {#select-sample-n} + +Ici `n` est un entier suffisamment grand. Exemple, `SAMPLE 10000000`. + +Dans ce cas, la requête est exécutée sur un échantillon d'au moins `n` lignes (mais pas significativement plus que cela). Exemple, `SAMPLE 10000000` exécute la requête sur un minimum de 10 000 000 lignes. + +Puisque l'unité minimale pour la lecture des données est un granule (sa taille est définie par le `index_granularity` de réglage), il est logique de définir un échantillon beaucoup plus grand que la taille du granule. + +Lors de l'utilisation de la `SAMPLE n` clause, vous ne savez pas quel pourcentage relatif de données a été traité. Donc, vous ne connaissez pas le coefficient par lequel les fonctions agrégées doivent être multipliées. L'utilisation de la `_sample_factor` colonne virtuelle pour obtenir le résultat approximatif. + +Le `_sample_factor` colonne contient des coefficients relatifs qui sont calculés dynamiquement. Cette colonne est créée automatiquement lorsque vous [créer](../operations/table_engines/mergetree.md#table_engine-mergetree-creating-a-table) une table avec la clé d'échantillonnage spécifiée. Les exemples d'utilisation de la `_sample_factor` colonne sont indiqués ci-dessous. + +Considérons la table `visits` qui contient des statistiques sur les visites de site. Le premier exemple montre comment calculer le nombre de pages vues: + +``` sql +SELECT sum(PageViews * _sample_factor) +FROM visits +SAMPLE 10000000 +``` + +L'exemple suivant montre comment calculer le nombre total de visites: + +``` sql +SELECT sum(_sample_factor) +FROM visits +SAMPLE 10000000 +``` + +L'exemple ci-dessous montre comment calculer la durée moyenne de la session. Notez que vous n'avez pas besoin d'utiliser le coefficient relatif pour calculer les valeurs moyennes. + +``` sql +SELECT avg(Duration) +FROM visits +SAMPLE 10000000 +``` + +#### Échantillon K décalage m {#select-sample-offset} + +Ici `k` et `m` sont des nombres de 0 à 1. Des exemples sont présentés ci-dessous. + +**Exemple 1** + +``` sql +SAMPLE 1/10 +``` + +Dans cet exemple, l'échantillon représente 1 / 10e de toutes les données: + +`[++------------------]` + +**Exemple 2** + +``` sql +SAMPLE 1/10 OFFSET 1/2 +``` + +Ici, un échantillon de 10% est prélevé à partir de la seconde moitié des données. + +`[----------++--------]` + +### Clause de jointure de tableau {#select-array-join-clause} + +Permet l'exécution de `JOIN` avec un tableau ou une structure de données imbriquée. L'intention est similaire à la [arrayJoin](functions/array_join.md#functions_arrayjoin) la fonction, mais sa fonctionnalité est plus large. + +``` sql +SELECT +FROM +[LEFT] ARRAY JOIN +[WHERE|PREWHERE ] +... +``` + +Vous pouvez spécifier qu'un seul `ARRAY JOIN` la clause dans une requête. + +L'ordre d'exécution de la requête est optimisé lors de l'exécution `ARRAY JOIN`. Bien `ARRAY JOIN` doit toujours être spécifié avant l' `WHERE/PREWHERE` clause, il peut être effectué soit avant `WHERE/PREWHERE` (si le résultat est nécessaire dans cette clause), ou après l'avoir terminé (pour réduire le volume de calculs). L'ordre de traitement est contrôlée par l'optimiseur de requête. + +Types pris en charge de `ARRAY JOIN` sont énumérés ci-dessous: + +- `ARRAY JOIN` - Dans ce cas, des tableaux vides ne sont pas inclus dans le résultat de `JOIN`. +- `LEFT ARRAY JOIN` - Le résultat de `JOIN` contient des lignes avec des tableaux vides. La valeur d'un tableau vide est définie sur la valeur par défaut pour le type d'élément de tableau (généralement 0, chaîne vide ou NULL). + +Les exemples ci-dessous illustrent l'utilisation de la `ARRAY JOIN` et `LEFT ARRAY JOIN` clause. Créons une table avec un [Tableau](../data_types/array.md) tapez colonne et insérez des valeurs dedans: + +``` sql +CREATE TABLE arrays_test +( + s String, + arr Array(UInt8) +) ENGINE = Memory; + +INSERT INTO arrays_test +VALUES ('Hello', [1,2]), ('World', [3,4,5]), ('Goodbye', []); +``` + +``` text +┌─s───────────┬─arr─────┐ +│ Hello │ [1,2] │ +│ World │ [3,4,5] │ +│ Goodbye │ [] │ +└─────────────┴─────────┘ +``` + +L'exemple ci-dessous utilise la `ARRAY JOIN` clause: + +``` sql +SELECT s, arr +FROM arrays_test +ARRAY JOIN arr; +``` + +``` text +┌─s─────┬─arr─┐ +│ Hello │ 1 │ +│ Hello │ 2 │ +│ World │ 3 │ +│ World │ 4 │ +│ World │ 5 │ +└───────┴─────┘ +``` + +L'exemple suivant utilise l' `LEFT ARRAY JOIN` clause: + +``` sql +SELECT s, arr +FROM arrays_test +LEFT ARRAY JOIN arr; +``` + +``` text +┌─s───────────┬─arr─┐ +│ Hello │ 1 │ +│ Hello │ 2 │ +│ World │ 3 │ +│ World │ 4 │ +│ World │ 5 │ +│ Goodbye │ 0 │ +└─────────────┴─────┘ +``` + +#### À L'Aide D'Alias {#using-aliases} + +Un alias peut être spécifié pour un tableau `ARRAY JOIN` clause. Dans ce cas, un élément de tableau peut être consulté par ce pseudonyme, mais le tableau lui-même est accessible par le nom d'origine. Exemple: + +``` sql +SELECT s, arr, a +FROM arrays_test +ARRAY JOIN arr AS a; +``` + +``` text +┌─s─────┬─arr─────┬─a─┐ +│ Hello │ [1,2] │ 1 │ +│ Hello │ [1,2] │ 2 │ +│ World │ [3,4,5] │ 3 │ +│ World │ [3,4,5] │ 4 │ +│ World │ [3,4,5] │ 5 │ +└───────┴─────────┴───┘ +``` + +En utilisant des alias, vous pouvez effectuer `ARRAY JOIN` avec un groupe externe. Exemple: + +``` sql +SELECT s, arr_external +FROM arrays_test +ARRAY JOIN [1, 2, 3] AS arr_external; +``` + +``` text +┌─s───────────┬─arr_external─┐ +│ Hello │ 1 │ +│ Hello │ 2 │ +│ Hello │ 3 │ +│ World │ 1 │ +│ World │ 2 │ +│ World │ 3 │ +│ Goodbye │ 1 │ +│ Goodbye │ 2 │ +│ Goodbye │ 3 │ +└─────────────┴──────────────┘ +``` + +Plusieurs tableaux peuvent être séparés par des virgules `ARRAY JOIN` clause. Dans ce cas, `JOIN` est effectuée avec eux simultanément (la somme directe, pas le produit cartésien). Notez que tous les tableaux doivent avoir la même taille. Exemple: + +``` sql +SELECT s, arr, a, num, mapped +FROM arrays_test +ARRAY JOIN arr AS a, arrayEnumerate(arr) AS num, arrayMap(x -> x + 1, arr) AS mapped; +``` + +``` text +┌─s─────┬─arr─────┬─a─┬─num─┬─mapped─┐ +│ Hello │ [1,2] │ 1 │ 1 │ 2 │ +│ Hello │ [1,2] │ 2 │ 2 │ 3 │ +│ World │ [3,4,5] │ 3 │ 1 │ 4 │ +│ World │ [3,4,5] │ 4 │ 2 │ 5 │ +│ World │ [3,4,5] │ 5 │ 3 │ 6 │ +└───────┴─────────┴───┴─────┴────────┘ +``` + +L'exemple ci-dessous utilise la [arrayEnumerate](functions/array_functions.md#array_functions-arrayenumerate) fonction: + +``` sql +SELECT s, arr, a, num, arrayEnumerate(arr) +FROM arrays_test +ARRAY JOIN arr AS a, arrayEnumerate(arr) AS num; +``` + +``` text +┌─s─────┬─arr─────┬─a─┬─num─┬─arrayEnumerate(arr)─┐ +│ Hello │ [1,2] │ 1 │ 1 │ [1,2] │ +│ Hello │ [1,2] │ 2 │ 2 │ [1,2] │ +│ World │ [3,4,5] │ 3 │ 1 │ [1,2,3] │ +│ World │ [3,4,5] │ 4 │ 2 │ [1,2,3] │ +│ World │ [3,4,5] │ 5 │ 3 │ [1,2,3] │ +└───────┴─────────┴───┴─────┴─────────────────────┘ +``` + +#### Jointure de tableau avec la Structure de données imbriquée {#array-join-with-nested-data-structure} + +`ARRAY`Rejoindre " fonctionne également avec [structures de données imbriquées](../data_types/nested_data_structures/nested.md). Exemple: + +``` sql +CREATE TABLE nested_test +( + s String, + nest Nested( + x UInt8, + y UInt32) +) ENGINE = Memory; + +INSERT INTO nested_test +VALUES ('Hello', [1,2], [10,20]), ('World', [3,4,5], [30,40,50]), ('Goodbye', [], []); +``` + +``` text +┌─s───────┬─nest.x──┬─nest.y─────┐ +│ Hello │ [1,2] │ [10,20] │ +│ World │ [3,4,5] │ [30,40,50] │ +│ Goodbye │ [] │ [] │ +└─────────┴─────────┴────────────┘ +``` + +``` sql +SELECT s, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN nest; +``` + +``` text +┌─s─────┬─nest.x─┬─nest.y─┐ +│ Hello │ 1 │ 10 │ +│ Hello │ 2 │ 20 │ +│ World │ 3 │ 30 │ +│ World │ 4 │ 40 │ +│ World │ 5 │ 50 │ +└───────┴────────┴────────┘ +``` + +Lorsque vous spécifiez des noms de structures de données imbriquées dans `ARRAY JOIN` le sens est le même que `ARRAY JOIN` avec tous les éléments du tableau qui la compose. Des exemples sont énumérés ci-dessous: + +``` sql +SELECT s, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN `nest.x`, `nest.y`; +``` + +``` text +┌─s─────┬─nest.x─┬─nest.y─┐ +│ Hello │ 1 │ 10 │ +│ Hello │ 2 │ 20 │ +│ World │ 3 │ 30 │ +│ World │ 4 │ 40 │ +│ World │ 5 │ 50 │ +└───────┴────────┴────────┘ +``` + +Cette variation a également du sens: + +``` sql +SELECT s, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN `nest.x`; +``` + +``` text +┌─s─────┬─nest.x─┬─nest.y─────┐ +│ Hello │ 1 │ [10,20] │ +│ Hello │ 2 │ [10,20] │ +│ World │ 3 │ [30,40,50] │ +│ World │ 4 │ [30,40,50] │ +│ World │ 5 │ [30,40,50] │ +└───────┴────────┴────────────┘ +``` + +Un alias peut être utilisé pour une structure de données imbriquée, afin de sélectionner `JOIN` le résultat ou le tableau source. Exemple: + +``` sql +SELECT s, `n.x`, `n.y`, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN nest AS n; +``` + +``` text +┌─s─────┬─n.x─┬─n.y─┬─nest.x──┬─nest.y─────┐ +│ Hello │ 1 │ 10 │ [1,2] │ [10,20] │ +│ Hello │ 2 │ 20 │ [1,2] │ [10,20] │ +│ World │ 3 │ 30 │ [3,4,5] │ [30,40,50] │ +│ World │ 4 │ 40 │ [3,4,5] │ [30,40,50] │ +│ World │ 5 │ 50 │ [3,4,5] │ [30,40,50] │ +└───────┴─────┴─────┴─────────┴────────────┘ +``` + +Exemple d'utilisation de l' [arrayEnumerate](functions/array_functions.md#array_functions-arrayenumerate) fonction: + +``` sql +SELECT s, `n.x`, `n.y`, `nest.x`, `nest.y`, num +FROM nested_test +ARRAY JOIN nest AS n, arrayEnumerate(`nest.x`) AS num; +``` + +``` text +┌─s─────┬─n.x─┬─n.y─┬─nest.x──┬─nest.y─────┬─num─┐ +│ Hello │ 1 │ 10 │ [1,2] │ [10,20] │ 1 │ +│ Hello │ 2 │ 20 │ [1,2] │ [10,20] │ 2 │ +│ World │ 3 │ 30 │ [3,4,5] │ [30,40,50] │ 1 │ +│ World │ 4 │ 40 │ [3,4,5] │ [30,40,50] │ 2 │ +│ World │ 5 │ 50 │ [3,4,5] │ [30,40,50] │ 3 │ +└───────┴─────┴─────┴─────────┴────────────┴─────┘ +``` + +### Clause de JOINTURE {#select-join} + +Rejoint les données dans la normale [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) sens. + +!!! info "Note" + Pas liées à [ARRAY JOIN](#select-array-join-clause). + +``` sql +SELECT +FROM +[GLOBAL] [ANY|ALL] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER] JOIN +(ON )|(USING ) ... +``` + +Les noms de table peuvent être spécifiés au lieu de `` et ``. Ceci est équivalent à la `SELECT * FROM table` sous-requête, sauf dans un cas particulier lorsque la table a [Rejoindre](../operations/table_engines/join.md) engine – an array prepared for joining. + +#### Types pris en charge de `JOIN` {#select-join-types} + +- `INNER JOIN` (ou `JOIN`) +- `LEFT JOIN` (ou `LEFT OUTER JOIN`) +- `RIGHT JOIN` (ou `RIGHT OUTER JOIN`) +- `FULL JOIN` (ou `FULL OUTER JOIN`) +- `CROSS JOIN` (ou `,` ) + +Voir la norme [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) Description. + +#### Plusieurs REJOINDRE {#multiple-join} + +En effectuant des requêtes, ClickHouse réécrit les jointures multi-tables dans la séquence des jointures à deux tables. Par exemple, S'il y a quatre tables pour join clickhouse rejoint la première et la seconde, puis rejoint le résultat avec la troisième table, et à la dernière étape, il rejoint la quatrième. + +Si une requête contient l' `WHERE` clickhouse essaie de pousser les filtres de cette clause à travers la jointure intermédiaire. S'il ne peut pas appliquer le filtre à chaque jointure intermédiaire, ClickHouse applique les filtres une fois toutes les jointures terminées. + +Nous recommandons l' `JOIN ON` ou `JOIN USING` syntaxe pour créer des requêtes. Exemple: + +``` sql +SELECT * FROM t1 JOIN t2 ON t1.a = t2.a JOIN t3 ON t1.a = t3.a +``` + +Vous pouvez utiliser des listes de tables séparées par des virgules `FROM` clause. Exemple: + +``` sql +SELECT * FROM t1, t2, t3 WHERE t1.a = t2.a AND t1.a = t3.a +``` + +Ne mélangez pas ces syntaxes. + +ClickHouse ne supporte pas directement la syntaxe avec des virgules, Nous ne recommandons donc pas de les utiliser. L'algorithme tente de réécrire la requête en termes de `CROSS JOIN` et `INNER JOIN` clauses et procède ensuite au traitement des requêtes. Lors de la réécriture de la requête, ClickHouse tente d'optimiser les performances et la consommation de mémoire. Par défaut, ClickHouse traite les virgules comme `INNER JOIN` clause et convertit `INNER JOIN` de `CROSS JOIN` lorsque l'algorithme ne peut pas garantir que `INNER JOIN` retourne les données requises. + +#### Rigueur {#select-join-strictness} + +- `ALL` — If the right table has several matching rows, ClickHouse creates a [Produit cartésien](https://en.wikipedia.org/wiki/Cartesian_product) à partir des lignes correspondantes. C'est la norme `JOIN` comportement en SQL. +- `ANY` — If the right table has several matching rows, only the first one found is joined. If the right table has only one matching row, the results of queries with `ANY` et `ALL` les mots clés sont les mêmes. +- `ASOF` — For joining sequences with a non-exact match. `ASOF JOIN` l'utilisation est décrite ci-dessous. + +**ASOF joindre L'utilisation** + +`ASOF JOIN` est utile lorsque vous devez joindre des enregistrements qui n'ont pas de correspondance exacte. + +Tables pour `ASOF JOIN` doit avoir une colonne de séquence ordonnée. Cette colonne ne peut pas être seule dans une table et doit être l'un des types de données: `UInt32`, `UInt64`, `Float32`, `Float64`, `Date`, et `DateTime`. + +Syntaxe `ASOF JOIN ... ON`: + +``` sql +SELECT expressions_list +FROM table_1 +ASOF LEFT JOIN table_2 +ON equi_cond AND closest_match_cond +``` + +Vous pouvez utiliser n'importe quel nombre de conditions d'égalité et exactement une condition de correspondance la plus proche. Exemple, `SELECT count() FROM table_1 ASOF LEFT JOIN table_2 ON table_1.a == table_2.b AND table_2.t <= table_1.t`. + +Conditions prises en charge pour la correspondance la plus proche: `>`, `>=`, `<`, `<=`. + +Syntaxe `ASOF JOIN ... USING`: + +``` sql +SELECT expressions_list +FROM table_1 +ASOF JOIN table_2 +USING (equi_column1, ... equi_columnN, asof_column) +``` + +`ASOF JOIN` utiliser `equi_columnX` pour rejoindre sur l'égalité et `asof_column` pour rejoindre le match le plus proche avec le `table_1.asof_column >= table_2.asof_column` condition. Le `asof_column` colonne toujours la dernière dans le `USING` clause. + +Par exemple, considérez les tableaux suivants: + +``` text + table_1 table_2 + + event | ev_time | user_id event | ev_time | user_id +----------|---------|---------- ----------|---------|---------- + ... ... +event_1_1 | 12:00 | 42 event_2_1 | 11:59 | 42 + ... event_2_2 | 12:30 | 42 +event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42 + ... ... +``` + +`ASOF JOIN` peut prendre la date d'un événement utilisateur de `table_1` et trouver un événement dans `table_2` où le timestamp est plus proche de l'horodatage de l'événement à partir de `table_1` correspondant à la condition de correspondance la plus proche. Les valeurs d'horodatage égales sont les plus proches si elles sont disponibles. Ici, l' `user_id` la colonne peut être utilisée pour joindre sur l'égalité et le `ev_time` la colonne peut être utilisée pour se joindre à la correspondance la plus proche. Dans notre exemple, `event_1_1` peut être jointe à `event_2_1` et `event_1_2` peut être jointe à `event_2_3`, mais `event_2_2` ne peut pas être rejoint. + +!!! note "Note" + `ASOF` jointure est **pas** pris en charge dans le [Rejoindre](../operations/table_engines/join.md) tableau moteur. + +Pour définir la valeur de rigueur par défaut, utilisez le paramètre de configuration de session [join\_default\_strictness](../operations/settings/settings.md#settings-join_default_strictness). + +#### GLOBAL JOIN {#global-join} + +Lors de l'utilisation normale `JOIN` la requête est envoyée aux serveurs distants. Les sous-requêtes sont exécutées sur chacune d'elles afin de créer la bonne table, et la jointure est effectuée avec cette table. En d'autres termes, la table de droite est formée sur chaque serveur séparément. + +Lors de l'utilisation de `GLOBAL ... JOIN`, d'abord le serveur demandeur exécute une sous-requête pour calculer la bonne table. Cette table temporaire est transmise à chaque serveur distant, et les requêtes sont exécutées sur eux en utilisant les données temporaires qui ont été transmises. + +Soyez prudent lorsque vous utilisez `GLOBAL`. Pour plus d'informations, consultez la section [Sous-requêtes distribuées](#select-distributed-subqueries). + +#### Recommandations D'Utilisation {#usage-recommendations} + +Lors de l'exécution d'un `JOIN`, il n'y a pas d'optimisation de la commande d'exécution par rapport aux autres stades de la requête. La jointure (une recherche dans la table de droite) est exécutée avant de filtrer `WHERE` et avant l'agrégation. Afin de définir explicitement l'ordre de traitement, nous vous recommandons d'exécuter une `JOIN` sous-requête avec une sous-requête. + +Exemple: + +``` sql +SELECT + CounterID, + hits, + visits +FROM +( + SELECT + CounterID, + count() AS hits + FROM test.hits + GROUP BY CounterID +) ANY LEFT JOIN +( + SELECT + CounterID, + sum(Sign) AS visits + FROM test.visits + GROUP BY CounterID +) USING CounterID +ORDER BY hits DESC +LIMIT 10 +``` + +``` text +┌─CounterID─┬───hits─┬─visits─┐ +│ 1143050 │ 523264 │ 13665 │ +│ 731962 │ 475698 │ 102716 │ +│ 722545 │ 337212 │ 108187 │ +│ 722889 │ 252197 │ 10547 │ +│ 2237260 │ 196036 │ 9522 │ +│ 23057320 │ 147211 │ 7689 │ +│ 722818 │ 90109 │ 17847 │ +│ 48221 │ 85379 │ 4652 │ +│ 19762435 │ 77807 │ 7026 │ +│ 722884 │ 77492 │ 11056 │ +└───────────┴────────┴────────┘ +``` + +Les sous-requêtes ne vous permettent pas de définir des noms ou de les utiliser pour référencer une colonne à partir d'une sous-requête spécifique. +Les colonnes spécifiées dans `USING` doit avoir les mêmes noms dans les deux sous-requêtes, et les autres colonnes doivent être nommées différemment. Vous pouvez utiliser des alias pour les noms des colonnes dans les sous-requêtes (l'exemple utilise l'alias `hits` et `visits`). + +Le `USING` clause spécifie une ou plusieurs colonnes de jointure, qui établit l'égalité de ces colonnes. La liste des colonnes est définie sans crochets. Les conditions de jointure plus complexes ne sont pas prises en charge. + +La table de droite (le résultat de la sous-requête) réside dans la RAM. S'il n'y a pas assez de mémoire, vous ne pouvez pas exécuter un `JOIN`. + +Chaque fois qu'une requête est exécutée avec la même `JOIN`, la sous-requête est exécutée à nouveau car le résultat n'est pas mis en cache. Pour éviter cela, utilisez la spéciale [Rejoindre](../operations/table_engines/join.md) table engine, qui est un tableau préparé pour l'assemblage qui est toujours en RAM. + +Dans certains cas, il est plus efficace d'utiliser `IN` plutôt `JOIN`. +Parmi les différents types de `JOIN`, le plus efficace est d' `ANY LEFT JOIN`, puis `ANY INNER JOIN`. Les moins efficaces sont `ALL LEFT JOIN` et `ALL INNER JOIN`. + +Si vous avez besoin d'un `JOIN` pour se joindre à des tables de dimension (ce sont des tables relativement petites qui contiennent des propriétés de dimension, telles que des noms pour des campagnes publicitaires), un `JOIN` peut-être pas très pratique en raison du fait que la bonne table est ré-accédée pour chaque requête. Pour de tels cas, il y a un “external dictionaries” la fonctionnalité que vous devez utiliser à la place de `JOIN`. Pour plus d'informations, consultez la section [Dictionnaires externes](dicts/external_dicts.md). + +**Limitations De Mémoire** + +ClickHouse utilise le [jointure de hachage](https://en.wikipedia.org/wiki/Hash_join) algorithme. ClickHouse prend le `` et crée une table de hachage pour cela dans la RAM. Si vous devez restreindre la consommation de mémoire de l'opération join utilisez les paramètres suivants: + +- [max\_rows\_in\_join](../operations/settings/query_complexity.md#settings-max_rows_in_join) — Limits number of rows in the hash table. +- [max\_bytes\_in\_join](../operations/settings/query_complexity.md#settings-max_bytes_in_join) — Limits size of the hash table. + +Lorsque l'une de ces limites est atteinte, ClickHouse agit comme [join\_overflow\_mode](../operations/settings/query_complexity.md#settings-join_overflow_mode) réglage des instructions. + +#### Traitement des cellules vides ou nulles {#processing-of-empty-or-null-cells} + +Lors de la jonction de tables, les cellules vides peuvent apparaître. Paramètre [join\_use\_nulls](../operations/settings/settings.md#join_use_nulls) définir comment clickhouse remplit ces cellules. + +Si l' `JOIN` les touches sont [Nullable](../data_types/nullable.md) champs, les lignes où au moins une des clés a la valeur [NULL](syntax.md#null-literal) ne sont pas jointes. + +#### Limitations De Syntaxe {#syntax-limitations} + +Pour plusieurs `JOIN` clauses dans un seul `SELECT` requête: + +- Prendre toutes les colonnes via `*` n'est disponible que si les tables sont jointes, pas les sous-requêtes. +- Le `PREWHERE` la clause n'est pas disponible. + +Pour `ON`, `WHERE`, et `GROUP BY` clause: + +- Les expressions arbitraires ne peuvent pas être utilisées dans `ON`, `WHERE`, et `GROUP BY` mais vous pouvez définir une expression dans un `SELECT` clause et ensuite l'utiliser dans ces clauses via un alias. + +### Clause where {#select-where} + +S'il existe une clause WHERE, elle doit contenir une expression de type UInt8. C'est généralement une expression avec comparaison et opérateurs logiques. +Cette expression est utilisée pour filtrer les données avant toutes les autres transformations. + +Si les index sont pris en charge par le moteur de table de base de données, l'expression est évaluée sur la possibilité d'utiliser des index. + +### Clause PREWHERE {#prewhere-clause} + +Cette clause a le même sens que la clause WHERE. La différence est dans laquelle les données sont lues à partir de la table. +Lors de L'utilisation de PREWHERE, d'abord, seules les colonnes nécessaires à L'exécution de PREWHERE sont lues. Ensuite, les autres colonnes sont lues qui sont nécessaires pour exécuter la requête, mais seulement les blocs où L'expression PREWHERE est vraie. + +Il est logique d'utiliser PREWHERE s'il existe des conditions de filtration qui sont utilisées par une minorité de colonnes dans la requête, mais qui fournissent une filtration de données forte. Cela réduit le volume de données à lire. + +Par exemple, il est utile d'écrire PREWHERE pour les requêtes qui extraient un grand nombre de colonnes, mais qui n'ont que la filtration pour quelques colonnes. + +PREWHERE est uniquement pris en charge par les tables `*MergeTree` famille. + +Une requête peut spécifier simultanément PREWHERE et WHERE. Dans ce cas, PREWHERE précède WHERE. + +Si l' ‘optimize\_move\_to\_prewhere’ le paramètre est défini sur 1 et PREWHERE est omis, le système utilise des heuristiques pour déplacer automatiquement des parties d'expressions D'où vers PREWHERE. + +### Clause GROUP BY {#select-group-by-clause} + +C'est l'une des parties les plus importantes d'un SGBD orienté colonne. + +S'il existe une clause GROUP BY, elle doit contenir une liste d'expressions. Chaque expression sera appelée ici comme “key”. +Toutes les expressions des clauses SELECT, HAVING et ORDER BY doivent être calculées à partir de clés ou de fonctions d'agrégation. En d'autres termes, chaque colonne sélectionnée dans la table doit être utilisée soit dans les clés, soit dans les fonctions d'agrégation. + +Si une requête ne contient que des colonnes de table dans les fonctions d'agrégation, la clause GROUP BY peut être omise et l'agrégation par un ensemble de clés vide est supposée. + +Exemple: + +``` sql +SELECT + count(), + median(FetchTiming > 60 ? 60 : FetchTiming), + count() - sum(Refresh) +FROM hits +``` + +Cependant, contrairement au SQL standard, si la table n'a pas de lignes (soit il n'y en a pas du tout, soit il n'y en a pas après avoir utilisé WHERE to filter), un résultat vide est renvoyé, et non le résultat d'une des lignes contenant les valeurs initiales des fonctions d'agrégat. + +Contrairement à MySQL (et conforme à SQL standard), vous ne pouvez pas obtenir une valeur d'une colonne qui n'est pas dans une fonction clé ou agrégée (sauf les expressions constantes). Pour contourner ce problème, vous pouvez utiliser le ‘any’ fonction d'agrégation (récupère la première valeur rencontrée) ou ‘min/max’. + +Exemple: + +``` sql +SELECT + domainWithoutWWW(URL) AS domain, + count(), + any(Title) AS title -- getting the first occurred page header for each domain. +FROM hits +GROUP BY domain +``` + +Pour chaque valeur de clé différente rencontrée, GROUP BY calcule un ensemble de valeurs de fonction d'agrégation. + +GROUP BY n'est pas pris en charge pour les colonnes de tableau. + +Une constante ne peut pas être spécifiée comme arguments pour les fonctions d'agrégation. Exemple: somme(1). Au lieu de cela, vous pouvez vous débarrasser de la constante. Exemple: `count()`. + +#### Le traitement NULL {#null-processing} + +Pour le regroupement, ClickHouse interprète [NULL](syntax.md) comme une valeur, et `NULL=NULL`. + +Voici un exemple pour montrer ce que cela signifie. + +Supposons que vous avez cette table: + +``` text +┌─x─┬────y─┐ +│ 1 │ 2 │ +│ 2 │ ᴺᵁᴸᴸ │ +│ 3 │ 2 │ +│ 3 │ 3 │ +│ 3 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +Requête `SELECT sum(x), y FROM t_null_big GROUP BY y` résultats dans: + +``` text +┌─sum(x)─┬────y─┐ +│ 4 │ 2 │ +│ 3 │ 3 │ +│ 5 │ ᴺᵁᴸᴸ │ +└────────┴──────┘ +``` + +Vous pouvez voir que `GROUP BY` pour `y = NULL` résumer `x` comme si `NULL` a cette valeur. + +Si vous passez plusieurs clés `GROUP BY` le résultat vous donnera toutes les combinaisons de la sélection, comme si `NULL` ont une valeur spécifique. + +#### Avec modificateur de totaux {#with-totals-modifier} + +Si le modificateur avec totaux est spécifié, une autre ligne sera calculée. Cette ligne aura des colonnes clés contenant des valeurs par défaut (zéros ou lignes vides), et des colonnes de fonctions d'agrégat avec les valeurs calculées sur toutes les lignes (le “total” valeur). + +Cette ligne supplémentaire est sortie dans les formats JSON\*, TabSeparated\* et Pretty\*, séparément des autres lignes. Dans les autres formats, cette ligne n'est pas sortie. + +Dans les formats JSON\*, cette ligne est sortie en tant que ‘totals’ champ. Dans les formats TabSeparated\*, la ligne vient après le résultat principal, précédée d'une ligne vide (après les autres données). Dans les formats Pretty\*, la ligne est sortie sous forme de table séparée après le résultat principal. + +`WITH TOTALS` peut être exécuté de différentes manières lorsqu'il est présent. Le comportement dépend de l' ‘totals\_mode’ paramètre. +Par défaut, `totals_mode = 'before_having'`. Dans ce cas, ‘totals’ est calculé sur toutes les lignes, y compris celles qui ne passent pas par ‘max\_rows\_to\_group\_by’. + +Les autres alternatives incluent uniquement les lignes qui passent à travers avoir dans ‘totals’, et se comporter différemment avec le réglage `max_rows_to_group_by` et `group_by_overflow_mode = 'any'`. + +`after_having_exclusive` – Don't include rows that didn't pass through `max_rows_to_group_by`. En d'autres termes, ‘totals’ aura moins ou le même nombre de lignes que si `max_rows_to_group_by` ont été omis. + +`after_having_inclusive` – Include all the rows that didn't pass through ‘max\_rows\_to\_group\_by’ dans ‘totals’. En d'autres termes, ‘totals’ aura plus ou le même nombre de lignes que si `max_rows_to_group_by` ont été omis. + +`after_having_auto` – Count the number of rows that passed through HAVING. If it is more than a certain amount (by default, 50%), include all the rows that didn't pass through ‘max\_rows\_to\_group\_by’ dans ‘totals’. Sinon, ne pas les inclure. + +`totals_auto_threshold` – By default, 0.5. The coefficient for `after_having_auto`. + +Si `max_rows_to_group_by` et `group_by_overflow_mode = 'any'` ne sont pas utilisés, toutes les variations de `after_having` sont les mêmes, et vous pouvez utiliser l'un d'eux (par exemple, `after_having_auto`). + +Vous pouvez utiliser avec les totaux dans les sous-requêtes, y compris les sous-requêtes dans la clause JOIN (dans ce cas, les valeurs totales respectives sont combinées). + +#### Groupe par dans la mémoire externe {#select-group-by-in-external-memory} + +Vous pouvez activer le dumping des données temporaires sur le disque pour limiter l'utilisation de la mémoire pendant `GROUP BY`. +Le [max\_bytes\_before\_external\_group\_by](../operations/settings/settings.md#settings-max_bytes_before_external_group_by) réglage détermine le seuil de consommation de RAM pour le dumping `GROUP BY` données temporaires dans le système de fichiers. Si elle est définie sur 0 (valeur par défaut), elle est désactivée. + +Lors de l'utilisation de `max_bytes_before_external_group_by`, nous vous recommandons de définir `max_memory_usage` environ deux fois plus élevé. Ceci est nécessaire car il y a deux étapes à l'agrégation: la lecture de la date et la formation des données intermédiaires (1) et la fusion des données intermédiaires (2). Le Dumping des données dans le système de fichiers ne peut se produire qu'au cours de l'étape 1. Si les données temporaires n'ont pas été vidées, l'étape 2 peut nécessiter jusqu'à la même quantité de mémoire qu'à l'étape 1. + +Par exemple, si [max\_memory\_usage](../operations/settings/settings.md#settings_max_memory_usage) a été défini sur 10000000000 et que vous souhaitez utiliser l'agrégation externe, il est logique de définir `max_bytes_before_external_group_by` à 10000000000, et max\_memory\_usage à 20000000000. Lorsque l'agrégation externe est déclenchée (s'il y a eu au moins un vidage de données temporaires), la consommation maximale de RAM n'est que légèrement supérieure à `max_bytes_before_external_group_by`. + +Avec le traitement des requêtes distribuées, l'agrégation externe est effectuée sur des serveurs distants. Pour que le serveur demandeur n'utilise qu'une petite quantité de RAM, définissez `distributed_aggregation_memory_efficient` 1. + +Lors de la fusion de données vidées sur le disque, ainsi que lors de la fusion des résultats de serveurs distants lorsque `distributed_aggregation_memory_efficient` paramètre est activé, consomme jusqu'à `1/256 * the_number_of_threads` à partir de la quantité totale de mémoire RAM. + +Lorsque l'agrégation externe est activée, s'il y a moins de `max_bytes_before_external_group_by` of data (i.e. data was not flushed), the query runs just as fast as without external aggregation. If any temporary data was flushed, the run time will be several times longer (approximately three times). + +Si vous avez un `ORDER BY` avec un `LIMIT` après `GROUP BY` puis la quantité de RAM dépend de la quantité de données dans `LIMIT`, pas dans l'ensemble de la table. Mais si l' `ORDER BY` n'a pas `LIMIT`, n'oubliez pas d'activer externe de tri (`max_bytes_before_external_sort`). + +### Limite par Clause {#limit-by-clause} + +Une requête avec l' `LIMIT n BY expressions` la clause sélectionne le premier `n` lignes pour chaque valeur distincte de `expressions`. La clé pour `LIMIT BY` peut contenir n'importe quel nombre de [expression](syntax.md#syntax-expressions). + +ClickHouse prend en charge la syntaxe suivante: + +- `LIMIT [offset_value, ]n BY expressions` +- `LIMIT n OFFSET offset_value BY expressions` + +Pendant le traitement de la requête, ClickHouse sélectionne les données classées par clé de tri. La clé de tri est définie explicitement à l'aide [ORDER BY](#select-order-by) clause ou implicitement en tant que propriété du moteur de table. Puis clickhouse s'applique `LIMIT n BY expressions` et renvoie le premier `n` lignes pour chaque combinaison distincte de `expressions`. Si `OFFSET` est spécifié, puis pour chaque bloc de données qui appartient à une combinaison particulière de `expressions`, Clickhouse saute `offset_value` nombre de lignes depuis le début du bloc et renvoie un maximum de `n` les lignes en conséquence. Si `offset_value` est plus grand que le nombre de lignes dans le bloc de données, ClickHouse renvoie zéro lignes du bloc. + +`LIMIT BY` n'est pas liée à `LIMIT`. Ils peuvent tous deux être utilisés dans la même requête. + +**Exemple** + +Exemple de table: + +``` sql +CREATE TABLE limit_by(id Int, val Int) ENGINE = Memory; +INSERT INTO limit_by values(1, 10), (1, 11), (1, 12), (2, 20), (2, 21); +``` + +Requête: + +``` sql +SELECT * FROM limit_by ORDER BY id, val LIMIT 2 BY id +``` + +``` text +┌─id─┬─val─┐ +│ 1 │ 10 │ +│ 1 │ 11 │ +│ 2 │ 20 │ +│ 2 │ 21 │ +└────┴─────┘ +``` + +``` sql +SELECT * FROM limit_by ORDER BY id, val LIMIT 1, 2 BY id +``` + +``` text +┌─id─┬─val─┐ +│ 1 │ 11 │ +│ 1 │ 12 │ +│ 2 │ 21 │ +└────┴─────┘ +``` + +Le `SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id` requête renvoie le même résultat. + +La requête suivante renvoie les 5 principaux référents pour chaque `domain, device_type` paire avec un maximum de 100 lignes au total (`LIMIT n BY + LIMIT`). + +``` sql +SELECT + domainWithoutWWW(URL) AS domain, + domainWithoutWWW(REFERRER_URL) AS referrer, + device_type, + count() cnt +FROM hits +GROUP BY domain, referrer, device_type +ORDER BY cnt DESC +LIMIT 5 BY domain, device_type +LIMIT 100 +``` + +### Clause HAVING {#having-clause} + +Permet de filtrer le résultat reçu après GROUP BY, similaire à la clause WHERE. +Où et ayant diffèrent en ce que Où est effectué avant l'agrégation (GROUP BY), tout en ayant est effectué après. +Si l'agrégation n'est pas effectuée, HAVING ne peut pas être utilisé. + +### Clause ORDER BY {#select-order-by} + +La clause ORDER BY contient une liste d'expressions, qui peuvent chacune être affectées à DESC ou ASC (la direction de tri). Si la direction n'est pas spécifiée, ASC est supposé. ASC est trié dans l'ordre croissant, et DESC dans l'ordre décroissant. La direction de tri s'applique à une seule expression, pas à la liste entière. Exemple: `ORDER BY Visits DESC, SearchPhrase` + +Pour le tri par valeurs de chaîne, vous pouvez spécifier le classement (comparaison). Exemple: `ORDER BY SearchPhrase COLLATE 'tr'` - pour le tri par mot-clé dans l'ordre croissant, en utilisant l'alphabet turc, insensible à la casse, en supposant que les chaînes sont encodées en UTF-8. COLLATE peut être spécifié ou non pour chaque expression dans L'ordre par indépendamment. Si ASC ou DESC est spécifié, COLLATE est spécifié après. Lors de L'utilisation de COLLATE, le tri est toujours insensible à la casse. + +Nous recommandons uniquement D'utiliser COLLATE pour le tri final d'un petit nombre de lignes, car le tri avec COLLATE est moins efficace que le tri normal par octets. + +Les lignes qui ont des valeurs identiques pour la liste des expressions de tri sont sorties dans un ordre arbitraire, qui peut également être non déterministe (différent à chaque fois). +Si la clause ORDER BY est omise, l'ordre des lignes est également indéfini et peut également être non déterministe. + +`NaN` et `NULL` ordre de tri: + +- Avec le modificateur `NULLS FIRST` — First `NULL`, puis `NaN` puis d'autres valeurs. +- Avec le modificateur `NULLS LAST` — First the values, then `NaN`, puis `NULL`. +- Default — The same as with the `NULLS LAST` modificateur. + +Exemple: + +Pour la table + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 2 │ +│ 1 │ nan │ +│ 2 │ 2 │ +│ 3 │ 4 │ +│ 5 │ 6 │ +│ 6 │ nan │ +│ 7 │ ᴺᵁᴸᴸ │ +│ 6 │ 7 │ +│ 8 │ 9 │ +└───┴──────┘ +``` + +Exécuter la requête `SELECT * FROM t_null_nan ORDER BY y NULLS FIRST` obtenir: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 7 │ ᴺᵁᴸᴸ │ +│ 1 │ nan │ +│ 6 │ nan │ +│ 2 │ 2 │ +│ 2 │ 2 │ +│ 3 │ 4 │ +│ 5 │ 6 │ +│ 6 │ 7 │ +│ 8 │ 9 │ +└───┴──────┘ +``` + +Lorsque les nombres à virgule flottante sont triés, les Nan sont séparés des autres valeurs. Quel que soit l'ordre de tri, NaNs viennent à la fin. En d'autres termes, pour le Tri ascendant, ils sont placés comme s'ils étaient plus grands que tous les autres nombres, tandis que pour le Tri descendant, ils sont placés comme s'ils étaient plus petits que les autres. + +Moins de RAM est utilisé si une limite assez petite est spécifiée en plus de ORDER BY. Sinon, la quantité de mémoire dépensée est proportionnelle au volume de données à trier. Pour le traitement des requêtes distribuées, si GROUP BY est omis, le tri est partiellement effectué sur des serveurs distants et les résultats sont fusionnés sur le serveur demandeur. Cela signifie que pour le tri distribué, le volume de données à trier peut être supérieur à la quantité de mémoire sur un seul serveur. + +S'il N'y a pas assez de RAM, il est possible d'effectuer un tri dans la mémoire externe (création de fichiers temporaires sur un disque). Utilisez le paramètre `max_bytes_before_external_sort` pour ce but. S'il est défini sur 0 (par défaut), le tri externe est désactivé. Si elle est activée, lorsque le volume de données à trier atteint le nombre spécifié d'octets, les données collectées sont triés et déposés dans un fichier temporaire. Une fois toutes les données lues, tous les fichiers triés sont fusionnés et les résultats sont générés. Les fichiers sont écrits dans le répertoire/var/lib / clickhouse / tmp / dans la configuration (par défaut, mais vous pouvez ‘tmp\_path’ paramètre pour modifier ce paramètre). + +L'exécution d'une requête peut utiliser plus de mémoire que ‘max\_bytes\_before\_external\_sort’. Pour cette raison, ce paramètre doit avoir une valeur significativement inférieure à ‘max\_memory\_usage’. Par exemple, si votre serveur dispose de 128 Go de RAM et que vous devez exécuter une seule requête, définissez ‘max\_memory\_usage’ à 100 Go, et ‘max\_bytes\_before\_external\_sort’ à 80 Go. + +Le tri externe fonctionne beaucoup moins efficacement que le tri dans la RAM. + +### Clause SELECT {#select-select} + +[Expression](syntax.md#syntax-expressions) spécifié dans le `SELECT` clause sont calculés après toutes les opérations dans les clauses décrites ci-dessus sont terminés. Ces expressions fonctionnent comme si elles s'appliquaient à des lignes séparées dans le résultat. Si les expressions dans le `SELECT` la clause contient des fonctions d'agrégation, puis clickhouse traite les fonctions d'agrégation et les expressions utilisées [GROUP BY](#select-group-by-clause) agrégation. + +Si vous souhaitez inclure toutes les colonnes dans le résultat, utilisez l'astérisque (`*`) symbole. Exemple, `SELECT * FROM ...`. + +Pour correspondre à certaines colonnes dans le résultat avec un [re2](https://en.wikipedia.org/wiki/RE2_(software)) expression régulière, vous pouvez utiliser le `COLUMNS` expression. + +``` sql +COLUMNS('regexp') +``` + +Par exemple, considérez le tableau: + +``` sql +CREATE TABLE default.col_names (aa Int8, ab Int8, bc Int8) ENGINE = TinyLog +``` + +La requête suivante sélectionne les données de toutes les colonnes contenant les `a` symbole dans leur nom. + +``` sql +SELECT COLUMNS('a') FROM col_names +``` + +``` text +┌─aa─┬─ab─┐ +│ 1 │ 1 │ +└────┴────┘ +``` + +Les colonnes sélectionnées sont retournés pas dans l'ordre alphabétique. + +Vous pouvez utiliser plusieurs `COLUMNS` expressions dans une requête et leur appliquer des fonctions. + +Exemple: + +``` sql +SELECT COLUMNS('a'), COLUMNS('c'), toTypeName(COLUMNS('c')) FROM col_names +``` + +``` text +┌─aa─┬─ab─┬─bc─┬─toTypeName(bc)─┐ +│ 1 │ 1 │ 1 │ Int8 │ +└────┴────┴────┴────────────────┘ +``` + +Chaque colonne renvoyée par le `COLUMNS` expression est passée à la fonction en tant qu'argument séparé. Vous pouvez également passer d'autres arguments à la fonction si elle les supporte. Soyez prudent lorsque vous utilisez des fonctions. Si une fonction ne prend pas en charge le nombre d'arguments que vous lui avez transmis, ClickHouse lève une exception. + +Exemple: + +``` sql +SELECT COLUMNS('a') + COLUMNS('c') FROM col_names +``` + +``` text +Received exception from server (version 19.14.1): +Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Number of arguments for function plus doesn't match: passed 3, should be 2. +``` + +Dans cet exemple, `COLUMNS('a')` retourne deux colonnes: `aa` et `ab`. `COLUMNS('c')` renvoie la `bc` colonne. Le `+` l'opérateur ne peut pas s'appliquer à 3 arguments, donc ClickHouse lève une exception avec le message pertinent. + +Colonnes qui correspondent à la `COLUMNS` l'expression peut avoir différents types de données. Si `COLUMNS` ne correspond à aucune colonne et est la seule expression dans `SELECT`, ClickHouse lance une exception. + +### La Clause DISTINCT {#select-distinct} + +Si DISTINCT est spécifié, une seule ligne restera hors de tous les ensembles de lignes entièrement correspondantes dans le résultat. +Le résultat sera le même que si GROUP BY était spécifié dans tous les champs spécifiés dans SELECT without aggregate functions. Mais il y a plusieurs différences de GROUP BY: + +- DISTINCT peut être appliqué avec GROUP BY. +- Lorsque ORDER BY est omis et que LIMIT est défini, la requête s'arrête immédiatement après la lecture du nombre requis de lignes différentes. +- Les blocs de données sont produits au fur et à mesure qu'ils sont traités, sans attendre que la requête entière se termine. + +DISTINCT n'est pas pris en charge si SELECT a au moins une colonne de tableau. + +`DISTINCT` fonctionne avec [NULL](syntax.md) comme si `NULL` ont une valeur spécifique, et `NULL=NULL`. En d'autres termes, dans le `DISTINCT` résultats, différentes combinaisons avec `NULL` qu'une seule fois. + +Clickhouse prend en charge l'utilisation du `DISTINCT` et `ORDER BY` clauses pour différentes colonnes dans une requête. Le `DISTINCT` la clause est exécutée avant la `ORDER BY` clause. + +Exemple de table: + +``` text +┌─a─┬─b─┐ +│ 2 │ 1 │ +│ 1 │ 2 │ +│ 3 │ 3 │ +│ 2 │ 4 │ +└───┴───┘ +``` + +Lors de la sélection de données avec le `SELECT DISTINCT a FROM t1 ORDER BY b ASC` requête, nous obtenons le résultat suivant: + +``` text +┌─a─┐ +│ 2 │ +│ 1 │ +│ 3 │ +└───┘ +``` + +Si nous changeons la direction de tri `SELECT DISTINCT a FROM t1 ORDER BY b DESC`, nous obtenons le résultat suivant: + +``` text +┌─a─┐ +│ 3 │ +│ 1 │ +│ 2 │ +└───┘ +``` + +Rangée `2, 4` a été coupé avant de les trier. + +Prenez en compte cette spécificité d'implémentation lors de la programmation des requêtes. + +### Clause LIMIT {#limit-clause} + +`LIMIT m` vous permet de sélectionner la première `m` lignes du résultat. + +`LIMIT n, m` vous permet de sélectionner la première `m` lignes du résultat après avoir sauté le premier `n` rangée. Le `LIMIT m OFFSET n` la syntaxe est également prise en charge. + +`n` et `m` doivent être des entiers non négatifs. + +Si il n'y a pas un `ORDER BY` clause qui trie explicitement les résultats, le résultat peut être arbitraire et non déterministe. + +### Clause UNION ALL {#union-all-clause} + +Vous pouvez utiliser UNION ALL pour combiner n'importe quel nombre de requêtes. Exemple: + +``` sql +SELECT CounterID, 1 AS table, toInt64(count()) AS c + FROM test.hits + GROUP BY CounterID + +UNION ALL + +SELECT CounterID, 2 AS table, sum(Sign) AS c + FROM test.visits + GROUP BY CounterID + HAVING c > 0 +``` + +Seule UNION ALL est prise en charge. L'UNION régulière (Union distincte) n'est pas prise en charge. Si vous avez besoin D'UNION DISTINCT, vous pouvez écrire SELECT DISTINCT à partir d'une sous-requête contenant UNION ALL. + +Les requêtes qui font partie de L'UNION peuvent toutes être exécutées simultanément et leurs résultats peuvent être mélangés. + +La structure des résultats (le nombre et le type de colonnes) doit correspondre aux requêtes. Mais les noms des colonnes peuvent différer. Dans ce cas, les noms de colonne pour le résultat final seront tirés de la première requête. La coulée de Type est effectuée pour les syndicats. Par exemple, si deux requêtes combinées ont le même champ avec non-`Nullable` et `Nullable` types d'un type compatible, la `UNION ALL` a un `Nullable` type de champ. + +Les requêtes qui font partie de UNION ALL ne peuvent pas être placées entre crochets. ORDER BY et LIMIT sont appliqués à des requêtes distinctes, pas au résultat final. Si vous devez appliquer une conversion au résultat final, vous pouvez placer toutes les requêtes avec UNION ALL dans une sous-requête de la clause FROM. + +### Dans OUTFILE Clause {#into-outfile-clause} + +Ajouter l' `INTO OUTFILE filename` clause (où filename est un littéral de chaîne) pour rediriger la sortie de la requête vers le fichier spécifié. +Contrairement à MySQL, le fichier est créé du côté client. La requête échouera si un fichier portant le même nom existe déjà. +Cette fonctionnalité est disponible dans le client de ligne de commande et clickhouse-local (une requête envoyée via L'interface HTTP échouera). + +Le format de sortie par défaut est TabSeparated (le même que dans le mode batch client de ligne de commande). + +### FORMAT de la Clause {#format-clause} + +Spécifier ‘FORMAT format’ pour obtenir des données dans n'importe quel format spécifié. +Vous pouvez l'utiliser pour plus de commodité, ou pour créer des vidages. +Pour plus d'informations, consultez la section “Formats”. +Si la clause FORMAT est omise, le format par défaut est utilisé, ce qui dépend à la fois des paramètres et de l'interface utilisée pour accéder à la base de données. Pour L'interface HTTP et le client de ligne de commande en mode batch, le format par défaut est TabSeparated. Pour le client de ligne de commande en mode interactif, le format par défaut est PrettyCompact (il a des tables attrayantes et compactes). + +Lors de l'utilisation du client de ligne de commande, les données sont transmises au client dans un format efficace interne. Le client interprète indépendamment la clause de FORMAT de la requête et formate les données elles-mêmes (soulageant ainsi le réseau et le serveur de la charge). + +### Dans les opérateurs {#select-in-operators} + +Le `IN`, `NOT IN`, `GLOBAL IN`, et `GLOBAL NOT IN` les opérateurs sont traitées séparément, car leur fonctionnalité est assez riche. + +Le côté gauche de l'opérateur, soit une seule colonne ou un tuple. + +Exemple: + +``` sql +SELECT UserID IN (123, 456) FROM ... +SELECT (CounterID, UserID) IN ((34, 123), (101500, 456)) FROM ... +``` + +Si le côté gauche est une colonne unique qui est dans l'index, et le côté droit est un ensemble de constantes, le système utilise l'index pour le traitement de la requête. + +Don't list too many values explicitly (i.e. millions). If a data set is large, put it in a temporary table (for example, see the section “External data for query processing”), puis utiliser une sous-requête. + +Le côté droit de l'opérateur peut être un ensemble d'expressions constantes, un ensemble de tuples avec des expressions constantes (illustrées dans les exemples ci-dessus), ou le nom d'une table de base de données ou une sous-requête SELECT entre parenthèses. + +Si le côté droit de l'opérateur est le nom d'une table (par exemple, `UserID IN users`), ceci est équivalent à la sous-requête `UserID IN (SELECT * FROM users)`. Utilisez ceci lorsque vous travaillez avec des données externes envoyées avec la requête. Par exemple, la requête peut être envoyée avec un ensemble d'ID utilisateur chargés dans le ‘users’ table temporaire, qui doit être filtrée. + +Si le côté droit de l'opérateur est un nom de table qui a le moteur Set (un ensemble de données préparé qui est toujours en RAM), l'ensemble de données ne sera pas créé à nouveau pour chaque requête. + +La sous-requête peut spécifier plusieurs colonnes pour filtrer les tuples. +Exemple: + +``` sql +SELECT (CounterID, UserID) IN (SELECT CounterID, UserID FROM ...) FROM ... +``` + +Les colonnes à gauche et à droite de l'opérateur doit avoir le même type. + +L'opérateur IN et la sous-requête peuvent se produire dans n'importe quelle partie de la requête, y compris dans les fonctions d'agrégation et les fonctions lambda. +Exemple: + +``` sql +SELECT + EventDate, + avg(UserID IN + ( + SELECT UserID + FROM test.hits + WHERE EventDate = toDate('2014-03-17') + )) AS ratio +FROM test.hits +GROUP BY EventDate +ORDER BY EventDate ASC +``` + +``` text +┌──EventDate─┬────ratio─┐ +│ 2014-03-17 │ 1 │ +│ 2014-03-18 │ 0.807696 │ +│ 2014-03-19 │ 0.755406 │ +│ 2014-03-20 │ 0.723218 │ +│ 2014-03-21 │ 0.697021 │ +│ 2014-03-22 │ 0.647851 │ +│ 2014-03-23 │ 0.648416 │ +└────────────┴──────────┘ +``` + +Pour chaque jour après le 17 mars, comptez le pourcentage de pages vues par les utilisateurs qui ont visité le site le 17 mars. +Une sous-requête dans la clause est toujours exécuter une seule fois sur un seul serveur. Il n'y a pas de sous-requêtes dépendantes. + +#### Le traitement NULL {#null-processing-1} + +Pendant le traitement de la demande, l'opérateur n'assume que le résultat d'une opération avec [NULL](syntax.md) est toujours égale à `0` indépendamment de savoir si `NULL` est sur le côté droit ou gauche de l'opérateur. `NULL` les valeurs ne sont incluses dans aucun jeu de données, ne correspondent pas entre elles et ne peuvent pas être comparées. + +Voici un exemple avec le `t_null` table: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +L'exécution de la requête `SELECT x FROM t_null WHERE y IN (NULL,3)` vous donne le résultat suivant: + +``` text +┌─x─┐ +│ 2 │ +└───┘ +``` + +Vous pouvez voir que la ligne dans laquelle `y = NULL` est jeté hors de résultats de la requête. C'est parce que ClickHouse ne peut pas décider si `NULL` est inclus dans le `(NULL,3)` ensemble, les retours `0` comme le résultat de l'opération, et `SELECT` exclut cette ligne de la sortie finale. + +``` sql +SELECT y IN (NULL, 3) +FROM t_null +``` + +``` text +┌─in(y, tuple(NULL, 3))─┐ +│ 0 │ +│ 1 │ +└───────────────────────┘ +``` + +#### Sous-Requêtes Distribuées {#select-distributed-subqueries} + +Il y a deux options pour IN-S avec des sous-requêtes (similaires aux jointures): normal `IN` / `JOIN` et `GLOBAL IN` / `GLOBAL JOIN`. Ils diffèrent dans la façon dont ils sont exécutés pour le traitement des requêtes distribuées. + +!!! attention "Attention" + Rappelez-vous que les algorithmes décrits ci-dessous peuvent travailler différemment en fonction de la [paramètre](../operations/settings/settings.md) `distributed_product_mode` paramètre. + +Lors de l'utilisation de l'IN régulier, la requête est envoyée à des serveurs distants, et chacun d'eux exécute les sous-requêtes dans le `IN` ou `JOIN` clause. + +Lors de l'utilisation de `GLOBAL IN` / `GLOBAL JOINs`, d'abord toutes les sous-requêtes sont exécutées pour `GLOBAL IN` / `GLOBAL JOINs`, et les résultats sont recueillis dans des tableaux temporaires. Ensuite, les tables temporaires sont envoyés à chaque serveur distant, où les requêtes sont exécutées à l'aide temporaire de données. + +Pour une requête non distribuée, utilisez `IN` / `JOIN`. + +Soyez prudent lorsque vous utilisez des sous-requêtes dans le `IN` / `JOIN` clauses pour le traitement des requêtes distribuées. + +Regardons quelques exemples. Supposons que chaque serveur du cluster a un **local\_table**. Chaque serveur dispose également d'une **table distributed\_table** table avec le **Distribué** type, qui regarde tous les serveurs du cluster. + +Pour une requête à l' **table distributed\_table**, la requête sera envoyée à tous les serveurs distants et exécutée sur eux en utilisant le **local\_table**. + +Par exemple, la requête + +``` sql +SELECT uniq(UserID) FROM distributed_table +``` + +sera envoyé à tous les serveurs distants + +``` sql +SELECT uniq(UserID) FROM local_table +``` + +et l'exécuter sur chacun d'eux en parallèle, jusqu'à ce qu'il atteigne le stade où les résultats intermédiaires peuvent être combinés. Ensuite, les résultats intermédiaires seront retournés au demandeur de serveur et de fusion, et le résultat final sera envoyé au client. + +Examinons maintenant une requête avec IN: + +``` sql +SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34) +``` + +- Calcul de l'intersection des audiences de deux sites. + +Cette requête sera envoyée à tous les serveurs distants + +``` sql +SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34) +``` + +En d'autres termes, l'ensemble de données de la clause IN sera collecté sur chaque serveur indépendamment, uniquement à travers les données stockées localement sur chacun des serveurs. + +Cela fonctionnera correctement et de manière optimale si vous êtes prêt pour ce cas et que vous avez réparti les données entre les serveurs de cluster de telle sorte que les données d'un seul ID utilisateur résident entièrement sur un seul serveur. Dans ce cas, toutes les données nécessaires seront disponibles localement sur chaque serveur. Sinon, le résultat sera erroné. Nous nous référons à cette variation de la requête que “local IN”. + +Pour corriger le fonctionnement de la requête lorsque les données sont réparties aléatoirement sur les serveurs de cluster, vous pouvez spécifier **table distributed\_table** à l'intérieur d'une sous-requête. La requête ressemblerait à ceci: + +``` sql +SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID = 34) +``` + +Cette requête sera envoyée à tous les serveurs distants + +``` sql +SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID = 34) +``` + +La sous-requête commencera à s'exécuter sur chaque serveur distant. Étant donné que la sous-requête utilise une table distribuée, la sous-requête qui se trouve sur chaque serveur distant sera renvoyée à chaque serveur distant comme + +``` sql +SELECT UserID FROM local_table WHERE CounterID = 34 +``` + +Par exemple, si vous avez un cluster de 100 SERVEURS, l'exécution de la requête entière nécessitera 10 000 requêtes élémentaires, ce qui est généralement considéré comme inacceptable. + +Dans de tels cas, vous devez toujours utiliser GLOBAL IN au lieu de IN. Voyons comment cela fonctionne pour la requête + +``` sql +SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID GLOBAL IN (SELECT UserID FROM distributed_table WHERE CounterID = 34) +``` + +Le serveur demandeur exécutera la sous requête + +``` sql +SELECT UserID FROM distributed_table WHERE CounterID = 34 +``` + +et le résultat sera mis dans une table temporaire en RAM. Ensuite, la demande sera envoyée à chaque serveur distant + +``` sql +SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID GLOBAL IN _data1 +``` + +et la table temporaire `_data1` sera envoyé à chaque serveur distant avec la requête (le nom de la table temporaire est défini par l'implémentation). + +Ceci est plus optimal que d'utiliser la normale dans. Cependant, gardez les points suivants à l'esprit: + +1. Lors de la création d'une table temporaire, les données ne sont pas uniques. Pour réduire le volume de données transmises sur le réseau, spécifiez DISTINCT dans la sous-requête. (Vous n'avez pas besoin de le faire pour un IN normal.) +2. La table temporaire sera envoyé à tous les serveurs distants. La Transmission ne tient pas compte de la topologie du réseau. Par exemple, si 10 serveurs distants résident dans un centre de données très distant par rapport au serveur demandeur, les données seront envoyées 10 fois sur le canal au centre de données distant. Essayez d'éviter les grands ensembles de données lorsque vous utilisez GLOBAL IN. +3. Lors de la transmission de données à des serveurs distants, les restrictions sur la bande passante réseau ne sont pas configurables. Vous pourriez surcharger le réseau. +4. Essayez de distribuer les données entre les serveurs afin que vous n'ayez pas besoin D'utiliser GLOBAL IN sur une base régulière. +5. Si vous devez utiliser GLOBAL in souvent, planifiez l'emplacement du cluster ClickHouse de sorte qu'un seul groupe de répliques ne réside pas dans plus d'un centre de données avec un réseau rapide entre eux, de sorte qu'une requête puisse être traitée entièrement dans un seul centre de données. + +Il est également judicieux de spécifier une table locale dans le `GLOBAL IN` clause, dans le cas où cette table locale est uniquement disponible sur le serveur demandeur et que vous souhaitez utiliser les données de celui-ci sur des serveurs distants. + +### Les Valeurs Extrêmes {#extreme-values} + +En plus des résultats, vous pouvez également obtenir des valeurs minimales et maximales pour les colonnes de résultats. Pour ce faire, définissez la **extrême** réglage sur 1. Les Minimums et les maximums sont calculés pour les types numériques, les dates et les dates avec des heures. Pour les autres colonnes, les valeurs par défaut sont sorties. + +An extra two rows are calculated – the minimums and maximums, respectively. These extra two rows are output in `JSON*`, `TabSeparated*`, et `Pretty*` [format](../interfaces/formats.md), séparés des autres lignes. Ils ne sont pas Produits pour d'autres formats. + +Dans `JSON*` formats, les valeurs extrêmes sont sorties dans un ‘extremes’ champ. Dans `TabSeparated*` formats, la ligne vient après le résultat principal, et après ‘totals’ si elle est présente. Elle est précédée par une ligne vide (après les autres données). Dans `Pretty*` formats, la ligne est sortie comme une table séparée après le résultat principal, et après `totals` si elle est présente. + +Les valeurs extrêmes sont calculées pour les lignes avant `LIMIT` mais après `LIMIT BY`. Cependant, lors de l'utilisation de `LIMIT offset, size`, les lignes avant de les `offset` sont inclus dans `extremes`. Dans les requêtes de flux, le résultat peut également inclure un petit nombre de lignes qui ont traversé `LIMIT`. + +### Note {#notes} + +Le `GROUP BY` et `ORDER BY` les clauses ne supportent pas les arguments positionnels. Cela contredit MySQL, mais est conforme à SQL standard. +Exemple, `GROUP BY 1, 2` will be interpreted as grouping by constants (i.e. aggregation of all rows into one). + +Vous pouvez utiliser des synonymes (`AS` alias) dans n'importe quelle partie d'une requête. + +Vous pouvez mettre un astérisque dans quelque partie de la requête au lieu d'une expression. Lorsque la requête est analysée, l'astérisque est étendu à une liste de toutes les colonnes `MATERIALIZED` et `ALIAS` colonne). Il n'y a que quelques cas où l'utilisation d'un astérisque est justifiée: + +- Lors de la création d'un vidage de table. +- Pour les tables contenant seulement quelques colonnes, comme les tables système. +- Pour obtenir des informations sur ce que sont les colonnes dans une table. Dans ce cas, la valeur `LIMIT 1`. Mais il est préférable d'utiliser la `DESC TABLE` requête. +- Quand il y a une forte filtration sur un petit nombre de colonnes en utilisant `PREWHERE`. +- Dans les sous-requêtes (puisque les colonnes qui ne sont pas nécessaires pour la requête externe sont exclues des sous-requêtes). + +Dans tous les autres cas, nous ne recommandons pas d'utiliser l'astérisque, car il ne vous donne que les inconvénients d'un SGBD colonnaire au lieu des avantages. En d'autres termes, l'utilisation de l'astérisque n'est pas recommandée. + +[Article Original](https://clickhouse.tech/docs/en/query_language/select/) diff --git a/docs/fr/query_language/show.md b/docs/fr/query_language/show.md new file mode 100644 index 00000000000..1125dec2b53 --- /dev/null +++ b/docs/fr/query_language/show.md @@ -0,0 +1,102 @@ +--- +machine_translated: true +--- + +# Afficher les requêtes {#show-queries} + +## SHOW CREATE TABLE {#show-create-table} + +``` sql +SHOW CREATE [TEMPORARY] [TABLE|DICTIONARY] [db.]table [INTO OUTFILE filename] [FORMAT format] +``` + +Renvoie un seul `String`-type ‘statement’ column, which contains a single value – the `CREATE` requête utilisée pour créer l'objet spécifié. + +## SHOW DATABASES {#show-databases} + +``` sql +SHOW DATABASES [INTO OUTFILE filename] [FORMAT format] +``` + +Imprime une liste de toutes les bases de données. +Cette requête est identique à `SELECT name FROM system.databases [INTO OUTFILE filename] [FORMAT format]`. + +## SHOW PROCESSLIST {#show-processlist} + +``` sql +SHOW PROCESSLIST [INTO OUTFILE filename] [FORMAT format] +``` + +Sorties le contenu de la [système.processus](../operations/system_tables.md#system_tables-processes) table, qui contient une liste de requêtes en cours de traitement en ce moment, à l'exception `SHOW PROCESSLIST` requête. + +Le `SELECT * FROM system.processes` requête renvoie des données sur toutes les requêtes en cours. + +Astuce (exécuter dans la console): + +``` bash +$ watch -n1 "clickhouse-client --query='SHOW PROCESSLIST'" +``` + +## SHOW TABLES {#show-tables} + +Affiche une liste de tableaux. + +``` sql +SHOW [TEMPORARY] TABLES [{FROM | IN} ] [LIKE '' | WHERE expr] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +Si l' `FROM` la clause n'est pas spécifié, la requête renvoie la liste des tables de la base de données actuelle. + +Vous pouvez obtenir les mêmes résultats que l' `SHOW TABLES` requête de la façon suivante: + +``` sql +SELECT name FROM system.tables WHERE database = [AND name LIKE ] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +**Exemple** + +La requête suivante sélectionne les deux premières lignes de la liste des tables `system` base de données, dont les noms contiennent `co`. + +``` sql +SHOW TABLES FROM system LIKE '%co%' LIMIT 2 +``` + +``` text +┌─name───────────────────────────┐ +│ aggregate_function_combinators │ +│ collations │ +└────────────────────────────────┘ +``` + +## SHOW DICTIONARIES {#show-dictionaries} + +Affiche une liste de [dictionnaires externes](dicts/external_dicts.md). + +``` sql +SHOW DICTIONARIES [FROM ] [LIKE ''] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +Si l' `FROM` la clause n'est pas spécifié, la requête retourne la liste des dictionnaires de la base de données actuelle. + +Vous pouvez obtenir les mêmes résultats que l' `SHOW DICTIONARIES` requête de la façon suivante: + +``` sql +SELECT name FROM system.dictionaries WHERE database = [AND name LIKE ] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +**Exemple** + +La requête suivante sélectionne les deux premières lignes de la liste des tables `system` base de données, dont les noms contiennent `reg`. + +``` sql +SHOW DICTIONARIES FROM db LIKE '%reg%' LIMIT 2 +``` + +``` text +┌─name─────────┐ +│ regions │ +│ region_names │ +└──────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/show/) diff --git a/docs/fr/query_language/syntax.md b/docs/fr/query_language/syntax.md new file mode 100644 index 00000000000..416775e6e29 --- /dev/null +++ b/docs/fr/query_language/syntax.md @@ -0,0 +1,184 @@ +--- +machine_translated: true +--- + +# Syntaxe {#syntax} + +Il existe deux types d'analyseurs dans le système: L'analyseur SQL complet (un analyseur de descente récursif) et l'analyseur de format de données (un analyseur de flux rapide). +Dans tous les cas à l'exception de la `INSERT` requête, seul L'analyseur SQL complet est utilisé. +Le `INSERT` requête utilise les deux analyseurs: + +``` sql +INSERT INTO t VALUES (1, 'Hello, world'), (2, 'abc'), (3, 'def') +``` + +Le `INSERT INTO t VALUES` fragment est analysé par l'analyseur complet, et les données `(1, 'Hello, world'), (2, 'abc'), (3, 'def')` est analysé par l'analyseur de flux rapide. Vous pouvez également activer l'analyseur complet pour les données à l'aide de la [input\_format\_values\_interpret\_expressions](../operations/settings/settings.md#settings-input_format_values_interpret_expressions) paramètre. Lorsque `input_format_values_interpret_expressions = 1`, ClickHouse essaie d'abord d'analyser les valeurs avec l'analyseur de flux rapide. S'il échoue, ClickHouse essaie d'utiliser l'analyseur complet pour les données, en le traitant comme un SQL [expression](#syntax-expressions). + +Les données peuvent avoir n'importe quel format. Lorsqu'une requête est reçue, le serveur calcule pas plus que [max\_query\_size](../operations/settings/settings.md#settings-max_query_size) octets de la requête en RAM (par défaut, 1 Mo), et le reste est analysé en flux. +Cela signifie que le système n'a pas de problèmes avec de grandes `INSERT` requêtes, comme le fait MySQL. + +Lors de l'utilisation de la `Values` format dans un `INSERT` de la requête, il peut sembler que les données sont analysées de même que les expressions dans un `SELECT` requête, mais ce n'est pas vrai. Le `Values` le format est beaucoup plus limitée. + +Ensuite, nous allons couvrir l'analyseur complet. Pour plus d'informations sur les analyseurs de format, consultez [Format](../interfaces/formats.md) section. + +## Espace {#spaces} + +Il peut y avoir n'importe quel nombre de symboles d'espace entre les constructions syntaxiques (y compris le début et la fin d'une requête). Les symboles d'espace incluent l'espace, l'onglet, le saut de ligne, Le CR et le flux de formulaire. + +## Commentaire {#comments} + +Les commentaires de style SQL et C sont pris en charge. +Commentaires de style SQL: de `--` à la fin de la ligne. L'espace après `--` peut être omis. +Commentaires dans C-style: de `/*` de `*/`. Ces commentaires peuvent être multilignes. Les espaces ne sont pas requis ici non plus. + +## Mot {#syntax-keywords} + +Les mots clés sont insensibles à la casse lorsqu'ils correspondent à: + +- La norme SQL. Exemple, `SELECT`, `select` et `SeLeCt` sont toutes valides. +- Implémentation dans certains SGBD populaires (MySQL ou Postgres). Exemple, `DateTime` est la même que `datetime`. + +Si le nom du type de données est sensible à la casse peut être vérifié `system.data_type_families` table. + +Contrairement à SQL standard, tous les autres mots clés (y compris les noms de fonctions) sont **sensible à la casse**. + +Mots-clés ne sont pas réservés (ils sont simplement considérés comme des mots-clés dans le contexte correspondant). Si vous utilisez [identificateur](#syntax-identifiers) de même que les mots clés, les placer entre guillemets. Par exemple, la requête `SELECT "FROM" FROM table_name` est valide si la table `table_name` a colonne avec le nom de `"FROM"`. + +## Identificateur {#syntax-identifiers} + +Les identificateurs sont: + +- Noms de Cluster, de base de données, de table, de partition et de colonne. +- Fonction. +- Types de données. +- [Expression des alias](#syntax-expression_aliases). + +Les identificateurs peuvent être cités ou non cités. Il est recommandé d'utiliser des identificateurs sans guillemets. + +Non identificateurs doivent correspondre à l'expression régulière `^[a-zA-Z_][0-9a-zA-Z_]*$` et ne peut pas être égale à [mot](#syntax-keywords). Exemple: `x, _1, X_y__Z123_.` + +Si vous souhaitez utiliser les identifiants de la même manière que les mots-clés ou si vous souhaitez utiliser d'autres symboles dans les identifiants, citez-le en utilisant des guillemets doubles ou des backticks, par exemple, `"id"`, `` `id` ``. + +## Littéral {#literals} + +Il y a: Numérique, chaîne, composé et `NULL` littéral. + +### Numérique {#numeric} + +Un littéral numérique tente d'être analysé: + +- D'abord comme un nombre signé 64 bits, en utilisant le [strtoull](https://en.cppreference.com/w/cpp/string/byte/strtoul) fonction. +- En cas d'échec, en tant que nombre non signé 64 bits, [strtoll](https://en.cppreference.com/w/cpp/string/byte/strtol) fonction. +- En cas d'échec, en tant que nombre à virgule flottante [strtod](https://en.cppreference.com/w/cpp/string/byte/strtof) fonction. +- Sinon, une erreur est renvoyée. + +La valeur correspondante aura le plus petit type dans lequel la valeur correspond. +Par exemple, 1 est analysé comme `UInt8`, mais 256 est analysé comme `UInt16`. Pour plus d'informations, voir [Types de données](../data_types/index.md). + +Exemple: `1`, `18446744073709551615`, `0xDEADBEEF`, `01`, `0.1`, `1e100`, `-1e-100`, `inf`, `nan`. + +### Chaîne {#syntax-string-literal} + +Seuls les littéraux de chaîne entre guillemets simples sont pris en charge. Le clos de caractères barre oblique inverse échappé. Les séquences d'échappement suivantes ont une valeur spéciale correspondante: `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\a`, `\v`, `\xHH`. Dans tous les autres cas, des séquences d'échappement au format `\c`, où `c` est un caractère, sont convertis à `c`. Cela signifie que vous pouvez utiliser les séquences `\'`et`\\`. La valeur aurez l' [Chaîne](../data_types/string.md) type. + +L'ensemble minimum de caractères que vous devez échapper dans les littéraux de chaîne: `'` et `\`. Apostrophe peut être échappé avec l'apostrophe, les littéraux `'It\'s'` et `'It''s'` sont égaux. + +### Composé {#compound} + +Les Constructions sont prises en charge pour les tableaux: `[1, 2, 3]` et les tuples: `(1, 'Hello, world!', 2)`.. +En fait, ce ne sont pas des littéraux, mais des expressions avec l'opérateur de création de tableau et l'opérateur de création de tuple, respectivement. +Un tableau doit être composé d'au moins un élément, et un tuple doit avoir au moins deux éléments. +Les Tuples ont un but spécial pour l'usage dans le `IN` clause de a `SELECT` requête. Les Tuples peuvent être obtenus à la suite d'une requête, mais ils ne peuvent pas être enregistrées dans une base de données (à l'exception de [Mémoire](../operations/table_engines/memory.md) table). + +### NULL {#null-literal} + +Indique que la valeur est manquante. + +Afin de stocker `NULL` dans un champ de table, il doit être de la [Nullable](../data_types/nullable.md) type. + +Selon le format de données (entrée ou sortie), `NULL` peut avoir une représentation différente. Pour plus d'informations, consultez la documentation de [formats de données](../interfaces/formats.md#formats). + +Il y a beaucoup de nuances au traitement `NULL`. Par exemple, si au moins l'un des arguments d'une opération de comparaison est `NULL` le résultat de cette opération sera également `NULL`. Il en va de même pour la multiplication, l'addition et d'autres opérations. Pour plus d'informations, lisez la documentation pour chaque opération. + +Dans les requêtes, vous pouvez vérifier `NULL` à l'aide de la [IS NULL](operators.md#operator-is-null) et [IS NOT NULL](operators.md) opérateurs et les fonctions connexes `isNull` et `isNotNull`. + +## Fonction {#functions} + +Les fonctions sont écrites comme un identifiant avec une liste d'arguments (éventuellement vide) entre parenthèses. Contrairement au SQL standard, les crochets sont requis, même pour une liste d'arguments vide. Exemple: `now()`. +Il existe des fonctions régulières et agrégées (voir la section “Aggregate functions”). Certaines fonctions d'agrégat peut contenir deux listes d'arguments entre parenthèses. Exemple: `quantile (0.9) (x)`. Ces fonctions d'agrégation sont appelés “parametric” fonctions, et les arguments dans la première liste sont appelés “parameters”. La syntaxe des fonctions d'agrégation sans paramètres est la même que pour les fonctions régulières. + +## Opérateur {#operators} + +Les opérateurs sont convertis en leurs fonctions correspondantes lors de l'analyse des requêtes, en tenant compte de leur priorité et de leur associativité. +Par exemple, l'expression `1 + 2 * 3 + 4` est transformé à `plus(plus(1, multiply(2, 3)), 4)`. + +## Types de données et moteurs de Table de base de données {#data_types-and-database-table-engines} + +Types de données et moteurs de table dans `CREATE` les requêtes sont écrites de la même manière que les identifiants ou les fonctions. En d'autres termes, ils peuvent ou non contenir une liste d'arguments entre parenthèses. Pour plus d'informations, voir les sections “Data types,” “Table engines,” et “CREATE”. + +## Expression Des Alias {#syntax-expression_aliases} + +Un alias est un nom défini par l'utilisateur pour une expression dans une requête. + +``` sql +expr AS alias +``` + +- `AS` — The keyword for defining aliases. You can define the alias for a table name or a column name in a `SELECT` clause sans utiliser le `AS` mot. + + For example, `SELECT table_name_alias.column_name FROM table_name table_name_alias`. + + In the [CAST](functions/type_conversion_functions.md#type_conversion_function-cast) function, the `AS` keyword has another meaning. See the description of the function. + +- `expr` — Any expression supported by ClickHouse. + + For example, `SELECT column_name * 2 AS double FROM some_table`. + +- `alias` — Name for `expr`. Les alias doivent être conformes à la [identificateur](#syntax-identifiers) syntaxe. + + For example, `SELECT "table t".column_name FROM table_name AS "table t"`. + +### Notes sur l'Utilisation de la {#notes-on-usage} + +Les alias sont globaux pour une requête ou d'une sous-requête et vous pouvez définir un alias dans n'importe quelle partie d'une requête de toute expression. Exemple, `SELECT (1 AS n) + 2, n`. + +Les alias ne sont pas visibles dans les sous-requêtes et entre les sous-requêtes. Par exemple, lors de l'exécution de la requête `SELECT (SELECT sum(b.a) + num FROM b) - a.a AS num FROM a` Clickhouse génère l'exception `Unknown identifier: num`. + +Si un alias est défini pour les colonnes de `SELECT` la clause d'une sous-requête, ces colonnes sont visibles dans la requête externe. Exemple, `SELECT n + m FROM (SELECT 1 AS n, 2 AS m)`. + +Soyez prudent avec les Alias qui sont les mêmes que les noms de colonnes ou de tables. Considérons l'exemple suivant: + +``` sql +CREATE TABLE t +( + a Int, + b Int +) +ENGINE = TinyLog() +``` + +``` sql +SELECT + argMax(a, b), + sum(b) AS b +FROM t +``` + +``` text +Received exception from server (version 18.14.17): +Code: 184. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Aggregate function sum(b) is found inside another aggregate function in query. +``` + +Dans cet exemple, nous avons déclaré table `t` avec la colonne `b`. Ensuite, lors de la sélection des données, nous avons défini le `sum(b) AS b` alias. Comme les alias sont globaux, ClickHouse a substitué le littéral `b` dans l'expression `argMax(a, b)` avec l'expression `sum(b)`. Cette substitution a provoqué l'exception. + +## Astérisque {#asterisk} + +Dans un `SELECT` requête, un astérisque peut remplacer l'expression. Pour plus d'informations, consultez la section “SELECT”. + +## Expression {#syntax-expressions} + +Une expression est une fonction, un identifiant, un littéral, une application d'un opérateur, une expression entre parenthèses, une sous-requête ou un astérisque. Il peut également contenir un alias. +Une liste des expressions est une ou plusieurs expressions séparées par des virgules. +Les fonctions et les opérateurs, à leur tour, peuvent avoir des expressions comme arguments. + +[Article Original](https://clickhouse.tech/docs/en/query_language/syntax/) diff --git a/docs/fr/query_language/system.md b/docs/fr/query_language/system.md new file mode 100644 index 00000000000..621287fb13f --- /dev/null +++ b/docs/fr/query_language/system.md @@ -0,0 +1,110 @@ +--- +machine_translated: true +--- + +# SYSTÈME de Requêtes {#query-language-system} + +- [RELOAD DICTIONARIES](#query_language-system-reload-dictionaries) +- [RELOAD DICTIONARY](#query_language-system-reload-dictionary) +- [DROP DNS CACHE](#query_language-system-drop-dns-cache) +- [DROP MARK CACHE](#query_language-system-drop-mark-cache) +- [FLUSH LOGS](#query_language-system-flush_logs) +- [RELOAD CONFIG](#query_language-system-reload-config) +- [SHUTDOWN](#query_language-system-shutdown) +- [KILL](#query_language-system-kill) +- [STOP DISTRIBUTED SENDS](#query_language-system-stop-distributed-sends) +- [FLUSH DISTRIBUTED](#query_language-system-flush-distributed) +- [START DISTRIBUTED SENDS](#query_language-system-start-distributed-sends) +- [STOP MERGES](#query_language-system-stop-merges) +- [START MERGES](#query_language-system-start-merges) + +## RELOAD DICTIONARIES {#query_language-system-reload-dictionaries} + +Recharge tous les dictionnaires qui ont déjà été chargés avec succès. +Par défaut, les dictionnaires sont chargés paresseusement (voir [dictionaries\_lazy\_load](../operations/server_settings/settings.md#server_settings-dictionaries_lazy_load)), donc au lieu d'être chargés automatiquement au démarrage, ils sont initialisés lors du premier accès via la fonction dictGet ou sélectionnez dans les tables avec ENGINE = Dictionary . Le `SYSTEM RELOAD DICTIONARIES` query recharge ces dictionnaires (chargés). +Retourne toujours `Ok.` quel que soit le résultat de la mise à jour du dictionnaire. + +## Recharger le dictionnaire dictionary\_name {#query_language-system-reload-dictionary} + +Recharge complètement un dictionnaire `dictionary_name`, quel que soit l'état du dictionnaire (LOADED / NOT\_LOADED / FAILED). +Retourne toujours `Ok.` quel que soit le résultat de la mise à jour du dictionnaire. +L'état du dictionnaire peut être vérifié en interrogeant le `system.dictionaries` table. + +``` sql +SELECT name, status FROM system.dictionaries; +``` + +## DROP DNS CACHE {#query_language-system-drop-dns-cache} + +Réinitialise le cache DNS interne de ClickHouse. Parfois (pour les anciennes versions de ClickHouse), il est nécessaire d'utiliser cette commande lors de la modification de l'infrastructure (modification de l'adresse IP d'un autre serveur ClickHouse ou du serveur utilisé par les dictionnaires). + +Pour une gestion du cache plus pratique (automatique), voir paramètres disable\_internal\_dns\_cache, dns\_cache\_update\_period. + +## DROP MARK CACHE {#query_language-system-drop-mark-cache} + +Réinitialise le cache de marque. Utilisé dans le développement de ClickHouse et des tests de performance. + +## FLUSH LOGS {#query_language-system-flush_logs} + +Flushes buffers of log messages to system tables (e.g. system.query\_log). Allows you to not wait 7.5 seconds when debugging. + +## RELOAD CONFIG {#query_language-system-reload-config} + +Recharge la configuration de ClickHouse. Utilisé lorsque la configuration est stockée dans ZooKeeeper. + +## SHUTDOWN {#query_language-system-shutdown} + +Normalement ferme ClickHouse (comme `service clickhouse-server stop` / `kill {$pid_clickhouse-server}`) + +## KILL {#query_language-system-kill} + +Annule le processus de ClickHouse (comme `kill -9 {$ pid_clickhouse-server}`) + +## Gestion Des Tables Distribuées {#query-language-system-distributed} + +ClickHouse peut gérer [distribué](../operations/table_engines/distributed.md) table. Lorsqu'un utilisateur insère des données dans ces tables, ClickHouse crée d'abord une file d'attente des données qui doivent être envoyées aux nœuds de cluster, puis l'envoie de manière asynchrone. Vous pouvez gérer le traitement des files d'attente avec [STOP DISTRIBUTED SENDS](#query_language-system-stop-distributed-sends), [FLUSH DISTRIBUTED](#query_language-system-flush-distributed), et [START DISTRIBUTED SENDS](#query_language-system-start-distributed-sends) requête. Vous pouvez également insérer de manière synchrone des données distribuées avec `insert_distributed_sync` paramètre. + +### STOP DISTRIBUTED SENDS {#query_language-system-stop-distributed-sends} + +Désactive la distribution de données en arrière-plan lors de l'insertion de données dans des tables distribuées. + +``` sql +SYSTEM STOP DISTRIBUTED SENDS [db.] +``` + +### FLUSH DISTRIBUTED {#query_language-system-flush-distributed} + +Force ClickHouse à envoyer des données aux nœuds de cluster de manière synchrone. Si des nœuds ne sont pas disponibles, ClickHouse lève une exception et arrête l'exécution de la requête. Vous pouvez réessayer la requête jusqu'à ce qu'elle réussisse, ce qui se produira lorsque tous les nœuds seront de nouveau en ligne. + +``` sql +SYSTEM FLUSH DISTRIBUTED [db.] +``` + +### START DISTRIBUTED SENDS {#query_language-system-start-distributed-sends} + +Active la distribution de données en arrière-plan lors de l'insertion de données dans des tables distribuées. + +``` sql +SYSTEM START DISTRIBUTED SENDS [db.] +``` + +### STOP MERGES {#query_language-system-stop-merges} + +Offre la possibilité d'arrêter les fusions d'arrière-plan pour les tables de la famille MergeTree: + +``` sql +SYSTEM STOP MERGES [[db.]merge_tree_family_table_name] +``` + +!!! note "Note" + `DETACH / ATTACH` table va commencer les fusions d'arrière-plan pour la table même dans le cas où les fusions ont été arrêtées pour toutes les tables MergeTree auparavant. + +### START MERGES {#query_language-system-start-merges} + +Offre la possibilité de démarrer des fusions en arrière-plan pour les tables de la famille MergeTree: + +``` sql +SYSTEM START MERGES [[db.]merge_tree_family_table_name] +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/system/) diff --git a/docs/fr/query_language/table_functions/file.md b/docs/fr/query_language/table_functions/file.md new file mode 100644 index 00000000000..1ea8fc7b531 --- /dev/null +++ b/docs/fr/query_language/table_functions/file.md @@ -0,0 +1,118 @@ +--- +machine_translated: true +--- + +# fichier {#file} + +Crée un tableau à partir d'un fichier. Cette fonction de table est similaire à [URL](url.md) et [hdfs](hdfs.md) ceux. + +``` sql +file(path, format, structure) +``` + +**Les paramètres d'entrée** + +- `path` — The relative path to the file from [user\_files\_path](../../operations/server_settings/settings.md#server_settings-user_files_path). Chemin d'accès à la prise en charge des fichiers suivant les globs en mode Lecture seule: `*`, `?`, `{abc,def}` et `{N..M}` où `N`, `M` — numbers, \``'abc', 'def'` — strings. +- `format` — The [format](../../interfaces/formats.md#formats) de le fichier. +- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. + +**Valeur renvoyée** + +Une table avec la structure spécifiée pour lire ou écrire des données dans le fichier spécifié. + +**Exemple** + +Paramètre `user_files_path` et le contenu du fichier `test.csv`: + +``` bash +$ grep user_files_path /etc/clickhouse-server/config.xml + /var/lib/clickhouse/user_files/ + +$ cat /var/lib/clickhouse/user_files/test.csv + 1,2,3 + 3,2,1 + 78,43,45 +``` + +Table de`test.csv` et la sélection des deux premières lignes de ce: + +``` sql +SELECT * +FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +LIMIT 2 +``` + +``` text +┌─column1─┬─column2─┬─column3─┐ +│ 1 │ 2 │ 3 │ +│ 3 │ 2 │ 1 │ +└─────────┴─────────┴─────────┘ +``` + +``` sql +-- getting the first 10 lines of a table that contains 3 columns of UInt32 type from a CSV file +SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') LIMIT 10 +``` + +**Globs dans le chemin** + +Plusieurs composants de chemin peuvent avoir des globs. Pour être traité, le fichier doit exister et correspondre à l'ensemble du modèle de chemin (pas seulement le suffixe ou le préfixe). + +- `*` — Substitutes any number of any characters except `/` y compris la chaîne vide. +- `?` — Substitutes any single character. +- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. +- `{N..M}` — Substitutes any number in range from N to M including both borders. + +Les Constructions avec `{}` sont similaires à l' [fonction de table à distance](../../query_language/table_functions/remote.md)). + +**Exemple** + +1. Supposons que nous ayons plusieurs fichiers avec les chemins relatifs suivants: + +- ‘some\_dir/some\_file\_1’ +- ‘some\_dir/some\_file\_2’ +- ‘some\_dir/some\_file\_3’ +- ‘another\_dir/some\_file\_1’ +- ‘another\_dir/some\_file\_2’ +- ‘another\_dir/some\_file\_3’ + +1. Interroger la quantité de lignes dans ces fichiers: + + + +``` sql +SELECT count(*) +FROM file('{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32') +``` + +1. Requête de la quantité de lignes dans tous les fichiers de ces deux répertoires: + + + +``` sql +SELECT count(*) +FROM file('{some,another}_dir/*', 'TSV', 'name String, value UInt32') +``` + +!!! warning "Avertissement" + Si votre liste de fichiers contient des plages de nombres avec des zéros en tête, utilisez la construction avec des accolades pour chaque chiffre séparément ou utilisez `?`. + +**Exemple** + +Interroger les données des fichiers nommés `file000`, `file001`, … , `file999`: + +``` sql +SELECT count(*) +FROM file('big_dir/file{0..9}{0..9}{0..9}', 'CSV', 'name String, value UInt32') +``` + +## Les Colonnes Virtuelles {#virtual-columns} + +- `_path` — Path to the file. +- `_file` — Name of the file. + +**Voir Aussi** + +- [Les colonnes virtuelles](https://clickhouse.tech/docs/en/operations/table_engines/#table_engines-virtual_columns) + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/file/) diff --git a/docs/fr/query_language/table_functions/generate.md b/docs/fr/query_language/table_functions/generate.md new file mode 100644 index 00000000000..a02ee1b9385 --- /dev/null +++ b/docs/fr/query_language/table_functions/generate.md @@ -0,0 +1,42 @@ +--- +machine_translated: true +--- + +# generateRandom {#generaterandom} + +Génère des données aléatoires avec un schéma donné. +Permet de remplir des tables de test avec des données. +Prend en charge tous les types de données qui peuvent être stockés dans la table sauf `LowCardinality` et `AggregateFunction`. + +``` sql +generateRandom('name TypeName[, name TypeName]...', [, 'random_seed'[, 'max_string_length'[, 'max_array_length']]]); +``` + +**Paramètre** + +- `name` — Name of corresponding column. +- `TypeName` — Type of corresponding column. +- `limit` — Number of rows to generate. +- `max_array_length` — Maximum array length for all generated arrays. Defaults to `10`. +- `max_string_length` — Maximum string length for all generated strings. Defaults to `10`. +- `random_seed` — Specify random seed manually to produce stable results. If NULL — seed is randomly generated. + +**Valeur Renvoyée** + +Un objet de table avec le schéma demandé. + +## Exemple D'Utilisation {#usage-example} + +``` sql +SELECT * FROM generateRandom('a Array(Int8), d Decimal32(4), c Tuple(DateTime64(3), UUID)', 1, 10, 2); +``` + +``` text +┌─a────────┬────────────d─┬─c──────────────────────────────────────────────────────────────────┐ +│ [77] │ -124167.6723 │ ('2061-04-17 21:59:44.573','3f72f405-ec3e-13c8-44ca-66ef335f7835') │ +│ [32,110] │ -141397.7312 │ ('1979-02-09 03:43:48.526','982486d1-5a5d-a308-e525-7bd8b80ffa73') │ +│ [68] │ -67417.0770 │ ('2080-03-12 14:17:31.269','110425e5-413f-10a6-05ba-fa6b3e929f15') │ +└──────────┴──────────────┴────────────────────────────────────────────────────────────────────┘ +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/generate/) diff --git a/docs/fr/query_language/table_functions/hdfs.md b/docs/fr/query_language/table_functions/hdfs.md new file mode 100644 index 00000000000..d69206322d4 --- /dev/null +++ b/docs/fr/query_language/table_functions/hdfs.md @@ -0,0 +1,101 @@ +--- +machine_translated: true +--- + +# hdfs {#hdfs} + +Crée une table à partir de fichiers dans HDFS. Cette fonction de table est similaire à [URL](url.md) et [fichier](file.md) ceux. + +``` sql +hdfs(URI, format, structure) +``` + +**Les paramètres d'entrée** + +- `URI` — The relative URI to the file in HDFS. Path to file support following globs in readonly mode: `*`, `?`, `{abc,def}` et `{N..M}` où `N`, `M` — numbers, \``'abc', 'def'` — strings. +- `format` — The [format](../../interfaces/formats.md#formats) de le fichier. +- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. + +**Valeur renvoyée** + +Une table avec la structure spécifiée pour lire ou écrire des données dans le fichier spécifié. + +**Exemple** + +Table de `hdfs://hdfs1:9000/test` et la sélection des deux premières lignes de ce: + +``` sql +SELECT * +FROM hdfs('hdfs://hdfs1:9000/test', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +LIMIT 2 +``` + +``` text +┌─column1─┬─column2─┬─column3─┐ +│ 1 │ 2 │ 3 │ +│ 3 │ 2 │ 1 │ +└─────────┴─────────┴─────────┘ +``` + +**Globs dans le chemin** + +Plusieurs composants de chemin peuvent avoir des globs. Pour être traité, le fichier doit exister et correspondre à l'ensemble du modèle de chemin (pas seulement le suffixe ou le préfixe). + +- `*` — Substitutes any number of any characters except `/` y compris la chaîne vide. +- `?` — Substitutes any single character. +- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. +- `{N..M}` — Substitutes any number in range from N to M including both borders. + +Les Constructions avec `{}` sont similaires à l' [fonction de table à distance](../../query_language/table_functions/remote.md)). + +**Exemple** + +1. Supposons que nous ayons plusieurs fichiers avec les URI suivants sur HDFS: + +- ‘hdfs://hdfs1:9000/some\_dir/some\_file\_1’ +- ‘hdfs://hdfs1:9000/some\_dir/some\_file\_2’ +- ‘hdfs://hdfs1:9000/some\_dir/some\_file\_3’ +- ‘hdfs://hdfs1:9000/another\_dir/some\_file\_1’ +- ‘hdfs://hdfs1:9000/another\_dir/some\_file\_2’ +- ‘hdfs://hdfs1:9000/another\_dir/some\_file\_3’ + +1. Interroger la quantité de lignes dans ces fichiers: + + + +``` sql +SELECT count(*) +FROM hdfs('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32') +``` + +1. Requête de la quantité de lignes dans tous les fichiers de ces deux répertoires: + + + +``` sql +SELECT count(*) +FROM hdfs('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV', 'name String, value UInt32') +``` + +!!! warning "Avertissement" + Si votre liste de fichiers contient des plages de nombres avec des zéros en tête, utilisez la construction avec des accolades pour chaque chiffre séparément ou utilisez `?`. + +**Exemple** + +Interroger les données des fichiers nommés `file000`, `file001`, … , `file999`: + +``` sql +SELECT count(*) +FROM hdfs('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV', 'name String, value UInt32') +``` + +## Les Colonnes Virtuelles {#virtual-columns} + +- `_path` — Path to the file. +- `_file` — Name of the file. + +**Voir Aussi** + +- [Les colonnes virtuelles](https://clickhouse.tech/docs/en/operations/table_engines/#table_engines-virtual_columns) + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/hdfs/) diff --git a/docs/fr/query_language/table_functions/index.md b/docs/fr/query_language/table_functions/index.md new file mode 100644 index 00000000000..fc227e2c18a --- /dev/null +++ b/docs/fr/query_language/table_functions/index.md @@ -0,0 +1,34 @@ +--- +machine_translated: true +--- + +# Les Fonctions De Table {#table-functions} + +Les fonctions de Table sont des méthodes pour construire des tables. + +Vous pouvez utiliser les fonctions de table dans: + +- [FROM](../select.md#select-from) la clause de la `SELECT` requête. + + The method for creating a temporary table that is available only in the current query. The table is deleted when the query finishes. + +- [Créer une TABLE en tant que \< table\_function ()\>](../create.md#create-table-query) requête. + + It's one of the methods of creating a table. + +!!! warning "Avertissement" + Vous ne pouvez pas utiliser les fonctions de table si [allow\_ddl](../../operations/settings/permissions_for_queries.md#settings_allow_ddl) paramètre est désactivé. + +| Fonction | Description | +|-----------------------|--------------------------------------------------------------------------------------------------------------------------------| +| [fichier](file.md) | Crée un [Fichier](../../operations/table_engines/file.md)-moteur de table. | +| [fusionner](merge.md) | Crée un [Fusionner](../../operations/table_engines/merge.md)-moteur de table. | +| [nombre](numbers.md) | Crée une table avec une seule colonne remplie de nombres entiers. | +| [distant](remote.md) | Vous permet d'accéder à des serveurs distants sans [Distribué](../../operations/table_engines/distributed.md)-moteur de table. | +| [URL](url.md) | Crée un [URL](../../operations/table_engines/url.md)-moteur de table. | +| [mysql](mysql.md) | Crée un [MySQL](../../operations/table_engines/mysql.md)-moteur de table. | +| [jdbc](jdbc.md) | Crée un [JDBC](../../operations/table_engines/jdbc.md)-moteur de table. | +| [ODBC](odbc.md) | Crée un [ODBC](../../operations/table_engines/odbc.md)-moteur de table. | +| [hdfs](hdfs.md) | Crée un [HDFS](../../operations/table_engines/hdfs.md)-moteur de table. | + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/) diff --git a/docs/fr/query_language/table_functions/input.md b/docs/fr/query_language/table_functions/input.md new file mode 100644 index 00000000000..5f717431c6a --- /dev/null +++ b/docs/fr/query_language/table_functions/input.md @@ -0,0 +1,44 @@ +--- +machine_translated: true +--- + +# entrée {#input} + +`input(structure)` - fonction de table qui permet effectivement convertir et insérer des données envoyées à la +serveur avec une structure donnée à la table avec une autre structure. + +`structure` - structure de données envoyées au serveur dans le format suivant `'column1_name column1_type, column2_name column2_type, ...'`. +Exemple, `'id UInt32, name String'`. + +Cette fonction peut être utilisée uniquement dans `INSERT SELECT` requête et une seule fois mais se comporte autrement comme une fonction de table ordinaire +(par exemple, il peut être utilisé dans la sous-requête, etc.). + +Les données peuvent être envoyées de quelque manière que ce soit comme pour ordinaire `INSERT` requête et passé dans tout disponible [format](../../interfaces/formats.md#formats) +qui doit être spécifié à la fin de la requête (contrairement à l'ordinaire `INSERT SELECT`). + +La caractéristique principale de cette fonction est que lorsque le serveur reçoit des données du client il les convertit simultanément +selon la liste des expressions dans le `SELECT` clause et insère dans la table cible. Table temporaire +avec toutes les données transférées n'est pas créé. + +**Exemple** + +- Laissez le `test` le tableau a la structure suivante `(a String, b String)` + et les données `data.csv` a une structure différente `(col1 String, col2 Date, col3 Int32)`. Requête pour insérer + les données de l' `data.csv` dans le `test` table avec conversion simultanée ressemble à ceci: + + + +``` bash +$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT lower(col1), col3 * col3 FROM input('col1 String, col2 Date, col3 Int32') FORMAT CSV"; +``` + +- Si `data.csv` contient les données de la même structure `test_structure` comme la table `test` puis ces deux requêtes sont égales: + + + +``` bash +$ cat data.csv | clickhouse-client --query="INSERT INTO test FORMAT CSV" +$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT * FROM input('test_structure') FORMAT CSV" +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/input/) diff --git a/docs/fr/query_language/table_functions/jdbc.md b/docs/fr/query_language/table_functions/jdbc.md new file mode 100644 index 00000000000..20f70e53c7c --- /dev/null +++ b/docs/fr/query_language/table_functions/jdbc.md @@ -0,0 +1,26 @@ +--- +machine_translated: true +--- + +# jdbc {#table-function-jdbc} + +`jdbc(jdbc_connection_uri, schema, table)` - retourne la table qui est connectée via le pilote JDBC. + +Ce tableau fonction nécessite séparé `clickhouse-jdbc-bridge` programme en cours d'exécution. +Il prend en charge les types Nullable (basé sur DDL de la table distante qui est interrogée). + +**Exemple** + +``` sql +SELECT * FROM jdbc('jdbc:mysql://localhost:3306/?user=root&password=root', 'schema', 'table') +``` + +``` sql +SELECT * FROM jdbc('mysql://localhost:3306/?user=root&password=root', 'schema', 'table') +``` + +``` sql +SELECT * FROM jdbc('datasource://mysql-local', 'schema', 'table') +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/jdbc/) diff --git a/docs/fr/query_language/table_functions/merge.md b/docs/fr/query_language/table_functions/merge.md new file mode 100644 index 00000000000..23759fae9f1 --- /dev/null +++ b/docs/fr/query_language/table_functions/merge.md @@ -0,0 +1,11 @@ +--- +machine_translated: true +--- + +# fusionner {#merge} + +`merge(db_name, 'tables_regexp')` – Creates a temporary Merge table. For more information, see the section “Table engines, Merge”. + +La structure de la table est tirée de la première table rencontrée qui correspond à l'expression régulière. + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/merge/) diff --git a/docs/fr/query_language/table_functions/mysql.md b/docs/fr/query_language/table_functions/mysql.md new file mode 100644 index 00000000000..465fd1da1f6 --- /dev/null +++ b/docs/fr/query_language/table_functions/mysql.md @@ -0,0 +1,83 @@ +--- +machine_translated: true +--- + +# mysql {#mysql} + +Permettre `SELECT` requêtes à effectuer sur des données stockées sur un serveur MySQL distant. + +``` sql +mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']); +``` + +**Paramètre** + +- `host:port` — MySQL server address. + +- `database` — Remote database name. + +- `table` — Remote table name. + +- `user` — MySQL user. + +- `password` — User password. + +- `replace_query` — Flag that converts `INSERT INTO` les requêtes de `REPLACE INTO`. Si `replace_query=1` la requête est remplacé. + +- `on_duplicate_clause` — The `ON DUPLICATE KEY on_duplicate_clause` expression qui est ajoutée à la `INSERT` requête. + + Example: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1`, where `on_duplicate_clause` is `UPDATE c2 = c2 + 1`. See the MySQL documentation to find which `on_duplicate_clause` you can use with the `ON DUPLICATE KEY` clause. + + To specify `on_duplicate_clause` you need to pass `0` to the `replace_query` parameter. If you simultaneously pass `replace_query = 1` and `on_duplicate_clause`, ClickHouse generates an exception. + +Simple `WHERE` des clauses telles que `=, !=, >, >=, <, <=` sont actuellement exécutés sur le serveur MySQL. + +Le reste des conditions et le `LIMIT` les contraintes d'échantillonnage sont exécutées dans ClickHouse uniquement après la fin de la requête à MySQL. + +**Valeur Renvoyée** + +Un objet table avec les mêmes colonnes que la table MySQL d'origine. + +## Exemple D'Utilisation {#usage-example} + +Table dans MySQL: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++--------+--------------+-------+----------------+ +| int_id | int_nullable | float | float_nullable | ++--------+--------------+-------+----------------+ +| 1 | NULL | 2 | NULL | ++--------+--------------+-------+----------------+ +1 row in set (0,00 sec) +``` + +Sélection des données de ClickHouse: + +``` sql +SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123') +``` + +``` text +┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐ +│ 1 │ ᴺᵁᴸᴸ │ 2 │ ᴺᵁᴸᴸ │ +└────────┴──────────────┴───────┴────────────────┘ +``` + +## Voir Aussi {#see-also} + +- [Le ‘MySQL’ tableau moteur](../../operations/table_engines/mysql.md) +- [Utilisation de MySQL comme source de dictionnaire externe](../dicts/external_dicts_dict_sources.md#dicts-external_dicts_dict_sources-mysql) + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/mysql/) diff --git a/docs/fr/query_language/table_functions/numbers.md b/docs/fr/query_language/table_functions/numbers.md new file mode 100644 index 00000000000..663b481cb3d --- /dev/null +++ b/docs/fr/query_language/table_functions/numbers.md @@ -0,0 +1,27 @@ +--- +machine_translated: true +--- + +# nombre {#numbers} + +`numbers(N)` – Returns a table with the single ‘number’ colonne (UInt64) qui contient des entiers de 0 à n-1. +`numbers(N, M)` - Retourne un tableau avec le seul ‘number’ colonne (UInt64) qui contient des entiers de N À (N + M-1). + +Similaire à la `system.numbers` table, il peut être utilisé pour tester et générer des valeurs successives, `numbers(N, M)` plus efficace que `system.numbers`. + +Les requêtes suivantes sont équivalentes: + +``` sql +SELECT * FROM numbers(10); +SELECT * FROM numbers(0, 10); +SELECT * FROM system.numbers LIMIT 10; +``` + +Exemple: + +``` sql +-- Generate a sequence of dates from 2010-01-01 to 2010-12-31 +select toDate('2010-01-01') + number as d FROM numbers(365); +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/numbers/) diff --git a/docs/fr/query_language/table_functions/odbc.md b/docs/fr/query_language/table_functions/odbc.md new file mode 100644 index 00000000000..741ec92c951 --- /dev/null +++ b/docs/fr/query_language/table_functions/odbc.md @@ -0,0 +1,105 @@ +--- +machine_translated: true +--- + +# ODBC {#table-functions-odbc} + +Renvoie la table connectée via [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity). + +``` sql +odbc(connection_settings, external_database, external_table) +``` + +Paramètre: + +- `connection_settings` — Name of the section with connection settings in the `odbc.ini` fichier. +- `external_database` — Name of a database in an external DBMS. +- `external_table` — Name of a table in the `external_database`. + +Pour implémenter en toute sécurité les connexions ODBC, ClickHouse utilise un programme distinct `clickhouse-odbc-bridge`. Si le pilote ODBC est chargé directement depuis `clickhouse-server`, les problèmes de pilote peuvent planter le serveur ClickHouse. Clickhouse démarre automatiquement `clickhouse-odbc-bridge` lorsque cela est nécessaire. Le programme ODBC bridge est installé à partir du même package que `clickhouse-server`. + +Les champs avec l' `NULL` les valeurs de la table externe sont converties en valeurs par défaut pour le type de données de base. Par exemple, si un champ de table MySQL distant a `INT NULL` type il est converti en 0 (la valeur par défaut pour ClickHouse `Int32` type de données). + +## Exemple d'utilisation {#usage-example} + +**Obtenir des données de L'installation MySQL locale via ODBC** + +Cet exemple est vérifié pour Ubuntu Linux 18.04 et MySQL server 5.7. + +Assurez-vous que unixODBC et MySQL Connector sont installés. + +Par défaut (si installé à partir de paquets), ClickHouse démarre en tant qu'utilisateur `clickhouse`. Ainsi, vous devez créer et configurer cet utilisateur dans le serveur MySQL. + +``` bash +$ sudo mysql +``` + +``` sql +mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse'; +mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'clickhouse' WITH GRANT OPTION; +``` + +Puis configurez la connexion dans `/etc/odbc.ini`. + +``` bash +$ cat /etc/odbc.ini +[mysqlconn] +DRIVER = /usr/local/lib/libmyodbc5w.so +SERVER = 127.0.0.1 +PORT = 3306 +DATABASE = test +USERNAME = clickhouse +PASSWORD = clickhouse +``` + +Vous pouvez vérifier la connexion en utilisant le `isql` utilitaire de l'installation unixODBC. + +``` bash +$ isql -v mysqlconn ++---------------------------------------+ +| Connected! | +| | +... +``` + +Table dans MySQL: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++--------+--------------+-------+----------------+ +| int_id | int_nullable | float | float_nullable | ++--------+--------------+-------+----------------+ +| 1 | NULL | 2 | NULL | ++--------+--------------+-------+----------------+ +1 row in set (0,00 sec) +``` + +Récupération des données de la table MySQL dans ClickHouse: + +``` sql +SELECT * FROM odbc('DSN=mysqlconn', 'test', 'test') +``` + +``` text +┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐ +│ 1 │ 0 │ 2 │ 0 │ +└────────┴──────────────┴───────┴────────────────┘ +``` + +## Voir Aussi {#see-also} + +- [Dictionnaires externes ODBC](../../query_language/dicts/external_dicts_dict_sources.md#dicts-external_dicts_dict_sources-odbc) +- [Moteur de table ODBC](../../operations/table_engines/odbc.md). + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/jdbc/) diff --git a/docs/fr/query_language/table_functions/remote.md b/docs/fr/query_language/table_functions/remote.md new file mode 100644 index 00000000000..c9dac905c16 --- /dev/null +++ b/docs/fr/query_language/table_functions/remote.md @@ -0,0 +1,80 @@ +--- +machine_translated: true +--- + +# à distance, remoteSecure {#remote-remotesecure} + +Vous permet d'accéder à des serveurs distants sans `Distributed` table. + +Signature: + +``` sql +remote('addresses_expr', db, table[, 'user'[, 'password']]) +remote('addresses_expr', db.table[, 'user'[, 'password']]) +``` + +`addresses_expr` – An expression that generates addresses of remote servers. This may be just one server address. The server address is `host:port` ou juste `host`. L'hôte peut être spécifié comme nom de serveur ou l'adresse IPv4 ou IPv6. Une adresse IPv6 est indiquée entre crochets. Le port est le port TCP sur le serveur distant. Si le port est omis, il utilise `tcp_port` à partir du fichier de configuration du serveur (par défaut, 9000). + +!!! important "Important" + Le port est requis pour une adresse IPv6. + +Exemple: + +``` text +example01-01-1 +example01-01-1:9000 +localhost +127.0.0.1 +[::]:9000 +[2a02:6b8:0:1111::11]:9000 +``` + +Plusieurs adresses séparées par des virgules. Dans ce cas, ClickHouse utilisera le traitement distribué, donc il enverra la requête à toutes les adresses spécifiées (comme les fragments avec des données différentes). + +Exemple: + +``` text +example01-01-1,example01-02-1 +``` + +Une partie de l'expression peut être spécifiée entre crochets. L'exemple précédent peut être écrite comme suit: + +``` text +example01-0{1,2}-1 +``` + +Les accolades peuvent contenir une plage de Nombres séparés par deux points (entiers non négatifs). Dans ce cas, la gamme est étendue à un ensemble de valeurs qui génèrent fragment d'adresses. Si le premier nombre commence par zéro, les valeurs sont formées avec le même alignement zéro. L'exemple précédent peut être écrite comme suit: + +``` text +example01-{01..02}-1 +``` + +Si vous avez plusieurs paires d'accolades, il génère le produit direct des ensembles correspondants. + +Les adresses et les parties d'adresses entre crochets peuvent être séparées par le symbole de tuyau (\|). Dans ce cas, les ensembles correspondants de adresses sont interprétés comme des répliques, et la requête sera envoyée à la première sain réplique. Cependant, les répliques sont itérées dans l'ordre actuellement défini dans [équilibrage](../../operations/settings/settings.md) paramètre. + +Exemple: + +``` text +example01-{01..02}-{1|2} +``` + +Cet exemple spécifie deux fragments qui ont chacun deux répliques. + +Le nombre d'adresses générées est limitée par une constante. En ce moment, c'est 1000 adresses. + +À l'aide de la `remote` la fonction de table est moins optimale que la création d'un `Distributed` table, car dans ce cas, la connexion au serveur est rétablie pour chaque requête. En outre, si des noms d'hôte, les noms sont résolus, et les erreurs ne sont pas comptés lors de travail avec diverses répliques. Lors du traitement d'un grand nombre de requêtes, créez toujours `Distributed` table à l'avance, et ne pas utiliser la `remote` table de fonction. + +Le `remote` table de fonction peut être utile dans les cas suivants: + +- Accès à un serveur spécifique pour la comparaison de données, le débogage et les tests. +- Requêtes entre différents clusters ClickHouse à des fins de recherche. +- Demandes distribuées peu fréquentes qui sont faites manuellement. +- Distribué demandes où l'ensemble des serveurs est redéfinie à chaque fois. + +Si l'utilisateur n'est pas spécifié, `default` est utilisée. +Si le mot de passe n'est spécifié, un mot de passe vide est utilisé. + +`remoteSecure` - la même chose que `remote` but with secured connection. Default port — [tcp\_port\_secure](../../operations/server_settings/settings.md#server_settings-tcp_port_secure) de config ou 9440. + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/remote/) diff --git a/docs/fr/query_language/table_functions/url.md b/docs/fr/query_language/table_functions/url.md new file mode 100644 index 00000000000..7b7795eef79 --- /dev/null +++ b/docs/fr/query_language/table_functions/url.md @@ -0,0 +1,23 @@ +--- +machine_translated: true +--- + +# URL {#url} + +`url(URL, format, structure)` - retourne une table créée à partir du `URL` avec le +`format` et `structure`. + +URL-adresse du serveur HTTP ou HTTPS, qui peut accepter `GET` et/ou `POST` demande. + +format - [format](../../interfaces/formats.md#formats) des données. + +structure - structure de table dans `'UserID UInt64, Name String'` format. Détermine les noms et les types de colonnes. + +**Exemple** + +``` sql +-- getting the first 3 lines of a table that contains columns of String and UInt32 type from HTTP-server which answers in CSV format. +SELECT * FROM url('http://127.0.0.1:12345/', CSV, 'column1 String, column2 UInt32') LIMIT 3 +``` + +[Article Original](https://clickhouse.tech/docs/en/query_language/table_functions/url/) diff --git a/docs/fr/roadmap.md b/docs/fr/roadmap.md new file mode 100644 index 00000000000..c0b2e685679 --- /dev/null +++ b/docs/fr/roadmap.md @@ -0,0 +1,16 @@ +--- +machine_translated: true +--- + +# Feuille de route {#roadmap} + +## Q1 2020 {#q1-2020} + +- Contrôle d'accès par rôle + +## Q2 2020 {#q2-2020} + +- Intégration avec les services d'authentification externes +- Pools de ressources pour une répartition plus précise de la capacité du cluster entre les utilisateurs + +{## [Article Original](https://clickhouse.tech/docs/en/roadmap/) ##} diff --git a/docs/fr/security_changelog.md b/docs/fr/security_changelog.md new file mode 100644 index 00000000000..0b37478e9aa --- /dev/null +++ b/docs/fr/security_changelog.md @@ -0,0 +1,73 @@ +--- +machine_translated: true +--- + +## Correction dans la version 19.14.3.3 de ClickHouse, 2019-09-10 {#fixed-in-clickhouse-release-19-14-3-3-2019-09-10} + +### CVE-2019-15024 {#cve-2019-15024} + +Аn attacker that has write access to ZooKeeper and who ican run a custom server available from the network where ClickHouse runs, can create a custom-built malicious server that will act as a ClickHouse replica and register it in ZooKeeper. When another replica will fetch data part from the malicious replica, it can force clickhouse-server to write to arbitrary path on filesystem. + +Crédits: Eldar Zaitov de L'équipe de sécurité de L'Information Yandex + +### CVE-2019-16535 {#cve-2019-16535} + +Аn OOB read, OOB write and integer underflow in decompression algorithms can be used to achieve RCE or DoS via native protocol. + +Crédits: Eldar Zaitov de L'équipe de sécurité de L'Information Yandex + +### CVE-2019-16536 {#cve-2019-16536} + +Le débordement de pile menant à DoS peut être déclenché par un client authentifié malveillant. + +Crédits: Eldar Zaitov de L'équipe de sécurité de L'Information Yandex + +## Correction de la version 19.13.6.1 de ClickHouse, 2019-09-20 {#fixed-in-clickhouse-release-19-13-6-1-2019-09-20} + +### CVE-2019-18657 {#cve-2019-18657} + +Fonction de Table `url` la vulnérabilité avait-elle permis à l'attaquant d'injecter des en-têtes HTTP arbitraires dans la requête. + +Crédit: [Nikita Tikhomirov](https://github.com/NSTikhomirov) + +## Correction dans la version ClickHouse 18.12.13, 2018-09-10 {#fixed-in-clickhouse-release-18-12-13-2018-09-10} + +### CVE-2018-14672 {#cve-2018-14672} + +Les fonctions de chargement des modèles CatBoost permettaient de parcourir les chemins et de lire des fichiers arbitraires via des messages d'erreur. + +Crédits: Andrey Krasichkov de L'équipe de sécurité de L'Information Yandex + +## Correction dans la version 18.10.3 de ClickHouse, 2018-08-13 {#fixed-in-clickhouse-release-18-10-3-2018-08-13} + +### CVE-2018-14671 {#cve-2018-14671} + +unixODBC a permis de charger des objets partagés arbitraires à partir du système de fichiers, ce qui a conduit à une vulnérabilité D'exécution de Code À Distance. + +Crédits: Andrey Krasichkov et Evgeny Sidorov de Yandex Information Security Team + +## Correction dans la version 1.1.54388 de ClickHouse, 2018-06-28 {#fixed-in-clickhouse-release-1-1-54388-2018-06-28} + +### CVE-2018-14668 {#cve-2018-14668} + +“remote” la fonction de table a permis des symboles arbitraires dans “user”, “password” et “default\_database” champs qui ont conduit à des attaques de falsification de requêtes inter-protocoles. + +Crédits: Andrey Krasichkov de L'équipe de sécurité de L'Information Yandex + +## Correction dans la version 1.1.54390 de ClickHouse, 2018-07-06 {#fixed-in-clickhouse-release-1-1-54390-2018-07-06} + +### CVE-2018-14669 {#cve-2018-14669} + +Clickhouse client MySQL avait “LOAD DATA LOCAL INFILE” fonctionnalité activée permettant à une base de données MySQL malveillante de lire des fichiers arbitraires à partir du serveur clickhouse connecté. + +Crédits: Andrey Krasichkov et Evgeny Sidorov de Yandex Information Security Team + +## Correction dans la version 1.1.54131 de ClickHouse, 2017-01-10 {#fixed-in-clickhouse-release-1-1-54131-2017-01-10} + +### CVE-2018-14670 {#cve-2018-14670} + +Configuration incorrecte dans le paquet deb pourrait conduire à l'utilisation non autorisée de la base de données. + +Crédits: National Cyber Security Centre (NCSC) + +{## [Article Original](https://clickhouse.tech/docs/en/security_changelog/) ##} diff --git a/docs/ja/getting_started/playground.md b/docs/ja/getting_started/playground.md new file mode 120000 index 00000000000..de5b41f453e --- /dev/null +++ b/docs/ja/getting_started/playground.md @@ -0,0 +1 @@ +../../en/getting_started/playground.md \ No newline at end of file diff --git a/docs/toc_fr.yml b/docs/toc_fr.yml new file mode 100644 index 00000000000..cecd7327a5f --- /dev/null +++ b/docs/toc_fr.yml @@ -0,0 +1,244 @@ +nav: +- Introduction: + - "Aper\xE7u": index.md + - "Caract\xE9ristiques distinctives de ClickHouse": introduction/distinctive_features.md + - "Caract\xE9ristiques de ClickHouse qui peuvent \xEAtre consid\xE9r\xE9es comme des inconv\xE9nients": introduction/features_considered_disadvantages.md + - Performance: introduction/performance.md + - Histoire: introduction/history.md + - Adoptant: introduction/adopters.md +- Prise En Main: + - hidden: getting_started/index.md + - Installation: getting_started/install.md + - Tutoriel: getting_started/tutorial.md + - "Exemple De Jeux De Donn\xE9es": + - Introduction: getting_started/example_datasets/index.md + - OnTime: getting_started/example_datasets/ontime.md + - "New York Taxi Donn\xE9es": getting_started/example_datasets/nyc_taxi.md + - AMPLab Big Data Benchmark: getting_started/example_datasets/amplab_benchmark.md + - WikiStat: getting_started/example_datasets/wikistat.md + - "T\xE9raoctet click Logs de Criteo": getting_started/example_datasets/criteo.md + - "R\xE9f\xE9rence Du Sch\xE9ma En \xC9toile": getting_started/example_datasets/star_schema.md + - "Yandex.Metrica De Donn\xE9es": getting_started/example_datasets/metrica.md + - "R\xE9cr\xE9ation": getting_started/playground.md +- Interface: + - Introduction: interfaces/index.md + - Client De Ligne De Commande: interfaces/cli.md + - Interface Native (TCP): interfaces/tcp.md + - Interface HTTP: interfaces/http.md + - Interface MySQL: interfaces/mysql.md + - "Formats d'entr\xE9e et de sortie": interfaces/formats.md + - JDBC: interfaces/jdbc.md + - Pilote ODBC: interfaces/odbc.md + - "Biblioth\xE8que Client C++ ": interfaces/cpp.md + - tiers: + - "Biblioth\xE8ques Clientes": interfaces/third-party/client_libraries.md + - "Int\xE9gration": interfaces/third-party/integrations.md + - Les Interfaces Visuelles: interfaces/third-party/gui.md + - Proxy: interfaces/third-party/proxy.md +- Moteur: + - Moteurs De Table: + - Introduction: operations/table_engines/index.md + - Famille MergeTree: + - MergeTree: operations/table_engines/mergetree.md + - "R\xE9plication Des Donn\xE9es": operations/table_engines/replication.md + - "Cl\xE9 De Partitionnement Personnalis\xE9e": operations/table_engines/custom_partitioning_key.md + - ReplacingMergeTree: operations/table_engines/replacingmergetree.md + - SummingMergeTree: operations/table_engines/summingmergetree.md + - AggregatingMergeTree: operations/table_engines/aggregatingmergetree.md + - CollapsingMergeTree: operations/table_engines/collapsingmergetree.md + - VersionedCollapsingMergeTree: operations/table_engines/versionedcollapsingmergetree.md + - GraphiteMergeTree: operations/table_engines/graphitemergetree.md + - Journal De La Famille: + - Introduction: operations/table_engines/log_family.md + - StripeLog: operations/table_engines/stripelog.md + - Journal: operations/table_engines/log.md + - TinyLog: operations/table_engines/tinylog.md + - "Int\xE9gration": + - Kafka: operations/table_engines/kafka.md + - MySQL: operations/table_engines/mysql.md + - JDBC: operations/table_engines/jdbc.md + - ODBC: operations/table_engines/odbc.md + - HDFS: operations/table_engines/hdfs.md + - "Sp\xE9cial": + - "Distribu\xE9": operations/table_engines/distributed.md + - "De donn\xE9es externes": operations/table_engines/external_data.md + - Dictionnaire: operations/table_engines/dictionary.md + - Fusionner: operations/table_engines/merge.md + - Fichier: operations/table_engines/file.md + - 'NULL': operations/table_engines/null.md + - "D\xE9finir": operations/table_engines/set.md + - Rejoindre: operations/table_engines/join.md + - URL: operations/table_engines/url.md + - Vue: operations/table_engines/view.md + - MaterializedView: operations/table_engines/materializedview.md + - "M\xE9moire": operations/table_engines/memory.md + - Tampon: operations/table_engines/buffer.md + - GenerateRandom: operations/table_engines/generate.md + - "Moteurs De Base De Donn\xE9es": + - Introduction: database_engines/index.md + - MySQL: database_engines/mysql.md + - Paresseux: database_engines/lazy.md +- "R\xE9f\xE9rence SQL": + - hidden: query_language/index.md + - Syntaxe: query_language/syntax.md + - "D\xE9claration": + - SELECT: query_language/select.md + - INSERT INTO: query_language/insert_into.md + - CREATE: query_language/create.md + - ALTER: query_language/alter.md + - SYSTEM: query_language/system.md + - SHOW: query_language/show.md + - Autre: query_language/misc.md + - Fonction: + - Introduction: query_language/functions/index.md + - "Arithm\xE9tique": query_language/functions/arithmetic_functions.md + - Comparaison: query_language/functions/comparison_functions.md + - Logique: query_language/functions/logical_functions.md + - La Conversion De Type: query_language/functions/type_conversion_functions.md + - Travailler avec les Dates et les heures: query_language/functions/date_time_functions.md + - "Travailler avec des cha\xEEnes": query_language/functions/string_functions.md + - "Pour Rechercher Des Cha\xEEnes": query_language/functions/string_search_functions.md + - "Pour remplacer dans les cha\xEEnes": query_language/functions/string_replace_functions.md + - 'Conditionnel ': query_language/functions/conditional_functions.md + - "Math\xE9matique": query_language/functions/math_functions.md + - Arrondi: query_language/functions/rounding_functions.md + - Travailler avec des tableaux: query_language/functions/array_functions.md + - "Fractionnement et fusion de cha\xEEnes et de tableaux": query_language/functions/splitting_merging_functions.md + - Bit: query_language/functions/bit_functions.md + - Bitmap: query_language/functions/bitmap_functions.md + - Hachage: query_language/functions/hash_functions.md + - "La G\xE9n\xE9ration De Nombres Pseudo-Al\xE9atoires": query_language/functions/random_functions.md + - Encodage: query_language/functions/encoding_functions.md + - Travailler avec UUID: query_language/functions/uuid_functions.md + - Travailler avec des URL: query_language/functions/url_functions.md + - Travailler avec des adresses IP: query_language/functions/ip_address_functions.md + - Travailler avec JSON.: query_language/functions/json_functions.md + - "D'Ordre Sup\xE9rieur": query_language/functions/higher_order_functions.md + - Travailler avec des dictionnaires externes: query_language/functions/ext_dict_functions.md + - Travailler avec Yandex.Dictionnaires Metrica: query_language/functions/ym_dict_functions.md + - "Mise en \u0153uvre de L'op\xE9rateur IN": query_language/functions/in_functions.md + - arrayJoin: query_language/functions/array_join.md + - "Travailler avec des coordonn\xE9es g\xE9ographiques": query_language/functions/geo.md + - Travailler avec des arguments nullables: query_language/functions/functions_for_nulls.md + - Fonctions D'Apprentissage Automatique: query_language/functions/machine_learning_functions.md + - Introspection: query_language/functions/introspection.md + - Autre: query_language/functions/other_functions.md + - "Les Fonctions D'Agr\xE9gation": + - Introduction: query_language/agg_functions/index.md + - "R\xE9f\xE9rence": query_language/agg_functions/reference.md + - "Combinateurs de fonction d'agr\xE9gat": query_language/agg_functions/combinators.md + - "Fonctions d'agr\xE9gat param\xE9triques": query_language/agg_functions/parametric_functions.md + - Les Fonctions De Table: + - Introduction: query_language/table_functions/index.md + - fichier: query_language/table_functions/file.md + - fusionner: query_language/table_functions/merge.md + - nombre: query_language/table_functions/numbers.md + - distant: query_language/table_functions/remote.md + - URL: query_language/table_functions/url.md + - mysql: query_language/table_functions/mysql.md + - jdbc: query_language/table_functions/jdbc.md + - ODBC: query_language/table_functions/odbc.md + - hdfs: query_language/table_functions/hdfs.md + - "entr\xE9e": query_language/table_functions/input.md + - generateRandom: query_language/table_functions/generate.md + - Dictionnaire: + - Introduction: query_language/dicts/index.md + - Dictionnaires Externes: + - "Description G\xE9n\xE9rale": query_language/dicts/external_dicts.md + - Configuration D'un dictionnaire externe: query_language/dicts/external_dicts_dict.md + - "Stockage des dictionnaires en m\xE9moire": query_language/dicts/external_dicts_dict_layout.md + - "Mises \xC0 Jour Du Dictionnaire": query_language/dicts/external_dicts_dict_lifetime.md + - Sources de dictionnaires externes: query_language/dicts/external_dicts_dict_sources.md + - "Cl\xE9 et champs du dictionnaire": query_language/dicts/external_dicts_dict_structure.md + - "Dictionnaires hi\xE9rarchiques": query_language/dicts/external_dicts_dict_hierarchical.md + - Dictionnaires Internes: query_language/dicts/internal_dicts.md + - "Op\xE9rateur": query_language/operators.md + - "Types De Donn\xE9es": + - Introduction: data_types/index.md + - UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64: data_types/int_uint.md + - Float32, Float64: data_types/float.md + - "D\xE9cimal": data_types/decimal.md + - "Bool\xE9en": data_types/boolean.md + - "Cha\xEEne": data_types/string.md + - FixedString (N): data_types/fixedstring.md + - UUID: data_types/uuid.md + - Date: data_types/date.md + - DateTime: data_types/datetime.md + - DateTime64: data_types/datetime64.md + - Enum: data_types/enum.md + - Array(T): data_types/array.md + - AggregateFunction (nom, types_of_arguments...): data_types/nested_data_structures/aggregatefunction.md + - Tuple (T1, T2,...): data_types/tuple.md + - Nullable: data_types/nullable.md + - "Structures De Donn\xE9es Imbriqu\xE9es": + - hidden: data_types/nested_data_structures/index.md + - "Imbriqu\xE9e(Type1 Nom1, Nom2 Type2, ...)": data_types/nested_data_structures/nested.md + - "Types De Donn\xE9es Sp\xE9ciaux": + - hidden: data_types/special_data_types/index.md + - Expression: data_types/special_data_types/expression.md + - "D\xE9finir": data_types/special_data_types/set.md + - Rien: data_types/special_data_types/nothing.md + - Intervalle: data_types/special_data_types/interval.md + - Domaine: + - "Aper\xE7u": data_types/domains/overview.md + - IPv4: data_types/domains/ipv4.md + - IPv6: data_types/domains/ipv6.md +- Guide: + - "Aper\xE7u": guides/index.md + - "Application Des Mod\xE8les CatBoost": guides/apply_catboost_model.md +- "Op\xE9rations": + - Introduction: operations/index.md + - Exigence: operations/requirements.md + - Surveiller: operations/monitoring.md + - "D\xE9pannage": operations/troubleshooting.md + - "Mise \xC0 Jour De ClickHouse": operations/update.md + - "Les Droits D'Acc\xE8s": operations/access_rights.md + - "La Sauvegarde Des Donn\xE9es": operations/backup.md + - Fichiers De Configuration: operations/configuration_files.md + - Quota: operations/quotas.md + - "Les Tables Syst\xE8me": operations/system_tables.md + - Optimisation Des Performances: + - "Profilage De Requ\xEAte": operations/performance/sampling_query_profiler.md + - "Tester Le Mat\xE9riel": operations/performance_test.md + - "Param\xE8tres De Configuration Du Serveur": + - Introduction: operations/server_settings/index.md + - "Les Param\xE8tres Du Serveur": operations/server_settings/settings.md + - "Param\xE8tre": + - Introduction: operations/settings/index.md + - "Autorisations pour les requ\xEAtes": operations/settings/permissions_for_queries.md + - "Restrictions sur la complexit\xE9 des requ\xEAtes": operations/settings/query_complexity.md + - "Param\xE8tre": operations/settings/settings.md + - "Les Param\xE8tres Des Profils": operations/settings/settings_profiles.md + - "Contraintes sur les param\xE8tres": operations/settings/constraints_on_settings.md + - "Les Param\xE8tres De L'Utilisateur": operations/settings/settings_users.md + - Utilitaire: + - "Aper\xE7u": operations/utils/index.md + - clickhouse-copieur: operations/utils/clickhouse-copier.md + - clickhouse-local: operations/utils/clickhouse-local.md + - clickhouse-benchmark: operations/utils/clickhouse-benchmark.md + - Recommandations D'Utilisation: operations/tips.md +- "D\xE9veloppement": + - hidden: development/index.md + - "Le D\xE9butant Clickhouse Developer Instruction": development/developer_instruction.md + - Vue d'ensemble de L'Architecture ClickHouse: development/architecture.md + - Parcourir Le Code Source De ClickHouse: development/browse_code.md + - Comment Construire ClickHouse sur Linux: development/build.md + - Comment Construire ClickHouse sur Mac OS X: development/build_osx.md + - Comment Construire ClickHouse sur Linux pour Mac OS X: development/build_cross_osx.md + - Comment Construire ClickHouse sur Linux pour AARCH64 (ARM64): development/build_cross_arm.md + - "Comment \xE9crire du Code C++ ": development/style.md + - "Comment ex\xE9cuter des Tests ClickHouse": development/tests.md + - "Biblioth\xE8ques Tierces Utilis\xE9es": development/contrib.md +- Commercial: + - Fournisseurs De Services Cloud: commercial/cloud.md +- Ce qui est Nouveau: + - Feuille de route: roadmap.md + - Changelog: + - '2020': changelog/index.md + - '2019': changelog/2019.md + - '2018': changelog/2018.md + - '2017': changelog/2017.md + - "S\xE9curit\xE9 Changelog": security_changelog.md +- F.A.Q.: + - "Questions G\xE9n\xE9rales": faq/general.md + diff --git a/docs/tools/build.py b/docs/tools/build.py index de496a25cef..741e9343923 100755 --- a/docs/tools/build.py +++ b/docs/tools/build.py @@ -1,16 +1,20 @@ #!/usr/bin/env python3 -# -*- coding: utf-8 -*- + from __future__ import unicode_literals import argparse import datetime +import http.server import logging import os import shutil +import socketserver import subprocess import sys +import threading import time +import jinja2 import livereload import markdown.util @@ -20,11 +24,10 @@ from mkdocs.commands import build as mkdocs_build from concatenate import concatenate -from website import build_website, minify_website - import mdx_clickhouse import test import util +import website class ClickHouseMarkdown(markdown.extensions.Extension): @@ -53,9 +56,10 @@ def build_for_lang(lang, args): try: theme_cfg = { 'name': None, - 'custom_dir': os.path.join(os.path.dirname(__file__), args.theme_dir), + 'custom_dir': os.path.join(os.path.dirname(__file__), '..', args.theme_dir), 'language': lang, 'direction': 'rtl' if lang == 'fa' else 'ltr', + # TODO: cleanup 'feature': { 'tabs': False }, @@ -66,38 +70,67 @@ def build_for_lang(lang, args): 'font': False, 'logo': 'images/logo.svg', 'favicon': 'assets/images/favicon.ico', - 'include_search_page': False, - 'search_index_only': False, 'static_templates': ['404.html'], 'extra': { 'now': int(time.mktime(datetime.datetime.now().timetuple())) # TODO better way to avoid caching } } + # the following list of languages is sorted according to + # https://en.wikipedia.org/wiki/List_of_languages_by_total_number_of_speakers + languages = { + 'en': 'English', + 'zh': '中文', + 'es': 'Español', + 'fr': 'Français', + 'ru': 'Русский', + 'ja': '日本語', + 'fa': 'فارسی' + } + site_names = { 'en': 'ClickHouse %s Documentation', 'es': 'Documentación de ClickHouse %s', + 'fr': 'Documentation ClickHouse %s', 'ru': 'Документация ClickHouse %s', 'zh': 'ClickHouse文档 %s', 'ja': 'ClickHouseドキュメント %s', 'fa': 'مستندات %sClickHouse' } + assert len(site_names) == len(languages) + if args.version_prefix: site_dir = os.path.join(args.docs_output_dir, args.version_prefix, lang) else: site_dir = os.path.join(args.docs_output_dir, lang) - plugins = ['search'] - if not args.no_docs_macros: - plugins.append('macros') + markdown_extensions = [ + 'mdx_clickhouse', + 'admonition', + 'attr_list', + 'codehilite', + 'nl2br', + 'sane_lists', + 'pymdownx.magiclink', + 'pymdownx.superfences', + 'extra', + { + 'toc': { + 'permalink': True, + 'slugify': mdx_clickhouse.slugify + } + } + ] + + plugins = ['macros'] if args.htmlproofer: plugins.append('htmlproofer') - cfg = config.load_config( + raw_config = dict( config_file=config_path, site_name=site_names.get(lang, site_names['en']) % args.version_prefix, - site_url=f'https://clickhouse.yandex/docs/{lang}/', + site_url=f'https://clickhouse.tech/docs/{lang}/', docs_dir=os.path.join(args.docs_dir, lang), site_dir=site_dir, strict=not args.version_prefix, @@ -108,39 +141,35 @@ def build_for_lang(lang, args): repo_url='https://github.com/ClickHouse/ClickHouse/', edit_uri=f'edit/master/docs/{lang}', extra_css=[f'assets/stylesheets/custom.css?{args.rev_short}'], - markdown_extensions=[ - 'mdx_clickhouse', - 'admonition', - 'attr_list', - 'codehilite', - 'nl2br', - 'sane_lists', - 'pymdownx.magiclink', - 'pymdownx.superfences', - 'extra', - { - 'toc': { - 'permalink': True, - 'slugify': mdx_clickhouse.slugify - } - } - ], + markdown_extensions=markdown_extensions, plugins=plugins, extra={ 'stable_releases': args.stable_releases, 'version_prefix': args.version_prefix, + 'single_page': False, 'rev': args.rev, 'rev_short': args.rev_short, 'rev_url': args.rev_url, - 'events': args.events + 'events': args.events, + 'languages': languages } ) - mkdocs_build.build(cfg) + cfg = config.load_config(**raw_config) + + try: + mkdocs_build.build(cfg) + except jinja2.exceptions.TemplateError: + if not args.version_prefix: + raise + mdx_clickhouse.PatchedMacrosPlugin.disabled = True + mkdocs_build.build(cfg) if not args.skip_single_page: build_single_page_version(lang, args, cfg) - + + mdx_clickhouse.PatchedMacrosPlugin.disabled = False + logging.info(f'Finished building {lang} docs') except exceptions.ConfigurationError as e: @@ -150,6 +179,8 @@ def build_for_lang(lang, args): def build_single_page_version(lang, args, cfg): logging.info(f'Building single page version for {lang}') os.environ['SINGLE_PAGE'] = '1' + extra = cfg.data['extra'] + extra['single_page'] = True with util.autoremoved_file(os.path.join(args.docs_dir, lang, 'single.md')) as single_md: concatenate(lang, args.docs_dir, single_md) @@ -167,9 +198,7 @@ def build_single_page_version(lang, args, cfg): cfg.load_dict({ 'docs_dir': docs_temp_lang, 'site_dir': site_temp, - 'extra': { - 'single_page': True - }, + 'extra': extra, 'nav': [ {cfg.data.get('site_name'): 'single.md'} ] @@ -191,33 +220,62 @@ def build_single_page_version(lang, args, cfg): ) if not args.skip_pdf: - single_page_index_html = os.path.abspath(os.path.join(single_page_output_path, 'index.html')) - single_page_pdf = single_page_index_html.replace('index.html', f'clickhouse_{lang}.pdf') - create_pdf_command = ['wkhtmltopdf', '--print-media-type', '--log-level', 'warn', single_page_index_html, single_page_pdf] - logging.info(' '.join(create_pdf_command)) - subprocess.check_call(' '.join(create_pdf_command), shell=True) - - if not args.version_prefix: # maybe enable in future with util.temp_dir() as test_dir: + single_page_pdf = os.path.abspath( + os.path.join(single_page_output_path, f'clickhouse_{lang}.pdf') + ) + extra['single_page'] = False cfg.load_dict({ 'docs_dir': docs_temp_lang, 'site_dir': test_dir, - 'extra': { - 'single_page': False - }, + 'extra': extra, 'nav': [ {cfg.data.get('site_name'): 'single.md'} ] }) mkdocs_build.build(cfg) - if args.save_raw_single_page: - shutil.copytree(test_dir, args.save_raw_single_page) - test.test_single_page(os.path.join(test_dir, 'single', 'index.html'), lang) - logging.info(f'Finished building single page version for {lang}') + css_in = ' '.join(website.get_css_in(args)) + js_in = ' '.join(website.get_js_in(args)) + subprocess.check_call(f'cat {css_in} > {test_dir}/css/base.css', shell=True) + subprocess.check_call(f'cat {js_in} > {test_dir}/js/base.js', shell=True) + port_for_pdf = util.get_free_port() + with socketserver.TCPServer( + ('', port_for_pdf), http.server.SimpleHTTPRequestHandler + ) as httpd: + logging.info(f"serving for pdf at port {port_for_pdf}") + thread = threading.Thread(target=httpd.serve_forever) + with util.cd(test_dir): + thread.start() + create_pdf_command = [ + 'wkhtmltopdf', + '--print-media-type', + '--no-stop-slow-scripts', + '--log-level', 'warn', + f'http://localhost:{port_for_pdf}/single/', single_page_pdf + ] + try: + if args.save_raw_single_page: + shutil.copytree(test_dir, args.save_raw_single_page) + logging.info(' '.join(create_pdf_command)) + subprocess.check_call(' '.join(create_pdf_command), shell=True) + finally: + httpd.shutdown() + thread.join(timeout=5.0) + + if not args.version_prefix: # maybe enable in future + test.test_single_page( + os.path.join(test_dir, 'single', 'index.html'), lang) + + logging.info(f'Finished building single page version for {lang}') def write_redirect_html(out_path, to_url): + out_dir = os.path.dirname(out_path) + try: + os.makedirs(out_dir) + except OSError: + pass with open(out_path, 'w') as f: f.write(f''' @@ -238,11 +296,6 @@ def write_redirect_html(out_path, to_url): def build_redirect_html(args, from_path, to_path): for lang in args.lang.split(','): out_path = os.path.join(args.docs_output_dir, lang, from_path.replace('.md', '/index.html')) - out_dir = os.path.dirname(out_path) - try: - os.makedirs(out_dir) - except OSError: - pass version_prefix = args.version_prefix + '/' if args.version_prefix else '/' target_path = to_path.replace('.md', '/') to_url = f'/docs{version_prefix}{lang}/{target_path}' @@ -251,19 +304,10 @@ def build_redirect_html(args, from_path, to_path): def build_redirects(args): - lang_re_fragment = args.lang.replace(',', '|') - rewrites = [] - with open(os.path.join(args.docs_dir, 'redirects.txt'), 'r') as f: for line in f: from_path, to_path = line.split(' ', 1) build_redirect_html(args, from_path, to_path) - from_path = '^/docs/(' + lang_re_fragment + ')/' + from_path.replace('.md', '/?') + '$' - to_path = '/docs/$1/' + to_path.replace('.md', '/') - rewrites.append(' '.join(['rewrite', from_path, to_path, 'permanent;'])) - - with open(os.path.join(args.docs_output_dir, 'redirects.conf'), 'w') as f: - f.write('\n'.join(rewrites)) def build_docs(args): @@ -280,7 +324,7 @@ def build(args): shutil.rmtree(args.output_dir) if not args.skip_website: - build_website(args) + website.build_website(args) build_docs(args) @@ -288,7 +332,7 @@ def build(args): build_releases(args, build_docs) if not args.skip_website: - minify_website(args) + website.minify_website(args) for static_redirect in [ ('tutorial.html', '/docs/en/getting_started/tutorial/',), @@ -304,14 +348,15 @@ def build(args): if __name__ == '__main__': os.chdir(os.path.join(os.path.dirname(__file__), '..')) - + website_dir = os.path.join('..', 'website') arg_parser = argparse.ArgumentParser() - arg_parser.add_argument('--lang', default='en,es,ru,zh,ja,fa') + arg_parser.add_argument('--lang', default='en,es,fr,ru,zh,ja,fa') arg_parser.add_argument('--docs-dir', default='.') - arg_parser.add_argument('--theme-dir', default='mkdocs-material-theme') - arg_parser.add_argument('--website-dir', default=os.path.join('..', 'website')) + arg_parser.add_argument('--theme-dir', default=website_dir) + arg_parser.add_argument('--website-dir', default=website_dir) arg_parser.add_argument('--output-dir', default='build') arg_parser.add_argument('--enable-stable-releases', action='store_true') + arg_parser.add_argument('--stable-releases-limit', type=int, default='10') arg_parser.add_argument('--version-prefix', type=str, default='') arg_parser.add_argument('--is-stable-release', action='store_true') arg_parser.add_argument('--skip-single-page', action='store_true') @@ -336,7 +381,7 @@ if __name__ == '__main__': args.docs_output_dir = os.path.join(os.path.abspath(args.output_dir), 'docs') from github import choose_latest_releases, get_events - args.stable_releases = choose_latest_releases() if args.enable_stable_releases else [] + args.stable_releases = choose_latest_releases(args) if args.enable_stable_releases else [] args.rev = subprocess.check_output('git rev-parse HEAD', shell=True).decode('utf-8').strip() args.rev_short = subprocess.check_output('git rev-parse --short HEAD', shell=True).decode('utf-8').strip() args.rev_url = f'https://github.com/ClickHouse/ClickHouse/commit/{args.rev}' @@ -350,10 +395,11 @@ if __name__ == '__main__': new_args = sys.executable + ' ' + ' '.join(new_args) server = livereload.Server() - server.watch(args.website_dir + '**/*', livereload.shell(new_args, cwd='tools', shell=True)) server.watch(args.docs_dir + '**/*', livereload.shell(new_args, cwd='tools', shell=True)) + server.watch(args.website_dir + '**/*', livereload.shell(new_args, cwd='tools', shell=True)) server.serve( root=args.output_dir, + host='0.0.0.0', port=args.livereload ) sys.exit(0) diff --git a/docs/tools/concatenate.py b/docs/tools/concatenate.py index 8b424a0b672..cfbc2acbb4c 100755 --- a/docs/tools/concatenate.py +++ b/docs/tools/concatenate.py @@ -42,14 +42,18 @@ def concatenate(lang, docs_path, single_page_file): for anchor in anchors: if re.search(az_re, anchor): - single_page_file.write('\n' % anchor) + single_page_file.write('' % anchor) - single_page_file.write('\n\n') + single_page_file.write('\n') + in_metadata = False for l in f: + if l.startswith('---'): + in_metadata = not in_metadata if l.startswith('#'): l = '#' + l - single_page_file.write(l) + if not in_metadata: + single_page_file.write(l) except IOError as e: logging.warning(str(e)) diff --git a/docs/tools/github.py b/docs/tools/github.py index 4a02981b4b3..d32c78abb14 100644 --- a/docs/tools/github.py +++ b/docs/tools/github.py @@ -6,17 +6,16 @@ import os import sys import tarfile -import jinja2 import requests import util -def choose_latest_releases(): +def choose_latest_releases(args): logging.info('Collecting release candidates') seen = collections.OrderedDict() candidates = [] - for page in range(1, 10): + for page in range(1, args.stable_releases_limit): url = 'https://api.github.com/repos/ClickHouse/ClickHouse/tags?per_page=100&page=%d' % page candidates += requests.get(url).json() logging.info('Collected all release candidates') @@ -31,7 +30,7 @@ def choose_latest_releases(): major_version = '.'.join((name.split('.', 2))[:2]) if major_version not in seen: seen[major_version] = (name, tag.get('tarball_url'),) - if len(seen) > 10: + if len(seen) > args.stable_releases_limit: break else: logging.fatal('Unexpected GitHub response: %s', str(candidates)) @@ -52,11 +51,7 @@ def process_release(args, callback, release): args.version_prefix = name args.is_stable_release = True args.docs_dir = os.path.join(base_dir, os.listdir(base_dir)[0], 'docs') - try: - callback(args) - except jinja2.exceptions.TemplateSyntaxError: - args.no_docs_macros = True - callback(args) + callback(args) def build_releases(args, callback): diff --git a/docs/tools/make_links.sh b/docs/tools/make_links.sh index 87b3f56a166..dfe9c56615d 100755 --- a/docs/tools/make_links.sh +++ b/docs/tools/make_links.sh @@ -6,7 +6,7 @@ function do_make_links() { - langs=(en es ru zh ja fa) + langs=(en es zh fr ru ja fa) src_file="$1" for lang in "${langs[@]}" do diff --git a/docs/tools/mdx_clickhouse.py b/docs/tools/mdx_clickhouse.py index bfe5ebbd1ae..f024c129462 100755 --- a/docs/tools/mdx_clickhouse.py +++ b/docs/tools/mdx_clickhouse.py @@ -11,7 +11,6 @@ import macros.plugin import slugify as slugify_impl - class ClickHouseLinkMixin(object): def handleMatch(self, m, data): @@ -26,7 +25,7 @@ class ClickHouseLinkMixin(object): is_external = href.startswith('http:') or href.startswith('https:') if is_external: if not href.startswith('https://clickhouse.tech'): - el.set('rel', 'external nofollow') + el.set('rel', 'external nofollow noreferrer') elif single_page: if '#' in href: el.set('href', '#' + href.split('#', 1)[1]) @@ -70,11 +69,43 @@ def slugify(value, separator): return slugify_impl.slugify(value, separator=separator, word_boundary=True, save_order=True) +def get_translations(dirname, lang): + import babel.support + return babel.support.Translations.load( + dirname=dirname, + locales=[lang, 'en'] + ) + + class PatchedMacrosPlugin(macros.plugin.MacrosPlugin): + disabled = False + def on_config(self, config): super(PatchedMacrosPlugin, self).on_config(config) self.env.comment_start_string = '{##' self.env.comment_end_string = '##}' + def on_env(self, env, config, files): + env.add_extension('jinja2.ext.i18n') + dirname = os.path.join(config.data['theme'].dirs[0], 'locale') + lang = config.data['theme']['language'] + env.install_gettext_translations( + get_translations(dirname, lang), + newstyle=True + ) + chunk_size = 10240 + env.filters['chunks'] = lambda line: [line[i:i+chunk_size] for i in range(0, len(line), chunk_size)] + return env + + def render(self, markdown): + if not self.disabled: + return self.render_impl(markdown) + else: + return markdown + + def render_impl(self, markdown): + md_template = self.env.from_string(markdown) + return md_template.render(**self.variables) + macros.plugin.MacrosPlugin = PatchedMacrosPlugin diff --git a/docs/tools/mkdocs-material-theme/partials/nav.html b/docs/tools/mkdocs-material-theme/partials/nav.html index cdc09492e54..9bf1076c349 100644 --- a/docs/tools/mkdocs-material-theme/partials/nav.html +++ b/docs/tools/mkdocs-material-theme/partials/nav.html @@ -41,7 +41,7 @@ {% if config.repo_url %}
  • - + {{ lang.t("nav.source") }}
  • diff --git a/docs/tools/mkdocs-material-theme/partials/social.html b/docs/tools/mkdocs-material-theme/partials/social.html index 89e6f0fec87..b990921bb8a 100644 --- a/docs/tools/mkdocs-material-theme/partials/social.html +++ b/docs/tools/mkdocs-material-theme/partials/social.html @@ -1,3 +1,3 @@ diff --git a/docs/tools/release.sh b/docs/tools/release.sh index bf318f17252..e0f580c383b 100755 --- a/docs/tools/release.sh +++ b/docs/tools/release.sh @@ -7,8 +7,8 @@ PUBLISH_DIR="${BASE_DIR}/../publish" BASE_DOMAIN="${BASE_DOMAIN:-clickhouse.tech}" GIT_TEST_URI="${GIT_TEST_URI:-git@github.com:ClickHouse/clickhouse.github.io.git}" GIT_PROD_URI="git@github.com:ClickHouse/clickhouse.github.io.git" -EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS:---enable-stable-releases}" -HISTORY_SIZE="${HISTORY_SIZE:-25}" +EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS:---enable-stable-releases --minify}" +HISTORY_SIZE="${HISTORY_SIZE:-5}" if [[ -z "$1" ]] then diff --git a/docs/tools/requirements.txt b/docs/tools/requirements.txt index a86e15cec19..33cf57d41bb 100644 --- a/docs/tools/requirements.txt +++ b/docs/tools/requirements.txt @@ -1,9 +1,11 @@ +Babel==2.8.0 backports-abc==0.5 backports.functools-lru-cache==1.6.1 beautifulsoup4==4.8.2 certifi==2019.11.28 chardet==3.0.4 click==7.1.1 +closure==20191111 cssmin==0.2.0 future==0.18.2 htmlmin==0.1.12 diff --git a/docs/tools/test.py b/docs/tools/test.py index bb2e19e8760..58710274543 100755 --- a/docs/tools/test.py +++ b/docs/tools/test.py @@ -26,7 +26,7 @@ def test_single_page(input_path, lang): anchor_points.add(anchor_point) for tag in soup.find_all(): href = tag.attrs.get('href') - if href and href.startswith('#'): + if href and href.startswith('#') and href != '#': if href[1:] not in anchor_points: links_to_nowhere += 1 logging.info("Tag %s", tag) diff --git a/docs/tools/translate/babel-mapping.ini b/docs/tools/translate/babel-mapping.ini new file mode 100644 index 00000000000..6a9a3e5c073 --- /dev/null +++ b/docs/tools/translate/babel-mapping.ini @@ -0,0 +1,3 @@ +[python: **.py] +[jinja2: **/templates/**.html] +extensions=jinja2.ext.i18n,jinja2.ext.autoescape,jinja2.ext.with_ diff --git a/docs/tools/translate/filter.py b/docs/tools/translate/filter.py index cf673a75d63..c0cb04f059f 100755 --- a/docs/tools/translate/filter.py +++ b/docs/tools/translate/filter.py @@ -18,7 +18,7 @@ def debug(*args): print(*args, file=sys.stderr) -def process_buffer(buffer, new_value, item=None): +def process_buffer(buffer, new_value, item=None, is_header=False): if buffer: text = ''.join(buffer) @@ -37,11 +37,17 @@ def process_buffer(buffer, new_value, item=None): if text.startswith(' ') and not translated_text.startswith(' '): translated_text = ' ' + translated_text - + if text.endswith(' ') and not translated_text.endswith(' '): translated_text = translated_text + ' ' + title_case = is_header and translate.default_target_language == 'en' and text[0].isupper() + title_case_whitelist = {'a', 'an', 'the', 'and', 'or'} for token in translated_text.split(' '): + if title_case and not token.isupper(): + if token not in title_case_whitelist: + token = token[0].upper() + token[1:] + new_value.append(pandocfilters.Str(token)) new_value.append(pandocfilters.Space()) @@ -53,12 +59,12 @@ def process_buffer(buffer, new_value, item=None): new_value.append(item) -def process_sentence(value): +def process_sentence(value, is_header=False): new_value = [] buffer = [] for item in value: if isinstance(item, list): - new_value.append([process_sentence(subitem) for subitem in item]) + new_value.append([process_sentence(subitem, is_header) for subitem in item]) continue elif isinstance(item, dict): t = item.get('t') @@ -70,11 +76,11 @@ def process_sentence(value): elif t == 'DoubleQuote': buffer.append('"') else: - process_buffer(buffer, new_value, item) + process_buffer(buffer, new_value, item, is_header) buffer = [] else: new_value.append(item) - process_buffer(buffer, new_value) + process_buffer(buffer, new_value, is_header=is_header) return new_value @@ -136,10 +142,11 @@ def translate_filter(key, value, _format, _): value[1] = process_sentence(value[1]) return cls(*value) elif key == 'Header': - # TODO: title case header in en - if '_' not in value[1][0]: # Preserve some manually specified anchors + if value[1][0].islower() and '_' not in value[1][0]: # Preserve some manually specified anchors value[1][0] = slugify.slugify(value[1][0], separator='-', word_boundary=True, save_order=True) - value[2] = process_sentence(value[2]) + + # TODO: title case header in en + value[2] = process_sentence(value[2], is_header=True) return cls(*value) elif key == 'SoftBreak': return pandocfilters.LineBreak() diff --git a/docs/tools/translate/requirements.txt b/docs/tools/translate/requirements.txt index 975498ac012..41b1db836d3 100644 --- a/docs/tools/translate/requirements.txt +++ b/docs/tools/translate/requirements.txt @@ -1,7 +1,9 @@ +Babel==2.8.0 certifi==2019.11.28 chardet==3.0.4 googletrans==2.4.0 idna==2.9 +Jinja2==2.11.1 pandocfilters==1.4.2 python-slugify==4.0.0 PyYAML==5.3.1 diff --git a/docs/tools/translate/translate.py b/docs/tools/translate/translate.py index 03445defcc6..5b4dc3f5486 100755 --- a/docs/tools/translate/translate.py +++ b/docs/tools/translate/translate.py @@ -14,12 +14,13 @@ import typograph_ru translator = googletrans.Translator() -target_language = os.environ.get('TARGET_LANGUAGE', 'ru') +default_target_language = os.environ.get('TARGET_LANGUAGE', 'ru') is_yandex = os.environ.get('YANDEX') is not None -def translate(text): +def translate(text, target_language=None): + target_language = target_language or default_target_language if target_language == 'en': return text elif target_language == 'typograph_ru': @@ -27,14 +28,16 @@ def translate(text): elif is_yandex: text = text.replace('‘', '\'') text = text.replace('’', '\'') - if text.isascii() and not text.isupper(): + has_alpha = any([char.isalpha() for char in text]) + if text.isascii() and has_alpha and not text.isupper(): text = urllib.parse.quote(text) url = f'http://translate.yandex.net/api/v1/tr.json/translate?srv=docs&lang=en-{target_language}&text={text}' result = requests.get(url).json() if result.get('code') == 200: return result['text'][0] else: - print('Failed to translate', str(result), file=sys.stderr) + result = str(result) + print(f'Failed to translate "{text}": {result}', file=sys.stderr) sys.exit(1) else: return text @@ -43,21 +46,41 @@ def translate(text): return translator.translate(text, target_language).text -def translate_toc(root): +def translate_toc(root, lang): + global is_yandex + is_yandex = True if isinstance(root, dict): result = [] for key, value in root.items(): - key = translate(key) if key != 'hidden' and not key.isupper() else key - result.append((key, translate_toc(value),)) + key = translate(key, lang) if key != 'hidden' and not key.isupper() else key + result.append((key, translate_toc(value, lang),)) return dict(result) elif isinstance(root, list): - return [translate_toc(item) for item in root] + return [translate_toc(item, lang) for item in root] elif isinstance(root, str): return root +def translate_po(): + import babel.messages.pofile + base_dir = os.path.join(os.path.dirname(__file__), '..', '..', 'website', 'locale') + for lang in ['en', 'zh', 'es', 'fr', 'ru', 'ja', 'fa']: + po_path = os.path.join(base_dir, lang, 'LC_MESSAGES', 'messages.po') + with open(po_path, 'r') as f: + po_file = babel.messages.pofile.read_po(f, locale=lang, domain='messages') + for item in po_file: + if not item.string: + global is_yandex + is_yandex = True + item.string = translate(item.id, lang) + with open(po_path, 'wb') as f: + babel.messages.pofile.write_po(f, po_file) + + if __name__ == '__main__': target_language = sys.argv[1] - is_yandex = True - result = translate_toc(yaml.full_load(sys.stdin.read())['nav']) - print(yaml.dump({'nav': result})) + if target_language == 'po': + translate_po() + else: + result = translate_toc(yaml.full_load(sys.stdin.read())['nav'], sys.argv[1]) + print(yaml.dump({'nav': result})) diff --git a/docs/tools/translate/update-po.sh b/docs/tools/translate/update-po.sh new file mode 100755 index 00000000000..bf9d1d4b7fb --- /dev/null +++ b/docs/tools/translate/update-po.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Usage: update-po.sh +set -ex +BASE_DIR=$(dirname $(readlink -f $0)) +WEBSITE_DIR="${BASE_DIR}/../../website" +LOCALE_DIR="${WEBSITE_DIR}/locale" +MESSAGES_POT="${LOCALE_DIR}/messages.pot" +BABEL_INI="${BASE_DIR}/babel-mapping.ini" +LANGS="en zh es fr ru ja fa" +source "${BASE_DIR}/venv/bin/activate" +cd "${WEBSITE_DIR}" +pybabel extract "." -o "${MESSAGES_POT}" -F "${BABEL_INI}" +for L in ${LANGS} +do + pybabel update -d locale -l "${L}" -i "${MESSAGES_POT}" || \ + pybabel init -d locale -l "${L}" -i "${MESSAGES_POT}" +done +python3 "${BASE_DIR}/translate.py" po +for L in ${LANGS} +do + pybabel compile -d locale -l "${L}" +done diff --git a/docs/tools/util.py b/docs/tools/util.py index 5715650cfd1..3dc58807612 100644 --- a/docs/tools/util.py +++ b/docs/tools/util.py @@ -3,6 +3,7 @@ import multiprocessing import os import shutil import sys +import socket import tempfile import threading @@ -25,6 +26,23 @@ def autoremoved_file(path): os.unlink(path) +@contextlib.contextmanager +def cd(new_cwd): + old_cwd = os.getcwd() + os.chdir(new_cwd) + try: + yield + finally: + os.chdir(old_cwd) + + +def get_free_port(): + with contextlib.closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.bind(('', 0)) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + return s.getsockname()[1] + + def run_function_in_parallel(func, args_list, threads=False): processes = [] exit_code = 0 diff --git a/docs/tools/website.py b/docs/tools/website.py index 60cc08a60f6..df2db26dd8a 100644 --- a/docs/tools/website.py +++ b/docs/tools/website.py @@ -1,12 +1,16 @@ +import hashlib import logging import os import shutil +import subprocess import cssmin import htmlmin import jinja2 import jsmin +import mdx_clickhouse + def copy_icons(args): logging.info('Copying icons') @@ -27,9 +31,17 @@ def build_website(args): logging.info('Building website') env = jinja2.Environment( loader=jinja2.FileSystemLoader(args.website_dir), - extensions=['jinja2_highlight.HighlightExtension'] + extensions=[ + 'jinja2.ext.i18n', + 'jinja2_highlight.HighlightExtension' + ] ) env.extend(jinja2_highlight_cssclass='syntax p-3 my-3') + translations_dir = os.path.join(args.website_dir, 'locale') + env.install_gettext_translations( + mdx_clickhouse.get_translations(translations_dir, 'en'), + newstyle=True + ) shutil.copytree( args.website_dir, @@ -37,6 +49,8 @@ def build_website(args): ignore=shutil.ignore_patterns( '*.md', '*.sh', + '*.css', + '*.js', 'build', 'docs', 'public', @@ -52,7 +66,7 @@ def build_website(args): continue path = os.path.join(root, filename) - if not (filename.endswith('.html') or filename.endswith('.css') or filename.endswith('.js')): + if not (filename.endswith('.html') or filename.endswith('.js')): continue logging.info('Processing %s', path) with open(path, 'rb') as f: @@ -65,7 +79,68 @@ def build_website(args): f.write(content.encode('utf-8')) +def get_css_in(args): + return [ + f"'{args.website_dir}/css/bootstrap.css'", + f"'{args.website_dir}/css/docsearch.css'", + f"'{args.website_dir}/css/base.css'", + f"'{args.website_dir}/css/docs.css'", + f"'{args.website_dir}/css/highlight.css'" + ] + + +def get_js_in(args): + return [ + f"'{args.website_dir}/js/jquery-3.4.1.js'", + f"'{args.website_dir}/js/popper.js'", + f"'{args.website_dir}/js/bootstrap.js'", + f"'{args.website_dir}/js/base.js'", + f"'{args.website_dir}/js/index.js'", + f"'{args.website_dir}/js/docsearch.js'", + f"'{args.website_dir}/js/docs.js'" + ] + + def minify_website(args): + css_in = ' '.join(get_css_in(args)) + css_out = f'{args.output_dir}/css/base.css' + if args.minify: + command = f"purifycss -w '*algolia*' --min {css_in} '{args.output_dir}/*.html' " \ + f"'{args.output_dir}/docs/en/**/*.html' '{args.website_dir}/js/**/*.js' > {css_out}" + else: + command = f'cat {css_in} > {css_out}' + logging.info(command) + output = subprocess.check_output(command, shell=True) + logging.debug(output) + with open(css_out, 'rb') as f: + css_digest = hashlib.sha3_224(f.read()).hexdigest()[0:8] + + js_in = get_js_in(args) + js_out = f'{args.output_dir}/js/base.js' + if args.minify: + import closure + js_in = [js[1:-1] for js in js_in] + closure_args = [ + '--js', *js_in, '--js_output_file', js_out, + '--compilation_level', 'SIMPLE', + '--dependency_mode', 'NONE', + '--third_party', '--use_types_for_optimization', + '--isolation_mode', 'IIFE', + '--create_source_map', '%outname%.map' + ] + logging.info(closure_args) + if closure.run(*closure_args): + raise RuntimeError('failed to run closure compiler') + + else: + logging.info(command) + js_in = ' '.join(js_in) + output = subprocess.check_output(f'cat {js_in} > {js_out}', shell=True) + logging.debug(output) + with open(js_out, 'rb') as f: + js_digest = hashlib.sha3_224(f.read()).hexdigest()[0:8] + logging.info(js_digest) + if args.minify: logging.info('Minifying website') for root, _, filenames in os.walk(args.output_dir): @@ -73,8 +148,7 @@ def minify_website(args): path = os.path.join(root, filename) if not ( filename.endswith('.html') or - filename.endswith('.css') or - filename.endswith('.js') + filename.endswith('.css') ): continue @@ -83,6 +157,8 @@ def minify_website(args): content = f.read().decode('utf-8') if filename.endswith('.html'): content = htmlmin.minify(content, remove_empty_space=False) + content = content.replace('base.css?css_digest', f'base.css?{css_digest}') + content = content.replace('base.js?js_digest', f'base.js?{js_digest}') elif filename.endswith('.css'): content = cssmin.cssmin(content) elif filename.endswith('.js'): diff --git a/docs/zh/getting_started/playground.md b/docs/zh/getting_started/playground.md new file mode 120000 index 00000000000..de5b41f453e --- /dev/null +++ b/docs/zh/getting_started/playground.md @@ -0,0 +1 @@ +../../en/getting_started/playground.md \ No newline at end of file diff --git a/website/404.html b/website/404.html index d7e096e75ff..31aaf6646df 100644 --- a/website/404.html +++ b/website/404.html @@ -4,12 +4,12 @@ {% block content %} {% endblock %} diff --git a/website/css/base.css b/website/css/base.css index e171339f171..4926bd3af8a 100644 --- a/website/css/base.css +++ b/website/css/base.css @@ -11,7 +11,7 @@ a:hover, a:active { text-decoration: underline; } -#logo-icon { +#logo-icon, #docs-logo-icon { width: 40px; } @@ -20,10 +20,40 @@ a:hover, a:active { margin-left: 12px; } +.display-5 { + font-size: 2rem; + font-weight: 300; + line-height: 1.2; +} + +.bg-dark-alt { + background: #36363F; +} + +.bg-dark-alt:focus { + background: #36363F; +} + .bg-secondary-alt { background: #444451; } +.bg-secondary-alt:focus { + background: #444451; +} + +.text-dark-alt { + color: #36363F; +} + +.btn-dark-alt { + background: #36363F; +} + +.btn-dark-alt:focus { + background: #36363F; +} + .btn-outline-orange { border-color: #f14600; color: #f14600; @@ -68,10 +98,11 @@ a.btn-outline-yellow { color: #fc0; } -.navbar { +.navbar-light { border-bottom: 1px solid #efefef; } + .navbar-light .navbar-nav .nav-link { color: #000; } @@ -89,6 +120,28 @@ a.btn-outline-yellow { margin-top: -1rem; } +.dropdown-item { + color: #e1e1e1 !important; +} + +.dropdown-item:hover, +.dropdown-item:focus { + background-color: #1e1e1e; +} + +.nav .dropdown-toggle::after { + vertical-align: 0; +} +.nav .dropdown-toggle[aria-expanded=false]::after { + display: inline-block; + margin-right: .255em; + vertical-align: 0; + content: ""; + border-top: .3em solid transparent; + border-right: .3em solid; + border-bottom: .3em solid transparent; +} + .dots-lb { background: #fff url('/images/dots.svg') no-repeat 0 100%; } @@ -108,5 +161,3 @@ a.btn-outline-yellow { .dots-cc { background: #fff url('/images/dots.svg') repeat-y 50% -17.5%; } - -{% include "css/highlight.css" %} diff --git a/website/css/bootstrap.css b/website/css/bootstrap.css new file mode 100644 index 00000000000..8eac957a512 --- /dev/null +++ b/website/css/bootstrap.css @@ -0,0 +1,10224 @@ +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #007bff; + --secondary: #6c757d; + --success: #28a745; + --info: #17a2b8; + --warning: #ffc107; + --danger: #dc3545; + --light: #f8f9fa; + --dark: #343a40; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +select { + word-wrap: normal; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} + +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; +} + +.blockquote-footer::before { + content: "\2014\00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #6c757d; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-wrap: break-word; +} + +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #212529; +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid, .container-sm, .container-md, .container-lg, .container-xl { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container, .container-sm { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container, .container-sm, .container-md { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container, .container-sm, .container-md, .container-lg { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container, .container-sm, .container-md, .container-lg, .container-xl { + max-width: 1140px; + } +} + +.row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.row-cols-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.row-cols-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.row-cols-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.row-cols-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.row-cols-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; +} + +.row-cols-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-sm-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-sm-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-sm-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-sm-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-sm-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-sm-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + -ms-flex-order: -1; + order: -1; + } + .order-sm-last { + -ms-flex-order: 13; + order: 13; + } + .order-sm-0 { + -ms-flex-order: 0; + order: 0; + } + .order-sm-1 { + -ms-flex-order: 1; + order: 1; + } + .order-sm-2 { + -ms-flex-order: 2; + order: 2; + } + .order-sm-3 { + -ms-flex-order: 3; + order: 3; + } + .order-sm-4 { + -ms-flex-order: 4; + order: 4; + } + .order-sm-5 { + -ms-flex-order: 5; + order: 5; + } + .order-sm-6 { + -ms-flex-order: 6; + order: 6; + } + .order-sm-7 { + -ms-flex-order: 7; + order: 7; + } + .order-sm-8 { + -ms-flex-order: 8; + order: 8; + } + .order-sm-9 { + -ms-flex-order: 9; + order: 9; + } + .order-sm-10 { + -ms-flex-order: 10; + order: 10; + } + .order-sm-11 { + -ms-flex-order: 11; + order: 11; + } + .order-sm-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-md-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-md-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-md-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-md-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-md-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-md-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + -ms-flex-order: -1; + order: -1; + } + .order-md-last { + -ms-flex-order: 13; + order: 13; + } + .order-md-0 { + -ms-flex-order: 0; + order: 0; + } + .order-md-1 { + -ms-flex-order: 1; + order: 1; + } + .order-md-2 { + -ms-flex-order: 2; + order: 2; + } + .order-md-3 { + -ms-flex-order: 3; + order: 3; + } + .order-md-4 { + -ms-flex-order: 4; + order: 4; + } + .order-md-5 { + -ms-flex-order: 5; + order: 5; + } + .order-md-6 { + -ms-flex-order: 6; + order: 6; + } + .order-md-7 { + -ms-flex-order: 7; + order: 7; + } + .order-md-8 { + -ms-flex-order: 8; + order: 8; + } + .order-md-9 { + -ms-flex-order: 9; + order: 9; + } + .order-md-10 { + -ms-flex-order: 10; + order: 10; + } + .order-md-11 { + -ms-flex-order: 11; + order: 11; + } + .order-md-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-lg-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-lg-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-lg-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-lg-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-lg-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-lg-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + -ms-flex-order: -1; + order: -1; + } + .order-lg-last { + -ms-flex-order: 13; + order: 13; + } + .order-lg-0 { + -ms-flex-order: 0; + order: 0; + } + .order-lg-1 { + -ms-flex-order: 1; + order: 1; + } + .order-lg-2 { + -ms-flex-order: 2; + order: 2; + } + .order-lg-3 { + -ms-flex-order: 3; + order: 3; + } + .order-lg-4 { + -ms-flex-order: 4; + order: 4; + } + .order-lg-5 { + -ms-flex-order: 5; + order: 5; + } + .order-lg-6 { + -ms-flex-order: 6; + order: 6; + } + .order-lg-7 { + -ms-flex-order: 7; + order: 7; + } + .order-lg-8 { + -ms-flex-order: 8; + order: 8; + } + .order-lg-9 { + -ms-flex-order: 9; + order: 9; + } + .order-lg-10 { + -ms-flex-order: 10; + order: 10; + } + .order-lg-11 { + -ms-flex-order: 11; + order: 11; + } + .order-lg-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-xl-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-xl-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-xl-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-xl-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-xl-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-xl-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + -ms-flex-order: -1; + order: -1; + } + .order-xl-last { + -ms-flex-order: 13; + order: 13; + } + .order-xl-0 { + -ms-flex-order: 0; + order: 0; + } + .order-xl-1 { + -ms-flex-order: 1; + order: 1; + } + .order-xl-2 { + -ms-flex-order: 2; + order: 2; + } + .order-xl-3 { + -ms-flex-order: 3; + order: 3; + } + .order-xl-4 { + -ms-flex-order: 4; + order: 4; + } + .order-xl-5 { + -ms-flex-order: 5; + order: 5; + } + .order-xl-6 { + -ms-flex-order: 6; + order: 6; + } + .order-xl-7 { + -ms-flex-order: 7; + order: 7; + } + .order-xl-8 { + -ms-flex-order: 8; + order: 8; + } + .order-xl-9 { + -ms-flex-order: 9; + order: 9; + } + .order-xl-10 { + -ms-flex-order: 10; + order: 10; + } + .order-xl-11 { + -ms-flex-order: 11; + order: 11; + } + .order-xl-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529; +} + +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; +} + +.table tbody + tbody { + border-top: 2px solid #dee2e6; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #dee2e6; +} + +.table-bordered th, +.table-bordered td { + border: 1px solid #dee2e6; +} + +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + color: #212529; + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8daff; +} + +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7abaff; +} + +.table-hover .table-primary:hover { + background-color: #9fcdff; +} + +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #9fcdff; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #d6d8db; +} + +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #b3b7bb; +} + +.table-hover .table-secondary:hover { + background-color: #c8cbcf; +} + +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #c8cbcf; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c3e6cb; +} + +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; +} + +.table-hover .table-success:hover { + background-color: #b1dfbb; +} + +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #b1dfbb; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #bee5eb; +} + +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #86cfda; +} + +.table-hover .table-info:hover { + background-color: #abdde5; +} + +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #abdde5; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #ffeeba; +} + +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #ffdf7e; +} + +.table-hover .table-warning:hover { + background-color: #ffe8a1; +} + +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #ffe8a1; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5c6cb; +} + +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed969e; +} + +.table-hover .table-danger:hover { + background-color: #f1b0b7; +} + +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f1b0b7; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fdfdfe; +} + +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfc; +} + +.table-hover .table-light:hover { + background-color: #ececf6; +} + +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #ececf6; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #c6c8ca; +} + +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #95999c; +} + +.table-hover .table-dark:hover { + background-color: #b9bbbe; +} + +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #b9bbbe; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55; +} + +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.table-dark { + color: #fff; + background-color: #343a40; +} + +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #454d55; +} + +.table-dark.table-bordered { + border: 0; +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + font-size: 1rem; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} + +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} + +.form-row > .col, +.form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} + +.form-check-input[disabled] ~ .form-check-label, +.form-check-input:disabled ~ .form-check-label { + color: #6c757d; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-align: center; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #28a745; +} + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #28a745; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57; +} + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #dc3545; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #dc3545; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e4606d; + background-color: #e4606d; +} + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.form-inline { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; +} + +.form-inline .form-check { + width: 100%; +} + +@media (min-width: 576px) { + .form-inline label { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} + +.btn:hover { + color: #212529; + text-decoration: none; +} + +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: 0.65; +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; +} + +.btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0062cc; + border-color: #005cbf; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:hover { + color: #fff; + background-color: #5a6268; + border-color: #545b62; +} + +.btn-secondary:focus, .btn-secondary.focus { + color: #fff; + background-color: #5a6268; + border-color: #545b62; + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #545b62; + border-color: #4e555b; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34; +} + +.btn-success:focus, .btn-success.focus { + color: #fff; + background-color: #218838; + border-color: #1e7e34; + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b; +} + +.btn-info:focus, .btn-info.focus { + color: #fff; + background-color: #138496; + border-color: #117a8b; + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #117a8b; + border-color: #10707f; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-warning { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:hover { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; +} + +.btn-warning:focus, .btn-warning.focus { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: #212529; + background-color: #d39e00; + border-color: #c69500; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130; +} + +.btn-danger:focus, .btn-danger.focus { + color: #fff; + background-color: #c82333; + border-color: #bd2130; + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #bd2130; + border-color: #b21f2d; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-light { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:hover { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; +} + +.btn-light:focus, .btn-light.focus { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #dae0e5; + border-color: #d3d9df; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; +} + +.btn-dark:focus, .btn-dark.focus { + color: #fff; + background-color: #23272b; + border-color: #1d2124; + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1d2124; + border-color: #171a1d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-outline-primary { + color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #007bff; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-success { + color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:hover { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-link { + font-weight: 400; + color: #007bff; + text-decoration: none; +} + +.btn-link:hover { + color: #0056b3; + text-decoration: underline; +} + +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} + +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} + +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-left { + right: auto; + left: 0; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} + +.dropleft .dropdown-toggle::after { + display: none; +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} + +.dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff; +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} + +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} + +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: center; + justify-content: center; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} + +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} + +.btn-group-toggle > .btn input[type="radio"], +.btn-group-toggle > .btn input[type="checkbox"], +.btn-group-toggle > .btn-group > .btn input[type="radio"], +.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; +} + +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + -ms-flex: 1 1 0%; + flex: 1 1 0%; + min-width: 0; + margin-bottom: 0; +} + +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} + +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} + +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} + +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group > .custom-file { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; +} + +.input-group > .custom-file:not(:last-child) .custom-file-label, +.input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: -ms-flexbox; + display: flex; +} + +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} + +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} + +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.input-group-text input[type="radio"], +.input-group-text input[type="checkbox"] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + left: 0; + z-index: -1; + width: 1rem; + height: 1.25rem; + opacity: 0; +} + +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #007bff; + background-color: #007bff; +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #80bdff; +} + +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #b3d7ff; + border-color: #b3d7ff; +} + +.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; +} + +.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} + +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; +} + +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: no-repeat 50% / 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #007bff; + background-color: #007bff; +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} + +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} + +.custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} + +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + -webkit-transform: translateX(0.75rem); + transform: translateX(0.75rem); +} + +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + display: none; +} + +.custom-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; +} + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + opacity: 0; +} + +.custom-file-input:focus ~ .custom-file-label { + border-color: #80bdff; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-file-input[disabled] ~ .custom-file-label, +.custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef; +} + +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} + +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: 1.4rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-range:focus { + outline: none; +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range::-moz-focus-outer { + border: 0; +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} + +.custom-range::-moz-range-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + -ms-transition: none; + transition: none; + } +} + +.custom-range::-ms-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-moz-range-track { + cursor: default; +} + +.custom-range:disabled::-ms-thumb { + background-color: #adb5bd; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; + } +} + +.nav { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} + +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #007bff; +} + +.nav-fill .nav-item { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 0.5rem 1rem; +} + +.navbar .container, +.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} + +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} + +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} + +.navbar-expand { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { + padding-right: 0; + padding-left: 0; +} + +.navbar-expand .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; +} + +.navbar-expand .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; +} + +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-text a { + color: #fff; +} + +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} + +.card > hr { + margin-right: 0; + margin-left: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + min-height: 1px; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img, +.card-img-top, +.card-img-bottom { + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group > .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-group { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion > .card { + overflow: hidden; +} + +.accordion > .card:not(:last-of-type) { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.accordion > .card:not(:first-of-type) { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.accordion > .card > .card-header { + border-radius: 0; + margin-bottom: -1px; +} + +.breadcrumb { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} + +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #6c757d; + content: "/"; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} + +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6; +} + +.page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.page-link:focus { + z-index: 3; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .badge { + transition: none; + } +} + +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #fff; + background-color: #007bff; +} + +a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #0062cc; +} + +a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.badge-secondary { + color: #fff; + background-color: #6c757d; +} + +a.badge-secondary:hover, a.badge-secondary:focus { + color: #fff; + background-color: #545b62; +} + +a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.badge-success { + color: #fff; + background-color: #28a745; +} + +a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #1e7e34; +} + +a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.badge-info { + color: #fff; + background-color: #17a2b8; +} + +a.badge-info:hover, a.badge-info:focus { + color: #fff; + background-color: #117a8b; +} + +a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.badge-warning { + color: #212529; + background-color: #ffc107; +} + +a.badge-warning:hover, a.badge-warning:focus { + color: #212529; + background-color: #d39e00; +} + +a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.badge-danger { + color: #fff; + background-color: #dc3545; +} + +a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #bd2130; +} + +a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.badge-light { + color: #212529; + background-color: #f8f9fa; +} + +a.badge-light:hover, a.badge-light:focus { + color: #212529; + background-color: #dae0e5; +} + +a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.badge-dark { + color: #fff; + background-color: #343a40; +} + +a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #1d2124; +} + +a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; +} + +.alert-primary hr { + border-top-color: #9fcdff; +} + +.alert-primary .alert-link { + color: #002752; +} + +.alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; +} + +.alert-secondary hr { + border-top-color: #c8cbcf; +} + +.alert-secondary .alert-link { + color: #202326; +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; +} + +.alert-success hr { + border-top-color: #b1dfbb; +} + +.alert-success .alert-link { + color: #0b2e13; +} + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; +} + +.alert-info hr { + border-top-color: #abdde5; +} + +.alert-info .alert-link { + color: #062c33; +} + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; +} + +.alert-warning hr { + border-top-color: #ffe8a1; +} + +.alert-warning .alert-link { + color: #533f03; +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; +} + +.alert-danger hr { + border-top-color: #f1b0b7; +} + +.alert-danger .alert-link { + color: #491217; +} + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe; +} + +.alert-light hr { + border-top-color: #ececf6; +} + +.alert-light .alert-link { + color: #686868; +} + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca; +} + +.alert-dark hr { + border-top-color: #b9bbbe; +} + +.alert-dark .alert-link { + color: #040505; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + transition: width 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.media { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; +} + +.media-body { + -ms-flex: 1; + flex: 1; +} + +.list-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} + +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.list-group-item + .list-group-item { + border-top-width: 0; +} + +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + -ms-flex-direction: row; + flex-direction: row; +} + +.list-group-horizontal .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} + +.list-group-horizontal .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} + +.list-group-horizontal .list-group-item.active { + margin-top: 0; +} + +.list-group-horizontal .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} + +.list-group-horizontal .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-sm .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-md .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-lg .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xl .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +.list-group-flush .list-group-item { + border-right-width: 0; + border-left-width: 0; + border-radius: 0; +} + +.list-group-flush .list-group-item:first-child { + border-top-width: 0; +} + +.list-group-flush:last-child .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #004085; + background-color: #b8daff; +} + +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #004085; + background-color: #9fcdff; +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #004085; + border-color: #004085; +} + +.list-group-item-secondary { + color: #383d41; + background-color: #d6d8db; +} + +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #383d41; + background-color: #c8cbcf; +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #383d41; + border-color: #383d41; +} + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb; +} + +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb; +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724; +} + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb; +} + +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #0c5460; + background-color: #abdde5; +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460; +} + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba; +} + +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #856404; + background-color: #ffe8a1; +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #856404; + border-color: #856404; +} + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb; +} + +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #721c24; + background-color: #f1b0b7; +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #721c24; + border-color: #721c24; +} + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe; +} + +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #818182; + background-color: #ececf6; +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818182; + border-color: #818182; +} + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca; +} + +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #1b1e21; + background-color: #b9bbbe; +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} + +.close:hover { + color: #000; + text-decoration: none; +} + +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; +} + +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast.showing { + opacity: 1; +} + +.toast.show { + display: block; + opacity: 1; +} + +.toast.hide { + display: none; +} + +.toast-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} + +.modal.fade .modal-dialog { + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px); +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} + +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none; +} + +.modal.modal-static .modal-dialog { + -webkit-transform: scale(1.02); + transform: scale(1.02); +} + +.modal-dialog-scrollable { + display: -ms-flexbox; + display: flex; + max-height: calc(100% - 1rem); +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; +} + +.modal-dialog-scrollable .modal-header, +.modal-dialog-scrollable .modal-footer { + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: ""; +} + +.modal-dialog-centered.modal-dialog-scrollable { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + height: 100%; +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none; +} + +.modal-content { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); +} + +.modal-footer > * { + margin: 0.25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); + } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); + } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 0.9; +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; +} + +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; +} + +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; +} + +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; +} + +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; +} + +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; +} + +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} + +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; +} + +.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc(-0.5rem - 1px); +} + +.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; +} + +.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; +} + +.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc(-0.5rem - 1px); +} + +.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; +} + +.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} + +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + -ms-touch-action: pan-y; + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + -webkit-transform: none; + transform: none; +} + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} + +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50% / 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators li { + box-sizing: content-box; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} + +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: spinner-grow .75s linear infinite; + animation: spinner-grow .75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #007bff !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0062cc !important; +} + +.bg-secondary { + background-color: #6c757d !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #545b62 !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #1d2124 !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-right { + border-right: 1px solid #dee2e6 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-left { + border-left: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #007bff !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.border-white { + border-color: #fff !important; +} + +.rounded-sm { + border-radius: 0.2rem !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-lg { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-print-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} + +.embed-responsive::before { + display: block; + content: ""; +} + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.857143%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} + +.flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} + +.flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} + +.justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .float-sm-none { + float: none !important; + } +} + +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .float-md-none { + float: none !important; + } +} + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .float-lg-none { + float: none !important; + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .float-xl-none { + float: none !important; + } +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + .m-sm-n1 { + margin: -0.25rem !important; + } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; + } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; + } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; + } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; + } + .m-sm-n2 { + margin: -0.5rem !important; + } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; + } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; + } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; + } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; + } + .m-sm-n3 { + margin: -1rem !important; + } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; + } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; + } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; + } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; + } + .m-sm-n4 { + margin: -1.5rem !important; + } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; + } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; + } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; + } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; + } + .m-sm-n5 { + margin: -3rem !important; + } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; + } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; + } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; + } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + .p-md-0 { + padding: 0 !important; + } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + .m-md-n1 { + margin: -0.25rem !important; + } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; + } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; + } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; + } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; + } + .m-md-n2 { + margin: -0.5rem !important; + } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; + } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; + } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; + } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; + } + .m-md-n3 { + margin: -1rem !important; + } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; + } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; + } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; + } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; + } + .m-md-n4 { + margin: -1.5rem !important; + } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; + } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; + } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; + } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; + } + .m-md-n5 { + margin: -3rem !important; + } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; + } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; + } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; + } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + .m-lg-n1 { + margin: -0.25rem !important; + } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; + } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; + } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; + } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; + } + .m-lg-n2 { + margin: -0.5rem !important; + } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; + } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; + } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; + } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; + } + .m-lg-n3 { + margin: -1rem !important; + } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; + } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; + } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; + } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; + } + .m-lg-n4 { + margin: -1.5rem !important; + } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; + } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; + } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; + } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; + } + .m-lg-n5 { + margin: -3rem !important; + } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; + } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; + } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; + } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + .m-xl-n1 { + margin: -0.25rem !important; + } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; + } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; + } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; + } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; + } + .m-xl-n2 { + margin: -0.5rem !important; + } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; + } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; + } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; + } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; + } + .m-xl-n3 { + margin: -1rem !important; + } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; + } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; + } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; + } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; + } + .m-xl-n4 { + margin: -1.5rem !important; + } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; + } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; + } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; + } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; + } + .m-xl-n5 { + margin: -3rem !important; + } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; + } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; + } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; + } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #fff !important; +} + +.text-primary { + color: #007bff !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #0056b3 !important; +} + +.text-secondary { + color: #6c757d !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #494f54 !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #19692c !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:hover, a.text-info:focus { + color: #0f6674 !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #ba8b00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #a71d2a !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:hover, a.text-light:focus { + color: #cbd3da !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #121416 !important; +} + +.text-body { + color: #212529 !important; +} + +.text-muted { + color: #6c757d !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; + } + a:not(.btn) { + text-decoration: underline; + } + abbr[title]::after { + content: " (" attr(title) ")"; + } + pre { + white-space: pre-wrap !important; + } + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + @page { + size: a3; + } + body { + min-width: 992px !important; + } + .container { + min-width: 992px !important; + } + .navbar { + display: none; + } + .badge { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; + } + .table-dark { + color: inherit; + } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dee2e6; + } + .table .thead-dark th { + color: inherit; + border-color: #dee2e6; + } +} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/website/css/docs.css b/website/css/docs.css new file mode 100644 index 00000000000..64645e3b1e4 --- /dev/null +++ b/website/css/docs.css @@ -0,0 +1,189 @@ +#sidebar { + position: fixed; + z-index: 50; + left: 0; +} + +#toc.toc-right { + position: fixed; +} + +#languages-dropdown .disabled { + color: #666 !important; +} + +.toc-right { + right: 0; +} + +#sidebar-nav .nav-link.active { + font-weight: bold; +} + +.headerlink { + display: none; + text-decoration: none !important; + margin-left: .5rem; +} + +#content { + overflow-x: scroll; +} + +#content table { + border: 1px solid #dee2e6; + width: 100%; + margin-bottom: 1rem; + overflow-x: auto; +} + +#content thead { + background: #444451; + color: #fff; +} + +#content td, #content th { + padding: .75rem; + vertical-align: top; +} + +#content td { + border: 1px solid #dee2e6; +} + +#content th { + border: 1px solid #444451; +} + +#content code { + color: #111; + background: #eee; + padding: 2px; +} + + +#content pre { + background: #eee; + padding: 1rem; +} + +#docsearch-input:focus, #docsearch-input:active { + border: 0; + color: #efefef!important; +} + +@media (max-width: 768px) { + #search-form { + width: 50%; + } + .algolia-autocomplete, #docsearch-input, #search-form .input-group { + width: 100%; + } +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { + display: none !important; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content { + float: none !important; + width: 100% !important; + background-color: #444451; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content:before { + content: none !important; +} + +.algolia-autocomplete .ds-dropdown-menu { + max-height: 512px; + overflow-x: hidden; + overflow-y: auto; +} + +.algolia-autocomplete .ds-dropdown-menu, +.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-], +.algolia-autocomplete .algolia-docsearch-suggestion, +.algolia-autocomplete .ds-dropdown-menu:before { + background: #1c1c1c !important; + border-color: #333; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header, +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column, +.algolia-autocomplete .algolia-docsearch-suggestion--title, +.algolia-autocomplete .algolia-docsearch-suggestion--text { + color: #efefef; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + color: #f14600; +} + +#toc .nav-link { + color: #333; +} + +.toc-left, #toc.toc-left .nav-link { + color: #efefef; +} + +#toc .nav { + flex-wrap: nowrap !important; +} + +.toc-muted { + color: #888 !important; +} + +#toc .nav-link:hover { + color: #f14600 !important; +} + +@media print { + body { + min-width: 0!important; + } + #content-wrapper { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } +} + +@media (prefers-color-scheme: dark) { + body[data-spy] { + background: #1c1c1c; + color: #efefef; + } + + #sidebar { + background: #333; + } + + #content table { + border: 1px solid #2a2b2c; + } + + #content thead { + background: #333; + } + + #content td { + border: 1px solid #444451; + } + #content code { + background: #444; + color: #eee; + } + + #content pre { + background: #444; + color: #eee; + } + + #toc .nav-link { + color: #bbb; + } +} + diff --git a/website/css/docsearch.css b/website/css/docsearch.css new file mode 100644 index 00000000000..dc3c442d356 --- /dev/null +++ b/website/css/docsearch.css @@ -0,0 +1,556 @@ +.searchbox { + display: inline-block; + position: relative; + width: 200px; + height: 32px !important; + white-space: nowrap; + box-sizing: border-box; + visibility: visible !important; +} + +.searchbox .algolia-autocomplete { + display: block; + width: 100%; + height: 100%; +} + +.searchbox__wrapper { + width: 100%; + height: 100%; + z-index: 999; + position: relative; +} + +.searchbox__input { + display: inline-block; + box-sizing: border-box; + transition: box-shadow 0.4s ease, background 0.4s ease; + border: 0; + border-radius: 16px; + box-shadow: inset 0 0 0 1px #cccccc; + background: #ffffff !important; + padding: 0; + padding-right: 26px; + padding-left: 32px; + width: 100%; + height: 100%; + vertical-align: middle; + white-space: normal; + font-size: 12px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.searchbox__input::-webkit-search-decoration, .searchbox__input::-webkit-search-cancel-button, .searchbox__input::-webkit-search-results-button, .searchbox__input::-webkit-search-results-decoration { + display: none; +} + +.searchbox__input:hover { + box-shadow: inset 0 0 0 1px #b3b3b3; +} + +.searchbox__input:focus, .searchbox__input:active { + outline: 0; + box-shadow: inset 0 0 0 1px #aaaaaa; + background: #ffffff; +} + +.searchbox__input::-webkit-input-placeholder { + color: #aaaaaa; +} + +.searchbox__input:-ms-input-placeholder { + color: #aaaaaa; +} + +.searchbox__input::-ms-input-placeholder { + color: #aaaaaa; +} + +.searchbox__input::placeholder { + color: #aaaaaa; +} + +.searchbox__submit { + position: absolute; + top: 0; + margin: 0; + border: 0; + border-radius: 16px 0 0 16px; + background-color: rgba(69, 142, 225, 0); + padding: 0; + width: 32px; + height: 100%; + vertical-align: middle; + text-align: center; + font-size: inherit; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + right: inherit; + left: 0; +} + +.searchbox__submit::before { + display: inline-block; + margin-right: -4px; + height: 100%; + vertical-align: middle; + content: ''; +} + +.searchbox__submit:hover, .searchbox__submit:active { + cursor: pointer; +} + +.searchbox__submit:focus { + outline: 0; +} + +.searchbox__submit svg { + width: 14px; + height: 14px; + vertical-align: middle; + fill: #6d7e96; +} + +.searchbox__reset { + display: block; + position: absolute; + top: 8px; + right: 8px; + margin: 0; + border: 0; + background: none; + cursor: pointer; + padding: 0; + font-size: inherit; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + fill: rgba(0, 0, 0, 0.5); +} + +.searchbox__reset.hide { + display: none; +} + +.searchbox__reset:focus { + outline: 0; +} + +.searchbox__reset svg { + display: block; + margin: 4px; + width: 8px; + height: 8px; +} + +.searchbox__input:valid ~ .searchbox__reset { + display: block; + -webkit-animation-name: sbx-reset-in; + animation-name: sbx-reset-in; + -webkit-animation-duration: 0.15s; + animation-duration: 0.15s; +} + +@-webkit-keyframes sbx-reset-in { + 0% { + -webkit-transform: translate3d(-20%, 0, 0); + transform: translate3d(-20%, 0, 0); + opacity: 0; + } + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes sbx-reset-in { + 0% { + -webkit-transform: translate3d(-20%, 0, 0); + transform: translate3d(-20%, 0, 0); + opacity: 0; + } + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu { + right: 0 !important; + left: inherit !important; +} + +.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before { + right: 48px; +} + +.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu { + left: 0 !important; + right: inherit !important; +} + +.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before { + left: 48px; +} + +.algolia-autocomplete .ds-dropdown-menu { + position: relative; + top: -6px; + border-radius: 4px; + margin: 6px 0 0; + padding: 0; + text-align: left; + height: auto; + position: relative; + background: transparent; + border: none; + z-index: 999; + max-width: 600px; + min-width: 500px; + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2), 0 2px 3px 0 rgba(0, 0, 0, 0.1); +} + +.algolia-autocomplete .ds-dropdown-menu:before { + display: block; + position: absolute; + content: ''; + width: 14px; + height: 14px; + background: #fff; + z-index: 1000; + top: -7px; + border-top: 1px solid #d9d9d9; + border-right: 1px solid #d9d9d9; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + border-radius: 2px; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestions { + position: relative; + z-index: 1000; + margin-top: 8px; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover { + text-decoration: none; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestion { + cursor: pointer; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple { + background-color: rgba(69, 142, 225, 0.05); +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content { + background-color: rgba(69, 142, 225, 0.05); +} + +.algolia-autocomplete .ds-dropdown-menu [class^='ds-dataset-'] { + position: relative; + border: solid 1px #d9d9d9; + background: #fff; + border-radius: 4px; + overflow: auto; + padding: 0 8px 8px; +} + +.algolia-autocomplete .ds-dropdown-menu * { + box-sizing: border-box; +} + +.algolia-autocomplete .algolia-docsearch-suggestion { + display: block; + position: relative; + padding: 0 8px; + background: #fff; + color: #02060c; + overflow: hidden; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + color: #174d8c; + background: rgba(143, 187, 237, 0.1); + padding: 0.1em 0.05em; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 +.algolia-docsearch-suggestion--highlight, +.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 +.algolia-docsearch-suggestion--highlight { + padding: 0 0 1px; + background: inherit; + box-shadow: inset 0 -2px 0 0 rgba(69, 142, 225, 0.8); + color: inherit; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + padding: 0 0 1px; + background: inherit; + box-shadow: inset 0 -2px 0 0 rgba(69, 142, 225, 0.8); + color: inherit; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content { + display: block; + float: right; + width: 70%; + position: relative; + padding: 5.33333px 0 5.33333px 10.66667px; + cursor: pointer; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content:before { + content: ''; + position: absolute; + display: block; + top: 0; + height: 100%; + width: 1px; + background: #ddd; + left: -1px; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header { + position: relative; + border-bottom: 1px solid #ddd; + display: none; + margin-top: 8px; + padding: 4px 0; + font-size: 1em; + color: #33363d; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--wrapper { + width: 100%; + float: left; + padding: 8px 0 0 0; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { + float: left; + width: 30%; + padding-left: 0; + text-align: right; + position: relative; + padding: 5.33333px 10.66667px; + color: #a4a7ae; + font-size: 0.9em; + word-wrap: break-word; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before { + content: ''; + position: absolute; + display: block; + top: 0; + height: 100%; + width: 1px; + background: #ddd; + right: 0; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline { + display: none; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--title { + margin-bottom: 4px; + color: #02060c; + font-size: 0.9em; + font-weight: bold; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--text { + display: block; + line-height: 1.2em; + font-size: 0.85em; + color: #63676d; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--no-results { + width: 100%; + padding: 8px 0; + text-align: center; + font-size: 1.2em; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--no-results::before { + display: none; +} + +.algolia-autocomplete .algolia-docsearch-suggestion code { + padding: 1px 5px; + font-size: 90%; + border: none; + color: #222222; + background-color: #ebebeb; + border-radius: 3px; + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; +} + +.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight { + background: none; +} + +.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header { + display: block; +} + +.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary { + display: block; +} + +@media all and (min-width: 768px) { + .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column { + display: block; + } +} + +@media all and (max-width: 768px) { + .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column { + display: inline-block; + width: auto; + text-align: left; + float: left; + padding: 0; + color: #02060c; + font-size: 0.9em; + font-weight: bold; + text-align: left; + opacity: 0.5; + } + .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before { + display: none; + } + .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after { + content: '|'; + } + .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content { + display: inline-block; + width: auto; + text-align: left; + float: left; + padding: 0; + } + .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before { + display: none; + } +} + +.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion { + border-bottom: solid 1px #eee; + padding: 8px; + margin: 0; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content { + width: 100%; + padding: 0; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content::before { + display: none; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header { + margin: 0; + padding: 0; + display: block; + width: 100%; + border: none; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0 { + opacity: 0.6; + font-size: 0.85em; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1 { + opacity: 0.6; + font-size: 0.85em; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1::before { + background-image: url('data:image/svg+xml;utf8,'); + content: ''; + width: 10px; + height: 10px; + display: inline-block; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper { + width: 100%; + float: left; + margin: 0; + padding: 0; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content, .algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline { + display: none !important; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title { + margin: 0; + color: #458ee1; + font-size: 0.9em; + font-weight: normal; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title::before { + content: '#'; + font-weight: bold; + color: #458ee1; + display: inline-block; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text { + margin: 4px 0 0; + display: block; + line-height: 1.4em; + padding: 5.33333px 8px; + background: #f8f8f8; + font-size: 0.85em; + opacity: 0.8; +} + +.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + color: #3f4145; + font-weight: bold; + box-shadow: none; +} + +.algolia-autocomplete .algolia-docsearch-footer { + width: 134px; + height: 20px; + z-index: 2000; + margin-top: 10.66667px; + float: right; + font-size: 0; + line-height: 0; +} + +.algolia-autocomplete .algolia-docsearch-footer--logo { + background-image: url("data:image/svg+xml,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199c-.295 0-.596.021-.897.069a2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874c-.41.089-1.034.19-1.868.314-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525.26-.45.608-.819 1.047-1.106.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483.158.56.233 1.175.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164-.514.089-.938.191-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423.685.286 1.274.69 1.753 1.216a5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503-.276-.127-.47-.218-.582-.271a13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729c3.518 0 6.372-2.85 6.372-6.368a6.358 6.358 0 0 0-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E%0A"); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; + overflow: hidden; + text-indent: -9000px; + padding: 0 !important; + width: 100%; + height: 100%; + display: block; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRvY3NlYXJjaC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxzQkFBc0I7RUFDdEIsbUJBQW1CO0VBQ25CLGFBQWE7RUFDYix3QkFBd0I7RUFDeEIsb0JBQW9CO0VBQ3BCLHVCQUF1QjtFQUN2QiwrQkFBK0I7Q0FDaEM7O0FBRUQ7RUFDRSxlQUFlO0VBQ2YsWUFBWTtFQUNaLGFBQWE7Q0FDZDs7QUFFRDtFQUNFLFlBQVk7RUFDWixhQUFhO0VBQ2IsYUFBYTtFQUNiLG1CQUFtQjtDQUNwQjs7QUFFRDtFQUNFLHNCQUFzQjtFQUN0Qix1QkFBdUI7RUFDdkIsdURBQXVEO0VBQ3ZELFVBQVU7RUFDVixvQkFBb0I7RUFDcEIsb0NBQW9DO0VBQ3BDLCtCQUErQjtFQUMvQixXQUFXO0VBQ1gsb0JBQW9CO0VBQ3BCLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osYUFBYTtFQUNiLHVCQUF1QjtFQUN2QixvQkFBb0I7RUFDcEIsZ0JBQWdCO0VBQ2hCLHlCQUFpQjtLQUFqQixzQkFBaUI7VUFBakIsaUJBQWlCO0NBQ2xCOztBQUVEO0VBQ0UsY0FBYztDQUNmOztBQUVEO0VBQ0Usb0NBQW9DO0NBQ3JDOztBQUVEO0VBQ0UsV0FBVztFQUNYLG9DQUFvQztFQUNwQyxvQkFBb0I7Q0FDckI7O0FBRUQ7RUFDRSxlQUFlO0NBQ2hCOztBQUZEO0VBQ0UsZUFBZTtDQUNoQjs7QUFGRDtFQUNFLGVBQWU7Q0FDaEI7O0FBRkQ7RUFDRSxlQUFlO0NBQ2hCOztBQUVEO0VBQ0UsbUJBQW1CO0VBQ25CLE9BQU87RUFDUCxVQUFVO0VBQ1YsVUFBVTtFQUNWLDZCQUE2QjtFQUM3Qix3Q0FBd0M7RUFDeEMsV0FBVztFQUNYLFlBQVk7RUFDWixhQUFhO0VBQ2IsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsMEJBQWtCO0tBQWxCLHVCQUFrQjtNQUFsQixzQkFBa0I7VUFBbEIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixRQUFRO0NBQ1Q7O0FBRUQ7RUFDRSxzQkFBc0I7RUFDdEIsbUJBQW1CO0VBQ25CLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsWUFBWTtDQUNiOztBQUVEO0VBQ0UsZ0JBQWdCO0NBQ2pCOztBQUVEO0VBQ0UsV0FBVztDQUNaOztBQUVEO0VBQ0UsWUFBWTtFQUNaLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsY0FBYztDQUNmOztBQUVEO0VBQ0UsZUFBZTtFQUNmLG1CQUFtQjtFQUNuQixTQUFTO0VBQ1QsV0FBVztFQUNYLFVBQVU7RUFDVixVQUFVO0VBQ1YsaUJBQWlCO0VBQ2pCLGdCQUFnQjtFQUNoQixXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLDBCQUFrQjtLQUFsQix1QkFBa0I7TUFBbEIsc0JBQWtCO1VBQWxCLGtCQUFrQjtFQUNsQix5QkFBeUI7Q0FDMUI7O0FBRUQ7RUFDRSxjQUFjO0NBQ2Y7O0FBRUQ7RUFDRSxXQUFXO0NBQ1o7O0FBRUQ7RUFDRSxlQUFlO0VBQ2YsWUFBWTtFQUNaLFdBQVc7RUFDWCxZQUFZO0NBQ2I7O0FBRUQ7RUFDRSxlQUFlO0VBQ2YscUNBQTZCO1VBQTdCLDZCQUE2QjtFQUM3QixrQ0FBMEI7VUFBMUIsMEJBQTBCO0NBQzNCOztBQUVEO0VBQ0U7SUFDRSwyQ0FBbUM7WUFBbkMsbUNBQW1DO0lBQ25DLFdBQVc7R0FDWjtFQUNEO0lBQ0Usd0JBQWdCO1lBQWhCLGdCQUFnQjtJQUNoQixXQUFXO0dBQ1o7Q0FDRjs7QUFURDtFQUNFO0lBQ0UsMkNBQW1DO1lBQW5DLG1DQUFtQztJQUNuQyxXQUFXO0dBQ1o7RUFDRDtJQUNFLHdCQUFnQjtZQUFoQixnQkFBZ0I7SUFDaEIsV0FBVztHQUNaO0NBQ0Y7O0FBRUQ7RUFDRSxvQkFBb0I7RUFDcEIseUJBQXlCO0NBQzFCOztBQUVEO0VBQ0UsWUFBWTtDQUNiOztBQUVEO0VBQ0UsbUJBQW1CO0VBQ25CLDBCQUEwQjtDQUMzQjs7QUFFRDtFQUNFLFdBQVc7Q0FDWjs7QUFFRDtFQUNFLG1CQUFtQjtFQUNuQixVQUFVO0VBQ1YsbUJBQW1CO0VBQ25CLGdCQUFnQjtFQUNoQixXQUFXO0VBQ1gsaUJBQWlCO0VBQ2pCLGFBQWE7RUFDYixtQkFBbUI7RUFDbkIsd0JBQXdCO0VBQ3hCLGFBQWE7RUFDYixhQUFhO0VBQ2IsaUJBQWlCO0VBQ2pCLGlCQUFpQjtFQUNqQix5RUFBeUU7Q0FDMUU7O0FBRUQ7RUFDRSxlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixZQUFZO0VBQ1osYUFBYTtFQUNiLGlCQUFpQjtFQUNqQixjQUFjO0VBQ2QsVUFBVTtFQUNWLDhCQUE4QjtFQUM5QixnQ0FBZ0M7RUFDaEMsa0NBQTBCO1VBQTFCLDBCQUEwQjtFQUMxQixtQkFBbUI7Q0FDcEI7O0FBRUQ7RUFDRSxtQkFBbUI7RUFDbkIsY0FBYztFQUNkLGdCQUFnQjtDQUNqQjs7QUFFRDtFQUNFLHNCQUFzQjtDQUN2Qjs7QUFFRDtFQUNFLGdCQUFnQjtDQUNqQjs7QUFFRDtFQUNFLDJDQUEyQztDQUM1Qzs7QUFFRDtFQUNFLDJDQUEyQztDQUM1Qzs7QUFFRDtFQUNFLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQixlQUFlO0VBQ2YsbUJBQW1CO0NBQ3BCOztBQUVEO0VBQ0UsdUJBQXVCO0NBQ3hCOztBQUVEO0VBQ0UsZUFBZTtFQUNmLG1CQUFtQjtFQUNuQixlQUFlO0VBQ2YsaUJBQWlCO0VBQ2pCLGVBQWU7RUFDZixpQkFBaUI7Q0FDbEI7O0FBRUQ7RUFDRSxlQUFlO0VBQ2YscUNBQXFDO0VBQ3JDLHNCQUFzQjtDQUN2Qjs7QUFFRDs7OztFQUlFLGlCQUFpQjtFQUNqQixvQkFBb0I7RUFDcEIscURBQXFEO0VBQ3JELGVBQWU7Q0FDaEI7O0FBRUQ7RUFDRSxpQkFBaUI7RUFDakIsb0JBQW9CO0VBQ3BCLHFEQUFxRDtFQUNyRCxlQUFlO0NBQ2hCOztBQUVEO0VBQ0UsZUFBZTtFQUNmLGFBQWE7RUFDYixXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLDBDQUEwQztFQUMxQyxnQkFBZ0I7Q0FDakI7O0FBRUQ7RUFDRSxZQUFZO0VBQ1osbUJBQW1CO0VBQ25CLGVBQWU7RUFDZixPQUFPO0VBQ1AsYUFBYTtFQUNiLFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsV0FBVztDQUNaOztBQUVEO0VBQ0UsbUJBQW1CO0VBQ25CLDhCQUE4QjtFQUM5QixjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLGVBQWU7RUFDZixlQUFlO0VBQ2YsZUFBZTtDQUNoQjs7QUFFRDtFQUNFLFlBQVk7RUFDWixZQUFZO0VBQ1osbUJBQW1CO0NBQ3BCOztBQUVEO0VBQ0UsWUFBWTtFQUNaLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQiw4QkFBOEI7RUFDOUIsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixzQkFBc0I7Q0FDdkI7O0FBRUQ7RUFDRSxZQUFZO0VBQ1osbUJBQW1CO0VBQ25CLGVBQWU7RUFDZixPQUFPO0VBQ1AsYUFBYTtFQUNiLFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsU0FBUztDQUNWOztBQUVEO0VBQ0UsY0FBYztDQUNmOztBQUVEO0VBQ0UsbUJBQW1CO0VBQ25CLGVBQWU7RUFDZixpQkFBaUI7RUFDakIsa0JBQWtCO0NBQ25COztBQUVEO0VBQ0UsZUFBZTtFQUNmLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsZUFBZTtDQUNoQjs7QUFFRDtFQUNFLFlBQVk7RUFDWixlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLGlCQUFpQjtDQUNsQjs7QUFFRDtFQUNFLGNBQWM7Q0FDZjs7QUFFRDtFQUNFLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2YsYUFBYTtFQUNiLGVBQWU7RUFDZiwwQkFBMEI7RUFDMUIsbUJBQW1CO0VBQ25CLCtEQUErRDtDQUNoRTs7QUFFRDtFQUNFLGlCQUFpQjtDQUNsQjs7QUFFRDtFQUNFLGVBQWU7Q0FDaEI7O0FBRUQ7RUFDRSxlQUFlO0NBQ2hCOztBQUVEO0VBQ0U7SUFDRSxlQUFlO0dBQ2hCO0NBQ0Y7O0FBRUQ7RUFDRTtJQUNFLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixXQUFXO0lBQ1gsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGFBQWE7R0FDZDtFQUNEO0lBQ0UsY0FBYztHQUNmO0VBQ0Q7SUFDRSxhQUFhO0dBQ2Q7RUFDRDtJQUNFLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixXQUFXO0dBQ1o7RUFDRDtJQUNFLGNBQWM7R0FDZjtDQUNGOztBQUVEO0VBQ0UsOEJBQThCO0VBQzlCLGFBQWE7RUFDYixVQUFVO0NBQ1g7O0FBRUQ7RUFDRSxZQUFZO0VBQ1osV0FBVztDQUNaOztBQUVEO0VBQ0UsY0FBYztDQUNmOztBQUVEO0VBQ0UsVUFBVTtFQUNWLFdBQVc7RUFDWCxlQUFlO0VBQ2YsWUFBWTtFQUNaLGFBQWE7Q0FDZDs7QUFFRDtFQUNFLGFBQWE7RUFDYixrQkFBa0I7Q0FDbkI7O0FBRUQ7RUFDRSxhQUFhO0VBQ2Isa0JBQWtCO0NBQ25COztBQUVEO0VBQ0UsNFVBQTRVO0VBQzVVLFlBQVk7RUFDWixZQUFZO0VBQ1osYUFBYTtFQUNiLHNCQUFzQjtDQUN2Qjs7QUFFRDtFQUNFLFlBQVk7RUFDWixZQUFZO0VBQ1osVUFBVTtFQUNWLFdBQVc7Q0FDWjs7QUFFRDtFQUNFLHlCQUF5QjtDQUMxQjs7QUFFRDtFQUNFLFVBQVU7RUFDVixlQUFlO0VBQ2YsaUJBQWlCO0VBQ2pCLG9CQUFvQjtDQUNyQjs7QUFFRDtFQUNFLGFBQWE7RUFDYixrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLHNCQUFzQjtDQUN2Qjs7QUFFRDtFQUNFLGdCQUFnQjtFQUNoQixlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLHVCQUF1QjtFQUN2QixvQkFBb0I7RUFDcEIsa0JBQWtCO0VBQ2xCLGFBQWE7Q0FDZDs7QUFFRDtFQUNFLGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsaUJBQWlCO0NBQ2xCOztBQUVEO0VBQ0UsYUFBYTtFQUNiLGFBQWE7RUFDYixjQUFjO0VBQ2QsdUJBQXVCO0VBQ3ZCLGFBQWE7RUFDYixhQUFhO0VBQ2IsZUFBZTtDQUNoQjs7QUFFRDtFQUNFLHcyUEFBdzJQO0VBQ3gyUCw2QkFBNkI7RUFDN0IsNEJBQTRCO0VBQzVCLHNCQUFzQjtFQUN0QixpQkFBaUI7RUFDakIscUJBQXFCO0VBQ3JCLHNCQUFzQjtFQUN0QixZQUFZO0VBQ1osYUFBYTtFQUNiLGVBQWU7Q0FDaEIiLCJmaWxlIjoiZG9jc2VhcmNoLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zZWFyY2hib3gge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDIwMHB4O1xuICBoZWlnaHQ6IDMycHggIWltcG9ydGFudDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50O1xufVxuXG4uc2VhcmNoYm94IC5hbGdvbGlhLWF1dG9jb21wbGV0ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uc2VhcmNoYm94X193cmFwcGVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgei1pbmRleDogOTk5O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zZWFyY2hib3hfX2lucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuNHMgZWFzZSwgYmFja2dyb3VuZCAwLjRzIGVhc2U7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4ICNjY2NjY2M7XG4gIGJhY2tncm91bmQ6ICNmZmZmZmYgIWltcG9ydGFudDtcbiAgcGFkZGluZzogMDtcbiAgcGFkZGluZy1yaWdodDogMjZweDtcbiAgcGFkZGluZy1sZWZ0OiAzMnB4O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICBmb250LXNpemU6IDEycHg7XG4gIGFwcGVhcmFuY2U6IG5vbmU7XG59XG5cbi5zZWFyY2hib3hfX2lucHV0Ojotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLCAuc2VhcmNoYm94X19pbnB1dDo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiwgLnNlYXJjaGJveF9faW5wdXQ6Oi13ZWJraXQtc2VhcmNoLXJlc3VsdHMtYnV0dG9uLCAuc2VhcmNoYm94X19pbnB1dDo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1kZWNvcmF0aW9uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLnNlYXJjaGJveF9faW5wdXQ6aG92ZXIge1xuICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggI2IzYjNiMztcbn1cblxuLnNlYXJjaGJveF9faW5wdXQ6Zm9jdXMsIC5zZWFyY2hib3hfX2lucHV0OmFjdGl2ZSB7XG4gIG91dGxpbmU6IDA7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCAjYWFhYWFhO1xuICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xufVxuXG4uc2VhcmNoYm94X19pbnB1dDo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogI2FhYWFhYTtcbn1cblxuLnNlYXJjaGJveF9fc3VibWl0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIG1hcmdpbjogMDtcbiAgYm9yZGVyOiAwO1xuICBib3JkZXItcmFkaXVzOiAxNnB4IDAgMCAxNnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDY5LCAxNDIsIDIyNSwgMCk7XG4gIHBhZGRpbmc6IDA7XG4gIHdpZHRoOiAzMnB4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgcmlnaHQ6IGluaGVyaXQ7XG4gIGxlZnQ6IDA7XG59XG5cbi5zZWFyY2hib3hfX3N1Ym1pdDo6YmVmb3JlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tcmlnaHQ6IC00cHg7XG4gIGhlaWdodDogMTAwJTtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgY29udGVudDogJyc7XG59XG5cbi5zZWFyY2hib3hfX3N1Ym1pdDpob3ZlciwgLnNlYXJjaGJveF9fc3VibWl0OmFjdGl2ZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnNlYXJjaGJveF9fc3VibWl0OmZvY3VzIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLnNlYXJjaGJveF9fc3VibWl0IHN2ZyB7XG4gIHdpZHRoOiAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGZpbGw6ICM2ZDdlOTY7XG59XG5cbi5zZWFyY2hib3hfX3Jlc2V0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA4cHg7XG4gIHJpZ2h0OiA4cHg7XG4gIG1hcmdpbjogMDtcbiAgYm9yZGVyOiAwO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGZpbGw6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cblxuLnNlYXJjaGJveF9fcmVzZXQuaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zZWFyY2hib3hfX3Jlc2V0OmZvY3VzIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLnNlYXJjaGJveF9fcmVzZXQgc3ZnIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogNHB4O1xuICB3aWR0aDogOHB4O1xuICBoZWlnaHQ6IDhweDtcbn1cblxuLnNlYXJjaGJveF9faW5wdXQ6dmFsaWQgfiAuc2VhcmNoYm94X19yZXNldCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBhbmltYXRpb24tbmFtZTogc2J4LXJlc2V0LWluO1xuICBhbmltYXRpb24tZHVyYXRpb246IDAuMTVzO1xufVxuXG5Aa2V5ZnJhbWVzIHNieC1yZXNldC1pbiB7XG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMCUsIDAsIDApO1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBub25lO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlLmFsZ29saWEtYXV0b2NvbXBsZXRlLXJpZ2h0IC5kcy1kcm9wZG93bi1tZW51IHtcbiAgcmlnaHQ6IDAgIWltcG9ydGFudDtcbiAgbGVmdDogaW5oZXJpdCAhaW1wb3J0YW50O1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUuYWxnb2xpYS1hdXRvY29tcGxldGUtcmlnaHQgLmRzLWRyb3Bkb3duLW1lbnU6YmVmb3JlIHtcbiAgcmlnaHQ6IDQ4cHg7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZS5hbGdvbGlhLWF1dG9jb21wbGV0ZS1sZWZ0IC5kcy1kcm9wZG93bi1tZW51IHtcbiAgbGVmdDogMCAhaW1wb3J0YW50O1xuICByaWdodDogaW5oZXJpdCAhaW1wb3J0YW50O1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUuYWxnb2xpYS1hdXRvY29tcGxldGUtbGVmdCAuZHMtZHJvcGRvd24tbWVudTpiZWZvcmUge1xuICBsZWZ0OiA0OHB4O1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTZweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBtYXJnaW46IDZweCAwIDA7XG4gIHBhZGRpbmc6IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGhlaWdodDogYXV0bztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiBub25lO1xuICB6LWluZGV4OiA5OTk7XG4gIG1heC13aWR0aDogNjAwcHg7XG4gIG1pbi13aWR0aDogNTAwcHg7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDAgMCByZ2JhKDAsIDAsIDAsIDAuMiksIDAgMnB4IDNweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5kcy1kcm9wZG93bi1tZW51OmJlZm9yZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGNvbnRlbnQ6ICcnO1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICB6LWluZGV4OiAxMDAwO1xuICB0b3A6IC03cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZDlkOWQ5O1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZDlkOWQ5O1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuZHMtZHJvcGRvd24tbWVudSAuZHMtc3VnZ2VzdGlvbnMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDEwMDA7XG4gIG1hcmdpbi10b3A6IDhweDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5kcy1kcm9wZG93bi1tZW51IC5kcy1zdWdnZXN0aW9ucyBhOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnUgLmRzLXN1Z2dlc3Rpb24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuZHMtZHJvcGRvd24tbWVudSAuZHMtc3VnZ2VzdGlvbi5kcy1jdXJzb3IgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24uc3VnZ2VzdGlvbi1sYXlvdXQtc2ltcGxlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2OSwgMTQyLCAyMjUsIDAuMDUpO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmRzLWRyb3Bkb3duLW1lbnUgLmRzLXN1Z2dlc3Rpb24uZHMtY3Vyc29yIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uOm5vdCguc3VnZ2VzdGlvbi1sYXlvdXQtc2ltcGxlKSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY29udGVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjksIDE0MiwgMjI1LCAwLjA1KTtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5kcy1kcm9wZG93bi1tZW51IFtjbGFzc149J2RzLWRhdGFzZXQtJ10ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJvcmRlcjogc29saWQgMXB4ICNkOWQ5ZDk7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIHBhZGRpbmc6IDAgOHB4IDhweDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5kcy1kcm9wZG93bi1tZW51ICoge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiAwIDhweDtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgY29sb3I6ICMwMjA2MGM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0taGlnaGxpZ2h0IHtcbiAgY29sb3I6ICMxNzRkOGM7XG4gIGJhY2tncm91bmQ6IHJnYmEoMTQzLCAxODcsIDIzNywgMC4xKTtcbiAgcGFkZGluZzogMC4xZW0gMC4wNWVtO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNhdGVnb3J5LWhlYWRlciAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY2F0ZWdvcnktaGVhZGVyLWx2bDBcbi5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1oaWdobGlnaHQsXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNhdGVnb3J5LWhlYWRlciAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY2F0ZWdvcnktaGVhZGVyLWx2bDFcbi5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1oaWdobGlnaHQge1xuICBwYWRkaW5nOiAwIDAgMXB4O1xuICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xuICBib3gtc2hhZG93OiBpbnNldCAwIC0ycHggMCAwIHJnYmEoNjksIDE0MiwgMjI1LCAwLjgpO1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS10ZXh0IC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1oaWdobGlnaHQge1xuICBwYWRkaW5nOiAwIDAgMXB4O1xuICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xuICBib3gtc2hhZG93OiBpbnNldCAwIC0ycHggMCAwIHJnYmEoNjksIDE0MiwgMjI1LCAwLjgpO1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1jb250ZW50IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiByaWdodDtcbiAgd2lkdGg6IDcwJTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiA1LjMzMzMzcHggMCA1LjMzMzMzcHggMTAuNjY2NjdweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNvbnRlbnQ6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHRvcDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMXB4O1xuICBiYWNrZ3JvdW5kOiAjZGRkO1xuICBsZWZ0OiAtMXB4O1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNhdGVnb3J5LWhlYWRlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1hcmdpbi10b3A6IDhweDtcbiAgcGFkZGluZzogNHB4IDA7XG4gIGZvbnQtc2l6ZTogMWVtO1xuICBjb2xvcjogIzMzMzYzZDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS13cmFwcGVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGZsb2F0OiBsZWZ0O1xuICBwYWRkaW5nOiA4cHggMCAwIDA7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tc3ViY2F0ZWdvcnktY29sdW1uIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAzMCU7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogNS4zMzMzM3B4IDEwLjY2NjY3cHg7XG4gIGNvbG9yOiAjYTRhN2FlO1xuICBmb250LXNpemU6IDAuOWVtO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tc3ViY2F0ZWdvcnktY29sdW1uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB0b3A6IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDFweDtcbiAgYmFja2dyb3VuZDogI2RkZDtcbiAgcmlnaHQ6IDA7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tc3ViY2F0ZWdvcnktaW5saW5lIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS10aXRsZSB7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcbiAgY29sb3I6ICMwMjA2MGM7XG4gIGZvbnQtc2l6ZTogMC45ZW07XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLXRleHQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbGluZS1oZWlnaHQ6IDEuMmVtO1xuICBmb250LXNpemU6IDAuODVlbTtcbiAgY29sb3I6ICM2MzY3NmQ7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tbm8tcmVzdWx0cyB7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA4cHggMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDEuMmVtO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLW5vLXJlc3VsdHM6OmJlZm9yZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiBjb2RlIHtcbiAgcGFkZGluZzogMXB4IDVweDtcbiAgZm9udC1zaXplOiA5MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgY29sb3I6ICMyMjIyMjI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlYmViZWI7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgZm9udC1mYW1pbHk6IE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiBjb2RlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1oaWdobGlnaHQge1xuICBiYWNrZ3JvdW5kOiBub25lO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24uYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbl9fbWFpbiAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY2F0ZWdvcnktaGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uX19zZWNvbmRhcnkge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1zdWJjYXRlZ29yeS1jb2x1bW4ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5cbkBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gIC5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tc3ViY2F0ZWdvcnktY29sdW1uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGNvbG9yOiAjMDIwNjBjO1xuICAgIGZvbnQtc2l6ZTogMC45ZW07XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBvcGFjaXR5OiAwLjU7XG4gIH1cbiAgLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1zdWJjYXRlZ29yeS1jb2x1bW46YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gIC5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tc3ViY2F0ZWdvcnktY29sdW1uOmFmdGVyIHtcbiAgICBjb250ZW50OiAnfCc7XG4gIH1cbiAgLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1jb250ZW50IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG4gIC5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY29udGVudDpiZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5zdWdnZXN0aW9uLWxheW91dC1zaW1wbGUuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbiB7XG4gIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjZWVlO1xuICBwYWRkaW5nOiA4cHg7XG4gIG1hcmdpbjogMDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5zdWdnZXN0aW9uLWxheW91dC1zaW1wbGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNvbnRlbnQge1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5zdWdnZXN0aW9uLWxheW91dC1zaW1wbGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWNvbnRlbnQ6OmJlZm9yZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuc3VnZ2VzdGlvbi1sYXlvdXQtc2ltcGxlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS1jYXRlZ29yeS1oZWFkZXIge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLnN1Z2dlc3Rpb24tbGF5b3V0LXNpbXBsZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY2F0ZWdvcnktaGVhZGVyLWx2bDAge1xuICBvcGFjaXR5OiAwLjY7XG4gIGZvbnQtc2l6ZTogMC44NWVtO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLnN1Z2dlc3Rpb24tbGF5b3V0LXNpbXBsZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY2F0ZWdvcnktaGVhZGVyLWx2bDEge1xuICBvcGFjaXR5OiAwLjY7XG4gIGZvbnQtc2l6ZTogMC44NWVtO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLnN1Z2dlc3Rpb24tbGF5b3V0LXNpbXBsZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tY2F0ZWdvcnktaGVhZGVyLWx2bDE6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDIwIDM4XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMS40OSA0LjMxbDE0IDE2LjEyNi4wMDItMi42MjQtMTQgMTYuMDc0LTEuMzE0IDEuNTEgMy4wMTcgMi42MjYgMS4zMTMtMS41MDggMTQtMTYuMDc1IDEuMTQyLTEuMzEzLTEuMTQtMS4zMTMtMTQtMTYuMTI1TDMuMi4xOC4xOCAyLjhsMS4zMSAxLjUxelwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBmaWxsPVwiJTIzMUQzNjU3XCIgLz48L3N2Zz4nKTtcbiAgY29udGVudDogJyc7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5zdWdnZXN0aW9uLWxheW91dC1zaW1wbGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLXdyYXBwZXIge1xuICB3aWR0aDogMTAwJTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuLmFsZ29saWEtYXV0b2NvbXBsZXRlIC5zdWdnZXN0aW9uLWxheW91dC1zaW1wbGUgLmFsZ29saWEtZG9jc2VhcmNoLXN1Z2dlc3Rpb24tLWR1cGxpY2F0ZS1jb250ZW50LCAuYWxnb2xpYS1hdXRvY29tcGxldGUgLnN1Z2dlc3Rpb24tbGF5b3V0LXNpbXBsZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tc3ViY2F0ZWdvcnktaW5saW5lIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLnN1Z2dlc3Rpb24tbGF5b3V0LXNpbXBsZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGNvbG9yOiAjNDU4ZWUxO1xuICBmb250LXNpemU6IDAuOWVtO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLnN1Z2dlc3Rpb24tbGF5b3V0LXNpbXBsZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tdGl0bGU6OmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICcjJztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjNDU4ZWUxO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuc3VnZ2VzdGlvbi1sYXlvdXQtc2ltcGxlIC5hbGdvbGlhLWRvY3NlYXJjaC1zdWdnZXN0aW9uLS10ZXh0IHtcbiAgbWFyZ2luOiA0cHggMCAwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbGluZS1oZWlnaHQ6IDEuNGVtO1xuICBwYWRkaW5nOiA1LjMzMzMzcHggOHB4O1xuICBiYWNrZ3JvdW5kOiAjZjhmOGY4O1xuICBmb250LXNpemU6IDAuODVlbTtcbiAgb3BhY2l0eTogMC44O1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLnN1Z2dlc3Rpb24tbGF5b3V0LXNpbXBsZSAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0tdGV4dCAuYWxnb2xpYS1kb2NzZWFyY2gtc3VnZ2VzdGlvbi0taGlnaGxpZ2h0IHtcbiAgY29sb3I6ICMzZjQxNDU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uYWxnb2xpYS1hdXRvY29tcGxldGUgLmFsZ29saWEtZG9jc2VhcmNoLWZvb3RlciB7XG4gIHdpZHRoOiAxMzRweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICB6LWluZGV4OiAyMDAwO1xuICBtYXJnaW4tdG9wOiAxMC42NjY2N3B4O1xuICBmbG9hdDogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogMDtcbiAgbGluZS1oZWlnaHQ6IDA7XG59XG5cbi5hbGdvbGlhLWF1dG9jb21wbGV0ZSAuYWxnb2xpYS1kb2NzZWFyY2gtZm9vdGVyLS1sb2dvIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTY4JyBoZWlnaHQ9JzI0JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDZyBmaWxsPSdub25lJyBmaWxsLXJ1bGU9J2V2ZW5vZGQnJTNFJTNDcGF0aCBkPSdNNzguOTg4LjkzOGgxNi41OTRhMi45NjggMi45NjggMCAwIDEgMi45NjYgMi45NjZWMjAuNWEyLjk2NyAyLjk2NyAwIDAgMS0yLjk2NiAyLjk2NEg3OC45ODhhMi45NjcgMi45NjcgMCAwIDEtMi45NjYtMi45NjRWMy44OTdBMi45NjEgMi45NjEgMCAwIDEgNzguOTg4LjkzOHptNDEuOTM3IDE3Ljg2NmMtNC4zODYuMDItNC4zODYtMy41NC00LjM4Ni00LjEwNmwtLjAwNy0xMy4zMzYgMi42NzUtLjQyNHYxMy4yNTRjMCAuMzIyIDAgMi4zNTggMS43MTggMi4zNjR2Mi4yNDh6bS0xMC44NDYtMi4xOGMuODIxIDAgMS40My0uMDQ3IDEuODU1LS4xMjl2LTIuNzE5YTYuMzM0IDYuMzM0IDAgMCAwLTEuNTc0LS4xOTljLS4yOTUgMC0uNTk2LjAyMS0uODk3LjA2OWEyLjY5OSAyLjY5OSAwIDAgMC0uODE0LjI0Yy0uMjQuMTE2LS40MzkuMjgtLjU4Mi40OTEtLjE1LjIxMi0uMjE5LjMzNS0uMjE5LjY1NiAwIC42MjguMjE5Ljk5MS42MTYgMS4yM3MuOTM4LjM2MiAxLjYxNS4zNjJ6bS0uMjMzLTkuN2MuODgzIDAgMS42MjkuMTA5IDIuMjMxLjMyOC42MDIuMjE4IDEuMDg4LjUyNSAxLjQ0NC45MTUuMzYzLjM5Ni42MDkuOTIyLjc2IDEuNDgzLjE1Ny41Ni4yMzIgMS4xNzUuMjMyIDEuODV2Ni44NzRjLS40MS4wODktMS4wMzQuMTktMS44NjguMzE0LS44MzQuMTIzLTEuNzcyLjE4NS0yLjgxMy4xODUtLjY5IDAtMS4zMjctLjA2OS0xLjg5NS0uMTk4YTQuMDAxIDQuMDAxIDAgMCAxLTEuNDcxLS42MzYgMy4wODUgMy4wODUgMCAwIDEtLjk1MS0xLjEzNGMtLjIyNi0uNDY1LS4zNDMtMS4xMi0uMzQzLTEuODAzIDAtLjY1Ni4xMy0xLjA3My4zODQtMS41MjUuMjYtLjQ1LjYwOC0uODE5IDEuMDQ3LTEuMTA2LjQ0NS0uMjg3Ljk1LS40OTIgMS41MzItLjYxNWE4LjggOC44IDAgMCAxIDEuODItLjE4NSA4LjQwNCA4LjQwNCAwIDAgMSAxLjk3Mi4yNHYtLjQzOGMwLS4zMDctLjAzNS0uNi0uMTEtLjg3NGExLjg4IDEuODggMCAwIDAtLjM4NC0uNzMgMS43ODQgMS43ODQgMCAwIDAtLjcyNC0uNDkzIDMuMTY0IDMuMTY0IDAgMCAwLTEuMTQzLS4yMDVjLS42MTYgMC0xLjE3Ny4wNzUtMS42OS4xNjRhNy43MzUgNy43MzUgMCAwIDAtMS4yNi4zMDdsLS4zMjEtMi4xOTJjLjMzNS0uMTE3LjgzNC0uMjMzIDEuNDc4LS4zNDlhMTAuOTggMTAuOTggMCAwIDEgMi4wNzMtLjE3OHptNTIuODQyIDkuNjI2Yy44MjIgMCAxLjQzLS4wNDggMS44NTQtLjEzVjEzLjdhNi4zNDcgNi4zNDcgMCAwIDAtMS41NzQtLjE5OWMtLjI5NCAwLS41OTUuMDIxLS44OTYuMDY5YTIuNyAyLjcgMCAwIDAtLjgxNC4yNCAxLjQ2IDEuNDYgMCAwIDAtLjU4Mi40OTFjLS4xNS4yMTItLjIxOC4zMzUtLjIxOC42NTYgMCAuNjI4LjIxOC45OTEuNjE1IDEuMjMuNDA0LjI0NS45MzguMzYyIDEuNjE1LjM2MnptLS4yMjYtOS42OTRjLjg4MyAwIDEuNjI5LjEwOCAyLjIzMS4zMjcuNjAyLjIxOSAxLjA4OC41MjYgMS40NDQuOTE1LjM1NS4zOS42MDkuOTIzLjc1OSAxLjQ4My4xNTguNTYuMjMzIDEuMTc1LjIzMyAxLjg1MnY2Ljg3M2MtLjQxLjA4OC0xLjAzNC4xOS0xLjg2OC4zMTQtLjgzNC4xMjMtMS43NzIuMTg0LTIuODEzLjE4NC0uNjkgMC0xLjMyNy0uMDY4LTEuODk1LS4xOThhNC4wMDEgNC4wMDEgMCAwIDEtMS40NzEtLjYzNSAzLjA4NSAzLjA4NSAwIDAgMS0uOTUxLTEuMTM0Yy0uMjI2LS40NjUtLjM0My0xLjEyLS4zNDMtMS44MDQgMC0uNjU2LjEzLTEuMDczLjM4NC0xLjUyNC4yNi0uNDUuNjA4LS44MiAxLjA0Ny0xLjEwNy40NDUtLjI4Ni45NS0uNDkxIDEuNTMyLS42MTRhOC44MDMgOC44MDMgMCAwIDEgMi43NTEtLjEzYy4zMjkuMDM0LjY3MS4wOTYgMS4wNC4xODV2LS40MzdhMy4zIDMuMyAwIDAgMC0uMTA5LS44NzUgMS44NzMgMS44NzMgMCAwIDAtLjM4NC0uNzMxIDEuNzg0IDEuNzg0IDAgMCAwLS43MjQtLjQ5MiAzLjE2NSAzLjE2NSAwIDAgMC0xLjE0My0uMjA1Yy0uNjE2IDAtMS4xNzcuMDc1LTEuNjkuMTY0LS41MTQuMDg5LS45MzguMTkxLTEuMjYuMzA3bC0uMzIxLTIuMTkzYy4zMzUtLjExNi44MzQtLjIzMiAxLjQ3OC0uMzQ4YTExLjYzMyAxMS42MzMgMCAwIDEgMi4wNzMtLjE3N3ptLTguMDM0LTEuMjcxYTEuNjI2IDEuNjI2IDAgMCAxLTEuNjI4LTEuNjJjMC0uODk1LjcyNS0xLjYyIDEuNjI4LTEuNjIuOTA0IDAgMS42My43MjUgMS42MyAxLjYyIDAgLjg5NS0uNzMzIDEuNjItMS42MyAxLjYyem0xLjM0OCAxMy4yMmgtMi42ODlWNy4yN2wyLjY5LS40MjN2MTEuOTU2em0tNC43MTQgMGMtNC4zODYuMDItNC4zODYtMy41NC00LjM4Ni00LjEwN2wtLjAwOC0xMy4zMzYgMi42NzYtLjQyNHYxMy4yNTRjMCAuMzIyIDAgMi4zNTggMS43MTggMi4zNjR2Mi4yNDh6bS04LjY5OC01LjkwM2MwLTEuMTU2LS4yNTMtMi4xMTktLjc0Ni0yLjc4OC0uNDkzLS42NzctMS4xODMtMS4wMS0yLjA2Ny0xLjAxLS44ODIgMC0xLjU3NC4zMzMtMi4wNjUgMS4wMS0uNDkzLjY3Ni0uNzMzIDEuNjMyLS43MzMgMi43ODggMCAxLjE2OC4yNDYgMS45NTMuNzQgMi42My40OTIuNjgzIDEuMTgzIDEuMDE4IDIuMDY2IDEuMDE4Ljg4MiAwIDEuNTc0LS4zNDIgMi4wNjctMS4wMTkuNDkyLS42ODMuNzM4LTEuNDYuNzM4LTIuNjN6bTIuNzM3LS4wMDdjMCAuOTAyLS4xMyAxLjU4NC0uMzk3IDIuMzNhNS41MiA1LjUyIDAgMCAxLTEuMTI4IDEuOTA2IDQuOTg2IDQuOTg2IDAgMCAxLTEuNzUyIDEuMjIzYy0uNjg1LjI4Ni0xLjczOS40NS0yLjI2NS40NS0uNTI4LS4wMDYtMS41NzQtLjE1Ny0yLjI1Mi0uNDVhNS4wOTYgNS4wOTYgMCAwIDEtMS43NDQtMS4yMjNjLS40ODctLjUyNy0uODYzLTEuMTYyLTEuMTM3LTEuOTA2YTYuMzQ1IDYuMzQ1IDAgMCAxLS40MS0yLjMzYzAtLjkwMi4xMjMtMS43Ny4zOTctMi41MDhhNS41NTQgNS41NTQgMCAwIDEgMS4xNS0xLjg5MiA1LjEzMyA1LjEzMyAwIDAgMSAxLjc1LTEuMjE2Yy42NzktLjI4NyAxLjQyNS0uNDIzIDIuMjMyLS40MjMuODA4IDAgMS41NTMuMTQyIDIuMjM3LjQyMy42ODUuMjg2IDEuMjc0LjY5IDEuNzUzIDEuMjE2YTUuNjQ0IDUuNjQ0IDAgMCAxIDEuMTM1IDEuODkyYy4yODcuNzM4LjQzMSAxLjYwNi40MzEgMi41MDh6bS0yMC4xMzggMGMwIDEuMTIuMjQ2IDIuMzYzLjczOCAyLjg4Mi40OTMuNTIgMS4xMy43OCAxLjkxLjc4LjQyNCAwIC44MjgtLjA2MiAxLjIwNC0uMTc4LjM3Ny0uMTE2LjY3Ny0uMjUzLjkxNy0uNDE3VjkuMzNhMTAuNDc2IDEwLjQ3NiAwIDAgMC0xLjc2Ni0uMjI2Yy0uOTcxLS4wMjgtMS43MS4zNy0yLjIzIDEuMDA0LS41MTMuNjM2LS43NzMgMS43NS0uNzczIDIuNzg4em03LjQzOCA1LjI3NGMwIDEuODI0LS40NjYgMy4xNTYtMS40MDQgNC4wMDQtLjkzNi44NDYtMi4zNjcgMS4yNy00LjI5NiAxLjI3LS43MDUgMC0yLjE3LS4xMzctMy4zNC0uMzk2bC40MzEtMi4xMThjLjk4LjIwNSAyLjI3Mi4yNiAyLjk1LjI2IDEuMDc0IDAgMS44NC0uMjE5IDIuMjk5LS42NTYuNDU5LS40MzcuNjg0LTEuMDg2LjY4NC0xLjk0OHYtLjQzN2E4LjA3IDguMDcgMCAwIDEtMS4wNDcuMzk3Yy0uNDMuMTMtLjkzLjE5OC0xLjQ5Mi4xOTgtLjczOSAwLTEuNDEtLjExNi0yLjAxOC0uMzQ5YTQuMjA2IDQuMjA2IDAgMCAxLTEuNTY3LTEuMDI1Yy0uNDMxLS40NS0uNzc0LTEuMDE3LTEuMDEzLTEuNjk0LS4yNC0uNjc3LS4zNjMtMS44ODUtLjM2My0yLjc3MyAwLS44MzQuMTMtMS44OC4zODQtMi41NzcuMjYtLjY5Ni42MjktMS4yOTggMS4xMjktMS43OTYuNDkzLS40OTggMS4wOTUtLjg4MSAxLjgtMS4xNjJhNi42MDUgNi42MDUgMCAwIDEgMi40MjgtLjQ1N2MuODcgMCAxLjY3LjEwOSAyLjQ1LjI0Ljc4LjEyOSAxLjQ0NC4yNjUgMS45ODUuNDE1VjE4LjE3eicgZmlsbD0nJTIzNTQ2OEZGJy8lM0UlM0NwYXRoIGQ9J002Ljk3MiA2LjY3N3YxLjYyN2MtLjcxMi0uNDQ2LTEuNTItLjY3LTIuNDI1LS42Ny0uNTg1IDAtMS4wNDUuMTMtMS4zOC4zOTFhMS4yNCAxLjI0IDAgMCAwLS41MDIgMS4wM2MwIC40MjUuMTY0Ljc2NS40OTQgMS4wMi4zMy4yNTYuODM1LjUzMiAxLjUxNi44My40NDcuMTkyLjc5NS4zNTYgMS4wNDUuNDk1LjI1LjEzOC41MzcuMzMyLjg2Mi41ODIuMzI0LjI1LjU2My41NDguNzE4Ljg5NC4xNTQuMzQ1LjIzLjc0MS4yMyAxLjE4OCAwIC45NDctLjMzNCAxLjY5MS0xLjAwNCAyLjIzNC0uNjcuNTQyLTEuNTM3LjgxNC0yLjYwMS44MTQtMS4xOCAwLTIuMTYtLjIyOS0yLjkzNi0uNjg2di0xLjcwOGMuODQuNjI4IDEuODE0Ljk0MiAyLjkyLjk0Mi41ODUgMCAxLjA0OC0uMTM2IDEuMzg4LS40MDcuMzQtLjI3MS41MS0uNjQ2LjUxLTEuMTI1IDAtLjI4Ny0uMS0uNTUtLjMwMi0uNzktLjIwMy0uMjQtLjQyLS40Mi0uNjU1LS41NDItLjIzNC0uMTIzLS41ODUtLjI5LTEuMDUzLS41MDMtLjI3Ni0uMTI3LS40Ny0uMjE4LS41ODItLjI3MWExMy42NyAxMy42NyAwIDAgMS0uNTUtLjI4NyA0LjI3NSA0LjI3NSAwIDAgMS0uNTY3LS4zNTEgNi45MiA2LjkyIDAgMCAxLS40NTUtLjRjLS4xOC0uMTctLjMxLS4zNC0uMzktLjUxLS4wOC0uMTctLjE1NS0uMzctLjIyNC0uNTk4YTIuNTUzIDIuNTUzIDAgMCAxLS4xMDQtLjc0MmMwLS45MTUuMzMzLTEuNjM4Ljk5OC0yLjE3LjY2NC0uNTMyIDEuNTIzLS43OTggMi41NzYtLjc5OC45NjggMCAxLjc5My4xNyAyLjQ3My41MXptNy40NjggNS42OTZ2LS4yODdjLS4wMjItLjYwNy0uMTg3LTEuMDg4LS40OTUtMS40NDQtLjMwOS0uMzU3LS43NS0uNTM1LTEuMzI0LS41MzUtLjUzMiAwLS45OS4xOTQtMS4zNzMuNTgzLS4zODIuMzg4LS42MjIuOTQ5LS43MTcgMS42ODNoMy45MDl6bTEuMDA1IDIuNzkydjEuNDA0Yy0uNTk2LjM0LTEuMzgzLjUxLTIuMzYyLjUxLTEuMjU1IDAtMi4yNTUtLjM3Ny0zLTEuMTMyLS43NDQtLjc1NS0xLjExNi0xLjc0NC0xLjExNi0yLjk2OCAwLTEuMjk3LjM0LTIuMzE2IDEuMDIxLTMuMDU1LjY4LS43NCAxLjU0OC0xLjExIDIuNi0xLjExIDEuMDMzIDAgMS44NTIuMzIzIDIuNDU4Ljk2Ni42MDYuNjQ0LjkxIDEuNTcyLjkxIDIuNzg0IDAgLjMzLS4wMzMuNjc2LS4wOTYgMS4wMzhoLTUuMzE0Yy4xMDcuNzAyLjQwNSAxLjIzOS44OTQgMS42MTEuNDkuMzcyIDEuMTA2LjU1OCAxLjg1LjU1OC44NjIgMCAxLjU4LS4yMDIgMi4xNTUtLjYwNnptNi42MDUtMS43N2gtMS4yMTJjLS41OTYgMC0xLjA0NS4xMTYtMS4zNDkuMzUtLjMwMy4yMzQtLjQ1NC41MzItLjQ1NC44OTQgMCAuMzcyLjExNy42NjQuMzUuODc3LjIzNS4yMTMuNTc1LjMyIDEuMDIyLjMyLjUxIDAgLjkxMi0uMTQyIDEuMjA0LS40MjQuMjkzLS4yODEuNDQtLjY1MS40NC0xLjEwOHYtLjkxem0tNC4wNjgtMi41NTRWOS4zMjVjLjYyNy0uMzYxIDEuNDU3LS41NDIgMi40ODktLjU0MiAyLjExNiAwIDMuMTc1IDEuMDI2IDMuMTc1IDMuMDhWMTdoLTEuNTQ4di0uOTU3Yy0uNDE1LjY4LTEuMTQzIDEuMDItMi4xODYgMS4wMi0uNzY2IDAtMS4zOC0uMjItMS44NDMtLjY2MS0uNDYyLS40NDItLjY5NC0xLjAwMy0uNjk0LTEuNjg0IDAtLjc3Ni4yOTMtMS4zOC44NzgtMS44MS41ODUtLjQzMSAxLjQwNC0uNjQ3IDIuNDU3LS42NDdoMS4zNFYxMS44YzAtLjU1NC0uMTMzLS45NzEtLjM5OS0xLjI1My0uMjY2LS4yODItLjcwNy0uNDIzLTEuMzI0LS40MjNhNC4wNyA0LjA3IDAgMCAwLTIuMzQ1LjcxOHptOS4zMzMtMS45M3YxLjQyYy4zOTQtMSAxLjEwMS0xLjUgMi4xMjMtMS41LjE0OCAwIC4zMTMuMDE2LjQ5NC4wNDh2MS41MzFhMS44ODUgMS44ODUgMCAwIDAtLjc1LS4xNDNjLS41NDIgMC0uOTg5LjI0LTEuMzQuNzE4LS4zNTEuNDc5LS41MjcgMS4wNDgtLjUyNyAxLjcwN1YxN2gtMS41NjNWOC45MWgxLjU2M3ptNS4wMSA0LjA4NGMuMDIyLjgyLjI3MiAxLjQ5Mi43NSAyLjAxOS40NzkuNTI2IDEuMTUuNzkgMi4wMS43OS42MzkgMCAxLjIzNS0uMTc2IDEuNzg4LS41Mjd2MS40MDRjLS41MjEuMzE5LTEuMTg2LjQ3OS0xLjk5NS40NzktMS4yNjUgMC0yLjI3Ni0uNC0zLjAzMS0xLjE5Ny0uNzU1LS43OTgtMS4xMzMtMS43OTItMS4xMzMtMi45ODQgMC0xLjE2LjM4LTIuMTUxIDEuMTQtMi45NzUuNzYxLS44MjUgMS43OS0xLjIzNyAzLjA4OC0xLjIzNy43MDIgMCAxLjM0Ni4xNDkgMS45My40NDd2MS40MzZhMy4yNDIgMy4yNDIgMCAwIDAtMS43Ny0uNDk1Yy0uODQgMC0xLjUxMy4yNjYtMi4wMTkuNzk4LS41MDUuNTMyLS43NTggMS4yMTMtLjc1OCAyLjA0MnpNNDAuMjQgNS43MnY0LjU3OWMuNDU4LTEgMS4yOTMtMS41IDIuNTA1LTEuNS43ODcgMCAxLjQyLjI0NSAxLjg5OS43MzQuNDc5LjQ5LjcxOCAxLjE3LjcxOCAyLjA0MlYxN2gtMS41NjR2LTUuMTA2YzAtLjU1My0uMTQtLjk4LS40MjItMS4yODQtLjI4Mi0uMzAzLS42NTItLjQ1NS0xLjExLS40NTUtLjUzMSAwLTEuMDAyLjIwMi0xLjQxMS42MDYtLjQxLjQwNS0uNjE1IDEuMDIyLS42MTUgMS44NTFWMTdoLTEuNTYzVjUuNzJoMS41NjN6bTE0Ljk2NiAxMC4wMmMuNTk2IDAgMS4wOTYtLjI1MyAxLjUtLjc1OC40MDQtLjUwNi42MDYtMS4xNTcuNjA2LTEuOTU1IDAtLjkxNS0uMjAyLTEuNjItLjYwNi0yLjExNC0uNDA0LS40OTUtLjkyLS43NDItMS41NDgtLjc0Mi0uNTUzIDAtMS4wNS4yMjQtMS40OTEuNjctLjQ0Mi40NDctLjY2MiAxLjEzMy0uNjYyIDIuMDU4IDAgLjk1OC4yMTIgMS42Ny42MzggMi4xMzguNDI1LjQ2OS45NDYuNzAzIDEuNTYzLjcwM3pNNTMuMDA0IDUuNzJ2NC40MmMuNTc0LS44OTQgMS4zODgtMS4zNDEgMi40NC0xLjM0MSAxLjAyMiAwIDEuODU3LjM4MyAyLjUwNiAxLjE0OS42NDkuNzY2Ljk3MyAxLjc4MS45NzMgMy4wNDcgMCAxLjEzOC0uMzA5IDIuMTA5LS45MjUgMi45MTItLjYxNy44MDMtMS40NjMgMS4yMDUtMi41MzcgMS4yMDUtMS4wNzUgMC0xLjg5NC0uNDQ3LTIuNDU3LTEuMzRWMTdoLTEuNThWNS43MmgxLjU4em05LjkwOCAxMS4xMDRsLTMuMjIzLTcuOTEzaDEuNzM5bDEuMDA1IDIuNjMyIDEuMjYgMy40MTVjLjA5Ni0uMzIuNDgtMS40NTggMS4xNS0zLjQxNWwuOTA5LTIuNjMyaDEuNjZsLTIuOTIgNy44NjZjLS43NzcgMi4wNzQtMS45NjMgMy4xMS0zLjU1OSAzLjExYTIuOTIgMi45MiAwIDAgMS0uNzM0LS4wNzl2LTEuMzRjLjE3LjA0Mi4zNTEuMDY0LjU0My4wNjQgMS4wMzIgMCAxLjc1NS0uNTcgMi4xNy0xLjcwOHonIGZpbGw9JyUyMzVENjQ5NCcvJTNFJTNDcGF0aCBkPSdNODkuNjMyIDUuOTY3di0uNzcyYS45NzguOTc4IDAgMCAwLS45NzgtLjk3N2gtMi4yOGEuOTc4Ljk3OCAwIDAgMC0uOTc4Ljk3N3YuNzkzYzAgLjA4OC4wODIuMTUuMTcxLjEzYTcuMTI3IDcuMTI3IDAgMCAxIDEuOTg0LS4yOGMuNjUgMCAxLjI5NS4wODggMS45MTcuMjU5LjA4Mi4wMi4xNjQtLjA0LjE2NC0uMTNtLTYuMjQ4IDEuMDFsLS4zOS0uMzg5YS45NzcuOTc3IDAgMCAwLTEuMzgyIDBsLS40NjUuNDY1YS45NzMuOTczIDAgMCAwIDAgMS4zOGwuMzgzLjM4M2MuMDYyLjA2MS4xNS4wNDcuMjA1LS4wMTQuMjI2LS4zMDcuNDcyLS42MDEuNzQ2LS44NzQuMjgxLS4yOC41NjgtLjUyNi44ODMtLjc1MS4wNjgtLjA0Mi4wNzUtLjEzNy4wMi0uMm00LjE2IDIuNDUzdjMuMzQxYzAgLjA5Ni4xMDQuMTY1LjE5Mi4xMTdsMi45Ny0xLjUzN2MuMDY4LS4wMzQuMDg5LS4xMTcuMDU1LS4xODRhMy42OTUgMy42OTUgMCAwIDAtMy4wOC0xLjg2NmMtLjA2OCAwLS4xMzYuMDU0LS4xMzYuMTNtMCA4LjA0OGE0LjQ4OSA0LjQ4OSAwIDAgMS00LjQ5LTQuNDgyIDQuNDg4IDQuNDg4IDAgMCAxIDQuNDktNC40ODIgNC40ODggNC40ODggMCAwIDEgNC40ODkgNC40ODIgNC40ODQgNC40ODQgMCAwIDEtNC40OSA0LjQ4Mm0wLTEwLjg1YTYuMzYzIDYuMzYzIDAgMSAwIDAgMTIuNzI5YzMuNTE4IDAgNi4zNzItMi44NSA2LjM3Mi02LjM2OGE2LjM1OCA2LjM1OCAwIDAgMC02LjM3MS02LjM2JyBmaWxsPSclMjNGRkYnLyUzRSUzQy9nJTNFJTNDL3N2ZyUzRSUwQVwiKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtaW5kZW50OiAtOTAwMHB4O1xuICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuIl19 */ \ No newline at end of file diff --git a/website/images/flags/en.svg b/website/images/flags/en.svg new file mode 100644 index 00000000000..b1dab887bcf --- /dev/null +++ b/website/images/flags/en.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/flags/es.svg b/website/images/flags/es.svg new file mode 100644 index 00000000000..04f609b6c1d --- /dev/null +++ b/website/images/flags/es.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/flags/fa.svg b/website/images/flags/fa.svg new file mode 100644 index 00000000000..35cd83dded2 --- /dev/null +++ b/website/images/flags/fa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/flags/fr.svg b/website/images/flags/fr.svg new file mode 100644 index 00000000000..9733f5c270c --- /dev/null +++ b/website/images/flags/fr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/flags/ja.svg b/website/images/flags/ja.svg new file mode 100644 index 00000000000..ad8286de8f8 --- /dev/null +++ b/website/images/flags/ja.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/flags/ru.svg b/website/images/flags/ru.svg new file mode 100644 index 00000000000..1733cc42728 --- /dev/null +++ b/website/images/flags/ru.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/flags/zh.svg b/website/images/flags/zh.svg new file mode 100644 index 00000000000..903b1eca640 --- /dev/null +++ b/website/images/flags/zh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/index/github.svg b/website/images/index/github.svg index 8f91c1d3402..fc532813365 100644 --- a/website/images/index/github.svg +++ b/website/images/index/github.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website/images/mkdocs/edit.svg b/website/images/mkdocs/edit.svg new file mode 100644 index 00000000000..e12ba890f2e --- /dev/null +++ b/website/images/mkdocs/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/mkdocs/multi.svg b/website/images/mkdocs/multi.svg new file mode 100644 index 00000000000..2ae85a1d227 --- /dev/null +++ b/website/images/mkdocs/multi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/mkdocs/pdf.svg b/website/images/mkdocs/pdf.svg new file mode 100644 index 00000000000..c85df2f41ca --- /dev/null +++ b/website/images/mkdocs/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/mkdocs/search.svg b/website/images/mkdocs/search.svg new file mode 100644 index 00000000000..2d678d62213 --- /dev/null +++ b/website/images/mkdocs/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/images/mkdocs/single.svg b/website/images/mkdocs/single.svg new file mode 100644 index 00000000000..077561b8c58 --- /dev/null +++ b/website/images/mkdocs/single.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/js/base.js b/website/js/base.js index 17f4c98b39b..8dfd426d6ed 100644 --- a/website/js/base.js +++ b/website/js/base.js @@ -1,30 +1,35 @@ -$(document).ready(function () { - var name = $('#logo-text').attr('alt').trim().toLowerCase(); - var feedback_address = name + '-feedback' + '@yandex-team.com'; - var feedback_email = $('#feedback_email'); - feedback_email.attr('href', 'mailto:' + feedback_address); - feedback_email.html(feedback_address); +(function () { + var logo_text = $('#logo-text'); + if (logo_text.length) { + var name = logo_text.attr('alt').trim().toLowerCase(); + var feedback_address = name + '-feedback' + '@yandex-team.com'; + var feedback_email = $('#feedback_email'); + feedback_email.attr('href', 'mailto:' + feedback_address); + feedback_email.html(feedback_address); + } $(document).click(function (event) { var target = $(event.target); var target_id = target.attr('id'); var selector = target.attr('href'); var is_tab = target.attr('role') === 'tab'; + var is_collapse = target.attr('data-toggle') === 'collapse'; var navbar_toggle = $('#navbar-toggle'); navbar_toggle.collapse('hide'); + $('.algolia-autocomplete .ds-dropdown-menu').hide(); if (target_id && target_id.startsWith('logo-')) { selector = '#'; } - if (selector && selector.startsWith('#') && !is_tab) { + if (selector && selector.startsWith('#') && !is_tab && !is_collapse) { event.preventDefault(); var dst = window.location.href.replace(window.location.hash, ''); var offset = 0; if (selector !== '#') { - offset = $(selector).offset().top - navbar_toggle.height() * 1.5; + offset = $(selector).offset().top - $('#top-nav').height() * 1.5; dst += selector; } $('html, body').animate({ @@ -57,6 +62,21 @@ $(document).ready(function () { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks2"); -}); - -{% include "js/index.js" %} + var beforePrint = function() { + var details = document.getElementsByTagName("details"); + for (var i = 0; i < details.length; ++i) { + details[i].open = 1; + } + }; + if (window.matchMedia) { + window.matchMedia('print').addListener(function(q) { + if (q.matches) { + beforePrint(); + } + }); + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + $.fx.off = true; + } + } + window.onbeforeprint = beforePrint; +})(); diff --git a/website/js/bootstrap.js b/website/js/bootstrap.js new file mode 100644 index 00000000000..f1e68d3190f --- /dev/null +++ b/website/js/bootstrap.js @@ -0,0 +1,4521 @@ +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) : + typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) : + (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper)); +}(this, (function (exports, $, Popper) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + keys.push.apply(keys, symbols); + } + + return keys; + } + + function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.4.1): util.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Private TransitionEnd Helpers + * ------------------------------------------------------------------------ + */ + + var TRANSITION_END = 'transitionend'; + var MAX_UID = 1000000; + var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) + + function toType(obj) { + return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); + } + + function getSpecialTransitionEndEvent() { + return { + bindType: TRANSITION_END, + delegateType: TRANSITION_END, + handle: function handle(event) { + if ($(event.target).is(this)) { + return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params + } + + return undefined; // eslint-disable-line no-undefined + } + }; + } + + function transitionEndEmulator(duration) { + var _this = this; + + var called = false; + $(this).one(Util.TRANSITION_END, function () { + called = true; + }); + setTimeout(function () { + if (!called) { + Util.triggerTransitionEnd(_this); + } + }, duration); + return this; + } + + function setTransitionEndSupport() { + $.fn.emulateTransitionEnd = transitionEndEmulator; + $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); + } + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ + + + var Util = { + TRANSITION_END: 'bsTransitionEnd', + getUID: function getUID(prefix) { + do { + // eslint-disable-next-line no-bitwise + prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here + } while (document.getElementById(prefix)); + + return prefix; + }, + getSelectorFromElement: function getSelectorFromElement(element) { + var selector = element.getAttribute('data-target'); + + if (!selector || selector === '#') { + var hrefAttr = element.getAttribute('href'); + selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; + } + + try { + return document.querySelector(selector) ? selector : null; + } catch (err) { + return null; + } + }, + getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { + if (!element) { + return 0; + } // Get transition-duration of the element + + + var transitionDuration = $(element).css('transition-duration'); + var transitionDelay = $(element).css('transition-delay'); + var floatTransitionDuration = parseFloat(transitionDuration); + var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found + + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } // If multiple durations are defined, take the first + + + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }, + reflow: function reflow(element) { + return element.offsetHeight; + }, + triggerTransitionEnd: function triggerTransitionEnd(element) { + $(element).trigger(TRANSITION_END); + }, + // TODO: Remove in v5 + supportsTransitionEnd: function supportsTransitionEnd() { + return Boolean(TRANSITION_END); + }, + isElement: function isElement(obj) { + return (obj[0] || obj).nodeType; + }, + typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { + for (var property in configTypes) { + if (Object.prototype.hasOwnProperty.call(configTypes, property)) { + var expectedTypes = configTypes[property]; + var value = config[property]; + var valueType = value && Util.isElement(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); + } + } + } + }, + findShadowRoot: function findShadowRoot(element) { + if (!document.documentElement.attachShadow) { + return null; + } // Can find the shadow root otherwise it'll return the document + + + if (typeof element.getRootNode === 'function') { + var root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + + if (element instanceof ShadowRoot) { + return element; + } // when we don't find a shadow root + + + if (!element.parentNode) { + return null; + } + + return Util.findShadowRoot(element.parentNode); + }, + jQueryDetection: function jQueryDetection() { + if (typeof $ === 'undefined') { + throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); + } + + var version = $.fn.jquery.split(' ')[0].split('.'); + var minMajor = 1; + var ltMajor = 2; + var minMinor = 9; + var minPatch = 1; + var maxMajor = 4; + + if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { + throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); + } + } + }; + Util.jQueryDetection(); + setTransitionEndSupport(); + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'alert'; + var VERSION = '4.4.1'; + var DATA_KEY = 'bs.alert'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var Selector = { + DISMISS: '[data-dismiss="alert"]' + }; + var Event = { + CLOSE: "close" + EVENT_KEY, + CLOSED: "closed" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + ALERT: 'alert', + FADE: 'fade', + SHOW: 'show' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Alert = + /*#__PURE__*/ + function () { + function Alert(element) { + this._element = element; + } // Getters + + + var _proto = Alert.prototype; + + // Public + _proto.close = function close(element) { + var rootElement = this._element; + + if (element) { + rootElement = this._getRootElement(element); + } + + var customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent.isDefaultPrevented()) { + return; + } + + this._removeElement(rootElement); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + this._element = null; + } // Private + ; + + _proto._getRootElement = function _getRootElement(element) { + var selector = Util.getSelectorFromElement(element); + var parent = false; + + if (selector) { + parent = document.querySelector(selector); + } + + if (!parent) { + parent = $(element).closest("." + ClassName.ALERT)[0]; + } + + return parent; + }; + + _proto._triggerCloseEvent = function _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE); + $(element).trigger(closeEvent); + return closeEvent; + }; + + _proto._removeElement = function _removeElement(element) { + var _this = this; + + $(element).removeClass(ClassName.SHOW); + + if (!$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element); + + return; + } + + var transitionDuration = Util.getTransitionDurationFromElement(element); + $(element).one(Util.TRANSITION_END, function (event) { + return _this._destroyElement(element, event); + }).emulateTransitionEnd(transitionDuration); + }; + + _proto._destroyElement = function _destroyElement(element) { + $(element).detach().trigger(Event.CLOSED).remove(); + } // Static + ; + + Alert._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $element = $(this); + var data = $element.data(DATA_KEY); + + if (!data) { + data = new Alert(this); + $element.data(DATA_KEY, data); + } + + if (config === 'close') { + data[config](this); + } + }); + }; + + Alert._handleDismiss = function _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + }; + + _createClass(Alert, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }]); + + return Alert; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert())); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Alert._jQueryInterface; + $.fn[NAME].Constructor = Alert; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Alert._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$1 = 'button'; + var VERSION$1 = '4.4.1'; + var DATA_KEY$1 = 'bs.button'; + var EVENT_KEY$1 = "." + DATA_KEY$1; + var DATA_API_KEY$1 = '.data-api'; + var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1]; + var ClassName$1 = { + ACTIVE: 'active', + BUTTON: 'btn', + FOCUS: 'focus' + }; + var Selector$1 = { + DATA_TOGGLE_CARROT: '[data-toggle^="button"]', + DATA_TOGGLES: '[data-toggle="buttons"]', + DATA_TOGGLE: '[data-toggle="button"]', + DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn', + INPUT: 'input:not([type="hidden"])', + ACTIVE: '.active', + BUTTON: '.btn' + }; + var Event$1 = { + CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1, + FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1), + LOAD_DATA_API: "load" + EVENT_KEY$1 + DATA_API_KEY$1 + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Button = + /*#__PURE__*/ + function () { + function Button(element) { + this._element = element; + } // Getters + + + var _proto = Button.prototype; + + // Public + _proto.toggle = function toggle() { + var triggerChangeEvent = true; + var addAriaPressed = true; + var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLES)[0]; + + if (rootElement) { + var input = this._element.querySelector(Selector$1.INPUT); + + if (input) { + if (input.type === 'radio') { + if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) { + triggerChangeEvent = false; + } else { + var activeElement = rootElement.querySelector(Selector$1.ACTIVE); + + if (activeElement) { + $(activeElement).removeClass(ClassName$1.ACTIVE); + } + } + } else if (input.type === 'checkbox') { + if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName$1.ACTIVE)) { + triggerChangeEvent = false; + } + } else { + // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input + triggerChangeEvent = false; + } + + if (triggerChangeEvent) { + input.checked = !this._element.classList.contains(ClassName$1.ACTIVE); + $(input).trigger('change'); + } + + input.focus(); + addAriaPressed = false; + } + } + + if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) { + if (addAriaPressed) { + this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE)); + } + + if (triggerChangeEvent) { + $(this._element).toggleClass(ClassName$1.ACTIVE); + } + } + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$1); + this._element = null; + } // Static + ; + + Button._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$1); + + if (!data) { + data = new Button(this); + $(this).data(DATA_KEY$1, data); + } + + if (config === 'toggle') { + data[config](); + } + }); + }; + + _createClass(Button, null, [{ + key: "VERSION", + get: function get() { + return VERSION$1; + } + }]); + + return Button; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { + var button = event.target; + + if (!$(button).hasClass(ClassName$1.BUTTON)) { + button = $(button).closest(Selector$1.BUTTON)[0]; + } + + if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) { + event.preventDefault(); // work around Firefox bug #1540995 + } else { + var inputBtn = button.querySelector(Selector$1.INPUT); + + if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) { + event.preventDefault(); // work around Firefox bug #1540995 + + return; + } + + Button._jQueryInterface.call($(button), 'toggle'); + } + }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { + var button = $(event.target).closest(Selector$1.BUTTON)[0]; + $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type)); + }); + $(window).on(Event$1.LOAD_DATA_API, function () { + // ensure correct active class is set to match the controls' actual values/states + // find all checkboxes/readio buttons inside data-toggle groups + var buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLES_BUTTONS)); + + for (var i = 0, len = buttons.length; i < len; i++) { + var button = buttons[i]; + var input = button.querySelector(Selector$1.INPUT); + + if (input.checked || input.hasAttribute('checked')) { + button.classList.add(ClassName$1.ACTIVE); + } else { + button.classList.remove(ClassName$1.ACTIVE); + } + } // find all button toggles + + + buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLE)); + + for (var _i = 0, _len = buttons.length; _i < _len; _i++) { + var _button = buttons[_i]; + + if (_button.getAttribute('aria-pressed') === 'true') { + _button.classList.add(ClassName$1.ACTIVE); + } else { + _button.classList.remove(ClassName$1.ACTIVE); + } + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$1] = Button._jQueryInterface; + $.fn[NAME$1].Constructor = Button; + + $.fn[NAME$1].noConflict = function () { + $.fn[NAME$1] = JQUERY_NO_CONFLICT$1; + return Button._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$2 = 'carousel'; + var VERSION$2 = '4.4.1'; + var DATA_KEY$2 = 'bs.carousel'; + var EVENT_KEY$2 = "." + DATA_KEY$2; + var DATA_API_KEY$2 = '.data-api'; + var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2]; + var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key + + var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key + + var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + var SWIPE_THRESHOLD = 40; + var Default = { + interval: 5000, + keyboard: true, + slide: false, + pause: 'hover', + wrap: true, + touch: true + }; + var DefaultType = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean' + }; + var Direction = { + NEXT: 'next', + PREV: 'prev', + LEFT: 'left', + RIGHT: 'right' + }; + var Event$2 = { + SLIDE: "slide" + EVENT_KEY$2, + SLID: "slid" + EVENT_KEY$2, + KEYDOWN: "keydown" + EVENT_KEY$2, + MOUSEENTER: "mouseenter" + EVENT_KEY$2, + MOUSELEAVE: "mouseleave" + EVENT_KEY$2, + TOUCHSTART: "touchstart" + EVENT_KEY$2, + TOUCHMOVE: "touchmove" + EVENT_KEY$2, + TOUCHEND: "touchend" + EVENT_KEY$2, + POINTERDOWN: "pointerdown" + EVENT_KEY$2, + POINTERUP: "pointerup" + EVENT_KEY$2, + DRAG_START: "dragstart" + EVENT_KEY$2, + LOAD_DATA_API: "load" + EVENT_KEY$2 + DATA_API_KEY$2, + CLICK_DATA_API: "click" + EVENT_KEY$2 + DATA_API_KEY$2 + }; + var ClassName$2 = { + CAROUSEL: 'carousel', + ACTIVE: 'active', + SLIDE: 'slide', + RIGHT: 'carousel-item-right', + LEFT: 'carousel-item-left', + NEXT: 'carousel-item-next', + PREV: 'carousel-item-prev', + ITEM: 'carousel-item', + POINTER_EVENT: 'pointer-event' + }; + var Selector$2 = { + ACTIVE: '.active', + ACTIVE_ITEM: '.active.carousel-item', + ITEM: '.carousel-item', + ITEM_IMG: '.carousel-item img', + NEXT_PREV: '.carousel-item-next, .carousel-item-prev', + INDICATORS: '.carousel-indicators', + DATA_SLIDE: '[data-slide], [data-slide-to]', + DATA_RIDE: '[data-ride="carousel"]' + }; + var PointerType = { + TOUCH: 'touch', + PEN: 'pen' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Carousel = + /*#__PURE__*/ + function () { + function Carousel(element, config) { + this._items = null; + this._interval = null; + this._activeElement = null; + this._isPaused = false; + this._isSliding = false; + this.touchTimeout = null; + this.touchStartX = 0; + this.touchDeltaX = 0; + this._config = this._getConfig(config); + this._element = element; + this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS); + this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); + + this._addEventListeners(); + } // Getters + + + var _proto = Carousel.prototype; + + // Public + _proto.next = function next() { + if (!this._isSliding) { + this._slide(Direction.NEXT); + } + }; + + _proto.nextWhenVisible = function nextWhenVisible() { + // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') { + this.next(); + } + }; + + _proto.prev = function prev() { + if (!this._isSliding) { + this._slide(Direction.PREV); + } + }; + + _proto.pause = function pause(event) { + if (!event) { + this._isPaused = true; + } + + if (this._element.querySelector(Selector$2.NEXT_PREV)) { + Util.triggerTransitionEnd(this._element); + this.cycle(true); + } + + clearInterval(this._interval); + this._interval = null; + }; + + _proto.cycle = function cycle(event) { + if (!event) { + this._isPaused = false; + } + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._config.interval && !this._isPaused) { + this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); + } + }; + + _proto.to = function to(index) { + var _this = this; + + this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM); + + var activeIndex = this._getItemIndex(this._activeElement); + + if (index > this._items.length - 1 || index < 0) { + return; + } + + if (this._isSliding) { + $(this._element).one(Event$2.SLID, function () { + return _this.to(index); + }); + return; + } + + if (activeIndex === index) { + this.pause(); + this.cycle(); + return; + } + + var direction = index > activeIndex ? Direction.NEXT : Direction.PREV; + + this._slide(direction, this._items[index]); + }; + + _proto.dispose = function dispose() { + $(this._element).off(EVENT_KEY$2); + $.removeData(this._element, DATA_KEY$2); + this._items = null; + this._config = null; + this._element = null; + this._interval = null; + this._isPaused = null; + this._isSliding = null; + this._activeElement = null; + this._indicatorsElement = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default, {}, config); + Util.typeCheckConfig(NAME$2, config, DefaultType); + return config; + }; + + _proto._handleSwipe = function _handleSwipe() { + var absDeltax = Math.abs(this.touchDeltaX); + + if (absDeltax <= SWIPE_THRESHOLD) { + return; + } + + var direction = absDeltax / this.touchDeltaX; + this.touchDeltaX = 0; // swipe left + + if (direction > 0) { + this.prev(); + } // swipe right + + + if (direction < 0) { + this.next(); + } + }; + + _proto._addEventListeners = function _addEventListeners() { + var _this2 = this; + + if (this._config.keyboard) { + $(this._element).on(Event$2.KEYDOWN, function (event) { + return _this2._keydown(event); + }); + } + + if (this._config.pause === 'hover') { + $(this._element).on(Event$2.MOUSEENTER, function (event) { + return _this2.pause(event); + }).on(Event$2.MOUSELEAVE, function (event) { + return _this2.cycle(event); + }); + } + + if (this._config.touch) { + this._addTouchEventListeners(); + } + }; + + _proto._addTouchEventListeners = function _addTouchEventListeners() { + var _this3 = this; + + if (!this._touchSupported) { + return; + } + + var start = function start(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchStartX = event.originalEvent.clientX; + } else if (!_this3._pointerEvent) { + _this3.touchStartX = event.originalEvent.touches[0].clientX; + } + }; + + var move = function move(event) { + // ensure swiping with one touch and not pinching + if (event.originalEvent.touches && event.originalEvent.touches.length > 1) { + _this3.touchDeltaX = 0; + } else { + _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX; + } + }; + + var end = function end(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; + } + + _this3._handleSwipe(); + + if (_this3._config.pause === 'hover') { + // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + _this3.pause(); + + if (_this3.touchTimeout) { + clearTimeout(_this3.touchTimeout); + } + + _this3.touchTimeout = setTimeout(function (event) { + return _this3.cycle(event); + }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); + } + }; + + $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) { + return e.preventDefault(); + }); + + if (this._pointerEvent) { + $(this._element).on(Event$2.POINTERDOWN, function (event) { + return start(event); + }); + $(this._element).on(Event$2.POINTERUP, function (event) { + return end(event); + }); + + this._element.classList.add(ClassName$2.POINTER_EVENT); + } else { + $(this._element).on(Event$2.TOUCHSTART, function (event) { + return start(event); + }); + $(this._element).on(Event$2.TOUCHMOVE, function (event) { + return move(event); + }); + $(this._element).on(Event$2.TOUCHEND, function (event) { + return end(event); + }); + } + }; + + _proto._keydown = function _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + + switch (event.which) { + case ARROW_LEFT_KEYCODE: + event.preventDefault(); + this.prev(); + break; + + case ARROW_RIGHT_KEYCODE: + event.preventDefault(); + this.next(); + break; + } + }; + + _proto._getItemIndex = function _getItemIndex(element) { + this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : []; + return this._items.indexOf(element); + }; + + _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { + var isNextDirection = direction === Direction.NEXT; + var isPrevDirection = direction === Direction.PREV; + + var activeIndex = this._getItemIndex(activeElement); + + var lastItemIndex = this._items.length - 1; + var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; + + if (isGoingToWrap && !this._config.wrap) { + return activeElement; + } + + var delta = direction === Direction.PREV ? -1 : 1; + var itemIndex = (activeIndex + delta) % this._items.length; + return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; + }; + + _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { + var targetIndex = this._getItemIndex(relatedTarget); + + var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM)); + + var slideEvent = $.Event(Event$2.SLIDE, { + relatedTarget: relatedTarget, + direction: eventDirectionName, + from: fromIndex, + to: targetIndex + }); + $(this._element).trigger(slideEvent); + return slideEvent; + }; + + _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { + if (this._indicatorsElement) { + var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE)); + $(indicators).removeClass(ClassName$2.ACTIVE); + + var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; + + if (nextIndicator) { + $(nextIndicator).addClass(ClassName$2.ACTIVE); + } + } + }; + + _proto._slide = function _slide(direction, element) { + var _this4 = this; + + var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM); + + var activeElementIndex = this._getItemIndex(activeElement); + + var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); + + var nextElementIndex = this._getItemIndex(nextElement); + + var isCycling = Boolean(this._interval); + var directionalClassName; + var orderClassName; + var eventDirectionName; + + if (direction === Direction.NEXT) { + directionalClassName = ClassName$2.LEFT; + orderClassName = ClassName$2.NEXT; + eventDirectionName = Direction.LEFT; + } else { + directionalClassName = ClassName$2.RIGHT; + orderClassName = ClassName$2.PREV; + eventDirectionName = Direction.RIGHT; + } + + if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) { + this._isSliding = false; + return; + } + + var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); + + if (slideEvent.isDefaultPrevented()) { + return; + } + + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + return; + } + + this._isSliding = true; + + if (isCycling) { + this.pause(); + } + + this._setActiveIndicatorElement(nextElement); + + var slidEvent = $.Event(Event$2.SLID, { + relatedTarget: nextElement, + direction: eventDirectionName, + from: activeElementIndex, + to: nextElementIndex + }); + + if ($(this._element).hasClass(ClassName$2.SLIDE)) { + $(nextElement).addClass(orderClassName); + Util.reflow(nextElement); + $(activeElement).addClass(directionalClassName); + $(nextElement).addClass(directionalClassName); + var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10); + + if (nextElementInterval) { + this._config.defaultInterval = this._config.defaultInterval || this._config.interval; + this._config.interval = nextElementInterval; + } else { + this._config.interval = this._config.defaultInterval || this._config.interval; + } + + var transitionDuration = Util.getTransitionDurationFromElement(activeElement); + $(activeElement).one(Util.TRANSITION_END, function () { + $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName$2.ACTIVE); + $(activeElement).removeClass(ClassName$2.ACTIVE + " " + orderClassName + " " + directionalClassName); + _this4._isSliding = false; + setTimeout(function () { + return $(_this4._element).trigger(slidEvent); + }, 0); + }).emulateTransitionEnd(transitionDuration); + } else { + $(activeElement).removeClass(ClassName$2.ACTIVE); + $(nextElement).addClass(ClassName$2.ACTIVE); + this._isSliding = false; + $(this._element).trigger(slidEvent); + } + + if (isCycling) { + this.cycle(); + } + } // Static + ; + + Carousel._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$2); + + var _config = _objectSpread2({}, Default, {}, $(this).data()); + + if (typeof config === 'object') { + _config = _objectSpread2({}, _config, {}, config); + } + + var action = typeof config === 'string' ? config : _config.slide; + + if (!data) { + data = new Carousel(this, _config); + $(this).data(DATA_KEY$2, data); + } + + if (typeof config === 'number') { + data.to(config); + } else if (typeof action === 'string') { + if (typeof data[action] === 'undefined') { + throw new TypeError("No method named \"" + action + "\""); + } + + data[action](); + } else if (_config.interval && _config.ride) { + data.pause(); + data.cycle(); + } + }); + }; + + Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { + var selector = Util.getSelectorFromElement(this); + + if (!selector) { + return; + } + + var target = $(selector)[0]; + + if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) { + return; + } + + var config = _objectSpread2({}, $(target).data(), {}, $(this).data()); + + var slideIndex = this.getAttribute('data-slide-to'); + + if (slideIndex) { + config.interval = false; + } + + Carousel._jQueryInterface.call($(target), config); + + if (slideIndex) { + $(target).data(DATA_KEY$2).to(slideIndex); + } + + event.preventDefault(); + }; + + _createClass(Carousel, null, [{ + key: "VERSION", + get: function get() { + return VERSION$2; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return Carousel; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler); + $(window).on(Event$2.LOAD_DATA_API, function () { + var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE)); + + for (var i = 0, len = carousels.length; i < len; i++) { + var $carousel = $(carousels[i]); + + Carousel._jQueryInterface.call($carousel, $carousel.data()); + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$2] = Carousel._jQueryInterface; + $.fn[NAME$2].Constructor = Carousel; + + $.fn[NAME$2].noConflict = function () { + $.fn[NAME$2] = JQUERY_NO_CONFLICT$2; + return Carousel._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$3 = 'collapse'; + var VERSION$3 = '4.4.1'; + var DATA_KEY$3 = 'bs.collapse'; + var EVENT_KEY$3 = "." + DATA_KEY$3; + var DATA_API_KEY$3 = '.data-api'; + var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3]; + var Default$1 = { + toggle: true, + parent: '' + }; + var DefaultType$1 = { + toggle: 'boolean', + parent: '(string|element)' + }; + var Event$3 = { + SHOW: "show" + EVENT_KEY$3, + SHOWN: "shown" + EVENT_KEY$3, + HIDE: "hide" + EVENT_KEY$3, + HIDDEN: "hidden" + EVENT_KEY$3, + CLICK_DATA_API: "click" + EVENT_KEY$3 + DATA_API_KEY$3 + }; + var ClassName$3 = { + SHOW: 'show', + COLLAPSE: 'collapse', + COLLAPSING: 'collapsing', + COLLAPSED: 'collapsed' + }; + var Dimension = { + WIDTH: 'width', + HEIGHT: 'height' + }; + var Selector$3 = { + ACTIVES: '.show, .collapsing', + DATA_TOGGLE: '[data-toggle="collapse"]' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Collapse = + /*#__PURE__*/ + function () { + function Collapse(element, config) { + this._isTransitioning = false; + this._element = element; + this._config = this._getConfig(config); + this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); + var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE)); + + for (var i = 0, len = toggleList.length; i < len; i++) { + var elem = toggleList[i]; + var selector = Util.getSelectorFromElement(elem); + var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { + return foundElem === element; + }); + + if (selector !== null && filterElement.length > 0) { + this._selector = selector; + + this._triggerArray.push(elem); + } + } + + this._parent = this._config.parent ? this._getParent() : null; + + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._element, this._triggerArray); + } + + if (this._config.toggle) { + this.toggle(); + } + } // Getters + + + var _proto = Collapse.prototype; + + // Public + _proto.toggle = function toggle() { + if ($(this._element).hasClass(ClassName$3.SHOW)) { + this.hide(); + } else { + this.show(); + } + }; + + _proto.show = function show() { + var _this = this; + + if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) { + return; + } + + var actives; + var activesData; + + if (this._parent) { + actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) { + if (typeof _this._config.parent === 'string') { + return elem.getAttribute('data-parent') === _this._config.parent; + } + + return elem.classList.contains(ClassName$3.COLLAPSE); + }); + + if (actives.length === 0) { + actives = null; + } + } + + if (actives) { + activesData = $(actives).not(this._selector).data(DATA_KEY$3); + + if (activesData && activesData._isTransitioning) { + return; + } + } + + var startEvent = $.Event(Event$3.SHOW); + $(this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + if (actives) { + Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide'); + + if (!activesData) { + $(actives).data(DATA_KEY$3, null); + } + } + + var dimension = this._getDimension(); + + $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING); + this._element.style[dimension] = 0; + + if (this._triggerArray.length) { + $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true); + } + + this.setTransitioning(true); + + var complete = function complete() { + $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW); + _this._element.style[dimension] = ''; + + _this.setTransitioning(false); + + $(_this._element).trigger(Event$3.SHOWN); + }; + + var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + var scrollSize = "scroll" + capitalizedDimension; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + this._element.style[dimension] = this._element[scrollSize] + "px"; + }; + + _proto.hide = function hide() { + var _this2 = this; + + if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) { + return; + } + + var startEvent = $.Event(Event$3.HIDE); + $(this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + var dimension = this._getDimension(); + + this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; + Util.reflow(this._element); + $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW); + var triggerArrayLength = this._triggerArray.length; + + if (triggerArrayLength > 0) { + for (var i = 0; i < triggerArrayLength; i++) { + var trigger = this._triggerArray[i]; + var selector = Util.getSelectorFromElement(trigger); + + if (selector !== null) { + var $elem = $([].slice.call(document.querySelectorAll(selector))); + + if (!$elem.hasClass(ClassName$3.SHOW)) { + $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false); + } + } + } + } + + this.setTransitioning(true); + + var complete = function complete() { + _this2.setTransitioning(false); + + $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN); + }; + + this._element.style[dimension] = ''; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + }; + + _proto.setTransitioning = function setTransitioning(isTransitioning) { + this._isTransitioning = isTransitioning; + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$3); + this._config = null; + this._parent = null; + this._element = null; + this._triggerArray = null; + this._isTransitioning = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default$1, {}, config); + config.toggle = Boolean(config.toggle); // Coerce string values + + Util.typeCheckConfig(NAME$3, config, DefaultType$1); + return config; + }; + + _proto._getDimension = function _getDimension() { + var hasWidth = $(this._element).hasClass(Dimension.WIDTH); + return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT; + }; + + _proto._getParent = function _getParent() { + var _this3 = this; + + var parent; + + if (Util.isElement(this._config.parent)) { + parent = this._config.parent; // It's a jQuery object + + if (typeof this._config.parent.jquery !== 'undefined') { + parent = this._config.parent[0]; + } + } else { + parent = document.querySelector(this._config.parent); + } + + var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; + var children = [].slice.call(parent.querySelectorAll(selector)); + $(children).each(function (i, element) { + _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); + }); + return parent; + }; + + _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { + var isOpen = $(element).hasClass(ClassName$3.SHOW); + + if (triggerArray.length) { + $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); + } + } // Static + ; + + Collapse._getTargetFromElement = function _getTargetFromElement(element) { + var selector = Util.getSelectorFromElement(element); + return selector ? document.querySelector(selector) : null; + }; + + Collapse._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $this = $(this); + var data = $this.data(DATA_KEY$3); + + var _config = _objectSpread2({}, Default$1, {}, $this.data(), {}, typeof config === 'object' && config ? config : {}); + + if (!data && _config.toggle && /show|hide/.test(config)) { + _config.toggle = false; + } + + if (!data) { + data = new Collapse(this, _config); + $this.data(DATA_KEY$3, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Collapse, null, [{ + key: "VERSION", + get: function get() { + return VERSION$3; + } + }, { + key: "Default", + get: function get() { + return Default$1; + } + }]); + + return Collapse; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) { + // preventDefault only for elements (which change the URL) not inside the collapsible element + if (event.currentTarget.tagName === 'A') { + event.preventDefault(); + } + + var $trigger = $(this); + var selector = Util.getSelectorFromElement(this); + var selectors = [].slice.call(document.querySelectorAll(selector)); + $(selectors).each(function () { + var $target = $(this); + var data = $target.data(DATA_KEY$3); + var config = data ? 'toggle' : $trigger.data(); + + Collapse._jQueryInterface.call($target, config); + }); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$3] = Collapse._jQueryInterface; + $.fn[NAME$3].Constructor = Collapse; + + $.fn[NAME$3].noConflict = function () { + $.fn[NAME$3] = JQUERY_NO_CONFLICT$3; + return Collapse._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$4 = 'dropdown'; + var VERSION$4 = '4.4.1'; + var DATA_KEY$4 = 'bs.dropdown'; + var EVENT_KEY$4 = "." + DATA_KEY$4; + var DATA_API_KEY$4 = '.data-api'; + var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4]; + var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key + + var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key + + var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key + + var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key + + var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key + + var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) + + var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); + var Event$4 = { + HIDE: "hide" + EVENT_KEY$4, + HIDDEN: "hidden" + EVENT_KEY$4, + SHOW: "show" + EVENT_KEY$4, + SHOWN: "shown" + EVENT_KEY$4, + CLICK: "click" + EVENT_KEY$4, + CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4, + KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4, + KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4 + }; + var ClassName$4 = { + DISABLED: 'disabled', + SHOW: 'show', + DROPUP: 'dropup', + DROPRIGHT: 'dropright', + DROPLEFT: 'dropleft', + MENURIGHT: 'dropdown-menu-right', + MENULEFT: 'dropdown-menu-left', + POSITION_STATIC: 'position-static' + }; + var Selector$4 = { + DATA_TOGGLE: '[data-toggle="dropdown"]', + FORM_CHILD: '.dropdown form', + MENU: '.dropdown-menu', + NAVBAR_NAV: '.navbar-nav', + VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' + }; + var AttachmentMap = { + TOP: 'top-start', + TOPEND: 'top-end', + BOTTOM: 'bottom-start', + BOTTOMEND: 'bottom-end', + RIGHT: 'right-start', + RIGHTEND: 'right-end', + LEFT: 'left-start', + LEFTEND: 'left-end' + }; + var Default$2 = { + offset: 0, + flip: true, + boundary: 'scrollParent', + reference: 'toggle', + display: 'dynamic', + popperConfig: null + }; + var DefaultType$2 = { + offset: '(number|string|function)', + flip: 'boolean', + boundary: '(string|element)', + reference: '(string|element)', + display: 'string', + popperConfig: '(null|object)' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Dropdown = + /*#__PURE__*/ + function () { + function Dropdown(element, config) { + this._element = element; + this._popper = null; + this._config = this._getConfig(config); + this._menu = this._getMenuElement(); + this._inNavbar = this._detectNavbar(); + + this._addEventListeners(); + } // Getters + + + var _proto = Dropdown.prototype; + + // Public + _proto.toggle = function toggle() { + if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) { + return; + } + + var isActive = $(this._menu).hasClass(ClassName$4.SHOW); + + Dropdown._clearMenus(); + + if (isActive) { + return; + } + + this.show(true); + }; + + _proto.show = function show(usePopper) { + if (usePopper === void 0) { + usePopper = false; + } + + if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var showEvent = $.Event(Event$4.SHOW, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $(parent).trigger(showEvent); + + if (showEvent.isDefaultPrevented()) { + return; + } // Disable totally Popper.js for Dropdown in Navbar + + + if (!this._inNavbar && usePopper) { + /** + * Check for Popper dependency + * Popper - https://popper.js.org + */ + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)'); + } + + var referenceElement = this._element; + + if (this._config.reference === 'parent') { + referenceElement = parent; + } else if (Util.isElement(this._config.reference)) { + referenceElement = this._config.reference; // Check if it's jQuery element + + if (typeof this._config.reference.jquery !== 'undefined') { + referenceElement = this._config.reference[0]; + } + } // If boundary is not `scrollParent`, then set position to `static` + // to allow the menu to "escape" the scroll parent's boundaries + // https://github.com/twbs/bootstrap/issues/24251 + + + if (this._config.boundary !== 'scrollParent') { + $(parent).addClass(ClassName$4.POSITION_STATIC); + } + + this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()); + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) { + $(document.body).children().on('mouseover', null, $.noop); + } + + this._element.focus(); + + this._element.setAttribute('aria-expanded', true); + + $(this._menu).toggleClass(ClassName$4.SHOW); + $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget)); + }; + + _proto.hide = function hide() { + if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var hideEvent = $.Event(Event$4.HIDE, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $(parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + if (this._popper) { + this._popper.destroy(); + } + + $(this._menu).toggleClass(ClassName$4.SHOW); + $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget)); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$4); + $(this._element).off(EVENT_KEY$4); + this._element = null; + this._menu = null; + + if (this._popper !== null) { + this._popper.destroy(); + + this._popper = null; + } + }; + + _proto.update = function update() { + this._inNavbar = this._detectNavbar(); + + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Private + ; + + _proto._addEventListeners = function _addEventListeners() { + var _this = this; + + $(this._element).on(Event$4.CLICK, function (event) { + event.preventDefault(); + event.stopPropagation(); + + _this.toggle(); + }); + }; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config); + Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType); + return config; + }; + + _proto._getMenuElement = function _getMenuElement() { + if (!this._menu) { + var parent = Dropdown._getParentFromElement(this._element); + + if (parent) { + this._menu = parent.querySelector(Selector$4.MENU); + } + } + + return this._menu; + }; + + _proto._getPlacement = function _getPlacement() { + var $parentDropdown = $(this._element.parentNode); + var placement = AttachmentMap.BOTTOM; // Handle dropup + + if ($parentDropdown.hasClass(ClassName$4.DROPUP)) { + placement = AttachmentMap.TOP; + + if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) { + placement = AttachmentMap.TOPEND; + } + } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) { + placement = AttachmentMap.RIGHT; + } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) { + placement = AttachmentMap.LEFT; + } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) { + placement = AttachmentMap.BOTTOMEND; + } + + return placement; + }; + + _proto._detectNavbar = function _detectNavbar() { + return $(this._element).closest('.navbar').length > 0; + }; + + _proto._getOffset = function _getOffset() { + var _this2 = this; + + var offset = {}; + + if (typeof this._config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {}); + return data; + }; + } else { + offset.offset = this._config.offset; + } + + return offset; + }; + + _proto._getPopperConfig = function _getPopperConfig() { + var popperConfig = { + placement: this._getPlacement(), + modifiers: { + offset: this._getOffset(), + flip: { + enabled: this._config.flip + }, + preventOverflow: { + boundariesElement: this._config.boundary + } + } + }; // Disable Popper.js if we have a static display + + if (this._config.display === 'static') { + popperConfig.modifiers.applyStyle = { + enabled: false + }; + } + + return _objectSpread2({}, popperConfig, {}, this._config.popperConfig); + } // Static + ; + + Dropdown._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$4); + + var _config = typeof config === 'object' ? config : null; + + if (!data) { + data = new Dropdown(this, _config); + $(this).data(DATA_KEY$4, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + Dropdown._clearMenus = function _clearMenus(event) { + if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { + return; + } + + var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE)); + + for (var i = 0, len = toggles.length; i < len; i++) { + var parent = Dropdown._getParentFromElement(toggles[i]); + + var context = $(toggles[i]).data(DATA_KEY$4); + var relatedTarget = { + relatedTarget: toggles[i] + }; + + if (event && event.type === 'click') { + relatedTarget.clickEvent = event; + } + + if (!context) { + continue; + } + + var dropdownMenu = context._menu; + + if (!$(parent).hasClass(ClassName$4.SHOW)) { + continue; + } + + if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) { + continue; + } + + var hideEvent = $.Event(Event$4.HIDE, relatedTarget); + $(parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + continue; + } // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().off('mouseover', null, $.noop); + } + + toggles[i].setAttribute('aria-expanded', 'false'); + + if (context._popper) { + context._popper.destroy(); + } + + $(dropdownMenu).removeClass(ClassName$4.SHOW); + $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget)); + } + }; + + Dropdown._getParentFromElement = function _getParentFromElement(element) { + var parent; + var selector = Util.getSelectorFromElement(element); + + if (selector) { + parent = document.querySelector(selector); + } + + return parent || element.parentNode; + } // eslint-disable-next-line complexity + ; + + Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { + // If not input/textarea: + // - And not a key in REGEXP_KEYDOWN => not a dropdown command + // If input/textarea: + // - If space key => not a dropdown command + // - If key is other than escape + // - If key is not up or down => not a dropdown command + // - If trigger inside the menu => not a dropdown command + if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) { + return; + } + + var parent = Dropdown._getParentFromElement(this); + + var isActive = $(parent).hasClass(ClassName$4.SHOW); + + if (!isActive && event.which === ESCAPE_KEYCODE) { + return; + } + + if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { + if (event.which === ESCAPE_KEYCODE) { + var toggle = parent.querySelector(Selector$4.DATA_TOGGLE); + $(toggle).trigger('focus'); + } + + $(this).trigger('click'); + return; + } + + var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)).filter(function (item) { + return $(item).is(':visible'); + }); + + if (items.length === 0) { + return; + } + + var index = items.indexOf(event.target); + + if (event.which === ARROW_UP_KEYCODE && index > 0) { + // Up + index--; + } + + if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { + // Down + index++; + } + + if (index < 0) { + index = 0; + } + + items[index].focus(); + }; + + _createClass(Dropdown, null, [{ + key: "VERSION", + get: function get() { + return VERSION$4; + } + }, { + key: "Default", + get: function get() { + return Default$2; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$2; + } + }]); + + return Dropdown; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + " " + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) { + event.preventDefault(); + event.stopPropagation(); + + Dropdown._jQueryInterface.call($(this), 'toggle'); + }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) { + e.stopPropagation(); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$4] = Dropdown._jQueryInterface; + $.fn[NAME$4].Constructor = Dropdown; + + $.fn[NAME$4].noConflict = function () { + $.fn[NAME$4] = JQUERY_NO_CONFLICT$4; + return Dropdown._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$5 = 'modal'; + var VERSION$5 = '4.4.1'; + var DATA_KEY$5 = 'bs.modal'; + var EVENT_KEY$5 = "." + DATA_KEY$5; + var DATA_API_KEY$5 = '.data-api'; + var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5]; + var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key + + var Default$3 = { + backdrop: true, + keyboard: true, + focus: true, + show: true + }; + var DefaultType$3 = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean', + show: 'boolean' + }; + var Event$5 = { + HIDE: "hide" + EVENT_KEY$5, + HIDE_PREVENTED: "hidePrevented" + EVENT_KEY$5, + HIDDEN: "hidden" + EVENT_KEY$5, + SHOW: "show" + EVENT_KEY$5, + SHOWN: "shown" + EVENT_KEY$5, + FOCUSIN: "focusin" + EVENT_KEY$5, + RESIZE: "resize" + EVENT_KEY$5, + CLICK_DISMISS: "click.dismiss" + EVENT_KEY$5, + KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY$5, + MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY$5, + MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY$5, + CLICK_DATA_API: "click" + EVENT_KEY$5 + DATA_API_KEY$5 + }; + var ClassName$5 = { + SCROLLABLE: 'modal-dialog-scrollable', + SCROLLBAR_MEASURER: 'modal-scrollbar-measure', + BACKDROP: 'modal-backdrop', + OPEN: 'modal-open', + FADE: 'fade', + SHOW: 'show', + STATIC: 'modal-static' + }; + var Selector$5 = { + DIALOG: '.modal-dialog', + MODAL_BODY: '.modal-body', + DATA_TOGGLE: '[data-toggle="modal"]', + DATA_DISMISS: '[data-dismiss="modal"]', + FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', + STICKY_CONTENT: '.sticky-top' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Modal = + /*#__PURE__*/ + function () { + function Modal(element, config) { + this._config = this._getConfig(config); + this._element = element; + this._dialog = element.querySelector(Selector$5.DIALOG); + this._backdrop = null; + this._isShown = false; + this._isBodyOverflowing = false; + this._ignoreBackdropClick = false; + this._isTransitioning = false; + this._scrollbarWidth = 0; + } // Getters + + + var _proto = Modal.prototype; + + // Public + _proto.toggle = function toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + }; + + _proto.show = function show(relatedTarget) { + var _this = this; + + if (this._isShown || this._isTransitioning) { + return; + } + + if ($(this._element).hasClass(ClassName$5.FADE)) { + this._isTransitioning = true; + } + + var showEvent = $.Event(Event$5.SHOW, { + relatedTarget: relatedTarget + }); + $(this._element).trigger(showEvent); + + if (this._isShown || showEvent.isDefaultPrevented()) { + return; + } + + this._isShown = true; + + this._checkScrollbar(); + + this._setScrollbar(); + + this._adjustDialog(); + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) { + return _this.hide(event); + }); + $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () { + $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) { + if ($(event.target).is(_this._element)) { + _this._ignoreBackdropClick = true; + } + }); + }); + + this._showBackdrop(function () { + return _this._showElement(relatedTarget); + }); + }; + + _proto.hide = function hide(event) { + var _this2 = this; + + if (event) { + event.preventDefault(); + } + + if (!this._isShown || this._isTransitioning) { + return; + } + + var hideEvent = $.Event(Event$5.HIDE); + $(this._element).trigger(hideEvent); + + if (!this._isShown || hideEvent.isDefaultPrevented()) { + return; + } + + this._isShown = false; + var transition = $(this._element).hasClass(ClassName$5.FADE); + + if (transition) { + this._isTransitioning = true; + } + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $(document).off(Event$5.FOCUSIN); + $(this._element).removeClass(ClassName$5.SHOW); + $(this._element).off(Event$5.CLICK_DISMISS); + $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS); + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, function (event) { + return _this2._hideModal(event); + }).emulateTransitionEnd(transitionDuration); + } else { + this._hideModal(); + } + }; + + _proto.dispose = function dispose() { + [window, this._element, this._dialog].forEach(function (htmlElement) { + return $(htmlElement).off(EVENT_KEY$5); + }); + /** + * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API` + * Do not move `document` in `htmlElements` array + * It will remove `Event.CLICK_DATA_API` event that should remain + */ + + $(document).off(Event$5.FOCUSIN); + $.removeData(this._element, DATA_KEY$5); + this._config = null; + this._element = null; + this._dialog = null; + this._backdrop = null; + this._isShown = null; + this._isBodyOverflowing = null; + this._ignoreBackdropClick = null; + this._isTransitioning = null; + this._scrollbarWidth = null; + }; + + _proto.handleUpdate = function handleUpdate() { + this._adjustDialog(); + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default$3, {}, config); + Util.typeCheckConfig(NAME$5, config, DefaultType$3); + return config; + }; + + _proto._triggerBackdropTransition = function _triggerBackdropTransition() { + var _this3 = this; + + if (this._config.backdrop === 'static') { + var hideEventPrevented = $.Event(Event$5.HIDE_PREVENTED); + $(this._element).trigger(hideEventPrevented); + + if (hideEventPrevented.defaultPrevented) { + return; + } + + this._element.classList.add(ClassName$5.STATIC); + + var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, function () { + _this3._element.classList.remove(ClassName$5.STATIC); + }).emulateTransitionEnd(modalTransitionDuration); + + this._element.focus(); + } else { + this.hide(); + } + }; + + _proto._showElement = function _showElement(relatedTarget) { + var _this4 = this; + + var transition = $(this._element).hasClass(ClassName$5.FADE); + var modalBody = this._dialog ? this._dialog.querySelector(Selector$5.MODAL_BODY) : null; + + if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { + // Don't move modal's DOM position + document.body.appendChild(this._element); + } + + this._element.style.display = 'block'; + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE) && modalBody) { + modalBody.scrollTop = 0; + } else { + this._element.scrollTop = 0; + } + + if (transition) { + Util.reflow(this._element); + } + + $(this._element).addClass(ClassName$5.SHOW); + + if (this._config.focus) { + this._enforceFocus(); + } + + var shownEvent = $.Event(Event$5.SHOWN, { + relatedTarget: relatedTarget + }); + + var transitionComplete = function transitionComplete() { + if (_this4._config.focus) { + _this4._element.focus(); + } + + _this4._isTransitioning = false; + $(_this4._element).trigger(shownEvent); + }; + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); + $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); + } else { + transitionComplete(); + } + }; + + _proto._enforceFocus = function _enforceFocus() { + var _this5 = this; + + $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop + .on(Event$5.FOCUSIN, function (event) { + if (document !== event.target && _this5._element !== event.target && $(_this5._element).has(event.target).length === 0) { + _this5._element.focus(); + } + }); + }; + + _proto._setEscapeEvent = function _setEscapeEvent() { + var _this6 = this; + + if (this._isShown && this._config.keyboard) { + $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) { + if (event.which === ESCAPE_KEYCODE$1) { + _this6._triggerBackdropTransition(); + } + }); + } else if (!this._isShown) { + $(this._element).off(Event$5.KEYDOWN_DISMISS); + } + }; + + _proto._setResizeEvent = function _setResizeEvent() { + var _this7 = this; + + if (this._isShown) { + $(window).on(Event$5.RESIZE, function (event) { + return _this7.handleUpdate(event); + }); + } else { + $(window).off(Event$5.RESIZE); + } + }; + + _proto._hideModal = function _hideModal() { + var _this8 = this; + + this._element.style.display = 'none'; + + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._isTransitioning = false; + + this._showBackdrop(function () { + $(document.body).removeClass(ClassName$5.OPEN); + + _this8._resetAdjustments(); + + _this8._resetScrollbar(); + + $(_this8._element).trigger(Event$5.HIDDEN); + }); + }; + + _proto._removeBackdrop = function _removeBackdrop() { + if (this._backdrop) { + $(this._backdrop).remove(); + this._backdrop = null; + } + }; + + _proto._showBackdrop = function _showBackdrop(callback) { + var _this9 = this; + + var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : ''; + + if (this._isShown && this._config.backdrop) { + this._backdrop = document.createElement('div'); + this._backdrop.className = ClassName$5.BACKDROP; + + if (animate) { + this._backdrop.classList.add(animate); + } + + $(this._backdrop).appendTo(document.body); + $(this._element).on(Event$5.CLICK_DISMISS, function (event) { + if (_this9._ignoreBackdropClick) { + _this9._ignoreBackdropClick = false; + return; + } + + if (event.target !== event.currentTarget) { + return; + } + + _this9._triggerBackdropTransition(); + }); + + if (animate) { + Util.reflow(this._backdrop); + } + + $(this._backdrop).addClass(ClassName$5.SHOW); + + if (!callback) { + return; + } + + if (!animate) { + callback(); + return; + } + + var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); + } else if (!this._isShown && this._backdrop) { + $(this._backdrop).removeClass(ClassName$5.SHOW); + + var callbackRemove = function callbackRemove() { + _this9._removeBackdrop(); + + if (callback) { + callback(); + } + }; + + if ($(this._element).hasClass(ClassName$5.FADE)) { + var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + + $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); + } else { + callbackRemove(); + } + } else if (callback) { + callback(); + } + } // ---------------------------------------------------------------------- + // the following methods are used to handle overflowing modals + // todo (fat): these should probably be refactored out of modal.js + // ---------------------------------------------------------------------- + ; + + _proto._adjustDialog = function _adjustDialog() { + var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + if (!this._isBodyOverflowing && isModalOverflowing) { + this._element.style.paddingLeft = this._scrollbarWidth + "px"; + } + + if (this._isBodyOverflowing && !isModalOverflowing) { + this._element.style.paddingRight = this._scrollbarWidth + "px"; + } + }; + + _proto._resetAdjustments = function _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + }; + + _proto._checkScrollbar = function _checkScrollbar() { + var rect = document.body.getBoundingClientRect(); + this._isBodyOverflowing = rect.left + rect.right < window.innerWidth; + this._scrollbarWidth = this._getScrollbarWidth(); + }; + + _proto._setScrollbar = function _setScrollbar() { + var _this10 = this; + + if (this._isBodyOverflowing) { + // Note: DOMNode.style.paddingRight returns the actual value or '' if not set + // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set + var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT)); + var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding + + $(fixedContent).each(function (index, element) { + var actualPadding = element.style.paddingRight; + var calculatedPadding = $(element).css('padding-right'); + $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px"); + }); // Adjust sticky content margin + + $(stickyContent).each(function (index, element) { + var actualMargin = element.style.marginRight; + var calculatedMargin = $(element).css('margin-right'); + $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px"); + }); // Adjust body padding + + var actualPadding = document.body.style.paddingRight; + var calculatedPadding = $(document.body).css('padding-right'); + $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); + } + + $(document.body).addClass(ClassName$5.OPEN); + }; + + _proto._resetScrollbar = function _resetScrollbar() { + // Restore fixed content padding + var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT)); + $(fixedContent).each(function (index, element) { + var padding = $(element).data('padding-right'); + $(element).removeData('padding-right'); + element.style.paddingRight = padding ? padding : ''; + }); // Restore sticky content + + var elements = [].slice.call(document.querySelectorAll("" + Selector$5.STICKY_CONTENT)); + $(elements).each(function (index, element) { + var margin = $(element).data('margin-right'); + + if (typeof margin !== 'undefined') { + $(element).css('margin-right', margin).removeData('margin-right'); + } + }); // Restore body padding + + var padding = $(document.body).data('padding-right'); + $(document.body).removeData('padding-right'); + document.body.style.paddingRight = padding ? padding : ''; + }; + + _proto._getScrollbarWidth = function _getScrollbarWidth() { + // thx d.walsh + var scrollDiv = document.createElement('div'); + scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER; + document.body.appendChild(scrollDiv); + var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; + } // Static + ; + + Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { + return this.each(function () { + var data = $(this).data(DATA_KEY$5); + + var _config = _objectSpread2({}, Default$3, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {}); + + if (!data) { + data = new Modal(this, _config); + $(this).data(DATA_KEY$5, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](relatedTarget); + } else if (_config.show) { + data.show(relatedTarget); + } + }); + }; + + _createClass(Modal, null, [{ + key: "VERSION", + get: function get() { + return VERSION$5; + } + }, { + key: "Default", + get: function get() { + return Default$3; + } + }]); + + return Modal; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) { + var _this11 = this; + + var target; + var selector = Util.getSelectorFromElement(this); + + if (selector) { + target = document.querySelector(selector); + } + + var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data()); + + if (this.tagName === 'A' || this.tagName === 'AREA') { + event.preventDefault(); + } + + var $target = $(target).one(Event$5.SHOW, function (showEvent) { + if (showEvent.isDefaultPrevented()) { + // Only register focus restorer if modal will actually get shown + return; + } + + $target.one(Event$5.HIDDEN, function () { + if ($(_this11).is(':visible')) { + _this11.focus(); + } + }); + }); + + Modal._jQueryInterface.call($(target), config, this); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME$5] = Modal._jQueryInterface; + $.fn[NAME$5].Constructor = Modal; + + $.fn[NAME$5].noConflict = function () { + $.fn[NAME$5] = JQUERY_NO_CONFLICT$5; + return Modal._jQueryInterface; + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.4.1): tools/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; + var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + var DefaultWhitelist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }; + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi; + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i; + + function allowedAttribute(attr, allowedAttributeList) { + var attrName = attr.nodeName.toLowerCase(); + + if (allowedAttributeList.indexOf(attrName) !== -1) { + if (uriAttrs.indexOf(attrName) !== -1) { + return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)); + } + + return true; + } + + var regExp = allowedAttributeList.filter(function (attrRegex) { + return attrRegex instanceof RegExp; + }); // Check if a regular expression validates the attribute. + + for (var i = 0, l = regExp.length; i < l; i++) { + if (attrName.match(regExp[i])) { + return true; + } + } + + return false; + } + + function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { + if (unsafeHtml.length === 0) { + return unsafeHtml; + } + + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeHtml); + } + + var domParser = new window.DOMParser(); + var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + var whitelistKeys = Object.keys(whiteList); + var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); + + var _loop = function _loop(i, len) { + var el = elements[i]; + var elName = el.nodeName.toLowerCase(); + + if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { + el.parentNode.removeChild(el); + return "continue"; + } + + var attributeList = [].slice.call(el.attributes); + var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); + attributeList.forEach(function (attr) { + if (!allowedAttribute(attr, whitelistedAttributes)) { + el.removeAttribute(attr.nodeName); + } + }); + }; + + for (var i = 0, len = elements.length; i < len; i++) { + var _ret = _loop(i); + + if (_ret === "continue") continue; + } + + return createdDocument.body.innerHTML; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$6 = 'tooltip'; + var VERSION$6 = '4.4.1'; + var DATA_KEY$6 = 'bs.tooltip'; + var EVENT_KEY$6 = "." + DATA_KEY$6; + var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6]; + var CLASS_PREFIX = 'bs-tooltip'; + var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); + var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; + var DefaultType$4 = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(number|string|function)', + container: '(string|element|boolean)', + fallbackPlacement: '(string|array)', + boundary: '(string|element)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + whiteList: 'object', + popperConfig: '(null|object)' + }; + var AttachmentMap$1 = { + AUTO: 'auto', + TOP: 'top', + RIGHT: 'right', + BOTTOM: 'bottom', + LEFT: 'left' + }; + var Default$4 = { + animation: true, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + selector: false, + placement: 'top', + offset: 0, + container: false, + fallbackPlacement: 'flip', + boundary: 'scrollParent', + sanitize: true, + sanitizeFn: null, + whiteList: DefaultWhitelist, + popperConfig: null + }; + var HoverState = { + SHOW: 'show', + OUT: 'out' + }; + var Event$6 = { + HIDE: "hide" + EVENT_KEY$6, + HIDDEN: "hidden" + EVENT_KEY$6, + SHOW: "show" + EVENT_KEY$6, + SHOWN: "shown" + EVENT_KEY$6, + INSERTED: "inserted" + EVENT_KEY$6, + CLICK: "click" + EVENT_KEY$6, + FOCUSIN: "focusin" + EVENT_KEY$6, + FOCUSOUT: "focusout" + EVENT_KEY$6, + MOUSEENTER: "mouseenter" + EVENT_KEY$6, + MOUSELEAVE: "mouseleave" + EVENT_KEY$6 + }; + var ClassName$6 = { + FADE: 'fade', + SHOW: 'show' + }; + var Selector$6 = { + TOOLTIP: '.tooltip', + TOOLTIP_INNER: '.tooltip-inner', + ARROW: '.arrow' + }; + var Trigger = { + HOVER: 'hover', + FOCUS: 'focus', + CLICK: 'click', + MANUAL: 'manual' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Tooltip = + /*#__PURE__*/ + function () { + function Tooltip(element, config) { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)'); + } // private + + + this._isEnabled = true; + this._timeout = 0; + this._hoverState = ''; + this._activeTrigger = {}; + this._popper = null; // Protected + + this.element = element; + this.config = this._getConfig(config); + this.tip = null; + + this._setListeners(); + } // Getters + + + var _proto = Tooltip.prototype; + + // Public + _proto.enable = function enable() { + this._isEnabled = true; + }; + + _proto.disable = function disable() { + this._isEnabled = false; + }; + + _proto.toggleEnabled = function toggleEnabled() { + this._isEnabled = !this._isEnabled; + }; + + _proto.toggle = function toggle(event) { + if (!this._isEnabled) { + return; + } + + if (event) { + var dataKey = this.constructor.DATA_KEY; + var context = $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + context._activeTrigger.click = !context._activeTrigger.click; + + if (context._isWithActiveTrigger()) { + context._enter(null, context); + } else { + context._leave(null, context); + } + } else { + if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) { + this._leave(null, this); + + return; + } + + this._enter(null, this); + } + }; + + _proto.dispose = function dispose() { + clearTimeout(this._timeout); + $.removeData(this.element, this.constructor.DATA_KEY); + $(this.element).off(this.constructor.EVENT_KEY); + $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler); + + if (this.tip) { + $(this.tip).remove(); + } + + this._isEnabled = null; + this._timeout = null; + this._hoverState = null; + this._activeTrigger = null; + + if (this._popper) { + this._popper.destroy(); + } + + this._popper = null; + this.element = null; + this.config = null; + this.tip = null; + }; + + _proto.show = function show() { + var _this = this; + + if ($(this.element).css('display') === 'none') { + throw new Error('Please use show on visible elements'); + } + + var showEvent = $.Event(this.constructor.Event.SHOW); + + if (this.isWithContent() && this._isEnabled) { + $(this.element).trigger(showEvent); + var shadowRoot = Util.findShadowRoot(this.element); + var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); + + if (showEvent.isDefaultPrevented() || !isInTheDom) { + return; + } + + var tip = this.getTipElement(); + var tipId = Util.getUID(this.constructor.NAME); + tip.setAttribute('id', tipId); + this.element.setAttribute('aria-describedby', tipId); + this.setContent(); + + if (this.config.animation) { + $(tip).addClass(ClassName$6.FADE); + } + + var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; + + var attachment = this._getAttachment(placement); + + this.addAttachmentClass(attachment); + + var container = this._getContainer(); + + $(tip).data(this.constructor.DATA_KEY, this); + + if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) { + $(tip).appendTo(container); + } + + $(this.element).trigger(this.constructor.Event.INSERTED); + this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment)); + $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().on('mouseover', null, $.noop); + } + + var complete = function complete() { + if (_this.config.animation) { + _this._fixTransition(); + } + + var prevHoverState = _this._hoverState; + _this._hoverState = null; + $(_this.element).trigger(_this.constructor.Event.SHOWN); + + if (prevHoverState === HoverState.OUT) { + _this._leave(null, _this); + } + }; + + if ($(this.tip).hasClass(ClassName$6.FADE)) { + var transitionDuration = Util.getTransitionDurationFromElement(this.tip); + $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + } + }; + + _proto.hide = function hide(callback) { + var _this2 = this; + + var tip = this.getTipElement(); + var hideEvent = $.Event(this.constructor.Event.HIDE); + + var complete = function complete() { + if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) { + tip.parentNode.removeChild(tip); + } + + _this2._cleanTipClass(); + + _this2.element.removeAttribute('aria-describedby'); + + $(_this2.element).trigger(_this2.constructor.Event.HIDDEN); + + if (_this2._popper !== null) { + _this2._popper.destroy(); + } + + if (callback) { + callback(); + } + }; + + $(this.element).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().off('mouseover', null, $.noop); + } + + this._activeTrigger[Trigger.CLICK] = false; + this._activeTrigger[Trigger.FOCUS] = false; + this._activeTrigger[Trigger.HOVER] = false; + + if ($(this.tip).hasClass(ClassName$6.FADE)) { + var transitionDuration = Util.getTransitionDurationFromElement(tip); + $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + + this._hoverState = ''; + }; + + _proto.update = function update() { + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Protected + ; + + _proto.isWithContent = function isWithContent() { + return Boolean(this.getTitle()); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $(this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var tip = this.getTipElement(); + this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle()); + $(tip).removeClass(ClassName$6.FADE + " " + ClassName$6.SHOW); + }; + + _proto.setElementContent = function setElementContent($element, content) { + if (typeof content === 'object' && (content.nodeType || content.jquery)) { + // Content is a DOM node or a jQuery + if (this.config.html) { + if (!$(content).parent().is($element)) { + $element.empty().append(content); + } + } else { + $element.text($(content).text()); + } + + return; + } + + if (this.config.html) { + if (this.config.sanitize) { + content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); + } + + $element.html(content); + } else { + $element.text(content); + } + }; + + _proto.getTitle = function getTitle() { + var title = this.element.getAttribute('data-original-title'); + + if (!title) { + title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; + } + + return title; + } // Private + ; + + _proto._getPopperConfig = function _getPopperConfig(attachment) { + var _this3 = this; + + var defaultBsConfig = { + placement: attachment, + modifiers: { + offset: this._getOffset(), + flip: { + behavior: this.config.fallbackPlacement + }, + arrow: { + element: Selector$6.ARROW + }, + preventOverflow: { + boundariesElement: this.config.boundary + } + }, + onCreate: function onCreate(data) { + if (data.originalPlacement !== data.placement) { + _this3._handlePopperPlacementChange(data); + } + }, + onUpdate: function onUpdate(data) { + return _this3._handlePopperPlacementChange(data); + } + }; + return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig); + }; + + _proto._getOffset = function _getOffset() { + var _this4 = this; + + var offset = {}; + + if (typeof this.config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {}); + return data; + }; + } else { + offset.offset = this.config.offset; + } + + return offset; + }; + + _proto._getContainer = function _getContainer() { + if (this.config.container === false) { + return document.body; + } + + if (Util.isElement(this.config.container)) { + return $(this.config.container); + } + + return $(document).find(this.config.container); + }; + + _proto._getAttachment = function _getAttachment(placement) { + return AttachmentMap$1[placement.toUpperCase()]; + }; + + _proto._setListeners = function _setListeners() { + var _this5 = this; + + var triggers = this.config.trigger.split(' '); + triggers.forEach(function (trigger) { + if (trigger === 'click') { + $(_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) { + return _this5.toggle(event); + }); + } else if (trigger !== Trigger.MANUAL) { + var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN; + var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT; + $(_this5.element).on(eventIn, _this5.config.selector, function (event) { + return _this5._enter(event); + }).on(eventOut, _this5.config.selector, function (event) { + return _this5._leave(event); + }); + } + }); + + this._hideModalHandler = function () { + if (_this5.element) { + _this5.hide(); + } + }; + + $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler); + + if (this.config.selector) { + this.config = _objectSpread2({}, this.config, { + trigger: 'manual', + selector: '' + }); + } else { + this._fixTitle(); + } + }; + + _proto._fixTitle = function _fixTitle() { + var titleType = typeof this.element.getAttribute('data-original-title'); + + if (this.element.getAttribute('title') || titleType !== 'string') { + this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); + this.element.setAttribute('title', ''); + } + }; + + _proto._enter = function _enter(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; + } + + if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) { + context._hoverState = HoverState.SHOW; + return; + } + + clearTimeout(context._timeout); + context._hoverState = HoverState.SHOW; + + if (!context.config.delay || !context.config.delay.show) { + context.show(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HoverState.SHOW) { + context.show(); + } + }, context.config.delay.show); + }; + + _proto._leave = function _leave(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false; + } + + if (context._isWithActiveTrigger()) { + return; + } + + clearTimeout(context._timeout); + context._hoverState = HoverState.OUT; + + if (!context.config.delay || !context.config.delay.hide) { + context.hide(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HoverState.OUT) { + context.hide(); + } + }, context.config.delay.hide); + }; + + _proto._isWithActiveTrigger = function _isWithActiveTrigger() { + for (var trigger in this._activeTrigger) { + if (this._activeTrigger[trigger]) { + return true; + } + } + + return false; + }; + + _proto._getConfig = function _getConfig(config) { + var dataAttributes = $(this.element).data(); + Object.keys(dataAttributes).forEach(function (dataAttr) { + if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { + delete dataAttributes[dataAttr]; + } + }); + config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {}); + + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + + Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType); + + if (config.sanitize) { + config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); + } + + return config; + }; + + _proto._getDelegateConfig = function _getDelegateConfig() { + var config = {}; + + if (this.config) { + for (var key in this.config) { + if (this.constructor.Default[key] !== this.config[key]) { + config[key] = this.config[key]; + } + } + } + + return config; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $(this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); + + if (tabClass !== null && tabClass.length) { + $tip.removeClass(tabClass.join('')); + } + }; + + _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { + var popperInstance = popperData.instance; + this.tip = popperInstance.popper; + + this._cleanTipClass(); + + this.addAttachmentClass(this._getAttachment(popperData.placement)); + }; + + _proto._fixTransition = function _fixTransition() { + var tip = this.getTipElement(); + var initConfigAnimation = this.config.animation; + + if (tip.getAttribute('x-placement') !== null) { + return; + } + + $(tip).removeClass(ClassName$6.FADE); + this.config.animation = false; + this.hide(); + this.show(); + this.config.animation = initConfigAnimation; + } // Static + ; + + Tooltip._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$6); + + var _config = typeof config === 'object' && config; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Tooltip(this, _config); + $(this).data(DATA_KEY$6, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Tooltip, null, [{ + key: "VERSION", + get: function get() { + return VERSION$6; + } + }, { + key: "Default", + get: function get() { + return Default$4; + } + }, { + key: "NAME", + get: function get() { + return NAME$6; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY$6; + } + }, { + key: "Event", + get: function get() { + return Event$6; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY$6; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$4; + } + }]); + + return Tooltip; + }(); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $.fn[NAME$6] = Tooltip._jQueryInterface; + $.fn[NAME$6].Constructor = Tooltip; + + $.fn[NAME$6].noConflict = function () { + $.fn[NAME$6] = JQUERY_NO_CONFLICT$6; + return Tooltip._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$7 = 'popover'; + var VERSION$7 = '4.4.1'; + var DATA_KEY$7 = 'bs.popover'; + var EVENT_KEY$7 = "." + DATA_KEY$7; + var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7]; + var CLASS_PREFIX$1 = 'bs-popover'; + var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); + + var Default$5 = _objectSpread2({}, Tooltip.Default, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }); + + var DefaultType$5 = _objectSpread2({}, Tooltip.DefaultType, { + content: '(string|element|function)' + }); + + var ClassName$7 = { + FADE: 'fade', + SHOW: 'show' + }; + var Selector$7 = { + TITLE: '.popover-header', + CONTENT: '.popover-body' + }; + var Event$7 = { + HIDE: "hide" + EVENT_KEY$7, + HIDDEN: "hidden" + EVENT_KEY$7, + SHOW: "show" + EVENT_KEY$7, + SHOWN: "shown" + EVENT_KEY$7, + INSERTED: "inserted" + EVENT_KEY$7, + CLICK: "click" + EVENT_KEY$7, + FOCUSIN: "focusin" + EVENT_KEY$7, + FOCUSOUT: "focusout" + EVENT_KEY$7, + MOUSEENTER: "mouseenter" + EVENT_KEY$7, + MOUSELEAVE: "mouseleave" + EVENT_KEY$7 + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Popover = + /*#__PURE__*/ + function (_Tooltip) { + _inheritsLoose(Popover, _Tooltip); + + function Popover() { + return _Tooltip.apply(this, arguments) || this; + } + + var _proto = Popover.prototype; + + // Overrides + _proto.isWithContent = function isWithContent() { + return this.getTitle() || this._getContent(); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $(this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $(this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events + + this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle()); + + var content = this._getContent(); + + if (typeof content === 'function') { + content = content.call(this.element); + } + + this.setElementContent($tip.find(Selector$7.CONTENT), content); + $tip.removeClass(ClassName$7.FADE + " " + ClassName$7.SHOW); + } // Private + ; + + _proto._getContent = function _getContent() { + return this.element.getAttribute('data-content') || this.config.content; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $(this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1); + + if (tabClass !== null && tabClass.length > 0) { + $tip.removeClass(tabClass.join('')); + } + } // Static + ; + + Popover._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY$7); + + var _config = typeof config === 'object' ? config : null; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Popover(this, _config); + $(this).data(DATA_KEY$7, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Popover, null, [{ + key: "VERSION", + // Getters + get: function get() { + return VERSION$7; + } + }, { + key: "Default", + get: function get() { + return Default$5; + } + }, { + key: "NAME", + get: function get() { + return NAME$7; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY$7; + } + }, { + key: "Event", + get: function get() { + return Event$7; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY$7; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$5; + } + }]); + + return Popover; + }(Tooltip); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $.fn[NAME$7] = Popover._jQueryInterface; + $.fn[NAME$7].Constructor = Popover; + + $.fn[NAME$7].noConflict = function () { + $.fn[NAME$7] = JQUERY_NO_CONFLICT$7; + return Popover._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$8 = 'scrollspy'; + var VERSION$8 = '4.4.1'; + var DATA_KEY$8 = 'bs.scrollspy'; + var EVENT_KEY$8 = "." + DATA_KEY$8; + var DATA_API_KEY$6 = '.data-api'; + var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8]; + var Default$6 = { + offset: 10, + method: 'auto', + target: '' + }; + var DefaultType$6 = { + offset: 'number', + method: 'string', + target: '(string|element)' + }; + var Event$8 = { + ACTIVATE: "activate" + EVENT_KEY$8, + SCROLL: "scroll" + EVENT_KEY$8, + LOAD_DATA_API: "load" + EVENT_KEY$8 + DATA_API_KEY$6 + }; + var ClassName$8 = { + DROPDOWN_ITEM: 'dropdown-item', + DROPDOWN_MENU: 'dropdown-menu', + ACTIVE: 'active' + }; + var Selector$8 = { + DATA_SPY: '[data-spy="scroll"]', + ACTIVE: '.active', + NAV_LIST_GROUP: '.nav, .list-group', + NAV_LINKS: '.nav-link', + NAV_ITEMS: '.nav-item', + LIST_ITEMS: '.list-group-item', + DROPDOWN: '.dropdown', + DROPDOWN_ITEMS: '.dropdown-item', + DROPDOWN_TOGGLE: '.dropdown-toggle' + }; + var OffsetMethod = { + OFFSET: 'offset', + POSITION: 'position' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var ScrollSpy = + /*#__PURE__*/ + function () { + function ScrollSpy(element, config) { + var _this = this; + + this._element = element; + this._scrollElement = element.tagName === 'BODY' ? window : element; + this._config = this._getConfig(config); + this._selector = this._config.target + " " + Selector$8.NAV_LINKS + "," + (this._config.target + " " + Selector$8.LIST_ITEMS + ",") + (this._config.target + " " + Selector$8.DROPDOWN_ITEMS); + this._offsets = []; + this._targets = []; + this._activeTarget = null; + this._scrollHeight = 0; + $(this._scrollElement).on(Event$8.SCROLL, function (event) { + return _this._process(event); + }); + this.refresh(); + + this._process(); + } // Getters + + + var _proto = ScrollSpy.prototype; + + // Public + _proto.refresh = function refresh() { + var _this2 = this; + + var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION; + var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; + var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0; + this._offsets = []; + this._targets = []; + this._scrollHeight = this._getScrollHeight(); + var targets = [].slice.call(document.querySelectorAll(this._selector)); + targets.map(function (element) { + var target; + var targetSelector = Util.getSelectorFromElement(element); + + if (targetSelector) { + target = document.querySelector(targetSelector); + } + + if (target) { + var targetBCR = target.getBoundingClientRect(); + + if (targetBCR.width || targetBCR.height) { + // TODO (fat): remove sketch reliance on jQuery position/offset + return [$(target)[offsetMethod]().top + offsetBase, targetSelector]; + } + } + + return null; + }).filter(function (item) { + return item; + }).sort(function (a, b) { + return a[0] - b[0]; + }).forEach(function (item) { + _this2._offsets.push(item[0]); + + _this2._targets.push(item[1]); + }); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY$8); + $(this._scrollElement).off(EVENT_KEY$8); + this._element = null; + this._scrollElement = null; + this._config = null; + this._selector = null; + this._offsets = null; + this._targets = null; + this._activeTarget = null; + this._scrollHeight = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread2({}, Default$6, {}, typeof config === 'object' && config ? config : {}); + + if (typeof config.target !== 'string') { + var id = $(config.target).attr('id'); + + if (!id) { + id = Util.getUID(NAME$8); + $(config.target).attr('id', id); + } + + config.target = "#" + id; + } + + Util.typeCheckConfig(NAME$8, config, DefaultType$6); + return config; + }; + + _proto._getScrollTop = function _getScrollTop() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; + }; + + _proto._getScrollHeight = function _getScrollHeight() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); + }; + + _proto._getOffsetHeight = function _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; + }; + + _proto._process = function _process() { + var scrollTop = this._getScrollTop() + this._config.offset; + + var scrollHeight = this._getScrollHeight(); + + var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); + + if (this._scrollHeight !== scrollHeight) { + this.refresh(); + } + + if (scrollTop >= maxScroll) { + var target = this._targets[this._targets.length - 1]; + + if (this._activeTarget !== target) { + this._activate(target); + } + + return; + } + + if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { + this._activeTarget = null; + + this._clear(); + + return; + } + + var offsetLength = this._offsets.length; + + for (var i = offsetLength; i--;) { + var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); + + if (isActiveTarget) { + this._activate(this._targets[i]); + } + } + }; + + _proto._activate = function _activate(target) { + this._activeTarget = target; + + this._clear(); + + var queries = this._selector.split(',').map(function (selector) { + return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; + }); + + var $link = $([].slice.call(document.querySelectorAll(queries.join(',')))); + + if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) { + $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE); + $link.addClass(ClassName$8.ACTIVE); + } else { + // Set triggered link as active + $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active + // With both