mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-17 21:24:28 +00:00
Merge branch 'master' into async-reads
This commit is contained in:
commit
4d9ad3725d
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -3,7 +3,7 @@ I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla
|
|||||||
Changelog category (leave one):
|
Changelog category (leave one):
|
||||||
- New Feature
|
- New Feature
|
||||||
- Improvement
|
- Improvement
|
||||||
- Bug Fix
|
- Bug Fix (user-visible misbehaviour in official stable or prestable release)
|
||||||
- Performance Improvement
|
- Performance Improvement
|
||||||
- Backward Incompatible Change
|
- Backward Incompatible Change
|
||||||
- Build/Testing/Packaging Improvement
|
- Build/Testing/Packaging Improvement
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
### ClickHouse release v21.8, 2021-08-12
|
### ClickHouse release v21.8, 2021-08-12
|
||||||
|
|
||||||
|
#### Upgrade Notes
|
||||||
|
* New version is using `Map` data type for system logs tables (`system.query_log`, `system.query_thread_log`, `system.processes`, `system.opentelemetry_span_log`). These tables will be auto-created with new data types. Virtual columns are created to support old queries. Closes [#18698](https://github.com/ClickHouse/ClickHouse/issues/18698). [#23934](https://github.com/ClickHouse/ClickHouse/pull/23934), [#25773](https://github.com/ClickHouse/ClickHouse/pull/25773) ([hexiaoting](https://github.com/hexiaoting), [sundy-li](https://github.com/sundy-li), [Maksim Kita](https://github.com/kitaisreal)). If you want to *downgrade* from version 21.8 to older versions, you will need to cleanup system tables with logs manually. Look at `/var/lib/clickhouse/data/system/*_log`.
|
||||||
|
|
||||||
#### New Features
|
#### New Features
|
||||||
|
|
||||||
* Add support for a part of SQL/JSON standard. [#24148](https://github.com/ClickHouse/ClickHouse/pull/24148) ([l1tsolaiki](https://github.com/l1tsolaiki), [Kseniia Sumarokova](https://github.com/kssenii)).
|
* Add support for a part of SQL/JSON standard. [#24148](https://github.com/ClickHouse/ClickHouse/pull/24148) ([l1tsolaiki](https://github.com/l1tsolaiki), [Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
@ -45,6 +45,7 @@ include (cmake/arch.cmake)
|
|||||||
include (cmake/target.cmake)
|
include (cmake/target.cmake)
|
||||||
include (cmake/tools.cmake)
|
include (cmake/tools.cmake)
|
||||||
include (cmake/analysis.cmake)
|
include (cmake/analysis.cmake)
|
||||||
|
include (cmake/git_status.cmake)
|
||||||
|
|
||||||
# Ignore export() since we don't use it,
|
# Ignore export() since we don't use it,
|
||||||
# but it gets broken with a global targets via link_libraries()
|
# but it gets broken with a global targets via link_libraries()
|
||||||
@ -593,7 +594,23 @@ macro (add_executable target)
|
|||||||
# disabled for TSAN and gcc since libtsan.a provides overrides too
|
# disabled for TSAN and gcc since libtsan.a provides overrides too
|
||||||
if (TARGET clickhouse_new_delete)
|
if (TARGET clickhouse_new_delete)
|
||||||
# operator::new/delete for executables (MemoryTracker stuff)
|
# operator::new/delete for executables (MemoryTracker stuff)
|
||||||
target_link_libraries (${target} PRIVATE clickhouse_new_delete ${MALLOC_LIBRARIES})
|
target_link_libraries (${target} PRIVATE clickhouse_new_delete)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# In case of static jemalloc, because zone_register() is located in zone.c and
|
||||||
|
# is never used outside (it is declared as constructor) it is omitted
|
||||||
|
# by the linker, and so jemalloc will not be registered as system
|
||||||
|
# allocator under osx [1], and clickhouse will SIGSEGV.
|
||||||
|
#
|
||||||
|
# [1]: https://github.com/jemalloc/jemalloc/issues/708
|
||||||
|
#
|
||||||
|
# About symbol name:
|
||||||
|
# - _zone_register not zone_register due to Mach-O binary format,
|
||||||
|
# - _je_zone_register due to JEMALLOC_PRIVATE_NAMESPACE=je_ under OS X.
|
||||||
|
# - but jemalloc-cmake does not run private_namespace.sh
|
||||||
|
# so symbol name should be _zone_register
|
||||||
|
if (ENABLE_JEMALLOC AND MAKE_STATIC_LIBRARIES AND OS_DARWIN)
|
||||||
|
set_property(TARGET ${target} APPEND PROPERTY LINK_OPTIONS -u_zone_register)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
49
SECURITY.md
49
SECURITY.md
@ -1,9 +1,11 @@
|
|||||||
# Security Policy
|
# Security Policy
|
||||||
|
|
||||||
## Supported Versions
|
## Security Announcements
|
||||||
|
Security fixes will be announced by posting them in the [security changelog](https://clickhouse.tech/docs/en/whats-new/security-changelog/)
|
||||||
|
|
||||||
The following versions of ClickHouse server are
|
## Scope and Supported Versions
|
||||||
currently being supported with security updates:
|
|
||||||
|
The following versions of ClickHouse server are currently being supported with security updates:
|
||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ------------------ |
|
||||||
@ -11,18 +13,49 @@ currently being supported with security updates:
|
|||||||
| 18.x | :x: |
|
| 18.x | :x: |
|
||||||
| 19.x | :x: |
|
| 19.x | :x: |
|
||||||
| 20.1 | :x: |
|
| 20.1 | :x: |
|
||||||
| 20.3 | :white_check_mark: |
|
| 20.3 | :x: |
|
||||||
| 20.4 | :x: |
|
| 20.4 | :x: |
|
||||||
| 20.5 | :x: |
|
| 20.5 | :x: |
|
||||||
| 20.6 | :x: |
|
| 20.6 | :x: |
|
||||||
| 20.7 | :x: |
|
| 20.7 | :x: |
|
||||||
| 20.8 | :white_check_mark: |
|
| 20.8 | :x: |
|
||||||
| 20.9 | :x: |
|
| 20.9 | :x: |
|
||||||
| 20.10 | :x: |
|
| 20.10 | :x: |
|
||||||
| 20.11 | :white_check_mark: |
|
| 20.11 | :x: |
|
||||||
| 20.12 | :white_check_mark: |
|
| 20.12 | :x: |
|
||||||
| 21.1 | :white_check_mark: |
|
| 21.1 | :x: |
|
||||||
|
| 21.2 | :x: |
|
||||||
|
| 21.3 | ✅ |
|
||||||
|
| 21.4 | :x: |
|
||||||
|
| 21.5 | :x: |
|
||||||
|
| 21.6 | ✅ |
|
||||||
|
| 21.7 | ✅ |
|
||||||
|
| 21.8 | ✅ |
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
We're extremely grateful for security researchers and users that report vulnerabilities to the ClickHouse Open Source Community. All reports are thoroughly investigated by developers.
|
||||||
|
|
||||||
To report a potential vulnerability in ClickHouse please send the details about it to [clickhouse-feedback@yandex-team.com](mailto:clickhouse-feedback@yandex-team.com).
|
To report a potential vulnerability in ClickHouse please send the details about it to [clickhouse-feedback@yandex-team.com](mailto:clickhouse-feedback@yandex-team.com).
|
||||||
|
|
||||||
|
### When Should I Report a Vulnerability?
|
||||||
|
|
||||||
|
- You think you discovered a potential security vulnerability in ClickHouse
|
||||||
|
- You are unsure how a vulnerability affects ClickHouse
|
||||||
|
|
||||||
|
### When Should I NOT Report a Vulnerability?
|
||||||
|
|
||||||
|
- You need help tuning ClickHouse components for security
|
||||||
|
- You need help applying security related updates
|
||||||
|
- Your issue is not security related
|
||||||
|
|
||||||
|
## Security Vulnerability Response
|
||||||
|
|
||||||
|
Each report is acknowledged and analyzed by ClickHouse maintainers within 5 working days.
|
||||||
|
As the security issue moves from triage, to identified fix, to release planning we will keep the reporter updated.
|
||||||
|
|
||||||
|
## Public Disclosure Timing
|
||||||
|
|
||||||
|
A public disclosure date is negotiated by the ClickHouse maintainers and the bug submitter. We prefer to fully disclose the bug as soon as possible once a user mitigation is available. It is reasonable to delay disclosure when the bug or the fix is not yet fully understood, the solution is not well-tested, or for vendor coordination. The timeframe for disclosure is from immediate (especially if it's already publicly known) to 90 days. For a vulnerability with a straightforward mitigation, we expect report date to disclosure date to be on the order of 7 days.
|
||||||
|
|
||||||
|
|
||||||
|
28
base/common/insertAtEnd.h
Normal file
28
base/common/insertAtEnd.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/// Appends a specified vector with elements of another vector.
|
||||||
|
template <typename T>
|
||||||
|
void insertAtEnd(std::vector<T> & dest, const std::vector<T> & src)
|
||||||
|
{
|
||||||
|
if (src.empty())
|
||||||
|
return;
|
||||||
|
dest.reserve(dest.size() + src.size());
|
||||||
|
dest.insert(dest.end(), src.begin(), src.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void insertAtEnd(std::vector<T> & dest, std::vector<T> && src)
|
||||||
|
{
|
||||||
|
if (src.empty())
|
||||||
|
return;
|
||||||
|
if (dest.empty())
|
||||||
|
{
|
||||||
|
dest.swap(src);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dest.reserve(dest.size() + src.size());
|
||||||
|
dest.insert(dest.end(), std::make_move_iterator(src.begin()), std::make_move_iterator(src.end()));
|
||||||
|
src.clear();
|
||||||
|
}
|
10
base/common/unit.h
Normal file
10
base/common/unit.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
constexpr size_t KiB = 1024;
|
||||||
|
constexpr size_t MiB = 1024 * KiB;
|
||||||
|
constexpr size_t GiB = 1024 * MiB;
|
||||||
|
|
||||||
|
constexpr size_t operator"" _KiB(unsigned long long val) { return val * KiB; }
|
||||||
|
constexpr size_t operator"" _MiB(unsigned long long val) { return val * MiB; }
|
||||||
|
constexpr size_t operator"" _GiB(unsigned long long val) { return val * GiB; }
|
@ -9,6 +9,7 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cfloat>
|
#include <cfloat>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <tuple>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
|
|
||||||
@ -39,6 +40,18 @@ static constexpr bool IntegralConcept() noexcept
|
|||||||
return std::is_integral_v<T> || IsWideInteger<T>::value;
|
return std::is_integral_v<T> || IsWideInteger<T>::value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class IsTupleLike
|
||||||
|
{
|
||||||
|
template <typename U>
|
||||||
|
static auto check(U * p) -> decltype(std::tuple_size<U>::value, int());
|
||||||
|
template <typename>
|
||||||
|
static void check(...);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static constexpr const bool value = !std::is_void<decltype(check<T>(nullptr))>::value;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace std
|
namespace std
|
||||||
@ -152,7 +165,7 @@ namespace wide
|
|||||||
template <size_t Bits, typename Signed>
|
template <size_t Bits, typename Signed>
|
||||||
struct integer<Bits, Signed>::_impl
|
struct integer<Bits, Signed>::_impl
|
||||||
{
|
{
|
||||||
static constexpr size_t _Bits = Bits;
|
static constexpr size_t _bits = Bits;
|
||||||
static constexpr const unsigned byte_count = Bits / 8;
|
static constexpr const unsigned byte_count = Bits / 8;
|
||||||
static constexpr const unsigned item_count = byte_count / sizeof(base_type);
|
static constexpr const unsigned item_count = byte_count / sizeof(base_type);
|
||||||
static constexpr const unsigned base_bits = sizeof(base_type) * 8;
|
static constexpr const unsigned base_bits = sizeof(base_type) * 8;
|
||||||
@ -227,6 +240,19 @@ struct integer<Bits, Signed>::_impl
|
|||||||
self.items[i] = 0;
|
self.items[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TupleLike, size_t i = 0>
|
||||||
|
constexpr static void wide_integer_from_tuple_like(integer<Bits, Signed> & self, const TupleLike & tuple) noexcept
|
||||||
|
{
|
||||||
|
if constexpr (i < item_count)
|
||||||
|
{
|
||||||
|
if constexpr (i < std::tuple_size_v<TupleLike>)
|
||||||
|
self.items[i] = std::get<i>(tuple);
|
||||||
|
else
|
||||||
|
self.items[i] = 0;
|
||||||
|
wide_integer_from_tuple_like<TupleLike, i + 1>(self, tuple);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* N.B. t is constructed from double, so max(t) = max(double) ~ 2^310
|
* N.B. t is constructed from double, so max(t) = max(double) ~ 2^310
|
||||||
* the recursive call happens when t / 2^64 > 2^64, so there won't be more than 5 of them.
|
* the recursive call happens when t / 2^64 > 2^64, so there won't be more than 5 of them.
|
||||||
@ -614,8 +640,8 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
static_assert(IsWideInteger<T>::value);
|
static_assert(IsWideInteger<T>::value);
|
||||||
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_Bits, Signed>>::_impl::operator_plus(
|
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_bits, Signed>>::_impl::operator_plus(
|
||||||
integer<T::_impl::_Bits, Signed>(lhs), rhs);
|
integer<T::_impl::_bits, Signed>(lhs), rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -632,8 +658,8 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
static_assert(IsWideInteger<T>::value);
|
static_assert(IsWideInteger<T>::value);
|
||||||
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_Bits, Signed>>::_impl::operator_minus(
|
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_bits, Signed>>::_impl::operator_minus(
|
||||||
integer<T::_impl::_Bits, Signed>(lhs), rhs);
|
integer<T::_impl::_bits, Signed>(lhs), rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -857,7 +883,7 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
static_assert(IsWideInteger<T>::value);
|
static_assert(IsWideInteger<T>::value);
|
||||||
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_Bits, Signed>>::operator_slash(T(lhs), rhs);
|
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_bits, Signed>>::operator_slash(T(lhs), rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -877,7 +903,7 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
static_assert(IsWideInteger<T>::value);
|
static_assert(IsWideInteger<T>::value);
|
||||||
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_Bits, Signed>>::operator_percent(T(lhs), rhs);
|
return std::common_type_t<integer<Bits, Signed>, integer<T::_impl::_bits, Signed>>::operator_percent(T(lhs), rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -966,6 +992,8 @@ constexpr integer<Bits, Signed>::integer(T rhs) noexcept
|
|||||||
{
|
{
|
||||||
if constexpr (IsWideInteger<T>::value)
|
if constexpr (IsWideInteger<T>::value)
|
||||||
_impl::wide_integer_from_wide_integer(*this, rhs);
|
_impl::wide_integer_from_wide_integer(*this, rhs);
|
||||||
|
else if constexpr (IsTupleLike<T>::value)
|
||||||
|
_impl::wide_integer_from_tuple_like(*this, rhs);
|
||||||
else
|
else
|
||||||
_impl::wide_integer_from_builtin(*this, rhs);
|
_impl::wide_integer_from_builtin(*this, rhs);
|
||||||
}
|
}
|
||||||
@ -979,6 +1007,8 @@ constexpr integer<Bits, Signed>::integer(std::initializer_list<T> il) noexcept
|
|||||||
{
|
{
|
||||||
if constexpr (IsWideInteger<T>::value)
|
if constexpr (IsWideInteger<T>::value)
|
||||||
_impl::wide_integer_from_wide_integer(*this, *il.begin());
|
_impl::wide_integer_from_wide_integer(*this, *il.begin());
|
||||||
|
else if constexpr (IsTupleLike<T>::value)
|
||||||
|
_impl::wide_integer_from_tuple_like(*this, *il.begin());
|
||||||
else
|
else
|
||||||
_impl::wide_integer_from_builtin(*this, *il.begin());
|
_impl::wide_integer_from_builtin(*this, *il.begin());
|
||||||
}
|
}
|
||||||
@ -1007,7 +1037,10 @@ template <size_t Bits, typename Signed>
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
constexpr integer<Bits, Signed> & integer<Bits, Signed>::operator=(T rhs) noexcept
|
constexpr integer<Bits, Signed> & integer<Bits, Signed>::operator=(T rhs) noexcept
|
||||||
{
|
{
|
||||||
_impl::wide_integer_from_builtin(*this, rhs);
|
if constexpr (IsTupleLike<T>::value)
|
||||||
|
_impl::wide_integer_from_tuple_like(*this, rhs);
|
||||||
|
else
|
||||||
|
_impl::wide_integer_from_builtin(*this, rhs);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <Common/SymbolIndex.h>
|
#include <Common/SymbolIndex.h>
|
||||||
#include <Common/StackTrace.h>
|
#include <Common/StackTrace.h>
|
||||||
#include <Common/getNumberOfPhysicalCPUCores.h>
|
#include <Common/getNumberOfPhysicalCPUCores.h>
|
||||||
|
#include <Core/ServerUUID.h>
|
||||||
|
|
||||||
#if !defined(ARCADIA_BUILD)
|
#if !defined(ARCADIA_BUILD)
|
||||||
# include "Common/config_version.h"
|
# include "Common/config_version.h"
|
||||||
@ -38,6 +39,13 @@ void setExtras()
|
|||||||
if (!anonymize)
|
if (!anonymize)
|
||||||
sentry_set_extra("server_name", sentry_value_new_string(getFQDNOrHostName().c_str()));
|
sentry_set_extra("server_name", sentry_value_new_string(getFQDNOrHostName().c_str()));
|
||||||
|
|
||||||
|
DB::UUID server_uuid = DB::ServerUUID::get();
|
||||||
|
if (server_uuid != DB::UUIDHelpers::Nil)
|
||||||
|
{
|
||||||
|
std::string server_uuid_str = DB::toString(server_uuid);
|
||||||
|
sentry_set_extra("server_uuid", sentry_value_new_string(server_uuid_str.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
sentry_set_tag("version", VERSION_STRING);
|
sentry_set_tag("version", VERSION_STRING);
|
||||||
sentry_set_extra("version_githash", sentry_value_new_string(VERSION_GITHASH));
|
sentry_set_extra("version_githash", sentry_value_new_string(VERSION_GITHASH));
|
||||||
sentry_set_extra("version_describe", sentry_value_new_string(VERSION_DESCRIBE));
|
sentry_set_extra("version_describe", sentry_value_new_string(VERSION_DESCRIBE));
|
||||||
|
@ -9,10 +9,6 @@ if (GLIBC_COMPATIBILITY)
|
|||||||
|
|
||||||
check_include_file("sys/random.h" HAVE_SYS_RANDOM_H)
|
check_include_file("sys/random.h" HAVE_SYS_RANDOM_H)
|
||||||
|
|
||||||
if(COMPILER_CLANG)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-builtin-requires-header")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_headers_and_sources(glibc_compatibility .)
|
add_headers_and_sources(glibc_compatibility .)
|
||||||
add_headers_and_sources(glibc_compatibility musl)
|
add_headers_and_sources(glibc_compatibility musl)
|
||||||
if (ARCH_AARCH64)
|
if (ARCH_AARCH64)
|
||||||
@ -35,11 +31,9 @@ if (GLIBC_COMPATIBILITY)
|
|||||||
|
|
||||||
add_library(glibc-compatibility STATIC ${glibc_compatibility_sources})
|
add_library(glibc-compatibility STATIC ${glibc_compatibility_sources})
|
||||||
|
|
||||||
if (COMPILER_CLANG)
|
target_no_warning(glibc-compatibility unused-command-line-argument)
|
||||||
target_compile_options(glibc-compatibility PRIVATE -Wno-unused-command-line-argument)
|
target_no_warning(glibc-compatibility unused-but-set-variable)
|
||||||
elseif (COMPILER_GCC)
|
target_no_warning(glibc-compatibility builtin-requires-header)
|
||||||
target_compile_options(glibc-compatibility PRIVATE -Wno-unused-but-set-variable)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
target_include_directories(glibc-compatibility PRIVATE libcxxabi ${musl_arch_include_dir})
|
target_include_directories(glibc-compatibility PRIVATE libcxxabi ${musl_arch_include_dir})
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#include <sys/auxv.h>
|
#include <sys/auxv.h>
|
||||||
#include "atomic.h"
|
|
||||||
#include <unistd.h> // __environ
|
#include <unistd.h> // __environ
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@ -18,7 +17,18 @@ static size_t __find_auxv(unsigned long type)
|
|||||||
return (size_t) -1;
|
return (size_t) -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long __getauxval(unsigned long type)
|
__attribute__((constructor)) static void __auxv_init()
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; __environ[i]; i++);
|
||||||
|
__auxv = (unsigned long *) (__environ + i + 1);
|
||||||
|
|
||||||
|
size_t secure_idx = __find_auxv(AT_SECURE);
|
||||||
|
if (secure_idx != ((size_t) -1))
|
||||||
|
__auxv_secure = __auxv[secure_idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long getauxval(unsigned long type)
|
||||||
{
|
{
|
||||||
if (type == AT_SECURE)
|
if (type == AT_SECURE)
|
||||||
return __auxv_secure;
|
return __auxv_secure;
|
||||||
@ -33,38 +43,3 @@ unsigned long __getauxval(unsigned long type)
|
|||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * volatile getauxval_func;
|
|
||||||
|
|
||||||
static unsigned long __auxv_init(unsigned long type)
|
|
||||||
{
|
|
||||||
if (!__environ)
|
|
||||||
{
|
|
||||||
// __environ is not initialized yet so we can't initialize __auxv right now.
|
|
||||||
// That's normally occurred only when getauxval() is called from some sanitizer's internal code.
|
|
||||||
errno = ENOENT;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize __auxv and __auxv_secure.
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; __environ[i]; i++);
|
|
||||||
__auxv = (unsigned long *) (__environ + i + 1);
|
|
||||||
|
|
||||||
size_t secure_idx = __find_auxv(AT_SECURE);
|
|
||||||
if (secure_idx != ((size_t) -1))
|
|
||||||
__auxv_secure = __auxv[secure_idx];
|
|
||||||
|
|
||||||
// Now we've initialized __auxv, next time getauxval() will only call __get_auxval().
|
|
||||||
a_cas_p(&getauxval_func, (void *)__auxv_init, (void *)__getauxval);
|
|
||||||
|
|
||||||
return __getauxval(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
// First time getauxval() will call __auxv_init().
|
|
||||||
static void * volatile getauxval_func = (void *)__auxv_init;
|
|
||||||
|
|
||||||
unsigned long getauxval(unsigned long type)
|
|
||||||
{
|
|
||||||
return ((unsigned long (*)(unsigned long))getauxval_func)(type);
|
|
||||||
}
|
|
||||||
|
@ -27,3 +27,22 @@ endmacro ()
|
|||||||
macro (no_warning flag)
|
macro (no_warning flag)
|
||||||
add_warning(no-${flag})
|
add_warning(no-${flag})
|
||||||
endmacro ()
|
endmacro ()
|
||||||
|
|
||||||
|
|
||||||
|
# The same but only for specified target.
|
||||||
|
macro (target_add_warning target flag)
|
||||||
|
string (REPLACE "-" "_" underscored_flag ${flag})
|
||||||
|
string (REPLACE "+" "x" underscored_flag ${underscored_flag})
|
||||||
|
|
||||||
|
check_cxx_compiler_flag("-W${flag}" SUPPORTS_CXXFLAG_${underscored_flag})
|
||||||
|
|
||||||
|
if (SUPPORTS_CXXFLAG_${underscored_flag})
|
||||||
|
target_compile_options (${target} PRIVATE "-W${flag}")
|
||||||
|
else ()
|
||||||
|
message (WARNING "Flag -W${flag} is unsupported")
|
||||||
|
endif ()
|
||||||
|
endmacro ()
|
||||||
|
|
||||||
|
macro (target_no_warning target flag)
|
||||||
|
target_add_warning(${target} no-${flag})
|
||||||
|
endmacro ()
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
# NOTE: has nothing common with DBMS_TCP_PROTOCOL_VERSION,
|
# NOTE: has nothing common with DBMS_TCP_PROTOCOL_VERSION,
|
||||||
# only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes.
|
# only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes.
|
||||||
SET(VERSION_REVISION 54454)
|
SET(VERSION_REVISION 54455)
|
||||||
SET(VERSION_MAJOR 21)
|
SET(VERSION_MAJOR 21)
|
||||||
SET(VERSION_MINOR 9)
|
SET(VERSION_MINOR 10)
|
||||||
SET(VERSION_PATCH 1)
|
SET(VERSION_PATCH 1)
|
||||||
SET(VERSION_GITHASH f063e44131a048ba2d9af8075f03700fd5ec3e69)
|
SET(VERSION_GITHASH 09df5018f95edcd0f759d4689ac5d029dd400c2a)
|
||||||
SET(VERSION_DESCRIBE v21.9.1.7770-prestable)
|
SET(VERSION_DESCRIBE v21.10.1.1-testing)
|
||||||
SET(VERSION_STRING 21.9.1.7770)
|
SET(VERSION_STRING 21.10.1.1)
|
||||||
# end of autochange
|
# end of autochange
|
||||||
|
17
cmake/git_status.cmake
Normal file
17
cmake/git_status.cmake
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Print the status of the git repository (if git is available).
|
||||||
|
# This is useful for troubleshooting build failure reports
|
||||||
|
find_package(Git)
|
||||||
|
|
||||||
|
if (Git_FOUND)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE GIT_COMMIT_ID
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
message(STATUS "HEAD's commit hash ${GIT_COMMIT_ID}")
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} status
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
else()
|
||||||
|
message(STATUS "The git program could not be found.")
|
||||||
|
endif()
|
@ -119,12 +119,9 @@ set(ORC_SRCS
|
|||||||
"${ORC_SOURCE_SRC_DIR}/ColumnWriter.cc"
|
"${ORC_SOURCE_SRC_DIR}/ColumnWriter.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/Common.cc"
|
"${ORC_SOURCE_SRC_DIR}/Common.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/Compression.cc"
|
"${ORC_SOURCE_SRC_DIR}/Compression.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/Exceptions.cc"
|
|
||||||
"${ORC_SOURCE_SRC_DIR}/Int128.cc"
|
"${ORC_SOURCE_SRC_DIR}/Int128.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/LzoDecompressor.cc"
|
"${ORC_SOURCE_SRC_DIR}/LzoDecompressor.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/MemoryPool.cc"
|
"${ORC_SOURCE_SRC_DIR}/MemoryPool.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/OrcFile.cc"
|
|
||||||
"${ORC_SOURCE_SRC_DIR}/Reader.cc"
|
|
||||||
"${ORC_SOURCE_SRC_DIR}/RLE.cc"
|
"${ORC_SOURCE_SRC_DIR}/RLE.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/RLEv1.cc"
|
"${ORC_SOURCE_SRC_DIR}/RLEv1.cc"
|
||||||
"${ORC_SOURCE_SRC_DIR}/RLEv2.cc"
|
"${ORC_SOURCE_SRC_DIR}/RLEv2.cc"
|
||||||
|
@ -27,16 +27,12 @@ target_include_directories(roaring SYSTEM BEFORE PUBLIC "${LIBRARY_DIR}/cpp")
|
|||||||
|
|
||||||
# We redirect malloc/free family of functions to different functions that will track memory in ClickHouse.
|
# We redirect malloc/free family of functions to different functions that will track memory in ClickHouse.
|
||||||
# Also note that we exploit implicit function declarations.
|
# Also note that we exploit implicit function declarations.
|
||||||
# Also it is disabled on Mac OS because it fails).
|
target_compile_definitions(roaring PRIVATE
|
||||||
|
-Dmalloc=clickhouse_malloc
|
||||||
|
-Dcalloc=clickhouse_calloc
|
||||||
|
-Drealloc=clickhouse_realloc
|
||||||
|
-Dreallocarray=clickhouse_reallocarray
|
||||||
|
-Dfree=clickhouse_free
|
||||||
|
-Dposix_memalign=clickhouse_posix_memalign)
|
||||||
|
|
||||||
if (NOT OS_DARWIN)
|
target_link_libraries(roaring PUBLIC clickhouse_common_io)
|
||||||
target_compile_definitions(roaring PRIVATE
|
|
||||||
-Dmalloc=clickhouse_malloc
|
|
||||||
-Dcalloc=clickhouse_calloc
|
|
||||||
-Drealloc=clickhouse_realloc
|
|
||||||
-Dreallocarray=clickhouse_reallocarray
|
|
||||||
-Dfree=clickhouse_free
|
|
||||||
-Dposix_memalign=clickhouse_posix_memalign)
|
|
||||||
|
|
||||||
target_link_libraries(roaring PUBLIC clickhouse_common_io)
|
|
||||||
endif ()
|
|
||||||
|
@ -139,9 +139,5 @@ target_compile_options(jemalloc PRIVATE -Wno-redundant-decls)
|
|||||||
target_compile_options(jemalloc PRIVATE -D_GNU_SOURCE)
|
target_compile_options(jemalloc PRIVATE -D_GNU_SOURCE)
|
||||||
|
|
||||||
set_property(TARGET jemalloc APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USE_JEMALLOC=1)
|
set_property(TARGET jemalloc APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USE_JEMALLOC=1)
|
||||||
if (MAKE_STATIC_LIBRARIES)
|
|
||||||
# To detect whether we need to register jemalloc for osx as default zone.
|
|
||||||
set_property(TARGET jemalloc APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS BUNDLED_STATIC_JEMALLOC=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message (STATUS "Using jemalloc")
|
message (STATUS "Using jemalloc")
|
||||||
|
2
contrib/librdkafka
vendored
2
contrib/librdkafka
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 43491d33ca2826531d1e3cae70d4bf1e5249e3c9
|
Subproject commit b8554f1682062c85ba519eb54ef2f90e02b812cb
|
2
contrib/nanodbc
vendored
2
contrib/nanodbc
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 9fc459675515d491401727ec67fca38db721f28c
|
Subproject commit df52a1232dfa182f9af60974d001b91823afe9bc
|
2
contrib/replxx
vendored
2
contrib/replxx
vendored
@ -1 +1 @@
|
|||||||
Subproject commit c81be6c68b146f15f2096b7ef80e3f21fe27004c
|
Subproject commit f97765df14f4a6236d69b8f14b53ef2051ebd95a
|
4
debian/changelog
vendored
4
debian/changelog
vendored
@ -1,5 +1,5 @@
|
|||||||
clickhouse (21.9.1.1) unstable; urgency=low
|
clickhouse (21.10.1.1) unstable; urgency=low
|
||||||
|
|
||||||
* Modified source code
|
* Modified source code
|
||||||
|
|
||||||
-- clickhouse-release <clickhouse-release@yandex-team.ru> Sat, 10 Jul 2021 08:22:49 +0300
|
-- clickhouse-release <clickhouse-release@yandex-team.ru> Sat, 17 Jul 2021 08:45:03 +0300
|
||||||
|
@ -2,6 +2,8 @@ FROM ubuntu:20.04
|
|||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
||||||
--yes --no-install-recommends --verbose-versions \
|
--yes --no-install-recommends --verbose-versions \
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
FROM ubuntu:18.04
|
FROM ubuntu:18.04
|
||||||
|
|
||||||
ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/"
|
ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/"
|
||||||
ARG version=21.9.1.*
|
ARG version=21.10.1.*
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install --yes --no-install-recommends \
|
&& apt-get install --yes --no-install-recommends \
|
||||||
|
@ -3,6 +3,8 @@ FROM ubuntu:20.04
|
|||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install \
|
&& apt-get install \
|
||||||
apt-transport-https \
|
apt-transport-https \
|
||||||
|
@ -3,6 +3,8 @@ FROM ubuntu:20.04
|
|||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
||||||
--yes --no-install-recommends --verbose-versions \
|
--yes --no-install-recommends --verbose-versions \
|
||||||
|
@ -5,6 +5,8 @@ RUN export CODENAME="$(lsb_release --codename --short | tr 'A-Z' 'a-z')" \
|
|||||||
&& wget -nv -O /tmp/arrow-keyring.deb "https://apache.jfrog.io/artifactory/arrow/ubuntu/apache-arrow-apt-source-latest-${CODENAME}.deb" \
|
&& wget -nv -O /tmp/arrow-keyring.deb "https://apache.jfrog.io/artifactory/arrow/ubuntu/apache-arrow-apt-source-latest-${CODENAME}.deb" \
|
||||||
&& dpkg -i /tmp/arrow-keyring.deb
|
&& dpkg -i /tmp/arrow-keyring.deb
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
# Libraries from OS are only needed to test the "unbundled" build (that is not used in production).
|
# Libraries from OS are only needed to test the "unbundled" build (that is not used in production).
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install \
|
&& apt-get install \
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
FROM ubuntu:20.04
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/"
|
ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/"
|
||||||
ARG version=21.9.1.*
|
ARG version=21.10.1.*
|
||||||
ARG gosu_ver=1.10
|
ARG gosu_ver=1.10
|
||||||
|
|
||||||
# set non-empty deb_location_url url to create a docker image
|
# set non-empty deb_location_url url to create a docker image
|
||||||
@ -26,6 +26,8 @@ ARG DEBIAN_FRONTEND=noninteractive
|
|||||||
# installed to prevent picking those uid / gid by some unrelated software.
|
# installed to prevent picking those uid / gid by some unrelated software.
|
||||||
# The same uid / gid (101) is used both for alpine and ubuntu.
|
# The same uid / gid (101) is used both for alpine and ubuntu.
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN groupadd -r clickhouse --gid=101 \
|
RUN groupadd -r clickhouse --gid=101 \
|
||||||
&& useradd -r -g clickhouse --uid=101 --home-dir=/var/lib/clickhouse --shell=/bin/bash clickhouse \
|
&& useradd -r -g clickhouse --uid=101 --home-dir=/var/lib/clickhouse --shell=/bin/bash clickhouse \
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
FROM ubuntu:18.04
|
FROM ubuntu:18.04
|
||||||
|
|
||||||
ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/"
|
ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/"
|
||||||
ARG version=21.9.1.*
|
ARG version=21.10.1.*
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y apt-transport-https dirmngr && \
|
apt-get install -y apt-transport-https dirmngr && \
|
||||||
|
@ -3,6 +3,8 @@ FROM ubuntu:20.04
|
|||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
||||||
--yes --no-install-recommends --verbose-versions \
|
--yes --no-install-recommends --verbose-versions \
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
# docker run --volume=path_to_repo:/repo_folder --volume=path_to_result:/test_output yandex/clickhouse-codebrowser
|
# docker run --volume=path_to_repo:/repo_folder --volume=path_to_result:/test_output yandex/clickhouse-codebrowser
|
||||||
FROM yandex/clickhouse-binary-builder
|
FROM yandex/clickhouse-binary-builder
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update && apt-get --yes --allow-unauthenticated install clang-9 libllvm9 libclang-9-dev
|
RUN apt-get update && apt-get --yes --allow-unauthenticated install clang-9 libllvm9 libclang-9-dev
|
||||||
|
|
||||||
# repo versions doesn't work correctly with C++17
|
# repo versions doesn't work correctly with C++17
|
||||||
|
@ -3,6 +3,8 @@ FROM ubuntu:20.04
|
|||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
&& apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \
|
||||||
--yes --no-install-recommends --verbose-versions \
|
--yes --no-install-recommends --verbose-versions \
|
||||||
|
@ -303,6 +303,7 @@ function run_tests
|
|||||||
01683_codec_encrypted # Depends on OpenSSL
|
01683_codec_encrypted # Depends on OpenSSL
|
||||||
01776_decrypt_aead_size_check # Depends on OpenSSL
|
01776_decrypt_aead_size_check # Depends on OpenSSL
|
||||||
01811_filter_by_null # Depends on OpenSSL
|
01811_filter_by_null # Depends on OpenSSL
|
||||||
|
02012_sha512_fixedstring # Depends on OpenSSL
|
||||||
01281_unsucceeded_insert_select_queries_counter
|
01281_unsucceeded_insert_select_queries_counter
|
||||||
01292_create_user
|
01292_create_user
|
||||||
01294_lazy_database_concurrent
|
01294_lazy_database_concurrent
|
||||||
@ -392,6 +393,9 @@ function run_tests
|
|||||||
01853_s2_cells_intersect
|
01853_s2_cells_intersect
|
||||||
01854_s2_cap_contains
|
01854_s2_cap_contains
|
||||||
01854_s2_cap_union
|
01854_s2_cap_union
|
||||||
|
|
||||||
|
# needs s3
|
||||||
|
01944_insert_partition_by
|
||||||
)
|
)
|
||||||
|
|
||||||
time clickhouse-test --hung-check -j 8 --order=random --use-skip-list \
|
time clickhouse-test --hung-check -j 8 --order=random --use-skip-list \
|
||||||
|
@ -5,6 +5,8 @@ ENV LANG=C.UTF-8
|
|||||||
ENV TZ=Europe/Moscow
|
ENV TZ=Europe/Moscow
|
||||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \
|
&& DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
|
@ -226,7 +226,7 @@ continue
|
|||||||
task_exit_code=$fuzzer_exit_code
|
task_exit_code=$fuzzer_exit_code
|
||||||
echo "failure" > status.txt
|
echo "failure" > status.txt
|
||||||
{ grep --text -o "Found error:.*" fuzzer.log \
|
{ grep --text -o "Found error:.*" fuzzer.log \
|
||||||
|| grep --text -o "Exception.*" fuzzer.log \
|
|| grep --text -ao "Exception:.*" fuzzer.log \
|
||||||
|| echo "Fuzzer failed ($fuzzer_exit_code). See the logs." ; } \
|
|| echo "Fuzzer failed ($fuzzer_exit_code). See the logs." ; } \
|
||||||
| tail -1 > description.txt
|
| tail -1 > description.txt
|
||||||
fi
|
fi
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
# docker build -t yandex/clickhouse-integration-tests-runner .
|
# docker build -t yandex/clickhouse-integration-tests-runner .
|
||||||
FROM ubuntu:20.04
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& env DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
&& env DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
|
@ -5,6 +5,8 @@ ENV LANG=C.UTF-8
|
|||||||
ENV TZ=Europe/Moscow
|
ENV TZ=Europe/Moscow
|
||||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \
|
&& DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \
|
||||||
bash \
|
bash \
|
||||||
|
@ -641,6 +641,7 @@ create view partial_query_times as select * from
|
|||||||
-- Report for partial queries that we could only run on the new server (e.g.
|
-- Report for partial queries that we could only run on the new server (e.g.
|
||||||
-- queries with new functions added in the tested PR).
|
-- queries with new functions added in the tested PR).
|
||||||
create table partial_queries_report engine File(TSV, 'report/partial-queries-report.tsv')
|
create table partial_queries_report engine File(TSV, 'report/partial-queries-report.tsv')
|
||||||
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
as select toDecimal64(time_median, 3) time,
|
as select toDecimal64(time_median, 3) time,
|
||||||
toDecimal64(time_stddev / time_median, 3) relative_time_stddev,
|
toDecimal64(time_stddev / time_median, 3) relative_time_stddev,
|
||||||
test, query_index, query_display_name
|
test, query_index, query_display_name
|
||||||
@ -713,8 +714,9 @@ create table queries engine File(TSVWithNamesAndTypes, 'report/queries.tsv')
|
|||||||
order by test, query_index, metric_name
|
order by test, query_index, metric_name
|
||||||
;
|
;
|
||||||
|
|
||||||
create table changed_perf_report engine File(TSV, 'report/changed-perf.tsv') as
|
create table changed_perf_report engine File(TSV, 'report/changed-perf.tsv')
|
||||||
with
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
|
as with
|
||||||
-- server_time is sometimes reported as zero (if it's less than 1 ms),
|
-- server_time is sometimes reported as zero (if it's less than 1 ms),
|
||||||
-- so we have to work around this to not get an error about conversion
|
-- so we have to work around this to not get an error about conversion
|
||||||
-- of NaN to decimal.
|
-- of NaN to decimal.
|
||||||
@ -730,8 +732,9 @@ create table changed_perf_report engine File(TSV, 'report/changed-perf.tsv') as
|
|||||||
changed_fail, test, query_index, query_display_name
|
changed_fail, test, query_index, query_display_name
|
||||||
from queries where changed_show order by abs(diff) desc;
|
from queries where changed_show order by abs(diff) desc;
|
||||||
|
|
||||||
create table unstable_queries_report engine File(TSV, 'report/unstable-queries.tsv') as
|
create table unstable_queries_report engine File(TSV, 'report/unstable-queries.tsv')
|
||||||
select
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
|
as select
|
||||||
toDecimal64(left, 3), toDecimal64(right, 3), toDecimal64(diff, 3),
|
toDecimal64(left, 3), toDecimal64(right, 3), toDecimal64(diff, 3),
|
||||||
toDecimal64(stat_threshold, 3), unstable_fail, test, query_index, query_display_name
|
toDecimal64(stat_threshold, 3), unstable_fail, test, query_index, query_display_name
|
||||||
from queries where unstable_show order by stat_threshold desc;
|
from queries where unstable_show order by stat_threshold desc;
|
||||||
@ -761,8 +764,9 @@ create view total_speedup as
|
|||||||
from test_speedup
|
from test_speedup
|
||||||
;
|
;
|
||||||
|
|
||||||
create table test_perf_changes_report engine File(TSV, 'report/test-perf-changes.tsv') as
|
create table test_perf_changes_report engine File(TSV, 'report/test-perf-changes.tsv')
|
||||||
with
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
|
as with
|
||||||
(times_speedup >= 1
|
(times_speedup >= 1
|
||||||
? '-' || toString(toDecimal64(times_speedup, 3)) || 'x'
|
? '-' || toString(toDecimal64(times_speedup, 3)) || 'x'
|
||||||
: '+' || toString(toDecimal64(1 / times_speedup, 3)) || 'x')
|
: '+' || toString(toDecimal64(1 / times_speedup, 3)) || 'x')
|
||||||
@ -788,8 +792,9 @@ create view total_client_time_per_query as select *
|
|||||||
from file('analyze/client-times.tsv', TSV,
|
from file('analyze/client-times.tsv', TSV,
|
||||||
'test text, query_index int, client float, server float');
|
'test text, query_index int, client float, server float');
|
||||||
|
|
||||||
create table slow_on_client_report engine File(TSV, 'report/slow-on-client.tsv') as
|
create table slow_on_client_report engine File(TSV, 'report/slow-on-client.tsv')
|
||||||
select client, server, toDecimal64(client/server, 3) p,
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
|
as select client, server, toDecimal64(client/server, 3) p,
|
||||||
test, query_display_name
|
test, query_display_name
|
||||||
from total_client_time_per_query left join query_display_names using (test, query_index)
|
from total_client_time_per_query left join query_display_names using (test, query_index)
|
||||||
where p > toDecimal64(1.02, 3) order by p desc;
|
where p > toDecimal64(1.02, 3) order by p desc;
|
||||||
@ -874,8 +879,9 @@ create view test_times_view_total as
|
|||||||
from test_times_view
|
from test_times_view
|
||||||
;
|
;
|
||||||
|
|
||||||
create table test_times_report engine File(TSV, 'report/test-times.tsv') as
|
create table test_times_report engine File(TSV, 'report/test-times.tsv')
|
||||||
select
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
|
as select
|
||||||
test,
|
test,
|
||||||
toDecimal64(real, 3),
|
toDecimal64(real, 3),
|
||||||
toDecimal64(total_client_time, 3),
|
toDecimal64(total_client_time, 3),
|
||||||
@ -893,8 +899,9 @@ create table test_times_report engine File(TSV, 'report/test-times.tsv') as
|
|||||||
;
|
;
|
||||||
|
|
||||||
-- report for all queries page, only main metric
|
-- report for all queries page, only main metric
|
||||||
create table all_tests_report engine File(TSV, 'report/all-queries.tsv') as
|
create table all_tests_report engine File(TSV, 'report/all-queries.tsv')
|
||||||
with
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
|
as with
|
||||||
-- server_time is sometimes reported as zero (if it's less than 1 ms),
|
-- server_time is sometimes reported as zero (if it's less than 1 ms),
|
||||||
-- so we have to work around this to not get an error about conversion
|
-- so we have to work around this to not get an error about conversion
|
||||||
-- of NaN to decimal.
|
-- of NaN to decimal.
|
||||||
@ -1057,9 +1064,10 @@ create table unstable_run_traces engine File(TSVWithNamesAndTypes,
|
|||||||
;
|
;
|
||||||
|
|
||||||
create table metric_devation engine File(TSVWithNamesAndTypes,
|
create table metric_devation engine File(TSVWithNamesAndTypes,
|
||||||
'report/metric-deviation.$version.tsv') as
|
'report/metric-deviation.$version.tsv')
|
||||||
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
-- first goes the key used to split the file with grep
|
-- first goes the key used to split the file with grep
|
||||||
select test, query_index, query_display_name,
|
as select test, query_index, query_display_name,
|
||||||
toDecimal64(d, 3) d, q, metric
|
toDecimal64(d, 3) d, q, metric
|
||||||
from (
|
from (
|
||||||
select
|
select
|
||||||
@ -1187,8 +1195,9 @@ create table metrics engine File(TSV, 'metrics/metrics.tsv') as
|
|||||||
;
|
;
|
||||||
|
|
||||||
-- Show metrics that have changed
|
-- Show metrics that have changed
|
||||||
create table changes engine File(TSV, 'metrics/changes.tsv') as
|
create table changes engine File(TSV, 'metrics/changes.tsv')
|
||||||
select metric, left, right,
|
settings output_format_decimal_trailing_zeros = 1
|
||||||
|
as select metric, left, right,
|
||||||
toDecimal64(diff, 3), toDecimal64(times_diff, 3)
|
toDecimal64(diff, 3), toDecimal64(times_diff, 3)
|
||||||
from (
|
from (
|
||||||
select metric, median(left) as left, median(right) as right,
|
select metric, median(left) as left, median(right) as right,
|
||||||
|
@ -13,7 +13,7 @@ left_sha=$2
|
|||||||
# right_pr=$3 not used for now
|
# right_pr=$3 not used for now
|
||||||
right_sha=$4
|
right_sha=$4
|
||||||
|
|
||||||
datasets=${CHPC_DATASETS:-"hits1 hits10 hits100 values"}
|
datasets=${CHPC_DATASETS-"hits1 hits10 hits100 values"}
|
||||||
|
|
||||||
declare -A dataset_paths
|
declare -A dataset_paths
|
||||||
dataset_paths["hits10"]="https://s3.mds.yandex.net/clickhouse-private-datasets/hits_10m_single/partitions/hits_10m_single.tar"
|
dataset_paths["hits10"]="https://s3.mds.yandex.net/clickhouse-private-datasets/hits_10m_single/partitions/hits_10m_single.tar"
|
||||||
|
@ -127,6 +127,15 @@ export PATH
|
|||||||
export REF_PR
|
export REF_PR
|
||||||
export REF_SHA
|
export REF_SHA
|
||||||
|
|
||||||
|
# Try to collect some core dumps. I've seen two patterns in Sandbox:
|
||||||
|
# 1) |/home/zomb-sandbox/venv/bin/python /home/zomb-sandbox/client/sandbox/bin/coredumper.py %e %p %g %u %s %P %c
|
||||||
|
# Not sure what this script does (puts them to sandbox resources, logs some messages?),
|
||||||
|
# and it's not accessible from inside docker anyway.
|
||||||
|
# 2) something like %e.%p.core.dmp. The dump should end up in the workspace directory.
|
||||||
|
# At least we remove the ulimit and then try to pack some common file names into output.
|
||||||
|
ulimit -c unlimited
|
||||||
|
cat /proc/sys/kernel/core_pattern
|
||||||
|
|
||||||
# Start the main comparison script.
|
# Start the main comparison script.
|
||||||
{ \
|
{ \
|
||||||
time ../download.sh "$REF_PR" "$REF_SHA" "$PR_TO_TEST" "$SHA_TO_TEST" && \
|
time ../download.sh "$REF_PR" "$REF_SHA" "$PR_TO_TEST" "$SHA_TO_TEST" && \
|
||||||
@ -144,8 +153,11 @@ done
|
|||||||
|
|
||||||
dmesg -T > dmesg.log
|
dmesg -T > dmesg.log
|
||||||
|
|
||||||
|
ls -lath
|
||||||
|
|
||||||
7z a '-x!*/tmp' /output/output.7z ./*.{log,tsv,html,txt,rep,svg,columns} \
|
7z a '-x!*/tmp' /output/output.7z ./*.{log,tsv,html,txt,rep,svg,columns} \
|
||||||
{right,left}/{performance,scripts} {{right,left}/db,db0}/preprocessed_configs \
|
{right,left}/{performance,scripts} {{right,left}/db,db0}/preprocessed_configs \
|
||||||
report analyze benchmark metrics
|
report analyze benchmark metrics \
|
||||||
|
./*.core.dmp ./*.core
|
||||||
|
|
||||||
cp compare.log /output
|
cp compare.log /output
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
# docker build -t yandex/clickhouse-sqlancer-test .
|
# docker build -t yandex/clickhouse-sqlancer-test .
|
||||||
FROM ubuntu:20.04
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update --yes && env DEBIAN_FRONTEND=noninteractive apt-get install wget unzip git openjdk-14-jdk maven python3 --yes --no-install-recommends
|
RUN apt-get update --yes && env DEBIAN_FRONTEND=noninteractive apt-get install wget unzip git openjdk-14-jdk maven python3 --yes --no-install-recommends
|
||||||
RUN wget https://github.com/sqlancer/sqlancer/archive/master.zip -O /sqlancer.zip
|
RUN wget https://github.com/sqlancer/sqlancer/archive/master.zip -O /sqlancer.zip
|
||||||
RUN mkdir /sqlancer && \
|
RUN mkdir /sqlancer && \
|
||||||
|
@ -105,10 +105,6 @@ def process_result(result_path):
|
|||||||
description += ", skipped: {}".format(skipped)
|
description += ", skipped: {}".format(skipped)
|
||||||
if unknown != 0:
|
if unknown != 0:
|
||||||
description += ", unknown: {}".format(unknown)
|
description += ", unknown: {}".format(unknown)
|
||||||
|
|
||||||
# Temporary green for tests with DatabaseReplicated:
|
|
||||||
if 1 == int(os.environ.get('USE_DATABASE_REPLICATED', 0)):
|
|
||||||
state = "success"
|
|
||||||
else:
|
else:
|
||||||
state = "failure"
|
state = "failure"
|
||||||
description = "Output log doesn't exist"
|
description = "Output log doesn't exist"
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
# docker build -t yandex/clickhouse-style-test .
|
# docker build -t yandex/clickhouse-style-test .
|
||||||
FROM ubuntu:20.04
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
RUN apt-get update && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||||
shellcheck \
|
shellcheck \
|
||||||
libxml2-utils \
|
libxml2-utils \
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
# docker build -t yandex/clickhouse-testflows-runner .
|
# docker build -t yandex/clickhouse-testflows-runner .
|
||||||
FROM ubuntu:20.04
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& env DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
&& env DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
|
@ -23,3 +23,5 @@ You can also use the following database engines:
|
|||||||
- [PostgreSQL](../../engines/database-engines/postgresql.md)
|
- [PostgreSQL](../../engines/database-engines/postgresql.md)
|
||||||
|
|
||||||
- [Replicated](../../engines/database-engines/replicated.md)
|
- [Replicated](../../engines/database-engines/replicated.md)
|
||||||
|
|
||||||
|
- [SQLite](../../engines/database-engines/sqlite.md)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
toc_priority: 29
|
toc_priority: 29
|
||||||
toc_title: "[experimental] MaterializedMySQL"
|
toc_title: MaterializedMySQL
|
||||||
---
|
---
|
||||||
|
|
||||||
# [experimental] MaterializedMySQL {#materialized-mysql}
|
# [experimental] MaterializedMySQL {#materialized-mysql}
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 36
|
||||||
|
toc_title: Replicated
|
||||||
|
---
|
||||||
|
|
||||||
# [experimental] Replicated {#replicated}
|
# [experimental] Replicated {#replicated}
|
||||||
|
|
||||||
The engine is based on the [Atomic](../../engines/database-engines/atomic.md) engine. It supports replication of metadata via DDL log being written to ZooKeeper and executed on all of the replicas for a given database.
|
The engine is based on the [Atomic](../../engines/database-engines/atomic.md) engine. It supports replication of metadata via DDL log being written to ZooKeeper and executed on all of the replicas for a given database.
|
||||||
|
80
docs/en/engines/database-engines/sqlite.md
Normal file
80
docs/en/engines/database-engines/sqlite.md
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 32
|
||||||
|
toc_title: SQLite
|
||||||
|
---
|
||||||
|
|
||||||
|
# SQLite {#sqlite}
|
||||||
|
|
||||||
|
Allows to connect to [SQLite](https://www.sqlite.org/index.html) database and perform `INSERT` and `SELECT` queries to exchange data between ClickHouse and SQLite.
|
||||||
|
|
||||||
|
## Creating a Database {#creating-a-database}
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE DATABASE sqlite_database
|
||||||
|
ENGINE = SQLite('db_path')
|
||||||
|
```
|
||||||
|
|
||||||
|
**Engine Parameters**
|
||||||
|
|
||||||
|
- `db_path` — Path to a file with SQLite database.
|
||||||
|
|
||||||
|
## Data Types Support {#data_types-support}
|
||||||
|
|
||||||
|
| SQLite | ClickHouse |
|
||||||
|
|---------------|---------------------------------------------------------|
|
||||||
|
| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) |
|
||||||
|
| REAL | [Float32](../../sql-reference/data-types/float.md) |
|
||||||
|
| TEXT | [String](../../sql-reference/data-types/string.md) |
|
||||||
|
| BLOB | [String](../../sql-reference/data-types/string.md) |
|
||||||
|
|
||||||
|
## Specifics and Recommendations {#specifics-and-recommendations}
|
||||||
|
|
||||||
|
SQLite stores the entire database (definitions, tables, indices, and the data itself) as a single cross-platform file on a host machine. During writing SQLite locks the entire database file, therefore write operations are performed sequentially. Read operations can be multitasked.
|
||||||
|
SQLite does not require service management (such as startup scripts) or access control based on `GRANT` and passwords. Access control is handled by means of file-system permissions given to the database file itself.
|
||||||
|
|
||||||
|
## Usage Example {#usage-example}
|
||||||
|
|
||||||
|
Database in ClickHouse, connected to the SQLite:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE DATABASE sqlite_db ENGINE = SQLite('sqlite.db');
|
||||||
|
SHOW TABLES FROM sqlite_db;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌──name───┐
|
||||||
|
│ table1 │
|
||||||
|
│ table2 │
|
||||||
|
└─────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Shows the tables:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM sqlite_db.table1;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─col1──┬─col2─┐
|
||||||
|
│ line1 │ 1 │
|
||||||
|
│ line2 │ 2 │
|
||||||
|
│ line3 │ 3 │
|
||||||
|
└───────┴──────┘
|
||||||
|
```
|
||||||
|
Inserting data into SQLite table from ClickHouse table:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE clickhouse_table(`col1` String,`col2` Int16) ENGINE = MergeTree() ORDER BY col2;
|
||||||
|
INSERT INTO clickhouse_table VALUES ('text',10);
|
||||||
|
INSERT INTO sqlite_db.table1 SELECT * FROM clickhouse_table;
|
||||||
|
SELECT * FROM sqlite_db.table1;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─col1──┬─col2─┐
|
||||||
|
│ line1 │ 1 │
|
||||||
|
│ line2 │ 2 │
|
||||||
|
│ line3 │ 3 │
|
||||||
|
│ text │ 10 │
|
||||||
|
└───────┴──────┘
|
||||||
|
```
|
@ -19,3 +19,4 @@ List of supported integrations:
|
|||||||
- [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md)
|
- [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md)
|
||||||
- [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md)
|
- [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md)
|
||||||
- [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md)
|
- [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md)
|
||||||
|
- [SQLite](../../../engines/table-engines/integrations/sqlite.md)
|
||||||
|
59
docs/en/engines/table-engines/integrations/sqlite.md
Normal file
59
docs/en/engines/table-engines/integrations/sqlite.md
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 7
|
||||||
|
toc_title: SQLite
|
||||||
|
---
|
||||||
|
|
||||||
|
# SQLite {#sqlite}
|
||||||
|
|
||||||
|
The engine allows to import and export data to SQLite and supports queries to SQLite tables directly from ClickHouse.
|
||||||
|
|
||||||
|
## Creating a Table {#creating-a-table}
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE [IF NOT EXISTS] [db.]table_name
|
||||||
|
(
|
||||||
|
name1 [type1],
|
||||||
|
name2 [type2], ...
|
||||||
|
) ENGINE = SQLite('db_path', 'table')
|
||||||
|
```
|
||||||
|
|
||||||
|
**Engine Parameters**
|
||||||
|
|
||||||
|
- `db_path` — Path to SQLite file with a database.
|
||||||
|
- `table` — Name of a table in the SQLite database.
|
||||||
|
|
||||||
|
## Usage Example {#usage-example}
|
||||||
|
|
||||||
|
Shows a query creating the SQLite table:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW CREATE TABLE sqlite_db.table2;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
CREATE TABLE SQLite.table2
|
||||||
|
(
|
||||||
|
`col1` Nullable(Int32),
|
||||||
|
`col2` Nullable(String)
|
||||||
|
)
|
||||||
|
ENGINE = SQLite('sqlite.db','table2');
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns the data from the table:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM sqlite_db.table2 ORDER BY col1;
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─col1─┬─col2──┐
|
||||||
|
│ 1 │ text1 │
|
||||||
|
│ 2 │ text2 │
|
||||||
|
│ 3 │ text3 │
|
||||||
|
└──────┴───────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- [SQLite](../../../engines/database-engines/sqlite.md) engine
|
||||||
|
- [sqlite](../../../sql-reference/table-functions/sqlite.md) table function
|
@ -38,9 +38,7 @@ A table for the Graphite data should have the following columns for the followin
|
|||||||
|
|
||||||
- Value of the metric. Data type: any numeric.
|
- Value of the metric. Data type: any numeric.
|
||||||
|
|
||||||
- Version of the metric. Data type: any numeric.
|
- Version of the metric. Data type: any numeric (ClickHouse saves the rows with the highest version or the last written if versions are the same. Other rows are deleted during the merge of data parts).
|
||||||
|
|
||||||
ClickHouse saves the rows with the highest version or the last written if versions are the same. Other rows are deleted during the merge of data parts.
|
|
||||||
|
|
||||||
The names of these columns should be set in the rollup configuration.
|
The names of these columns should be set in the rollup configuration.
|
||||||
|
|
||||||
@ -132,7 +130,7 @@ Fields for `pattern` and `default` sections:
|
|||||||
- `regexp`– A pattern for the metric name.
|
- `regexp`– A pattern for the metric name.
|
||||||
- `age` – The minimum age of the data in seconds.
|
- `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).
|
- `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]`.
|
- `function` – The name of the aggregating function to apply to data whose age falls within the range `[age, age + precision]`. Accepted functions: min / max / any / avg. The average is calculated imprecisely, like the average of the averages.
|
||||||
|
|
||||||
### Configuration Example {#configuration-example}
|
### Configuration Example {#configuration-example}
|
||||||
|
|
||||||
@ -169,4 +167,7 @@ Fields for `pattern` and `default` sections:
|
|||||||
</graphite_rollup>
|
</graphite_rollup>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!!! warning "Warning"
|
||||||
|
Data rollup is performed during merges. Usually, for old partitions, merges are not started, so for rollup it is necessary to trigger an unscheduled merge using [optimize](../../../sql-reference/statements/optimize.md). Or use additional tools, for example [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer).
|
||||||
|
|
||||||
[Original article](https://clickhouse.tech/docs/en/operations/table_engines/graphitemergetree/) <!--hide-->
|
[Original article](https://clickhouse.tech/docs/en/operations/table_engines/graphitemergetree/) <!--hide-->
|
||||||
|
@ -99,7 +99,9 @@ For a description of parameters, see the [CREATE query description](../../../sql
|
|||||||
- `use_minimalistic_part_header_in_zookeeper` — Storage method of the data parts headers in ZooKeeper. If `use_minimalistic_part_header_in_zookeeper=1`, then ZooKeeper stores less data. For more information, see the [setting description](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) in “Server configuration parameters”.
|
- `use_minimalistic_part_header_in_zookeeper` — Storage method of the data parts headers in ZooKeeper. If `use_minimalistic_part_header_in_zookeeper=1`, then ZooKeeper stores less data. For more information, see the [setting description](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) in “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` bytes, ClickHouse reads and writes the data to the storage disk using the direct I/O interface (`O_DIRECT` option). If `min_merge_bytes_to_use_direct_io = 0`, then direct I/O is disabled. Default value: `10 * 1024 * 1024 * 1024` bytes.
|
- `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` bytes, ClickHouse reads and writes the data to the storage disk using the direct I/O interface (`O_DIRECT` option). If `min_merge_bytes_to_use_direct_io = 0`, then direct I/O is disabled. Default value: `10 * 1024 * 1024 * 1024` bytes.
|
||||||
<a name="mergetree_setting-merge_with_ttl_timeout"></a>
|
<a name="mergetree_setting-merge_with_ttl_timeout"></a>
|
||||||
- `merge_with_ttl_timeout` — Minimum delay in seconds before repeating a merge with TTL. Default value: 86400 (1 day).
|
- `merge_with_ttl_timeout` — Minimum delay in seconds before repeating a merge with delete TTL. Default value: `14400` seconds (4 hours).
|
||||||
|
- `merge_with_recompression_ttl_timeout` — Minimum delay in seconds before repeating a merge with recompression TTL. Default value: `14400` seconds (4 hours).
|
||||||
|
- `try_fetch_recompressed_part_timeout` — Timeout (in seconds) before starting merge with recompression. During this time ClickHouse tries to fetch recompressed part from replica which assigned this merge with recompression. Default value: `7200` seconds (2 hours).
|
||||||
- `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.
|
- `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.
|
- `merge_max_block_size` — Maximum number of rows in block for merge operations. Default value: 8192.
|
||||||
- `storage_policy` — Storage policy. See [Using Multiple Block Devices for Data Storage](#table_engine-mergetree-multiple-volumes).
|
- `storage_policy` — Storage policy. See [Using Multiple Block Devices for Data Storage](#table_engine-mergetree-multiple-volumes).
|
||||||
@ -333,7 +335,7 @@ SELECT count() FROM table WHERE u64 * i32 == 10 AND u64 * length(s) >= 1234
|
|||||||
|
|
||||||
The optional `false_positive` parameter is the probability of receiving a false positive response from the filter. Possible values: (0, 1). Default value: 0.025.
|
The optional `false_positive` parameter is the probability of receiving a false positive response from the filter. Possible values: (0, 1). Default value: 0.025.
|
||||||
|
|
||||||
Supported data types: `Int*`, `UInt*`, `Float*`, `Enum`, `Date`, `DateTime`, `String`, `FixedString`, `Array`, `LowCardinality`, `Nullable`.
|
Supported data types: `Int*`, `UInt*`, `Float*`, `Enum`, `Date`, `DateTime`, `String`, `FixedString`, `Array`, `LowCardinality`, `Nullable`, `UUID`.
|
||||||
|
|
||||||
The following functions can use it: [equals](../../../sql-reference/functions/comparison-functions.md), [notEquals](../../../sql-reference/functions/comparison-functions.md), [in](../../../sql-reference/functions/in-functions.md), [notIn](../../../sql-reference/functions/in-functions.md), [has](../../../sql-reference/functions/array-functions.md).
|
The following functions can use it: [equals](../../../sql-reference/functions/comparison-functions.md), [notEquals](../../../sql-reference/functions/comparison-functions.md), [in](../../../sql-reference/functions/in-functions.md), [notIn](../../../sql-reference/functions/in-functions.md), [has](../../../sql-reference/functions/array-functions.md).
|
||||||
|
|
||||||
@ -416,18 +418,20 @@ Reading from a table is automatically parallelized.
|
|||||||
|
|
||||||
Determines the lifetime of values.
|
Determines the lifetime of values.
|
||||||
|
|
||||||
The `TTL` clause can be set for the whole table and for each individual column. Table-level TTL can also specify logic of automatic move of data between disks and volumes.
|
The `TTL` clause can be set for the whole table and for each individual column. Table-level `TTL` can also specify the logic of automatic moving data between disks and volumes, or recompressing parts where all the data has been expired.
|
||||||
|
|
||||||
Expressions must evaluate to [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md) data type.
|
Expressions must evaluate to [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md) data type.
|
||||||
|
|
||||||
Example:
|
**Syntax**
|
||||||
|
|
||||||
|
Setting time-to-live for a column:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
TTL time_column
|
TTL time_column
|
||||||
TTL time_column + interval
|
TTL time_column + interval
|
||||||
```
|
```
|
||||||
|
|
||||||
To define `interval`, use [time interval](../../../sql-reference/operators/index.md#operators-datetime) operators.
|
To define `interval`, use [time interval](../../../sql-reference/operators/index.md#operators-datetime) operators, for example:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
TTL date_time + INTERVAL 1 MONTH
|
TTL date_time + INTERVAL 1 MONTH
|
||||||
@ -440,9 +444,9 @@ When the values in the column expire, ClickHouse replaces them with the default
|
|||||||
|
|
||||||
The `TTL` clause can’t be used for key columns.
|
The `TTL` clause can’t be used for key columns.
|
||||||
|
|
||||||
Examples:
|
**Examples**
|
||||||
|
|
||||||
Creating a table with TTL
|
Creating a table with `TTL`:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
CREATE TABLE example_table
|
CREATE TABLE example_table
|
||||||
@ -475,11 +479,11 @@ ALTER TABLE example_table
|
|||||||
|
|
||||||
### Table TTL {#mergetree-table-ttl}
|
### Table TTL {#mergetree-table-ttl}
|
||||||
|
|
||||||
Table can have an expression for removal of expired rows, and multiple expressions for automatic move of parts between [disks or volumes](#table_engine-mergetree-multiple-volumes). When rows in the table expire, ClickHouse deletes all corresponding rows. For parts moving feature, all rows of a part must satisfy the movement expression criteria.
|
Table can have an expression for removal of expired rows, and multiple expressions for automatic move of parts between [disks or volumes](#table_engine-mergetree-multiple-volumes). When rows in the table expire, ClickHouse deletes all corresponding rows. For parts moving or recompressing, all rows of a part must satisfy the `TTL` expression criteria.
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
TTL expr
|
TTL expr
|
||||||
[DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'] ...
|
[DELETE|RECOMPRESS codec_name1|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|RECOMPRESS codec_name2|TO DISK 'aaa'|TO VOLUME 'bbb'] ...
|
||||||
[WHERE conditions]
|
[WHERE conditions]
|
||||||
[GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ]
|
[GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ]
|
||||||
```
|
```
|
||||||
@ -487,11 +491,12 @@ TTL expr
|
|||||||
Type of TTL rule may follow each TTL expression. It affects an action which is to be done once the expression is satisfied (reaches current time):
|
Type of TTL rule may follow each TTL expression. It affects an action which is to be done once the expression is satisfied (reaches current time):
|
||||||
|
|
||||||
- `DELETE` - delete expired rows (default action);
|
- `DELETE` - delete expired rows (default action);
|
||||||
|
- `RECOMPRESS codec_name` - recompress data part with the `codec_name`;
|
||||||
- `TO DISK 'aaa'` - move part to the disk `aaa`;
|
- `TO DISK 'aaa'` - move part to the disk `aaa`;
|
||||||
- `TO VOLUME 'bbb'` - move part to the disk `bbb`;
|
- `TO VOLUME 'bbb'` - move part to the disk `bbb`;
|
||||||
- `GROUP BY` - aggregate expired rows.
|
- `GROUP BY` - aggregate expired rows.
|
||||||
|
|
||||||
With `WHERE` clause you may specify which of the expired rows to delete or aggregate (it cannot be applied to moves).
|
With `WHERE` clause you may specify which of the expired rows to delete or aggregate (it cannot be applied to moves or recompression).
|
||||||
|
|
||||||
`GROUP BY` expression must be a prefix of the table primary key.
|
`GROUP BY` expression must be a prefix of the table primary key.
|
||||||
|
|
||||||
@ -499,7 +504,7 @@ If a column is not part of the `GROUP BY` expression and is not set explicitly i
|
|||||||
|
|
||||||
**Examples**
|
**Examples**
|
||||||
|
|
||||||
Creating a table with TTL:
|
Creating a table with `TTL`:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
CREATE TABLE example_table
|
CREATE TABLE example_table
|
||||||
@ -515,7 +520,7 @@ TTL d + INTERVAL 1 MONTH [DELETE],
|
|||||||
d + INTERVAL 2 WEEK TO DISK 'bbb';
|
d + INTERVAL 2 WEEK TO DISK 'bbb';
|
||||||
```
|
```
|
||||||
|
|
||||||
Altering TTL of the table:
|
Altering `TTL` of the table:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
ALTER TABLE example_table
|
ALTER TABLE example_table
|
||||||
@ -536,6 +541,21 @@ ORDER BY d
|
|||||||
TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1;
|
TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Creating a table, where expired rows are recompressed:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE table_for_recompression
|
||||||
|
(
|
||||||
|
d DateTime,
|
||||||
|
key UInt64,
|
||||||
|
value String
|
||||||
|
) ENGINE MergeTree()
|
||||||
|
ORDER BY tuple()
|
||||||
|
PARTITION BY key
|
||||||
|
TTL d + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(17)), d + INTERVAL 1 YEAR RECOMPRESS CODEC(LZ4HC(10))
|
||||||
|
SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0;
|
||||||
|
```
|
||||||
|
|
||||||
Creating a table, where expired rows are aggregated. In result rows `x` contains the maximum value accross the grouped rows, `y` — the minimum value, and `d` — any occasional value from grouped rows.
|
Creating a table, where expired rows are aggregated. In result rows `x` contains the maximum value accross the grouped rows, `y` — the minimum value, and `d` — any occasional value from grouped rows.
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
@ -552,14 +572,19 @@ ORDER BY (k1, k2)
|
|||||||
TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y);
|
TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y);
|
||||||
```
|
```
|
||||||
|
|
||||||
**Removing Data**
|
### Removing Expired Data {#mergetree-removing-expired-data}
|
||||||
|
|
||||||
Data with an expired TTL is removed when ClickHouse merges data parts.
|
Data with an expired `TTL` is removed when ClickHouse merges data parts.
|
||||||
|
|
||||||
When ClickHouse see that data is expired, it performs an off-schedule merge. To control the frequency of such merges, you can set `merge_with_ttl_timeout`. If the value is too low, it will perform many off-schedule merges that may consume a lot of resources.
|
When ClickHouse detects that data is expired, it performs an off-schedule merge. To control the frequency of such merges, you can set `merge_with_ttl_timeout`. If the value is too low, it will perform many off-schedule merges that may consume a lot of resources.
|
||||||
|
|
||||||
If you perform the `SELECT` query between merges, you may get expired data. To avoid it, use the [OPTIMIZE](../../../sql-reference/statements/optimize.md) query before `SELECT`.
|
If you perform the `SELECT` query between merges, you may get expired data. To avoid it, use the [OPTIMIZE](../../../sql-reference/statements/optimize.md) query before `SELECT`.
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- [ttl_only_drop_parts](../../../operations/settings/settings.md#ttl_only_drop_parts) setting
|
||||||
|
|
||||||
|
|
||||||
## Using Multiple Block Devices for Data Storage {#table_engine-mergetree-multiple-volumes}
|
## Using Multiple Block Devices for Data Storage {#table_engine-mergetree-multiple-volumes}
|
||||||
|
|
||||||
### Introduction {#introduction}
|
### Introduction {#introduction}
|
||||||
@ -844,44 +869,3 @@ S3 disk can be configured as `main` or `cold` storage:
|
|||||||
```
|
```
|
||||||
|
|
||||||
In case of `cold` option a data can be moved to S3 if local disk free size will be smaller than `move_factor * disk_size` or by TTL move rule.
|
In case of `cold` option a data can be moved to S3 if local disk free size will be smaller than `move_factor * disk_size` or by TTL move rule.
|
||||||
|
|
||||||
## Using HDFS for Data Storage {#table_engine-mergetree-hdfs}
|
|
||||||
|
|
||||||
[HDFS](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html) is a distributed file system for remote data storage.
|
|
||||||
|
|
||||||
`MergeTree` family table engines can store data to HDFS using a disk with type `HDFS`.
|
|
||||||
|
|
||||||
Configuration markup:
|
|
||||||
``` xml
|
|
||||||
<yandex>
|
|
||||||
<storage_configuration>
|
|
||||||
<disks>
|
|
||||||
<hdfs>
|
|
||||||
<type>hdfs</type>
|
|
||||||
<endpoint>hdfs://hdfs1:9000/clickhouse/</endpoint>
|
|
||||||
</hdfs>
|
|
||||||
</disks>
|
|
||||||
<policies>
|
|
||||||
<hdfs>
|
|
||||||
<volumes>
|
|
||||||
<main>
|
|
||||||
<disk>hdfs</disk>
|
|
||||||
</main>
|
|
||||||
</volumes>
|
|
||||||
</hdfs>
|
|
||||||
</policies>
|
|
||||||
</storage_configuration>
|
|
||||||
|
|
||||||
<merge_tree>
|
|
||||||
<min_bytes_for_wide_part>0</min_bytes_for_wide_part>
|
|
||||||
</merge_tree>
|
|
||||||
</yandex>
|
|
||||||
```
|
|
||||||
|
|
||||||
Required parameters:
|
|
||||||
|
|
||||||
- `endpoint` — HDFS endpoint URL in `path` format. Endpoint URL should contain a root path to store data.
|
|
||||||
|
|
||||||
Optional parameters:
|
|
||||||
|
|
||||||
- `min_bytes_for_seek` — The minimal number of bytes to use seek operation instead of sequential read. Default value: `1 Mb`.
|
|
||||||
|
@ -137,7 +137,7 @@ CREATE TABLE table_name
|
|||||||
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver)
|
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver)
|
||||||
PARTITION BY toYYYYMM(EventDate)
|
PARTITION BY toYYYYMM(EventDate)
|
||||||
ORDER BY (CounterID, EventDate, intHash32(UserID))
|
ORDER BY (CounterID, EventDate, intHash32(UserID))
|
||||||
SAMPLE BY intHash32(UserID)
|
SAMPLE BY intHash32(UserID);
|
||||||
```
|
```
|
||||||
|
|
||||||
<details markdown="1">
|
<details markdown="1">
|
||||||
@ -150,12 +150,12 @@ CREATE TABLE table_name
|
|||||||
EventDate DateTime,
|
EventDate DateTime,
|
||||||
CounterID UInt32,
|
CounterID UInt32,
|
||||||
UserID UInt32
|
UserID UInt32
|
||||||
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192)
|
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192);
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
As the example shows, these parameters can contain substitutions in curly brackets. The substituted values are taken from the «[macros](../../../operations/server-configuration-parameters/settings/#macros) section of the configuration file.
|
As the example shows, these parameters can contain substitutions in curly brackets. The substituted values are taken from the [macros](../../../operations/server-configuration-parameters/settings.md#macros) section of the configuration file.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
@ -56,6 +56,9 @@ The same thing happens if the subordinate table does not exist when the buffer i
|
|||||||
|
|
||||||
If you need to run ALTER for a subordinate table, and the Buffer table, we recommend first deleting the Buffer table, running ALTER for the subordinate table, then creating the Buffer table again.
|
If you need to run ALTER for a subordinate table, and the Buffer table, we recommend first deleting the Buffer table, running ALTER for the subordinate table, then creating the Buffer table again.
|
||||||
|
|
||||||
|
!!! attention "Attention"
|
||||||
|
Running ALTER on the Buffer table in releases made before 28 Sep 2020 will cause a `Block structure mismatch` error (see [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117)), so deleting the Buffer table and then recreating is the only option. It is advisable to check that this error is fixed in your release before trying to run ALTER on the Buffer table.
|
||||||
|
|
||||||
If the server is restarted abnormally, the data in the buffer is lost.
|
If the server is restarted abnormally, the data in the buffer is lost.
|
||||||
|
|
||||||
`FINAL` and `SAMPLE` do not work correctly for Buffer tables. These conditions are passed to the destination table, but are not used for processing data in the buffer. If these features are required we recommend only using the Buffer table for writing, while reading from the destination table.
|
`FINAL` and `SAMPLE` do not work correctly for Buffer tables. These conditions are passed to the destination table, but are not used for processing data in the buffer. If these features are required we recommend only using the Buffer table for writing, while reading from the destination table.
|
||||||
|
@ -24,7 +24,7 @@ The `Format` parameter specifies one of the available file formats. To perform
|
|||||||
`INSERT` queries – for output. The available formats are listed in the
|
`INSERT` queries – for output. The available formats are listed in the
|
||||||
[Formats](../../../interfaces/formats.md#formats) section.
|
[Formats](../../../interfaces/formats.md#formats) section.
|
||||||
|
|
||||||
ClickHouse does not allow specifying filesystem path for`File`. It will use folder defined by [path](../../../operations/server-configuration-parameters/settings.md) setting in server configuration.
|
ClickHouse does not allow specifying filesystem path for `File`. It will use folder defined by [path](../../../operations/server-configuration-parameters/settings.md) setting in server configuration.
|
||||||
|
|
||||||
When creating table using `File(Format)` it creates empty subdirectory in that folder. When data is written to that table, it’s put into `data.Format` file in that subdirectory.
|
When creating table using `File(Format)` it creates empty subdirectory in that folder. When data is written to that table, it’s put into `data.Format` file in that subdirectory.
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ We use `Decimal` data type to store prices. Everything else is quite straightfor
|
|||||||
|
|
||||||
## Import Data
|
## Import Data
|
||||||
|
|
||||||
Upload data into ClickHouse in parallel:
|
Upload data into ClickHouse:
|
||||||
|
|
||||||
```
|
```
|
||||||
clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO dish FORMAT CSVWithNames" < Dish.csv
|
clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO dish FORMAT CSVWithNames" < Dish.csv
|
||||||
|
@ -114,5 +114,5 @@ Seamlessly migration from ZooKeeper to `clickhouse-keeper` is impossible you hav
|
|||||||
clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/version-2 --output-dir /path/to/clickhouse/keeper/snapshots
|
clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/version-2 --output-dir /path/to/clickhouse/keeper/snapshots
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Copy snapshot to `clickhouse-server` nodes with configured `keeper` or start `clickhouse-keeper` instead of ZooKeeper. Snapshot must persist only on leader node, leader will sync it automatically to other nodes.
|
4. Copy snapshot to `clickhouse-server` nodes with configured `keeper` or start `clickhouse-keeper` instead of ZooKeeper. Snapshot must persist on all nodes, otherwise empty nodes can be faster and one of them can becamse leader.
|
||||||
|
|
||||||
|
@ -18,6 +18,18 @@ Some settings specified in the main configuration file can be overridden in othe
|
|||||||
- If `replace` is specified, it replaces the entire element with the specified one.
|
- If `replace` is specified, it replaces the entire element with the specified one.
|
||||||
- If `remove` is specified, it deletes the element.
|
- If `remove` is specified, it deletes the element.
|
||||||
|
|
||||||
|
You can also declare attributes as coming from environment variables by using `from_env="VARIABLE_NAME"`:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<yandex>
|
||||||
|
<macros>
|
||||||
|
<replica from_env="REPLICA" />
|
||||||
|
<layer from_env="LAYER" />
|
||||||
|
<shard from_env="SHARD" />
|
||||||
|
</macros>
|
||||||
|
</yandex>
|
||||||
|
```
|
||||||
|
|
||||||
## Substitution {#substitution}
|
## Substitution {#substitution}
|
||||||
|
|
||||||
The config can also define “substitutions”. If an element has the `incl` attribute, the corresponding substitution from the file will be used as the value. By default, the path to the file with substitutions is `/etc/metrika.xml`. This can be changed in the [include_from](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-include_from) element in the server config. The substitution values are specified in `/yandex/substitution_name` elements in this file. If a substitution specified in `incl` does not exist, it is recorded in the log. To prevent ClickHouse from logging missing substitutions, specify the `optional="true"` attribute (for example, settings for [macros](../operations/server-configuration-parameters/settings.md)).
|
The config can also define “substitutions”. If an element has the `incl` attribute, the corresponding substitution from the file will be used as the value. By default, the path to the file with substitutions is `/etc/metrika.xml`. This can be changed in the [include_from](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-include_from) element in the server config. The substitution values are specified in `/yandex/substitution_name` elements in this file. If a substitution specified in `incl` does not exist, it is recorded in the log. To prevent ClickHouse from logging missing substitutions, specify the `optional="true"` attribute (for example, settings for [macros](../operations/server-configuration-parameters/settings.md)).
|
||||||
|
@ -486,7 +486,7 @@ Parameter substitutions for replicated tables.
|
|||||||
|
|
||||||
Can be omitted if replicated tables are not used.
|
Can be omitted if replicated tables are not used.
|
||||||
|
|
||||||
For more information, see the section “[Creating replicated tables](../../engines/table-engines/mergetree-family/replication.md)”.
|
For more information, see the section [Creating replicated tables](../../engines/table-engines/mergetree-family/replication.md#creating-replicated-tables).
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
|
|
||||||
@ -1247,6 +1247,7 @@ Default value: `/var/lib/clickhouse/access/`.
|
|||||||
Section of the configuration file that contains settings:
|
Section of the configuration file that contains settings:
|
||||||
- Path to configuration file with predefined users.
|
- Path to configuration file with predefined users.
|
||||||
- Path to folder where users created by SQL commands are stored.
|
- Path to folder where users created by SQL commands are stored.
|
||||||
|
- ZooKeeper node path where users created by SQL commands are stored and replicated (experimental).
|
||||||
|
|
||||||
If this section is specified, the path from [users_config](../../operations/server-configuration-parameters/settings.md#users-config) and [access_control_path](../../operations/server-configuration-parameters/settings.md#access_control_path) won't be used.
|
If this section is specified, the path from [users_config](../../operations/server-configuration-parameters/settings.md#users-config) and [access_control_path](../../operations/server-configuration-parameters/settings.md#access_control_path) won't be used.
|
||||||
|
|
||||||
@ -1262,6 +1263,9 @@ The `user_directories` section can contain any number of items, the order of the
|
|||||||
<local_directory>
|
<local_directory>
|
||||||
<path>/var/lib/clickhouse/access/</path>
|
<path>/var/lib/clickhouse/access/</path>
|
||||||
</local_directory>
|
</local_directory>
|
||||||
|
<replicated>
|
||||||
|
<zookeeper_path>/clickhouse/access/</zookeeper_path>
|
||||||
|
</replicated>
|
||||||
</user_directories>
|
</user_directories>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -2041,10 +2041,25 @@ Default value: 0.
|
|||||||
|
|
||||||
## input_format_parallel_parsing {#input-format-parallel-parsing}
|
## input_format_parallel_parsing {#input-format-parallel-parsing}
|
||||||
|
|
||||||
- Type: bool
|
Enables or disables order-preserving parallel parsing of data formats. Supported only for [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) and [JSONEachRow](../../interfaces/formats.md#jsoneachrow) formats.
|
||||||
- Default value: True
|
|
||||||
|
|
||||||
Enable order-preserving parallel parsing of data formats. Supported only for TSV, TKSV, CSV, and JSONEachRow formats.
|
Possible values:
|
||||||
|
|
||||||
|
- 1 — Enabled.
|
||||||
|
- 0 — Disabled.
|
||||||
|
|
||||||
|
Default value: `0`.
|
||||||
|
|
||||||
|
## output_format_parallel_formatting {#output-format-parallel-formatting}
|
||||||
|
|
||||||
|
Enables or disables parallel formatting of data formats. Supported only for [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) and [JSONEachRow](../../interfaces/formats.md#jsoneachrow) formats.
|
||||||
|
|
||||||
|
Possible values:
|
||||||
|
|
||||||
|
- 1 — Enabled.
|
||||||
|
- 0 — Disabled.
|
||||||
|
|
||||||
|
Default value: `0`.
|
||||||
|
|
||||||
## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing}
|
## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing}
|
||||||
|
|
||||||
|
@ -5,10 +5,111 @@ toc_title: External Disks for Storing Data
|
|||||||
|
|
||||||
# External Disks for Storing Data {#external-disks}
|
# External Disks for Storing Data {#external-disks}
|
||||||
|
|
||||||
Data, processed in ClickHouse, is usually stored in the local file system — on the same machine with the ClickHouse server. That requires large-capacity disks, which can be expensive enough. To avoid that you can store the data remotely — on [Amazon s3](https://aws.amazon.com/s3/) disks or in the Hadoop Distributed File System ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)).
|
Data, processed in ClickHouse, is usually stored in the local file system — on the same machine with the ClickHouse server. That requires large-capacity disks, which can be expensive enough. To avoid that you can store the data remotely — on [Amazon S3](https://aws.amazon.com/s3/) disks or in the Hadoop Distributed File System ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)).
|
||||||
|
|
||||||
To work with data stored on `Amazon s3` disks use [s3](../engines/table-engines/integrations/s3.md) table engine, and to work with data in the Hadoop Distributed File System — [HDFS](../engines/table-engines/integrations/hdfs.md) table engine.
|
To work with data stored on `Amazon S3` disks use [S3](../engines/table-engines/integrations/s3.md) table engine, and to work with data in the Hadoop Distributed File System — [HDFS](../engines/table-engines/integrations/hdfs.md) table engine.
|
||||||
|
|
||||||
## Zero-copy Replication {#zero-copy}
|
## Zero-copy Replication {#zero-copy}
|
||||||
|
|
||||||
ClickHouse supports zero-copy replication for `s3` and `HDFS` disks, which means that if the data is stored remotely on several machines and needs to be synchronized, then only the metadata is replicated (paths to the data parts), but not the data itself.
|
ClickHouse supports zero-copy replication for `S3` and `HDFS` disks, which means that if the data is stored remotely on several machines and needs to be synchronized, then only the metadata is replicated (paths to the data parts), but not the data itself.
|
||||||
|
|
||||||
|
## Configuring HDFS {#configuring-hdfs}
|
||||||
|
|
||||||
|
[MergeTree](../engines/table-engines/mergetree-family/mergetree.md) and [Log](../engines/table-engines/log-family/log.md) family table engines can store data to HDFS using a disk with type `HDFS`.
|
||||||
|
|
||||||
|
Configuration markup:
|
||||||
|
|
||||||
|
``` xml
|
||||||
|
<yandex>
|
||||||
|
<storage_configuration>
|
||||||
|
<disks>
|
||||||
|
<hdfs>
|
||||||
|
<type>hdfs</type>
|
||||||
|
<endpoint>hdfs://hdfs1:9000/clickhouse/</endpoint>
|
||||||
|
</hdfs>
|
||||||
|
</disks>
|
||||||
|
<policies>
|
||||||
|
<hdfs>
|
||||||
|
<volumes>
|
||||||
|
<main>
|
||||||
|
<disk>hdfs</disk>
|
||||||
|
</main>
|
||||||
|
</volumes>
|
||||||
|
</hdfs>
|
||||||
|
</policies>
|
||||||
|
</storage_configuration>
|
||||||
|
|
||||||
|
<merge_tree>
|
||||||
|
<min_bytes_for_wide_part>0</min_bytes_for_wide_part>
|
||||||
|
</merge_tree>
|
||||||
|
</yandex>
|
||||||
|
```
|
||||||
|
|
||||||
|
Required parameters:
|
||||||
|
|
||||||
|
- `endpoint` — HDFS endpoint URL in `path` format. Endpoint URL should contain a root path to store data.
|
||||||
|
|
||||||
|
Optional parameters:
|
||||||
|
|
||||||
|
- `min_bytes_for_seek` — The minimal number of bytes to use seek operation instead of sequential read. Default value: `1 Mb`.
|
||||||
|
|
||||||
|
## Using Virtual File System for Data Encryption {#encrypted-virtual-file-system}
|
||||||
|
|
||||||
|
You can encrypt the data stored on [S3](../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-s3), or [HDFS](#configuring-hdfs) external disks, or on a local disk. To turn on the encryption mode, in the configuration file you must define a disk with the type `encrypted` and choose a disk on which the data will be saved. An `encrypted` disk ciphers all written files on the fly, and when you read files from an `encrypted` disk it deciphers them automatically. So you can work with an `encrypted` disk like with a normal one.
|
||||||
|
|
||||||
|
Example of disk configuration:
|
||||||
|
|
||||||
|
``` xml
|
||||||
|
<disks>
|
||||||
|
<disk1>
|
||||||
|
<type>local</type>
|
||||||
|
<path>/path1/</path>
|
||||||
|
</disk1>
|
||||||
|
<disk2>
|
||||||
|
<type>encrypted</type>
|
||||||
|
<disk>disk1</disk>
|
||||||
|
<path>path2/</path>
|
||||||
|
<key>_16_ascii_chars_</key>
|
||||||
|
</disk2>
|
||||||
|
</disks>
|
||||||
|
```
|
||||||
|
|
||||||
|
For example, when ClickHouse writes data from some table to a file `store/all_1_1_0/data.bin` to `disk1`, then in fact this file will be written to the physical disk along the path `/path1/store/all_1_1_0/data.bin`.
|
||||||
|
|
||||||
|
When writing the same file to `disk2`, it will actually be written to the physical disk at the path `/path1/path2/store/all_1_1_0/data.bin` in encrypted mode.
|
||||||
|
|
||||||
|
Required parameters:
|
||||||
|
|
||||||
|
- `type` — `encrypted`. Otherwise the encrypted disk is not created.
|
||||||
|
- `disk` — Type of disk for data storage.
|
||||||
|
- `key` — The key for encryption and decryption. Type: [Uint64](../sql-reference/data-types/int-uint.md). You can use `key_hex` parameter to encrypt in hexadecimal form.
|
||||||
|
You can specify multiple keys using the `id` attribute (see example above).
|
||||||
|
|
||||||
|
Optional parameters:
|
||||||
|
|
||||||
|
- `path` — Path to the location on the disk where the data will be saved. If not specified, the data will be saved in the root directory.
|
||||||
|
- `current_key_id` — The key used for encryption. All the specified keys can be used for decryption, and you can always switch to another key while maintaining access to previously encrypted data.
|
||||||
|
- `algorithm` — [Algorithm](../sql-reference/statements/create/table.md#create-query-encryption-codecs) for encryption. Possible values: `AES_128_CTR`, `AES_192_CTR` or `AES_256_CTR`. Default value: `AES_128_CTR`. The key length depends on the algorithm: `AES_128_CTR` — 16 bytes, `AES_192_CTR` — 24 bytes, `AES_256_CTR` — 32 bytes.
|
||||||
|
|
||||||
|
Example of disk configuration:
|
||||||
|
|
||||||
|
``` xml
|
||||||
|
<yandex>
|
||||||
|
<storage_configuration>
|
||||||
|
<disks>
|
||||||
|
<disk_s3>
|
||||||
|
<type>s3</type>
|
||||||
|
<endpoint>...
|
||||||
|
</disk_s3>
|
||||||
|
<disk_s3_encrypted>
|
||||||
|
<type>encrypted</type>
|
||||||
|
<disk>disk_s3</disk>
|
||||||
|
<algorithm>AES_128_CTR</algorithm>
|
||||||
|
<key_hex id="0">00112233445566778899aabbccddeeff</key_hex>
|
||||||
|
<key_hex id="1">ffeeddccbbaa99887766554433221100</key_hex>
|
||||||
|
<current_key_id>1</current_key_id>
|
||||||
|
</disk_s3_encrypted>
|
||||||
|
</disks>
|
||||||
|
</storage_configuration>
|
||||||
|
</yandex>
|
||||||
|
```
|
||||||
|
@ -4,7 +4,7 @@ Contains information about [trace spans](https://opentracing.io/docs/overview/sp
|
|||||||
|
|
||||||
Columns:
|
Columns:
|
||||||
|
|
||||||
- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md) — ID of the trace for executed query.
|
- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md)) — ID of the trace for executed query.
|
||||||
|
|
||||||
- `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the `trace span`.
|
- `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the `trace span`.
|
||||||
|
|
||||||
|
129
docs/en/operations/system-tables/zookeeper_log.md
Normal file
129
docs/en/operations/system-tables/zookeeper_log.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
# system.zookeeper_log {#system-zookeeper_log}
|
||||||
|
|
||||||
|
This table contains information about the parameters of the request to the ZooKeeper server and the response from it.
|
||||||
|
|
||||||
|
For requests, only columns with request parameters are filled in, and the remaining columns are filled with default values (`0` or `NULL`). When the response arrives, the data from the response is added to the other columns.
|
||||||
|
|
||||||
|
Columns with request parameters:
|
||||||
|
|
||||||
|
- `type` ([Enum](../../sql-reference/data-types/enum.md)) — Event type in the ZooKeeper client. Can have one of the following values:
|
||||||
|
- `Request` — The request has been sent.
|
||||||
|
- `Response` — The response was received.
|
||||||
|
- `Finalize` — The connection is lost, no response was received.
|
||||||
|
- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the event happened.
|
||||||
|
- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the event happened.
|
||||||
|
- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address of ZooKeeper server that was used to make the request.
|
||||||
|
- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The port of ZooKeeper server that was used to make the request.
|
||||||
|
- `session_id` ([Int64](../../sql-reference/data-types/int-uint.md)) — The session ID that the ZooKeeper server sets for each connection.
|
||||||
|
- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — The ID of the request within the session. This is usually a sequential request number. It is the same for the request row and the paired `response`/`finalize` row.
|
||||||
|
- `has_watch` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The request whether the [watch](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches) has been set.
|
||||||
|
- `op_num` ([Enum](../../sql-reference/data-types/enum.md)) — The type of request or response.
|
||||||
|
- `path` ([String](../../sql-reference/data-types/string.md)) — The path to the ZooKeeper node specified in the request, or an empty string if the request not requires specifying a path.
|
||||||
|
- `data` ([String](../../sql-reference/data-types/string.md)) — The data written to the ZooKeeper node (for the `SET` and `CREATE` requests — what the request wanted to write, for the response to the `GET` request — what was read) or an empty string.
|
||||||
|
- `is_ephemeral` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [ephemeral](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Ephemeral+Nodes).
|
||||||
|
- `is_sequential` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [sequential](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Sequence+Nodes+--+Unique+Naming).
|
||||||
|
- `version` ([Nullable(Int32)](../../sql-reference/data-types/nullable.md)) — The version of the ZooKeeper node that the request expects when executing. This is supported for `CHECK`, `SET`, `REMOVE` requests (is relevant `-1` if the request does not check the version or `NULL` for other requests that do not support version checking).
|
||||||
|
- `requests_size` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of requests included in the multi request (this is a special request that consists of several consecutive ordinary requests and executes them atomically). All requests included in multi request will have the same `xid`.
|
||||||
|
- `request_idx` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of the request included in multi request (for multi request — `0`, then in order from `1`).
|
||||||
|
|
||||||
|
Columns with request response parameters:
|
||||||
|
|
||||||
|
- `zxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — ZooKeeper transaction ID. The serial number issued by the ZooKeeper server in response to a successfully executed request (`0` if the request was not executed/returned an error/the client does not know whether the request was executed).
|
||||||
|
- `error` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — Error code. Can have many values, here are just some of them:
|
||||||
|
- `ZOK` — The request was executed seccessfully.
|
||||||
|
- `ZCONNECTIONLOSS` — The connection was lost.
|
||||||
|
- `ZOPERATIONTIMEOUT` — The request execution timeout has expired.
|
||||||
|
- `ZSESSIONEXPIRED` — The session has expired.
|
||||||
|
- `NULL` — The request is completed.
|
||||||
|
- `watch_type` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The type of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`.
|
||||||
|
- `watch_state` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The status of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`.
|
||||||
|
- `path_created` ([String](../../sql-reference/data-types/string.md)) — The path to the created ZooKeeper node (for responses to the `CREATE` request), may differ from the `path` if the node is created as a `sequential`.
|
||||||
|
- `stat_czxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that caused this ZooKeeper node to be created.
|
||||||
|
- `stat_mzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that last modified this ZooKeeper node.
|
||||||
|
- `stat_pzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The transaction ID of the change that last modified childern of this ZooKeeper node.
|
||||||
|
- `stat_version` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the data of this ZooKeeper node.
|
||||||
|
- `stat_cversion` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the children of this ZooKeeper node.
|
||||||
|
- `stat_dataLength` ([Int32](../../sql-reference/data-types/int-uint.md)) — The length of the data field of this ZooKeeper node.
|
||||||
|
- `stat_numChildren` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of children of this ZooKeeper node.
|
||||||
|
- `children` ([Array(String)](../../sql-reference/data-types/array.md)) — The list of child ZooKeeper nodes (for responses to `LIST` request).
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM system.zookeeper_log WHERE (session_id = '106662742089334927') AND (xid = '10858') FORMAT Vertical;
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
type: Request
|
||||||
|
event_date: 2021-08-09
|
||||||
|
event_time: 2021-08-09 21:38:30.291792
|
||||||
|
address: ::
|
||||||
|
port: 2181
|
||||||
|
session_id: 106662742089334927
|
||||||
|
xid: 10858
|
||||||
|
has_watch: 1
|
||||||
|
op_num: List
|
||||||
|
path: /clickhouse/task_queue/ddl
|
||||||
|
data:
|
||||||
|
is_ephemeral: 0
|
||||||
|
is_sequential: 0
|
||||||
|
version: ᴺᵁᴸᴸ
|
||||||
|
requests_size: 0
|
||||||
|
request_idx: 0
|
||||||
|
zxid: 0
|
||||||
|
error: ᴺᵁᴸᴸ
|
||||||
|
watch_type: ᴺᵁᴸᴸ
|
||||||
|
watch_state: ᴺᵁᴸᴸ
|
||||||
|
path_created:
|
||||||
|
stat_czxid: 0
|
||||||
|
stat_mzxid: 0
|
||||||
|
stat_pzxid: 0
|
||||||
|
stat_version: 0
|
||||||
|
stat_cversion: 0
|
||||||
|
stat_dataLength: 0
|
||||||
|
stat_numChildren: 0
|
||||||
|
children: []
|
||||||
|
|
||||||
|
Row 2:
|
||||||
|
──────
|
||||||
|
type: Response
|
||||||
|
event_date: 2021-08-09
|
||||||
|
event_time: 2021-08-09 21:38:30.292086
|
||||||
|
address: ::
|
||||||
|
port: 2181
|
||||||
|
session_id: 106662742089334927
|
||||||
|
xid: 10858
|
||||||
|
has_watch: 1
|
||||||
|
op_num: List
|
||||||
|
path: /clickhouse/task_queue/ddl
|
||||||
|
data:
|
||||||
|
is_ephemeral: 0
|
||||||
|
is_sequential: 0
|
||||||
|
version: ᴺᵁᴸᴸ
|
||||||
|
requests_size: 0
|
||||||
|
request_idx: 0
|
||||||
|
zxid: 16926267
|
||||||
|
error: ZOK
|
||||||
|
watch_type: ᴺᵁᴸᴸ
|
||||||
|
watch_state: ᴺᵁᴸᴸ
|
||||||
|
path_created:
|
||||||
|
stat_czxid: 16925469
|
||||||
|
stat_mzxid: 16925469
|
||||||
|
stat_pzxid: 16926179
|
||||||
|
stat_version: 0
|
||||||
|
stat_cversion: 7
|
||||||
|
stat_dataLength: 0
|
||||||
|
stat_numChildren: 7
|
||||||
|
children: ['query-0000000006','query-0000000005','query-0000000004','query-0000000003','query-0000000002','query-0000000001','query-0000000000']
|
||||||
|
```
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- [ZooKeeper](../../operations/tips.md#zookeeper)
|
||||||
|
- [ZooKeeper guide](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html)
|
@ -255,7 +255,7 @@ windowFunnel(window, [mode, [mode, ... ]])(timestamp, cond1, cond2, ..., condN)
|
|||||||
|
|
||||||
- `window` — Length of the sliding window, it is the time interval between the first and the last condition. The unit of `window` depends on the `timestamp` itself and varies. Determined using the expression `timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window`.
|
- `window` — Length of the sliding window, it is the time interval between the first and the last condition. The unit of `window` depends on the `timestamp` itself and varies. Determined using the expression `timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window`.
|
||||||
- `mode` — It is an optional argument. One or more modes can be set.
|
- `mode` — It is an optional argument. One or more modes can be set.
|
||||||
- `'strict'` — If same condition holds for sequence of events then such non-unique events would be skipped.
|
- `'strict_deduplication'` — If the same condition holds for the sequence of events, then such repeating event interrupts further processing.
|
||||||
- `'strict_order'` — Don't allow interventions of other events. E.g. in the case of `A->B->D->C`, it stops finding `A->B->C` at the `D` and the max event level is 2.
|
- `'strict_order'` — Don't allow interventions of other events. E.g. in the case of `A->B->D->C`, it stops finding `A->B->C` at the `D` and the max event level is 2.
|
||||||
- `'strict_increase'` — Apply conditions only to events with strictly increasing timestamps.
|
- `'strict_increase'` — Apply conditions only to events with strictly increasing timestamps.
|
||||||
|
|
||||||
|
@ -952,7 +952,7 @@ SELECT arrayEnumerateDense([10, 20, 10, 30])
|
|||||||
|
|
||||||
## arrayIntersect(arr) {#array-functions-arrayintersect}
|
## arrayIntersect(arr) {#array-functions-arrayintersect}
|
||||||
|
|
||||||
Takes multiple arrays, returns an array with elements that are present in all source arrays. Elements order in the resulting array is the same as in the first array.
|
Takes multiple arrays, returns an array with elements that are present in all source arrays.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ Result:
|
|||||||
|
|
||||||
## h3ToGeo {#h3togeo}
|
## h3ToGeo {#h3togeo}
|
||||||
|
|
||||||
Returns `(lon, lat)` that corresponds to the provided H3 index.
|
Returns the geographical coordinates of longitude and latitude corresponding to the provided [H3](#h3index) index.
|
||||||
|
|
||||||
**Syntax**
|
**Syntax**
|
||||||
|
|
||||||
@ -207,20 +207,18 @@ h3ToGeo(h3Index)
|
|||||||
|
|
||||||
**Arguments**
|
**Arguments**
|
||||||
|
|
||||||
- `h3Index` — H3 Index. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
- `h3Index` — H3 Index. [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||||
|
|
||||||
**Returned values**
|
**Returned values**
|
||||||
|
|
||||||
- `lon` — Longitude. Type: [Float64](../../../sql-reference/data-types/float.md).
|
- A tuple consisting of two values: `tuple(lon,lat)`. `lon` — Longitude. [Float64](../../../sql-reference/data-types/float.md). `lat` — Latitude. [Float64](../../../sql-reference/data-types/float.md).
|
||||||
- `lat` — Latitude. Type: [Float64](../../../sql-reference/data-types/float.md).
|
|
||||||
|
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
|
|
||||||
Query:
|
Query:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
SELECT h3ToGeo(644325524701193974) coordinates;
|
SELECT h3ToGeo(644325524701193974) AS coordinates;
|
||||||
```
|
```
|
||||||
|
|
||||||
Result:
|
Result:
|
||||||
@ -230,6 +228,7 @@ Result:
|
|||||||
│ (37.79506616830252,55.71290243145668) │
|
│ (37.79506616830252,55.71290243145668) │
|
||||||
└───────────────────────────────────────┘
|
└───────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
## h3kRing {#h3kring}
|
## h3kRing {#h3kring}
|
||||||
|
|
||||||
Lists all the [H3](#h3index) hexagons in the raduis of `k` from the given hexagon in random order.
|
Lists all the [H3](#h3index) hexagons in the raduis of `k` from the given hexagon in random order.
|
||||||
|
@ -143,7 +143,9 @@ It works faster than intHash32. Average quality.
|
|||||||
|
|
||||||
## SHA256 {#sha256}
|
## SHA256 {#sha256}
|
||||||
|
|
||||||
Calculates SHA-1, SHA-224, or SHA-256 from a string and returns the resulting set of bytes as FixedString(20), FixedString(28), or FixedString(32).
|
## SHA512 {#sha512}
|
||||||
|
|
||||||
|
Calculates SHA-1, SHA-224, SHA-256 or SHA-512 from a string and returns the resulting set of bytes as FixedString(20), FixedString(28), FixedString(32), or FixedString(64).
|
||||||
The function works fairly slowly (SHA-1 processes about 5 million short strings per second per processor core, while SHA-224 and SHA-256 process about 2.2 million).
|
The function works fairly slowly (SHA-1 processes about 5 million short strings per second per processor core, while SHA-224 and SHA-256 process about 2.2 million).
|
||||||
We recommend using this function only in cases when you need a specific hash function and you can’t select it.
|
We recommend using this function only in cases when you need a specific hash function and you can’t select it.
|
||||||
Even in these cases, we recommend applying the function offline and pre-calculating values when inserting them into the table, instead of applying it in SELECTS.
|
Even in these cases, we recommend applying the function offline and pre-calculating values when inserting them into the table, instead of applying it in SELECTS.
|
||||||
|
@ -1339,3 +1339,149 @@ Result:
|
|||||||
│ 2,"good" │
|
│ 2,"good" │
|
||||||
└───────────────────────────────────────────┘
|
└───────────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## snowflakeToDateTime {#snowflakeToDateTime}
|
||||||
|
|
||||||
|
Extract time from snowflake id as DateTime format.
|
||||||
|
|
||||||
|
**Syntax**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
snowflakeToDateTime(value [, time_zone])
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `value` — `snowflake id`, Int64 value.
|
||||||
|
- `time_zone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](../../sql-reference/data-types/string.md).
|
||||||
|
|
||||||
|
**Returned value**
|
||||||
|
|
||||||
|
- value converted to the `DateTime` data type.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC');
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
|
||||||
|
┌─snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC')─┐
|
||||||
|
│ 2021-08-15 10:57:56 │
|
||||||
|
└──────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## snowflakeToDateTime64 {#snowflakeToDateTime64}
|
||||||
|
|
||||||
|
Extract time from snowflake id as DateTime64 format.
|
||||||
|
|
||||||
|
**Syntax**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
snowflakeToDateTime64(value [, time_zone])
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `value` — `snowflake id`, Int64 value.
|
||||||
|
- `time_zone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](../../sql-reference/data-types/string.md).
|
||||||
|
|
||||||
|
**Returned value**
|
||||||
|
|
||||||
|
- value converted to the `DateTime64` data type.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC');
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
|
||||||
|
┌─snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC')─┐
|
||||||
|
│ 2021-08-15 10:58:19.841 │
|
||||||
|
└────────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## dateTimeToSnowflake {#dateTimeToSnowflake}
|
||||||
|
|
||||||
|
Convert DateTime to the first snowflake id at the giving time.
|
||||||
|
|
||||||
|
**Syntax**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
dateTimeToSnowflake(value)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md).
|
||||||
|
|
||||||
|
|
||||||
|
**Returned value**
|
||||||
|
|
||||||
|
- `value` converted to the `Int64` data type as the first snowflake id at that time.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt
|
||||||
|
SELECT dateTimeToSnowflake(dt);
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
|
||||||
|
┌─dateTimeToSnowflake(dt)─┐
|
||||||
|
│ 1426860702823350272 │
|
||||||
|
└─────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## dateTime64ToSnowflake {#dateTime64ToSnowflake}
|
||||||
|
|
||||||
|
Convert DateTime64 to the first snowflake id at the giving time.
|
||||||
|
|
||||||
|
**Syntax**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
dateTime64ToSnowflake(value)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- `value` — Date and time. [DateTime64](../../sql-reference/data-types/datetime64.md).
|
||||||
|
|
||||||
|
|
||||||
|
**Returned value**
|
||||||
|
|
||||||
|
- `value` converted to the `Int64` data type as the first snowflake id at that time.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS dt64
|
||||||
|
SELECT dateTime64ToSnowflake(dt64);
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─dateTime64ToSnowflake(dt64)─┐
|
||||||
|
│ 1426860704886947840 │
|
||||||
|
└─────────────────────────────┘
|
||||||
|
```
|
@ -384,5 +384,32 @@ ExpressionTransform
|
|||||||
(ReadFromStorage)
|
(ReadFromStorage)
|
||||||
NumbersMt × 2 0 → 1
|
NumbersMt × 2 0 → 1
|
||||||
```
|
```
|
||||||
|
### EXPLAIN ESTIMATE {#explain-estimate}
|
||||||
|
|
||||||
|
Shows the estimated number of rows, marks and parts to be read from the tables while processing the query. Works with tables in the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree) family.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Creating a table:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE ttt (i Int64) ENGINE = MergeTree() ORDER BY i SETTINGS index_granularity = 16, write_final_mark = 0;
|
||||||
|
INSERT INTO ttt SELECT number FROM numbers(128);
|
||||||
|
OPTIMIZE TABLE ttt;
|
||||||
|
```
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
EXPLAIN ESTIMATE SELECT * FROM ttt;
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐
|
||||||
|
│ default │ ttt │ 1 │ 128 │ 8 │
|
||||||
|
└──────────┴───────┴───────┴──────┴───────┘
|
||||||
|
```
|
||||||
|
|
||||||
[Оriginal article](https://clickhouse.tech/docs/en/sql-reference/statements/explain/) <!--hide-->
|
[Оriginal article](https://clickhouse.tech/docs/en/sql-reference/statements/explain/) <!--hide-->
|
||||||
|
@ -6,7 +6,7 @@ toc_title: JOIN
|
|||||||
|
|
||||||
Join produces a new table by combining columns from one or multiple tables by using values common to each. It is a common operation in databases with SQL support, which corresponds to [relational algebra](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators) join. The special case of one table join is often referred to as “self-join”.
|
Join produces a new table by combining columns from one or multiple tables by using values common to each. It is a common operation in databases with SQL support, which corresponds to [relational algebra](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators) join. The special case of one table join is often referred to as “self-join”.
|
||||||
|
|
||||||
Syntax:
|
**Syntax**
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
SELECT <expr_list>
|
SELECT <expr_list>
|
||||||
@ -38,7 +38,7 @@ Additional join types available in ClickHouse:
|
|||||||
|
|
||||||
## Settings {#join-settings}
|
## Settings {#join-settings}
|
||||||
|
|
||||||
The default join type can be overriden using [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness) setting.
|
The default join type can be overridden using [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness) setting.
|
||||||
|
|
||||||
The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) setting.
|
The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) setting.
|
||||||
|
|
||||||
@ -52,6 +52,61 @@ The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_
|
|||||||
- [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge)
|
- [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge)
|
||||||
- [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys)
|
- [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys)
|
||||||
|
|
||||||
|
## ON Section Conditions {on-section-conditions}
|
||||||
|
|
||||||
|
An `ON` section can contain several conditions combined using the `AND` operator. Conditions specifying join keys must refer both left and right tables and must use the equality operator. Other conditions may use other logical operators but they must refer either the left or the right table of a query.
|
||||||
|
Rows are joined if the whole complex condition is met. If the conditions are not met, still rows may be included in the result depending on the `JOIN` type. Note that if the same conditions are placed in a `WHERE` section and they are not met, then rows are always filtered out from the result.
|
||||||
|
|
||||||
|
!!! note "Note"
|
||||||
|
The `OR` operator inside an `ON` section is not supported yet.
|
||||||
|
|
||||||
|
!!! note "Note"
|
||||||
|
If a condition refers columns from different tables, then only the equality operator (`=`) is supported so far.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Consider `table_1` and `table_2`:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─Id─┬─name─┐ ┌─Id─┬─text───────────┬─scores─┐
|
||||||
|
│ 1 │ A │ │ 1 │ Text A │ 10 │
|
||||||
|
│ 2 │ B │ │ 1 │ Another text A │ 12 │
|
||||||
|
│ 3 │ C │ │ 2 │ Text B │ 15 │
|
||||||
|
└────┴──────┘ └────┴────────────────┴────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Query with one join key condition and an additional condition for `table_2`:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT name, text FROM table_1 LEFT OUTER JOIN table_2
|
||||||
|
ON table_1.Id = table_2.Id AND startsWith(table_2.text, 'Text');
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the result contains the row with the name `C` and the empty text column. It is included into the result because an `OUTER` type of a join is used.
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─name─┬─text───┐
|
||||||
|
│ A │ Text A │
|
||||||
|
│ B │ Text B │
|
||||||
|
│ C │ │
|
||||||
|
└──────┴────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Query with `INNER` type of a join and multiple conditions:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT name, text, scores FROM table_1 INNER JOIN table_2
|
||||||
|
ON table_1.Id = table_2.Id AND table_2.scores > 10 AND startsWith(table_2.text, 'Text');
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─name─┬─text───┬─scores─┐
|
||||||
|
│ B │ Text B │ 15 │
|
||||||
|
└──────┴────────┴────────┘
|
||||||
|
```
|
||||||
|
|
||||||
## ASOF JOIN Usage {#asof-join-usage}
|
## ASOF JOIN Usage {#asof-join-usage}
|
||||||
|
|
||||||
`ASOF JOIN` is useful when you need to join records that have no exact match.
|
`ASOF JOIN` is useful when you need to join records that have no exact match.
|
||||||
@ -59,7 +114,7 @@ The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_
|
|||||||
Algorithm requires the special column in tables. This column:
|
Algorithm requires the special column in tables. This column:
|
||||||
|
|
||||||
- Must contain an ordered sequence.
|
- Must contain an ordered sequence.
|
||||||
- Can be one of the following types: [Int*, UInt*](../../../sql-reference/data-types/int-uint.md), [Float\*](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal\*](../../../sql-reference/data-types/decimal.md).
|
- Can be one of the following types: [Int, UInt](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal](../../../sql-reference/data-types/decimal.md).
|
||||||
- Can’t be the only column in the `JOIN` clause.
|
- Can’t be the only column in the `JOIN` clause.
|
||||||
|
|
||||||
Syntax `ASOF JOIN ... ON`:
|
Syntax `ASOF JOIN ... ON`:
|
||||||
@ -84,7 +139,7 @@ ASOF JOIN table_2
|
|||||||
USING (equi_column1, ... equi_columnN, asof_column)
|
USING (equi_column1, ... equi_columnN, asof_column)
|
||||||
```
|
```
|
||||||
|
|
||||||
`ASOF JOIN` uses `equi_columnX` for joining on equality and `asof_column` for joining on the closest match with the `table_1.asof_column >= table_2.asof_column` condition. The `asof_column` column always the last one in the `USING` clause.
|
`ASOF JOIN` uses `equi_columnX` for joining on equality and `asof_column` for joining on the closest match with the `table_1.asof_column >= table_2.asof_column` condition. The `asof_column` column is always the last one in the `USING` clause.
|
||||||
|
|
||||||
For example, consider the following tables:
|
For example, consider the following tables:
|
||||||
|
|
||||||
|
@ -311,12 +311,12 @@ One may execute query after:
|
|||||||
- Individual replica path `/replicas/replica_name/` loss.
|
- Individual replica path `/replicas/replica_name/` loss.
|
||||||
|
|
||||||
Replica attaches locally found parts and sends info about them to Zookeeper.
|
Replica attaches locally found parts and sends info about them to Zookeeper.
|
||||||
Parts present on replica before metadata loss are not re-fetched from other replicas if not being outdated
|
Parts present on a replica before metadata loss are not re-fetched from other ones if not being outdated (so replica restoration does not mean re-downloading all data over the network).
|
||||||
(so replica restoration does not mean re-downloading all data over the network).
|
|
||||||
|
|
||||||
Caveat: parts in all states are moved to `detached/` folder. Parts active before data loss (Committed) are attached.
|
!!! warning "Warning"
|
||||||
|
Parts in all states are moved to `detached/` folder. Parts active before data loss (committed) are attached.
|
||||||
|
|
||||||
#### Syntax
|
**Syntax**
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SYSTEM RESTORE REPLICA [db.]replicated_merge_tree_family_table_name [ON CLUSTER cluster_name]
|
SYSTEM RESTORE REPLICA [db.]replicated_merge_tree_family_table_name [ON CLUSTER cluster_name]
|
||||||
@ -328,11 +328,11 @@ Alternative syntax:
|
|||||||
SYSTEM RESTORE REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name
|
SYSTEM RESTORE REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example
|
**Example**
|
||||||
|
|
||||||
|
Creating a table on multiple servers. After the replica's metadata in ZooKeeper is lost, the table will attach as read-only as metadata is missing. The last query needs to execute on every replica.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
-- Creating table on multiple servers
|
|
||||||
|
|
||||||
CREATE TABLE test(n UInt32)
|
CREATE TABLE test(n UInt32)
|
||||||
ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/', '{replica}')
|
ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/', '{replica}')
|
||||||
ORDER BY n PARTITION BY n % 10;
|
ORDER BY n PARTITION BY n % 10;
|
||||||
@ -341,8 +341,14 @@ INSERT INTO test SELECT * FROM numbers(1000);
|
|||||||
|
|
||||||
-- zookeeper_delete_path("/clickhouse/tables/test", recursive=True) <- root loss.
|
-- zookeeper_delete_path("/clickhouse/tables/test", recursive=True) <- root loss.
|
||||||
|
|
||||||
SYSTEM RESTART REPLICA test; -- Table will attach as readonly as metadata is missing.
|
SYSTEM RESTART REPLICA test;
|
||||||
SYSTEM RESTORE REPLICA test; -- Need to execute on every replica, another way: RESTORE REPLICA test ON CLUSTER cluster
|
SYSTEM RESTORE REPLICA test;
|
||||||
|
```
|
||||||
|
|
||||||
|
Another way:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SYSTEM RESTORE REPLICA test ON CLUSTER cluster;
|
||||||
```
|
```
|
||||||
|
|
||||||
### RESTART REPLICAS {#query_language-system-restart-replicas}
|
### RESTART REPLICAS {#query_language-system-restart-replicas}
|
||||||
|
@ -6,12 +6,13 @@ toc_title: cluster
|
|||||||
# cluster, clusterAllReplicas {#cluster-clusterallreplicas}
|
# cluster, clusterAllReplicas {#cluster-clusterallreplicas}
|
||||||
|
|
||||||
Allows to access all shards in an existing cluster which configured in `remote_servers` section without creating a [Distributed](../../engines/table-engines/special/distributed.md) table. One replica of each shard is queried.
|
Allows to access all shards in an existing cluster which configured in `remote_servers` section without creating a [Distributed](../../engines/table-engines/special/distributed.md) table. One replica of each shard is queried.
|
||||||
`clusterAllReplicas` - same as `cluster` but all replicas are queried. Each replica in a cluster is used as separate shard/connection.
|
|
||||||
|
`clusterAllReplicas` function — same as `cluster`, but all replicas are queried. Each replica in a cluster is used as a separate shard/connection.
|
||||||
|
|
||||||
!!! note "Note"
|
!!! note "Note"
|
||||||
All available clusters are listed in the `system.clusters` table.
|
All available clusters are listed in the [system.clusters](../../operations/system-tables/clusters.md) table.
|
||||||
|
|
||||||
Signatures:
|
**Syntax**
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
cluster('cluster_name', db.table[, sharding_key])
|
cluster('cluster_name', db.table[, sharding_key])
|
||||||
@ -19,10 +20,27 @@ cluster('cluster_name', db, table[, sharding_key])
|
|||||||
clusterAllReplicas('cluster_name', db.table[, sharding_key])
|
clusterAllReplicas('cluster_name', db.table[, sharding_key])
|
||||||
clusterAllReplicas('cluster_name', db, table[, sharding_key])
|
clusterAllReplicas('cluster_name', db, table[, sharding_key])
|
||||||
```
|
```
|
||||||
|
**Arguments**
|
||||||
|
|
||||||
`cluster_name` – Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers.
|
- `cluster_name` – Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers.
|
||||||
|
- `db.table` or `db`, `table` - Name of a database and a table.
|
||||||
|
- `sharding_key` - A sharding key. Optional. Needs to be specified if the cluster has more than one shard.
|
||||||
|
|
||||||
`sharding_key` - When insert into cluster function with more than one shard, sharding_key need to be provided.
|
**Returned value**
|
||||||
|
|
||||||
|
The dataset from clusters.
|
||||||
|
|
||||||
|
**Using Macros**
|
||||||
|
|
||||||
|
`cluster_name` can contain macros — substitution in curly brackets. The substituted value is taken from the [macros](../../operations/server-configuration-parameters/settings.md#macros) section of the server configuration file.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT * FROM cluster('{cluster}', default.example_table);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage and Recommendations**
|
||||||
|
|
||||||
Using the `cluster` and `clusterAllReplicas` table functions are less efficient than creating a `Distributed` table because in this case, the server connection is re-established for every request. When processing a large number of queries, please always create the `Distributed` table ahead of time, and do not use the `cluster` and `clusterAllReplicas` table functions.
|
Using the `cluster` and `clusterAllReplicas` table functions are less efficient than creating a `Distributed` table because in this case, the server connection is re-established for every request. When processing a large number of queries, please always create the `Distributed` table ahead of time, and do not use the `cluster` and `clusterAllReplicas` table functions.
|
||||||
|
|
||||||
|
@ -34,5 +34,6 @@ You can use table functions in:
|
|||||||
| [odbc](../../sql-reference/table-functions/odbc.md) | Creates a [ODBC](../../engines/table-engines/integrations/odbc.md)-engine table. |
|
| [odbc](../../sql-reference/table-functions/odbc.md) | Creates a [ODBC](../../engines/table-engines/integrations/odbc.md)-engine table. |
|
||||||
| [hdfs](../../sql-reference/table-functions/hdfs.md) | Creates a [HDFS](../../engines/table-engines/integrations/hdfs.md)-engine table. |
|
| [hdfs](../../sql-reference/table-functions/hdfs.md) | Creates a [HDFS](../../engines/table-engines/integrations/hdfs.md)-engine table. |
|
||||||
| [s3](../../sql-reference/table-functions/s3.md) | Creates a [S3](../../engines/table-engines/integrations/s3.md)-engine table. |
|
| [s3](../../sql-reference/table-functions/s3.md) | Creates a [S3](../../engines/table-engines/integrations/s3.md)-engine table. |
|
||||||
|
| [sqlite](../../sql-reference/table-functions/sqlite.md) | Creates a [sqlite](../../engines/table-engines/integrations/sqlite.md)-engine table. |
|
||||||
|
|
||||||
[Original article](https://clickhouse.tech/docs/en/sql-reference/table-functions/) <!--hide-->
|
[Original article](https://clickhouse.tech/docs/en/sql-reference/table-functions/) <!--hide-->
|
||||||
|
45
docs/en/sql-reference/table-functions/sqlite.md
Normal file
45
docs/en/sql-reference/table-functions/sqlite.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 55
|
||||||
|
toc_title: sqlite
|
||||||
|
---
|
||||||
|
|
||||||
|
## sqlite {#sqlite}
|
||||||
|
|
||||||
|
Allows to perform queries on a data stored in an [SQLite](../../engines/database-engines/sqlite.md) database.
|
||||||
|
|
||||||
|
**Syntax**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
sqlite('db_path', 'table_name')
|
||||||
|
```
|
||||||
|
|
||||||
|
**Arguments**
|
||||||
|
|
||||||
|
- `db_path` — Path to a file with an SQLite database. [String](../../sql-reference/data-types/string.md).
|
||||||
|
- `table_name` — Name of a table in the SQLite database. [String](../../sql-reference/data-types/string.md).
|
||||||
|
|
||||||
|
**Returned value**
|
||||||
|
|
||||||
|
- A table object with the same columns as in the original `SQLite` table.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2;
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─col1──┬─col2─┐
|
||||||
|
│ line1 │ 1 │
|
||||||
|
│ line2 │ 2 │
|
||||||
|
│ line3 │ 3 │
|
||||||
|
└───────┴──────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- [SQLite](../../engines/table-engines/integrations/sqlite.md) table engine
|
@ -36,7 +36,7 @@ ClickHouse - полноценная колоночная СУБД. Данные
|
|||||||
|
|
||||||
`IDataType` и `IColumn` слабо связаны друг с другом. Различные типы данных могут быть представлены в памяти с помощью одной реализации `IColumn`. Например, и `DataTypeUInt32`, и `DataTypeDateTime` в памяти представлены как `ColumnUInt32` или `ColumnConstUInt32`. В добавок к этому, один тип данных может быть представлен различными реализациями `IColumn`. Например, `DataTypeUInt8` может быть представлен как `ColumnUInt8` и `ColumnConstUInt8`.
|
`IDataType` и `IColumn` слабо связаны друг с другом. Различные типы данных могут быть представлены в памяти с помощью одной реализации `IColumn`. Например, и `DataTypeUInt32`, и `DataTypeDateTime` в памяти представлены как `ColumnUInt32` или `ColumnConstUInt32`. В добавок к этому, один тип данных может быть представлен различными реализациями `IColumn`. Например, `DataTypeUInt8` может быть представлен как `ColumnUInt8` и `ColumnConstUInt8`.
|
||||||
|
|
||||||
`IDataType` хранит только метаданные. Например, `DataTypeUInt8` не хранить ничего (кроме скрытого указателя `vptr`), а `DataTypeFixedString` хранит только `N` (фиксированный размер строки).
|
`IDataType` хранит только метаданные. Например, `DataTypeUInt8` не хранит ничего (кроме скрытого указателя `vptr`), а `DataTypeFixedString` хранит только `N` (фиксированный размер строки).
|
||||||
|
|
||||||
В `IDataType` есть вспомогательные методы для данных различного формата. Среди них методы сериализации значений, допускающих использование кавычек, сериализации значения в JSON или XML. Среди них нет прямого соответствия форматам данных. Например, различные форматы `Pretty` и `TabSeparated` могут использовать один вспомогательный метод `serializeTextEscaped` интерфейса `IDataType`.
|
В `IDataType` есть вспомогательные методы для данных различного формата. Среди них методы сериализации значений, допускающих использование кавычек, сериализации значения в JSON или XML. Среди них нет прямого соответствия форматам данных. Например, различные форматы `Pretty` и `TabSeparated` могут использовать один вспомогательный метод `serializeTextEscaped` интерфейса `IDataType`.
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ ClickHouse - полноценная колоночная СУБД. Данные
|
|||||||
|
|
||||||
> Потоки блоков используют «втягивающий» (pull) подход к управлению потоком выполнения: когда вы вытягиваете блок из первого потока, он, следовательно, вытягивает необходимые блоки из вложенных потоков, так и работает весь конвейер выполнения. Ни «pull» ни «push» не имеют явного преимущества, потому что поток управления неявный, и это ограничивает в реализации различных функций, таких как одновременное выполнение нескольких запросов (слияние нескольких конвейеров вместе). Это ограничение можно преодолеть с помощью сопрограмм (coroutines) или просто запуском дополнительных потоков, которые ждут друг друга. У нас может быть больше возможностей, если мы сделаем поток управления явным: если мы локализуем логику для передачи данных из одной расчетной единицы в другую вне этих расчетных единиц. Читайте эту [статью](http://journal.stuffwithstuff.com/2013/01/13/iteration-inside-and-out/) для углубленного изучения.
|
> Потоки блоков используют «втягивающий» (pull) подход к управлению потоком выполнения: когда вы вытягиваете блок из первого потока, он, следовательно, вытягивает необходимые блоки из вложенных потоков, так и работает весь конвейер выполнения. Ни «pull» ни «push» не имеют явного преимущества, потому что поток управления неявный, и это ограничивает в реализации различных функций, таких как одновременное выполнение нескольких запросов (слияние нескольких конвейеров вместе). Это ограничение можно преодолеть с помощью сопрограмм (coroutines) или просто запуском дополнительных потоков, которые ждут друг друга. У нас может быть больше возможностей, если мы сделаем поток управления явным: если мы локализуем логику для передачи данных из одной расчетной единицы в другую вне этих расчетных единиц. Читайте эту [статью](http://journal.stuffwithstuff.com/2013/01/13/iteration-inside-and-out/) для углубленного изучения.
|
||||||
|
|
||||||
Следует отметить, что конвейер выполнения запроса создает временные данные на каждом шаге. Мы стараемся сохранить размер блока достаточно маленьким, чтобы временные данные помещались в кэш процессора. При таком допущении запись и чтение временных данных практически бесплатны по сравнению с другими расчетами. Мы могли бы рассмотреть альтернативу, которая заключается в том, чтобы объединить многие операции в конвеере вместе. Это может сделать конвейер как можно короче и удалить большую часть временных данных, что может быть преимуществом, но у такого подхода также есть недостатки. Например, разделенный конвейер позволяет легко реализовать кэширование промежуточных данных, использование промежуточных данных из аналогичных запросов, выполняемых одновременно, и объединение конвейеров для аналогичных запросов.
|
Следует отметить, что конвейер выполнения запроса создает временные данные на каждом шаге. Мы стараемся сохранить размер блока достаточно маленьким, чтобы временные данные помещались в кэш процессора. При таком допущении запись и чтение временных данных практически бесплатны по сравнению с другими расчетами. Мы могли бы рассмотреть альтернативу, которая заключается в том, чтобы объединить многие операции в конвейере вместе. Это может сделать конвейер как можно короче и удалить большую часть временных данных, что может быть преимуществом, но у такого подхода также есть недостатки. Например, разделенный конвейер позволяет легко реализовать кэширование промежуточных данных, использование промежуточных данных из аналогичных запросов, выполняемых одновременно, и объединение конвейеров для аналогичных запросов.
|
||||||
|
|
||||||
## Форматы {#formats}
|
## Форматы {#formats}
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ ClickHouse - полноценная колоночная СУБД. Данные
|
|||||||
|
|
||||||
Существуют обычные функции и агрегатные функции. Агрегатные функции смотрите в следующем разделе.
|
Существуют обычные функции и агрегатные функции. Агрегатные функции смотрите в следующем разделе.
|
||||||
|
|
||||||
Обычный функции не изменяют число строк и работают так, как если бы обрабатывали каждую строку независимо. В действительности же, функции вызываются не к отдельным строкам, а блокам данных для реализации векторизованного выполнения запросов.
|
Обычные функции не изменяют число строк и работают так, как если бы обрабатывали каждую строку независимо. В действительности же, функции вызываются не к отдельным строкам, а блокам данных для реализации векторизованного выполнения запросов.
|
||||||
|
|
||||||
Некоторые функции, такие как [blockSize](../sql-reference/functions/other-functions.md#function-blocksize), [rowNumberInBlock](../sql-reference/functions/other-functions.md#function-rownumberinblock), и [runningAccumulate](../sql-reference/functions/other-functions.md#runningaccumulate), эксплуатируют блочную обработку и нарушают независимость строк.
|
Некоторые функции, такие как [blockSize](../sql-reference/functions/other-functions.md#function-blocksize), [rowNumberInBlock](../sql-reference/functions/other-functions.md#function-rownumberinblock), и [runningAccumulate](../sql-reference/functions/other-functions.md#runningaccumulate), эксплуатируют блочную обработку и нарушают независимость строк.
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ ClickHouse имеет сильную типизацию, поэтому нет
|
|||||||
|
|
||||||
Сервера в кластере в основном независимы. Вы можете создать `Распределенную` (`Distributed`) таблицу на одном или всех серверах в кластере. Такая таблица сама по себе не хранит данные - она только предоставляет возможность "просмотра" всех локальных таблиц на нескольких узлах кластера. При выполнении `SELECT` распределенная таблица переписывает запрос, выбирает удаленные узлы в соответствии с настройками балансировки нагрузки и отправляет им запрос. Распределенная таблица просит удаленные сервера обработать запрос до той стадии, когда промежуточные результаты с разных серверов могут быть объединены. Затем он получает промежуточные результаты и объединяет их. Распределенная таблица пытается возложить как можно больше работы на удаленные серверы и сократить объем промежуточных данных, передаваемых по сети.
|
Сервера в кластере в основном независимы. Вы можете создать `Распределенную` (`Distributed`) таблицу на одном или всех серверах в кластере. Такая таблица сама по себе не хранит данные - она только предоставляет возможность "просмотра" всех локальных таблиц на нескольких узлах кластера. При выполнении `SELECT` распределенная таблица переписывает запрос, выбирает удаленные узлы в соответствии с настройками балансировки нагрузки и отправляет им запрос. Распределенная таблица просит удаленные сервера обработать запрос до той стадии, когда промежуточные результаты с разных серверов могут быть объединены. Затем он получает промежуточные результаты и объединяет их. Распределенная таблица пытается возложить как можно больше работы на удаленные серверы и сократить объем промежуточных данных, передаваемых по сети.
|
||||||
|
|
||||||
Ситуация усложняется, при использовании подзапросов в случае `IN` или `JOIN`, когда каждый из них использует таблицу `Distributed`. Есть разные стратегии для выполнения таких запросов.
|
Ситуация усложняется при использовании подзапросов в случае `IN` или `JOIN`, когда каждый из них использует таблицу `Distributed`. Есть разные стратегии для выполнения таких запросов.
|
||||||
|
|
||||||
Глобального плана выполнения распределенных запросов не существует. Каждый узел имеет собственный локальный план для своей части работы. У нас есть простое однонаправленное выполнение распределенных запросов: мы отправляем запросы на удаленные узлы и затем объединяем результаты. Но это невозможно для сложных запросов `GROUP BY` высокой кардинальности или запросов с большим числом временных данных в `JOIN`: в таких случаях нам необходимо перераспределить («reshuffle») данные между серверами, что требует дополнительной координации. ClickHouse не поддерживает выполнение запросов такого рода, и нам нужно работать над этим.
|
Глобального плана выполнения распределенных запросов не существует. Каждый узел имеет собственный локальный план для своей части работы. У нас есть простое однонаправленное выполнение распределенных запросов: мы отправляем запросы на удаленные узлы и затем объединяем результаты. Но это невозможно для сложных запросов `GROUP BY` высокой кардинальности или запросов с большим числом временных данных в `JOIN`: в таких случаях нам необходимо перераспределить («reshuffle») данные между серверами, что требует дополнительной координации. ClickHouse не поддерживает выполнение запросов такого рода, и нам нужно работать над этим.
|
||||||
|
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 36
|
||||||
|
toc_title: Replicated
|
||||||
|
---
|
||||||
|
|
||||||
# [экспериментальный] Replicated {#replicated}
|
# [экспериментальный] Replicated {#replicated}
|
||||||
|
|
||||||
|
79
docs/ru/engines/database-engines/sqlite.md
Normal file
79
docs/ru/engines/database-engines/sqlite.md
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 32
|
||||||
|
toc_title: SQLite
|
||||||
|
---
|
||||||
|
|
||||||
|
# SQLite {#sqlite}
|
||||||
|
|
||||||
|
Движок баз данных позволяет подключаться к базе [SQLite](https://www.sqlite.org/index.html) и выполнять запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и SQLite.
|
||||||
|
|
||||||
|
## Создание базы данных {#creating-a-database}
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE DATABASE sqlite_database
|
||||||
|
ENGINE = SQLite('db_path')
|
||||||
|
```
|
||||||
|
|
||||||
|
**Параметры движка**
|
||||||
|
|
||||||
|
- `db_path` — путь к файлу с базой данных SQLite.
|
||||||
|
|
||||||
|
## Поддерживаемые типы данных {#data_types-support}
|
||||||
|
|
||||||
|
| SQLite | ClickHouse |
|
||||||
|
|---------------|---------------------------------------------------------|
|
||||||
|
| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) |
|
||||||
|
| REAL | [Float32](../../sql-reference/data-types/float.md) |
|
||||||
|
| TEXT | [String](../../sql-reference/data-types/string.md) |
|
||||||
|
| BLOB | [String](../../sql-reference/data-types/string.md) |
|
||||||
|
|
||||||
|
## Особенности и рекомендации {#specifics-and-recommendations}
|
||||||
|
|
||||||
|
SQLite хранит всю базу данных (определения, таблицы, индексы и сами данные) в виде единого кроссплатформенного файла на хост-машине. Во время записи SQLite блокирует весь файл базы данных, поэтому операции записи выполняются последовательно. Операции чтения могут быть многозадачными.
|
||||||
|
SQLite не требует управления службами (например, сценариями запуска) или контроля доступа на основе `GRANT` и паролей. Контроль доступа осуществляется с помощью разрешений файловой системы, предоставляемых самому файлу базы данных.
|
||||||
|
|
||||||
|
## Примеры использования {#usage-example}
|
||||||
|
|
||||||
|
Отобразим список таблиц базы данных в ClickHouse, подключенной к SQLite:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE DATABASE sqlite_db ENGINE = SQLite('sqlite.db');
|
||||||
|
SHOW TABLES FROM sqlite_db;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌──name───┐
|
||||||
|
│ table1 │
|
||||||
|
│ table2 │
|
||||||
|
└─────────┘
|
||||||
|
```
|
||||||
|
Отобразим содержимое таблицы:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM sqlite_db.table1;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─col1──┬─col2─┐
|
||||||
|
│ line1 │ 1 │
|
||||||
|
│ line2 │ 2 │
|
||||||
|
│ line3 │ 3 │
|
||||||
|
└───────┴──────┘
|
||||||
|
```
|
||||||
|
Вставим данные в таблицу SQLite из таблицы ClickHouse:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE clickhouse_table(`col1` String,`col2` Int16) ENGINE = MergeTree() ORDER BY col2;
|
||||||
|
INSERT INTO clickhouse_table VALUES ('text',10);
|
||||||
|
INSERT INTO sqlite_db.table1 SELECT * FROM clickhouse_table;
|
||||||
|
SELECT * FROM sqlite_db.table1;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─col1──┬─col2─┐
|
||||||
|
│ line1 │ 1 │
|
||||||
|
│ line2 │ 2 │
|
||||||
|
│ line3 │ 3 │
|
||||||
|
│ text │ 10 │
|
||||||
|
└───────┴──────┘
|
||||||
|
```
|
59
docs/ru/engines/table-engines/integrations/sqlite.md
Normal file
59
docs/ru/engines/table-engines/integrations/sqlite.md
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 7
|
||||||
|
toc_title: SQLite
|
||||||
|
---
|
||||||
|
|
||||||
|
# SQLite {#sqlite}
|
||||||
|
|
||||||
|
Движок позволяет импортировать и экспортировать данные из SQLite, а также поддерживает отправку запросов к таблицам SQLite напрямую из ClickHouse.
|
||||||
|
|
||||||
|
## Создание таблицы {#creating-a-table}
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE [IF NOT EXISTS] [db.]table_name
|
||||||
|
(
|
||||||
|
name1 [type1],
|
||||||
|
name2 [type2], ...
|
||||||
|
) ENGINE = SQLite('db_path', 'table')
|
||||||
|
```
|
||||||
|
|
||||||
|
**Параметры движка**
|
||||||
|
|
||||||
|
- `db_path` — путь к файлу с базой данных SQLite.
|
||||||
|
- `table` — имя таблицы в базе данных SQLite.
|
||||||
|
|
||||||
|
## Примеры использования {#usage-example}
|
||||||
|
|
||||||
|
Отобразим запрос, с помощью которого была создана таблица SQLite:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SHOW CREATE TABLE sqlite_db.table2;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
CREATE TABLE SQLite.table2
|
||||||
|
(
|
||||||
|
`col1` Nullable(Int32),
|
||||||
|
`col2` Nullable(String)
|
||||||
|
)
|
||||||
|
ENGINE = SQLite('sqlite.db','table2');
|
||||||
|
```
|
||||||
|
|
||||||
|
Получим данные из таблицы:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM sqlite_db.table2 ORDER BY col1;
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─col1─┬─col2──┐
|
||||||
|
│ 1 │ text1 │
|
||||||
|
│ 2 │ text2 │
|
||||||
|
│ 3 │ text3 │
|
||||||
|
└──────┴───────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**См. также**
|
||||||
|
|
||||||
|
- [SQLite](../../../engines/database-engines/sqlite.md) движок баз данных
|
||||||
|
- [sqlite](../../../sql-reference/table-functions/sqlite.md) табличная функция
|
@ -38,9 +38,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
|||||||
|
|
||||||
- Значение метрики. Тип данных: любой числовой.
|
- Значение метрики. Тип данных: любой числовой.
|
||||||
|
|
||||||
- Версия метрики. Тип данных: любой числовой.
|
- Версия метрики. Тип данных: любой числовой (ClickHouse сохраняет строки с последней версией или последнюю записанную строку, если версии совпадают. Другие строки удаляются при слиянии кусков данных).
|
||||||
|
|
||||||
ClickHouse сохраняет строки с последней версией или последнюю записанную строку, если версии совпадают. Другие строки удаляются при слиянии кусков данных.
|
|
||||||
|
|
||||||
Имена этих столбцов должны быть заданы в конфигурации rollup.
|
Имена этих столбцов должны быть заданы в конфигурации rollup.
|
||||||
|
|
||||||
@ -173,4 +171,4 @@ default
|
|||||||
|
|
||||||
|
|
||||||
!!! warning "Внимание"
|
!!! warning "Внимание"
|
||||||
Прореживание данных производится во время слияний. Обычно для старых партций слияния не запускаются, поэтому для прореживания надо иницировать незапланированное слияние используя [optimize](../../../sql-reference/statements/optimize/). Или использовать дополнительные инструменты, например [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer).
|
Прореживание данных производится во время слияний. Обычно для старых партций слияния не запускаются, поэтому для прореживания надо иницировать незапланированное слияние используя [optimize](../../../sql-reference/statements/optimize.md). Или использовать дополнительные инструменты, например [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer).
|
||||||
|
@ -86,7 +86,9 @@ ORDER BY expr
|
|||||||
- `enable_mixed_granularity_parts` — включает или выключает переход к ограничению размера гранул с помощью настройки `index_granularity_bytes`. Настройка `index_granularity_bytes` улучшает производительность ClickHouse при выборке данных из таблиц с большими (десятки и сотни мегабайтов) строками. Если у вас есть таблицы с большими строками, можно включить эту настройку, чтобы повысить эффективность запросов `SELECT`.
|
- `enable_mixed_granularity_parts` — включает или выключает переход к ограничению размера гранул с помощью настройки `index_granularity_bytes`. Настройка `index_granularity_bytes` улучшает производительность ClickHouse при выборке данных из таблиц с большими (десятки и сотни мегабайтов) строками. Если у вас есть таблицы с большими строками, можно включить эту настройку, чтобы повысить эффективность запросов `SELECT`.
|
||||||
- `use_minimalistic_part_header_in_zookeeper` — Способ хранения заголовков кусков данных в ZooKeeper. Если `use_minimalistic_part_header_in_zookeeper = 1`, то ZooKeeper хранит меньше данных. Подробнее читайте в [описании настройки](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) в разделе "Конфигурационные параметры сервера".
|
- `use_minimalistic_part_header_in_zookeeper` — Способ хранения заголовков кусков данных в ZooKeeper. Если `use_minimalistic_part_header_in_zookeeper = 1`, то ZooKeeper хранит меньше данных. Подробнее читайте в [описании настройки](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) в разделе "Конфигурационные параметры сервера".
|
||||||
- `min_merge_bytes_to_use_direct_io` — минимальный объём данных при слиянии, необходимый для прямого (небуферизованного) чтения/записи (direct I/O) на диск. При слиянии частей данных ClickHouse вычисляет общий объём хранения всех данных, подлежащих слиянию. Если общий объём хранения всех данных для чтения превышает `min_bytes_to_use_direct_io` байт, тогда ClickHouse использует флаг `O_DIRECT` при чтении данных с диска. Если `min_merge_bytes_to_use_direct_io = 0`, тогда прямой ввод-вывод отключен. Значение по умолчанию: `10 * 1024 * 1024 * 1024` байтов.
|
- `min_merge_bytes_to_use_direct_io` — минимальный объём данных при слиянии, необходимый для прямого (небуферизованного) чтения/записи (direct I/O) на диск. При слиянии частей данных ClickHouse вычисляет общий объём хранения всех данных, подлежащих слиянию. Если общий объём хранения всех данных для чтения превышает `min_bytes_to_use_direct_io` байт, тогда ClickHouse использует флаг `O_DIRECT` при чтении данных с диска. Если `min_merge_bytes_to_use_direct_io = 0`, тогда прямой ввод-вывод отключен. Значение по умолчанию: `10 * 1024 * 1024 * 1024` байтов.
|
||||||
- <a name="mergetree_setting-merge_with_ttl_timeout"></a>`merge_with_ttl_timeout` — минимальное время в секундах перед повторным слиянием с TTL. По умолчанию — 86400 (1 день).
|
- `merge_with_ttl_timeout` — минимальное время в секундах перед повторным слиянием для удаления данных с истекшим TTL. По умолчанию: `14400` секунд (4 часа).
|
||||||
|
- `merge_with_recompression_ttl_timeout` — минимальное время в секундах перед повторным слиянием для повторного сжатия данных с истекшим TTL. По умолчанию: `14400` секунд (4 часа).
|
||||||
|
- `try_fetch_recompressed_part_timeout` — время ожидания (в секундах) перед началом слияния с повторным сжатием. В течение этого времени ClickHouse пытается извлечь сжатую часть из реплики, которая назначила это слияние. Значение по умолчанию: `7200` секунд (2 часа).
|
||||||
- `write_final_mark` — включает или отключает запись последней засечки индекса в конце куска данных, указывающей за последний байт. По умолчанию — 1. Не отключайте её.
|
- `write_final_mark` — включает или отключает запись последней засечки индекса в конце куска данных, указывающей за последний байт. По умолчанию — 1. Не отключайте её.
|
||||||
- `merge_max_block_size` — максимальное количество строк в блоке для операций слияния. Значение по умолчанию: 8192.
|
- `merge_max_block_size` — максимальное количество строк в блоке для операций слияния. Значение по умолчанию: 8192.
|
||||||
- `storage_policy` — политика хранения данных. Смотрите [Хранение данных таблицы на нескольких блочных устройствах](#table_engine-mergetree-multiple-volumes).
|
- `storage_policy` — политика хранения данных. Смотрите [Хранение данных таблицы на нескольких блочных устройствах](#table_engine-mergetree-multiple-volumes).
|
||||||
@ -401,20 +403,22 @@ INDEX b (u64 * length(str), i32 + f64 * 100, date, str) TYPE set(100) GRANULARIT
|
|||||||
|
|
||||||
## TTL для столбцов и таблиц {#table_engine-mergetree-ttl}
|
## TTL для столбцов и таблиц {#table_engine-mergetree-ttl}
|
||||||
|
|
||||||
Определяет время жизни значений, а также правила перемещения данных на другой диск или том.
|
Определяет время жизни значений.
|
||||||
|
|
||||||
Секция `TTL` может быть установлена как для всей таблицы, так и для каждого отдельного столбца. Правила `TTL` для таблицы позволяют указать целевые диски или тома для фонового перемещения на них частей данных.
|
Секция `TTL` может быть установлена как для всей таблицы, так и для каждого отдельного столбца. Для таблиц можно установить правила `TTL` для фонового перемещения кусков данных на целевые диски или тома, или правила повторного сжатия кусков данных.
|
||||||
|
|
||||||
Выражения должны возвращать тип [Date](../../../engines/table-engines/mergetree-family/mergetree.md) или [DateTime](../../../engines/table-engines/mergetree-family/mergetree.md).
|
Выражения должны возвращать тип [Date](../../../engines/table-engines/mergetree-family/mergetree.md) или [DateTime](../../../engines/table-engines/mergetree-family/mergetree.md).
|
||||||
|
|
||||||
Для задания времени жизни столбца, например:
|
**Синтаксис**
|
||||||
|
|
||||||
|
Для задания времени жизни столбца:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
TTL time_column
|
TTL time_column
|
||||||
TTL time_column + interval
|
TTL time_column + interval
|
||||||
```
|
```
|
||||||
|
|
||||||
Чтобы задать `interval`, используйте операторы [интервала времени](../../../engines/table-engines/mergetree-family/mergetree.md#operators-datetime).
|
Чтобы задать `interval`, используйте операторы [интервала времени](../../../engines/table-engines/mergetree-family/mergetree.md#operators-datetime), например:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
TTL date_time + INTERVAL 1 MONTH
|
TTL date_time + INTERVAL 1 MONTH
|
||||||
@ -423,13 +427,13 @@ TTL date_time + INTERVAL 15 HOUR
|
|||||||
|
|
||||||
### TTL столбца {#mergetree-column-ttl}
|
### TTL столбца {#mergetree-column-ttl}
|
||||||
|
|
||||||
Когда срок действия значений в столбце истечет, ClickHouse заменит их значениями по умолчанию для типа данных столбца. Если срок действия всех значений столбцов в части данных истек, ClickHouse удаляет столбец из куска данных в файловой системе.
|
Когда срок действия значений в столбце истечёт, ClickHouse заменит их значениями по умолчанию для типа данных столбца. Если срок действия всех значений столбцов в части данных истек, ClickHouse удаляет столбец из куска данных в файловой системе.
|
||||||
|
|
||||||
Секцию `TTL` нельзя использовать для ключевых столбцов.
|
Секцию `TTL` нельзя использовать для ключевых столбцов.
|
||||||
|
|
||||||
Примеры:
|
**Примеры**
|
||||||
|
|
||||||
Создание таблицы с TTL
|
Создание таблицы с `TTL`:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
CREATE TABLE example_table
|
CREATE TABLE example_table
|
||||||
@ -444,7 +448,7 @@ PARTITION BY toYYYYMM(d)
|
|||||||
ORDER BY d;
|
ORDER BY d;
|
||||||
```
|
```
|
||||||
|
|
||||||
Добавление TTL на колонку существующей таблицы
|
Добавление `TTL` на колонку существующей таблицы:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
ALTER TABLE example_table
|
ALTER TABLE example_table
|
||||||
@ -452,7 +456,7 @@ ALTER TABLE example_table
|
|||||||
c String TTL d + INTERVAL 1 DAY;
|
c String TTL d + INTERVAL 1 DAY;
|
||||||
```
|
```
|
||||||
|
|
||||||
Изменение TTL у колонки
|
Изменение `TTL` у колонки:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
ALTER TABLE example_table
|
ALTER TABLE example_table
|
||||||
@ -462,23 +466,24 @@ ALTER TABLE example_table
|
|||||||
|
|
||||||
### TTL таблицы {#mergetree-table-ttl}
|
### TTL таблицы {#mergetree-table-ttl}
|
||||||
|
|
||||||
Для таблицы можно задать одно выражение для устаревания данных, а также несколько выражений, по срабатывании которых данные переместятся на [некоторый диск или том](#table_engine-mergetree-multiple-volumes). Когда некоторые данные в таблице устаревают, ClickHouse удаляет все соответствующие строки.
|
Для таблицы можно задать одно выражение для устаревания данных, а также несколько выражений, при срабатывании которых данные будут перемещены на [некоторый диск или том](#table_engine-mergetree-multiple-volumes). Когда некоторые данные в таблице устаревают, ClickHouse удаляет все соответствующие строки. Операции перемещения или повторного сжатия данных выполняются только когда устаревают все данные в куске.
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
TTL expr
|
TTL expr
|
||||||
[DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'] ...
|
[DELETE|RECOMPRESS codec_name1|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|RECOMPRESS codec_name2|TO DISK 'aaa'|TO VOLUME 'bbb'] ...
|
||||||
[WHERE conditions]
|
[WHERE conditions]
|
||||||
[GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ]
|
[GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ]
|
||||||
```
|
```
|
||||||
|
|
||||||
За каждым TTL выражением может следовать тип действия, которое выполняется после достижения времени, соответствующего результату TTL выражения:
|
За каждым `TTL` выражением может следовать тип действия, которое выполняется после достижения времени, соответствующего результату `TTL` выражения:
|
||||||
|
|
||||||
- `DELETE` - удалить данные (действие по умолчанию);
|
- `DELETE` - удалить данные (действие по умолчанию);
|
||||||
|
- `RECOMPRESS codec_name` - повторно сжать данные с помощью кодека `codec_name`;
|
||||||
- `TO DISK 'aaa'` - переместить данные на диск `aaa`;
|
- `TO DISK 'aaa'` - переместить данные на диск `aaa`;
|
||||||
- `TO VOLUME 'bbb'` - переместить данные на том `bbb`;
|
- `TO VOLUME 'bbb'` - переместить данные на том `bbb`;
|
||||||
- `GROUP BY` - агрегировать данные.
|
- `GROUP BY` - агрегировать данные.
|
||||||
|
|
||||||
В секции `WHERE` можно задать условие удаления или агрегирования устаревших строк (для перемещения условие `WHERE` не применимо).
|
В секции `WHERE` можно задать условие удаления или агрегирования устаревших строк (для перемещения и сжатия условие `WHERE` не применимо).
|
||||||
|
|
||||||
Колонки, по которым агрегируются данные в `GROUP BY`, должны являться префиксом первичного ключа таблицы.
|
Колонки, по которым агрегируются данные в `GROUP BY`, должны являться префиксом первичного ключа таблицы.
|
||||||
|
|
||||||
@ -486,7 +491,7 @@ TTL expr
|
|||||||
|
|
||||||
**Примеры**
|
**Примеры**
|
||||||
|
|
||||||
Создание таблицы с TTL:
|
Создание таблицы с `TTL`:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
CREATE TABLE example_table
|
CREATE TABLE example_table
|
||||||
@ -502,7 +507,7 @@ TTL d + INTERVAL 1 MONTH [DELETE],
|
|||||||
d + INTERVAL 2 WEEK TO DISK 'bbb';
|
d + INTERVAL 2 WEEK TO DISK 'bbb';
|
||||||
```
|
```
|
||||||
|
|
||||||
Изменение TTL:
|
Изменение `TTL`:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
ALTER TABLE example_table
|
ALTER TABLE example_table
|
||||||
@ -523,6 +528,21 @@ ORDER BY d
|
|||||||
TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1;
|
TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Создание таблицы, в которой куски с устаревшими данными повторно сжимаются:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE table_for_recompression
|
||||||
|
(
|
||||||
|
d DateTime,
|
||||||
|
key UInt64,
|
||||||
|
value String
|
||||||
|
) ENGINE MergeTree()
|
||||||
|
ORDER BY tuple()
|
||||||
|
PARTITION BY key
|
||||||
|
TTL d + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(17)), d + INTERVAL 1 YEAR RECOMPRESS CODEC(LZ4HC(10))
|
||||||
|
SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0;
|
||||||
|
```
|
||||||
|
|
||||||
Создание таблицы, где устаревшие строки агрегируются. В результирующих строках колонка `x` содержит максимальное значение по сгруппированным строкам, `y` — минимальное значение, а `d` — случайное значение из одной из сгуппированных строк.
|
Создание таблицы, где устаревшие строки агрегируются. В результирующих строках колонка `x` содержит максимальное значение по сгруппированным строкам, `y` — минимальное значение, а `d` — случайное значение из одной из сгуппированных строк.
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
@ -539,14 +559,18 @@ ORDER BY (k1, k2)
|
|||||||
TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y);
|
TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y);
|
||||||
```
|
```
|
||||||
|
|
||||||
**Удаление данных**
|
### Удаление устаревших данных {#mergetree-removing-expired-data}
|
||||||
|
|
||||||
Данные с истекшим TTL удаляются, когда ClickHouse мёржит куски данных.
|
Данные с истекшим `TTL` удаляются, когда ClickHouse мёржит куски данных.
|
||||||
|
|
||||||
Когда ClickHouse видит, что некоторые данные устарели, он выполняет внеплановые мёржи. Для управление частотой подобных мёржей, можно задать настройку `merge_with_ttl_timeout`. Если её значение слишком низкое, придется выполнять много внеплановых мёржей, которые могут начать потреблять значительную долю ресурсов сервера.
|
Когда ClickHouse видит, что некоторые данные устарели, он выполняет внеплановые мёржи. Для управление частотой подобных мёржей, можно задать настройку `merge_with_ttl_timeout`. Если её значение слишком низкое, придется выполнять много внеплановых мёржей, которые могут начать потреблять значительную долю ресурсов сервера.
|
||||||
|
|
||||||
Если вы выполните запрос `SELECT` между слияниями вы можете получить устаревшие данные. Чтобы избежать этого используйте запрос [OPTIMIZE](../../../engines/table-engines/mergetree-family/mergetree.md#misc_operations-optimize) перед `SELECT`.
|
Если вы выполните запрос `SELECT` между слияниями вы можете получить устаревшие данные. Чтобы избежать этого используйте запрос [OPTIMIZE](../../../engines/table-engines/mergetree-family/mergetree.md#misc_operations-optimize) перед `SELECT`.
|
||||||
|
|
||||||
|
**См. также**
|
||||||
|
|
||||||
|
- настройку [ttl_only_drop_parts](../../../operations/settings/settings.md#ttl_only_drop_parts)
|
||||||
|
|
||||||
## Хранение данных таблицы на нескольких блочных устройствах {#table_engine-mergetree-multiple-volumes}
|
## Хранение данных таблицы на нескольких блочных устройствах {#table_engine-mergetree-multiple-volumes}
|
||||||
|
|
||||||
### Введение {#introduction}
|
### Введение {#introduction}
|
||||||
@ -827,44 +851,3 @@ SETTINGS storage_policy = 'moving_from_ssd_to_hdd'
|
|||||||
```
|
```
|
||||||
|
|
||||||
Если диск сконфигурирован как `cold`, данные будут переноситься в S3 при срабатывании правил TTL или когда свободное место на локальном диске станет меньше порогового значения, которое определяется как `move_factor * disk_size`.
|
Если диск сконфигурирован как `cold`, данные будут переноситься в S3 при срабатывании правил TTL или когда свободное место на локальном диске станет меньше порогового значения, которое определяется как `move_factor * disk_size`.
|
||||||
|
|
||||||
## Использование сервиса HDFS для хранения данных {#table_engine-mergetree-hdfs}
|
|
||||||
|
|
||||||
[HDFS](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html) — это распределенная файловая система для удаленного хранения данных.
|
|
||||||
|
|
||||||
Таблицы семейства `MergeTree` могут хранить данные в сервисе HDFS при использовании диска типа `HDFS`.
|
|
||||||
|
|
||||||
Пример конфигурации:
|
|
||||||
``` xml
|
|
||||||
<yandex>
|
|
||||||
<storage_configuration>
|
|
||||||
<disks>
|
|
||||||
<hdfs>
|
|
||||||
<type>hdfs</type>
|
|
||||||
<endpoint>hdfs://hdfs1:9000/clickhouse/</endpoint>
|
|
||||||
</hdfs>
|
|
||||||
</disks>
|
|
||||||
<policies>
|
|
||||||
<hdfs>
|
|
||||||
<volumes>
|
|
||||||
<main>
|
|
||||||
<disk>hdfs</disk>
|
|
||||||
</main>
|
|
||||||
</volumes>
|
|
||||||
</hdfs>
|
|
||||||
</policies>
|
|
||||||
</storage_configuration>
|
|
||||||
|
|
||||||
<merge_tree>
|
|
||||||
<min_bytes_for_wide_part>0</min_bytes_for_wide_part>
|
|
||||||
</merge_tree>
|
|
||||||
</yandex>
|
|
||||||
```
|
|
||||||
|
|
||||||
Обязательные параметры:
|
|
||||||
|
|
||||||
- `endpoint` — URL точки приема запроса на стороне HDFS в формате `path`. URL точки должен содержать путь к корневой директории на сервере, где хранятся данные.
|
|
||||||
|
|
||||||
Необязательные параметры:
|
|
||||||
|
|
||||||
- `min_bytes_for_seek` — минимальное количество байтов, которые используются для операций поиска вместо последовательного чтения. Значение по умолчанию: 1 МБайт.
|
|
||||||
|
@ -102,7 +102,7 @@ CREATE TABLE table_name
|
|||||||
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver)
|
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver)
|
||||||
PARTITION BY toYYYYMM(EventDate)
|
PARTITION BY toYYYYMM(EventDate)
|
||||||
ORDER BY (CounterID, EventDate, intHash32(UserID))
|
ORDER BY (CounterID, EventDate, intHash32(UserID))
|
||||||
SAMPLE BY intHash32(UserID)
|
SAMPLE BY intHash32(UserID);
|
||||||
```
|
```
|
||||||
|
|
||||||
<details markdown="1">
|
<details markdown="1">
|
||||||
@ -115,12 +115,12 @@ CREATE TABLE table_name
|
|||||||
EventDate DateTime,
|
EventDate DateTime,
|
||||||
CounterID UInt32,
|
CounterID UInt32,
|
||||||
UserID UInt32
|
UserID UInt32
|
||||||
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192)
|
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192);
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Как видно в примере, эти параметры могут содержать подстановки в фигурных скобках. Подставляемые значения достаются из конфигурационного файла, из секции «[macros](../../../operations/server-configuration-parameters/settings/#macros)».
|
Как видно в примере, эти параметры могут содержать подстановки в фигурных скобках. Эти подстановки заменяются на соответствующие значения из конфигурационного файла, из секции [macros](../../../operations/server-configuration-parameters/settings.md#macros).
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
|
@ -48,7 +48,10 @@ CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10
|
|||||||
Если у одного из столбцов таблицы Buffer и подчинённой таблицы не совпадает тип, то в лог сервера будет записано сообщение об ошибке и буфер будет очищен.
|
Если у одного из столбцов таблицы Buffer и подчинённой таблицы не совпадает тип, то в лог сервера будет записано сообщение об ошибке и буфер будет очищен.
|
||||||
То же самое происходит, если подчинённая таблица не существует в момент сброса буфера.
|
То же самое происходит, если подчинённая таблица не существует в момент сброса буфера.
|
||||||
|
|
||||||
Если есть необходимость выполнить ALTER для подчинённой таблицы и для таблицы Buffer, то рекомендуется удалить таблицу Buffer, затем выполнить ALTER подчинённой таблицы, а затем создать таблицу Buffer заново.
|
Если есть необходимость выполнить ALTER для подчинённой таблицы и для таблицы Buffer, то рекомендуется удалить таблицу Buffer, затем выполнить ALTER подчинённой таблицы, а после создать таблицу Buffer заново.
|
||||||
|
|
||||||
|
!!! attention "Внимание"
|
||||||
|
В релизах до 28 сентября 2020 года выполнение ALTER на таблице Buffer ломает структуру блоков и вызывает ошибку (см. [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117)), поэтому удаление буфера и его пересоздание — единственный вариант миграции для данного движка. Перед выполнением ALTER на таблице Buffer убедитесь, что в вашей версии эта ошибка устранена.
|
||||||
|
|
||||||
При нештатном перезапуске сервера, данные, находящиеся в буфере, будут потеряны.
|
При нештатном перезапуске сервера, данные, находящиеся в буфере, будут потеряны.
|
||||||
|
|
||||||
|
@ -465,9 +465,9 @@ ClickHouse проверяет условия для `min_part_size` и `min_part
|
|||||||
|
|
||||||
Подстановки параметров реплицируемых таблиц.
|
Подстановки параметров реплицируемых таблиц.
|
||||||
|
|
||||||
Можно не указывать, если реплицируемых таблицы не используются.
|
Можно не указывать, если реплицируемые таблицы не используются.
|
||||||
|
|
||||||
Подробнее смотрите в разделе «[Создание реплицируемых таблиц](../../engines/table-engines/mergetree-family/replication.md)».
|
Подробнее смотрите в разделе [Создание реплицируемых таблиц](../../engines/table-engines/mergetree-family/replication.md#creating-replicated-tables).
|
||||||
|
|
||||||
**Пример**
|
**Пример**
|
||||||
|
|
||||||
|
@ -1865,10 +1865,25 @@ ClickHouse генерирует исключение
|
|||||||
|
|
||||||
## input_format_parallel_parsing {#input-format-parallel-parsing}
|
## input_format_parallel_parsing {#input-format-parallel-parsing}
|
||||||
|
|
||||||
- Тип: bool
|
Включает или отключает режим, при котором входящие данные разбиваются на части, парсинг каждой из которых осуществляется параллельно с сохранением исходного порядка. Поддерживается только для форматов [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) и [JSONEachRow](../../interfaces/formats.md#jsoneachrow).
|
||||||
- Значение по умолчанию: True
|
|
||||||
|
|
||||||
Включает режим, при котором входящие данные парсятся параллельно, но с сохранением исходного порядка следования. Поддерживается только для форматов TSV, TKSV, CSV и JSONEachRow.
|
Возможные значения:
|
||||||
|
|
||||||
|
- 1 — включен режим параллельного разбора.
|
||||||
|
- 0 — отключен режим параллельного разбора.
|
||||||
|
|
||||||
|
Значение по умолчанию: `0`.
|
||||||
|
|
||||||
|
## output_format_parallel_formatting {#output-format-parallel-formatting}
|
||||||
|
|
||||||
|
Включает или отключает режим, при котором исходящие данные форматируются параллельно с сохранением исходного порядка. Поддерживается только для форматов [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) и [JSONEachRow](../../interfaces/formats.md#jsoneachrow).
|
||||||
|
|
||||||
|
Возможные значения:
|
||||||
|
|
||||||
|
- 1 — включен режим параллельного форматирования.
|
||||||
|
- 0 — отключен режим параллельного форматирования.
|
||||||
|
|
||||||
|
Значение по умолчанию: `0`.
|
||||||
|
|
||||||
## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing}
|
## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing}
|
||||||
|
|
||||||
|
@ -5,10 +5,110 @@ toc_title: "Хранение данных на внешних дисках"
|
|||||||
|
|
||||||
# Хранение данных на внешних дисках {#external-disks}
|
# Хранение данных на внешних дисках {#external-disks}
|
||||||
|
|
||||||
Данные, которые обрабатываются в ClickHouse, обычно хранятся в файловой системе локально, где развернут сервер ClickHouse. При этом для хранения данных требуются диски большого объема, которые могут быть довольно дорогостоящими. Решением проблемы может стать хранение данных отдельно от сервера — в распределенных файловых системах — [Amazon s3](https://aws.amazon.com/s3/) или Hadoop ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)).
|
Данные, которые обрабатываются в ClickHouse, обычно хранятся в файловой системе локально, где развернут сервер ClickHouse. При этом для хранения данных требуются диски большого объема, которые могут быть довольно дорогостоящими. Решением проблемы может стать хранение данных отдельно от сервера — в распределенных файловых системах — [Amazon S3](https://aws.amazon.com/s3/) или Hadoop ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)).
|
||||||
|
|
||||||
Для работы с данными, хранящимися в файловой системе `Amazon s3`, используйте движок [s3](../engines/table-engines/integrations/s3.md), а для работы с данными в файловой системе Hadoop — движок [HDFS](../engines/table-engines/integrations/hdfs.md).
|
Для работы с данными, хранящимися в файловой системе `Amazon S3`, используйте движок [S3](../engines/table-engines/integrations/s3.md), а для работы с данными в файловой системе Hadoop — движок [HDFS](../engines/table-engines/integrations/hdfs.md).
|
||||||
|
|
||||||
## Репликация без копирования данных {#zero-copy}
|
## Репликация без копирования данных {#zero-copy}
|
||||||
|
|
||||||
Для дисков `s3` и `HDFS` в ClickHouse поддерживается репликация без копирования данных (zero-copy): если данные хранятся на нескольких репликах, то при синхронизации пересылаются только метаданные (пути к кускам данных), а сами данные не копируются.
|
Для дисков `S3` и `HDFS` в ClickHouse поддерживается репликация без копирования данных (zero-copy): если данные хранятся на нескольких репликах, то при синхронизации пересылаются только метаданные (пути к кускам данных), а сами данные не копируются.
|
||||||
|
|
||||||
|
## Использование сервиса HDFS для хранения данных {#table_engine-mergetree-hdfs}
|
||||||
|
|
||||||
|
Таблицы семейств [MergeTree](../engines/table-engines/mergetree-family/mergetree.md) и [Log](../engines/table-engines/log-family/log.md) могут хранить данные в сервисе HDFS при использовании диска типа `HDFS`.
|
||||||
|
|
||||||
|
Пример конфигурации:
|
||||||
|
``` xml
|
||||||
|
<yandex>
|
||||||
|
<storage_configuration>
|
||||||
|
<disks>
|
||||||
|
<hdfs>
|
||||||
|
<type>hdfs</type>
|
||||||
|
<endpoint>hdfs://hdfs1:9000/clickhouse/</endpoint>
|
||||||
|
</hdfs>
|
||||||
|
</disks>
|
||||||
|
<policies>
|
||||||
|
<hdfs>
|
||||||
|
<volumes>
|
||||||
|
<main>
|
||||||
|
<disk>hdfs</disk>
|
||||||
|
</main>
|
||||||
|
</volumes>
|
||||||
|
</hdfs>
|
||||||
|
</policies>
|
||||||
|
</storage_configuration>
|
||||||
|
|
||||||
|
<merge_tree>
|
||||||
|
<min_bytes_for_wide_part>0</min_bytes_for_wide_part>
|
||||||
|
</merge_tree>
|
||||||
|
</yandex>
|
||||||
|
```
|
||||||
|
|
||||||
|
Обязательные параметры:
|
||||||
|
|
||||||
|
- `endpoint` — URL точки приема запроса на стороне HDFS в формате `path`. URL точки должен содержать путь к корневой директории на сервере, где хранятся данные.
|
||||||
|
|
||||||
|
Необязательные параметры:
|
||||||
|
|
||||||
|
- `min_bytes_for_seek` — минимальное количество байтов, которые используются для операций поиска вместо последовательного чтения. Значение по умолчанию: `1 МБайт`.
|
||||||
|
|
||||||
|
## Использование виртуальной файловой системы для шифрования данных {#encrypted-virtual-file-system}
|
||||||
|
|
||||||
|
Вы можете зашифровать данные, сохраненные на внешних дисках [S3](../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-s3) или [HDFS](#table_engine-mergetree-hdfs) или на локальном диске. Чтобы включить режим шифрования, в конфигурационном файле вы должны указать диск с типом `encrypted` и тип диска, на котором будут сохранены данные. Диск типа `encrypted` шифрует данные "на лету", то есть при чтении файлов с этого диска расшифровка происходит автоматически. Таким образом, вы можете работать с диском типа `encrypted` как с обычным.
|
||||||
|
|
||||||
|
Пример конфигурации:
|
||||||
|
|
||||||
|
``` xml
|
||||||
|
<disks>
|
||||||
|
<disk1>
|
||||||
|
<type>local</type>
|
||||||
|
<path>/path1/</path>
|
||||||
|
</disk1>
|
||||||
|
<disk2>
|
||||||
|
<type>encrypted</type>
|
||||||
|
<disk>disk1</disk>
|
||||||
|
<path>path2/</path>
|
||||||
|
<key>_16_ascii_chars_</key>
|
||||||
|
</disk2>
|
||||||
|
</disks>
|
||||||
|
```
|
||||||
|
|
||||||
|
Например, когда ClickHouse записывает данные из какой-либо таблицы в файл `store/all_1_1_0/data.bin` на `disk1`, то на самом деле этот файл будет записан на физический диск по пути `/path1/store/all_1_1_0/data.bin`.
|
||||||
|
|
||||||
|
При записи того же файла на диск `disk2` он будет записан на физический диск в зашифрованном виде по пути `/path1/path2/store/all_1_1_0/data.bin`.
|
||||||
|
|
||||||
|
Обязательные параметры:
|
||||||
|
|
||||||
|
- `type` — `encrypted`. Иначе зашифрованный диск создан не будет.
|
||||||
|
- `disk` — тип диска для хранения данных.
|
||||||
|
- `key` — ключ для шифрования и расшифровки. Тип: [Uint64](../sql-reference/data-types/int-uint.md). Вы можете использовать параметр `key_hex` для шифрования в шестнадцатеричной форме.
|
||||||
|
Вы можете указать несколько ключей, используя атрибут `id` (смотрите пример выше).
|
||||||
|
|
||||||
|
Необязательные параметры:
|
||||||
|
|
||||||
|
- `path` — путь к месту на диске, где будут сохранены данные. Если не указан, данные будут сохранены в корневом каталоге.
|
||||||
|
- `current_key_id` — ключ, используемый для шифрования. Все указанные ключи могут быть использованы для расшифровки, и вы всегда можете переключиться на другой ключ, сохраняя доступ к ранее зашифрованным данным.
|
||||||
|
- `algorithm` — [алгоритм](../sql-reference/statements/create/table.md#create-query-encryption-codecs) шифрования данных. Возможные значения: `AES_128_CTR`, `AES_192_CTR` или `AES_256_CTR`. Значение по умолчанию: `AES_128_CTR`. Длина ключа зависит от алгоритма: `AES_128_CTR` — 16 байт, `AES_192_CTR` — 24 байта, `AES_256_CTR` — 32 байта.
|
||||||
|
|
||||||
|
Пример конфигурации:
|
||||||
|
|
||||||
|
``` xml
|
||||||
|
<yandex>
|
||||||
|
<storage_configuration>
|
||||||
|
<disks>
|
||||||
|
<disk_s3>
|
||||||
|
<type>s3</type>
|
||||||
|
<endpoint>...
|
||||||
|
</disk_s3>
|
||||||
|
<disk_s3_encrypted>
|
||||||
|
<type>encrypted</type>
|
||||||
|
<disk>disk_s3</disk>
|
||||||
|
<algorithm>AES_128_CTR</algorithm>
|
||||||
|
<key_hex id="0">00112233445566778899aabbccddeeff</key_hex>
|
||||||
|
<key_hex id="1">ffeeddccbbaa99887766554433221100</key_hex>
|
||||||
|
<current_key_id>1</current_key_id>
|
||||||
|
</disk_s3_encrypted>
|
||||||
|
</disks>
|
||||||
|
</storage_configuration>
|
||||||
|
</yandex>
|
||||||
|
```
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Столбцы:
|
Столбцы:
|
||||||
|
|
||||||
- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md) — идентификатор трассировки для выполненного запроса.
|
- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md)) — идентификатор трассировки для выполненного запроса.
|
||||||
|
|
||||||
- `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — идентификатор `trace span`.
|
- `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — идентификатор `trace span`.
|
||||||
|
|
||||||
|
129
docs/ru/operations/system-tables/zookeeper_log.md
Normal file
129
docs/ru/operations/system-tables/zookeeper_log.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
# system.zookeeper_log {#system-zookeeper_log}
|
||||||
|
|
||||||
|
Эта таблица содержит информацию о параметрах запроса к серверу ZooKeeper и ответа от него.
|
||||||
|
|
||||||
|
Для запросов заполняются только столбцы с параметрами запроса, а остальные столбцы заполняются значениями по умолчанию (`0` или `NULL`). Когда поступает ответ, данные добавляются в столбцы с параметрами ответа на запрос.
|
||||||
|
|
||||||
|
Столбцы с параметрами запроса:
|
||||||
|
|
||||||
|
- `type` ([Enum](../../sql-reference/data-types/enum.md)) — тип события в клиенте ZooKeeper. Может иметь одно из следующих значений:
|
||||||
|
- `Request` — запрос отправлен.
|
||||||
|
- `Response` — ответ получен.
|
||||||
|
- `Finalize` — соединение разорвано, ответ не получен.
|
||||||
|
- `event_date` ([Date](../../sql-reference/data-types/date.md)) — дата, когда произошло событие.
|
||||||
|
- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — дата и время, когда произошло событие.
|
||||||
|
- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP адрес сервера ZooKeeper, с которого был сделан запрос.
|
||||||
|
- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — порт сервера ZooKeeper, с которого был сделан запрос.
|
||||||
|
- `session_id` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор сессии, который сервер ZooKeeper создает для каждого соединения.
|
||||||
|
- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — идентификатор запроса внутри сессии. Обычно это последовательный номер запроса, одинаковый у строки запроса и у парной строки `response`/`finalize`.
|
||||||
|
- `has_watch` ([UInt8](../../sql-reference/data-types/int-uint.md)) — установлен ли запрос [watch](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches).
|
||||||
|
- `op_num` ([Enum](../../sql-reference/data-types/enum.md)) — тип запроса или ответа на запрос.
|
||||||
|
- `path` ([String](../../sql-reference/data-types/string.md)) — путь к узлу ZooKeeper, указанный в запросе. Пустая строка, если запрос не требует указания пути.
|
||||||
|
- `data` ([String](../../sql-reference/data-types/string.md)) — данные, записанные на узле ZooKeeper (для запросов `SET` и `CREATE` — что запрос хотел записать, для ответа на запрос `GET` — что было прочитано), или пустая строка.
|
||||||
|
- `is_ephemeral` ([UInt8](../../sql-reference/data-types/int-uint.md)) — создается ли узел ZooKeeper как [ephemeral](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Ephemeral+Nodes).
|
||||||
|
- `is_sequential` ([UInt8](../../sql-reference/data-types/int-uint.md)) — создается ли узел ZooKeeper как [sequential](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Sequence+Nodes+--+Unique+Naming).
|
||||||
|
- `version` ([Nullable(Int32)](../../sql-reference/data-types/nullable.md)) — версия узла ZooKeeper, которую запрос ожидает увидеть при выполнении. Поддерживается для запросов `CHECK`, `SET`, `REMOVE` (`-1` — запрос не проверяет версию, `NULL` — для других запросов, которые не поддерживают проверку версии).
|
||||||
|
- `requests_size` ([UInt32](../../sql-reference/data-types/int-uint.md)) — количество запросов, включенных в мультизапрос (это специальный запрос, который состоит из нескольких последовательных обычных запросов, выполняющихся атомарно). Все запросы, включенные в мультизапрос, имеют одинаковый `xid`.
|
||||||
|
- `request_idx` ([UInt32](../../sql-reference/data-types/int-uint.md)) — номер запроса, включенного в мультизапрос (`0` — для мультизапроса, далее по порядку с `1`).
|
||||||
|
|
||||||
|
Столбцы с параметрами ответа на запрос:
|
||||||
|
|
||||||
|
- `zxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции в ZooKeeper. Последовательный номер, выданный сервером ZooKeeper в ответе на успешно выполненный запрос (`0` — запрос не был выполнен, возвращена ошибка или клиент ZooKeeper не знает, был ли выполнен запрос).
|
||||||
|
- `error` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — код ошибки. Может иметь много значений, здесь приведены только некоторые из них:
|
||||||
|
- `ZOK` — запрос успешно выполнен.
|
||||||
|
- `ZCONNECTIONLOSS` — соединение разорвано.
|
||||||
|
- `ZOPERATIONTIMEOUT` — истекло время ожидания выполнения запроса.
|
||||||
|
- `ZSESSIONEXPIRED` — истекло время сессии.
|
||||||
|
- `NULL` — выполнен запрос.
|
||||||
|
- `watch_type` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — тип события `watch` (для ответов на запрос при `op_num` = `Watch`), для остальных ответов: `NULL`.
|
||||||
|
- `watch_state` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — статус события `watch` (для ответов на запрос при `op_num` = `Watch`), для остальных ответов: `NULL`.
|
||||||
|
- `path_created` ([String](../../sql-reference/data-types/string.md)) — путь к созданному узлу ZooKeeper (для ответов на запрос `CREATE`). Может отличаться от `path`, если узел создается как `sequential`.
|
||||||
|
- `stat_czxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции, в результате которой был создан узел ZooKeeper.
|
||||||
|
- `stat_mzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции, которая последней модифицировала узел ZooKeeper.
|
||||||
|
- `stat_pzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — идентификатор транзакции, которая последней модифицировала дочерние узлы ZooKeeper.
|
||||||
|
- `stat_version` ([Int32](../../sql-reference/data-types/int-uint.md)) — количество изменений в данных узла ZooKeeper.
|
||||||
|
- `stat_cversion` ([Int32](../../sql-reference/data-types/int-uint.md)) — количество изменений в дочерних узлах ZooKeeper.
|
||||||
|
- `stat_dataLength` ([Int32](../../sql-reference/data-types/int-uint.md)) — длина поля данных узла ZooKeeper.
|
||||||
|
- `stat_numChildren` ([Int32](../../sql-reference/data-types/int-uint.md)) — количество дочерних узлов ZooKeeper.
|
||||||
|
- `children` ([Array(String)](../../sql-reference/data-types/array.md)) — список дочерних узлов ZooKeeper (для ответов на запрос `LIST`).
|
||||||
|
|
||||||
|
**Пример**
|
||||||
|
|
||||||
|
Запрос:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM system.zookeeper_log WHERE (session_id = '106662742089334927') AND (xid = '10858') FORMAT Vertical;
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
type: Request
|
||||||
|
event_date: 2021-08-09
|
||||||
|
event_time: 2021-08-09 21:38:30.291792
|
||||||
|
address: ::
|
||||||
|
port: 2181
|
||||||
|
session_id: 106662742089334927
|
||||||
|
xid: 10858
|
||||||
|
has_watch: 1
|
||||||
|
op_num: List
|
||||||
|
path: /clickhouse/task_queue/ddl
|
||||||
|
data:
|
||||||
|
is_ephemeral: 0
|
||||||
|
is_sequential: 0
|
||||||
|
version: ᴺᵁᴸᴸ
|
||||||
|
requests_size: 0
|
||||||
|
request_idx: 0
|
||||||
|
zxid: 0
|
||||||
|
error: ᴺᵁᴸᴸ
|
||||||
|
watch_type: ᴺᵁᴸᴸ
|
||||||
|
watch_state: ᴺᵁᴸᴸ
|
||||||
|
path_created:
|
||||||
|
stat_czxid: 0
|
||||||
|
stat_mzxid: 0
|
||||||
|
stat_pzxid: 0
|
||||||
|
stat_version: 0
|
||||||
|
stat_cversion: 0
|
||||||
|
stat_dataLength: 0
|
||||||
|
stat_numChildren: 0
|
||||||
|
children: []
|
||||||
|
|
||||||
|
Row 2:
|
||||||
|
──────
|
||||||
|
type: Response
|
||||||
|
event_date: 2021-08-09
|
||||||
|
event_time: 2021-08-09 21:38:30.292086
|
||||||
|
address: ::
|
||||||
|
port: 2181
|
||||||
|
session_id: 106662742089334927
|
||||||
|
xid: 10858
|
||||||
|
has_watch: 1
|
||||||
|
op_num: List
|
||||||
|
path: /clickhouse/task_queue/ddl
|
||||||
|
data:
|
||||||
|
is_ephemeral: 0
|
||||||
|
is_sequential: 0
|
||||||
|
version: ᴺᵁᴸᴸ
|
||||||
|
requests_size: 0
|
||||||
|
request_idx: 0
|
||||||
|
zxid: 16926267
|
||||||
|
error: ZOK
|
||||||
|
watch_type: ᴺᵁᴸᴸ
|
||||||
|
watch_state: ᴺᵁᴸᴸ
|
||||||
|
path_created:
|
||||||
|
stat_czxid: 16925469
|
||||||
|
stat_mzxid: 16925469
|
||||||
|
stat_pzxid: 16926179
|
||||||
|
stat_version: 0
|
||||||
|
stat_cversion: 7
|
||||||
|
stat_dataLength: 0
|
||||||
|
stat_numChildren: 7
|
||||||
|
children: ['query-0000000006','query-0000000005','query-0000000004','query-0000000003','query-0000000002','query-0000000001','query-0000000000']
|
||||||
|
```
|
||||||
|
|
||||||
|
**См. также**
|
||||||
|
|
||||||
|
- [ZooKeeper](../../operations/tips.md#zookeeper)
|
||||||
|
- [Руководство по ZooKeeper](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html)
|
@ -172,7 +172,7 @@ SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 4) FROM
|
|||||||
|
|
||||||
## sequenceCount(pattern)(time, cond1, cond2, …) {#function-sequencecount}
|
## sequenceCount(pattern)(time, cond1, cond2, …) {#function-sequencecount}
|
||||||
|
|
||||||
Вычисляет количество цепочек событий, соответствующих шаблону. Функция обнаруживает только непересекающиеся цепочки событий. Она начитает искать следующую цепочку только после того, как полностью совпала текущая цепочка событий.
|
Вычисляет количество цепочек событий, соответствующих шаблону. Функция обнаруживает только непересекающиеся цепочки событий. Она начинает искать следующую цепочку только после того, как полностью совпала текущая цепочка событий.
|
||||||
|
|
||||||
!!! warning "Предупреждение"
|
!!! warning "Предупреждение"
|
||||||
События, произошедшие в одну и ту же секунду, располагаются в последовательности в неопределенном порядке, что может повлиять на результат работы функции.
|
События, произошедшие в одну и ту же секунду, располагаются в последовательности в неопределенном порядке, что может повлиять на результат работы функции.
|
||||||
|
@ -906,7 +906,7 @@ SELECT arrayEnumerateDense([10, 20, 10, 30])
|
|||||||
|
|
||||||
## arrayIntersect(arr) {#array-functions-arrayintersect}
|
## arrayIntersect(arr) {#array-functions-arrayintersect}
|
||||||
|
|
||||||
Принимает несколько массивов, возвращает массив с элементами, присутствующими во всех исходных массивах. Элементы на выходе следуют в порядке следования в первом массиве.
|
Принимает несколько массивов, возвращает массив с элементами, присутствующими во всех исходных массивах.
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
|
@ -193,6 +193,40 @@ SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index;
|
|||||||
└────────────────────┘
|
└────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## h3ToGeo {#h3togeo}
|
||||||
|
|
||||||
|
Возвращает географические координаты долготы и широты, соответствующие указанному [H3](#h3index)-индексу.
|
||||||
|
|
||||||
|
**Синтаксис**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
h3ToGeo(h3Index)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Аргументы**
|
||||||
|
|
||||||
|
- `h3Index` — [H3](#h3index)-индекс. [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||||
|
|
||||||
|
**Возвращаемые значения**
|
||||||
|
|
||||||
|
- кортеж из двух значений: `tuple(lon,lat)`, где `lon` — долгота [Float64](../../../sql-reference/data-types/float.md), `lat` — широта [Float64](../../../sql-reference/data-types/float.md).
|
||||||
|
|
||||||
|
**Пример**
|
||||||
|
|
||||||
|
Запрос:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT h3ToGeo(644325524701193974) coordinates;
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─coordinates───────────────────────────┐
|
||||||
|
│ (37.79506616830252,55.71290243145668) │
|
||||||
|
└───────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
## h3kRing {#h3kring}
|
## h3kRing {#h3kring}
|
||||||
|
|
||||||
Возвращает [H3](#h3index)-индексы шестигранников в радиусе `k` от данного в произвольном порядке.
|
Возвращает [H3](#h3index)-индексы шестигранников в радиусе `k` от данного в произвольном порядке.
|
||||||
|
@ -385,4 +385,32 @@ ExpressionTransform
|
|||||||
NumbersMt × 2 0 → 1
|
NumbersMt × 2 0 → 1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### EXPLAIN ESTIMATE {#explain-estimate}
|
||||||
|
|
||||||
|
Отображает оценки числа строк, засечек и кусков, которые будут прочитаны при выполнении запроса. Применяется для таблиц семейства [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree).
|
||||||
|
|
||||||
|
**Пример**
|
||||||
|
|
||||||
|
Создадим таблицу:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE ttt (i Int64) ENGINE = MergeTree() ORDER BY i SETTINGS index_granularity = 16, write_final_mark = 0;
|
||||||
|
INSERT INTO ttt SELECT number FROM numbers(128);
|
||||||
|
OPTIMIZE TABLE ttt;
|
||||||
|
```
|
||||||
|
|
||||||
|
Запрос:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
EXPLAIN ESTIMATE SELECT * FROM ttt;
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат:
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐
|
||||||
|
│ default │ ttt │ 1 │ 128 │ 8 │
|
||||||
|
└──────────┴───────┴───────┴──────┴───────┘
|
||||||
|
```
|
||||||
|
|
||||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/statements/explain/) <!--hide-->
|
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/statements/explain/) <!--hide-->
|
||||||
|
@ -6,7 +6,7 @@ toc_title: JOIN
|
|||||||
|
|
||||||
`JOIN` создаёт новую таблицу путем объединения столбцов из одной или нескольких таблиц с использованием общих для каждой из них значений. Это обычная операция в базах данных с поддержкой SQL, которая соответствует join из [реляционной алгебры](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators). Частный случай соединения одной таблицы часто называют self-join.
|
`JOIN` создаёт новую таблицу путем объединения столбцов из одной или нескольких таблиц с использованием общих для каждой из них значений. Это обычная операция в базах данных с поддержкой SQL, которая соответствует join из [реляционной алгебры](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators). Частный случай соединения одной таблицы часто называют self-join.
|
||||||
|
|
||||||
Синтаксис:
|
**Синтаксис**
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
SELECT <expr_list>
|
SELECT <expr_list>
|
||||||
@ -19,7 +19,7 @@ FROM <left_table>
|
|||||||
|
|
||||||
## Поддерживаемые типы соединения {#select-join-types}
|
## Поддерживаемые типы соединения {#select-join-types}
|
||||||
|
|
||||||
Все типы из стандартого [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) поддерживаются:
|
Все типы из стандартного [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) поддерживаются:
|
||||||
|
|
||||||
- `INNER JOIN`, возвращаются только совпадающие строки.
|
- `INNER JOIN`, возвращаются только совпадающие строки.
|
||||||
- `LEFT OUTER JOIN`, не совпадающие строки из левой таблицы возвращаются в дополнение к совпадающим строкам.
|
- `LEFT OUTER JOIN`, не совпадающие строки из левой таблицы возвращаются в дополнение к совпадающим строкам.
|
||||||
@ -33,7 +33,7 @@ FROM <left_table>
|
|||||||
|
|
||||||
- `LEFT SEMI JOIN` и `RIGHT SEMI JOIN`, белый список по ключам соединения, не производит декартово произведение.
|
- `LEFT SEMI JOIN` и `RIGHT SEMI JOIN`, белый список по ключам соединения, не производит декартово произведение.
|
||||||
- `LEFT ANTI JOIN` и `RIGHT ANTI JOIN`, черный список по ключам соединения, не производит декартово произведение.
|
- `LEFT ANTI JOIN` и `RIGHT ANTI JOIN`, черный список по ключам соединения, не производит декартово произведение.
|
||||||
- `LEFT ANY JOIN`, `RIGHT ANY JOIN` и `INNER ANY JOIN`, Частично (для противоположных сторон `LEFT` и `RIGHT`) или полностью (для `INNER` и `FULL`) отключает декартово произведение для стандартых видов `JOIN`.
|
- `LEFT ANY JOIN`, `RIGHT ANY JOIN` и `INNER ANY JOIN`, Частично (для противоположных сторон `LEFT` и `RIGHT`) или полностью (для `INNER` и `FULL`) отключает декартово произведение для стандартных видов `JOIN`.
|
||||||
- `ASOF JOIN` и `LEFT ASOF JOIN`, Для соединения последовательностей по нечеткому совпадению. Использование `ASOF JOIN` описано ниже.
|
- `ASOF JOIN` и `LEFT ASOF JOIN`, Для соединения последовательностей по нечеткому совпадению. Использование `ASOF JOIN` описано ниже.
|
||||||
|
|
||||||
## Настройки {#join-settings}
|
## Настройки {#join-settings}
|
||||||
@ -52,6 +52,61 @@ FROM <left_table>
|
|||||||
- [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge)
|
- [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge)
|
||||||
- [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys)
|
- [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys)
|
||||||
|
|
||||||
|
## Условия в секции ON {on-section-conditions}
|
||||||
|
|
||||||
|
Секция `ON` может содержать несколько условий, связанных оператором `AND`. Условия, задающие ключи соединения, должны содержать столбцы левой и правой таблицы и должны использовать оператор равенства. Прочие условия могут использовать другие логические операторы, но в отдельном условии могут использоваться столбцы либо только левой, либо только правой таблицы.
|
||||||
|
Строки объединяются только тогда, когда всё составное условие выполнено. Если оно не выполнено, то строки могут попасть в результат в зависимости от типа `JOIN`. Обратите внимание, что если то же самое условие поместить в секцию `WHERE`, то строки, для которых оно не выполняется, никогда не попаду в результат.
|
||||||
|
|
||||||
|
!!! note "Примечание"
|
||||||
|
Оператор `OR` внутри секции `ON` пока не поддерживается.
|
||||||
|
|
||||||
|
!!! note "Примечание"
|
||||||
|
Если в условии использованы столбцы из разных таблиц, то пока поддерживается только оператор равенства (`=`).
|
||||||
|
|
||||||
|
**Пример**
|
||||||
|
|
||||||
|
Рассмотрим `table_1` и `table_2`:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─Id─┬─name─┐ ┌─Id─┬─text───────────┬─scores─┐
|
||||||
|
│ 1 │ A │ │ 1 │ Text A │ 10 │
|
||||||
|
│ 2 │ B │ │ 1 │ Another text A │ 12 │
|
||||||
|
│ 3 │ C │ │ 2 │ Text B │ 15 │
|
||||||
|
└────┴──────┘ └────┴────────────────┴────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Запрос с одним условием, задающим ключ соединения, и дополнительным условием для `table_2`:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT name, text FROM table_1 LEFT OUTER JOIN table_2
|
||||||
|
ON table_1.Id = table_2.Id AND startsWith(table_2.text, 'Text');
|
||||||
|
```
|
||||||
|
|
||||||
|
Обратите внимание, что результат содержит строку с именем `C` и пустым текстом. Строка включена в результат, потому что использован тип соединения `OUTER`.
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─name─┬─text───┐
|
||||||
|
│ A │ Text A │
|
||||||
|
│ B │ Text B │
|
||||||
|
│ C │ │
|
||||||
|
└──────┴────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Запрос с типом соединения `INNER` и несколькими условиями:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT name, text, scores FROM table_1 INNER JOIN table_2
|
||||||
|
ON table_1.Id = table_2.Id AND table_2.scores > 10 AND startsWith(table_2.text, 'Text');
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─name─┬─text───┬─scores─┐
|
||||||
|
│ B │ Text B │ 15 │
|
||||||
|
└──────┴────────┴────────┘
|
||||||
|
```
|
||||||
|
|
||||||
## Использование ASOF JOIN {#asof-join-usage}
|
## Использование ASOF JOIN {#asof-join-usage}
|
||||||
|
|
||||||
`ASOF JOIN` применим в том случае, когда необходимо объединять записи, которые не имеют точного совпадения.
|
`ASOF JOIN` применим в том случае, когда необходимо объединять записи, которые не имеют точного совпадения.
|
||||||
@ -59,7 +114,7 @@ FROM <left_table>
|
|||||||
Для работы алгоритма необходим специальный столбец в таблицах. Этот столбец:
|
Для работы алгоритма необходим специальный столбец в таблицах. Этот столбец:
|
||||||
|
|
||||||
- Должен содержать упорядоченную последовательность.
|
- Должен содержать упорядоченную последовательность.
|
||||||
- Может быть одного из следующих типов: [Int*, UInt*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Date](../../data-types/date.md), [DateTime](../../data-types/datetime.md), [Decimal*](../../data-types/decimal.md).
|
- Может быть одного из следующих типов: [Int, UInt](../../data-types/int-uint.md), [Float](../../data-types/float.md), [Date](../../data-types/date.md), [DateTime](../../data-types/datetime.md), [Decimal](../../data-types/decimal.md).
|
||||||
- Не может быть единственным столбцом в секции `JOIN`.
|
- Не может быть единственным столбцом в секции `JOIN`.
|
||||||
|
|
||||||
Синтаксис `ASOF JOIN ... ON`:
|
Синтаксис `ASOF JOIN ... ON`:
|
||||||
|
@ -36,6 +36,7 @@ toc_title: SYSTEM
|
|||||||
- [START REPLICATION QUEUES](#query_language-system-start-replication-queues)
|
- [START REPLICATION QUEUES](#query_language-system-start-replication-queues)
|
||||||
- [SYNC REPLICA](#query_language-system-sync-replica)
|
- [SYNC REPLICA](#query_language-system-sync-replica)
|
||||||
- [RESTART REPLICA](#query_language-system-restart-replica)
|
- [RESTART REPLICA](#query_language-system-restart-replica)
|
||||||
|
- [RESTORE REPLICA](#query_language-system-restore-replica)
|
||||||
- [RESTART REPLICAS](#query_language-system-restart-replicas)
|
- [RESTART REPLICAS](#query_language-system-restart-replicas)
|
||||||
|
|
||||||
## RELOAD EMBEDDED DICTIONARIES] {#query_language-system-reload-emdedded-dictionaries}
|
## RELOAD EMBEDDED DICTIONARIES] {#query_language-system-reload-emdedded-dictionaries}
|
||||||
@ -287,13 +288,66 @@ SYSTEM SYNC REPLICA [db.]replicated_merge_tree_family_table_name
|
|||||||
|
|
||||||
### RESTART REPLICA {#query_language-system-restart-replica}
|
### RESTART REPLICA {#query_language-system-restart-replica}
|
||||||
|
|
||||||
Реинициализация состояния Zookeeper-сессий для таблицы семейства `ReplicatedMergeTree`. Сравнивает текущее состояние с тем, что хранится в Zookeeper, как источник правды, и добавляет задачи в очередь репликации в Zookeeper, если необходимо.
|
Реинициализирует состояние сессий Zookeeper для таблицы семейства `ReplicatedMergeTree`. Сравнивает текущее состояние с состоянием в Zookeeper (как с эталоном) и при необходимости добавляет задачи в очередь репликации в Zookeeper.
|
||||||
Инициализация очереди репликации на основе данных ZooKeeper происходит так же, как при attach table. На короткое время таблица станет недоступной для любых операций.
|
Инициализация очереди репликации на основе данных ZooKeeper происходит так же, как при `ATTACH TABLE`. Некоторое время таблица будет недоступна для любых операций.
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
SYSTEM RESTART REPLICA [db.]replicated_merge_tree_family_table_name
|
SYSTEM RESTART REPLICA [db.]replicated_merge_tree_family_table_name
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### RESTORE REPLICA {#query_language-system-restore-replica}
|
||||||
|
|
||||||
|
Восстанавливает реплику, если метаданные в Zookeeper потеряны, но сами данные возможно существуют.
|
||||||
|
|
||||||
|
Работает только с таблицами семейства `ReplicatedMergeTree` и только если таблица находится в readonly-режиме.
|
||||||
|
|
||||||
|
Запрос можно выполнить если:
|
||||||
|
|
||||||
|
- потерян корневой путь ZooKeeper `/`;
|
||||||
|
- потерян путь реплик `/replicas`;
|
||||||
|
- потерян путь конкретной реплики `/replicas/replica_name/`.
|
||||||
|
|
||||||
|
К реплике прикрепляются локально найденные куски, информация о них отправляется в Zookeeper.
|
||||||
|
Если присутствующие в реплике до потери метаданных данные не устарели, они не скачиваются повторно с других реплик. Поэтому восстановление реплики не означает повторную загрузку всех данных по сети.
|
||||||
|
|
||||||
|
!!! warning "Предупреждение"
|
||||||
|
Потерянные данные в любых состояниях перемещаются в папку `detached/`. Куски, активные до потери данных (находившиеся в состоянии Committed), прикрепляются.
|
||||||
|
|
||||||
|
**Синтаксис**
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SYSTEM RESTORE REPLICA [db.]replicated_merge_tree_family_table_name [ON CLUSTER cluster_name]
|
||||||
|
```
|
||||||
|
|
||||||
|
Альтернативный синтаксис:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SYSTEM RESTORE REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name
|
||||||
|
```
|
||||||
|
|
||||||
|
**Пример**
|
||||||
|
|
||||||
|
Создание таблицы на нескольких серверах. После потери корневого пути реплики таблица будет прикреплена только для чтения, так как метаданные отсутствуют. Последний запрос необходимо выполнить на каждой реплике.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE test(n UInt32)
|
||||||
|
ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/', '{replica}')
|
||||||
|
ORDER BY n PARTITION BY n % 10;
|
||||||
|
|
||||||
|
INSERT INTO test SELECT * FROM numbers(1000);
|
||||||
|
|
||||||
|
-- zookeeper_delete_path("/clickhouse/tables/test", recursive=True) <- root loss.
|
||||||
|
|
||||||
|
SYSTEM RESTART REPLICA test;
|
||||||
|
SYSTEM RESTORE REPLICA test;
|
||||||
|
```
|
||||||
|
|
||||||
|
Альтернативный способ:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SYSTEM RESTORE REPLICA test ON CLUSTER cluster;
|
||||||
|
```
|
||||||
|
|
||||||
### RESTART REPLICAS {#query_language-system-restart-replicas}
|
### RESTART REPLICAS {#query_language-system-restart-replicas}
|
||||||
|
|
||||||
Реинициализация состояния ZooKeeper-сессий для всех `ReplicatedMergeTree` таблиц. Сравнивает текущее состояние реплики с тем, что хранится в ZooKeeper, как c источником правды, и добавляет задачи в очередь репликации в ZooKeeper, если необходимо.
|
Реинициализация состояния ZooKeeper-сессий для всех `ReplicatedMergeTree` таблиц. Сравнивает текущее состояние реплики с тем, что хранится в ZooKeeper, как c источником правды, и добавляет задачи в очередь репликации в ZooKeeper, если необходимо.
|
||||||
|
@ -5,22 +5,44 @@ toc_title: cluster
|
|||||||
|
|
||||||
# cluster, clusterAllReplicas {#cluster-clusterallreplicas}
|
# cluster, clusterAllReplicas {#cluster-clusterallreplicas}
|
||||||
|
|
||||||
Позволяет обратиться ко всем серверам существующего кластера, который присутствует в таблице `system.clusters` и сконфигурирован в секцци `remote_servers` без создания таблицы типа `Distributed`.
|
Позволяет обратиться ко всем шардам существующего кластера, который сконфигурирован в секции `remote_servers` без создания таблицы типа [Distributed](../../engines/table-engines/special/distributed.md). В запросе используется одна реплика каждого шарда.
|
||||||
`clusterAllReplicas` - работает также как `cluster` но каждая реплика в кластере будет использована как отдельный шард/отдельное соединение.
|
|
||||||
|
|
||||||
|
Функция `clusterAllReplicas` работает также как `cluster`, но каждая реплика в кластере используется как отдельный шард/отдельное соединение.
|
||||||
|
|
||||||
Сигнатуры:
|
!!! note "Примечание"
|
||||||
|
Все доступные кластеры перечислены в таблице [system.clusters](../../operations/system-tables/clusters.md).
|
||||||
|
|
||||||
|
**Синтаксис**
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
cluster('cluster_name', db.table)
|
cluster('cluster_name', db.table[, sharding_key])
|
||||||
cluster('cluster_name', db, table)
|
cluster('cluster_name', db, table[, sharding_key])
|
||||||
clusterAllReplicas('cluster_name', db.table)
|
clusterAllReplicas('cluster_name', db.table[, sharding_key])
|
||||||
clusterAllReplicas('cluster_name', db, table)
|
clusterAllReplicas('cluster_name', db, table[, sharding_key])
|
||||||
|
```
|
||||||
|
**Аргументы**
|
||||||
|
|
||||||
|
- `cluster_name` – имя кластера, который обозначает подмножество адресов и параметров подключения к удаленным и локальным серверам, входящим в кластер.
|
||||||
|
- `db.table` или `db`, `table` - имя базы данных и таблицы.
|
||||||
|
- `sharding_key` - ключ шардирования. Необязательный аргумент. Указывается, если данные добавляются более чем в один шард кластера.
|
||||||
|
|
||||||
|
**Возвращаемое значение**
|
||||||
|
|
||||||
|
Набор данных из кластеров.
|
||||||
|
|
||||||
|
**Использование макросов**
|
||||||
|
|
||||||
|
`cluster_name` может содержать макрос — подстановку в фигурных скобках. Эта подстановка заменяется на соответствующее значение из секции [macros](../../operations/server-configuration-parameters/settings.md#macros) конфигурационного файла .
|
||||||
|
|
||||||
|
Пример:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT * FROM cluster('{cluster}', default.example_table);
|
||||||
```
|
```
|
||||||
|
|
||||||
`cluster_name` – имя кластера, который обязан присутствовать в таблице `system.clusters` и обозначает подмножество адресов и параметров подключения к удаленным и локальным серверам, входящим в кластер.
|
**Использование и рекомендации**
|
||||||
|
|
||||||
Использование табличных функций `cluster` и `clusterAllReplicas` менее оптимальное чем создание таблицы типа `Distributed`, поскольку в этом случае соединение с сервером переустанавливается на каждый запрос. При обработке большого количества запросов, всегда создавайте `Distributed` таблицу заранее и не используйте табличные функции `cluster` и `clusterAllReplicas`.
|
Использование табличных функций `cluster` и `clusterAllReplicas` менее оптимально, чем создание таблицы типа `Distributed`, поскольку в этом случае при каждом новом запросе устанавливается новое соединение с сервером. При обработке большого количества запросов всегда создавайте `Distributed` таблицу заранее и не используйте табличные функции `cluster` и `clusterAllReplicas`.
|
||||||
|
|
||||||
Табличные функции `cluster` and `clusterAllReplicas` могут быть полезны в следующих случаях:
|
Табличные функции `cluster` and `clusterAllReplicas` могут быть полезны в следующих случаях:
|
||||||
|
|
||||||
@ -30,7 +52,7 @@ clusterAllReplicas('cluster_name', db, table)
|
|||||||
|
|
||||||
Настройки соединения `user`, `password`, `host`, `post`, `compression`, `secure` берутся из секции `<remote_servers>` файлов конфигурации. См. подробности в разделе [Distributed](../../engines/table-engines/special/distributed.md)
|
Настройки соединения `user`, `password`, `host`, `post`, `compression`, `secure` берутся из секции `<remote_servers>` файлов конфигурации. См. подробности в разделе [Distributed](../../engines/table-engines/special/distributed.md)
|
||||||
|
|
||||||
**See Also**
|
**См. также**
|
||||||
|
|
||||||
- [skip_unavailable_shards](../../operations/settings/settings.md#settings-skip_unavailable_shards)
|
- [skip_unavailable_shards](../../operations/settings/settings.md#settings-skip_unavailable_shards)
|
||||||
- [load_balancing](../../operations/settings/settings.md#settings-load_balancing)
|
- [load_balancing](../../operations/settings/settings.md#settings-load_balancing)
|
||||||
|
45
docs/ru/sql-reference/table-functions/sqlite.md
Normal file
45
docs/ru/sql-reference/table-functions/sqlite.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
toc_priority: 55
|
||||||
|
toc_title: sqlite
|
||||||
|
---
|
||||||
|
|
||||||
|
## sqlite {#sqlite}
|
||||||
|
|
||||||
|
Позволяет выполнять запросы к данным, хранящимся в базе данных [SQLite](../../engines/database-engines/sqlite.md).
|
||||||
|
|
||||||
|
**Синтаксис**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
sqlite('db_path', 'table_name')
|
||||||
|
```
|
||||||
|
|
||||||
|
**Аргументы**
|
||||||
|
|
||||||
|
- `db_path` — путь к файлу с базой данных SQLite. [String](../../sql-reference/data-types/string.md).
|
||||||
|
- `table_name` — имя таблицы в базе данных SQLite. [String](../../sql-reference/data-types/string.md).
|
||||||
|
|
||||||
|
**Возвращаемое значение**
|
||||||
|
|
||||||
|
- Объект таблицы с теми же столбцами, что и в исходной таблице `SQLite`.
|
||||||
|
|
||||||
|
**Пример**
|
||||||
|
|
||||||
|
Запрос:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2;
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─col1──┬─col2─┐
|
||||||
|
│ line1 │ 1 │
|
||||||
|
│ line2 │ 2 │
|
||||||
|
│ line3 │ 3 │
|
||||||
|
└───────┴──────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**См. также**
|
||||||
|
|
||||||
|
- [SQLite](../../engines/table-engines/integrations/sqlite.md) движок таблиц
|
@ -38,13 +38,13 @@ ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
|
|||||||
| BIGINT | [Int64](../../sql-reference/data-types/int-uint.md) |
|
| BIGINT | [Int64](../../sql-reference/data-types/int-uint.md) |
|
||||||
| FLOAT | [Float32](../../sql-reference/data-types/float.md) |
|
| FLOAT | [Float32](../../sql-reference/data-types/float.md) |
|
||||||
| DOUBLE | [Float64](../../sql-reference/data-types/float.md) |
|
| DOUBLE | [Float64](../../sql-reference/data-types/float.md) |
|
||||||
| DATE | [日期](../../sql-reference/data-types/date.md) |
|
| DATE | [Date](../../sql-reference/data-types/date.md) |
|
||||||
| DATETIME, TIMESTAMP | [日期时间](../../sql-reference/data-types/datetime.md) |
|
| DATETIME, TIMESTAMP | [DateTime](../../sql-reference/data-types/datetime.md) |
|
||||||
| BINARY | [固定字符串](../../sql-reference/data-types/fixedstring.md) |
|
| BINARY | [FixedString](../../sql-reference/data-types/fixedstring.md) |
|
||||||
|
|
||||||
其他的MySQL数据类型将全部都转换为[字符串](../../sql-reference/data-types/string.md)。
|
其他的MySQL数据类型将全部都转换为[String](../../sql-reference/data-types/string.md)。
|
||||||
|
|
||||||
同时以上的所有类型都支持[可为空](../../sql-reference/data-types/nullable.md)。
|
同时以上的所有类型都支持[Nullable](../../sql-reference/data-types/nullable.md)。
|
||||||
|
|
||||||
## 使用示例 {#shi-yong-shi-li}
|
## 使用示例 {#shi-yong-shi-li}
|
||||||
|
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
---
|
---
|
||||||
machine_translated: true
|
|
||||||
machine_translated_rev: 72537a2d527c63c07aa5d2361a8829f3895cf2bd
|
|
||||||
toc_priority: 49
|
toc_priority: 49
|
||||||
toc_title: "\u6570\u636E\u5907\u4EFD"
|
toc_title: "\u6570\u636E\u5907\u4EFD"
|
||||||
---
|
---
|
||||||
|
|
||||||
# 数据备份 {#data-backup}
|
# 数据备份 {#data-backup}
|
||||||
|
|
||||||
尽管 [副本] (../engines/table-engines/mergetree-family/replication.md) 可以提供针对硬件的错误防护, 但是它不能预防人为操作失误: 数据的意外删除, 错误表的删除或者错误集群上表的删除, 以及导致错误数据处理或者数据损坏的软件bug. 在很多案例中,这类意外可能会影响所有的副本. ClickHouse 有内置的保护措施可以预防一些错误 — 例如, 默认情况下 [不能人工删除使用带有MergeTree引擎且包含超过50Gb数据的表] (server-configuration-parameters/settings.md#max-table-size-to-drop). 但是,这些保护措施不能覆盖所有可能情况,并且这些措施可以被绕过。
|
尽管 [副本](../engines/table-engines/mergetree-family/replication.md) 可以提供针对硬件的错误防护, 但是它不能预防人为操作失误: 数据的意外删除, 错误表的删除或者错误集群上表的删除, 以及导致错误数据处理或者数据损坏的软件bug. 在很多案例中,这类意外可能会影响所有的副本. ClickHouse 有内置的保护措施可以预防一些错误 — 例如, 默认情况下 [不能人工删除使用带有MergeTree引擎且包含超过50Gb数据的表](server-configuration-parameters/settings.md#max-table-size-to-drop). 但是,这些保护措施不能覆盖所有可能情况,并且这些措施可以被绕过。
|
||||||
|
|
||||||
为了有效地减少可能的人为错误,您应该 **提前** 仔细的准备备份和数据还原的策略.
|
为了有效地减少可能的人为错误,您应该 **提前** 仔细的准备备份和数据还原的策略.
|
||||||
|
|
||||||
@ -18,26 +16,26 @@ toc_title: "\u6570\u636E\u5907\u4EFD"
|
|||||||
|
|
||||||
## 将源数据复制到其它地方 {#duplicating-source-data-somewhere-else}
|
## 将源数据复制到其它地方 {#duplicating-source-data-somewhere-else}
|
||||||
|
|
||||||
通常摄入到ClickHouse的数据是通过某种持久队列传递的,例如 [Apache Kafka] (https://kafka.apache.org). 在这种情况下,可以配置一组额外的订阅服务器,这些订阅服务器将在写入ClickHouse时读取相同的数据流,并将其存储在冷存储中。 大多数公司已经有一些默认推荐的冷存储,可能是对象存储或分布式文件系统,如 [HDFS] (https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html).
|
通常摄入到ClickHouse的数据是通过某种持久队列传递的,例如 [Apache Kafka](https://kafka.apache.org). 在这种情况下,可以配置一组额外的订阅服务器,这些订阅服务器将在写入ClickHouse时读取相同的数据流,并将其存储在冷存储中。 大多数公司已经有一些默认推荐的冷存储,可能是对象存储或分布式文件系统,如 [HDFS](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html).
|
||||||
|
|
||||||
## 文件系统快照 {#filesystem-snapshots}
|
## 文件系统快照 {#filesystem-snapshots}
|
||||||
|
|
||||||
某些本地文件系统提供快照功能(例如, [ZFS] (https://en.wikipedia.org/wiki/ZFS)),但它们可能不是提供实时查询的最佳选择。 一个可能的解决方案是使用这种文件系统创建额外的副本,并将它们与用于`SELECT` 查询的 [分布式] (../engines/table-engines/special/distributed.md) 表分离。 任何修改数据的查询都无法访问此类副本上的快照。 作为回报,这些副本可能具有特殊的硬件配置,每个服务器附加更多的磁盘,这将是经济高效的。
|
某些本地文件系统提供快照功能(例如, [ZFS](https://en.wikipedia.org/wiki/ZFS)),但它们可能不是提供实时查询的最佳选择。 一个可能的解决方案是使用这种文件系统创建额外的副本,并将它们与用于`SELECT` 查询的 [分布式](../engines/table-engines/special/distributed.md) 表分离。 任何修改数据的查询都无法访问此类副本上的快照。 作为回报,这些副本可能具有特殊的硬件配置,每个服务器附加更多的磁盘,这将是经济高效的。
|
||||||
|
|
||||||
## clickhouse-copier {#clickhouse-copier}
|
## clickhouse-copier {#clickhouse-copier}
|
||||||
|
|
||||||
[clickhouse-copier] (utilities/clickhouse-copier.md) 是一个多功能工具,最初创建它是为了用于重新切分pb大小的表。 因为它能够在ClickHouse表和集群之间可靠地复制数据,所以它也可用于备份和还原数据。
|
[clickhouse-copier](utilities/clickhouse-copier.md) 是一个多功能工具,最初创建它是为了用于重新切分pb大小的表。 因为它能够在ClickHouse表和集群之间可靠地复制数据,所以它也可用于备份和还原数据。
|
||||||
|
|
||||||
对于较小的数据量,一个简单的 `INSERT INTO ... SELECT ...` 到远程表也可以工作。
|
对于较小的数据量,一个简单的 `INSERT INTO ... SELECT ...` 到远程表也可以工作。
|
||||||
|
|
||||||
## part操作 {#manipulations-with-parts}
|
## part操作 {#manipulations-with-parts}
|
||||||
|
|
||||||
ClickHouse允许使用 `ALTER TABLE ... FREEZE PARTITION ...` 查询以创建表分区的本地副本。 这是利用硬链接(hardlink)到 `/var/lib/clickhouse/shadow/` 文件夹中实现的,所以它通常不会因为旧数据而占用额外的磁盘空间。 创建的文件副本不由ClickHouse服务器处理,所以你可以把它们留在那里:你将有一个简单的备份,不需要任何额外的外部系统,但它仍然容易出现硬件问题。 出于这个原因,最好将它们远程复制到另一个位置,然后删除本地副本。 分布式文件系统和对象存储仍然是一个不错的选择,但是具有足够大容量的正常附加文件服务器也可以工作(在这种情况下,传输将通过网络文件系统或者也许是 [rsync] (https://en.wikipedia.org/wiki/Rsync) 来进行).
|
ClickHouse允许使用 `ALTER TABLE ... FREEZE PARTITION ...` 查询以创建表分区的本地副本。 这是利用硬链接(hardlink)到 `/var/lib/clickhouse/shadow/` 文件夹中实现的,所以它通常不会因为旧数据而占用额外的磁盘空间。 创建的文件副本不由ClickHouse服务器处理,所以你可以把它们留在那里:你将有一个简单的备份,不需要任何额外的外部系统,但它仍然容易出现硬件问题。 出于这个原因,最好将它们远程复制到另一个位置,然后删除本地副本。 分布式文件系统和对象存储仍然是一个不错的选择,但是具有足够大容量的正常附加文件服务器也可以工作(在这种情况下,传输将通过网络文件系统或者也许是 [rsync](https://en.wikipedia.org/wiki/Rsync) 来进行).
|
||||||
|
|
||||||
数据可以使用 `ALTER TABLE ... ATTACH PARTITION ...` 从备份中恢复。
|
数据可以使用 `ALTER TABLE ... ATTACH PARTITION ...` 从备份中恢复。
|
||||||
|
|
||||||
有关与分区操作相关的查询的详细信息,请参阅 [更改文档] (../sql-reference/statements/alter.md#alter_manipulations-with-partitions).
|
有关与分区操作相关的查询的详细信息,请参阅 [更改文档](../sql-reference/statements/alter.md#alter_manipulations-with-partitions).
|
||||||
|
|
||||||
第三方工具可用于自动化此方法: [clickhouse-backup] (https://github.com/AlexAkulov/clickhouse-backup).
|
第三方工具可用于自动化此方法: [clickhouse-backup](https://github.com/AlexAkulov/clickhouse-backup).
|
||||||
|
|
||||||
[原始文章] (https://clickhouse.tech/docs/en/operations/backup/) <!--hide-->
|
[原始文章](https://clickhouse.tech/docs/en/operations/backup/) <!--hide-->
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
---
|
|
||||||
machine_translated: true
|
|
||||||
machine_translated_rev: 5decc73b5dc60054f19087d3690c4eb99446a6c3
|
|
||||||
---
|
|
||||||
|
|
||||||
# 系统。data_type_families {#system_tables-data_type_families}
|
# system.data_type_families {#system_tables-data_type_families}
|
||||||
|
|
||||||
包含有关受支持的[数据类型](../../sql-reference/data-types/)的信息.
|
包含有关受支持的[数据类型](../../sql-reference/data-types/)的信息.
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ toc_title: "常见问题"
|
|||||||
|
|
||||||
### 服务器未运行 {#server-is-not-running}
|
### 服务器未运行 {#server-is-not-running}
|
||||||
|
|
||||||
**检查服务器是否运行nnig**
|
**检查服务器是否正在运行**
|
||||||
|
|
||||||
命令:
|
命令:
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# 功能与Yandex的工作。梅特里卡词典 {#functions-for-working-with-yandex-metrica-dictionaries}
|
# 使用 Yandex.Metrica 字典函数 {#functions-for-working-with-yandex-metrica-dictionaries}
|
||||||
|
|
||||||
为了使下面的功能正常工作,服务器配置必须指定获取所有Yandex的路径和地址。梅特里卡字典. 字典在任何这些函数的第一次调用时加载。 如果无法加载引用列表,则会引发异常。
|
为了使下面的功能正常工作,服务器配置必须指定获取所有 Yandex.Metrica 字典的路径和地址。Yandex.Metrica 字典在任何这些函数的第一次调用时加载。 如果无法加载引用列表,则会引发异常。
|
||||||
|
|
||||||
For information about creating reference lists, see the section «Dictionaries».
|
有关创建引用列表的信息,请参阅 «字典» 部分.
|
||||||
|
|
||||||
## 多个地理基 {#multiple-geobases}
|
## 多个地理基 {#multiple-geobases}
|
||||||
|
|
||||||
@ -17,18 +17,18 @@ ClickHouse支持同时使用多个备选地理基(区域层次结构),以
|
|||||||
|
|
||||||
所有字典都在运行时重新加载(每隔一定数量的秒重新加载一次,如builtin_dictionaries_reload_interval config参数中定义,或默认情况下每小时一次)。 但是,可用字典列表在服务器启动时定义一次。
|
所有字典都在运行时重新加载(每隔一定数量的秒重新加载一次,如builtin_dictionaries_reload_interval config参数中定义,或默认情况下每小时一次)。 但是,可用字典列表在服务器启动时定义一次。
|
||||||
|
|
||||||
All functions for working with regions have an optional argument at the end – the dictionary key. It is referred to as the geobase.
|
所有处理区域的函数都在末尾有一个可选参数—字典键。它被称为地基。
|
||||||
示例:
|
示例:
|
||||||
|
|
||||||
regionToCountry(RegionID) – Uses the default dictionary: /opt/geo/regions_hierarchy.txt
|
regionToCountry(RegionID) – 使用默认路径: /opt/geo/regions_hierarchy.txt
|
||||||
regionToCountry(RegionID, '') – Uses the default dictionary: /opt/geo/regions_hierarchy.txt
|
regionToCountry(RegionID, '') – 使用默认路径: /opt/geo/regions_hierarchy.txt
|
||||||
regionToCountry(RegionID, 'ua') – Uses the dictionary for the 'ua' key: /opt/geo/regions_hierarchy_ua.txt
|
regionToCountry(RegionID, 'ua') – 使用字典中的'ua' 键: /opt/geo/regions_hierarchy_ua.txt
|
||||||
|
|
||||||
### ツ环板(ョツ嘉ッツ偲青regionシツ氾カツ鉄ツ工ツ渉\]) {#regiontocityid-geobase}
|
### 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.
|
从 Yandex geobase 接收一个 UInt32 数字类型的区域ID 。如果该区域是一个城市或城市的一部分,它将返回相应城市的区域ID。否则,返回0。
|
||||||
|
|
||||||
### 虏茅驴麓卤戮碌禄路戮鲁拢\]) {#regiontoareaid-geobase}
|
### regionToArea(id[, geobase]) {#regiontoareaid-geobase}
|
||||||
|
|
||||||
将区域转换为区域(地理数据库中的类型5)。 在所有其他方式,这个功能是一样的 ‘regionToCity’.
|
将区域转换为区域(地理数据库中的类型5)。 在所有其他方式,这个功能是一样的 ‘regionToCity’.
|
||||||
|
|
||||||
@ -84,36 +84,58 @@ LIMIT 15
|
|||||||
│ Federation of Bosnia and Herzegovina │
|
│ Federation of Bosnia and Herzegovina │
|
||||||
└──────────────────────────────────────────────────────────┘
|
└──────────────────────────────────────────────────────────┘
|
||||||
|
|
||||||
### 虏茅驴麓卤戮碌禄路戮鲁拢(陆毛隆隆(803)888-8325\]) {#regiontocountryid-geobase}
|
### regionToCountry(id[, geobase]) {#regiontocountryid-geobase}
|
||||||
|
|
||||||
将区域转换为国家。 在所有其他方式,这个功能是一样的 ‘regionToCity’.
|
将区域转换为国家。 在所有其他方式,这个功能是一样的 ‘regionToCity’.
|
||||||
示例: `regionToCountry(toUInt32(213)) = 225` 转换莫斯科(213)到俄罗斯(225)。
|
示例: `regionToCountry(toUInt32(213)) = 225` 转换莫斯科(213)到俄罗斯(225)。
|
||||||
|
|
||||||
### 掳胫((禄脢鹿脷露胫鲁隆鹿((酶-11-16""\[脪陆,ase\]) {#regiontocontinentid-geobase}
|
### regionToContinent(id[, geobase]) {#regiontocontinentid-geobase}
|
||||||
|
|
||||||
将区域转换为大陆。 在所有其他方式,这个功能是一样的 ‘regionToCity’.
|
将区域转换为大陆。 在所有其他方式,这个功能是一样的 ‘regionToCity’.
|
||||||
示例: `regionToContinent(toUInt32(213)) = 10001` 将莫斯科(213)转换为欧亚大陆(10001)。
|
示例: `regionToContinent(toUInt32(213)) = 10001` 将莫斯科(213)转换为欧亚大陆(10001)。
|
||||||
|
|
||||||
### ツ环板(ョツ嘉ッツ偲青regionャツ静ャツ青サツ催ャツ渉\]) {#regiontopopulationid-geobase}
|
### regionToTopContinent (#regiontotopcontinent) {#regiontotopcontinent-regiontotopcontinent}
|
||||||
|
|
||||||
|
查找该区域层次结构中最高的大陆。
|
||||||
|
|
||||||
|
**语法**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
regionToTopContinent(id[, geobase])
|
||||||
|
```
|
||||||
|
|
||||||
|
**参数**
|
||||||
|
|
||||||
|
- `id` — Yandex geobase 的区域 ID. [UInt32](../../sql-reference/data-types/int-uint.md).
|
||||||
|
- `geobase` — 字典的建. 参阅 [Multiple Geobases](#multiple-geobases). [String](../../sql-reference/data-types/string.md). 可选.
|
||||||
|
|
||||||
|
**返回值**
|
||||||
|
|
||||||
|
- 顶级大陆的标识符(当您在区域层次结构中攀爬时,是后者)。
|
||||||
|
- 0,如果没有。
|
||||||
|
|
||||||
|
类型: `UInt32`.
|
||||||
|
|
||||||
|
### regionToPopulation(id\[, geobase\]) {#regiontopopulationid-geobase}
|
||||||
|
|
||||||
获取区域的人口。
|
获取区域的人口。
|
||||||
The population can be recorded in files with the geobase. See the section «External dictionaries».
|
人口可以记录在文件与地球基。请参阅«外部词典»部分。
|
||||||
如果没有为该区域记录人口,则返回0。
|
如果没有为该区域记录人口,则返回0。
|
||||||
在Yandex地理数据库中,可能会为子区域记录人口,但不会为父区域记录人口。
|
在Yandex地理数据库中,可能会为子区域记录人口,但不会为父区域记录人口。
|
||||||
|
|
||||||
### regionIn(lhs,rhs\[,地理数据库\]) {#regioninlhs-rhs-geobase}
|
### regionIn(lhs,rhs\[,地理数据库\]) {#regioninlhs-rhs-geobase}
|
||||||
|
|
||||||
检查是否 ‘lhs’ 属于一个区域 ‘rhs’ 区域。 如果属于UInt8,则返回等于1的数字,如果不属于则返回0。
|
检查是否 ‘lhs’ 属于一个区域 ‘rhs’ 区域。 如果属于UInt8,则返回等于1的数字,如果不属于则返回0。
|
||||||
The relationship is reflexive – any region also belongs to itself.
|
这种关系是反射的——任何地区也属于自己。
|
||||||
|
|
||||||
### ツ暗ェツ氾环催ツ団ツ法ツ人\]) {#regionhierarchyid-geobase}
|
### 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.
|
从 Yandex geobase 接收一个 UInt32 数字类型的区域ID。返回一个区域ID数组,由传递的区域和链上的所有父节点组成。
|
||||||
示例: `regionHierarchy(toUInt32(213)) = [213,1,3,225,10001,10000]`.
|
示例: `regionHierarchy(toUInt32(213)) = [213,1,3,225,10001,10000]`.
|
||||||
|
|
||||||
### 地区名称(id\[,郎\]) {#regiontonameid-lang}
|
### 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.
|
从 Yandex geobase 接收一个 UInt32 数字类型的区域ID。带有语言名称的字符串可以作为第二个参数传递。支持的语言有:ru, en, ua, uk, by, kz, tr。如果省略第二个参数,则使用' ru '语言。如果不支持该语言,则抛出异常。返回一个字符串-对应语言的区域名称。如果指定ID的区域不存在,则返回一个空字符串。
|
||||||
|
|
||||||
`ua` 和 `uk` 都意味着乌克兰。
|
`ua` 和 `uk` 都意味着乌克兰。
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ set (CLICKHOUSE_CLIENT_SOURCES
|
|||||||
ConnectionParameters.cpp
|
ConnectionParameters.cpp
|
||||||
QueryFuzzer.cpp
|
QueryFuzzer.cpp
|
||||||
Suggest.cpp
|
Suggest.cpp
|
||||||
|
TestHint.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set (CLICKHOUSE_CLIENT_LINK
|
set (CLICKHOUSE_CLIENT_LINK
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "Common/MemoryTracker.h"
|
#include "Common/MemoryTracker.h"
|
||||||
#include "Columns/ColumnsNumber.h"
|
#include "Columns/ColumnsNumber.h"
|
||||||
#include "ConnectionParameters.h"
|
#include "ConnectionParameters.h"
|
||||||
|
#include "IO/CompressionMethod.h"
|
||||||
#include "QueryFuzzer.h"
|
#include "QueryFuzzer.h"
|
||||||
#include "Suggest.h"
|
#include "Suggest.h"
|
||||||
#include "TestHint.h"
|
#include "TestHint.h"
|
||||||
@ -128,6 +129,7 @@ namespace ErrorCodes
|
|||||||
extern const int UNRECOGNIZED_ARGUMENTS;
|
extern const int UNRECOGNIZED_ARGUMENTS;
|
||||||
extern const int SYNTAX_ERROR;
|
extern const int SYNTAX_ERROR;
|
||||||
extern const int TOO_DEEP_RECURSION;
|
extern const int TOO_DEEP_RECURSION;
|
||||||
|
extern const int AUTHENTICATION_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -772,31 +774,50 @@ private:
|
|||||||
<< connection_parameters.host << ":" << connection_parameters.port
|
<< connection_parameters.host << ":" << connection_parameters.port
|
||||||
<< (!connection_parameters.user.empty() ? " as user " + connection_parameters.user : "") << "." << std::endl;
|
<< (!connection_parameters.user.empty() ? " as user " + connection_parameters.user : "") << "." << std::endl;
|
||||||
|
|
||||||
connection = std::make_unique<Connection>(
|
|
||||||
connection_parameters.host,
|
|
||||||
connection_parameters.port,
|
|
||||||
connection_parameters.default_database,
|
|
||||||
connection_parameters.user,
|
|
||||||
connection_parameters.password,
|
|
||||||
"", /* cluster */
|
|
||||||
"", /* cluster_secret */
|
|
||||||
"client",
|
|
||||||
connection_parameters.compression,
|
|
||||||
connection_parameters.security);
|
|
||||||
|
|
||||||
String server_name;
|
String server_name;
|
||||||
UInt64 server_version_major = 0;
|
UInt64 server_version_major = 0;
|
||||||
UInt64 server_version_minor = 0;
|
UInt64 server_version_minor = 0;
|
||||||
UInt64 server_version_patch = 0;
|
UInt64 server_version_patch = 0;
|
||||||
|
|
||||||
if (max_client_network_bandwidth)
|
try
|
||||||
{
|
{
|
||||||
ThrottlerPtr throttler = std::make_shared<Throttler>(max_client_network_bandwidth, 0, "");
|
connection = std::make_unique<Connection>(
|
||||||
connection->setThrottler(throttler);
|
connection_parameters.host,
|
||||||
}
|
connection_parameters.port,
|
||||||
|
connection_parameters.default_database,
|
||||||
|
connection_parameters.user,
|
||||||
|
connection_parameters.password,
|
||||||
|
"", /* cluster */
|
||||||
|
"", /* cluster_secret */
|
||||||
|
"client",
|
||||||
|
connection_parameters.compression,
|
||||||
|
connection_parameters.security);
|
||||||
|
|
||||||
connection->getServerVersion(
|
if (max_client_network_bandwidth)
|
||||||
connection_parameters.timeouts, server_name, server_version_major, server_version_minor, server_version_patch, server_revision);
|
{
|
||||||
|
ThrottlerPtr throttler = std::make_shared<Throttler>(max_client_network_bandwidth, 0, "");
|
||||||
|
connection->setThrottler(throttler);
|
||||||
|
}
|
||||||
|
|
||||||
|
connection->getServerVersion(
|
||||||
|
connection_parameters.timeouts, server_name, server_version_major, server_version_minor, server_version_patch, server_revision);
|
||||||
|
}
|
||||||
|
catch (const Exception & e)
|
||||||
|
{
|
||||||
|
/// It is typical when users install ClickHouse, type some password and instantly forget it.
|
||||||
|
if ((connection_parameters.user.empty() || connection_parameters.user == "default")
|
||||||
|
&& e.code() == DB::ErrorCodes::AUTHENTICATION_FAILED)
|
||||||
|
{
|
||||||
|
std::cerr << std::endl
|
||||||
|
<< "If you have installed ClickHouse and forgot password you can reset it in the configuration file." << std::endl
|
||||||
|
<< "The password for default user is typically located at /etc/clickhouse-server/users.d/default-password.xml" << std::endl
|
||||||
|
<< "and deleting this file will reset the password." << std::endl
|
||||||
|
<< "See also /etc/clickhouse-server/users.xml on the server where ClickHouse is installed." << std::endl
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
server_version = toString(server_version_major) + "." + toString(server_version_minor) + "." + toString(server_version_patch);
|
server_version = toString(server_version_major) + "." + toString(server_version_minor) + "." + toString(server_version_patch);
|
||||||
|
|
||||||
@ -1823,7 +1844,7 @@ private:
|
|||||||
void processInsertQuery()
|
void processInsertQuery()
|
||||||
{
|
{
|
||||||
const auto parsed_insert_query = parsed_query->as<ASTInsertQuery &>();
|
const auto parsed_insert_query = parsed_query->as<ASTInsertQuery &>();
|
||||||
if (!parsed_insert_query.data && (is_interactive || (!stdin_is_a_tty && std_in.eof())))
|
if ((!parsed_insert_query.data && !parsed_insert_query.infile) && (is_interactive || (!stdin_is_a_tty && std_in.eof())))
|
||||||
throw Exception("No data to insert", ErrorCodes::NO_DATA_TO_INSERT);
|
throw Exception("No data to insert", ErrorCodes::NO_DATA_TO_INSERT);
|
||||||
|
|
||||||
connection->sendQuery(
|
connection->sendQuery(
|
||||||
@ -1894,7 +1915,24 @@ private:
|
|||||||
if (!parsed_insert_query)
|
if (!parsed_insert_query)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (parsed_insert_query->data)
|
if (parsed_insert_query->infile)
|
||||||
|
{
|
||||||
|
const auto & in_file_node = parsed_insert_query->infile->as<ASTLiteral &>();
|
||||||
|
const auto in_file = in_file_node.value.safeGet<std::string>();
|
||||||
|
|
||||||
|
auto in_buffer = wrapReadBufferWithCompressionMethod(std::make_unique<ReadBufferFromFile>(in_file), chooseCompressionMethod(in_file, ""));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
sendDataFrom(*in_buffer, sample, columns_description);
|
||||||
|
}
|
||||||
|
catch (Exception & e)
|
||||||
|
{
|
||||||
|
e.addMessage("data for INSERT was parsed from file");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (parsed_insert_query->data)
|
||||||
{
|
{
|
||||||
/// Send data contained in the query.
|
/// Send data contained in the query.
|
||||||
ReadBufferFromMemory data_in(parsed_insert_query->data, parsed_insert_query->end - parsed_insert_query->data);
|
ReadBufferFromMemory data_in(parsed_insert_query->data, parsed_insert_query->end - parsed_insert_query->data);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user