mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-17 03:42:48 +00:00
Merge branch 'master' into nickitat-patch-11
This commit is contained in:
commit
98da0ddc2f
@ -21,7 +21,7 @@
|
|||||||
* Added `Overlay` database engine to combine multiple databases into one. Added `Filesystem` database engine to represent a directory in the filesystem as a set of implicitly available tables with auto-detected formats and structures. A new `S3` database engine allows to read-only interact with s3 storage by representing a prefix as a set of tables. A new `HDFS` database engine allows to interact with HDFS storage in the same way. [#48821](https://github.com/ClickHouse/ClickHouse/pull/48821) ([alekseygolub](https://github.com/alekseygolub)).
|
* Added `Overlay` database engine to combine multiple databases into one. Added `Filesystem` database engine to represent a directory in the filesystem as a set of implicitly available tables with auto-detected formats and structures. A new `S3` database engine allows to read-only interact with s3 storage by representing a prefix as a set of tables. A new `HDFS` database engine allows to interact with HDFS storage in the same way. [#48821](https://github.com/ClickHouse/ClickHouse/pull/48821) ([alekseygolub](https://github.com/alekseygolub)).
|
||||||
* The function `transform` as well as `CASE` with value matching started to support all data types. This closes [#29730](https://github.com/ClickHouse/ClickHouse/issues/29730). This closes [#32387](https://github.com/ClickHouse/ClickHouse/issues/32387). This closes [#50827](https://github.com/ClickHouse/ClickHouse/issues/50827). This closes [#31336](https://github.com/ClickHouse/ClickHouse/issues/31336). This closes [#40493](https://github.com/ClickHouse/ClickHouse/issues/40493). [#51351](https://github.com/ClickHouse/ClickHouse/pull/51351) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
* The function `transform` as well as `CASE` with value matching started to support all data types. This closes [#29730](https://github.com/ClickHouse/ClickHouse/issues/29730). This closes [#32387](https://github.com/ClickHouse/ClickHouse/issues/32387). This closes [#50827](https://github.com/ClickHouse/ClickHouse/issues/50827). This closes [#31336](https://github.com/ClickHouse/ClickHouse/issues/31336). This closes [#40493](https://github.com/ClickHouse/ClickHouse/issues/40493). [#51351](https://github.com/ClickHouse/ClickHouse/pull/51351) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
* Added option `--rename_files_after_processing <pattern>`. This closes [#34207](https://github.com/ClickHouse/ClickHouse/issues/34207). [#49626](https://github.com/ClickHouse/ClickHouse/pull/49626) ([alekseygolub](https://github.com/alekseygolub)).
|
* Added option `--rename_files_after_processing <pattern>`. This closes [#34207](https://github.com/ClickHouse/ClickHouse/issues/34207). [#49626](https://github.com/ClickHouse/ClickHouse/pull/49626) ([alekseygolub](https://github.com/alekseygolub)).
|
||||||
* Add support for `APPEND` modifier in `INTO OUTFILE` clause. Suggest using `APPEND` or `TRUNCATE` for `INTO OUTFILE` when file exists. [#50950](https://github.com/ClickHouse/ClickHouse/pull/50950) ([alekar](https://github.com/alekar)).
|
* Add support for `TRUNCATE` modifier in `INTO OUTFILE` clause. Suggest using `APPEND` or `TRUNCATE` for `INTO OUTFILE` when file exists. [#50950](https://github.com/ClickHouse/ClickHouse/pull/50950) ([alekar](https://github.com/alekar)).
|
||||||
* Add table engine `Redis` and table function `redis`. It allows querying external Redis servers. [#50150](https://github.com/ClickHouse/ClickHouse/pull/50150) ([JackyWoo](https://github.com/JackyWoo)).
|
* Add table engine `Redis` and table function `redis`. It allows querying external Redis servers. [#50150](https://github.com/ClickHouse/ClickHouse/pull/50150) ([JackyWoo](https://github.com/JackyWoo)).
|
||||||
* Allow to skip empty files in file/s3/url/hdfs table functions using settings `s3_skip_empty_files`, `hdfs_skip_empty_files`, `engine_file_skip_empty_files`, `engine_url_skip_empty_files`. [#50364](https://github.com/ClickHouse/ClickHouse/pull/50364) ([Kruglov Pavel](https://github.com/Avogar)).
|
* Allow to skip empty files in file/s3/url/hdfs table functions using settings `s3_skip_empty_files`, `hdfs_skip_empty_files`, `engine_file_skip_empty_files`, `engine_url_skip_empty_files`. [#50364](https://github.com/ClickHouse/ClickHouse/pull/50364) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
* Add a new setting named `use_mysql_types_in_show_columns` to alter the `SHOW COLUMNS` SQL statement to display MySQL equivalent types when a client is connected via the MySQL compatibility port. [#49577](https://github.com/ClickHouse/ClickHouse/pull/49577) ([Thomas Panetti](https://github.com/tpanetti)).
|
* Add a new setting named `use_mysql_types_in_show_columns` to alter the `SHOW COLUMNS` SQL statement to display MySQL equivalent types when a client is connected via the MySQL compatibility port. [#49577](https://github.com/ClickHouse/ClickHouse/pull/49577) ([Thomas Panetti](https://github.com/tpanetti)).
|
||||||
@ -40,12 +40,12 @@
|
|||||||
* Make multiple list requests to ZooKeeper in parallel to speed up reading from system.zookeeper table. [#51042](https://github.com/ClickHouse/ClickHouse/pull/51042) ([Alexander Gololobov](https://github.com/davenger)).
|
* Make multiple list requests to ZooKeeper in parallel to speed up reading from system.zookeeper table. [#51042](https://github.com/ClickHouse/ClickHouse/pull/51042) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
* Speedup initialization of DateTime lookup tables for time zones. This should reduce startup/connect time of clickhouse-client especially in debug build as it is rather heavy. [#51347](https://github.com/ClickHouse/ClickHouse/pull/51347) ([Alexander Gololobov](https://github.com/davenger)).
|
* Speedup initialization of DateTime lookup tables for time zones. This should reduce startup/connect time of clickhouse-client especially in debug build as it is rather heavy. [#51347](https://github.com/ClickHouse/ClickHouse/pull/51347) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
* Fix data lakes slowness because of synchronous head requests. (Related to Iceberg/Deltalake/Hudi being slow with a lot of files). [#50976](https://github.com/ClickHouse/ClickHouse/pull/50976) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
* Fix data lakes slowness because of synchronous head requests. (Related to Iceberg/Deltalake/Hudi being slow with a lot of files). [#50976](https://github.com/ClickHouse/ClickHouse/pull/50976) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
* Do not replicate `ALTER PARTITION` queries and mutations through `Replicated` database if it has only one shard and the underlying table is `ReplicatedMergeTree`. [#51049](https://github.com/ClickHouse/ClickHouse/pull/51049) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
|
||||||
* Do not read all the columns from right GLOBAL JOIN table. [#50721](https://github.com/ClickHouse/ClickHouse/pull/50721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
* Do not read all the columns from right GLOBAL JOIN table. [#50721](https://github.com/ClickHouse/ClickHouse/pull/50721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
|
||||||
#### Experimental Feature
|
#### Experimental Feature
|
||||||
* Support parallel replicas with the analyzer. [#50441](https://github.com/ClickHouse/ClickHouse/pull/50441) ([Raúl Marín](https://github.com/Algunenano)).
|
* Support parallel replicas with the analyzer. [#50441](https://github.com/ClickHouse/ClickHouse/pull/50441) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
* Add random sleep before large merges/mutations execution to split load more evenly between replicas in case of zero-copy replication. [#51282](https://github.com/ClickHouse/ClickHouse/pull/51282) ([alesapin](https://github.com/alesapin)).
|
* Add random sleep before large merges/mutations execution to split load more evenly between replicas in case of zero-copy replication. [#51282](https://github.com/ClickHouse/ClickHouse/pull/51282) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Do not replicate `ALTER PARTITION` queries and mutations through `Replicated` database if it has only one shard and the underlying table is `ReplicatedMergeTree`. [#51049](https://github.com/ClickHouse/ClickHouse/pull/51049) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
|
||||||
#### Improvement
|
#### Improvement
|
||||||
* Relax the thresholds for "too many parts" to be more modern. Return the backpressure during long-running insert queries. [#50856](https://github.com/ClickHouse/ClickHouse/pull/50856) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
* Relax the thresholds for "too many parts" to be more modern. Return the backpressure during long-running insert queries. [#50856](https://github.com/ClickHouse/ClickHouse/pull/50856) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
@ -27,6 +27,8 @@ using FromDoubleIntermediateType = long double;
|
|||||||
using FromDoubleIntermediateType = boost::multiprecision::cpp_bin_float_double_extended;
|
using FromDoubleIntermediateType = boost::multiprecision::cpp_bin_float_double_extended;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace CityHash_v1_0_2 { struct uint128; }
|
||||||
|
|
||||||
namespace wide
|
namespace wide
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -281,6 +283,17 @@ struct integer<Bits, Signed>::_impl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename CityHashUInt128 = CityHash_v1_0_2::uint128>
|
||||||
|
constexpr static void wide_integer_from_cityhash_uint128(integer<Bits, Signed> & self, const CityHashUInt128 & value) noexcept
|
||||||
|
{
|
||||||
|
static_assert(sizeof(item_count) >= 2);
|
||||||
|
|
||||||
|
if constexpr (std::endian::native == std::endian::little)
|
||||||
|
wide_integer_from_tuple_like(self, std::make_pair(value.low64, value.high64));
|
||||||
|
else
|
||||||
|
wide_integer_from_tuple_like(self, std::make_pair(value.high64, value.low64));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
@ -1036,6 +1049,8 @@ constexpr integer<Bits, Signed>::integer(T rhs) noexcept
|
|||||||
_impl::wide_integer_from_wide_integer(*this, rhs);
|
_impl::wide_integer_from_wide_integer(*this, rhs);
|
||||||
else if constexpr (IsTupleLike<T>::value)
|
else if constexpr (IsTupleLike<T>::value)
|
||||||
_impl::wide_integer_from_tuple_like(*this, rhs);
|
_impl::wide_integer_from_tuple_like(*this, rhs);
|
||||||
|
else if constexpr (std::is_same_v<std::remove_cvref_t<T>, CityHash_v1_0_2::uint128>)
|
||||||
|
_impl::wide_integer_from_cityhash_uint128(*this, rhs);
|
||||||
else
|
else
|
||||||
_impl::wide_integer_from_builtin(*this, rhs);
|
_impl::wide_integer_from_builtin(*this, rhs);
|
||||||
}
|
}
|
||||||
@ -1051,6 +1066,8 @@ constexpr integer<Bits, Signed>::integer(std::initializer_list<T> il) noexcept
|
|||||||
_impl::wide_integer_from_wide_integer(*this, *il.begin());
|
_impl::wide_integer_from_wide_integer(*this, *il.begin());
|
||||||
else if constexpr (IsTupleLike<T>::value)
|
else if constexpr (IsTupleLike<T>::value)
|
||||||
_impl::wide_integer_from_tuple_like(*this, *il.begin());
|
_impl::wide_integer_from_tuple_like(*this, *il.begin());
|
||||||
|
else if constexpr (std::is_same_v<std::remove_cvref_t<T>, CityHash_v1_0_2::uint128>)
|
||||||
|
_impl::wide_integer_from_cityhash_uint128(*this, *il.begin());
|
||||||
else
|
else
|
||||||
_impl::wide_integer_from_builtin(*this, *il.begin());
|
_impl::wide_integer_from_builtin(*this, *il.begin());
|
||||||
}
|
}
|
||||||
@ -1088,6 +1105,8 @@ constexpr integer<Bits, Signed> & integer<Bits, Signed>::operator=(T rhs) noexce
|
|||||||
{
|
{
|
||||||
if constexpr (IsTupleLike<T>::value)
|
if constexpr (IsTupleLike<T>::value)
|
||||||
_impl::wide_integer_from_tuple_like(*this, rhs);
|
_impl::wide_integer_from_tuple_like(*this, rhs);
|
||||||
|
else if constexpr (std::is_same_v<std::remove_cvref_t<T>, CityHash_v1_0_2::uint128>)
|
||||||
|
_impl::wide_integer_from_cityhash_uint128(*this, rhs);
|
||||||
else
|
else
|
||||||
_impl::wide_integer_from_builtin(*this, rhs);
|
_impl::wide_integer_from_builtin(*this, rhs);
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -61,11 +61,24 @@ namespace CityHash_v1_0_2
|
|||||||
typedef uint8_t uint8;
|
typedef uint8_t uint8;
|
||||||
typedef uint32_t uint32;
|
typedef uint32_t uint32;
|
||||||
typedef uint64_t uint64;
|
typedef uint64_t uint64;
|
||||||
typedef std::pair<uint64, uint64> uint128;
|
|
||||||
|
|
||||||
|
/// Represent an unsigned integer of 128 bits as it's used in CityHash.
|
||||||
|
/// Originally CityHash used `std::pair<uint64, uint64>` instead of this struct,
|
||||||
|
/// however the members `first` and `second` could be easily confused so they were renamed to `low64` and `high64`:
|
||||||
|
/// `first` -> `low64`, `second` -> `high64`.
|
||||||
|
struct uint128
|
||||||
|
{
|
||||||
|
uint64 low64 = 0;
|
||||||
|
uint64 high64 = 0;
|
||||||
|
|
||||||
inline uint64 Uint128Low64(const uint128& x) { return x.first; }
|
uint128() = default;
|
||||||
inline uint64 Uint128High64(const uint128& x) { return x.second; }
|
uint128(uint64 low64_, uint64 high64_) : low64(low64_), high64(high64_) {}
|
||||||
|
friend bool operator ==(const uint128 & x, const uint128 & y) { return (x.low64 == y.low64) && (x.high64 == y.high64); }
|
||||||
|
friend bool operator !=(const uint128 & x, const uint128 & y) { return !(x == y); }
|
||||||
|
};
|
||||||
|
|
||||||
|
inline uint64 Uint128Low64(const uint128 & x) { return x.low64; }
|
||||||
|
inline uint64 Uint128High64(const uint128 & x) { return x.high64; }
|
||||||
|
|
||||||
// Hash function for a byte array.
|
// Hash function for a byte array.
|
||||||
uint64 CityHash64(const char *buf, size_t len);
|
uint64 CityHash64(const char *buf, size_t len);
|
||||||
|
@ -32,7 +32,7 @@ RUN arch=${TARGETARCH:-amd64} \
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
ARG REPOSITORY="https://s3.amazonaws.com/clickhouse-builds/22.4/31c367d3cd3aefd316778601ff6565119fe36682/package_release"
|
ARG REPOSITORY="https://s3.amazonaws.com/clickhouse-builds/22.4/31c367d3cd3aefd316778601ff6565119fe36682/package_release"
|
||||||
ARG VERSION="23.5.3.24"
|
ARG VERSION="23.5.4.25"
|
||||||
ARG PACKAGES="clickhouse-keeper"
|
ARG PACKAGES="clickhouse-keeper"
|
||||||
|
|
||||||
# user/group precreated explicitly with fixed uid/gid on purpose.
|
# user/group precreated explicitly with fixed uid/gid on purpose.
|
||||||
|
@ -33,7 +33,7 @@ RUN arch=${TARGETARCH:-amd64} \
|
|||||||
# lts / testing / prestable / etc
|
# lts / testing / prestable / etc
|
||||||
ARG REPO_CHANNEL="stable"
|
ARG REPO_CHANNEL="stable"
|
||||||
ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}"
|
ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}"
|
||||||
ARG VERSION="23.5.3.24"
|
ARG VERSION="23.5.4.25"
|
||||||
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
||||||
|
|
||||||
# user/group precreated explicitly with fixed uid/gid on purpose.
|
# user/group precreated explicitly with fixed uid/gid on purpose.
|
||||||
|
@ -23,7 +23,7 @@ RUN sed -i "s|http://archive.ubuntu.com|${apt_archive}|g" /etc/apt/sources.list
|
|||||||
|
|
||||||
ARG REPO_CHANNEL="stable"
|
ARG REPO_CHANNEL="stable"
|
||||||
ARG REPOSITORY="deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb ${REPO_CHANNEL} main"
|
ARG REPOSITORY="deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb ${REPO_CHANNEL} main"
|
||||||
ARG VERSION="23.5.3.24"
|
ARG VERSION="23.5.4.25"
|
||||||
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
||||||
|
|
||||||
# set non-empty deb_location_url url to create a docker image
|
# set non-empty deb_location_url url to create a docker image
|
||||||
|
@ -52,6 +52,8 @@ export CLICKHOUSE_TESTS_BASE_CONFIG_DIR=/clickhouse-config
|
|||||||
export CLICKHOUSE_ODBC_BRIDGE_BINARY_PATH=/clickhouse-odbc-bridge
|
export CLICKHOUSE_ODBC_BRIDGE_BINARY_PATH=/clickhouse-odbc-bridge
|
||||||
export CLICKHOUSE_LIBRARY_BRIDGE_BINARY_PATH=/clickhouse-library-bridge
|
export CLICKHOUSE_LIBRARY_BRIDGE_BINARY_PATH=/clickhouse-library-bridge
|
||||||
|
|
||||||
|
export DOCKER_BASE_TAG=${DOCKER_BASE_TAG:=latest}
|
||||||
|
export DOCKER_HELPER_TAG=${DOCKER_HELPER_TAG:=latest}
|
||||||
export DOCKER_MYSQL_GOLANG_CLIENT_TAG=${DOCKER_MYSQL_GOLANG_CLIENT_TAG:=latest}
|
export DOCKER_MYSQL_GOLANG_CLIENT_TAG=${DOCKER_MYSQL_GOLANG_CLIENT_TAG:=latest}
|
||||||
export DOCKER_DOTNET_CLIENT_TAG=${DOCKER_DOTNET_CLIENT_TAG:=latest}
|
export DOCKER_DOTNET_CLIENT_TAG=${DOCKER_DOTNET_CLIENT_TAG:=latest}
|
||||||
export DOCKER_MYSQL_JAVA_CLIENT_TAG=${DOCKER_MYSQL_JAVA_CLIENT_TAG:=latest}
|
export DOCKER_MYSQL_JAVA_CLIENT_TAG=${DOCKER_MYSQL_JAVA_CLIENT_TAG:=latest}
|
||||||
|
31
docs/changelogs/v23.5.4.25-stable.md
Normal file
31
docs/changelogs/v23.5.4.25-stable.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: 2023
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2023 Changelog
|
||||||
|
|
||||||
|
### ClickHouse release v23.5.4.25-stable (190f962abcf) FIXME as compared to v23.5.3.24-stable (76f54616d3b)
|
||||||
|
|
||||||
|
#### Improvement
|
||||||
|
* Backported in [#51235](https://github.com/ClickHouse/ClickHouse/issues/51235): Improve the progress bar for file/s3/hdfs/url table functions by using chunk size from source data and using incremental total size counting in each thread. Fix the progress bar for *Cluster functions. This closes [#47250](https://github.com/ClickHouse/ClickHouse/issues/47250). [#51088](https://github.com/ClickHouse/ClickHouse/pull/51088) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Backported in [#51255](https://github.com/ClickHouse/ClickHouse/issues/51255): Disable cache setting `do_not_evict_index_and_mark_files` (Was enabled in `23.5`). [#51222](https://github.com/ClickHouse/ClickHouse/pull/51222) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
|
||||||
|
#### Build/Testing/Packaging Improvement
|
||||||
|
* Backported in [#51531](https://github.com/ClickHouse/ClickHouse/issues/51531): Split huge `RUN` in Dockerfile into smaller conditional. Install the necessary tools on demand in the same `RUN` layer, and remove them after that. Upgrade the OS only once at the beginning. Use a modern way to check the signed repository. Downgrade the base repo to ubuntu:20.04 to address the issues on older docker versions. Upgrade golang version to address golang vulnerabilities. [#51504](https://github.com/ClickHouse/ClickHouse/pull/51504) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Backported in [#51572](https://github.com/ClickHouse/ClickHouse/issues/51572): This a follow-up for [#51504](https://github.com/ClickHouse/ClickHouse/issues/51504), the cleanup was lost during refactoring. [#51564](https://github.com/ClickHouse/ClickHouse/pull/51564) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
|
||||||
|
#### Bug Fix (user-visible misbehavior in an official stable release)
|
||||||
|
|
||||||
|
* Query Cache: Try to fix bad cast from ColumnConst to ColumnVector<char8_t> [#50704](https://github.com/ClickHouse/ClickHouse/pull/50704) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix type of LDAP server params hash in cache entry [#50865](https://github.com/ClickHouse/ClickHouse/pull/50865) ([Julian Maicher](https://github.com/jmaicher)).
|
||||||
|
* Fallback to parsing big integer from String instead of exception in Parquet format [#50873](https://github.com/ClickHouse/ClickHouse/pull/50873) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Do not apply projection if read-in-order was enabled. [#50923](https://github.com/ClickHouse/ClickHouse/pull/50923) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
* Fix race azure blob storage iterator [#50936](https://github.com/ClickHouse/ClickHouse/pull/50936) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Fix ineffective query cache for SELECTs with subqueries [#51132](https://github.com/ClickHouse/ClickHouse/pull/51132) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix fuzzer failure in ActionsDAG [#51301](https://github.com/ClickHouse/ClickHouse/pull/51301) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
|
||||||
|
#### NOT FOR CHANGELOG / INSIGNIFICANT
|
||||||
|
|
||||||
|
* Fix ParallelReadBuffer seek [#50820](https://github.com/ClickHouse/ClickHouse/pull/50820) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
|
@ -44,11 +44,12 @@ Create a table in ClickHouse which allows to read data from Redis:
|
|||||||
``` sql
|
``` sql
|
||||||
CREATE TABLE redis_table
|
CREATE TABLE redis_table
|
||||||
(
|
(
|
||||||
`k` String,
|
`key` String,
|
||||||
`m` String,
|
`v1` UInt32,
|
||||||
`n` UInt32
|
`v2` String,
|
||||||
|
`v3` Float32
|
||||||
)
|
)
|
||||||
ENGINE = Redis('redis1:6379') PRIMARY KEY(k);
|
ENGINE = Redis('redis1:6379') PRIMARY KEY(key);
|
||||||
```
|
```
|
||||||
|
|
||||||
Insert:
|
Insert:
|
||||||
@ -111,9 +112,16 @@ Flush Redis db asynchronously. Also `Truncate` support SYNC mode.
|
|||||||
TRUNCATE TABLE redis_table SYNC;
|
TRUNCATE TABLE redis_table SYNC;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Join:
|
||||||
|
|
||||||
|
Join with other tables.
|
||||||
|
|
||||||
|
```
|
||||||
|
SELECT * FROM redis_table JOIN merge_tree_table ON merge_tree_table.key=redis_table.key;
|
||||||
|
```
|
||||||
|
|
||||||
## Limitations {#limitations}
|
## Limitations {#limitations}
|
||||||
|
|
||||||
Redis engine also supports scanning queries, such as `where k > xx`, but it has some limitations:
|
Redis engine also supports scanning queries, such as `where k > xx`, but it has some limitations:
|
||||||
1. Scanning query may produce some duplicated keys in a very rare case when it is rehashing. See details in [Redis Scan](https://github.com/redis/redis/blob/e4d183afd33e0b2e6e8d1c79a832f678a04a7886/src/dict.c#L1186-L1269)
|
1. Scanning query may produce some duplicated keys in a very rare case when it is rehashing. See details in [Redis Scan](https://github.com/redis/redis/blob/e4d183afd33e0b2e6e8d1c79a832f678a04a7886/src/dict.c#L1186-L1269).
|
||||||
2. During the scanning, keys could be created and deleted, so the resulting dataset can not represent a valid point in time.
|
2. During the scanning, keys could be created and deleted, so the resulting dataset can not represent a valid point in time.
|
||||||
|
@ -756,6 +756,17 @@ If you perform the `SELECT` query between merges, you may get expired data. To a
|
|||||||
- [ttl_only_drop_parts](/docs/en/operations/settings/settings.md/#ttl_only_drop_parts) setting
|
- [ttl_only_drop_parts](/docs/en/operations/settings/settings.md/#ttl_only_drop_parts) setting
|
||||||
|
|
||||||
|
|
||||||
|
## Disk types
|
||||||
|
|
||||||
|
In addition to local block devices, ClickHouse supports these storage types:
|
||||||
|
- [`s3` for S3 and MinIO](#table_engine-mergetree-s3)
|
||||||
|
- [`gcs` for GCS](/docs/en/integrations/data-ingestion/gcs/index.md/#creating-a-disk)
|
||||||
|
- [`blob_storage_disk` for Azure Blob Storage](#table_engine-mergetree-azure-blob-storage)
|
||||||
|
- [`hdfs` for HDFS](#hdfs-storage)
|
||||||
|
- [`web` for read-only from web](#web-storage)
|
||||||
|
- [`cache` for local caching](/docs/en/operations/storing-data.md/#using-local-cache)
|
||||||
|
- [`s3_plain` for backups to S3](/docs/en/operations/backup#backuprestore-using-an-s3-disk)
|
||||||
|
|
||||||
## 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}
|
||||||
@ -936,6 +947,8 @@ configuration files; all the settings are in the CREATE/ATTACH query.
|
|||||||
The example uses `type=web`, but any disk type can be configured as dynamic, even Local disk. Local disks require a path argument to be inside the server config parameter `custom_local_disks_base_directory`, which has no default, so set that also when using local disk.
|
The example uses `type=web`, but any disk type can be configured as dynamic, even Local disk. Local disks require a path argument to be inside the server config parameter `custom_local_disks_base_directory`, which has no default, so set that also when using local disk.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
#### Example dynamic web storage
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
ATTACH TABLE uk_price_paid UUID 'cf712b4f-2ca8-435c-ac23-c4393efe52f7'
|
ATTACH TABLE uk_price_paid UUID 'cf712b4f-2ca8-435c-ac23-c4393efe52f7'
|
||||||
(
|
(
|
||||||
@ -1238,6 +1251,93 @@ Examples of working configurations can be found in integration tests directory (
|
|||||||
Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use.
|
Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
## HDFS storage {#hdfs-storage}
|
||||||
|
|
||||||
|
In this sample configuration:
|
||||||
|
- the disk is of type `hdfs`
|
||||||
|
- the data is hosted at `hdfs://hdfs1:9000/clickhouse/`
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<clickhouse>
|
||||||
|
<storage_configuration>
|
||||||
|
<disks>
|
||||||
|
<hdfs>
|
||||||
|
<type>hdfs</type>
|
||||||
|
<endpoint>hdfs://hdfs1:9000/clickhouse/</endpoint>
|
||||||
|
<skip_access_check>true</skip_access_check>
|
||||||
|
</hdfs>
|
||||||
|
<hdd>
|
||||||
|
<type>local</type>
|
||||||
|
<path>/</path>
|
||||||
|
</hdd>
|
||||||
|
</disks>
|
||||||
|
<policies>
|
||||||
|
<hdfs>
|
||||||
|
<volumes>
|
||||||
|
<main>
|
||||||
|
<disk>hdfs</disk>
|
||||||
|
</main>
|
||||||
|
<external>
|
||||||
|
<disk>hdd</disk>
|
||||||
|
</external>
|
||||||
|
</volumes>
|
||||||
|
</hdfs>
|
||||||
|
</policies>
|
||||||
|
</storage_configuration>
|
||||||
|
</clickhouse>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Web storage (read-only) {#web-storage}
|
||||||
|
|
||||||
|
Web storage can be used for read-only purposes. An example use is for hosting sample
|
||||||
|
data, or for migrating data.
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
Storage can also be configured temporarily within a query, if a web dataset is not expected
|
||||||
|
to be used routinely, see [dynamic storage](#dynamic-storage) and skip editing the
|
||||||
|
configuration file.
|
||||||
|
:::
|
||||||
|
|
||||||
|
In this sample configuration:
|
||||||
|
- the disk is of type `web`
|
||||||
|
- the data is hosted at `http://nginx:80/test1/`
|
||||||
|
- a cache on local storage is used
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<clickhouse>
|
||||||
|
<storage_configuration>
|
||||||
|
<disks>
|
||||||
|
<web>
|
||||||
|
<type>web</type>
|
||||||
|
<endpoint>http://nginx:80/test1/</endpoint>
|
||||||
|
</web>
|
||||||
|
<cached_web>
|
||||||
|
<type>cache</type>
|
||||||
|
<disk>web</disk>
|
||||||
|
<path>cached_web_cache/</path>
|
||||||
|
<max_size>100000000</max_size>
|
||||||
|
</cached_web>
|
||||||
|
</disks>
|
||||||
|
<policies>
|
||||||
|
<web>
|
||||||
|
<volumes>
|
||||||
|
<main>
|
||||||
|
<disk>web</disk>
|
||||||
|
</main>
|
||||||
|
</volumes>
|
||||||
|
</web>
|
||||||
|
<cached_web>
|
||||||
|
<volumes>
|
||||||
|
<main>
|
||||||
|
<disk>cached_web</disk>
|
||||||
|
</main>
|
||||||
|
</volumes>
|
||||||
|
</cached_web>
|
||||||
|
</policies>
|
||||||
|
</storage_configuration>
|
||||||
|
</clickhouse>
|
||||||
|
```
|
||||||
|
|
||||||
## Virtual Columns {#virtual-columns}
|
## Virtual Columns {#virtual-columns}
|
||||||
|
|
||||||
- `_part` — Name of a part.
|
- `_part` — Name of a part.
|
||||||
|
@ -1322,7 +1322,7 @@ Connection pool size for PostgreSQL table engine and database engine.
|
|||||||
|
|
||||||
Default value: 16
|
Default value: 16
|
||||||
|
|
||||||
## postgresql_connection_pool_size {#postgresql-connection-pool-size}
|
## postgresql_connection_pool_wait_timeout {#postgresql-connection-pool-wait-timeout}
|
||||||
|
|
||||||
Connection pool push/pop timeout on empty pool for PostgreSQL table engine and database engine. By default it will block on empty pool.
|
Connection pool push/pop timeout on empty pool for PostgreSQL table engine and database engine. By default it will block on empty pool.
|
||||||
|
|
||||||
|
@ -49,8 +49,8 @@ static void validateChecksum(char * data, size_t size, const Checksum expected_c
|
|||||||
|
|
||||||
/// TODO mess up of endianness in error message.
|
/// TODO mess up of endianness in error message.
|
||||||
message << "Checksum doesn't match: corrupted data."
|
message << "Checksum doesn't match: corrupted data."
|
||||||
" Reference: " + getHexUIntLowercase(expected_checksum.first) + getHexUIntLowercase(expected_checksum.second)
|
" Reference: " + getHexUIntLowercase(expected_checksum.high64) + getHexUIntLowercase(expected_checksum.low64)
|
||||||
+ ". Actual: " + getHexUIntLowercase(calculated_checksum.first) + getHexUIntLowercase(calculated_checksum.second)
|
+ ". Actual: " + getHexUIntLowercase(calculated_checksum.high64) + getHexUIntLowercase(calculated_checksum.low64)
|
||||||
+ ". Size of compressed block: " + toString(size);
|
+ ". Size of compressed block: " + toString(size);
|
||||||
|
|
||||||
const char * message_hardware_failure = "This is most likely due to hardware failure. "
|
const char * message_hardware_failure = "This is most likely due to hardware failure. "
|
||||||
@ -95,8 +95,8 @@ static void validateChecksum(char * data, size_t size, const Checksum expected_c
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Check if the difference caused by single bit flip in stored checksum.
|
/// Check if the difference caused by single bit flip in stored checksum.
|
||||||
size_t difference = std::popcount(expected_checksum.first ^ calculated_checksum.first)
|
size_t difference = std::popcount(expected_checksum.low64 ^ calculated_checksum.low64)
|
||||||
+ std::popcount(expected_checksum.second ^ calculated_checksum.second);
|
+ std::popcount(expected_checksum.high64 ^ calculated_checksum.high64);
|
||||||
|
|
||||||
if (difference == 1)
|
if (difference == 1)
|
||||||
{
|
{
|
||||||
@ -194,8 +194,8 @@ size_t CompressedReadBufferBase::readCompressedData(size_t & size_decompressed,
|
|||||||
{
|
{
|
||||||
Checksum checksum;
|
Checksum checksum;
|
||||||
ReadBufferFromMemory checksum_in(own_compressed_buffer.data(), sizeof(checksum));
|
ReadBufferFromMemory checksum_in(own_compressed_buffer.data(), sizeof(checksum));
|
||||||
readBinaryLittleEndian(checksum.first, checksum_in);
|
readBinaryLittleEndian(checksum.low64, checksum_in);
|
||||||
readBinaryLittleEndian(checksum.second, checksum_in);
|
readBinaryLittleEndian(checksum.high64, checksum_in);
|
||||||
|
|
||||||
validateChecksum(compressed_buffer, size_compressed_without_checksum, checksum);
|
validateChecksum(compressed_buffer, size_compressed_without_checksum, checksum);
|
||||||
}
|
}
|
||||||
@ -238,8 +238,8 @@ size_t CompressedReadBufferBase::readCompressedDataBlockForAsynchronous(size_t &
|
|||||||
{
|
{
|
||||||
Checksum checksum;
|
Checksum checksum;
|
||||||
ReadBufferFromMemory checksum_in(own_compressed_buffer.data(), sizeof(checksum));
|
ReadBufferFromMemory checksum_in(own_compressed_buffer.data(), sizeof(checksum));
|
||||||
readBinaryLittleEndian(checksum.first, checksum_in);
|
readBinaryLittleEndian(checksum.low64, checksum_in);
|
||||||
readBinaryLittleEndian(checksum.second, checksum_in);
|
readBinaryLittleEndian(checksum.high64, checksum_in);
|
||||||
|
|
||||||
validateChecksum(compressed_buffer, size_compressed_without_checksum, checksum);
|
validateChecksum(compressed_buffer, size_compressed_without_checksum, checksum);
|
||||||
}
|
}
|
||||||
|
@ -38,8 +38,8 @@ void CompressedWriteBuffer::nextImpl()
|
|||||||
|
|
||||||
CityHash_v1_0_2::uint128 checksum = CityHash_v1_0_2::CityHash128(out_compressed_ptr, compressed_size);
|
CityHash_v1_0_2::uint128 checksum = CityHash_v1_0_2::CityHash128(out_compressed_ptr, compressed_size);
|
||||||
|
|
||||||
writeBinaryLittleEndian(checksum.first, out);
|
writeBinaryLittleEndian(checksum.low64, out);
|
||||||
writeBinaryLittleEndian(checksum.second, out);
|
writeBinaryLittleEndian(checksum.high64, out);
|
||||||
|
|
||||||
out.position() += compressed_size;
|
out.position() += compressed_size;
|
||||||
}
|
}
|
||||||
@ -50,8 +50,8 @@ void CompressedWriteBuffer::nextImpl()
|
|||||||
|
|
||||||
CityHash_v1_0_2::uint128 checksum = CityHash_v1_0_2::CityHash128(compressed_buffer.data(), compressed_size);
|
CityHash_v1_0_2::uint128 checksum = CityHash_v1_0_2::CityHash128(compressed_buffer.data(), compressed_size);
|
||||||
|
|
||||||
writeBinaryLittleEndian(checksum.first, out);
|
writeBinaryLittleEndian(checksum.low64, out);
|
||||||
writeBinaryLittleEndian(checksum.second, out);
|
writeBinaryLittleEndian(checksum.high64, out);
|
||||||
|
|
||||||
out.write(compressed_buffer.data(), compressed_size);
|
out.write(compressed_buffer.data(), compressed_size);
|
||||||
}
|
}
|
||||||
|
@ -507,9 +507,6 @@ bool CachedOnDiskReadBufferFromFile::completeFileSegmentAndGetNext()
|
|||||||
current_file_segment->use();
|
current_file_segment->use();
|
||||||
implementation_buffer = getImplementationBuffer(*current_file_segment);
|
implementation_buffer = getImplementationBuffer(*current_file_segment);
|
||||||
|
|
||||||
if (read_type == ReadType::CACHED)
|
|
||||||
current_file_segment->incrementHitsCount();
|
|
||||||
|
|
||||||
LOG_TEST(
|
LOG_TEST(
|
||||||
log, "New segment range: {}, old range: {}",
|
log, "New segment range: {}, old range: {}",
|
||||||
current_file_segment->range().toString(), completed_range.toString());
|
current_file_segment->range().toString(), completed_range.toString());
|
||||||
@ -852,9 +849,7 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
implementation_buffer = getImplementationBuffer(file_segments->front());
|
implementation_buffer = getImplementationBuffer(file_segments->front());
|
||||||
|
file_segments->front().use();
|
||||||
if (read_type == ReadType::CACHED)
|
|
||||||
file_segments->front().incrementHitsCount();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
chassert(!internal_buffer.empty());
|
chassert(!internal_buffer.empty());
|
||||||
|
@ -154,6 +154,8 @@ private:
|
|||||||
using ColVecType = ColumnVectorOrDecimal<Type>;
|
using ColVecType = ColumnVectorOrDecimal<Type>;
|
||||||
|
|
||||||
const auto col_vec = checkAndGetColumn<ColVecType>(col.column.get());
|
const auto col_vec = checkAndGetColumn<ColVecType>(col.column.get());
|
||||||
|
if (col_vec == nullptr)
|
||||||
|
return false;
|
||||||
return (res = execute<Type, ReturnType>(col_vec)) != nullptr;
|
return (res = execute<Type, ReturnType>(col_vec)) != nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -898,7 +898,7 @@ void FileSegment::use()
|
|||||||
if (it)
|
if (it)
|
||||||
{
|
{
|
||||||
auto cache_lock = cache->lockCache();
|
auto cache_lock = cache->lockCache();
|
||||||
it->use(cache_lock);
|
hits_count = it->use(cache_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,8 +175,6 @@ public:
|
|||||||
|
|
||||||
size_t getRefCount() const { return ref_count; }
|
size_t getRefCount() const { return ref_count; }
|
||||||
|
|
||||||
void incrementHitsCount() { ++hits_count; }
|
|
||||||
|
|
||||||
size_t getCurrentWriteOffset(bool sync) const;
|
size_t getCurrentWriteOffset(bool sync) const;
|
||||||
|
|
||||||
size_t getFirstNonDownloadedOffset(bool sync) const;
|
size_t getFirstNonDownloadedOffset(bool sync) const;
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#include <Poco/ConsoleChannel.h>
|
#include <Poco/ConsoleChannel.h>
|
||||||
#include <Disks/IO/CachedOnDiskWriteBufferFromFile.h>
|
#include <Disks/IO/CachedOnDiskWriteBufferFromFile.h>
|
||||||
|
#include <Disks/IO/CachedOnDiskReadBufferFromFile.h>
|
||||||
|
#include <Disks/IO/createReadBufferFromFileBase.h>
|
||||||
#include <Interpreters/Cache/WriteBufferToFileSegment.h>
|
#include <Interpreters/Cache/WriteBufferToFileSegment.h>
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
@ -862,3 +864,78 @@ TEST_F(FileCacheTest, temporaryData)
|
|||||||
ASSERT_LE(file_cache.getUsedCacheSize(), size_used_before_temporary_data);
|
ASSERT_LE(file_cache.getUsedCacheSize(), size_used_before_temporary_data);
|
||||||
ASSERT_LE(file_cache.getFileSegmentsNum(), segments_used_before_temporary_data);
|
ASSERT_LE(file_cache.getFileSegmentsNum(), segments_used_before_temporary_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FileCacheTest, CachedReadBuffer)
|
||||||
|
{
|
||||||
|
DB::ThreadStatus thread_status;
|
||||||
|
|
||||||
|
/// To work with cache need query_id and query context.
|
||||||
|
std::string query_id = "query_id";
|
||||||
|
|
||||||
|
Poco::XML::DOMParser dom_parser;
|
||||||
|
std::string xml(R"CONFIG(<clickhouse>
|
||||||
|
</clickhouse>)CONFIG");
|
||||||
|
Poco::AutoPtr<Poco::XML::Document> document = dom_parser.parseString(xml);
|
||||||
|
Poco::AutoPtr<Poco::Util::XMLConfiguration> config = new Poco::Util::XMLConfiguration(document);
|
||||||
|
getMutableContext().context->setConfig(config);
|
||||||
|
|
||||||
|
auto query_context = DB::Context::createCopy(getContext().context);
|
||||||
|
query_context->makeQueryContext();
|
||||||
|
query_context->setCurrentQueryId(query_id);
|
||||||
|
chassert(&DB::CurrentThread::get() == &thread_status);
|
||||||
|
DB::CurrentThread::QueryScope query_scope_holder(query_context);
|
||||||
|
|
||||||
|
DB::FileCacheSettings settings;
|
||||||
|
settings.base_path = cache_base_path;
|
||||||
|
settings.max_file_segment_size = 5;
|
||||||
|
settings.max_size = 30;
|
||||||
|
settings.max_elements = 10;
|
||||||
|
settings.boundary_alignment = 1;
|
||||||
|
|
||||||
|
ReadSettings read_settings;
|
||||||
|
read_settings.enable_filesystem_cache = true;
|
||||||
|
read_settings.local_fs_method = LocalFSReadMethod::pread;
|
||||||
|
|
||||||
|
std::string file_path = fs::current_path() / "test";
|
||||||
|
auto read_buffer_creator = [&]()
|
||||||
|
{
|
||||||
|
return createReadBufferFromFileBase(file_path, read_settings, std::nullopt, std::nullopt);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto wb = std::make_unique<WriteBufferFromFile>(file_path, DBMS_DEFAULT_BUFFER_SIZE);
|
||||||
|
std::string s(30, '*');
|
||||||
|
wb->write(s.data(), s.size());
|
||||||
|
wb->next();
|
||||||
|
wb->finalize();
|
||||||
|
|
||||||
|
auto cache = std::make_shared<DB::FileCache>(settings);
|
||||||
|
cache->initialize();
|
||||||
|
auto key = cache->createKeyForPath(file_path);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto cached_buffer = std::make_shared<CachedOnDiskReadBufferFromFile>(
|
||||||
|
file_path, key, cache, read_buffer_creator, read_settings, "test", s.size(), false, false, std::nullopt, nullptr);
|
||||||
|
|
||||||
|
WriteBufferFromOwnString result;
|
||||||
|
copyData(*cached_buffer, result);
|
||||||
|
ASSERT_EQ(result.str(), s);
|
||||||
|
|
||||||
|
assertEqual(cache->dumpQueue(), { Range(0, 4), Range(5, 9), Range(10, 14), Range(15, 19), Range(20, 24), Range(25, 29) });
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
ReadSettings modified_settings{read_settings};
|
||||||
|
modified_settings.local_fs_buffer_size = 10;
|
||||||
|
modified_settings.remote_fs_buffer_size = 10;
|
||||||
|
|
||||||
|
auto cached_buffer = std::make_shared<CachedOnDiskReadBufferFromFile>(
|
||||||
|
file_path, key, cache, read_buffer_creator, modified_settings, "test", s.size(), false, false, std::nullopt, nullptr);
|
||||||
|
|
||||||
|
cached_buffer->next();
|
||||||
|
assertEqual(cache->dumpQueue(), { Range(5, 9), Range(10, 14), Range(15, 19), Range(20, 24), Range(25, 29), Range(0, 4) });
|
||||||
|
|
||||||
|
cached_buffer->position() = cached_buffer->buffer().end();
|
||||||
|
cached_buffer->next();
|
||||||
|
assertEqual(cache->dumpQueue(), {Range(10, 14), Range(15, 19), Range(20, 24), Range(25, 29), Range(0, 4), Range(5, 9) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -40,8 +40,8 @@ DistributedAsyncInsertHeader DistributedAsyncInsertHeader::read(ReadBufferFromFi
|
|||||||
{
|
{
|
||||||
throw Exception(ErrorCodes::CHECKSUM_DOESNT_MATCH,
|
throw Exception(ErrorCodes::CHECKSUM_DOESNT_MATCH,
|
||||||
"Checksum of extra info doesn't match: corrupted data. Reference: {}{}. Actual: {}{}.",
|
"Checksum of extra info doesn't match: corrupted data. Reference: {}{}. Actual: {}{}.",
|
||||||
getHexUIntLowercase(expected_checksum.first), getHexUIntLowercase(expected_checksum.second),
|
getHexUIntLowercase(expected_checksum.high64), getHexUIntLowercase(expected_checksum.low64),
|
||||||
getHexUIntLowercase(calculated_checksum.first), getHexUIntLowercase(calculated_checksum.second));
|
getHexUIntLowercase(calculated_checksum.high64), getHexUIntLowercase(calculated_checksum.low64));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read the parts of the header.
|
/// Read the parts of the header.
|
||||||
|
@ -400,7 +400,7 @@ void DataPartStorageOnDiskBase::backup(
|
|||||||
if (it != checksums.files.end())
|
if (it != checksums.files.end())
|
||||||
{
|
{
|
||||||
file_size = it->second.file_size;
|
file_size = it->second.file_size;
|
||||||
file_hash = {it->second.file_hash.first, it->second.file_hash.second};
|
file_hash = it->second.file_hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
BackupEntryPtr backup_entry = std::make_unique<BackupEntryFromImmutableFile>(disk, filepath_on_disk, copy_encrypted, file_size, file_hash);
|
BackupEntryPtr backup_entry = std::make_unique<BackupEntryFromImmutableFile>(disk, filepath_on_disk, copy_encrypted, file_size, file_hash);
|
||||||
|
@ -154,9 +154,9 @@ bool MergeTreeDataPartChecksums::readV2(ReadBuffer & in)
|
|||||||
assertString("\n\tsize: ", in);
|
assertString("\n\tsize: ", in);
|
||||||
readText(sum.file_size, in);
|
readText(sum.file_size, in);
|
||||||
assertString("\n\thash: ", in);
|
assertString("\n\thash: ", in);
|
||||||
readText(sum.file_hash.first, in);
|
readText(sum.file_hash.low64, in);
|
||||||
assertString(" ", in);
|
assertString(" ", in);
|
||||||
readText(sum.file_hash.second, in);
|
readText(sum.file_hash.high64, in);
|
||||||
assertString("\n\tcompressed: ", in);
|
assertString("\n\tcompressed: ", in);
|
||||||
readText(sum.is_compressed, in);
|
readText(sum.is_compressed, in);
|
||||||
if (sum.is_compressed)
|
if (sum.is_compressed)
|
||||||
@ -164,9 +164,9 @@ bool MergeTreeDataPartChecksums::readV2(ReadBuffer & in)
|
|||||||
assertString("\n\tuncompressed size: ", in);
|
assertString("\n\tuncompressed size: ", in);
|
||||||
readText(sum.uncompressed_size, in);
|
readText(sum.uncompressed_size, in);
|
||||||
assertString("\n\tuncompressed hash: ", in);
|
assertString("\n\tuncompressed hash: ", in);
|
||||||
readText(sum.uncompressed_hash.first, in);
|
readText(sum.uncompressed_hash.low64, in);
|
||||||
assertString(" ", in);
|
assertString(" ", in);
|
||||||
readText(sum.uncompressed_hash.second, in);
|
readText(sum.uncompressed_hash.high64, in);
|
||||||
}
|
}
|
||||||
assertChar('\n', in);
|
assertChar('\n', in);
|
||||||
|
|
||||||
|
@ -250,8 +250,8 @@ std::unordered_map<String, IPartMetadataManager::uint128> PartMetadataManagerWit
|
|||||||
ErrorCodes::CORRUPTED_DATA,
|
ErrorCodes::CORRUPTED_DATA,
|
||||||
"Checksums doesn't match in part {} for {}. Expected: {}. Found {}.",
|
"Checksums doesn't match in part {} for {}. Expected: {}. Found {}.",
|
||||||
part->name, file_path,
|
part->name, file_path,
|
||||||
getHexUIntUppercase(disk_checksum.first) + getHexUIntUppercase(disk_checksum.second),
|
getHexUIntUppercase(disk_checksum.high64) + getHexUIntUppercase(disk_checksum.low64),
|
||||||
getHexUIntUppercase(cache_checksums[i].first) + getHexUIntUppercase(cache_checksums[i].second));
|
getHexUIntUppercase(cache_checksums[i].high64) + getHexUIntUppercase(cache_checksums[i].low64));
|
||||||
|
|
||||||
disk_checksums.push_back(disk_checksum);
|
disk_checksums.push_back(disk_checksum);
|
||||||
continue;
|
continue;
|
||||||
@ -287,8 +287,8 @@ std::unordered_map<String, IPartMetadataManager::uint128> PartMetadataManagerWit
|
|||||||
ErrorCodes::CORRUPTED_DATA,
|
ErrorCodes::CORRUPTED_DATA,
|
||||||
"Checksums doesn't match in projection part {} {}. Expected: {}. Found {}.",
|
"Checksums doesn't match in projection part {} {}. Expected: {}. Found {}.",
|
||||||
part->name, proj_name,
|
part->name, proj_name,
|
||||||
getHexUIntUppercase(disk_checksum.first) + getHexUIntUppercase(disk_checksum.second),
|
getHexUIntUppercase(disk_checksum.high64) + getHexUIntUppercase(disk_checksum.low64),
|
||||||
getHexUIntUppercase(cache_checksums[i].first) + getHexUIntUppercase(cache_checksums[i].second));
|
getHexUIntUppercase(cache_checksums[i].high64) + getHexUIntUppercase(cache_checksums[i].low64));
|
||||||
disk_checksums.push_back(disk_checksum);
|
disk_checksums.push_back(disk_checksum);
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
|
@ -252,17 +252,17 @@ void StorageSystemParts::processNextStorage(
|
|||||||
if (columns_mask[src_index++])
|
if (columns_mask[src_index++])
|
||||||
{
|
{
|
||||||
auto checksum = helper.hash_of_all_files;
|
auto checksum = helper.hash_of_all_files;
|
||||||
columns[res_index++]->insert(getHexUIntLowercase(checksum.first) + getHexUIntLowercase(checksum.second));
|
columns[res_index++]->insert(getHexUIntLowercase(checksum.high64) + getHexUIntLowercase(checksum.low64));
|
||||||
}
|
}
|
||||||
if (columns_mask[src_index++])
|
if (columns_mask[src_index++])
|
||||||
{
|
{
|
||||||
auto checksum = helper.hash_of_uncompressed_files;
|
auto checksum = helper.hash_of_uncompressed_files;
|
||||||
columns[res_index++]->insert(getHexUIntLowercase(checksum.first) + getHexUIntLowercase(checksum.second));
|
columns[res_index++]->insert(getHexUIntLowercase(checksum.high64) + getHexUIntLowercase(checksum.low64));
|
||||||
}
|
}
|
||||||
if (columns_mask[src_index++])
|
if (columns_mask[src_index++])
|
||||||
{
|
{
|
||||||
auto checksum = helper.uncompressed_hash_of_compressed_files;
|
auto checksum = helper.uncompressed_hash_of_compressed_files;
|
||||||
columns[res_index++]->insert(getHexUIntLowercase(checksum.first) + getHexUIntLowercase(checksum.second));
|
columns[res_index++]->insert(getHexUIntLowercase(checksum.high64) + getHexUIntLowercase(checksum.low64));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,17 +221,17 @@ void StorageSystemProjectionParts::processNextStorage(
|
|||||||
if (columns_mask[src_index++])
|
if (columns_mask[src_index++])
|
||||||
{
|
{
|
||||||
auto checksum = helper.hash_of_all_files;
|
auto checksum = helper.hash_of_all_files;
|
||||||
columns[res_index++]->insert(getHexUIntLowercase(checksum.first) + getHexUIntLowercase(checksum.second));
|
columns[res_index++]->insert(getHexUIntLowercase(checksum.high64) + getHexUIntLowercase(checksum.low64));
|
||||||
}
|
}
|
||||||
if (columns_mask[src_index++])
|
if (columns_mask[src_index++])
|
||||||
{
|
{
|
||||||
auto checksum = helper.hash_of_uncompressed_files;
|
auto checksum = helper.hash_of_uncompressed_files;
|
||||||
columns[res_index++]->insert(getHexUIntLowercase(checksum.first) + getHexUIntLowercase(checksum.second));
|
columns[res_index++]->insert(getHexUIntLowercase(checksum.high64) + getHexUIntLowercase(checksum.low64));
|
||||||
}
|
}
|
||||||
if (columns_mask[src_index++])
|
if (columns_mask[src_index++])
|
||||||
{
|
{
|
||||||
auto checksum = helper.uncompressed_hash_of_compressed_files;
|
auto checksum = helper.uncompressed_hash_of_compressed_files;
|
||||||
columns[res_index++]->insert(getHexUIntLowercase(checksum.first) + getHexUIntLowercase(checksum.second));
|
columns[res_index++]->insert(getHexUIntLowercase(checksum.high64) + getHexUIntLowercase(checksum.low64));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict, List
|
from typing import Dict, List, Optional
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -58,14 +58,19 @@ def upload_results(
|
|||||||
test_results: TestResults,
|
test_results: TestResults,
|
||||||
additional_files: List[str],
|
additional_files: List[str],
|
||||||
check_name: str,
|
check_name: str,
|
||||||
|
additional_urls: Optional[List[str]] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
normalized_check_name = check_name.lower()
|
normalized_check_name = check_name.lower()
|
||||||
for r in ((" ", "_"), ("(", "_"), (")", "_"), (",", "_"), ("/", "_")):
|
for r in ((" ", "_"), ("(", "_"), (")", "_"), (",", "_"), ("/", "_")):
|
||||||
normalized_check_name = normalized_check_name.replace(*r)
|
normalized_check_name = normalized_check_name.replace(*r)
|
||||||
|
|
||||||
|
# Preserve additional_urls to not modify the original one
|
||||||
|
original_additional_urls = additional_urls or []
|
||||||
s3_path_prefix = f"{pr_number}/{commit_sha}/{normalized_check_name}"
|
s3_path_prefix = f"{pr_number}/{commit_sha}/{normalized_check_name}"
|
||||||
additional_urls = process_logs(
|
additional_urls = process_logs(
|
||||||
s3_client, additional_files, s3_path_prefix, test_results
|
s3_client, additional_files, s3_path_prefix, test_results
|
||||||
)
|
)
|
||||||
|
additional_urls.extend(original_additional_urls)
|
||||||
|
|
||||||
branch_url = f"{GITHUB_SERVER_URL}/{GITHUB_REPOSITORY}/commits/master"
|
branch_url = f"{GITHUB_SERVER_URL}/{GITHUB_REPOSITORY}/commits/master"
|
||||||
branch_name = "master"
|
branch_name = "master"
|
||||||
|
@ -231,6 +231,9 @@ class _NetworkManager:
|
|||||||
|
|
||||||
def _ensure_container(self):
|
def _ensure_container(self):
|
||||||
if self._container is None or self._container_expire_time <= time.time():
|
if self._container is None or self._container_expire_time <= time.time():
|
||||||
|
image_name = "clickhouse/integration-helper:" + os.getenv(
|
||||||
|
"DOCKER_HELPER_TAG", "latest"
|
||||||
|
)
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
if self._container is not None:
|
if self._container is not None:
|
||||||
try:
|
try:
|
||||||
@ -247,7 +250,7 @@ class _NetworkManager:
|
|||||||
time.sleep(i)
|
time.sleep(i)
|
||||||
|
|
||||||
image = subprocess.check_output(
|
image = subprocess.check_output(
|
||||||
"docker images -q clickhouse/integration-helper 2>/dev/null", shell=True
|
f"docker images -q {image_name} 2>/dev/null", shell=True
|
||||||
)
|
)
|
||||||
if not image.strip():
|
if not image.strip():
|
||||||
print("No network image helper, will try download")
|
print("No network image helper, will try download")
|
||||||
@ -256,16 +259,16 @@ class _NetworkManager:
|
|||||||
for i in range(5):
|
for i in range(5):
|
||||||
try:
|
try:
|
||||||
subprocess.check_call( # STYLE_CHECK_ALLOW_SUBPROCESS_CHECK_CALL
|
subprocess.check_call( # STYLE_CHECK_ALLOW_SUBPROCESS_CHECK_CALL
|
||||||
"docker pull clickhouse/integration-helper", shell=True
|
f"docker pull {image_name}", shell=True
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
except:
|
except:
|
||||||
time.sleep(i)
|
time.sleep(i)
|
||||||
else:
|
else:
|
||||||
raise Exception("Cannot pull clickhouse/integration-helper image")
|
raise Exception(f"Cannot pull {image_name} image")
|
||||||
|
|
||||||
self._container = self._docker_client.containers.run(
|
self._container = self._docker_client.containers.run(
|
||||||
"clickhouse/integration-helper",
|
image_name,
|
||||||
auto_remove=True,
|
auto_remove=True,
|
||||||
command=("sleep %s" % self.container_exit_timeout),
|
command=("sleep %s" % self.container_exit_timeout),
|
||||||
# /run/xtables.lock passed inside for correct iptables --wait
|
# /run/xtables.lock passed inside for correct iptables --wait
|
||||||
|
@ -336,6 +336,8 @@ if __name__ == "__main__":
|
|||||||
env_tags += "-e {}={} ".format("DOCKER_MYSQL_PHP_CLIENT_TAG", tag)
|
env_tags += "-e {}={} ".format("DOCKER_MYSQL_PHP_CLIENT_TAG", tag)
|
||||||
elif image == "clickhouse/postgresql-java-client":
|
elif image == "clickhouse/postgresql-java-client":
|
||||||
env_tags += "-e {}={} ".format("DOCKER_POSTGRESQL_JAVA_CLIENT_TAG", tag)
|
env_tags += "-e {}={} ".format("DOCKER_POSTGRESQL_JAVA_CLIENT_TAG", tag)
|
||||||
|
elif image == "clickhouse/integration-helper":
|
||||||
|
env_tags += "-e {}={} ".format("DOCKER_HELPER_TAG", tag)
|
||||||
elif image == "clickhouse/integration-test":
|
elif image == "clickhouse/integration-test":
|
||||||
env_tags += "-e {}={} ".format("DOCKER_BASE_TAG", tag)
|
env_tags += "-e {}={} ".format("DOCKER_BASE_TAG", tag)
|
||||||
elif image == "clickhouse/kerberized-hadoop":
|
elif image == "clickhouse/kerberized-hadoop":
|
||||||
|
@ -1 +1 @@
|
|||||||
20000101_1_1_0 test_00961 b5fce9c4ef1ca42ce4ed027389c208d2 fc3b062b646cd23d4c23d7f5920f89ae da96ff1e527a8a1f908ddf2b1d0af239
|
20000101_1_1_0 test_00961 e4ed027389c208d2b5fce9c4ef1ca42c 4c23d7f5920f89aefc3b062b646cd23d 908ddf2b1d0af239da96ff1e527a8a1f
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
1
|
||||||
|
1
|
6
tests/queries/0_stateless/02807_math_unary_crash.sql
Normal file
6
tests/queries/0_stateless/02807_math_unary_crash.sql
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
DROP TABLE IF EXISTS t10;
|
||||||
|
CREATE TABLE t10 (`c0` Int32) ENGINE = MergeTree ORDER BY tuple();
|
||||||
|
INSERT INTO t10 (c0) FORMAT Values (-1);
|
||||||
|
SELECT 1 FROM t10 GROUP BY erf(-sign(t10.c0));
|
||||||
|
SELECT 1 FROM t10 GROUP BY -sign(t10.c0);
|
||||||
|
DROP TABLE t10;
|
@ -45,7 +45,7 @@ int main(int, char **)
|
|||||||
{
|
{
|
||||||
auto flipped = flipBit(str, pos);
|
auto flipped = flipBit(str, pos);
|
||||||
auto checksum = CityHash_v1_0_2::CityHash128(flipped.data(), flipped.size());
|
auto checksum = CityHash_v1_0_2::CityHash128(flipped.data(), flipped.size());
|
||||||
std::cout << getHexUIntLowercase(checksum.first) << getHexUIntLowercase(checksum.second) << "\t" << pos / 8 << ", " << pos % 8 << "\n";
|
std::cout << getHexUIntLowercase(checksum.high64) << getHexUIntLowercase(checksum.low64) << "\t" << pos / 8 << ", " << pos % 8 << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
v23.5.4.25-stable 2023-06-29
|
||||||
v23.5.3.24-stable 2023-06-17
|
v23.5.3.24-stable 2023-06-17
|
||||||
v23.5.2.7-stable 2023-06-10
|
v23.5.2.7-stable 2023-06-10
|
||||||
v23.5.1.3174-stable 2023-06-09
|
v23.5.1.3174-stable 2023-06-09
|
||||||
|
|
Loading…
Reference in New Issue
Block a user