diff --git a/.clang-tidy b/.clang-tidy
index afc2ca04e2e..3903911a277 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -28,7 +28,6 @@ Checks: '*,
-bugprone-not-null-terminated-result,
-bugprone-reserved-identifier, # useful but too slow, TODO retry when https://reviews.llvm.org/rG1c282052624f9d0bd273bde0b47b30c96699c6c7 is merged
-bugprone-unchecked-optional-access,
- -bugprone-*, -- category temporarily disabled because some check(s) in it are slow
-cert-dcl16-c,
-cert-dcl37-c,
@@ -39,40 +38,9 @@ Checks: '*,
-cert-oop54-cpp,
-cert-oop57-cpp,
- -clang-analyzer-optin.performance.Padding,
- -clang-analyzer-optin.portability.UnixAPI,
- -clang-analyzer-security.insecureAPI.bzero,
- -clang-analyzer-security.insecureAPI.strcpy,
- -clang-analyzer-*, -- category temporarily disabled because some check(s) in it are slow
+ -clang-analyzer-unix.Malloc,
- -cppcoreguidelines-avoid-c-arrays,
- -cppcoreguidelines-avoid-const-or-ref-data-members,
- -cppcoreguidelines-avoid-do-while,
- -cppcoreguidelines-avoid-goto,
- -cppcoreguidelines-avoid-magic-numbers,
- -cppcoreguidelines-avoid-non-const-global-variables,
- -cppcoreguidelines-explicit-virtual-functions,
- -cppcoreguidelines-init-variables,
- -cppcoreguidelines-interfaces-global-init,
- -cppcoreguidelines-macro-usage,
- -cppcoreguidelines-narrowing-conversions,
- -cppcoreguidelines-no-malloc,
- -cppcoreguidelines-non-private-member-variables-in-classes,
- -cppcoreguidelines-owning-memory,
- -cppcoreguidelines-prefer-member-initializer,
- -cppcoreguidelines-pro-bounds-array-to-pointer-decay,
- -cppcoreguidelines-pro-bounds-constant-array-index,
- -cppcoreguidelines-pro-bounds-pointer-arithmetic,
- -cppcoreguidelines-pro-type-const-cast,
- -cppcoreguidelines-pro-type-cstyle-cast,
- -cppcoreguidelines-pro-type-member-init,
- -cppcoreguidelines-pro-type-reinterpret-cast,
- -cppcoreguidelines-pro-type-static-cast-downcast,
- -cppcoreguidelines-pro-type-union-access,
- -cppcoreguidelines-pro-type-vararg,
- -cppcoreguidelines-slicing,
- -cppcoreguidelines-special-member-functions,
- -cppcoreguidelines-*, -- category temporarily disabled because some check(s) in it are slow
+ -cppcoreguidelines-*, # impractical in a codebase as large as ClickHouse, also slow
-darwin-*,
@@ -84,7 +52,6 @@ Checks: '*,
-google-readability-function-size,
-google-readability-namespace-comments,
-google-readability-todo,
- -google-upgrade-googletest-case,
-hicpp-avoid-c-arrays,
-hicpp-avoid-goto,
diff --git a/.github/workflows/docs_check.yml b/.github/workflows/docs_check.yml
index f41bc23bc22..78724a4a924 100644
--- a/.github/workflows/docs_check.yml
+++ b/.github/workflows/docs_check.yml
@@ -17,6 +17,7 @@ on: # yamllint disable-line rule:truthy
- 'docker/docs/**'
- 'docs/**'
- 'utils/check-style/aspell-ignore/**'
+ - 'tests/ci/docs_check.py'
jobs:
CheckLabels:
runs-on: [self-hosted, style-checker]
diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml
index bbc58e17f9b..b1b41a37755 100644
--- a/.github/workflows/pull_request.yml
+++ b/.github/workflows/pull_request.yml
@@ -17,6 +17,7 @@ on: # yamllint disable-line rule:truthy
- 'docker/docs/**'
- 'docs/**'
- 'utils/check-style/aspell-ignore/**'
+ - 'tests/ci/docs_check.py'
##########################################################################################
##################################### SMALL CHECKS #######################################
##########################################################################################
diff --git a/.gitmodules b/.gitmodules
index caed96b0320..f790e0f8d5a 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -257,6 +257,9 @@
[submodule "contrib/corrosion"]
path = contrib/corrosion
url = https://github.com/corrosion-rs/corrosion
+[submodule "contrib/libssh"]
+ path = contrib/libssh
+ url = https://github.com/ClickHouse/libssh.git
[submodule "contrib/morton-nd"]
path = contrib/morton-nd
url = https://github.com/morton-nd/morton-nd
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4b0c8e61a0d..41074f33d33 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,5 @@
### Table of Contents
+**[ClickHouse release v23.9, 2023-09-28](#239)**
**[ClickHouse release v23.8 LTS, 2023-08-31](#238)**
**[ClickHouse release v23.7, 2023-07-27](#237)**
**[ClickHouse release v23.6, 2023-06-30](#236)**
@@ -11,6 +12,174 @@
# 2023 Changelog
+### ClickHouse release 23.9, 2023-09-28
+
+#### Backward Incompatible Change
+* Remove the `status_info` configuration option and dictionaries status from the default Prometheus handler. [#54090](https://github.com/ClickHouse/ClickHouse/pull/54090) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* The experimental parts metadata cache is removed from the codebase. [#54215](https://github.com/ClickHouse/ClickHouse/pull/54215) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Disable setting `input_format_json_try_infer_numbers_from_strings` by default, so we don't try to infer numbers from strings in JSON formats by default to avoid possible parsing errors when sample data contains strings that looks like a number. [#55099](https://github.com/ClickHouse/ClickHouse/pull/55099) ([Kruglov Pavel](https://github.com/Avogar)).
+
+#### New Feature
+* Improve schema inference from JSON formats: 1) Now it's possible to infer named Tuples from JSON objects without experimantal JSON type under a setting `input_format_json_try_infer_named_tuples_from_objects` in JSON formats. Previously without experimantal type JSON we could only infer JSON objects as Strings or Maps, now we can infer named Tuple. Resulting Tuple type will conain all keys of objects that were read in data sample during schema inference. It can be useful for reading structured JSON data without sparse objects. The setting is enabled by default. 2) Allow parsing JSON array into a column with type String under setting `input_format_json_read_arrays_as_strings`. It can help reading arrays with values with different types. 3) Allow to use type String for JSON keys with unkown types (`null`/`[]`/`{}`) in sample data under setting `input_format_json_infer_incomplete_types_as_strings`. Now in JSON formats we can read any value into String column and we can avoid getting error `Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` during schema inference by using type String for unknown types, so the data will be read successfully. [#54427](https://github.com/ClickHouse/ClickHouse/pull/54427) ([Kruglov Pavel](https://github.com/Avogar)).
+* Added IO scheduling support for remote disks. Storage configuration for disk types `s3`, `s3_plain`, `hdfs` and `azure_blob_storage` can now contain `read_resource` and `write_resource` elements holding resource names. Scheduling policies for these resources can be configured in a separate server configuration section `resources`. Queries can be marked using setting `workload` and classified using server configuration section `workload_classifiers` to achieve diverse resource scheduling goals. More details in [the docs](https://clickhouse.com/docs/en/operations/workload-scheduling). [#47009](https://github.com/ClickHouse/ClickHouse/pull/47009) ([Sergei Trifonov](https://github.com/serxa)). Added "bandwidth_limit" IO scheduling node type. It allows you to specify `max_speed` and `max_burst` constraints on traffic passing though this node. [#54618](https://github.com/ClickHouse/ClickHouse/pull/54618) ([Sergei Trifonov](https://github.com/serxa)).
+* Added new type of authentication based on SSH keys. It works only for the native TCP protocol. [#41109](https://github.com/ClickHouse/ClickHouse/pull/41109) ([George Gamezardashvili](https://github.com/InfJoker)).
+* Added a new column `_block_number` for MergeTree tables. [#44532](https://github.com/ClickHouse/ClickHouse/issues/44532). [#47532](https://github.com/ClickHouse/ClickHouse/pull/47532) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
+* Add `IF EMPTY` clause for `DROP TABLE` queries. [#48915](https://github.com/ClickHouse/ClickHouse/pull/48915) ([Pavel Novitskiy](https://github.com/pnovitskiy)).
+* SQL functions `toString(datetime, timezone)` and `formatDateTime(datetime, format, timezone)` now support non-constant timezone arguments. [#53680](https://github.com/ClickHouse/ClickHouse/pull/53680) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* Add support for `ALTER TABLE MODIFY COMMENT`. Note: something similar was added by an external contributor a long time ago, but the feature did not work at all and only confused users. This closes [#36377](https://github.com/ClickHouse/ClickHouse/issues/36377). [#51304](https://github.com/ClickHouse/ClickHouse/pull/51304) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Note: this command does not propagate between replicas, so the replicas of a table could have different comments.
+* Added `GCD` a.k.a. "greatest common denominator" as a new data compression codec. The codec computes the GCD of all column values, and then divides each value by the GCD. The GCD codec is a data preparation codec (similar to Delta and DoubleDelta) and cannot be used stand-alone. It works with data integer, decimal and date/time type. A viable use case for the GCD codec are column values that change (increase/decrease) in multiples of the GCD, e.g. 24 - 28 - 16 - 24 - 8 - 24 (assuming GCD = 4). [#53149](https://github.com/ClickHouse/ClickHouse/pull/53149) ([Alexander Nam](https://github.com/seshWCS)).
+* Two new type aliases `DECIMAL(P)` (as shortcut for `DECIMAL(P, 0)` and `DECIMAL` (as shortcut for `DECIMAL(10, 0)`) were added. This makes ClickHouse more compatible with MySQL's SQL dialect. [#53328](https://github.com/ClickHouse/ClickHouse/pull/53328) ([Val Doroshchuk](https://github.com/valbok)).
+* Added a new system log table `backup_log` to track all `BACKUP` and `RESTORE` operations. [#53638](https://github.com/ClickHouse/ClickHouse/pull/53638) ([Victor Krasnov](https://github.com/sirvickr)).
+* Added a format setting `output_format_markdown_escape_special_characters` (default: false). The setting controls whether special characters like `!`, `#`, `$` etc. are escaped (i.e. prefixed by a backslash) in the `Markdown` output format. [#53860](https://github.com/ClickHouse/ClickHouse/pull/53860) ([irenjj](https://github.com/irenjj)).
+* Add function `decodeHTMLComponent`. [#54097](https://github.com/ClickHouse/ClickHouse/pull/54097) ([Bharat Nallan](https://github.com/bharatnc)).
+* Added `peak_threads_usage` to query_log table. [#54335](https://github.com/ClickHouse/ClickHouse/pull/54335) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
+* Add `SHOW FUNCTIONS` support to clickhouse-client. [#54337](https://github.com/ClickHouse/ClickHouse/pull/54337) ([Julia Kartseva](https://github.com/wat-ze-hex)).
+* Added function `toDaysSinceYearZero` with alias `TO_DAYS` (for compatibility with MySQL) which returns the number of days passed since `0001-01-01` (in Proleptic Gregorian Calendar). [#54479](https://github.com/ClickHouse/ClickHouse/pull/54479) ([Robert Schulze](https://github.com/rschu1ze)). Function `toDaysSinceYearZero()` now supports arguments of type `DateTime` and `DateTime64`. [#54856](https://github.com/ClickHouse/ClickHouse/pull/54856) ([Serge Klochkov](https://github.com/slvrtrn)).
+* Added functions `YYYYMMDDtoDate`, `YYYYMMDDtoDate32`, `YYYYMMDDhhmmssToDateTime` and `YYYYMMDDhhmmssToDateTime64`. They convert a date or date with time encoded as integer (e.g. 20230911) into a native date or date with time. As such, they provide the opposite functionality of existing functions `YYYYMMDDToDate`, `YYYYMMDDToDateTime`, `YYYYMMDDhhmmddToDateTime`, `YYYYMMDDhhmmddToDateTime64`. [#54509](https://github.com/ClickHouse/ClickHouse/pull/54509) ([Quanfa Fu](https://github.com/dentiscalprum)) ([Robert Schulze](https://github.com/rschu1ze)).
+* Add several string distance functions, including `byteHammingDistance`, `editDistance`. [#54935](https://github.com/ClickHouse/ClickHouse/pull/54935) ([flynn](https://github.com/ucasfl)).
+* Allow specifying the expiration date and, optionally, the time for user credentials with `VALID UNTIL datetime` clause. [#51261](https://github.com/ClickHouse/ClickHouse/pull/51261) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Allow S3-style URLs for table functions `s3`, `gcs`, `oss`. URL is automatically converted to HTTP. Example: `'s3://clickhouse-public-datasets/hits.csv'` is converted to `'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'`. [#54931](https://github.com/ClickHouse/ClickHouse/pull/54931) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* Add new setting `print_pretty_type_names` to print pretty deep nested types like Tuple/Maps/Arrays. [#55095](https://github.com/ClickHouse/ClickHouse/pull/55095) ([Kruglov Pavel](https://github.com/Avogar)).
+
+#### Performance Improvement
+* Speed up reading from S3 by enabling prefetches by default. [#53709](https://github.com/ClickHouse/ClickHouse/pull/53709) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Do not implicitly read PK and version columns in lonely parts if unnecessary for queries with FINAL. [#53919](https://github.com/ClickHouse/ClickHouse/pull/53919) ([Duc Canh Le](https://github.com/canhld94)).
+* Optimize group by constant keys. Will optimize queries with group by `_file/_path` after https://github.com/ClickHouse/ClickHouse/pull/53529. [#53549](https://github.com/ClickHouse/ClickHouse/pull/53549) ([Kruglov Pavel](https://github.com/Avogar)).
+* Improve performance of sorting for `Decimal` columns. Improve performance of insertion into `MergeTree` if ORDER BY contains a `Decimal` column. Improve performance of sorting when data is already sorted or almost sorted. [#35961](https://github.com/ClickHouse/ClickHouse/pull/35961) ([Maksim Kita](https://github.com/kitaisreal)).
+* Improve performance for huge query analysis. Fixes [#51224](https://github.com/ClickHouse/ClickHouse/issues/51224). [#51469](https://github.com/ClickHouse/ClickHouse/pull/51469) ([frinkr](https://github.com/frinkr)).
+* An optimization to rewrite `COUNT(DISTINCT ...)` and various `uniq` variants to `count` if it is selected from a subquery with GROUP BY. [#52082](https://github.com/ClickHouse/ClickHouse/pull/52082) [#52645](https://github.com/ClickHouse/ClickHouse/pull/52645) ([JackyWoo](https://github.com/JackyWoo)).
+* Remove manual calls to `mmap/mremap/munmap` and delegate all this work to `jemalloc` - and it slightly improves performance. [#52792](https://github.com/ClickHouse/ClickHouse/pull/52792) ([Nikita Taranov](https://github.com/nickitat)).
+* Fixed high in CPU consumption when working with NATS. [#54399](https://github.com/ClickHouse/ClickHouse/pull/54399) ([Vasilev Pyotr](https://github.com/vahpetr)).
+* Since we use separate instructions for executing `toString()` with datetime argument, it is possible to improve performance a bit for non-datetime arguments and have some parts of the code cleaner. Follows up [#53680](https://github.com/ClickHouse/ClickHouse/issues/53680). [#54443](https://github.com/ClickHouse/ClickHouse/pull/54443) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* Instead of serializing json elements into a `std::stringstream`, this PR try to put the serialization result into `ColumnString` direclty. [#54613](https://github.com/ClickHouse/ClickHouse/pull/54613) ([lgbo](https://github.com/lgbo-ustc)).
+* Enable ORDER BY optimization for reading data in corresponding order from a MergeTree table in case that the table is behind a view. [#54628](https://github.com/ClickHouse/ClickHouse/pull/54628) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Improve JSON SQL functions by reusing `GeneratorJSONPath` and removing several shared pointers. [#54735](https://github.com/ClickHouse/ClickHouse/pull/54735) ([lgbo](https://github.com/lgbo-ustc)).
+* Keeper tries to batch flush requests for better performance. [#53049](https://github.com/ClickHouse/ClickHouse/pull/53049) ([Antonio Andelic](https://github.com/antonio2368)).
+* Now `clickhouse-client` processes files in parallel in case of `INFILE 'glob_expression'`. Closes [#54218](https://github.com/ClickHouse/ClickHouse/issues/54218). [#54533](https://github.com/ClickHouse/ClickHouse/pull/54533) ([Max K.](https://github.com/mkaynov)).
+* Allow to use primary key for IN function where primary key column types are different from `IN` function right side column types. Example: `SELECT id FROM test_table WHERE id IN (SELECT '5')`. Closes [#48936](https://github.com/ClickHouse/ClickHouse/issues/48936). [#54544](https://github.com/ClickHouse/ClickHouse/pull/54544) ([Maksim Kita](https://github.com/kitaisreal)).
+* Hash JOIN tries to shrink internal buffers consuming half of maximal available memory (set by `max_bytes_in_join`). [#54584](https://github.com/ClickHouse/ClickHouse/pull/54584) ([vdimir](https://github.com/vdimir)).
+* Respect `max_block_size` for array join to avoid possible OOM. Close [#54290](https://github.com/ClickHouse/ClickHouse/issues/54290). [#54664](https://github.com/ClickHouse/ClickHouse/pull/54664) ([李扬](https://github.com/taiyang-li)).
+* Reuse HTTP connections in the `s3` table function. [#54812](https://github.com/ClickHouse/ClickHouse/pull/54812) ([Michael Kolupaev](https://github.com/al13n321)).
+* Replace the linear search in `MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules` with a binary search. [#54869](https://github.com/ClickHouse/ClickHouse/pull/54869) ([usurai](https://github.com/usurai)).
+
+#### Experimental Feature
+* The creation of `Annoy` indexes can now be parallelized using setting `max_threads_for_annoy_index_creation`. [#54047](https://github.com/ClickHouse/ClickHouse/pull/54047) ([Robert Schulze](https://github.com/rschu1ze)).
+* Parallel replicas over distributed don't read from all replicas [#54199](https://github.com/ClickHouse/ClickHouse/pull/54199) ([Igor Nikonov](https://github.com/devcrafter)).
+
+#### Improvement
+* Allow to replace long names of files of columns in `MergeTree` data parts to hashes of names. It helps to avoid `File name too long` error in some cases. [#50612](https://github.com/ClickHouse/ClickHouse/pull/50612) ([Anton Popov](https://github.com/CurtizJ)).
+* Parse data in `JSON` format as `JSONEachRow` if failed to parse metadata. It will allow to read files with `.json` extension even if real format is JSONEachRow. Closes [#45740](https://github.com/ClickHouse/ClickHouse/issues/45740). [#54405](https://github.com/ClickHouse/ClickHouse/pull/54405) ([Kruglov Pavel](https://github.com/Avogar)).
+* Output valid JSON/XML on excetpion during HTTP query execution. Add setting `http_write_exception_in_output_format` to enable/disable this behaviour (enabled by default). [#52853](https://github.com/ClickHouse/ClickHouse/pull/52853) ([Kruglov Pavel](https://github.com/Avogar)).
+* View `information_schema.tables` now has a new field `data_length` which shows the approximate size of the data on disk. Required to run queries generated by Amazon QuickSight. [#55037](https://github.com/ClickHouse/ClickHouse/pull/55037) ([Robert Schulze](https://github.com/rschu1ze)).
+* The MySQL interface gained a minimal implementation of prepared statements, just enough to allow a connection from Tableau Online to ClickHouse via the MySQL connector. [#54115](https://github.com/ClickHouse/ClickHouse/pull/54115) ([Serge Klochkov](https://github.com/slvrtrn)). Please note: the prepared statements implementation is pretty minimal, we do not support arguments binding yet, it is not required in this particular Tableau online use case. It will be implemented as a follow-up if necessary after extensive testing of Tableau Online in case we discover issues.
+* Support case-insensitive and dot-all matching modes in `regexp_tree` dictionaries. [#50906](https://github.com/ClickHouse/ClickHouse/pull/50906) ([Johann Gan](https://github.com/johanngan)).
+* Keeper improvement: Add a `createIfNotExists` Keeper command. [#48855](https://github.com/ClickHouse/ClickHouse/pull/48855) ([Konstantin Bogdanov](https://github.com/thevar1able)).
+* More precise integer type inference, fix [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#53003](https://github.com/ClickHouse/ClickHouse/pull/53003) ([Chen768959](https://github.com/Chen768959)).
+* Introduced resolving of charsets in the string literals for MaterializedMySQL. [#53220](https://github.com/ClickHouse/ClickHouse/pull/53220) ([Val Doroshchuk](https://github.com/valbok)).
+* Fix a subtle issue with a rarely used `EmbeddedRocksDB` table engine in an extremely rare scenario: sometimes the `EmbeddedRocksDB` table engine does not close files correctly in NFS after running `DROP TABLE`. [#53502](https://github.com/ClickHouse/ClickHouse/pull/53502) ([Mingliang Pan](https://github.com/liangliangpan)).
+* `RESTORE TABLE ON CLUSTER` must create replicated tables with a matching UUID on hosts. Otherwise the macro `{uuid}` in ZooKeeper path can't work correctly after RESTORE. This PR implements that. [#53765](https://github.com/ClickHouse/ClickHouse/pull/53765) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Added restore setting `restore_broken_parts_as_detached`: if it's true the RESTORE process won't stop on broken parts while restoring, instead all the broken parts will be copied to the `detached` folder with the prefix `broken-from-backup'. If it's false the RESTORE process will stop on the first broken part (if any). The default value is false. [#53877](https://github.com/ClickHouse/ClickHouse/pull/53877) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Add `elapsed_ns` field to HTTP headers X-ClickHouse-Progress and X-ClickHouse-Summary. [#54179](https://github.com/ClickHouse/ClickHouse/pull/54179) ([joelynch](https://github.com/joelynch)).
+* Implementation of `reconfig` (https://github.com/ClickHouse/ClickHouse/pull/49450), `sync`, and `exists` commands for keeper-client. [#54201](https://github.com/ClickHouse/ClickHouse/pull/54201) ([pufit](https://github.com/pufit)).
+* `clickhouse-local` and `clickhouse-client` now allow to specify the `--query` parameter multiple times, e.g. `./clickhouse-client --query "SELECT 1" --query "SELECT 2"`. This syntax is slightly more intuitive than `./clickhouse-client --multiquery "SELECT 1;S ELECT 2"`, a bit easier to script (e.g. `queries.push_back('--query "$q"')`) and more consistent with the behavior of existing parameter `--queries-file` (e.g. `./clickhouse client --queries-file queries1.sql --queries-file queries2.sql`). [#54249](https://github.com/ClickHouse/ClickHouse/pull/54249) ([Robert Schulze](https://github.com/rschu1ze)).
+* Add sub-second precision to `formatReadableTimeDelta`. [#54250](https://github.com/ClickHouse/ClickHouse/pull/54250) ([Andrey Zvonov](https://github.com/zvonand)).
+* Enable `allow_remove_stale_moving_parts` by default. [#54260](https://github.com/ClickHouse/ClickHouse/pull/54260) ([vdimir](https://github.com/vdimir)).
+* Fix using count from cache and improve progress bar for reading from archives. [#54271](https://github.com/ClickHouse/ClickHouse/pull/54271) ([Kruglov Pavel](https://github.com/Avogar)).
+* Add support for S3 credentials using SSO. To define a profile to be used with SSO, set `AWS_PROFILE` environment variable. [#54347](https://github.com/ClickHouse/ClickHouse/pull/54347) ([Antonio Andelic](https://github.com/antonio2368)).
+* Support NULL as default for nested types Array/Tuple/Map for input formats. Closes [#51100](https://github.com/ClickHouse/ClickHouse/issues/51100). [#54351](https://github.com/ClickHouse/ClickHouse/pull/54351) ([Kruglov Pavel](https://github.com/Avogar)).
+* Allow reading some unusual configuration of chunks from Arrow/Parquet formats. [#54370](https://github.com/ClickHouse/ClickHouse/pull/54370) ([Arthur Passos](https://github.com/arthurpassos)).
+* Add `STD` alias to `stddevPop` function for MySQL compatibility. Closes [#54274](https://github.com/ClickHouse/ClickHouse/issues/54274). [#54382](https://github.com/ClickHouse/ClickHouse/pull/54382) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Add `addDate` function for compatibility with MySQL and `subDate` for consistency. Reference [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54400](https://github.com/ClickHouse/ClickHouse/pull/54400) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Support `SAMPLE BY` for views. [#54477](https://github.com/ClickHouse/ClickHouse/pull/54477) ([Azat Khuzhin](https://github.com/azat)).
+* Add `modification_time` into `system.detached_parts`. [#54506](https://github.com/ClickHouse/ClickHouse/pull/54506) ([Azat Khuzhin](https://github.com/azat)).
+* Added a setting `splitby_max_substrings_includes_remaining_string` which controls if functions "splitBy*()" with argument "max_substring" > 0 include the remaining string (if any) in the result array (Python/Spark semantics) or not. The default behavior does not change. [#54518](https://github.com/ClickHouse/ClickHouse/pull/54518) ([Robert Schulze](https://github.com/rschu1ze)).
+* Better integer types inference for `Int64`/`UInt64` fields. Continuation of [#53003](https://github.com/ClickHouse/ClickHouse/pull/53003). Now it works also for nested types like Arrays of Arrays and for functions like `map/tuple`. Issue: [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#54553](https://github.com/ClickHouse/ClickHouse/pull/54553) ([Kruglov Pavel](https://github.com/Avogar)).
+* Added array operations for multiplying, dividing and modulo on scalar. Works in each way, for example `5 * [5, 5]` and `[5, 5] * 5` - both cases are possible. [#54608](https://github.com/ClickHouse/ClickHouse/pull/54608) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* Add optional `version` argument to `rm` command in `keeper-client` to support safer deletes. [#54708](https://github.com/ClickHouse/ClickHouse/pull/54708) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* Disable killing the server by systemd (that may lead to data loss when using Buffer tables). [#54744](https://github.com/ClickHouse/ClickHouse/pull/54744) ([Azat Khuzhin](https://github.com/azat)).
+* Added field `is_deterministic` to system table `system.functions` which indicates whether the result of a function is stable between two invocations (given exactly the same inputs) or not. [#54766](https://github.com/ClickHouse/ClickHouse/pull/54766) [#55035](https://github.com/ClickHouse/ClickHouse/pull/55035) ([Robert Schulze](https://github.com/rschu1ze)).
+* Made the views in schema `information_schema` more compatible with the equivalent views in MySQL (i.e. modified and extended them) up to a point where Tableau Online is able to connect to ClickHouse. More specifically: 1. The type of field `information_schema.tables.table_type` changed from Enum8 to String. 2. Added fields `table_comment` and `table_collation` to view `information_schema.table`. 3. Added views `information_schema.key_column_usage` and `referential_constraints`. 4. Replaced uppercase aliases in `information_schema` views with concrete uppercase columns. [#54773](https://github.com/ClickHouse/ClickHouse/pull/54773) ([Serge Klochkov](https://github.com/slvrtrn)).
+* The query cache now returns an error if the user tries to cache the result of a query with a non-deterministic function such as `now`, `randomString` and `dictGet`. Compared to the previous behavior (silently don't cache the result), this reduces confusion and surprise for users. [#54801](https://github.com/ClickHouse/ClickHouse/pull/54801) ([Robert Schulze](https://github.com/rschu1ze)).
+* Forbid special columns like materialized/ephemeral/alias for `file`/`s3`/`url`/... storages, fix insert into ephemeral columns from files. Closes [#53477](https://github.com/ClickHouse/ClickHouse/issues/53477). [#54803](https://github.com/ClickHouse/ClickHouse/pull/54803) ([Kruglov Pavel](https://github.com/Avogar)).
+* More configurable collecting metadata for backup. [#54804](https://github.com/ClickHouse/ClickHouse/pull/54804) ([Vitaly Baranov](https://github.com/vitlibar)).
+* `clickhouse-local`'s log file (if enabled with --server_logs_file flag) will now prefix each line with timestamp, thread id, etc, just like `clickhouse-server`. [#54807](https://github.com/ClickHouse/ClickHouse/pull/54807) ([Michael Kolupaev](https://github.com/al13n321)).
+* Field `is_obsolete` in the `system.merge_tree_settings` table - it is now 1 for obsolete merge tree settings. Previously, only the description indicated that the setting is obsolete. [#54837](https://github.com/ClickHouse/ClickHouse/pull/54837) ([Robert Schulze](https://github.com/rschu1ze)).
+* Make it possible to use plural when using interval literals. `INTERVAL 2 HOURS` should be equivalent to `INTERVAL 2 HOUR`. [#54860](https://github.com/ClickHouse/ClickHouse/pull/54860) ([Jordi Villar](https://github.com/jrdi)).
+* Always allow the creation of a projection with `Nullable` PK. This fixes [#54814](https://github.com/ClickHouse/ClickHouse/issues/54814). [#54895](https://github.com/ClickHouse/ClickHouse/pull/54895) ([Amos Bird](https://github.com/amosbird)).
+* Retry backup's S3 operations after connection reset failure. [#54900](https://github.com/ClickHouse/ClickHouse/pull/54900) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Make the exception message exact in case of the maximum value of a settings is less than the minimum value. [#54925](https://github.com/ClickHouse/ClickHouse/pull/54925) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* `LIKE`, `match`, and other regular expressions matching functions now allow matching with patterns containing non-UTF-8 substrings by falling back to binary matching. Example: you can use `string LIKE '\xFE\xFF%'` to detect BOM. This closes [#54486](https://github.com/ClickHouse/ClickHouse/issues/54486). [#54942](https://github.com/ClickHouse/ClickHouse/pull/54942) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Added `ContextLockWaitMicroseconds` profile event. [#55029](https://github.com/ClickHouse/ClickHouse/pull/55029) ([Maksim Kita](https://github.com/kitaisreal)).
+* The Keeper dynamically adjusts log levels. [#50372](https://github.com/ClickHouse/ClickHouse/pull/50372) ([helifu](https://github.com/helifu)).
+* Added function `timestamp` for compatibility with MySQL. Closes [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54639](https://github.com/ClickHouse/ClickHouse/pull/54639) ([Nikolay Degterinsky](https://github.com/evillique)).
+
+#### Build/Testing/Packaging Improvement
+* Bumped the compiler of official and continuous integration builds of ClickHouse from Clang 16 to 17. [#53831](https://github.com/ClickHouse/ClickHouse/pull/53831) ([Robert Schulze](https://github.com/rschu1ze)).
+* Regenerated tld data for lookups (`tldLookup.generated.cpp`). [#54269](https://github.com/ClickHouse/ClickHouse/pull/54269) ([Bharat Nallan](https://github.com/bharatnc)).
+* Remove the redundant `clickhouse-keeper-client` symlink. [#54587](https://github.com/ClickHouse/ClickHouse/pull/54587) ([Tomas Barton](https://github.com/deric)).
+* Use `/usr/bin/env` to resolve bash - now it supports Nix OS. [#54603](https://github.com/ClickHouse/ClickHouse/pull/54603) ([Fionera](https://github.com/fionera)).
+* CMake added `PROFILE_CPU` option needed to perform `perf record` without using a DWARF call graph. [#54917](https://github.com/ClickHouse/ClickHouse/pull/54917) ([Maksim Kita](https://github.com/kitaisreal)).
+* If the linker is different than LLD, stop with a fatal error. [#55036](https://github.com/ClickHouse/ClickHouse/pull/55036) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Replaced the library to handle (encode/decode) base64 values from Turbo-Base64 to aklomp-base64. Both are SIMD-accelerated on x86 and ARM but 1. the license of the latter (BSD-2) is more favorable for ClickHouse, Turbo64 switched in the meantime to GPL-3, 2. with more GitHub stars, aklomp-base64 seems more future-proof, 3. aklomp-base64 has a slightly nicer API (which is arguably subjective), and 4. aklomp-base64 does not require us to hack around bugs (like non-threadsafe initialization). Note: aklomp-base64 rejects unpadded base64 values whereas Turbo-Base64 decodes them on a best-effort basis. RFC-4648 leaves it open whether padding is mandatory or not, but depending on the context this may be a behavioral change to be aware of. [#54119](https://github.com/ClickHouse/ClickHouse/pull/54119) ([Mikhail Koviazin](https://github.com/mkmkme)).
+
+#### Bug Fix (user-visible misbehavior in an official stable release)
+* Fix REPLACE/MOVE PARTITION with zero-copy replication (note: "zero-copy replication" is an experimental feature) [#54193](https://github.com/ClickHouse/ClickHouse/pull/54193) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix zero copy locks with hardlinks (note: "zero-copy replication" is an experimental feature) [#54859](https://github.com/ClickHouse/ClickHouse/pull/54859) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix zero copy garbage (note: "zero-copy replication" is an experimental feature) [#54550](https://github.com/ClickHouse/ClickHouse/pull/54550) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Pass HTTP retry timeout as milliseconds (it was incorrect before). [#54438](https://github.com/ClickHouse/ClickHouse/pull/54438) ([Duc Canh Le](https://github.com/canhld94)).
+* Fix misleading error message in OUTFILE with `CapnProto`/`Protobuf` [#52870](https://github.com/ClickHouse/ClickHouse/pull/52870) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix summary reporting with parallel replicas with LIMIT [#53050](https://github.com/ClickHouse/ClickHouse/pull/53050) ([Raúl Marín](https://github.com/Algunenano)).
+* Fix throttling of BACKUPs from/to S3 (in case native copy was not used) and in some other places as well [#53336](https://github.com/ClickHouse/ClickHouse/pull/53336) ([Azat Khuzhin](https://github.com/azat)).
+* Fix IO throttling during copying whole directories [#53338](https://github.com/ClickHouse/ClickHouse/pull/53338) ([Azat Khuzhin](https://github.com/azat)).
+* Fix: moved to prewhere condition actions can lose column [#53492](https://github.com/ClickHouse/ClickHouse/pull/53492) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Fixed internal error when replacing with byte-equal parts [#53735](https://github.com/ClickHouse/ClickHouse/pull/53735) ([Pedro Riera](https://github.com/priera)).
+* Fix: require columns participating in interpolate expression [#53754](https://github.com/ClickHouse/ClickHouse/pull/53754) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Fix cluster discovery initialization + setting up fail points in config [#54113](https://github.com/ClickHouse/ClickHouse/pull/54113) ([vdimir](https://github.com/vdimir)).
+* Fix issues in `accurateCastOrNull` [#54136](https://github.com/ClickHouse/ClickHouse/pull/54136) ([Salvatore Mesoraca](https://github.com/aiven-sal)).
+* Fix nullable primary key with the FINAL modifier [#54164](https://github.com/ClickHouse/ClickHouse/pull/54164) ([Amos Bird](https://github.com/amosbird)).
+* Fixed error that prevented insertion in replicated materialized view of new data in presence of duplicated data. [#54184](https://github.com/ClickHouse/ClickHouse/pull/54184) ([Pedro Riera](https://github.com/priera)).
+* Fix: allow `IPv6` for bloom filter [#54200](https://github.com/ClickHouse/ClickHouse/pull/54200) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* fix possible type mismatch with `IPv4` [#54212](https://github.com/ClickHouse/ClickHouse/pull/54212) ([Bharat Nallan](https://github.com/bharatnc)).
+* Fix `system.data_skipping_indices` for recreated indices [#54225](https://github.com/ClickHouse/ClickHouse/pull/54225) ([Artur Malchanau](https://github.com/Hexta)).
+* fix name clash for multiple join rewriter v2 [#54240](https://github.com/ClickHouse/ClickHouse/pull/54240) ([Tao Wang](https://github.com/wangtZJU)).
+* Fix unexpected errors in `system.errors` after join [#54306](https://github.com/ClickHouse/ClickHouse/pull/54306) ([vdimir](https://github.com/vdimir)).
+* Fix `isZeroOrNull(NULL)` [#54316](https://github.com/ClickHouse/ClickHouse/pull/54316) ([flynn](https://github.com/ucasfl)).
+* Fix: parallel replicas over distributed with `prefer_localhost_replica` = 1 [#54334](https://github.com/ClickHouse/ClickHouse/pull/54334) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix logical error in vertical merge + replacing merge tree + optimize cleanup [#54368](https://github.com/ClickHouse/ClickHouse/pull/54368) ([alesapin](https://github.com/alesapin)).
+* Fix possible error `URI contains invalid characters` in the `s3` table function [#54373](https://github.com/ClickHouse/ClickHouse/pull/54373) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix segfault in AST optimization of `arrayExists` function [#54379](https://github.com/ClickHouse/ClickHouse/pull/54379) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Check for overflow before addition in `analysisOfVariance` function [#54385](https://github.com/ClickHouse/ClickHouse/pull/54385) ([Antonio Andelic](https://github.com/antonio2368)).
+* Reproduce and fix the bug in removeSharedRecursive [#54430](https://github.com/ClickHouse/ClickHouse/pull/54430) ([Sema Checherinda](https://github.com/CheSema)).
+* Fix possible incorrect result with SimpleAggregateFunction in PREWHERE and FINAL [#54436](https://github.com/ClickHouse/ClickHouse/pull/54436) ([Azat Khuzhin](https://github.com/azat)).
+* Fix filtering parts with indexHint for non analyzer [#54449](https://github.com/ClickHouse/ClickHouse/pull/54449) ([Azat Khuzhin](https://github.com/azat)).
+* Fix aggregate projections with normalized states [#54480](https://github.com/ClickHouse/ClickHouse/pull/54480) ([Amos Bird](https://github.com/amosbird)).
+* `clickhouse-local`: something for multiquery parameter [#54498](https://github.com/ClickHouse/ClickHouse/pull/54498) ([CuiShuoGuo](https://github.com/bakam412)).
+* `clickhouse-local` supports `--database` command line argument [#54503](https://github.com/ClickHouse/ClickHouse/pull/54503) ([vdimir](https://github.com/vdimir)).
+* Fix possible parsing error in `-WithNames` formats with disabled `input_format_with_names_use_header` [#54513](https://github.com/ClickHouse/ClickHouse/pull/54513) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix rare case of CHECKSUM_DOESNT_MATCH error [#54549](https://github.com/ClickHouse/ClickHouse/pull/54549) ([alesapin](https://github.com/alesapin)).
+* Fix sorting of UNION ALL of already sorted results [#54564](https://github.com/ClickHouse/ClickHouse/pull/54564) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Fix snapshot install in Keeper [#54572](https://github.com/ClickHouse/ClickHouse/pull/54572) ([Antonio Andelic](https://github.com/antonio2368)).
+* Fix race in `ColumnUnique` [#54575](https://github.com/ClickHouse/ClickHouse/pull/54575) ([Nikita Taranov](https://github.com/nickitat)).
+* Annoy/Usearch index: Fix LOGICAL_ERROR during build-up with default values [#54600](https://github.com/ClickHouse/ClickHouse/pull/54600) ([Robert Schulze](https://github.com/rschu1ze)).
+* Fix serialization of `ColumnDecimal` [#54601](https://github.com/ClickHouse/ClickHouse/pull/54601) ([Nikita Taranov](https://github.com/nickitat)).
+* Fix schema inference for *Cluster functions for column names with spaces [#54635](https://github.com/ClickHouse/ClickHouse/pull/54635) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix using structure from insertion tables in case of defaults and explicit insert columns [#54655](https://github.com/ClickHouse/ClickHouse/pull/54655) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix: avoid using regex match, possibly containing alternation, as a key condition. [#54696](https://github.com/ClickHouse/ClickHouse/pull/54696) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Fix ReplacingMergeTree with vertical merge and cleanup [#54706](https://github.com/ClickHouse/ClickHouse/pull/54706) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
+* Fix virtual columns having incorrect values after ORDER BY [#54811](https://github.com/ClickHouse/ClickHouse/pull/54811) ([Michael Kolupaev](https://github.com/al13n321)).
+* Fix filtering parts with indexHint for non analyzer [#54825](https://github.com/ClickHouse/ClickHouse/pull/54825) [#54449](https://github.com/ClickHouse/ClickHouse/pull/54449) ([Azat Khuzhin](https://github.com/azat)).
+* Fix Keeper segfault during shutdown [#54841](https://github.com/ClickHouse/ClickHouse/pull/54841) ([Antonio Andelic](https://github.com/antonio2368)).
+* Fix `Invalid number of rows in Chunk` in MaterializedPostgreSQL [#54844](https://github.com/ClickHouse/ClickHouse/pull/54844) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Move obsolete format settings to separate section [#54855](https://github.com/ClickHouse/ClickHouse/pull/54855) ([Kruglov Pavel](https://github.com/Avogar)).
+* Rebuild `minmax_count_projection` when partition key gets modified [#54943](https://github.com/ClickHouse/ClickHouse/pull/54943) ([Amos Bird](https://github.com/amosbird)).
+* Fix bad cast to `ColumnVector` in function `if` [#55019](https://github.com/ClickHouse/ClickHouse/pull/55019) ([Kruglov Pavel](https://github.com/Avogar)).
+* Prevent attaching parts from tables with different projections or indices [#55062](https://github.com/ClickHouse/ClickHouse/pull/55062) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* Store NULL in scalar result map for empty subquery result [#52240](https://github.com/ClickHouse/ClickHouse/pull/52240) ([vdimir](https://github.com/vdimir)).
+* Fix `FINAL` produces invalid read ranges in a rare case [#54934](https://github.com/ClickHouse/ClickHouse/pull/54934) ([Nikita Taranov](https://github.com/nickitat)).
+* Fix: insert quorum w/o keeper retries [#55026](https://github.com/ClickHouse/ClickHouse/pull/55026) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix simple state with nullable [#55030](https://github.com/ClickHouse/ClickHouse/pull/55030) ([Pedro Riera](https://github.com/priera)).
+
+
### ClickHouse release 23.8 LTS, 2023-08-31
#### Backward Incompatible Change
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c0ef323e06b..4be0c63e3b8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -318,7 +318,16 @@ set (COMPILER_FLAGS "${COMPILER_FLAGS}")
# Our built-in unwinder only supports DWARF version up to 4.
set (DEBUG_INFO_FLAGS "-g -gdwarf-4")
-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}")
+# Disable omit frame pointer compiler optimization using -fno-omit-frame-pointer
+option(DISABLE_OMIT_FRAME_POINTER "Disable omit frame pointer compiler optimization" OFF)
+
+if (DISABLE_OMIT_FRAME_POINTER)
+ set (CMAKE_CXX_FLAGS_ADD "${CMAKE_CXX_FLAGS_ADD} -fno-omit-frame-pointer")
+ set (CMAKE_C_FLAGS_ADD "${CMAKE_C_FLAGS_ADD} -fno-omit-frame-pointer")
+ set (CMAKE_ASM_FLAGS_ADD "${CMAKE_ASM_FLAGS_ADD} -fno-omit-frame-pointer")
+endif()
+
+set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS} ${CMAKE_CXX_FLAGS_ADD}")
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 ${DEBUG_INFO_FLAGS} ${CMAKE_CXX_FLAGS_ADD}")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${DEBUG_INFO_FLAGS} ${CMAKE_CXX_FLAGS_ADD}")
diff --git a/README.md b/README.md
index 6736f5c67f3..2812c613eb2 100644
--- a/README.md
+++ b/README.md
@@ -23,10 +23,14 @@ curl https://clickhouse.com/ | sh
## Upcoming Events
* [**v23.9 Community Call**]([https://clickhouse.com/company/events/v23-8-community-release-call](https://clickhouse.com/company/events/v23-9-community-release-call)?utm_source=github&utm_medium=social&utm_campaign=release-webinar-2023-08) - Sep 28 - 23.9 is rapidly approaching. Original creator, co-founder, and CTO of ClickHouse Alexey Milovidov will walk us through the highlights of the release.
-* [**ClickHouse Meetup in Amsterdam**](https://www.meetup.com/clickhouse-netherlands-user-group/events/296334590/)) - Oct 31
+* [**ClickHouse Meetup in Amsterdam**](https://www.meetup.com/clickhouse-netherlands-user-group/events/296334590/) - Oct 31
* [**ClickHouse Meetup in Beijing**](https://www.meetup.com/clickhouse-beijing-user-group/events/296334856/) - Nov 4
-* [**ClickHouse Meetup in San Francisco**](https://www.meetup.com/clickhouse-silicon-valley-meetup-group/events/296334923/) - Nov 14
+* [**ClickHouse Meetup in San Francisco**](https://www.meetup.com/clickhouse-silicon-valley-meetup-group/events/296334923/) - Nov 8
+* [**ClickHouse Meetup in Tel Aviv**](https://www.meetup.com/clickhouse-tel-aviv-user-group/events/296487639/) - Nov 8
* [**ClickHouse Meetup in Singapore**](https://www.meetup.com/clickhouse-singapore-meetup-group/events/296334976/) - Nov 15
+* [**ClickHouse Meetup in Berlin**](https://www.meetup.com/clickhouse-berlin-user-group/events/296488501/) - Nov 30
+* [**ClickHouse Meetup in NYC**](https://www.meetup.com/clickhouse-new-york-user-group/events/296488779/) - Dec 11
+* [**ClickHouse Meetup in Boston**](https://www.meetup.com/clickhouse-boston-user-group/events/296488840/) - Dec 12
Also, keep an eye out for upcoming meetups around the world. Somewhere else you want us to be? Please feel free to reach out to tyler clickhouse com.
diff --git a/SECURITY.md b/SECURITY.md
index c3e36b90367..82b7254f8c1 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -13,9 +13,10 @@ The following versions of ClickHouse server are currently being supported with s
| Version | Supported |
|:-|:-|
+| 23.9 | ✔️ |
| 23.8 | ✔️ |
| 23.7 | ✔️ |
-| 23.6 | ✔️ |
+| 23.6 | ❌ |
| 23.5 | ❌ |
| 23.4 | ❌ |
| 23.3 | ✔️ |
diff --git a/base/base/hex.h b/base/base/hex.h
index 937218fec5a..931f220aa08 100644
--- a/base/base/hex.h
+++ b/base/base/hex.h
@@ -289,3 +289,13 @@ inline void writeBinByte(UInt8 byte, void * out)
{
memcpy(out, &impl::bin_byte_to_char_table[static_cast(byte) * 8], 8);
}
+
+/// Converts byte array to a hex string. Useful for debug logging.
+inline std::string hexString(const void * data, size_t size)
+{
+ const char * p = reinterpret_cast(data);
+ std::string s(size * 2, '\0');
+ for (size_t i = 0; i < size; ++i)
+ writeHexByteLowercase(p[i], s.data() + i * 2);
+ return s;
+}
diff --git a/base/base/sort.h b/base/base/sort.h
index 912545979dc..1a814587763 100644
--- a/base/base/sort.h
+++ b/base/base/sort.h
@@ -131,3 +131,29 @@ void sort(RandomIt first, RandomIt last)
using comparator = std::less;
::sort(first, last, comparator());
}
+
+/** Try to fast sort elements for common sorting patterns:
+ * 1. If elements are already sorted.
+ * 2. If elements are already almost sorted.
+ * 3. If elements are already sorted in reverse order.
+ *
+ * Returns true if fast sort was performed or elements were already sorted, false otherwise.
+ */
+template
+bool trySort(RandomIt first, RandomIt last, Compare compare)
+{
+#ifndef NDEBUG
+ ::shuffle(first, last);
+#endif
+
+ ComparatorWrapper compare_wrapper = compare;
+ return ::pdqsort_try_sort(first, last, compare_wrapper);
+}
+
+template
+bool trySort(RandomIt first, RandomIt last)
+{
+ using value_type = typename std::iterator_traits::value_type;
+ using comparator = std::less;
+ return ::trySort(first, last, comparator());
+}
diff --git a/cmake/autogenerated_versions.txt b/cmake/autogenerated_versions.txt
index 5c04bf5a77a..2f6d43d6cd0 100644
--- a/cmake/autogenerated_versions.txt
+++ b/cmake/autogenerated_versions.txt
@@ -2,11 +2,11 @@
# NOTE: has nothing common with DBMS_TCP_PROTOCOL_VERSION,
# only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes.
-SET(VERSION_REVISION 54478)
+SET(VERSION_REVISION 54479)
SET(VERSION_MAJOR 23)
-SET(VERSION_MINOR 9)
+SET(VERSION_MINOR 10)
SET(VERSION_PATCH 1)
-SET(VERSION_GITHASH ebc7d9a9f3b40be89e0b3e738b35d394aabeea3e)
-SET(VERSION_DESCRIBE v23.9.1.1-testing)
-SET(VERSION_STRING 23.9.1.1)
+SET(VERSION_GITHASH 8f9a227de1f530cdbda52c145d41a6b0f1d29961)
+SET(VERSION_DESCRIBE v23.10.1.1-testing)
+SET(VERSION_STRING 23.10.1.1)
# end of autochange
diff --git a/cmake/ccache.cmake b/cmake/ccache.cmake
index 9a70e4aee32..e8bf856332a 100644
--- a/cmake/ccache.cmake
+++ b/cmake/ccache.cmake
@@ -12,7 +12,7 @@ endif()
set(COMPILER_CACHE "auto" CACHE STRING "Speedup re-compilations using the caching tools; valid options are 'auto' (ccache, then sccache), 'ccache', 'sccache', or 'disabled'")
if(COMPILER_CACHE STREQUAL "auto")
- find_program (CCACHE_EXECUTABLE ccache sccache)
+ find_program (CCACHE_EXECUTABLE NAMES ccache sccache)
elseif (COMPILER_CACHE STREQUAL "ccache")
find_program (CCACHE_EXECUTABLE ccache)
elseif(COMPILER_CACHE STREQUAL "sccache")
diff --git a/cmake/tools.cmake b/cmake/tools.cmake
index 7fb45bc15d8..1ba3007b0f3 100644
--- a/cmake/tools.cmake
+++ b/cmake/tools.cmake
@@ -49,14 +49,14 @@ endif ()
if (NOT LINKER_NAME)
if (COMPILER_CLANG)
- if (OS_LINUX)
- if (NOT ARCH_S390X) # s390x doesnt support lld
- find_program (LLD_PATH NAMES "ld.lld-${COMPILER_VERSION_MAJOR}" "ld.lld")
- endif ()
+ if (OS_LINUX AND NOT ARCH_S390X)
+ find_program (LLD_PATH NAMES "ld.lld-${COMPILER_VERSION_MAJOR}" "ld.lld")
+ elseif (OS_DARWIN)
+ find_program (LLD_PATH NAMES "ld")
endif ()
endif ()
- if (OS_LINUX)
- if (LLD_PATH)
+ if (LLD_PATH)
+ if (OS_LINUX OR OS_DARWIN)
if (COMPILER_CLANG)
# Clang driver simply allows full linker path.
set (LINKER_NAME ${LLD_PATH})
@@ -75,9 +75,11 @@ endif ()
if (LINKER_NAME)
message(STATUS "Using linker: ${LINKER_NAME}")
-else()
+elseif (NOT ARCH_S390X AND NOT OS_FREEBSD)
+ message (FATAL_ERROR "The only supported linker is LLVM's LLD, but we cannot find it.")
+else ()
message(STATUS "Using linker: ")
-endif()
+endif ()
# Archiver
diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
index f9c3fddff40..390b0241e7d 100644
--- a/contrib/CMakeLists.txt
+++ b/contrib/CMakeLists.txt
@@ -212,6 +212,8 @@ add_contrib (libbcrypt-cmake libbcrypt)
add_contrib (google-benchmark-cmake google-benchmark)
add_contrib (ulid-c-cmake ulid-c)
+add_contrib (libssh-cmake libssh)
+
# Put all targets defined here and in subdirectories under "contrib/" folders in GUI-based IDEs.
# Some of third-party projects may override CMAKE_FOLDER or FOLDER property of their targets, so they would not appear
# in "contrib/..." as originally planned, so we workaround this by fixing FOLDER properties of all targets manually,
diff --git a/contrib/croaring b/contrib/croaring
index f40ed52bcdd..3fe177c82e2 160000
--- a/contrib/croaring
+++ b/contrib/croaring
@@ -1 +1 @@
-Subproject commit f40ed52bcdd635840a79877cef4857315dba817c
+Subproject commit 3fe177c82e2b04d34b815d9295381038880cb23d
diff --git a/contrib/croaring-cmake/CMakeLists.txt b/contrib/croaring-cmake/CMakeLists.txt
index 794c0426b96..5f3b90e0f7c 100644
--- a/contrib/croaring-cmake/CMakeLists.txt
+++ b/contrib/croaring-cmake/CMakeLists.txt
@@ -2,23 +2,25 @@ set(LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/croaring")
set(SRCS
"${LIBRARY_DIR}/src/array_util.c"
+ "${LIBRARY_DIR}/src/bitset.c"
"${LIBRARY_DIR}/src/bitset_util.c"
+ "${LIBRARY_DIR}/src/isadetection.c"
+ "${LIBRARY_DIR}/src/memory.c"
+ "${LIBRARY_DIR}/src/roaring.c"
+ "${LIBRARY_DIR}/src/roaring_array.c"
+ "${LIBRARY_DIR}/src/roaring_priority_queue.c"
"${LIBRARY_DIR}/src/containers/array.c"
"${LIBRARY_DIR}/src/containers/bitset.c"
"${LIBRARY_DIR}/src/containers/containers.c"
"${LIBRARY_DIR}/src/containers/convert.c"
- "${LIBRARY_DIR}/src/containers/mixed_intersection.c"
- "${LIBRARY_DIR}/src/containers/mixed_union.c"
- "${LIBRARY_DIR}/src/containers/mixed_equal.c"
- "${LIBRARY_DIR}/src/containers/mixed_subset.c"
- "${LIBRARY_DIR}/src/containers/mixed_negation.c"
- "${LIBRARY_DIR}/src/containers/mixed_xor.c"
"${LIBRARY_DIR}/src/containers/mixed_andnot.c"
- "${LIBRARY_DIR}/src/containers/run.c"
- "${LIBRARY_DIR}/src/roaring.c"
- "${LIBRARY_DIR}/src/roaring_priority_queue.c"
- "${LIBRARY_DIR}/src/roaring_array.c"
- "${LIBRARY_DIR}/src/memory.c")
+ "${LIBRARY_DIR}/src/containers/mixed_equal.c"
+ "${LIBRARY_DIR}/src/containers/mixed_intersection.c"
+ "${LIBRARY_DIR}/src/containers/mixed_negation.c"
+ "${LIBRARY_DIR}/src/containers/mixed_subset.c"
+ "${LIBRARY_DIR}/src/containers/mixed_union.c"
+ "${LIBRARY_DIR}/src/containers/mixed_xor.c"
+ "${LIBRARY_DIR}/src/containers/run.c")
add_library(_roaring ${SRCS})
diff --git a/contrib/googletest b/contrib/googletest
index 71140c3ca7a..e47544ad31c 160000
--- a/contrib/googletest
+++ b/contrib/googletest
@@ -1 +1 @@
-Subproject commit 71140c3ca7a87bb1b5b9c9f1500fea8858cce344
+Subproject commit e47544ad31cb3ceecd04cc13e8fe556f8df9fe0b
diff --git a/contrib/libssh b/contrib/libssh
new file mode 160000
index 00000000000..2c76332ef56
--- /dev/null
+++ b/contrib/libssh
@@ -0,0 +1 @@
+Subproject commit 2c76332ef56d90f55965ab24da6b6dbcbef29c4c
diff --git a/contrib/libssh-cmake/CMakeLists.txt b/contrib/libssh-cmake/CMakeLists.txt
new file mode 100644
index 00000000000..58db81cf352
--- /dev/null
+++ b/contrib/libssh-cmake/CMakeLists.txt
@@ -0,0 +1,74 @@
+set(LIB_SOURCE_DIR "${ClickHouse_SOURCE_DIR}/contrib/libssh")
+set(LIB_BINARY_DIR "${ClickHouse_BINARY_DIR}/contrib/libssh")
+# Specify search path for CMake modules to be loaded by include()
+# and find_package()
+list(APPEND CMAKE_MODULE_PATH "${LIB_SOURCE_DIR}/cmake/Modules")
+
+include(DefineCMakeDefaults)
+include(DefineCompilerFlags)
+
+project(libssh VERSION 0.9.7 LANGUAGES C)
+
+# global needed variable
+set(APPLICATION_NAME ${PROJECT_NAME})
+
+# SOVERSION scheme: CURRENT.AGE.REVISION
+# If there was an incompatible interface change:
+# Increment CURRENT. Set AGE and REVISION to 0
+# If there was a compatible interface change:
+# Increment AGE. Set REVISION to 0
+# If the source code was changed, but there were no interface changes:
+# Increment REVISION.
+set(LIBRARY_VERSION "4.8.7")
+set(LIBRARY_SOVERSION "4")
+
+# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
+
+# add definitions
+
+include(DefinePlatformDefaults)
+
+# Copy library files to a lib sub-directory
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${LIB_BINARY_DIR}/lib")
+
+set(CMAKE_THREAD_PREFER_PTHREADS ON)
+set(THREADS_PREFER_PTHREAD_FLAG ON)
+
+set(WITH_ZLIB OFF)
+set(WITH_SYMBOL_VERSIONING OFF)
+set(WITH_SERVER ON)
+
+include(IncludeSources.cmake)
+if (OS_LINUX)
+ if (ARCH_AMD64)
+ if (USE_MUSL)
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/linux/x86-64-musl")
+ else()
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/linux/x86-64")
+ endif ()
+ elseif (ARCH_AARCH64)
+ if (USE_MUSL)
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/linux/aarch64-musl")
+ else()
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/linux/aarch64")
+ endif ()
+ elseif (ARCH_PPC64LE)
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/linux/ppc64le")
+ elseif (ARCH_S390X)
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/linux/s390x")
+ elseif (ARCH_RISCV64)
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/linux/riscv64")
+ else ()
+ message(FATAL_ERROR "Platform is not supported")
+ endif ()
+elseif (OS_DARWIN)
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/darwin")
+elseif (OS_FREEBSD)
+ target_include_directories(_ssh PRIVATE "${ClickHouse_SOURCE_DIR}/contrib/libssh-cmake/freebsd")
+else ()
+ message(FATAL_ERROR "Platform is not supported")
+endif()
+
+configure_file(${LIB_SOURCE_DIR}/include/libssh/libssh_version.h.cmake
+ ${LIB_BINARY_DIR}/include/libssh/libssh_version.h
+ @ONLY)
diff --git a/contrib/libssh-cmake/IncludeSources.cmake b/contrib/libssh-cmake/IncludeSources.cmake
new file mode 100644
index 00000000000..d72cf11da1f
--- /dev/null
+++ b/contrib/libssh-cmake/IncludeSources.cmake
@@ -0,0 +1,140 @@
+set(LIBSSH_LINK_LIBRARIES
+ ${LIBSSH_REQUIRED_LIBRARIES}
+)
+
+
+set(LIBSSH_LINK_LIBRARIES
+ ${LIBSSH_LINK_LIBRARIES}
+ OpenSSL::Crypto
+)
+
+if (MINGW AND Threads_FOUND)
+ set(LIBSSH_LINK_LIBRARIES
+ ${LIBSSH_LINK_LIBRARIES}
+ Threads::Threads
+ )
+endif()
+
+set(libssh_SRCS
+ ${LIB_SOURCE_DIR}/src/agent.c
+ ${LIB_SOURCE_DIR}/src/auth.c
+ ${LIB_SOURCE_DIR}/src/base64.c
+ ${LIB_SOURCE_DIR}/src/bignum.c
+ ${LIB_SOURCE_DIR}/src/buffer.c
+ ${LIB_SOURCE_DIR}/src/callbacks.c
+ ${LIB_SOURCE_DIR}/src/channels.c
+ ${LIB_SOURCE_DIR}/src/client.c
+ ${LIB_SOURCE_DIR}/src/config.c
+ ${LIB_SOURCE_DIR}/src/connect.c
+ ${LIB_SOURCE_DIR}/src/connector.c
+ ${LIB_SOURCE_DIR}/src/curve25519.c
+ ${LIB_SOURCE_DIR}/src/dh.c
+ ${LIB_SOURCE_DIR}/src/ecdh.c
+ ${LIB_SOURCE_DIR}/src/error.c
+ ${LIB_SOURCE_DIR}/src/getpass.c
+ ${LIB_SOURCE_DIR}/src/init.c
+ ${LIB_SOURCE_DIR}/src/kdf.c
+ ${LIB_SOURCE_DIR}/src/kex.c
+ ${LIB_SOURCE_DIR}/src/known_hosts.c
+ ${LIB_SOURCE_DIR}/src/knownhosts.c
+ ${LIB_SOURCE_DIR}/src/legacy.c
+ ${LIB_SOURCE_DIR}/src/log.c
+ ${LIB_SOURCE_DIR}/src/match.c
+ ${LIB_SOURCE_DIR}/src/messages.c
+ ${LIB_SOURCE_DIR}/src/misc.c
+ ${LIB_SOURCE_DIR}/src/options.c
+ ${LIB_SOURCE_DIR}/src/packet.c
+ ${LIB_SOURCE_DIR}/src/packet_cb.c
+ ${LIB_SOURCE_DIR}/src/packet_crypt.c
+ ${LIB_SOURCE_DIR}/src/pcap.c
+ ${LIB_SOURCE_DIR}/src/pki.c
+ ${LIB_SOURCE_DIR}/src/pki_container_openssh.c
+ ${LIB_SOURCE_DIR}/src/poll.c
+ ${LIB_SOURCE_DIR}/src/session.c
+ ${LIB_SOURCE_DIR}/src/scp.c
+ ${LIB_SOURCE_DIR}/src/socket.c
+ ${LIB_SOURCE_DIR}/src/string.c
+ ${LIB_SOURCE_DIR}/src/threads.c
+ ${LIB_SOURCE_DIR}/src/wrapper.c
+ ${LIB_SOURCE_DIR}/src/external/bcrypt_pbkdf.c
+ ${LIB_SOURCE_DIR}/src/external/blowfish.c
+ ${LIB_SOURCE_DIR}/src/external/chacha.c
+ ${LIB_SOURCE_DIR}/src/external/poly1305.c
+ ${LIB_SOURCE_DIR}/src/chachapoly.c
+ ${LIB_SOURCE_DIR}/src/config_parser.c
+ ${LIB_SOURCE_DIR}/src/token.c
+ ${LIB_SOURCE_DIR}/src/pki_ed25519_common.c
+)
+
+if (DEFAULT_C_NO_DEPRECATION_FLAGS)
+ set_source_files_properties(known_hosts.c
+ PROPERTIES
+ COMPILE_FLAGS ${DEFAULT_C_NO_DEPRECATION_FLAGS})
+endif()
+
+if (CMAKE_USE_PTHREADS_INIT)
+ set(libssh_SRCS
+ ${libssh_SRCS}
+ ${LIB_SOURCE_DIR}/src/threads/noop.c
+ ${LIB_SOURCE_DIR}/src/threads/pthread.c
+ )
+elseif (CMAKE_USE_WIN32_THREADS_INIT)
+ set(libssh_SRCS
+ ${libssh_SRCS}
+ ${LIB_SOURCE_DIR}/src/threads/noop.c
+ ${LIB_SOURCE_DIR}/src/threads/winlocks.c
+ )
+else()
+ set(libssh_SRCS
+ ${libssh_SRCS}
+ ${LIB_SOURCE_DIR}/src/threads/noop.c
+ )
+endif()
+
+# LIBCRYPT specific
+set(libssh_SRCS
+ ${libssh_SRCS}
+ ${LIB_SOURCE_DIR}/src/threads/libcrypto.c
+ ${LIB_SOURCE_DIR}/src/pki_crypto.c
+ ${LIB_SOURCE_DIR}/src/ecdh_crypto.c
+ ${LIB_SOURCE_DIR}/src/libcrypto.c
+ ${LIB_SOURCE_DIR}/src/dh_crypto.c
+)
+
+if (NOT (ENABLE_OPENSSL OR ENABLE_OPENSSL_DYNAMIC))
+ add_compile_definitions(USE_BORINGSSL=1)
+endif()
+
+set(libssh_SRCS
+${libssh_SRCS}
+${LIB_SOURCE_DIR}/src/options.c
+${LIB_SOURCE_DIR}/src/server.c
+${LIB_SOURCE_DIR}/src/bind.c
+${LIB_SOURCE_DIR}/src/bind_config.c
+)
+
+
+add_library(_ssh STATIC ${libssh_SRCS})
+
+target_include_directories(_ssh PRIVATE ${LIB_BINARY_DIR})
+target_include_directories(_ssh PUBLIC "${LIB_SOURCE_DIR}/include" "${LIB_BINARY_DIR}/include")
+target_link_libraries(_ssh
+ PRIVATE ${LIBSSH_LINK_LIBRARIES})
+
+add_library(ch_contrib::ssh ALIAS _ssh)
+
+target_compile_options(_ssh
+ PRIVATE
+ ${DEFAULT_C_COMPILE_FLAGS}
+ -D_GNU_SOURCE)
+
+
+set_target_properties(_ssh
+ PROPERTIES
+ VERSION
+ ${LIBRARY_VERSION}
+ SOVERSION
+ ${LIBRARY_SOVERSION}
+ DEFINE_SYMBOL
+ LIBSSH_EXPORTS
+)
diff --git a/contrib/libssh-cmake/darwin/config.h b/contrib/libssh-cmake/darwin/config.h
new file mode 100644
index 00000000000..12378a64cea
--- /dev/null
+++ b/contrib/libssh-cmake/darwin/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/darwin"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UTMP_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UTIL_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+#define HAVE_GLOB_GL_FLAGS_MEMBER 1
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+#define HAVE_NTOHLL 1
+
+/* Define to 1 if you have the `htonll' function. */
+#define HAVE_HTONLL 1
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+/* #undef HAVE_EXPLICIT_BZERO */
+
+/* Define to 1 if you have the `memset_s' function. */
+#define HAVE_MEMSET_S 1
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/libssh-cmake/freebsd/config.h b/contrib/libssh-cmake/freebsd/config.h
new file mode 100644
index 00000000000..8a70acb473c
--- /dev/null
+++ b/contrib/libssh-cmake/freebsd/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/freebsd"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+#define HAVE_GLOB_GL_FLAGS_MEMBER 1
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+#define HAVE_EXPLICIT_BZERO 1
+
+/* Define to 1 if you have the `memset_s' function. */
+/* #undef HAVE_MEMSET_S */
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/libssh-cmake/linux/aarch64-musl/config.h b/contrib/libssh-cmake/linux/aarch64-musl/config.h
new file mode 100644
index 00000000000..15236527fdf
--- /dev/null
+++ b/contrib/libssh-cmake/linux/aarch64-musl/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/aarch64-musl"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+/* #undef HAVE_GLOB_GL_FLAGS_MEMBER
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+#define HAVE_EXPLICIT_BZERO 1
+
+/* Define to 1 if you have the `memset_s' function. */
+/* #undef HAVE_MEMSET_S */
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/libssh-cmake/linux/aarch64/config.h b/contrib/libssh-cmake/linux/aarch64/config.h
new file mode 100644
index 00000000000..e65ccb8ba3e
--- /dev/null
+++ b/contrib/libssh-cmake/linux/aarch64/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/aarch64"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+#define HAVE_GLOB_GL_FLAGS_MEMBER 1
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+#define HAVE_EXPLICIT_BZERO 1
+
+/* Define to 1 if you have the `memset_s' function. */
+#define HAVE_MEMSET_S 1
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/libssh-cmake/linux/ppc64le/config.h b/contrib/libssh-cmake/linux/ppc64le/config.h
new file mode 100644
index 00000000000..c56b1ad0334
--- /dev/null
+++ b/contrib/libssh-cmake/linux/ppc64le/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/ppc64le"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+#define HAVE_GLOB_GL_FLAGS_MEMBER 1
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+/* #undef HAVE_EXPLICIT_BZERO 1 */
+
+/* Define to 1 if you have the `memset_s' function. */
+/* #undef HAVE_MEMSET_S */
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/libssh-cmake/linux/riscv64/config.h b/contrib/libssh-cmake/linux/riscv64/config.h
new file mode 100644
index 00000000000..33c91bf542b
--- /dev/null
+++ b/contrib/libssh-cmake/linux/riscv64/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/riscv64"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+#define HAVE_GLOB_GL_FLAGS_MEMBER 1
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+/* #undef HAVE_EXPLICIT_BZERO 1 */
+
+/* Define to 1 if you have the `memset_s' function. */
+/* #undef HAVE_MEMSET_S */
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/libssh-cmake/linux/s390x/config.h b/contrib/libssh-cmake/linux/s390x/config.h
new file mode 100644
index 00000000000..289a8cabc8e
--- /dev/null
+++ b/contrib/libssh-cmake/linux/s390x/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/s390x"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+#define HAVE_GLOB_GL_FLAGS_MEMBER 1
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+/* #undef HAVE_EXPLICIT_BZERO 1 */
+
+/* Define to 1 if you have the `memset_s' function. */
+/* #undef HAVE_MEMSET_S */
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#define WORDS_BIGENDIAN 1
diff --git a/contrib/libssh-cmake/linux/x86-64-musl/config.h b/contrib/libssh-cmake/linux/x86-64-musl/config.h
new file mode 100644
index 00000000000..fd7c2e2b0c1
--- /dev/null
+++ b/contrib/libssh-cmake/linux/x86-64-musl/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/musl"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+/* #undef HAVE_GLOB_GL_FLAGS_MEMBER
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+#define HAVE_EXPLICIT_BZERO 1
+
+/* Define to 1 if you have the `memset_s' function. */
+/* #undef HAVE_MEMSET_S */
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/libssh-cmake/linux/x86-64/config.h b/contrib/libssh-cmake/linux/x86-64/config.h
new file mode 100644
index 00000000000..4090c5a45ad
--- /dev/null
+++ b/contrib/libssh-cmake/linux/x86-64/config.h
@@ -0,0 +1,287 @@
+/* Name of package */
+#define PACKAGE "libssh"
+
+/* Version number of package */
+#define VERSION "0.9.7"
+
+#define SYSCONFDIR "etc"
+#define BINARYDIR "/home/ubuntu/workdir/ClickHouse/build/Debug"
+#define SOURCEDIR "/home/ubuntu/workdir/ClickHouse"
+
+/* Global bind configuration file path */
+#define GLOBAL_BIND_CONFIG "/etc/ssh/libssh_server_config"
+
+/* Global client configuration file path */
+#define GLOBAL_CLIENT_CONFIG "/etc/ssh/ssh_config"
+
+/************************** HEADER FILES *************************/
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_ARGP_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_VALGRIND_VALGRIND_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_PTY_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTMP_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_UTIL_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_LIBUTIL_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_SYS_UTIME_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_IO_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_AES_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_OPENSSL_BLOWFISH_H */
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_DES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDH_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_EC_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_OPENSSL_ECDSA_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_PTHREAD_H 1
+
+/* Define to 1 if you have eliptic curve cryptography in openssl */
+#define HAVE_OPENSSL_ECC 1
+
+/* Define to 1 if you have eliptic curve cryptography in gcrypt */
+/* #undef HAVE_GCRYPT_ECC */
+
+/* Define to 1 if you have eliptic curve cryptography */
+#define HAVE_ECC 1
+
+/* Define to 1 if you have DSA */
+/* #undef HAVE_DSA */
+
+/* Define to 1 if you have gl_flags as a glob_t sturct member */
+#define HAVE_GLOB_GL_FLAGS_MEMBER 1
+
+/* Define to 1 if you have OpenSSL with Ed25519 support */
+#define HAVE_OPENSSL_ED25519 1
+
+/* Define to 1 if you have OpenSSL with X25519 support */
+#define HAVE_OPENSSL_X25519 1
+
+/*************************** FUNCTIONS ***************************/
+
+/* Define to 1 if you have the `EVP_aes128_ctr' function. */
+#define HAVE_OPENSSL_EVP_AES_CTR 1
+
+/* Define to 1 if you have the `EVP_aes128_cbc' function. */
+#define HAVE_OPENSSL_EVP_AES_CBC 1
+
+/* Define to 1 if you have the `EVP_aes128_gcm' function. */
+/* #undef HAVE_OPENSSL_EVP_AES_GCM */
+
+/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+#define HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
+
+/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
+#define HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
+
+/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
+#define HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
+
+/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */
+/* #undef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID */
+
+/* Define to 1 if you have the `FIPS_mode' function. */
+#if USE_BORINGSSL
+#define HAVE_OPENSSL_FIPS_MODE 1
+#endif
+
+/* Define to 1 if you have the `EVP_DigestSign' function. */
+#define HAVE_OPENSSL_EVP_DIGESTSIGN 1
+
+/* Define to 1 if you have the `EVP_DigestVerify' function. */
+#define HAVE_OPENSSL_EVP_DIGESTVERIFY 1
+
+/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */
+/* #undef HAVE_OPENSSL_IA32CAP_LOC */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `_snprintf' function. */
+/* #undef HAVE__SNPRINTF */
+
+/* Define to 1 if you have the `_snprintf_s' function. */
+/* #undef HAVE__SNPRINTF_S */
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+/* #undef HAVE__VSNPRINTF */
+
+/* Define to 1 if you have the `_vsnprintf_s' function. */
+/* #undef HAVE__VSNPRINTF_S */
+
+/* Define to 1 if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define to 1 if you have the `strncpy' function. */
+#define HAVE_STRNCPY 1
+
+/* Define to 1 if you have the `strndup' function. */
+#define HAVE_STRNDUP 1
+
+/* Define to 1 if you have the `cfmakeraw' function. */
+/* #undef HAVE_CFMAKERAW */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `poll' function. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Define to 1 if you have the `ntohll' function. */
+/* #undef HAVE_NTOHLL */
+
+/* Define to 1 if you have the `htonll' function. */
+/* #undef HAVE_HTONLL */
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `__strtoull' function. */
+/* #undef HAVE___STRTOULL */
+
+/* Define to 1 if you have the `_strtoui64' function. */
+/* #undef HAVE__STRTOUI64 */
+
+/* Define to 1 if you have the `glob' function. */
+#define HAVE_GLOB 1
+
+/* Define to 1 if you have the `explicit_bzero' function. */
+#define HAVE_EXPLICIT_BZERO 1
+
+/* Define to 1 if you have the `memset_s' function. */
+#define HAVE_MEMSET_S 1
+
+/* Define to 1 if you have the `SecureZeroMemory' function. */
+/* #undef HAVE_SECURE_ZERO_MEMORY */
+
+/* Define to 1 if you have the `cmocka_set_test_filter' function. */
+/* #undef HAVE_CMOCKA_SET_TEST_FILTER */
+
+/*************************** LIBRARIES ***************************/
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#define HAVE_LIBCRYPTO 1
+
+/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
+/* #undef HAVE_LIBGCRYPT */
+
+/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
+/* #undef HAVE_LIBMBEDCRYPTO */
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the `cmocka' library (-lcmocka). */
+/* #undef HAVE_CMOCKA */
+
+/**************************** OPTIONS ****************************/
+
+#define HAVE_GCC_THREAD_LOCAL_STORAGE 1
+/* #undef HAVE_MSC_THREAD_LOCAL_STORAGE */
+
+#define HAVE_FALLTHROUGH_ATTRIBUTE 1
+#define HAVE_UNUSED_ATTRIBUTE 1
+
+#define HAVE_CONSTRUCTOR_ATTRIBUTE 1
+#define HAVE_DESTRUCTOR_ATTRIBUTE 1
+
+#define HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
+
+#define HAVE_COMPILER__FUNC__ 1
+#define HAVE_COMPILER__FUNCTION__ 1
+
+/* #undef HAVE_GCC_BOUNDED_ATTRIBUTE */
+
+/* Define to 1 if you want to enable GSSAPI */
+/* #undef WITH_GSSAPI */
+
+/* Define to 1 if you want to enable ZLIB */
+/* #undef WITH_ZLIB */
+
+/* Define to 1 if you want to enable SFTP */
+/* #undef WITH_SFTP */
+
+/* Define to 1 if you want to enable server support */
+#define WITH_SERVER 1
+
+/* Define to 1 if you want to enable DH group exchange algorithms */
+/* #undef WITH_GEX */
+
+/* Define to 1 if you want to enable blowfish cipher support */
+/* #undef WITH_BLOWFISH_CIPHER */
+
+/* Define to 1 if you want to enable debug output for crypto functions */
+/* #undef DEBUG_CRYPTO */
+
+/* Define to 1 if you want to enable debug output for packet functions */
+/* #undef DEBUG_PACKET */
+
+/* Define to 1 if you want to enable pcap output support (experimental) */
+/* #undef WITH_PCAP */
+
+/* Define to 1 if you want to enable calltrace debug output */
+/* #undef DEBUG_CALLTRACE */
+
+/* Define to 1 if you want to enable NaCl support */
+/* #undef WITH_NACL */
+
+/*************************** ENDIAN *****************************/
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #undef WORDS_BIGENDIAN */
diff --git a/contrib/pdqsort/pdqsort.h b/contrib/pdqsort/pdqsort.h
index 01e82b710ee..cbfc82a4f41 100644
--- a/contrib/pdqsort/pdqsort.h
+++ b/contrib/pdqsort/pdqsort.h
@@ -54,8 +54,10 @@ namespace pdqsort_detail {
block_size = 64,
// Cacheline size, assumes power of two.
- cacheline_size = 64
+ cacheline_size = 64,
+ /// Try sort allowed iterations
+ try_sort_iterations = 3,
};
#if __cplusplus >= 201103L
@@ -501,6 +503,167 @@ namespace pdqsort_detail {
leftmost = false;
}
}
+
+ template
+ inline bool pdqsort_try_sort_loop(Iter begin,
+ Iter end,
+ Compare comp,
+ size_t bad_allowed,
+ size_t iterations_allowed,
+ bool force_sort = false,
+ bool leftmost = true) {
+ typedef typename std::iterator_traits::difference_type diff_t;
+
+ // Use a while loop for tail recursion elimination.
+ while (true) {
+ if (!force_sort && iterations_allowed == 0) {
+ return false;
+ }
+
+ diff_t size = end - begin;
+
+ // Insertion sort is faster for small arrays.
+ if (size < insertion_sort_threshold) {
+ if (leftmost) insertion_sort(begin, end, comp);
+ else unguarded_insertion_sort(begin, end, comp);
+
+ return true;
+ }
+
+ // Choose pivot as median of 3 or pseudomedian of 9.
+ diff_t s2 = size / 2;
+ if (size > ninther_threshold) {
+ sort3(begin, begin + s2, end - 1, comp);
+ sort3(begin + 1, begin + (s2 - 1), end - 2, comp);
+ sort3(begin + 2, begin + (s2 + 1), end - 3, comp);
+ sort3(begin + (s2 - 1), begin + s2, begin + (s2 + 1), comp);
+ std::iter_swap(begin, begin + s2);
+ } else sort3(begin + s2, begin, end - 1, comp);
+
+ // If *(begin - 1) is the end of the right partition of a previous partition operation
+ // there is no element in [begin, end) that is smaller than *(begin - 1). Then if our
+ // pivot compares equal to *(begin - 1) we change strategy, putting equal elements in
+ // the left partition, greater elements in the right partition. We do not have to
+ // recurse on the left partition, since it's sorted (all equal).
+ if (!leftmost && !comp(*(begin - 1), *begin)) {
+ begin = partition_left(begin, end, comp) + 1;
+ continue;
+ }
+
+ // Partition and get results.
+ std::pair part_result =
+ Branchless ? partition_right_branchless(begin, end, comp)
+ : partition_right(begin, end, comp);
+ Iter pivot_pos = part_result.first;
+ bool already_partitioned = part_result.second;
+
+ // Check for a highly unbalanced partition.
+ diff_t l_size = pivot_pos - begin;
+ diff_t r_size = end - (pivot_pos + 1);
+ bool highly_unbalanced = l_size < size / 8 || r_size < size / 8;
+
+ // If we got a highly unbalanced partition we shuffle elements to break many patterns.
+ if (highly_unbalanced) {
+ if (!force_sort) {
+ return false;
+ }
+
+ // If we had too many bad partitions, switch to heapsort to guarantee O(n log n).
+ if (--bad_allowed == 0) {
+ std::make_heap(begin, end, comp);
+ std::sort_heap(begin, end, comp);
+ return true;
+ }
+
+ if (l_size >= insertion_sort_threshold) {
+ std::iter_swap(begin, begin + l_size / 4);
+ std::iter_swap(pivot_pos - 1, pivot_pos - l_size / 4);
+
+ if (l_size > ninther_threshold) {
+ std::iter_swap(begin + 1, begin + (l_size / 4 + 1));
+ std::iter_swap(begin + 2, begin + (l_size / 4 + 2));
+ std::iter_swap(pivot_pos - 2, pivot_pos - (l_size / 4 + 1));
+ std::iter_swap(pivot_pos - 3, pivot_pos - (l_size / 4 + 2));
+ }
+ }
+
+ if (r_size >= insertion_sort_threshold) {
+ std::iter_swap(pivot_pos + 1, pivot_pos + (1 + r_size / 4));
+ std::iter_swap(end - 1, end - r_size / 4);
+
+ if (r_size > ninther_threshold) {
+ std::iter_swap(pivot_pos + 2, pivot_pos + (2 + r_size / 4));
+ std::iter_swap(pivot_pos + 3, pivot_pos + (3 + r_size / 4));
+ std::iter_swap(end - 2, end - (1 + r_size / 4));
+ std::iter_swap(end - 3, end - (2 + r_size / 4));
+ }
+ }
+ } else {
+ // If we were decently balanced and we tried to sort an already partitioned
+ // sequence try to use insertion sort.
+ if (already_partitioned && partial_insertion_sort(begin, pivot_pos, comp)
+ && partial_insertion_sort(pivot_pos + 1, end, comp)) {
+ return true;
+ }
+ }
+
+ // Sort the left partition first using recursion and do tail recursion elimination for
+ // the right-hand partition.
+ if (pdqsort_try_sort_loop(begin,
+ pivot_pos,
+ comp,
+ bad_allowed,
+ iterations_allowed - 1,
+ force_sort,
+ leftmost)) {
+ force_sort = true;
+ } else {
+ return false;
+ }
+
+ --iterations_allowed;
+ begin = pivot_pos + 1;
+ leftmost = false;
+ }
+
+ return false;
+ }
+
+ template
+ inline bool pdqsort_try_sort_impl(Iter begin, Iter end, Compare comp, size_t bad_allowed)
+ {
+ typedef typename std::iterator_traits::difference_type diff_t;
+
+ static constexpr size_t iterations_allowed = pdqsort_detail::try_sort_iterations;
+ static constexpr size_t num_to_try = 16;
+
+ diff_t size = end - begin;
+
+ if (size > num_to_try * 10)
+ {
+ size_t out_of_order_elements = 0;
+
+ for (size_t i = 1; i < num_to_try; ++i)
+ {
+ diff_t offset = size / num_to_try;
+
+ diff_t prev_position = offset * (i - 1);
+ diff_t curr_position = offset * i;
+ diff_t next_position = offset * (i + 1) - 1;
+
+ bool prev_less_than_curr = comp(*(begin + prev_position), *(begin + curr_position));
+ bool curr_less_than_next = comp(*(begin + curr_position), *(begin + next_position));
+ if ((prev_less_than_curr && curr_less_than_next) || (!prev_less_than_curr && !curr_less_than_next))
+ continue;
+
+ ++out_of_order_elements;
+ if (out_of_order_elements > iterations_allowed)
+ return false;
+ }
+ }
+
+ return pdqsort_try_sort_loop(begin, end, comp, bad_allowed, iterations_allowed);
+ }
}
@@ -538,6 +701,41 @@ inline void pdqsort_branchless(Iter begin, Iter end) {
pdqsort_branchless(begin, end, std::less());
}
+template
+inline bool pdqsort_try_sort(Iter begin, Iter end, Compare comp) {
+ if (begin == end) return true;
+
+#if __cplusplus >= 201103L
+ return pdqsort_detail::pdqsort_try_sort_impl::type>::value &&
+ std::is_arithmetic::value_type>::value>(
+ begin, end, comp, pdqsort_detail::log2(end - begin));
+#else
+ return pdqsort_detail::pdqsort_try_sort_impl(
+ begin, end, comp, pdqsort_detail::log2(end - begin));
+#endif
+}
+
+template
+inline bool pdqsort_try_sort(Iter begin, Iter end) {
+ typedef typename std::iterator_traits::value_type T;
+ return pdqsort_try_sort(begin, end, std::less());
+}
+
+template
+inline bool pdqsort_try_sort_branchless(Iter begin, Iter end, Compare comp) {
+ if (begin == end) return true;
+
+ return pdqsort_detail::pdqsort_try_sort_impl(
+ begin, end, comp, pdqsort_detail::log2(end - begin));
+}
+
+template
+inline bool pdqsort_try_sort_branchless(Iter begin, Iter end) {
+ typedef typename std::iterator_traits::value_type T;
+ return pdqsort_try_sort_branchless(begin, end, std::less());
+}
+
#undef PDQSORT_PREFER_MOVE
diff --git a/docker/keeper/Dockerfile b/docker/keeper/Dockerfile
index 63dbac6a995..0e10068d79a 100644
--- a/docker/keeper/Dockerfile
+++ b/docker/keeper/Dockerfile
@@ -32,7 +32,7 @@ RUN arch=${TARGETARCH:-amd64} \
esac
ARG REPOSITORY="https://s3.amazonaws.com/clickhouse-builds/22.4/31c367d3cd3aefd316778601ff6565119fe36682/package_release"
-ARG VERSION="23.8.2.7"
+ARG VERSION="23.9.1.1854"
ARG PACKAGES="clickhouse-keeper"
# user/group precreated explicitly with fixed uid/gid on purpose.
diff --git a/docker/packager/binary/build.sh b/docker/packager/binary/build.sh
index 11efffd592c..62f21e5ec52 100755
--- a/docker/packager/binary/build.sh
+++ b/docker/packager/binary/build.sh
@@ -26,9 +26,6 @@ fi
mkdir -p /build/build_docker
cd /build/build_docker
rm -f CMakeCache.txt
-# Read cmake arguments into array (possibly empty)
-read -ra CMAKE_FLAGS <<< "${CMAKE_FLAGS:-}"
-env
if [ -n "$MAKE_DEB" ]; then
rm -rf /build/packages/root
@@ -55,11 +52,36 @@ ccache_status
# clear cache stats
ccache --zero-stats ||:
+function check_prebuild_exists() {
+ local path="$1"
+ [ -d "$path" ] && [ "$(ls -A "$path")" ]
+}
+
+# Check whether the directory with pre-build scripts exists and not empty.
+if check_prebuild_exists /build/packages/pre-build
+then
+ # Execute all commands
+ for file in /build/packages/pre-build/*.sh ;
+ do
+ # The script may want to modify environment variables. Why not to allow it to do so?
+ # shellcheck disable=SC1090
+ source "$file"
+ done
+else
+ echo "There are no subcommands to execute :)"
+fi
+
+# Read cmake arguments into array (possibly empty)
+# The name of local variable has to be different from the name of environment variable
+# not to override it. And make it usable for other processes.
+read -ra CMAKE_FLAGS_ARRAY <<< "${CMAKE_FLAGS:-}"
+env
+
if [ "$BUILD_MUSL_KEEPER" == "1" ]
then
# build keeper with musl separately
# and without rust bindings
- cmake --debug-trycompile -DENABLE_RUST=OFF -DBUILD_STANDALONE_KEEPER=1 -DENABLE_CLICKHOUSE_KEEPER=1 -DCMAKE_VERBOSE_MAKEFILE=1 -DUSE_MUSL=1 -LA -DCMAKE_TOOLCHAIN_FILE=/build/cmake/linux/toolchain-x86_64-musl.cmake "-DCMAKE_BUILD_TYPE=$BUILD_TYPE" "-DSANITIZE=$SANITIZER" -DENABLE_CHECK_HEAVY_BUILDS=1 "${CMAKE_FLAGS[@]}" ..
+ cmake --debug-trycompile -DENABLE_RUST=OFF -DBUILD_STANDALONE_KEEPER=1 -DENABLE_CLICKHOUSE_KEEPER=1 -DCMAKE_VERBOSE_MAKEFILE=1 -DUSE_MUSL=1 -LA -DCMAKE_TOOLCHAIN_FILE=/build/cmake/linux/toolchain-x86_64-musl.cmake "-DCMAKE_BUILD_TYPE=$BUILD_TYPE" "-DSANITIZE=$SANITIZER" -DENABLE_CHECK_HEAVY_BUILDS=1 "${CMAKE_FLAGS_ARRAY[@]}" ..
# shellcheck disable=SC2086 # No quotes because I want it to expand to nothing if empty.
ninja $NINJA_FLAGS clickhouse-keeper
@@ -73,13 +95,13 @@ then
fi
rm -f CMakeCache.txt
- # Build the rest of binaries
- cmake --debug-trycompile -DBUILD_STANDALONE_KEEPER=0 -DCREATE_KEEPER_SYMLINK=0 -DCMAKE_VERBOSE_MAKEFILE=1 -LA "-DCMAKE_BUILD_TYPE=$BUILD_TYPE" "-DSANITIZE=$SANITIZER" -DENABLE_CHECK_HEAVY_BUILDS=1 "${CMAKE_FLAGS[@]}" ..
-else
- # Build everything
- cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA "-DCMAKE_BUILD_TYPE=$BUILD_TYPE" "-DSANITIZE=$SANITIZER" -DENABLE_CHECK_HEAVY_BUILDS=1 "${CMAKE_FLAGS[@]}" ..
+ # Modify CMake flags, so we won't overwrite standalone keeper with symlinks
+ CMAKE_FLAGS_ARRAY+=(-DBUILD_STANDALONE_KEEPER=0 -DCREATE_KEEPER_SYMLINK=0)
fi
+# Build everything
+cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA "-DCMAKE_BUILD_TYPE=$BUILD_TYPE" "-DSANITIZE=$SANITIZER" -DENABLE_CHECK_HEAVY_BUILDS=1 "${CMAKE_FLAGS_ARRAY[@]}" ..
+
# No quotes because I want it to expand to nothing if empty.
# shellcheck disable=SC2086 # No quotes because I want it to expand to nothing if empty.
ninja $NINJA_FLAGS $BUILD_TARGET
diff --git a/docker/packager/packager b/docker/packager/packager
index a0e460abacf..ba2546e73c1 100755
--- a/docker/packager/packager
+++ b/docker/packager/packager
@@ -105,7 +105,7 @@ def run_docker_image_with_env(
ccache_mount = ""
cmd = (
- f"docker run --network=host --user={user} --rm {ccache_mount}"
+ f"docker run --network=host --user={user} --rm {ccache_mount} "
f"--volume={output_dir}:/output --volume={ch_root}:/build {env_part} "
f"--volume={cargo_cache_dir}:/rust/cargo/registry {interactive} {image_name}"
)
diff --git a/docker/server/Dockerfile.alpine b/docker/server/Dockerfile.alpine
index 36dacd781bc..afe1be75bed 100644
--- a/docker/server/Dockerfile.alpine
+++ b/docker/server/Dockerfile.alpine
@@ -33,7 +33,7 @@ RUN arch=${TARGETARCH:-amd64} \
# lts / testing / prestable / etc
ARG REPO_CHANNEL="stable"
ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}"
-ARG VERSION="23.8.2.7"
+ARG VERSION="23.9.1.1854"
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
# user/group precreated explicitly with fixed uid/gid on purpose.
diff --git a/docker/server/Dockerfile.ubuntu b/docker/server/Dockerfile.ubuntu
index 752adf67229..402168c3e15 100644
--- a/docker/server/Dockerfile.ubuntu
+++ b/docker/server/Dockerfile.ubuntu
@@ -23,7 +23,7 @@ RUN sed -i "s|http://archive.ubuntu.com|${apt_archive}|g" /etc/apt/sources.list
ARG REPO_CHANNEL="stable"
ARG REPOSITORY="deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb ${REPO_CHANNEL} main"
-ARG VERSION="23.8.2.7"
+ARG VERSION="23.9.1.1854"
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
# set non-empty deb_location_url url to create a docker image
diff --git a/docker/test/integration/runner/Dockerfile b/docker/test/integration/runner/Dockerfile
index d42fcb9baf6..8345e3d5791 100644
--- a/docker/test/integration/runner/Dockerfile
+++ b/docker/test/integration/runner/Dockerfile
@@ -80,7 +80,6 @@ RUN python3 -m pip install --no-cache-dir \
kafka-python \
kazoo \
lz4 \
- meilisearch==0.18.3 \
minio \
nats-py \
protobuf \
diff --git a/docker/test/integration/runner/compose/docker_compose_meili.yml b/docker/test/integration/runner/compose/docker_compose_meili.yml
deleted file mode 100644
index c1fad4aca87..00000000000
--- a/docker/test/integration/runner/compose/docker_compose_meili.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-version: '2.3'
-services:
- meili1:
- image: getmeili/meilisearch:v0.27.0
- restart: always
- ports:
- - ${MEILI_EXTERNAL_PORT:-7700}:${MEILI_INTERNAL_PORT:-7700}
-
- meili_secure:
- image: getmeili/meilisearch:v0.27.0
- restart: always
- ports:
- - ${MEILI_SECURE_EXTERNAL_PORT:-7700}:${MEILI_SECURE_INTERNAL_PORT:-7700}
- environment:
- MEILI_MASTER_KEY: "password"
diff --git a/docker/test/stateless/run.sh b/docker/test/stateless/run.sh
index 74ff536b98e..34fc12d1a72 100755
--- a/docker/test/stateless/run.sh
+++ b/docker/test/stateless/run.sh
@@ -69,6 +69,16 @@ else
fi
if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then
+ sudo cat /etc/clickhouse-server1/config.d/filesystem_caches_path.xml \
+ | sed "s|/var/lib/clickhouse/filesystem_caches/|/var/lib/clickhouse/filesystem_caches_1/|" \
+ > /etc/clickhouse-server1/config.d/filesystem_caches_path.xml.tmp
+ mv /etc/clickhouse-server1/config.d/filesystem_caches_path.xml.tmp /etc/clickhouse-server1/config.d/filesystem_caches_path.xml
+
+ sudo cat /etc/clickhouse-server2/config.d/filesystem_caches_path.xml \
+ | sed "s|/var/lib/clickhouse/filesystem_caches/|/var/lib/clickhouse/filesystem_caches_2/|" \
+ > /etc/clickhouse-server2/config.d/filesystem_caches_path.xml.tmp
+ mv /etc/clickhouse-server2/config.d/filesystem_caches_path.xml.tmp /etc/clickhouse-server2/config.d/filesystem_caches_path.xml
+
mkdir -p /var/run/clickhouse-server1
sudo chown clickhouse:clickhouse /var/run/clickhouse-server1
sudo -E -u clickhouse /usr/bin/clickhouse server --config /etc/clickhouse-server1/config.xml --daemon \
diff --git a/docker/test/stateless/stress_tests.lib b/docker/test/stateless/stress_tests.lib
index e56369ce161..11945b68f70 100644
--- a/docker/test/stateless/stress_tests.lib
+++ b/docker/test/stateless/stress_tests.lib
@@ -52,6 +52,21 @@ function configure()
| sed "s|100000|10000|" \
> /etc/clickhouse-server/config.d/keeper_port.xml.tmp
sudo mv /etc/clickhouse-server/config.d/keeper_port.xml.tmp /etc/clickhouse-server/config.d/keeper_port.xml
+
+ function randomize_config_boolean_value {
+ value=$(($RANDOM % 2))
+ sudo cat /etc/clickhouse-server/config.d/keeper_port.xml \
+ | sed "s|<$1>[01]$1>|<$1>$value$1>|" \
+ > /etc/clickhouse-server/config.d/keeper_port.xml.tmp
+ sudo mv /etc/clickhouse-server/config.d/keeper_port.xml.tmp /etc/clickhouse-server/config.d/keeper_port.xml
+ }
+
+ # Randomize all Keeper feature flags
+ randomize_config_boolean_value filtered_list
+ randomize_config_boolean_value multi_read
+ randomize_config_boolean_value check_not_exists
+ randomize_config_boolean_value create_if_not_exists
+
sudo chown clickhouse /etc/clickhouse-server/config.d/keeper_port.xml
sudo chgrp clickhouse /etc/clickhouse-server/config.d/keeper_port.xml
diff --git a/docker/test/unit/Dockerfile b/docker/test/unit/Dockerfile
index b75bfb6661c..cf5ba1eec7f 100644
--- a/docker/test/unit/Dockerfile
+++ b/docker/test/unit/Dockerfile
@@ -6,5 +6,4 @@ FROM clickhouse/stateless-test:$FROM_TAG
RUN apt-get install gdb
COPY run.sh /
-COPY process_unit_tests_result.py /
CMD ["/bin/bash", "/run.sh"]
diff --git a/docker/test/unit/process_unit_tests_result.py b/docker/test/unit/process_unit_tests_result.py
deleted file mode 100755
index 0550edc7c25..00000000000
--- a/docker/test/unit/process_unit_tests_result.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-import logging
-import argparse
-import csv
-
-OK_SIGN = "OK ]"
-FAILED_SIGN = "FAILED ]"
-SEGFAULT = "Segmentation fault"
-SIGNAL = "received signal SIG"
-PASSED = "PASSED"
-
-
-def get_test_name(line):
- elements = reversed(line.split(" "))
- for element in elements:
- if "(" not in element and ")" not in element:
- return element
- raise Exception("No test name in line '{}'".format(line))
-
-
-def process_result(result_folder):
- summary = []
- total_counter = 0
- failed_counter = 0
- result_log_path = "{}/test_result.txt".format(result_folder)
- if not os.path.exists(result_log_path):
- logging.info("No output log on path %s", result_log_path)
- return "exception", "No output log", []
-
- status = "success"
- description = ""
- passed = False
- with open(result_log_path, "r") as test_result:
- for line in test_result:
- if OK_SIGN in line:
- logging.info("Found ok line: '%s'", line)
- test_name = get_test_name(line.strip())
- logging.info("Test name: '%s'", test_name)
- summary.append((test_name, "OK"))
- total_counter += 1
- elif FAILED_SIGN in line and "listed below" not in line and "ms)" in line:
- logging.info("Found fail line: '%s'", line)
- test_name = get_test_name(line.strip())
- logging.info("Test name: '%s'", test_name)
- summary.append((test_name, "FAIL"))
- total_counter += 1
- failed_counter += 1
- elif SEGFAULT in line:
- logging.info("Found segfault line: '%s'", line)
- status = "failure"
- description += "Segmentation fault. "
- break
- elif SIGNAL in line:
- logging.info("Received signal line: '%s'", line)
- status = "failure"
- description += "Exit on signal. "
- break
- elif PASSED in line:
- logging.info("PASSED record found: '%s'", line)
- passed = True
-
- if not passed:
- status = "failure"
- description += "PASSED record not found. "
-
- if failed_counter != 0:
- status = "failure"
-
- if not description:
- description += "fail: {}, passed: {}".format(
- failed_counter, total_counter - failed_counter
- )
-
- return status, description, summary
-
-
-def write_results(results_file, status_file, results, status):
- with open(results_file, "w") as f:
- out = csv.writer(f, delimiter="\t")
- out.writerows(results)
- with open(status_file, "w") as f:
- out = csv.writer(f, delimiter="\t")
- out.writerow(status)
-
-
-if __name__ == "__main__":
- logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s")
- parser = argparse.ArgumentParser(
- description="ClickHouse script for parsing results of unit tests"
- )
- parser.add_argument("--in-results-dir", default="/test_output/")
- parser.add_argument("--out-results-file", default="/test_output/test_results.tsv")
- parser.add_argument("--out-status-file", default="/test_output/check_status.tsv")
- args = parser.parse_args()
-
- state, description, test_results = process_result(args.in_results_dir)
- logging.info("Result parsed")
- status = (state, description)
- write_results(args.out_results_file, args.out_status_file, test_results, status)
- logging.info("Result written")
diff --git a/docker/test/unit/run.sh b/docker/test/unit/run.sh
index a4784466e27..e87432214d8 100644
--- a/docker/test/unit/run.sh
+++ b/docker/test/unit/run.sh
@@ -3,5 +3,4 @@
set -x
service zookeeper start && sleep 7 && /usr/share/zookeeper/bin/zkCli.sh -server localhost:2181 -create create /clickhouse_test '';
-timeout 40m gdb -q -ex 'set print inferior-events off' -ex 'set confirm off' -ex 'set print thread-events off' -ex run -ex bt -ex quit --args ./unit_tests_dbms | tee test_output/test_result.txt
-./process_unit_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv
+timeout 40m gdb -q -ex 'set print inferior-events off' -ex 'set confirm off' -ex 'set print thread-events off' -ex run -ex bt -ex quit --args ./unit_tests_dbms --gtest_output='json:test_output/test_result.json' | tee test_output/test_result.txt
diff --git a/docker/test/upgrade/run.sh b/docker/test/upgrade/run.sh
index 96c11e75f50..c69d90b9af0 100644
--- a/docker/test/upgrade/run.sh
+++ b/docker/test/upgrade/run.sh
@@ -60,11 +60,19 @@ install_packages previous_release_package_folder
# available for dump via clickhouse-local
configure
+function remove_keeper_config()
+{
+ sudo cat /etc/clickhouse-server/config.d/keeper_port.xml \
+ | sed "/<$1>$2<\/$1>/d" \
+ > /etc/clickhouse-server/config.d/keeper_port.xml.tmp
+ sudo mv /etc/clickhouse-server/config.d/keeper_port.xml.tmp /etc/clickhouse-server/config.d/keeper_port.xml
+}
+
# async_replication setting doesn't exist on some older versions
-sudo cat /etc/clickhouse-server/config.d/keeper_port.xml \
- | sed "/1<\/async_replication>/d" \
- > /etc/clickhouse-server/config.d/keeper_port.xml.tmp
-sudo mv /etc/clickhouse-server/config.d/keeper_port.xml.tmp /etc/clickhouse-server/config.d/keeper_port.xml
+remove_keeper_config "async_replication" "1"
+
+# create_if_not_exists feature flag doesn't exist on some older versions
+remove_keeper_config "create_if_not_exists" "[01]"
# it contains some new settings, but we can safely remove it
rm /etc/clickhouse-server/config.d/merge_tree.xml
@@ -89,10 +97,10 @@ sudo cat /etc/clickhouse-server/config.d/keeper_port.xml \
sudo mv /etc/clickhouse-server/config.d/keeper_port.xml.tmp /etc/clickhouse-server/config.d/keeper_port.xml
# async_replication setting doesn't exist on some older versions
-sudo cat /etc/clickhouse-server/config.d/keeper_port.xml \
- | sed "/1<\/async_replication>/d" \
- > /etc/clickhouse-server/config.d/keeper_port.xml.tmp
-sudo mv /etc/clickhouse-server/config.d/keeper_port.xml.tmp /etc/clickhouse-server/config.d/keeper_port.xml
+remove_keeper_config "async_replication" "1"
+
+# create_if_not_exists feature flag doesn't exist on some older versions
+remove_keeper_config "create_if_not_exists" "[01]"
# But we still need default disk because some tables loaded only into it
sudo cat /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml \
diff --git a/docs/changelogs/v23.8.3.48-lts.md b/docs/changelogs/v23.8.3.48-lts.md
new file mode 100644
index 00000000000..af669c5adc8
--- /dev/null
+++ b/docs/changelogs/v23.8.3.48-lts.md
@@ -0,0 +1,43 @@
+---
+sidebar_position: 1
+sidebar_label: 2023
+---
+
+# 2023 Changelog
+
+### ClickHouse release v23.8.3.48-lts (ebe4eb3d23e) FIXME as compared to v23.8.2.7-lts (f73c8f37874)
+
+#### Improvement
+* Backported in [#54287](https://github.com/ClickHouse/ClickHouse/issues/54287): Enable allow_remove_stale_moving_parts by default. [#54260](https://github.com/ClickHouse/ClickHouse/pull/54260) ([vdimir](https://github.com/vdimir)).
+* Backported in [#55057](https://github.com/ClickHouse/ClickHouse/issues/55057): ProfileEvents added ContextLockWaitMicroseconds event. [#55029](https://github.com/ClickHouse/ClickHouse/pull/55029) ([Maksim Kita](https://github.com/kitaisreal)).
+
+#### Build/Testing/Packaging Improvement
+* Backported in [#54702](https://github.com/ClickHouse/ClickHouse/issues/54702): Enrich `changed_images.json` with the latest tag from master for images that are not changed in the pull request. [#54369](https://github.com/ClickHouse/ClickHouse/pull/54369) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* Backported in [#54743](https://github.com/ClickHouse/ClickHouse/issues/54743): Remove redundant `clickhouse-keeper-client` symlink. [#54587](https://github.com/ClickHouse/ClickHouse/pull/54587) ([Tomas Barton](https://github.com/deric)).
+* Backported in [#54685](https://github.com/ClickHouse/ClickHouse/issues/54685): We build and upload them for every push, which isn't worth it. [#54675](https://github.com/ClickHouse/ClickHouse/pull/54675) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+
+#### Bug Fix (user-visible misbehavior in an official stable release)
+
+* Fix: moved to prewhere condition actions can lose column [#53492](https://github.com/ClickHouse/ClickHouse/pull/53492) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Fix: parallel replicas over distributed with prefer_localhost_replica=1 [#54334](https://github.com/ClickHouse/ClickHouse/pull/54334) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix possible error 'URI contains invalid characters' in s3 table function [#54373](https://github.com/ClickHouse/ClickHouse/pull/54373) ([Kruglov Pavel](https://github.com/Avogar)).
+* Check for overflow before addition in `analysisOfVariance` function [#54385](https://github.com/ClickHouse/ClickHouse/pull/54385) ([Antonio Andelic](https://github.com/antonio2368)).
+* reproduce and fix the bug in removeSharedRecursive [#54430](https://github.com/ClickHouse/ClickHouse/pull/54430) ([Sema Checherinda](https://github.com/CheSema)).
+* Fix aggregate projections with normalized states [#54480](https://github.com/ClickHouse/ClickHouse/pull/54480) ([Amos Bird](https://github.com/amosbird)).
+* Fix possible parsing error in WithNames formats with disabled input_format_with_names_use_header [#54513](https://github.com/ClickHouse/ClickHouse/pull/54513) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix zero copy garbage [#54550](https://github.com/ClickHouse/ClickHouse/pull/54550) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix race in `ColumnUnique` [#54575](https://github.com/ClickHouse/ClickHouse/pull/54575) ([Nikita Taranov](https://github.com/nickitat)).
+* Fix serialization of `ColumnDecimal` [#54601](https://github.com/ClickHouse/ClickHouse/pull/54601) ([Nikita Taranov](https://github.com/nickitat)).
+* Fix virtual columns having incorrect values after ORDER BY [#54811](https://github.com/ClickHouse/ClickHouse/pull/54811) ([Michael Kolupaev](https://github.com/al13n321)).
+* Fix Keeper segfault during shutdown [#54841](https://github.com/ClickHouse/ClickHouse/pull/54841) ([Antonio Andelic](https://github.com/antonio2368)).
+* Rebuild minmax_count_projection when partition key gets modified [#54943](https://github.com/ClickHouse/ClickHouse/pull/54943) ([Amos Bird](https://github.com/amosbird)).
+
+#### NOT FOR CHANGELOG / INSIGNIFICANT
+
+* Test libunwind changes. [#51436](https://github.com/ClickHouse/ClickHouse/pull/51436) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
+* Use pathlib.Path in S3Helper, rewrite build reports, improve small things [#54010](https://github.com/ClickHouse/ClickHouse/pull/54010) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Properly re-initialize ZooKeeper fault injection [#54251](https://github.com/ClickHouse/ClickHouse/pull/54251) ([Alexander Gololobov](https://github.com/davenger)).
+* Fix segfault in system.zookeeper [#54326](https://github.com/ClickHouse/ClickHouse/pull/54326) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Update automated commit status comment [#54441](https://github.com/ClickHouse/ClickHouse/pull/54441) ([vdimir](https://github.com/vdimir)).
+* Adjusting `num_streams` by expected work in StorageS3 [#54815](https://github.com/ClickHouse/ClickHouse/pull/54815) ([pufit](https://github.com/pufit)).
+
diff --git a/docs/changelogs/v23.9.1.1854-stable.md b/docs/changelogs/v23.9.1.1854-stable.md
new file mode 100644
index 00000000000..655dd54d81b
--- /dev/null
+++ b/docs/changelogs/v23.9.1.1854-stable.md
@@ -0,0 +1,381 @@
+---
+sidebar_position: 1
+sidebar_label: 2023
+---
+
+# 2023 Changelog
+
+### ClickHouse release v23.9.1.1854-stable (8f9a227de1f) FIXME as compared to v23.8.1.2992-lts (ebc7d9a9f3b)
+
+#### Backward Incompatible Change
+* Remove the `status_info` configuration option and dictionaries status from the default Prometheus handler. [#54090](https://github.com/ClickHouse/ClickHouse/pull/54090) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* The experimental parts metadata cache is removed from the codebase. [#54215](https://github.com/ClickHouse/ClickHouse/pull/54215) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Disable setting `input_format_json_try_infer_numbers_from_strings` by default, so we don't try to infer numbers from strings in JSON formats by default to avoid possible parsing errors when sample data contains strings that looks like a number. [#55099](https://github.com/ClickHouse/ClickHouse/pull/55099) ([Kruglov Pavel](https://github.com/Avogar)).
+
+#### New Feature
+* Added new type of authentication based on SSH keys. It works only for Native TCP protocol. [#41109](https://github.com/ClickHouse/ClickHouse/pull/41109) ([George Gamezardashvili](https://github.com/InfJoker)).
+* Added IO Scheduling support for remote disks. Storage configuration for disk types `s3`, `s3_plain`, `hdfs` and `azure_blob_storage` can now contain `read_resource` and `write_resource` elements holding resource names. Scheduling policies for these resources can be configured in a separate server configuration section `resources`. Queries can be marked using setting `workload` and classified using server configuration section `workload_classifiers` to achieve diverse resource scheduling goals. More details in docs/en/operations/workload-scheduling.md. [#47009](https://github.com/ClickHouse/ClickHouse/pull/47009) ([Sergei Trifonov](https://github.com/serxa)).
+* Added a new column _block_number resolves [#44532](https://github.com/ClickHouse/ClickHouse/issues/44532). [#47532](https://github.com/ClickHouse/ClickHouse/pull/47532) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
+* Add options `partial_result_update_duration_ms` and `max_rows_in_partial_result` to show updates of a partial result of output table in real-time during query execution. [#48607](https://github.com/ClickHouse/ClickHouse/pull/48607) ([Alexey Perevyshin](https://github.com/alexX512)).
+* Support case-insensitive and dot-all matching modes in RegExpTree dictionaries. [#50906](https://github.com/ClickHouse/ClickHouse/pull/50906) ([Johann Gan](https://github.com/johanngan)).
+* Add support for `ALTER TABLE MODIFY COMMENT`. Note: something similar was added by an external contributor a long time ago, but the feature did not work at all and only confused users. This closes [#36377](https://github.com/ClickHouse/ClickHouse/issues/36377). [#51304](https://github.com/ClickHouse/ClickHouse/pull/51304) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Added "GCD" aka. "greatest common denominator" as a new data compression codec. The codec computes the GCD of all column values, and then divides each value by the GCD. The GCD codec is a data preparation codec (similar to Delta and DoubleDelta) and cannot be used stand-alone. It works with data integer, decimal and date/time type. A viable use case for the GCD codec are column values that change (increase/decrease) in multiples of the GCD, e.g. 24 - 28 - 16 - 24 - 8 - 24 (assuming GCD = 4). [#53149](https://github.com/ClickHouse/ClickHouse/pull/53149) ([Alexander Nam](https://github.com/seshWCS)).
+* Two new type aliases "DECIMAL(P)" (as shortcut for "DECIMAL(P, 0") and "DECIMAL" (as shortcut for "DECIMAL(10, 0)") were added. This makes ClickHouse more compatible with MySQL's SQL dialect. [#53328](https://github.com/ClickHouse/ClickHouse/pull/53328) ([Val Doroshchuk](https://github.com/valbok)).
+* Added a new system log table `backup_log` to track all `BACKUP` and `RESTORE` operations. [#53638](https://github.com/ClickHouse/ClickHouse/pull/53638) ([Victor Krasnov](https://github.com/sirvickr)).
+* Added a format setting "output_format_markdown_escape_special_characters" (default: false). The setting controls whether special characters like "!", "#", "$" etc. are escaped (i.e. prefixed by a backslash) in the "Markdown" output format. [#53860](https://github.com/ClickHouse/ClickHouse/pull/53860) ([irenjj](https://github.com/irenjj)).
+* Add function `decodeHTMLComponent`. [#54097](https://github.com/ClickHouse/ClickHouse/pull/54097) ([Bharat Nallan](https://github.com/bharatnc)).
+* Added peak_threads_usage to query_log table. [#54335](https://github.com/ClickHouse/ClickHouse/pull/54335) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
+* Add SHOW FUNCTIONS support to clickhouse-client. [#54337](https://github.com/ClickHouse/ClickHouse/pull/54337) ([Julia Kartseva](https://github.com/wat-ze-hex)).
+* This PRs improves schema inference from JSON formats: 1) Now it's possible to infer named Tuples from JSON objects without experimantal JSON type under a setting `input_format_json_try_infer_named_tuples_from_objects` in JSON formats. Previously without experimantal type JSON we could only infer JSON objects as Strings or Maps, now we can infer named Tuple. Resulting Tuple type will conain all keys of objects that were read in data sample during schema inference. It can be useful for reading structured JSON data without sparse objects. The setting is enabled by default. 2) Allow parsing JSON array into a column with type String under setting `input_format_json_read_arrays_as_strings`. It can help reading arrays with values with different types. 3) Allow to use type String for JSON keys with unkown types (`null`/`[]`/`{}`) in sample data under setting `input_format_json_infer_incomplete_types_as_strings`. Now in JSON formats we can read any value into String column and we can avoid getting error `Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` during schema inference by using type String for unknown types, so the data will be read successfully. [#54427](https://github.com/ClickHouse/ClickHouse/pull/54427) ([Kruglov Pavel](https://github.com/Avogar)).
+* Added function "toDaysSinceYearZero" with alias "TO_DAYS()" (for compatibility with MySQL) which returns the number of days passed since 0001-01-01. [#54479](https://github.com/ClickHouse/ClickHouse/pull/54479) ([Robert Schulze](https://github.com/rschu1ze)).
+* Added functions YYYYMMDDtoDate(), YYYYMMDDtoDate32(), YYYYMMDDhhmmssToDateTime() and YYYYMMDDhhmmssToDateTime64(). They convert a date or date with time encoded as integer (e.g. 20230911) into a native date or date with time. As such, they provide the opposite functionality of existing functions YYYYMMDDToDate(), YYYYMMDDToDateTime(), YYYYMMDDhhmmddToDateTime(), YYYYMMDDhhmmddToDateTime64(). [#54509](https://github.com/ClickHouse/ClickHouse/pull/54509) ([Robert Schulze](https://github.com/rschu1ze)).
+* Added "bandwidth_limit" IO scheduling node type. It allows you to specify `max_speed` and `max_burst` constraints on traffic passing though this node. More details in docs/en/operations/workload-scheduling.md. [#54618](https://github.com/ClickHouse/ClickHouse/pull/54618) ([Sergei Trifonov](https://github.com/serxa)).
+* Function `toDaysSinceYearZero()` now supports arguments of type `DateTime` and `DateTime64`. [#54856](https://github.com/ClickHouse/ClickHouse/pull/54856) ([Serge Klochkov](https://github.com/slvrtrn)).
+* Allow S3-style URLs for table functions `s3`, `gcs`, `oss`. URL is automatically converted to HTTP. Example: `'s3://clickhouse-public-datasets/hits.csv'` is converted to `'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'`. [#54931](https://github.com/ClickHouse/ClickHouse/pull/54931) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* Add several string distance functions, include `byteHammingDistance`, `byteJaccardIndex`, `byteEditDistance`. ### Documentation entry for user-facing changes. [#54935](https://github.com/ClickHouse/ClickHouse/pull/54935) ([flynn](https://github.com/ucasfl)).
+* Add new setting `print_pretty_type_names` to print pretty deep nested types like Tuple/Maps/Arrays. [#55095](https://github.com/ClickHouse/ClickHouse/pull/55095) ([Kruglov Pavel](https://github.com/Avogar)).
+
+#### Performance Improvement
+* Improve performance of sorting for decimal columns. Improve performance of insertion into MergeTree if ORDER BY contains Decimal column. Improve performance of sorting when data is already sorted or almost sorted. [#35961](https://github.com/ClickHouse/ClickHouse/pull/35961) ([Maksim Kita](https://github.com/kitaisreal)).
+* Improve performance for huge query analysis. Fixes [#51224](https://github.com/ClickHouse/ClickHouse/issues/51224). [#51469](https://github.com/ClickHouse/ClickHouse/pull/51469) ([frinkr](https://github.com/frinkr)).
+* 1. Add rewriter for new analyzer. [#52082](https://github.com/ClickHouse/ClickHouse/pull/52082) ([JackyWoo](https://github.com/JackyWoo)).
+* 1. Add rewriter for both old and new analyzer. 2. Add settings `optimize_uniq_to_count`. [#52645](https://github.com/ClickHouse/ClickHouse/pull/52645) ([JackyWoo](https://github.com/JackyWoo)).
+* Remove manual calls to `mmap/mremap/munmap` and delegate all this work to `jemalloc`. [#52792](https://github.com/ClickHouse/ClickHouse/pull/52792) ([Nikita Taranov](https://github.com/nickitat)).
+* Now roaringBitmaps being optimized before serialization. [#52842](https://github.com/ClickHouse/ClickHouse/pull/52842) ([UnamedRus](https://github.com/UnamedRus)).
+* Optimize group by constant keys. Will optimize queries with group by `_file/_path` after https://github.com/ClickHouse/ClickHouse/pull/53529. [#53549](https://github.com/ClickHouse/ClickHouse/pull/53549) ([Kruglov Pavel](https://github.com/Avogar)).
+* Speed up reading from S3 by enabling prefetches by default. [#53709](https://github.com/ClickHouse/ClickHouse/pull/53709) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Do not implicitly read pk and version columns in lonely parts if unnecessary. [#53919](https://github.com/ClickHouse/ClickHouse/pull/53919) ([Duc Canh Le](https://github.com/canhld94)).
+* Fixed high in CPU consumption when working with NATS. [#54399](https://github.com/ClickHouse/ClickHouse/pull/54399) ([Vasilev Pyotr](https://github.com/vahpetr)).
+* Since we use separate instructions for executing `toString()` with datetime argument, it is possible to improve performance a bit for non-datetime arguments and have some parts of the code cleaner. Follows up [#53680](https://github.com/ClickHouse/ClickHouse/issues/53680). [#54443](https://github.com/ClickHouse/ClickHouse/pull/54443) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* Instead of serializing json elements into a `std::stringstream`, this PR try to put the serialization result into `ColumnString` direclty. [#54613](https://github.com/ClickHouse/ClickHouse/pull/54613) ([lgbo](https://github.com/lgbo-ustc)).
+* Enable ORDER BY optimization for reading data in corresponding order from a MergeTree table in case that the table is behind a view. [#54628](https://github.com/ClickHouse/ClickHouse/pull/54628) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Improve JSON SQL functions by reusing `GeneratorJSONPath`. Since there are several `make_shared` in `GenerateorJSONPath`'s constructor, it has bad performance. [#54735](https://github.com/ClickHouse/ClickHouse/pull/54735) ([lgbo](https://github.com/lgbo-ustc)).
+
+#### Improvement
+* Keeper improvement: Add a `createIfNotExists` Keeper command. [#48855](https://github.com/ClickHouse/ClickHouse/pull/48855) ([Konstantin Bogdanov](https://github.com/thevar1able)).
+* Add IF EMPTY clause for DROP TABLE queries. [#48915](https://github.com/ClickHouse/ClickHouse/pull/48915) ([Pavel Novitskiy](https://github.com/pnovitskiy)).
+* The Keeper dynamically adjusts log levels. [#50372](https://github.com/ClickHouse/ClickHouse/pull/50372) ([helifu](https://github.com/helifu)).
+* Allow to replace long names of files of columns in `MergeTree` data parts to hashes of names. It helps to avoid `File name too long` error in some cases. [#50612](https://github.com/ClickHouse/ClickHouse/pull/50612) ([Anton Popov](https://github.com/CurtizJ)).
+* Allow specifying the expiration date and, optionally, the time for user credentials with `VALID UNTIL datetime` clause. [#51261](https://github.com/ClickHouse/ClickHouse/pull/51261) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Add setting `ignore_access_denied_multidirectory_globs`. [#52839](https://github.com/ClickHouse/ClickHouse/pull/52839) ([Andrey Zvonov](https://github.com/zvonand)).
+* Output valid JSON/XML on excetpion during HTTP query execution. Add setting `http_write_exception_in_output_format` to enable/disable this behaviour (enabled by default). [#52853](https://github.com/ClickHouse/ClickHouse/pull/52853) ([Kruglov Pavel](https://github.com/Avogar)).
+* More precise Integer type inference, fix [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#53003](https://github.com/ClickHouse/ClickHouse/pull/53003) ([Chen768959](https://github.com/Chen768959)).
+* Keeper tries to batch flush requests for better performance. [#53049](https://github.com/ClickHouse/ClickHouse/pull/53049) ([Antonio Andelic](https://github.com/antonio2368)).
+* Introduced resolving of charsets in the string literals for MaterializedMySQL. [#53220](https://github.com/ClickHouse/ClickHouse/pull/53220) ([Val Doroshchuk](https://github.com/valbok)).
+* Fix a subtle issue with a rarely used `EmbeddedRocksDB` table engine in an extremely rare scenario: sometimes the `EmbeddedRocksDB` table engine does not close files correctly in NFS after running `DROP TABLE`. [#53502](https://github.com/ClickHouse/ClickHouse/pull/53502) ([Mingliang Pan](https://github.com/liangliangpan)).
+* SQL functions "toString(datetime)" and "formatDateTime()" now support non-constant timezone arguments. [#53680](https://github.com/ClickHouse/ClickHouse/pull/53680) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* `RESTORE TABLE ON CLUSTER` must create replicated tables with a matching UUID on hosts. Otherwise the macro `{uuid}` in ZooKeeper path can't work correctly after RESTORE. This PR implements that. [#53765](https://github.com/ClickHouse/ClickHouse/pull/53765) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Added restore setting `restore_broken_parts_as_detached`: if it's true the RESTORE process won't stop on broken parts while restoring, instead all the broken parts will be copied to the `detached` folder with the prefix `broken-from-backup'. If it's false the RESTORE process will stop on the first broken part (if any). The default value is false. [#53877](https://github.com/ClickHouse/ClickHouse/pull/53877) ([Vitaly Baranov](https://github.com/vitlibar)).
+* The creation of Annoy indexes can now be parallelized using setting `max_threads_for_annoy_index_creation`. [#54047](https://github.com/ClickHouse/ClickHouse/pull/54047) ([Robert Schulze](https://github.com/rschu1ze)).
+* The MySQL interface gained a minimal implementation of prepared statements, just enough to allow a connection from Tableau Online to ClickHouse via the MySQL connector. [#54115](https://github.com/ClickHouse/ClickHouse/pull/54115) ([Serge Klochkov](https://github.com/slvrtrn)).
+* Replaced the library to handle (encode/decode) base64 values from Turbo-Base64 to aklomp-base64. Both are SIMD-accelerated on x86 and ARM but 1. the license of the latter (BSD-2) is more favorable for ClickHouse, Turbo64 switched in the meantime to GPL-3, 2. with more GitHub stars, aklomp-base64 seems more future-proof, 3. aklomp-base64 has a slightly nicer API (which is arguably subjective), and 4. aklomp-base64 does not require us to hack around bugs (like non-threadsafe initialization). Note: aklomp-base64 rejects unpadded base64 values whereas Turbo-Base64 decodes them on a best-effort basis. RFC-4648 leaves it open whether padding is mandatory or not, but depending on the context this may be a behavioral change to be aware of. [#54119](https://github.com/ClickHouse/ClickHouse/pull/54119) ([Mikhail Koviazin](https://github.com/mkmkme)).
+* Add elapsed_ns to HTTP headers X-ClickHouse-Progress and X-ClickHouse-Summary. [#54179](https://github.com/ClickHouse/ClickHouse/pull/54179) ([joelynch](https://github.com/joelynch)).
+* Implementation of `reconfig` (https://github.com/ClickHouse/ClickHouse/pull/49450), `sync`, and `exists` commands for keeper-client. [#54201](https://github.com/ClickHouse/ClickHouse/pull/54201) ([pufit](https://github.com/pufit)).
+* "clickhouse-local" and "clickhouse-client" now allow to specify the "--query" parameter multiple times, e.g. './clickhouse-client --query "SELECT 1" --query "SELECT 2"'. This syntax is slightly more intuitive than `./clickhouse-client --multiquery "SELECT 1;SELECT2", a bit easier to script (e.g. "queries.push_back('--query "$q"')") and more consistent with the behavior of existing parameter "--queries-file" (e.g. "./clickhouse client --queries-file queries1.sql --queries-file queries2.sql"). [#54249](https://github.com/ClickHouse/ClickHouse/pull/54249) ([Robert Schulze](https://github.com/rschu1ze)).
+* Add sub-second precision to `formatReadableTimeDelta`. [#54250](https://github.com/ClickHouse/ClickHouse/pull/54250) ([Andrey Zvonov](https://github.com/zvonand)).
+* Fix wrong reallocation in HashedArrayDictionary:. [#54254](https://github.com/ClickHouse/ClickHouse/pull/54254) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Enable allow_remove_stale_moving_parts by default. [#54260](https://github.com/ClickHouse/ClickHouse/pull/54260) ([vdimir](https://github.com/vdimir)).
+* Fix using count from cache and improve progress bar for reading from archives. [#54271](https://github.com/ClickHouse/ClickHouse/pull/54271) ([Kruglov Pavel](https://github.com/Avogar)).
+* Add support for S3 credentials using SSO. To define a profile to be used with SSO, set `AWS_PROFILE` environment variable. [#54347](https://github.com/ClickHouse/ClickHouse/pull/54347) ([Antonio Andelic](https://github.com/antonio2368)).
+* Support NULL as default for nested types Array/Tuple/Map for input formats. Closes [#51100](https://github.com/ClickHouse/ClickHouse/issues/51100). [#54351](https://github.com/ClickHouse/ClickHouse/pull/54351) ([Kruglov Pavel](https://github.com/Avogar)).
+* This is actually a bug fix, but not sure I'll be able to add a test to support the case, so I have put it as an improvement. This issue was introduced in https://github.com/ClickHouse/ClickHouse/pull/45878, which is when CH started reading arrow in batches. [#54370](https://github.com/ClickHouse/ClickHouse/pull/54370) ([Arthur Passos](https://github.com/arthurpassos)).
+* Add STD alias to stddevPop function for MySQL compatibility. Closes [#54274](https://github.com/ClickHouse/ClickHouse/issues/54274). [#54382](https://github.com/ClickHouse/ClickHouse/pull/54382) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Add `addDate` function for compatibility with MySQL and `subDate` for consistency. Reference [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54400](https://github.com/ClickHouse/ClickHouse/pull/54400) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Parse data in JSON format as JSONEachRow if failed to parse metadata. It will allow to read files with `.json` extension even if real format is JSONEachRow. Closes [#45740](https://github.com/ClickHouse/ClickHouse/issues/45740). [#54405](https://github.com/ClickHouse/ClickHouse/pull/54405) ([Kruglov Pavel](https://github.com/Avogar)).
+* Pass http retry timeout as milliseconds. [#54438](https://github.com/ClickHouse/ClickHouse/pull/54438) ([Duc Canh Le](https://github.com/canhld94)).
+* Support SAMPLE BY for VIEW. [#54477](https://github.com/ClickHouse/ClickHouse/pull/54477) ([Azat Khuzhin](https://github.com/azat)).
+* Add modification_time into system.detached_parts. [#54506](https://github.com/ClickHouse/ClickHouse/pull/54506) ([Azat Khuzhin](https://github.com/azat)).
+* Added a setting "splitby_max_substrings_includes_remaining_string" which controls if functions "splitBy*()" with argument "max_substring" > 0 include the remaining string (if any) in the result array (Python/Spark semantics) or not. The default behavior does not change. [#54518](https://github.com/ClickHouse/ClickHouse/pull/54518) ([Robert Schulze](https://github.com/rschu1ze)).
+* Now clickhouse-client process files in parallel in case of `INFILE 'glob_expression'`. Closes [#54218](https://github.com/ClickHouse/ClickHouse/issues/54218). [#54533](https://github.com/ClickHouse/ClickHouse/pull/54533) ([Max K.](https://github.com/mkaynov)).
+* Allow to use primary key for IN function where primary key column types are different from `IN` function right side column types. Example: `SELECT id FROM test_table WHERE id IN (SELECT '5')`. Closes [#48936](https://github.com/ClickHouse/ClickHouse/issues/48936). [#54544](https://github.com/ClickHouse/ClickHouse/pull/54544) ([Maksim Kita](https://github.com/kitaisreal)).
+* Better integer types inference for Int64/UInt64 fields. Continuation of https://github.com/ClickHouse/ClickHouse/pull/53003. Now it works also for nested types like Arrays of Arrays anf for functions like `map/tuple`. Issue: [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#54553](https://github.com/ClickHouse/ClickHouse/pull/54553) ([Kruglov Pavel](https://github.com/Avogar)).
+* HashJoin tries to shrink internal buffers consuming half of maximal available memory (set by `max_bytes_in_join`). [#54584](https://github.com/ClickHouse/ClickHouse/pull/54584) ([vdimir](https://github.com/vdimir)).
+* Added array operations for multiplying, dividing and modulo on scalar. Works in each way, for example `5 * [5, 5]` and `[5, 5] * 5` - both cases are possible. [#54608](https://github.com/ClickHouse/ClickHouse/pull/54608) ([Yarik Briukhovetskyi](https://github.com/yariks5s)).
+* Added function `timestamp` for compatibility with MySQL. Closes [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54639](https://github.com/ClickHouse/ClickHouse/pull/54639) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Respect max_block_size for array join to avoid possible OOM. Close [#54290](https://github.com/ClickHouse/ClickHouse/issues/54290). [#54664](https://github.com/ClickHouse/ClickHouse/pull/54664) ([李扬](https://github.com/taiyang-li)).
+* Add optional `version` argument to `rm` command in `keeper-client` to support safer deletes. [#54708](https://github.com/ClickHouse/ClickHouse/pull/54708) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* Disable killing the server by systemd (that may lead to data loss when using Buffer tables). [#54744](https://github.com/ClickHouse/ClickHouse/pull/54744) ([Azat Khuzhin](https://github.com/azat)).
+* Added field "is_deterministic" to system table "system.functions" which indicates whether the result of a function is stable between two invocations (given exactly the same inputs) or not. [#54766](https://github.com/ClickHouse/ClickHouse/pull/54766) ([Robert Schulze](https://github.com/rschu1ze)).
+* Made the views in schema "information_schema" more compatible with the equivalent views in MySQL (i.e. modified and extended them) up to a point where Tableau Online is able to connect to ClickHouse. More specifically: 1. The type of field "information_schema.tables.table_type" changed from Enum8 to String. 2. Added fields "table_comment" and "table_collation" to view "information_schema.table". 3. Added views "information_schema.key_column_usage" and "referential_constraints". 4. Replaced uppercase aliases in "information_schema" views with concrete uppercase columns. [#54773](https://github.com/ClickHouse/ClickHouse/pull/54773) ([Serge Klochkov](https://github.com/slvrtrn)).
+* The query cache now returns an error if the user tries to cache the result of a query with a non-deterministic function such as "now()", "randomString()" and "dictGet()". Compared to the previous behavior (silently don't cache the result), this reduces confusion and surprise for users. [#54801](https://github.com/ClickHouse/ClickHouse/pull/54801) ([Robert Schulze](https://github.com/rschu1ze)).
+* Forbid special columns for file/s3/url/... storages, fix insert into ephemeral columns from files. Closes [#53477](https://github.com/ClickHouse/ClickHouse/issues/53477). [#54803](https://github.com/ClickHouse/ClickHouse/pull/54803) ([Kruglov Pavel](https://github.com/Avogar)).
+* More configurable collecting metadata for backup. [#54804](https://github.com/ClickHouse/ClickHouse/pull/54804) ([Vitaly Baranov](https://github.com/vitlibar)).
+* `clickhouse-local`'s log file (if enabled with --server_logs_file flag) will now prefix each line with timestamp, thread id, etc, just like `clickhouse-server`. [#54807](https://github.com/ClickHouse/ClickHouse/pull/54807) ([Michael Kolupaev](https://github.com/al13n321)).
+* Reuse HTTP connections in s3 table function. [#54812](https://github.com/ClickHouse/ClickHouse/pull/54812) ([Michael Kolupaev](https://github.com/al13n321)).
+* Avoid excessive calls to getifaddrs in isLocalAddress. [#54819](https://github.com/ClickHouse/ClickHouse/pull/54819) ([Duc Canh Le](https://github.com/canhld94)).
+* Field "is_obsolete" in system.merge_tree_settings is now 1 for obsolete merge tree settings. Previously, only the description indicated that the setting is obsolete. [#54837](https://github.com/ClickHouse/ClickHouse/pull/54837) ([Robert Schulze](https://github.com/rschu1ze)).
+* Make it possible to use plural when using interval literals. `INTERVAL 2 HOURS` should be equivalent to `INTERVAL 2 HOUR`. [#54860](https://github.com/ClickHouse/ClickHouse/pull/54860) ([Jordi Villar](https://github.com/jrdi)).
+* Replace the linear method in `MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules` with a binary search. [#54869](https://github.com/ClickHouse/ClickHouse/pull/54869) ([usurai](https://github.com/usurai)).
+* Always allow the creation of a projection with `Nullable` PK. This fixes [#54814](https://github.com/ClickHouse/ClickHouse/issues/54814). [#54895](https://github.com/ClickHouse/ClickHouse/pull/54895) ([Amos Bird](https://github.com/amosbird)).
+* Retry backup S3 operations after connection reset failure. [#54900](https://github.com/ClickHouse/ClickHouse/pull/54900) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Make the exception message exact in case of the maximum value of a settings is less than the minimum value. [#54925](https://github.com/ClickHouse/ClickHouse/pull/54925) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* LIKE, match, and other regular expressions matching functions now allow matching with patterns containing non-UTF-8 substrings by falling back to binary matching. Example: you can use `string LIKE '\xFE\xFF%'` to detect BOM. This closes [#54486](https://github.com/ClickHouse/ClickHouse/issues/54486). [#54942](https://github.com/ClickHouse/ClickHouse/pull/54942) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* ProfileEvents added ContextLockWaitMicroseconds event. [#55029](https://github.com/ClickHouse/ClickHouse/pull/55029) ([Maksim Kita](https://github.com/kitaisreal)).
+* Added field "is_deterministic" to system table "system.functions" which indicates whether the result of a function is stable between two invocations (given exactly the same inputs) or not. [#55035](https://github.com/ClickHouse/ClickHouse/pull/55035) ([Robert Schulze](https://github.com/rschu1ze)).
+* View information_schema.tables now has a new field `data_length` which shows the approximate size of the data on disk. Required to run queries generated by Amazon QuickSight. [#55037](https://github.com/ClickHouse/ClickHouse/pull/55037) ([Robert Schulze](https://github.com/rschu1ze)).
+
+#### Build/Testing/Packaging Improvement
+* ClickHouse is built with Musl instead of GLibc by default. [#52550](https://github.com/ClickHouse/ClickHouse/pull/52550) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* ClickHouse is built with Musl instead of GLibc. [#52721](https://github.com/ClickHouse/ClickHouse/pull/52721) ([Azat Khuzhin](https://github.com/azat)).
+* Bumped the compiler of official and continuous integration builds of ClickHouse from Clang 16 to 17. [#53831](https://github.com/ClickHouse/ClickHouse/pull/53831) ([Robert Schulze](https://github.com/rschu1ze)).
+* Fix flaky test. `wait_resolver` function was asserting the response to be == proxy1, but it might actually return proxy2. Account for that as well. [#54191](https://github.com/ClickHouse/ClickHouse/pull/54191) ([Arthur Passos](https://github.com/arthurpassos)).
+* Regenerated tld data for lookups (`tldLookup.generated.cpp`). [#54269](https://github.com/ClickHouse/ClickHouse/pull/54269) ([Bharat Nallan](https://github.com/bharatnc)).
+* Report properly timeout for check itself in `fast_test_check`/`stress_check`. [#54278](https://github.com/ClickHouse/ClickHouse/pull/54278) ([Igor Nikonov](https://github.com/devcrafter)).
+* Suddenly, `test_host_regexp_multiple_ptr_records_concurrent` became flaky. [#54307](https://github.com/ClickHouse/ClickHouse/pull/54307) ([Arthur Passos](https://github.com/arthurpassos)).
+* Fixed precise float parsing issue on s390x. [#54330](https://github.com/ClickHouse/ClickHouse/pull/54330) ([Harry Lee](https://github.com/HarryLeeIBM)).
+* Enrich `changed_images.json` with the latest tag from master for images that are not changed in the pull request. [#54369](https://github.com/ClickHouse/ClickHouse/pull/54369) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* Fixed endian issue in jemalloc_bins system table for s390x. [#54517](https://github.com/ClickHouse/ClickHouse/pull/54517) ([Harry Lee](https://github.com/HarryLeeIBM)).
+* Fixed random generation issue for UInt256 and IPv4 on s390x. [#54576](https://github.com/ClickHouse/ClickHouse/pull/54576) ([Harry Lee](https://github.com/HarryLeeIBM)).
+* Remove redundant `clickhouse-keeper-client` symlink. [#54587](https://github.com/ClickHouse/ClickHouse/pull/54587) ([Tomas Barton](https://github.com/deric)).
+* Use `/usr/bin/env` to resolve bash. [#54603](https://github.com/ClickHouse/ClickHouse/pull/54603) ([Fionera](https://github.com/fionera)).
+* Move all `tests/ci/*.lib files` to `stateless-tests` image. Closes [#54540](https://github.com/ClickHouse/ClickHouse/issues/54540). [#54668](https://github.com/ClickHouse/ClickHouse/pull/54668) ([Kruglov Pavel](https://github.com/Avogar)).
+* We build and upload them for every push, which isn't worth it. [#54675](https://github.com/ClickHouse/ClickHouse/pull/54675) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Fixed SimHash function endian issue for s390x. [#54793](https://github.com/ClickHouse/ClickHouse/pull/54793) ([Harry Lee](https://github.com/HarryLeeIBM)).
+* Do not clone the fast tests repo twice; parallelize submodules checkout; use the current user in the fast-tests container. [#54849](https://github.com/ClickHouse/ClickHouse/pull/54849) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Avoid running pull request ci workflow for fixes touching .md files only. [#54914](https://github.com/ClickHouse/ClickHouse/pull/54914) ([Max K.](https://github.com/mkaynov)).
+* CMake added `PROFILE_CPU` option needed to perform `perf record` without using DWARF call graph. [#54917](https://github.com/ClickHouse/ClickHouse/pull/54917) ([Maksim Kita](https://github.com/kitaisreal)).
+* Use `--gtest_output='json:'` to parse unit test results. [#54922](https://github.com/ClickHouse/ClickHouse/pull/54922) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Added support for additional scripts (you need to mound a volume) to extend build process. [#55000](https://github.com/ClickHouse/ClickHouse/pull/55000) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
+* If the linker is different than LLD, stop with a fatal error. [#55036](https://github.com/ClickHouse/ClickHouse/pull/55036) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+
+#### Bug Fix (user-visible misbehavior in an official stable release)
+
+* Store NULL in scalar result map for empty subquery result [#52240](https://github.com/ClickHouse/ClickHouse/pull/52240) ([vdimir](https://github.com/vdimir)).
+* Fix misleading error message in OUTFILE with CapnProto/Protobuf [#52870](https://github.com/ClickHouse/ClickHouse/pull/52870) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix summary reporting with parallel replicas with LIMIT [#53050](https://github.com/ClickHouse/ClickHouse/pull/53050) ([Raúl Marín](https://github.com/Algunenano)).
+* Fix throttling of BACKUPs from/to S3 (in case native copy was not used) and in some other places as well [#53336](https://github.com/ClickHouse/ClickHouse/pull/53336) ([Azat Khuzhin](https://github.com/azat)).
+* Fix IO throttling during copying whole directories [#53338](https://github.com/ClickHouse/ClickHouse/pull/53338) ([Azat Khuzhin](https://github.com/azat)).
+* Fix: moved to prewhere condition actions can lose column [#53492](https://github.com/ClickHouse/ClickHouse/pull/53492) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* 37737 fixed internal error when replacing with byte-equal parts [#53735](https://github.com/ClickHouse/ClickHouse/pull/53735) ([Pedro Riera](https://github.com/priera)).
+* Fix: require columns participating in interpolate expression [#53754](https://github.com/ClickHouse/ClickHouse/pull/53754) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Fix cluster discovery initialization + setting up fail points in config [#54113](https://github.com/ClickHouse/ClickHouse/pull/54113) ([vdimir](https://github.com/vdimir)).
+* Fix issues in accurateCastOrNull [#54136](https://github.com/ClickHouse/ClickHouse/pull/54136) ([Salvatore Mesoraca](https://github.com/aiven-sal)).
+* Fix nullable primary key in final [#54164](https://github.com/ClickHouse/ClickHouse/pull/54164) ([Amos Bird](https://github.com/amosbird)).
+* Inserting only non-duplicate chunks in MV [#54184](https://github.com/ClickHouse/ClickHouse/pull/54184) ([Pedro Riera](https://github.com/priera)).
+* Fix REPLACE/MOVE PARTITION with zero-copy replication [#54193](https://github.com/ClickHouse/ClickHouse/pull/54193) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix: parallel replicas over distributed don't read from all replicas [#54199](https://github.com/ClickHouse/ClickHouse/pull/54199) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix: allow IPv6 for bloom filter [#54200](https://github.com/ClickHouse/ClickHouse/pull/54200) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* fix possible type mismatch with IPv4 [#54212](https://github.com/ClickHouse/ClickHouse/pull/54212) ([Bharat Nallan](https://github.com/bharatnc)).
+* Fix system.data_skipping_indices for recreated indices [#54225](https://github.com/ClickHouse/ClickHouse/pull/54225) ([Artur Malchanau](https://github.com/Hexta)).
+* fix name clash for multiple join rewriter v2 [#54240](https://github.com/ClickHouse/ClickHouse/pull/54240) ([Tao Wang](https://github.com/wangtZJU)).
+* Fix unexpected errors in system.errors after join [#54306](https://github.com/ClickHouse/ClickHouse/pull/54306) ([vdimir](https://github.com/vdimir)).
+* Fix isZeroOrNull(NULL) [#54316](https://github.com/ClickHouse/ClickHouse/pull/54316) ([flynn](https://github.com/ucasfl)).
+* Fix: parallel replicas over distributed with prefer_localhost_replica=1 [#54334](https://github.com/ClickHouse/ClickHouse/pull/54334) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix logical error in vertical merge + replacing merge tree + optimize cleanup [#54368](https://github.com/ClickHouse/ClickHouse/pull/54368) ([alesapin](https://github.com/alesapin)).
+* Fix possible error 'URI contains invalid characters' in s3 table function [#54373](https://github.com/ClickHouse/ClickHouse/pull/54373) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix segfault in AST optimization of `arrayExists` function [#54379](https://github.com/ClickHouse/ClickHouse/pull/54379) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Check for overflow before addition in `analysisOfVariance` function [#54385](https://github.com/ClickHouse/ClickHouse/pull/54385) ([Antonio Andelic](https://github.com/antonio2368)).
+* reproduce and fix the bug in removeSharedRecursive [#54430](https://github.com/ClickHouse/ClickHouse/pull/54430) ([Sema Checherinda](https://github.com/CheSema)).
+* Fix possible incorrect result with SimpleAggregateFunction in PREWHERE and FINAL [#54436](https://github.com/ClickHouse/ClickHouse/pull/54436) ([Azat Khuzhin](https://github.com/azat)).
+* Fix filtering parts with indexHint for non analyzer [#54449](https://github.com/ClickHouse/ClickHouse/pull/54449) ([Azat Khuzhin](https://github.com/azat)).
+* Fix aggregate projections with normalized states [#54480](https://github.com/ClickHouse/ClickHouse/pull/54480) ([Amos Bird](https://github.com/amosbird)).
+* Bugfix/local multiquery parameter [#54498](https://github.com/ClickHouse/ClickHouse/pull/54498) ([CuiShuoGuo](https://github.com/bakam412)).
+* clickhouse-local support --database command line argument [#54503](https://github.com/ClickHouse/ClickHouse/pull/54503) ([vdimir](https://github.com/vdimir)).
+* Fix possible parsing error in WithNames formats with disabled input_format_with_names_use_header [#54513](https://github.com/ClickHouse/ClickHouse/pull/54513) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix rare case of CHECKSUM_DOESNT_MATCH error [#54549](https://github.com/ClickHouse/ClickHouse/pull/54549) ([alesapin](https://github.com/alesapin)).
+* Fix zero copy garbage [#54550](https://github.com/ClickHouse/ClickHouse/pull/54550) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix sorting of UNION ALL of already sorted results [#54564](https://github.com/ClickHouse/ClickHouse/pull/54564) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Fix snapshot install in Keeper [#54572](https://github.com/ClickHouse/ClickHouse/pull/54572) ([Antonio Andelic](https://github.com/antonio2368)).
+* Fix race in `ColumnUnique` [#54575](https://github.com/ClickHouse/ClickHouse/pull/54575) ([Nikita Taranov](https://github.com/nickitat)).
+* Annoy/Usearch index: Fix LOGICAL_ERROR during build-up with default values [#54600](https://github.com/ClickHouse/ClickHouse/pull/54600) ([Robert Schulze](https://github.com/rschu1ze)).
+* Fix serialization of `ColumnDecimal` [#54601](https://github.com/ClickHouse/ClickHouse/pull/54601) ([Nikita Taranov](https://github.com/nickitat)).
+* Fix schema inference for *Cluster functions for column names with spaces [#54635](https://github.com/ClickHouse/ClickHouse/pull/54635) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix using structure from insertion tables in case of defaults and explicit insert columns [#54655](https://github.com/ClickHouse/ClickHouse/pull/54655) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix: avoid using regex match, possibly containing alternation, as a key condition. [#54696](https://github.com/ClickHouse/ClickHouse/pull/54696) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Fix ReplacingMergeTree with vertical merge and cleanup [#54706](https://github.com/ClickHouse/ClickHouse/pull/54706) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
+* Fix virtual columns having incorrect values after ORDER BY [#54811](https://github.com/ClickHouse/ClickHouse/pull/54811) ([Michael Kolupaev](https://github.com/al13n321)).
+* Fix filtering parts with indexHint for non analyzer (resubmit) [#54825](https://github.com/ClickHouse/ClickHouse/pull/54825) ([Azat Khuzhin](https://github.com/azat)).
+* Fix Keeper segfault during shutdown [#54841](https://github.com/ClickHouse/ClickHouse/pull/54841) ([Antonio Andelic](https://github.com/antonio2368)).
+* Fix "Invalid number of rows in Chunk" in MaterializedPostgreSQL [#54844](https://github.com/ClickHouse/ClickHouse/pull/54844) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Move obsolete format settings to separate section [#54855](https://github.com/ClickHouse/ClickHouse/pull/54855) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix zero copy locks with hardlinks [#54859](https://github.com/ClickHouse/ClickHouse/pull/54859) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix `FINAL` produces invalid read ranges in a rare case [#54934](https://github.com/ClickHouse/ClickHouse/pull/54934) ([Nikita Taranov](https://github.com/nickitat)).
+* Rebuild minmax_count_projection when partition key gets modified [#54943](https://github.com/ClickHouse/ClickHouse/pull/54943) ([Amos Bird](https://github.com/amosbird)).
+* Fix bad cast to ColumnVector in function if [#55019](https://github.com/ClickHouse/ClickHouse/pull/55019) ([Kruglov Pavel](https://github.com/Avogar)).
+* Fix: insert quorum w/o keeper retries [#55026](https://github.com/ClickHouse/ClickHouse/pull/55026) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix simple state with nullable [#55030](https://github.com/ClickHouse/ClickHouse/pull/55030) ([Pedro Riera](https://github.com/priera)).
+* Prevent attaching parts from tables with different projections or indices [#55062](https://github.com/ClickHouse/ClickHouse/pull/55062) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+
+#### NO CL ENTRY
+
+* NO CL ENTRY: 'Revert "Revert "Fixed wrong python test name pattern""'. [#54043](https://github.com/ClickHouse/ClickHouse/pull/54043) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* NO CL ENTRY: 'Revert "Fix: respect skip_unavailable_shards with parallel replicas"'. [#54189](https://github.com/ClickHouse/ClickHouse/pull/54189) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* NO CL ENTRY: 'Revert "Add settings for real-time updates during query execution"'. [#54470](https://github.com/ClickHouse/ClickHouse/pull/54470) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* NO CL ENTRY: 'Revert "Fix issues in accurateCastOrNull"'. [#54472](https://github.com/ClickHouse/ClickHouse/pull/54472) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* NO CL ENTRY: 'Revert "Revert "Add settings for real-time updates during query execution""'. [#54476](https://github.com/ClickHouse/ClickHouse/pull/54476) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
+* NO CL ENTRY: 'Revert "add runOptimize call in bitmap write method"'. [#54528](https://github.com/ClickHouse/ClickHouse/pull/54528) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* NO CL ENTRY: 'Revert "Optimize uniq to count"'. [#54566](https://github.com/ClickHouse/ClickHouse/pull/54566) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* NO CL ENTRY: 'Revert "Add stateless test for clickhouse keeper-client --no-confirmation"'. [#54616](https://github.com/ClickHouse/ClickHouse/pull/54616) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* NO CL ENTRY: 'Revert "Remove flaky tests for the experimental `UNDROP` feature"'. [#54671](https://github.com/ClickHouse/ClickHouse/pull/54671) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* NO CL ENTRY: 'Revert "Fix filtering parts with indexHint for non analyzer"'. [#54806](https://github.com/ClickHouse/ClickHouse/pull/54806) ([Azat Khuzhin](https://github.com/azat)).
+* NO CL ENTRY: 'Revert "refine error code of duplicated index in create query"'. [#54840](https://github.com/ClickHouse/ClickHouse/pull/54840) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* NO CL ENTRY: 'Revert "Avoid excessive calls to getifaddrs in isLocalAddress"'. [#54893](https://github.com/ClickHouse/ClickHouse/pull/54893) ([Igor Nikonov](https://github.com/devcrafter)).
+* NO CL ENTRY: 'Revert "Fix NATS high cpu usage"'. [#55005](https://github.com/ClickHouse/ClickHouse/pull/55005) ([Nikolay Degterinsky](https://github.com/evillique)).
+
+#### NOT FOR CHANGELOG / INSIGNIFICANT
+
+* libFuzzer: add CI fuzzers build, add tcp protocol fuzzer, fix other fuzzers. [#42599](https://github.com/ClickHouse/ClickHouse/pull/42599) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Add new exceptions to 4xx error [#50722](https://github.com/ClickHouse/ClickHouse/pull/50722) ([Boris Kuschel](https://github.com/bkuschel)).
+* Test libunwind changes. [#51436](https://github.com/ClickHouse/ClickHouse/pull/51436) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
+* Fix data race in copyFromIStreamWithProgressCallback [#51449](https://github.com/ClickHouse/ClickHouse/pull/51449) ([Michael Kolupaev](https://github.com/al13n321)).
+* Abort on `std::logic_error` in CI [#51907](https://github.com/ClickHouse/ClickHouse/pull/51907) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Unify setting http keep-alive timeout, increase default to 30s [#53068](https://github.com/ClickHouse/ClickHouse/pull/53068) ([Nikita Taranov](https://github.com/nickitat)).
+* Add a regression test for broken Vertical merge after ADD+DROP COLUMN [#53214](https://github.com/ClickHouse/ClickHouse/pull/53214) ([Azat Khuzhin](https://github.com/azat)).
+* Revert "Revert "dateDiff: add support for plural units."" [#53803](https://github.com/ClickHouse/ClickHouse/pull/53803) ([Han Fei](https://github.com/hanfei1991)).
+* Fix some tests [#53892](https://github.com/ClickHouse/ClickHouse/pull/53892) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Refactoring of reading from `MergeTree` tables [#53931](https://github.com/ClickHouse/ClickHouse/pull/53931) ([Anton Popov](https://github.com/CurtizJ)).
+* Use pathlib.Path in S3Helper, rewrite build reports, improve small things [#54010](https://github.com/ClickHouse/ClickHouse/pull/54010) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Correct UniquesHashSet to be endianness-independent. [#54045](https://github.com/ClickHouse/ClickHouse/pull/54045) ([Austin Kothig](https://github.com/kothiga)).
+* Increase retries for test_merge_tree_azure_blob_storage [#54069](https://github.com/ClickHouse/ClickHouse/pull/54069) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
+* Fix SipHash128 reference for big-endian platforms [#54095](https://github.com/ClickHouse/ClickHouse/pull/54095) ([ltrk2](https://github.com/ltrk2)).
+* Small usearch index improvements: metrics and configurable internal data type [#54103](https://github.com/ClickHouse/ClickHouse/pull/54103) ([Michael Kolupaev](https://github.com/al13n321)).
+* Small refactoring for read from object storage [#54134](https://github.com/ClickHouse/ClickHouse/pull/54134) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Minor changes [#54171](https://github.com/ClickHouse/ClickHouse/pull/54171) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Fix hostname and co result constness in new analyzer [#54174](https://github.com/ClickHouse/ClickHouse/pull/54174) ([vdimir](https://github.com/vdimir)).
+* Amend a confusing line of code in Loggers.cpp [#54183](https://github.com/ClickHouse/ClickHouse/pull/54183) ([Victor Krasnov](https://github.com/sirvickr)).
+* Fix partition id pruning for analyzer. [#54185](https://github.com/ClickHouse/ClickHouse/pull/54185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
+* Update version after release [#54186](https://github.com/ClickHouse/ClickHouse/pull/54186) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Update version_date.tsv and changelogs after v23.8.1.2992-lts [#54188](https://github.com/ClickHouse/ClickHouse/pull/54188) ([robot-clickhouse](https://github.com/robot-clickhouse)).
+* Fix pager in client/local interactive mode when not all data had been read [#54190](https://github.com/ClickHouse/ClickHouse/pull/54190) ([Azat Khuzhin](https://github.com/azat)).
+* Fix flaky test `01099_operators_date_and_timestamp` [#54195](https://github.com/ClickHouse/ClickHouse/pull/54195) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Save system tables from s3_disk in the report [#54198](https://github.com/ClickHouse/ClickHouse/pull/54198) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix timezones in the CI Logs database [#54210](https://github.com/ClickHouse/ClickHouse/pull/54210) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* 2R: Fix: respect skip_unavailable_shards with parallel replicas [#54213](https://github.com/ClickHouse/ClickHouse/pull/54213) ([Igor Nikonov](https://github.com/devcrafter)).
+* S3Queue is experimental [#54214](https://github.com/ClickHouse/ClickHouse/pull/54214) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Improve vars with refernce in Settings cpps [#54220](https://github.com/ClickHouse/ClickHouse/pull/54220) ([xuzifu666](https://github.com/xuzifu666)).
+* Add ProfileEvents::Timer class [#54221](https://github.com/ClickHouse/ClickHouse/pull/54221) ([Stig Bakken](https://github.com/stigsb)).
+* Test: extend cluster_all_replicas integration test with skip_unavailable_shards [#54223](https://github.com/ClickHouse/ClickHouse/pull/54223) ([Igor Nikonov](https://github.com/devcrafter)).
+* remove semicolon [#54236](https://github.com/ClickHouse/ClickHouse/pull/54236) ([YinZheng-Sun](https://github.com/YinZheng-Sun)).
+* Fix bad code in the `system.filesystem_cache`: catching exceptions [#54237](https://github.com/ClickHouse/ClickHouse/pull/54237) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Merge [#54236](https://github.com/ClickHouse/ClickHouse/issues/54236) [#54238](https://github.com/ClickHouse/ClickHouse/pull/54238) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Minor improvement, load from config [#54244](https://github.com/ClickHouse/ClickHouse/pull/54244) ([zhanglistar](https://github.com/zhanglistar)).
+* Follow-up to [#54198](https://github.com/ClickHouse/ClickHouse/issues/54198) [#54246](https://github.com/ClickHouse/ClickHouse/pull/54246) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Properly re-initialize ZooKeeper fault injection [#54251](https://github.com/ClickHouse/ClickHouse/pull/54251) ([Alexander Gololobov](https://github.com/davenger)).
+* Update ci-slack-bot.py [#54253](https://github.com/ClickHouse/ClickHouse/pull/54253) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix clickhouse-test --no-drop-if-fail on reference mismatch [#54256](https://github.com/ClickHouse/ClickHouse/pull/54256) ([Azat Khuzhin](https://github.com/azat)).
+* Improve slack-bot-ci lambda [#54258](https://github.com/ClickHouse/ClickHouse/pull/54258) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Update version_date.tsv and changelogs after v23.3.12.11-lts [#54259](https://github.com/ClickHouse/ClickHouse/pull/54259) ([robot-clickhouse](https://github.com/robot-clickhouse)).
+* Minor change [#54261](https://github.com/ClickHouse/ClickHouse/pull/54261) ([flynn](https://github.com/ucasfl)).
+* Add a note of where the lambda is deployed [#54268](https://github.com/ClickHouse/ClickHouse/pull/54268) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Query cache: Log caching of entries [#54270](https://github.com/ClickHouse/ClickHouse/pull/54270) ([Robert Schulze](https://github.com/rschu1ze)).
+* Update version_date.tsv and changelogs after v23.8.2.7-lts [#54273](https://github.com/ClickHouse/ClickHouse/pull/54273) ([robot-clickhouse](https://github.com/robot-clickhouse)).
+* Fix test `02783_parsedatetimebesteffort_syslog` [#54279](https://github.com/ClickHouse/ClickHouse/pull/54279) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Fix `test_keeper_disks` [#54291](https://github.com/ClickHouse/ClickHouse/pull/54291) ([Antonio Andelic](https://github.com/antonio2368)).
+* Code improvement for reading from archives [#54293](https://github.com/ClickHouse/ClickHouse/pull/54293) ([Antonio Andelic](https://github.com/antonio2368)).
+* Rollback testing part from [#42599](https://github.com/ClickHouse/ClickHouse/issues/42599) [#54301](https://github.com/ClickHouse/ClickHouse/pull/54301) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* CI: libFuzzer integration [#54310](https://github.com/ClickHouse/ClickHouse/pull/54310) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Update version_date.tsv and changelogs after v23.3.13.6-lts [#54313](https://github.com/ClickHouse/ClickHouse/pull/54313) ([robot-clickhouse](https://github.com/robot-clickhouse)).
+* Add logs for parallel replica over distributed [#54315](https://github.com/ClickHouse/ClickHouse/pull/54315) ([Igor Nikonov](https://github.com/devcrafter)).
+* Increase timeout for system.stack_trace in 01051_system_stack_trace [#54321](https://github.com/ClickHouse/ClickHouse/pull/54321) ([Azat Khuzhin](https://github.com/azat)).
+* Fix replace_partition test [#54322](https://github.com/ClickHouse/ClickHouse/pull/54322) ([Pedro Riera](https://github.com/priera)).
+* Fix segfault in system.zookeeper [#54326](https://github.com/ClickHouse/ClickHouse/pull/54326) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fixed flaky test `02841_parallel_replicas_summary` [#54331](https://github.com/ClickHouse/ClickHouse/pull/54331) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
+* Consolidate GCD codec tests (Follow up to [#53149](https://github.com/ClickHouse/ClickHouse/issues/53149)) [#54332](https://github.com/ClickHouse/ClickHouse/pull/54332) ([Robert Schulze](https://github.com/rschu1ze)).
+* Fixed wrong dereference problem in Context::setTemporaryStorageInCache [#54333](https://github.com/ClickHouse/ClickHouse/pull/54333) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
+* Used assert_cast instead of dynamic_cast in ExternalDataSourceCache [#54336](https://github.com/ClickHouse/ClickHouse/pull/54336) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
+* Fix bad punctuation in Keeper's logs [#54338](https://github.com/ClickHouse/ClickHouse/pull/54338) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Improved protection from dereferencing of nullptr [#54339](https://github.com/ClickHouse/ClickHouse/pull/54339) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
+* Fix filesystem cache test [#54343](https://github.com/ClickHouse/ClickHouse/pull/54343) ([Salvatore Mesoraca](https://github.com/aiven-sal)).
+* Parallel replicas: remove unused code [#54354](https://github.com/ClickHouse/ClickHouse/pull/54354) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix flaky test test_storage_azure_blob_storage/test.py::test_schema_iference_cache [#54367](https://github.com/ClickHouse/ClickHouse/pull/54367) ([Kruglov Pavel](https://github.com/Avogar)).
+* Enable hedged requests integration tests with tsan, use max_distributed_connections=1 to fix possible flakiness [#54371](https://github.com/ClickHouse/ClickHouse/pull/54371) ([Kruglov Pavel](https://github.com/Avogar)).
+* Use abiv2 when generating OpenSSL .s files for powerpc64le [#54375](https://github.com/ClickHouse/ClickHouse/pull/54375) ([Boris Kuschel](https://github.com/bkuschel)).
+* Disable prefer_localhost_replica in test for parallel replicas [#54377](https://github.com/ClickHouse/ClickHouse/pull/54377) ([Igor Nikonov](https://github.com/devcrafter)).
+* Fix incorrect formatting of CREATE query with PRIMARY KEY [#54403](https://github.com/ClickHouse/ClickHouse/pull/54403) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Fix failed assert in attach thread during startup retries [#54408](https://github.com/ClickHouse/ClickHouse/pull/54408) ([Antonio Andelic](https://github.com/antonio2368)).
+* Hashtable order fix on big endian platform [#54409](https://github.com/ClickHouse/ClickHouse/pull/54409) ([Suzy Wang](https://github.com/SuzyWangIBMer)).
+* Small fine-tune for using ColumnNullable pointer [#54435](https://github.com/ClickHouse/ClickHouse/pull/54435) ([Alex Cheng](https://github.com/Alex-Cheng)).
+* Update automated commit status comment [#54441](https://github.com/ClickHouse/ClickHouse/pull/54441) ([vdimir](https://github.com/vdimir)).
+* Remove useless line [#54466](https://github.com/ClickHouse/ClickHouse/pull/54466) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Add a log message on replicated table drop [#54467](https://github.com/ClickHouse/ClickHouse/pull/54467) ([Dmitry Novik](https://github.com/novikd)).
+* Cleanup: unnecessary SelectQueryInfo usage around distributed [#54468](https://github.com/ClickHouse/ClickHouse/pull/54468) ([Igor Nikonov](https://github.com/devcrafter)).
+* Add `instance_type` column to CI Logs and the `checks` table [#54469](https://github.com/ClickHouse/ClickHouse/pull/54469) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Refactor IHints [#54481](https://github.com/ClickHouse/ClickHouse/pull/54481) ([flynn](https://github.com/ucasfl)).
+* Fix strange message [#54489](https://github.com/ClickHouse/ClickHouse/pull/54489) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Bump re2 to latest main [#54492](https://github.com/ClickHouse/ClickHouse/pull/54492) ([Robert Schulze](https://github.com/rschu1ze)).
+* S3 artifacts [#54504](https://github.com/ClickHouse/ClickHouse/pull/54504) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Flush logs for system.backup_log test. [#54507](https://github.com/ClickHouse/ClickHouse/pull/54507) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
+* Fix use-after-free in `MergeTreePrefetchedReadPool` [#54512](https://github.com/ClickHouse/ClickHouse/pull/54512) ([Anton Popov](https://github.com/CurtizJ)).
+* Disable parallel replicas on shards with not enough nodes [#54519](https://github.com/ClickHouse/ClickHouse/pull/54519) ([Igor Nikonov](https://github.com/devcrafter)).
+* Parallel replicas: cleanup unused params [#54520](https://github.com/ClickHouse/ClickHouse/pull/54520) ([Igor Nikonov](https://github.com/devcrafter)).
+* FunctionHelpers remove areTypesEqual function [#54546](https://github.com/ClickHouse/ClickHouse/pull/54546) ([Maksim Kita](https://github.com/kitaisreal)).
+* Add stateless test for clickhouse keeper-client --no-confirmation [#54547](https://github.com/ClickHouse/ClickHouse/pull/54547) ([Azat Khuzhin](https://github.com/azat)).
+* Increase default timeout in tests for keeper-client [#54551](https://github.com/ClickHouse/ClickHouse/pull/54551) ([pufit](https://github.com/pufit)).
+* clang-format: Disable namespace indentation and omit {} in if/for/while [#54554](https://github.com/ClickHouse/ClickHouse/pull/54554) ([Robert Schulze](https://github.com/rschu1ze)).
+* ngramDistance* queries fix for big endian platform [#54555](https://github.com/ClickHouse/ClickHouse/pull/54555) ([Suzy Wang](https://github.com/SuzyWangIBMer)).
+* Fix AST fuzzer crash in MergeTreeIndex{FullText|Inverted} [#54563](https://github.com/ClickHouse/ClickHouse/pull/54563) ([Robert Schulze](https://github.com/rschu1ze)).
+* Remove output_format_markdown_escape_special_characters from settings changes history [#54585](https://github.com/ClickHouse/ClickHouse/pull/54585) ([Kruglov Pavel](https://github.com/Avogar)).
+* Add basic logic to find releasable commits [#54604](https://github.com/ClickHouse/ClickHouse/pull/54604) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* Fix reading of virtual columns in reverse order [#54610](https://github.com/ClickHouse/ClickHouse/pull/54610) ([Anton Popov](https://github.com/CurtizJ)).
+* Fix possible CANNOT_READ_ALL_DATA during ZooKeeper client finalization and add some tests [#54632](https://github.com/ClickHouse/ClickHouse/pull/54632) ([Azat Khuzhin](https://github.com/azat)).
+* Fix a bug in addData and subData functions [#54636](https://github.com/ClickHouse/ClickHouse/pull/54636) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Follow-up to [#54550](https://github.com/ClickHouse/ClickHouse/issues/54550) [#54641](https://github.com/ClickHouse/ClickHouse/pull/54641) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Remove broken lockless variant of re2 [#54642](https://github.com/ClickHouse/ClickHouse/pull/54642) ([Robert Schulze](https://github.com/rschu1ze)).
+* Bump abseil [#54646](https://github.com/ClickHouse/ClickHouse/pull/54646) ([Robert Schulze](https://github.com/rschu1ze)).
+* limit the delay before next try in S3 [#54651](https://github.com/ClickHouse/ClickHouse/pull/54651) ([Sema Checherinda](https://github.com/CheSema)).
+* Fix parser unit tests [#54670](https://github.com/ClickHouse/ClickHouse/pull/54670) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
+* Fix: Log engine Mark file to read and write in little Endian for s390x [#54677](https://github.com/ClickHouse/ClickHouse/pull/54677) ([bhavnajindal](https://github.com/bhavnajindal)).
+* Update WebObjectStorage.cpp [#54695](https://github.com/ClickHouse/ClickHouse/pull/54695) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* add cancelation point to s3 retries [#54697](https://github.com/ClickHouse/ClickHouse/pull/54697) ([Sema Checherinda](https://github.com/CheSema)).
+* Revert default batch size for Keeper [#54745](https://github.com/ClickHouse/ClickHouse/pull/54745) ([Antonio Andelic](https://github.com/antonio2368)).
+* Enable `allow_experimental_undrop_table_query` [#54754](https://github.com/ClickHouse/ClickHouse/pull/54754) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Fix 02882_clickhouse_keeper_client_no_confirmation test [#54761](https://github.com/ClickHouse/ClickHouse/pull/54761) ([Azat Khuzhin](https://github.com/azat)).
+* Better exception message in checkDataPart [#54768](https://github.com/ClickHouse/ClickHouse/pull/54768) ([alesapin](https://github.com/alesapin)).
+* Don't use default move assignment in TimerDescriptor [#54769](https://github.com/ClickHouse/ClickHouse/pull/54769) ([Kruglov Pavel](https://github.com/Avogar)).
+* Add retries to rests test_async_query_sending/test_async_connect [#54772](https://github.com/ClickHouse/ClickHouse/pull/54772) ([Kruglov Pavel](https://github.com/Avogar)).
+* update comment [#54780](https://github.com/ClickHouse/ClickHouse/pull/54780) ([flynn](https://github.com/ucasfl)).
+* Fix broken tests for clickhouse-diagnostics [#54790](https://github.com/ClickHouse/ClickHouse/pull/54790) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* refine error code of duplicated index in create query [#54791](https://github.com/ClickHouse/ClickHouse/pull/54791) ([Han Fei](https://github.com/hanfei1991)).
+* Do not set PR status label [#54799](https://github.com/ClickHouse/ClickHouse/pull/54799) ([vdimir](https://github.com/vdimir)).
+* Prevent parquet schema inference reading the first 1 MB of the file unnecessarily [#54808](https://github.com/ClickHouse/ClickHouse/pull/54808) ([Michael Kolupaev](https://github.com/al13n321)).
+* Prevent ParquetMetadata reading 40 MB from each file unnecessarily [#54809](https://github.com/ClickHouse/ClickHouse/pull/54809) ([Michael Kolupaev](https://github.com/al13n321)).
+* Use appropriate error code instead of LOGICAL_ERROR [#54810](https://github.com/ClickHouse/ClickHouse/pull/54810) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
+* Adjusting `num_streams` by expected work in StorageS3 [#54815](https://github.com/ClickHouse/ClickHouse/pull/54815) ([pufit](https://github.com/pufit)).
+* Fix test_backup_restore_on_cluster/test.py::test_stop_other_host_during_backup flakiness [#54816](https://github.com/ClickHouse/ClickHouse/pull/54816) ([Azat Khuzhin](https://github.com/azat)).
+* Remove config files sizes check [#54824](https://github.com/ClickHouse/ClickHouse/pull/54824) ([Igor Nikonov](https://github.com/devcrafter)).
+* Set correct size for signal pipe buffer [#54836](https://github.com/ClickHouse/ClickHouse/pull/54836) ([Antonio Andelic](https://github.com/antonio2368)).
+* Refactor and split up vector search tests [#54839](https://github.com/ClickHouse/ClickHouse/pull/54839) ([Robert Schulze](https://github.com/rschu1ze)).
+* Add some logging to StorageRabbitMQ [#54842](https://github.com/ClickHouse/ClickHouse/pull/54842) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Update CHANGELOG.md [#54843](https://github.com/ClickHouse/ClickHouse/pull/54843) ([Ilya Yatsishin](https://github.com/qoega)).
+* Refactor and simplify multi-directory globs [#54863](https://github.com/ClickHouse/ClickHouse/pull/54863) ([Andrey Zvonov](https://github.com/zvonand)).
+* KeeperTCPHandler.cpp: Fix clang-17 build [#54874](https://github.com/ClickHouse/ClickHouse/pull/54874) ([Robert Schulze](https://github.com/rschu1ze)).
+* Decrease timeout for fast tests with a commit [#54878](https://github.com/ClickHouse/ClickHouse/pull/54878) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* More stable `02703_keeper_map_concurrent_create_drop` [#54879](https://github.com/ClickHouse/ClickHouse/pull/54879) ([Antonio Andelic](https://github.com/antonio2368)).
+* Fix division by zero in StorageS3 [#54904](https://github.com/ClickHouse/ClickHouse/pull/54904) ([pufit](https://github.com/pufit)).
+* Set exception for promise in `CreatingSetsTransform` [#54920](https://github.com/ClickHouse/ClickHouse/pull/54920) ([Antonio Andelic](https://github.com/antonio2368)).
+* Fix an exception message in Pipe::addTransform [#54926](https://github.com/ClickHouse/ClickHouse/pull/54926) ([Alex Cheng](https://github.com/Alex-Cheng)).
+* Fix data race during BackupsWorker::backup_log initialization [#54928](https://github.com/ClickHouse/ClickHouse/pull/54928) ([Victor Krasnov](https://github.com/sirvickr)).
+* Provide support for BSON on BE [#54933](https://github.com/ClickHouse/ClickHouse/pull/54933) ([Austin Kothig](https://github.com/kothiga)).
+* Set a minimum limit of `num_streams` in StorageS3 [#54936](https://github.com/ClickHouse/ClickHouse/pull/54936) ([pufit](https://github.com/pufit)).
+* Ipv4 read big endian [#54938](https://github.com/ClickHouse/ClickHouse/pull/54938) ([Suzy Wang](https://github.com/SuzyWangIBMer)).
+* Fix data race in SYSTEM STOP LISTEN [#54939](https://github.com/ClickHouse/ClickHouse/pull/54939) ([Nikolay Degterinsky](https://github.com/evillique)).
+* Add desperate instrumentation for debugging deadlock in MultiplexedConnections [#54940](https://github.com/ClickHouse/ClickHouse/pull/54940) ([Michael Kolupaev](https://github.com/al13n321)).
+* Respect max_block_size while generating rows for system.stack_trace (will fix flakiness of the test) [#54946](https://github.com/ClickHouse/ClickHouse/pull/54946) ([Azat Khuzhin](https://github.com/azat)).
+* Remove test `01051_system_stack_trace` [#54951](https://github.com/ClickHouse/ClickHouse/pull/54951) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Add a test for compatibility [#54960](https://github.com/ClickHouse/ClickHouse/pull/54960) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Remove test `02151_hash_table_sizes_stats` [#54961](https://github.com/ClickHouse/ClickHouse/pull/54961) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Remove 02151_hash_table_sizes_stats_distributed (fixes broken CI) [#54969](https://github.com/ClickHouse/ClickHouse/pull/54969) ([Azat Khuzhin](https://github.com/azat)).
+* Use pregenerated gRPC protocol pb2 files to fix test flakyness. [#54976](https://github.com/ClickHouse/ClickHouse/pull/54976) ([Vitaly Baranov](https://github.com/vitlibar)).
+* Delete a test [#54984](https://github.com/ClickHouse/ClickHouse/pull/54984) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Add assertion [#54985](https://github.com/ClickHouse/ClickHouse/pull/54985) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Fix test parallel replicas over distributed [#54987](https://github.com/ClickHouse/ClickHouse/pull/54987) ([Igor Nikonov](https://github.com/devcrafter)).
+* Update README.md [#54990](https://github.com/ClickHouse/ClickHouse/pull/54990) ([Tyler Hannan](https://github.com/tylerhannan)).
+* Re-enable clang-tidy checks disabled in the Clang 17 update [#54999](https://github.com/ClickHouse/ClickHouse/pull/54999) ([Robert Schulze](https://github.com/rschu1ze)).
+* Print more information about one logical error in MergeTreeDataWriter [#55001](https://github.com/ClickHouse/ClickHouse/pull/55001) ([Michael Kolupaev](https://github.com/al13n321)).
+* Add a test [#55003](https://github.com/ClickHouse/ClickHouse/pull/55003) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Lower log levels for `SSOCredentialsProvider` [#55012](https://github.com/ClickHouse/ClickHouse/pull/55012) ([Antonio Andelic](https://github.com/antonio2368)).
+* Set exception for promise in `CreatingSetsTransform` in more cases [#55013](https://github.com/ClickHouse/ClickHouse/pull/55013) ([Antonio Andelic](https://github.com/antonio2368)).
+* Setting compile_aggregate_expressions comment fix [#55020](https://github.com/ClickHouse/ClickHouse/pull/55020) ([Maksim Kita](https://github.com/kitaisreal)).
+* Revert "Added field "is_deterministic" to system.functions" [#55022](https://github.com/ClickHouse/ClickHouse/pull/55022) ([Alexander Tokmakov](https://github.com/tavplubix)).
+* Get rid of the most of `os.path` stuff [#55028](https://github.com/ClickHouse/ClickHouse/pull/55028) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
+* Fix pre-build scripts for old branches [#55032](https://github.com/ClickHouse/ClickHouse/pull/55032) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
+* Review fix for [#54935](https://github.com/ClickHouse/ClickHouse/issues/54935) [#55042](https://github.com/ClickHouse/ClickHouse/pull/55042) ([flynn](https://github.com/ucasfl)).
+* Update gtest_lru_file_cache.cpp [#55053](https://github.com/ClickHouse/ClickHouse/pull/55053) ([Kseniia Sumarokova](https://github.com/kssenii)).
+* Fix prebuild scripts one more time [#55059](https://github.com/ClickHouse/ClickHouse/pull/55059) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
+* Use different names for variables inside build.sh [#55067](https://github.com/ClickHouse/ClickHouse/pull/55067) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
+* Remove String Jaccard Index [#55080](https://github.com/ClickHouse/ClickHouse/pull/55080) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* I don't understand why backup log is not enabled by default [#55081](https://github.com/ClickHouse/ClickHouse/pull/55081) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+* Fix typo in packager when ccache is used [#55104](https://github.com/ClickHouse/ClickHouse/pull/55104) ([Ilya Yatsishin](https://github.com/qoega)).
+* Reduce flakiness of 01455_opentelemetry_distributed [#55111](https://github.com/ClickHouse/ClickHouse/pull/55111) ([Michael Kolupaev](https://github.com/al13n321)).
+* Fix build [#55113](https://github.com/ClickHouse/ClickHouse/pull/55113) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
+
diff --git a/docs/en/engines/table-engines/integrations/s3queue.md b/docs/en/engines/table-engines/integrations/s3queue.md
index 50330962b86..b8f8e51b371 100644
--- a/docs/en/engines/table-engines/integrations/s3queue.md
+++ b/docs/en/engines/table-engines/integrations/s3queue.md
@@ -1,12 +1,19 @@
---
slug: /en/engines/table-engines/integrations/s3queue
-sidebar_position: 7
+sidebar_position: 181
sidebar_label: S3Queue
---
-# S3Queue Table Engine
+# [experimental] S3Queue Table Engine
This engine provides integration with [Amazon S3](https://aws.amazon.com/s3/) ecosystem and allows streaming import. This engine is similar to the [Kafka](../../../engines/table-engines/integrations/kafka.md), [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) engines, but provides S3-specific features.
+:::note
+This table engine is experimental. To use it, set `allow_experimental_s3queue` to 1 by using the `SET` command:
+```sql
+SET allow_experimental_s3queue=1
+```
+:::
+
## Create Table {#creating-a-table}
``` sql
diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md
index d059d158d54..e98f19b2a65 100644
--- a/docs/en/interfaces/formats.md
+++ b/docs/en/interfaces/formats.md
@@ -1259,9 +1259,13 @@ SELECT * FROM json_each_row_nested
- [input_format_import_nested_json](/docs/en/operations/settings/settings-formats.md/#input_format_import_nested_json) - map nested JSON data to nested tables (it works for JSONEachRow format). Default value - `false`.
- [input_format_json_read_bools_as_numbers](/docs/en/operations/settings/settings-formats.md/#input_format_json_read_bools_as_numbers) - allow to parse bools as numbers in JSON input formats. Default value - `true`.
-- [input_format_json_read_numbers_as_strings](/docs/en/operations/settings/settings-formats.md/#input_format_json_read_numbers_as_strings) - allow to parse numbers as strings in JSON input formats. Default value - `false`.
-- [input_format_json_read_objects_as_strings](/docs/en/operations/settings/settings-formats.md/#input_format_json_read_objects_as_strings) - allow to parse JSON objects as strings in JSON input formats. Default value - `false`.
+- [input_format_json_read_numbers_as_strings](/docs/en/operations/settings/settings-formats.md/#input_format_json_read_numbers_as_strings) - allow to parse numbers as strings in JSON input formats. Default value - `true`.
+- [input_format_json_read_arrays_as_strings](/docs/en/operations/settings/settings-formats.md/#input_format_json_read_arrays_as_strings) - allow to parse JSON arrays as strings in JSON input formats. Default value - `true`.
+- [input_format_json_read_objects_as_strings](/docs/en/operations/settings/settings-formats.md/#input_format_json_read_objects_as_strings) - allow to parse JSON objects as strings in JSON input formats. Default value - `true`.
- [input_format_json_named_tuples_as_objects](/docs/en/operations/settings/settings-formats.md/#input_format_json_named_tuples_as_objects) - parse named tuple columns as JSON objects. Default value - `true`.
+- [input_format_json_try_infer_numbers_from_strings](/docs/en/operations/settings/settings-formats.md/#input_format_json_try_infer_numbers_from_strings) - Try to infer numbers from string fields while schema inference. Default value - `false`.
+- [input_format_json_try_infer_named_tuples_from_objects](/docs/en/operations/settings/settings-formats.md/#input_format_json_try_infer_named_tuples_from_objects) - try to infer named tuple from JSON objects during schema inference. Default value - `true`.
+- [input_format_json_infer_incomplete_types_as_strings](/docs/en/operations/settings/settings-formats.md/#input_format_json_infer_incomplete_types_as_strings) - use type String for keys that contains only Nulls or empty objects/arrays during schema inference in JSON input formats. Default value - `true`.
- [input_format_json_defaults_for_missing_elements_in_named_tuple](/docs/en/operations/settings/settings-formats.md/#input_format_json_defaults_for_missing_elements_in_named_tuple) - insert default values for missing elements in JSON object while parsing named tuple. Default value - `true`.
- [input_format_json_ignore_unknown_keys_in_named_tuple](/docs/en/operations/settings/settings-formats.md/#input_format_json_ignore_unknown_keys_in_named_tuple) - Ignore unknown keys in json object for named tuples. Default value - `false`.
- [input_format_json_compact_allow_variable_number_of_columns](/docs/en/operations/settings/settings-formats.md/#input_format_json_compact_allow_variable_number_of_columns) - allow variable number of columns in JSONCompact/JSONCompactEachRow format, ignore extra columns and use default values on missing columns. Default value - `false`.
diff --git a/docs/en/interfaces/http.md b/docs/en/interfaces/http.md
index 8789fe836cb..41be956dc40 100644
--- a/docs/en/interfaces/http.md
+++ b/docs/en/interfaces/http.md
@@ -720,3 +720,84 @@ $ curl -vv -H 'XXX:xxx' 'http://localhost:8123/get_relative_path_static_handler'
Relative Path File
* Connection #0 to host localhost left intact
```
+
+## Valid JSON/XML response on exception during HTTP streaming {valid-output-on-exception-http-streaming}
+
+While query execution over HTTP an exception can happen when part of the data has already been sent. Usually an exception is sent to the client in plain text
+even if some specific data format was used to output data and the output may become invalid in terms of specified data format.
+To prevent it, you can use setting `http_write_exception_in_output_format` (enabled by default) that will tell ClickHouse to write an exception in specified format (currently supported for XML and JSON* formats).
+
+Examples:
+
+```bash
+$ curl 'http://localhost:8123/?query=SELECT+number,+throwIf(number>3)+from+system.numbers+format+JSON+settings+max_block_size=1&http_write_exception_in_output_format=1'
+{
+ "meta":
+ [
+ {
+ "name": "number",
+ "type": "UInt64"
+ },
+ {
+ "name": "throwIf(greater(number, 2))",
+ "type": "UInt8"
+ }
+ ],
+
+ "data":
+ [
+ {
+ "number": "0",
+ "throwIf(greater(number, 2))": 0
+ },
+ {
+ "number": "1",
+ "throwIf(greater(number, 2))": 0
+ },
+ {
+ "number": "2",
+ "throwIf(greater(number, 2))": 0
+ }
+ ],
+
+ "rows": 3,
+
+ "exception": "Code: 395. DB::Exception: Value passed to 'throwIf' function is non-zero: while executing 'FUNCTION throwIf(greater(number, 2) :: 2) -> throwIf(greater(number, 2)) UInt8 : 1'. (FUNCTION_THROW_IF_VALUE_IS_NON_ZERO) (version 23.8.1.1)"
+}
+```
+
+```bash
+$ curl 'http://localhost:8123/?query=SELECT+number,+throwIf(number>2)+from+system.numbers+format+XML+settings+max_block_size=1&http_write_exception_in_output_format=1'
+
+
+
+
+
+ number
+ UInt64
+
+
+ throwIf(greater(number, 2))
+ UInt8
+
+
+
+
+
+ 0
+ 0
+
+
+ 1
+ 0
+
+
+ 2
+ 0
+
+
+ 3
+ Code: 395. DB::Exception: Value passed to 'throwIf' function is non-zero: while executing 'FUNCTION throwIf(greater(number, 2) :: 2) -> throwIf(greater(number, 2)) UInt8 : 1'. (FUNCTION_THROW_IF_VALUE_IS_NON_ZERO) (version 23.8.1.1)
+
+```
+
diff --git a/docs/en/interfaces/schema-inference.md b/docs/en/interfaces/schema-inference.md
index 3022d5e05e9..0aadb09730a 100644
--- a/docs/en/interfaces/schema-inference.md
+++ b/docs/en/interfaces/schema-inference.md
@@ -389,9 +389,25 @@ DESC format(JSONEachRow, '{"arr" : [null, 42, null]}')
└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
```
-Tuples:
+Named tuples:
-In JSON formats we treat Arrays with elements of different types as Tuples.
+When setting `input_format_json_try_infer_named_tuples_from_objects` is enabled, during schema inference ClickHouse will try to infer named Tuple from JSON objects.
+The resulting named Tuple will contain all elements from all corresponding JSON objects from sample data.
+
+```sql
+SET input_format_json_try_infer_named_tuples_from_objects = 1;
+DESC format(JSONEachRow, '{"obj" : {"a" : 42, "b" : "Hello"}}, {"obj" : {"a" : 43, "c" : [1, 2, 3]}}, {"obj" : {"d" : {"e" : 42}}}')
+```
+
+```response
+┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ obj │ Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Tuple(e Nullable(Int64))) │ │ │ │ │ │
+└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+```
+
+Unnamed Tuples:
+
+In JSON formats we treat Arrays with elements of different types as Unnamed Tuples.
```sql
DESC format(JSONEachRow, '{"tuple" : [1, "Hello, World!", [1, 2, 3]]}')
```
@@ -418,7 +434,10 @@ DESC format(JSONEachRow, $$
Maps:
In JSON we can read objects with values of the same type as Map type.
+Note: it will work only when settings `input_format_json_read_objects_as_strings` and `input_format_json_try_infer_named_tuples_from_objects` are disabled.
+
```sql
+SET input_format_json_read_objects_as_strings = 0, input_format_json_try_infer_named_tuples_from_objects = 0;
DESC format(JSONEachRow, '{"map" : {"key1" : 42, "key2" : 24, "key3" : 4}}')
```
```response
@@ -448,14 +467,22 @@ Nested complex types:
DESC format(JSONEachRow, '{"value" : [[[42, 24], []], {"key1" : 42, "key2" : 24}]}')
```
```response
-┌─name──┬─type───────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
-│ value │ Tuple(Array(Array(Nullable(Int64))), Map(String, Nullable(Int64))) │ │ │ │ │ │
-└───────┴────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+┌─name──┬─type─────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ value │ Tuple(Array(Array(Nullable(String))), Tuple(key1 Nullable(Int64), key2 Nullable(Int64))) │ │ │ │ │ │
+└───────┴──────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
```
-If ClickHouse cannot determine the type, because the data contains only nulls, an exception will be thrown:
+If ClickHouse cannot determine the type for some key, because the data contains only nulls/empty objects/empty arrays, type `String` will be used if setting `input_format_json_infer_incomplete_types_as_strings` is enabled or an exception will be thrown otherwise:
```sql
-DESC format(JSONEachRow, '{"arr" : [null, null]}')
+DESC format(JSONEachRow, '{"arr" : [null, null]}') SETTINGS input_format_json_infer_incomplete_types_as_strings = 1;
+```
+```response
+┌─name─┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ arr │ Array(Nullable(String)) │ │ │ │ │ │
+└──────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+```
+```sql
+DESC format(JSONEachRow, '{"arr" : [null, null]}') SETTINGS input_format_json_infer_incomplete_types_as_strings = 0;
```
```response
Code: 652. DB::Exception: Received from localhost:9000. DB::Exception:
@@ -466,31 +493,11 @@ most likely this column contains only Nulls or empty Arrays/Maps.
#### JSON settings {#json-settings}
-##### input_format_json_read_objects_as_strings
-
-Enabling this setting allows reading nested JSON objects as strings.
-This setting can be used to read nested JSON objects without using JSON object type.
-
-This setting is enabled by default.
-
-```sql
-SET input_format_json_read_objects_as_strings = 1;
-DESC format(JSONEachRow, $$
- {"obj" : {"key1" : 42, "key2" : [1,2,3,4]}}
- {"obj" : {"key3" : {"nested_key" : 1}}}
- $$)
-```
-```response
-┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
-│ obj │ Nullable(String) │ │ │ │ │ │
-└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
-```
-
##### input_format_json_try_infer_numbers_from_strings
Enabling this setting allows inferring numbers from string values.
-This setting is enabled by default.
+This setting is disabled by default.
**Example:**
@@ -507,11 +514,69 @@ DESC format(JSONEachRow, $$
└───────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
```
+##### input_format_json_try_infer_named_tuples_from_objects
+
+Enabling this setting allows inferring named Tuples from JSON objects. The resulting named Tuple will contain all elements from all corresponding JSON objects from sample data.
+It can be useful when JSON data is not sparse so the sample of data will contain all possible object keys.
+
+This setting is enabled by default.
+
+**Example**
+
+```sql
+SET input_format_json_try_infer_named_tuples_from_objects = 1;
+DESC format(JSONEachRow, '{"obj" : {"a" : 42, "b" : "Hello"}}, {"obj" : {"a" : 43, "c" : [1, 2, 3]}}, {"obj" : {"d" : {"e" : 42}}}')
+```
+
+Result:
+
+```
+┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ obj │ Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Tuple(e Nullable(Int64))) │ │ │ │ │ │
+└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+```
+
+```sql
+SET input_format_json_try_infer_named_tuples_from_objects = 1;
+DESC format(JSONEachRow, '{"array" : [{"a" : 42, "b" : "Hello"}, {}, {"c" : [1,2,3]}, {"d" : "2020-01-01"}]}')
+```
+
+Result:
+
+```
+┌─name──┬─type────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ array │ Array(Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Nullable(Date))) │ │ │ │ │ │
+└───────┴─────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+```
+
+##### input_format_json_read_objects_as_strings
+
+Enabling this setting allows reading nested JSON objects as strings.
+This setting can be used to read nested JSON objects without using JSON object type.
+
+This setting is enabled by default.
+
+Note: enabling this setting will take effect only if setting `input_format_json_try_infer_named_tuples_from_objects` is disabled.
+
+```sql
+SET input_format_json_read_objects_as_strings = 1, input_format_json_try_infer_named_tuples_from_objects = 0;
+DESC format(JSONEachRow, $$
+ {"obj" : {"key1" : 42, "key2" : [1,2,3,4]}}
+ {"obj" : {"key3" : {"nested_key" : 1}}}
+ $$)
+```
+```response
+┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ obj │ Nullable(String) │ │ │ │ │ │
+└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+```
+
+
##### input_format_json_read_numbers_as_strings
Enabling this setting allows reading numeric values as strings.
-This setting is disabled by default.
+This setting is enabled by default.
**Example**
@@ -549,6 +614,49 @@ DESC format(JSONEachRow, $$
└───────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
```
+##### input_format_json_read_arrays_as_strings
+
+Enabling this setting allows reading JSON array values as strings.
+
+This setting is enabled by default.
+
+**Example**
+
+```sql
+SET input_format_json_read_arrays_as_strings = 1;
+SELECT arr, toTypeName(arr), JSONExtractArrayRaw(arr)[3] from format(JSONEachRow, 'arr String', '{"arr" : [1, "Hello", [1,2,3]]}');
+```
+```response
+┌─arr───────────────────┬─toTypeName(arr)─┬─arrayElement(JSONExtractArrayRaw(arr), 3)─┐
+│ [1, "Hello", [1,2,3]] │ String │ [1,2,3] │
+└───────────────────────┴─────────────────┴───────────────────────────────────────────┘
+```
+
+##### input_format_json_infer_incomplete_types_as_strings
+
+Enabling this setting allows to use String type for JSON keys that contain only `Null`/`{}`/`[]` in data sample during schema inference.
+In JSON formats any value can be read as String if all corresponding settings are enabled (they are all enabled by default), and we can avoid errors like `Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` during schema inference
+by using String type for keys with unknown types.
+
+Example:
+
+```sql
+SET input_format_json_infer_incomplete_types_as_strings = 1, input_format_json_try_infer_named_tuples_from_objects = 1;
+DESCRIBE format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}');
+SELECT * FROM format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}');
+```
+
+Result:
+```
+┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ obj │ Tuple(a Array(Nullable(Int64)), b Nullable(String), c Nullable(String), d Nullable(String), e Array(Nullable(String))) │ │ │ │ │ │
+└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+
+┌─obj────────────────────────────┐
+│ ([1,2,3],'hello',NULL,'{}',[]) │
+└────────────────────────────────┘
+```
+
### CSV {#csv}
In CSV format ClickHouse extracts column values from the row according to delimiters. ClickHouse expects all types except numbers and strings to be enclosed in double quotes. If the value is in double quotes, ClickHouse tries to parse
diff --git a/docs/en/operations/settings/merge-tree-settings.md b/docs/en/operations/settings/merge-tree-settings.md
index 483dcf2e61c..eef470d4ee5 100644
--- a/docs/en/operations/settings/merge-tree-settings.md
+++ b/docs/en/operations/settings/merge-tree-settings.md
@@ -555,7 +555,7 @@ Merge reads rows from parts in blocks of `merge_max_block_size` rows, then merge
## number_of_free_entries_in_pool_to_lower_max_size_of_merge {#number-of-free-entries-in-pool-to-lower-max-size-of-merge}
-When there is less than specified number of free entries in pool (or replicated queue), start to lower maximum size of merge to process (or to put in queue).
+When there is less than specified number of free entries in pool (or replicated queue), start to lower maximum size of merge to process (or to put in queue).
This is to allow small merges to process - not filling the pool with long running merges.
Possible values:
@@ -566,7 +566,7 @@ Default value: 8
## number_of_free_entries_in_pool_to_execute_mutation {#number-of-free-entries-in-pool-to-execute-mutation}
-When there is less than specified number of free entries in pool, do not execute part mutations.
+When there is less than specified number of free entries in pool, do not execute part mutations.
This is to leave free threads for regular merges and avoid "Too many parts".
Possible values:
@@ -746,14 +746,14 @@ Default value: `0` (limit never applied).
Minimal ratio of the number of _default_ values to the number of _all_ values in a column. Setting this value causes the column to be stored using sparse serializations.
-If a column is sparse (contains mostly zeros), ClickHouse can encode it in a sparse format and automatically optimize calculations - the data does not require full decompression during queries. To enable this sparse serialization, define the `ratio_of_defaults_for_sparse_serialization` setting to be less than 1.0. If the value is greater than or equal to 1.0 (the default), then the columns will be always written using the normal full serialization.
+If a column is sparse (contains mostly zeros), ClickHouse can encode it in a sparse format and automatically optimize calculations - the data does not require full decompression during queries. To enable this sparse serialization, define the `ratio_of_defaults_for_sparse_serialization` setting to be less than 1.0. If the value is greater than or equal to 1.0, then the columns will be always written using the normal full serialization.
Possible values:
- Float between 0 and 1 to enable sparse serialization
- 1.0 (or greater) if you do not want to use sparse serialization
-Default value: `1.0` (sparse serialization is disabled)
+Default value: `0.9375`
**Example**
@@ -845,6 +845,13 @@ You can see which parts of `s` were stored using the sparse serialization:
└────────┴────────────────────┘
```
+## replace_long_file_name_to_hash {#replace_long_file_name_to_hash}
+If the file name for column is too long (more than `max_file_name_length` bytes) replace it to SipHash128. Default value: `false`.
+
+## max_file_name_length {#max_file_name_length}
+
+The maximal length of the file name to keep it as is without hashing. Takes effect only if setting `replace_long_file_name_to_hash` is enabled. The value of this setting does not include the length of file extension. So, it is recommended to set it below the maximum filename length (usually 255 bytes) with some gap to avoid filesystem errors. Default value: 127.
+
## clean_deleted_rows
Enable/disable automatic deletion of rows flagged as `is_deleted` when perform `OPTIMIZE ... FINAL` on a table using the ReplacingMergeTree engine. When disabled, the `CLEANUP` keyword has to be added to the `OPTIMIZE ... FINAL` to have the same behaviour.
diff --git a/docs/en/operations/settings/settings-formats.md b/docs/en/operations/settings/settings-formats.md
index 507f4dd23b9..bb59402079e 100644
--- a/docs/en/operations/settings/settings-formats.md
+++ b/docs/en/operations/settings/settings-formats.md
@@ -381,6 +381,13 @@ Enabled by default.
Allow parsing numbers as strings in JSON input formats.
+Enabled by default.
+
+## input_format_json_try_infer_numbers_from_strings {#input_format_json_try_infer_numbers_from_strings}
+
+If enabled, during schema inference ClickHouse will try to infer numbers from string fields.
+It can be useful if JSON data contains quoted UInt64 numbers.
+
Disabled by default.
## input_format_json_read_objects_as_strings {#input_format_json_read_objects_as_strings}
@@ -404,7 +411,76 @@ Result:
└────┴──────────────────────────┴────────────┘
```
-Disabled by default.
+Enabled by default.
+
+## input_format_json_try_infer_named_tuples_from_objects {#input_format_json_try_infer_named_tuples_from_objects}
+
+If enabled, during schema inference ClickHouse will try to infer named Tuple from JSON objects.
+The resulting named Tuple will contain all elements from all corresponding JSON objects from sample data.
+
+Example:
+
+```sql
+SET input_format_json_try_infer_named_tuples_from_objects = 1;
+DESC format(JSONEachRow, '{"obj" : {"a" : 42, "b" : "Hello"}}, {"obj" : {"a" : 43, "c" : [1, 2, 3]}}, {"obj" : {"d" : {"e" : 42}}}')
+```
+
+Result:
+
+```
+┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ obj │ Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Tuple(e Nullable(Int64))) │ │ │ │ │ │
+└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+```
+
+Enabled by default.
+
+## input_format_json_read_arrays_as_strings {#input_format_json_read_arrays_as_strings}
+
+Allow parsing JSON arrays as strings in JSON input formats.
+
+Example:
+
+```sql
+SET input_format_json_read_arrays_as_strings = 1;
+SELECT arr, toTypeName(arr), JSONExtractArrayRaw(arr)[3] from format(JSONEachRow, 'arr String', '{"arr" : [1, "Hello", [1,2,3]]}');
+```
+
+Result:
+```
+┌─arr───────────────────┬─toTypeName(arr)─┬─arrayElement(JSONExtractArrayRaw(arr), 3)─┐
+│ [1, "Hello", [1,2,3]] │ String │ [1,2,3] │
+└───────────────────────┴─────────────────┴───────────────────────────────────────────┘
+```
+
+Enabled by default.
+
+## input_format_json_infer_incomplete_types_as_strings {#input_format_json_infer_incomplete_types_as_strings}
+
+Allow to use String type for JSON keys that contain only `Null`/`{}`/`[]` in data sample during schema inference.
+In JSON formats any value can be read as String, and we can avoid errors like `Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` during schema inference
+by using String type for keys with unknown types.
+
+Example:
+
+```sql
+SET input_format_json_infer_incomplete_types_as_strings = 1, input_format_json_try_infer_named_tuples_from_objects = 1;
+DESCRIBE format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}');
+SELECT * FROM format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}');
+```
+
+Result:
+```
+┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
+│ obj │ Tuple(a Array(Nullable(Int64)), b Nullable(String), c Nullable(String), d Nullable(String), e Array(Nullable(String))) │ │ │ │ │ │
+└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
+
+┌─obj────────────────────────────┐
+│ ([1,2,3],'hello',NULL,'{}',[]) │
+└────────────────────────────────┘
+```
+
+Enabled by default.
## input_format_json_validate_types_from_metadata {#input_format_json_validate_types_from_metadata}
diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md
index bf705c6e263..98c1bfef402 100644
--- a/docs/en/operations/settings/settings.md
+++ b/docs/en/operations/settings/settings.md
@@ -4659,6 +4659,10 @@ SELECT toFloat64('1.7091'), toFloat64('1.5008753E7') SETTINGS precise_float_pars
Interval (in milliseconds) for sending updates with partial data about the result table to the client (in interactive mode) during query execution. Setting to 0 disables partial results. Only supported for single-threaded GROUP BY without key, ORDER BY, LIMIT and OFFSET.
+:::note
+It's an experimental feature. Enable `allow_experimental_partial_result` setting first to use it.
+:::
+
## max_rows_in_partial_result
Maximum rows to show in the partial result after every real-time update while the query runs (use partial result limit + OFFSET as a value in case of OFFSET in the query).
@@ -4678,3 +4682,36 @@ The default value is `false`.
``` xml
true
```
+
+## print_pretty_type_names {#print_pretty_type_names}
+
+Allows to print deep-nested type names in a pretty way with indents in `DESCRIBE` query and in `toTypeName()` function.
+
+Example:
+
+```sql
+CREATE TABLE test (a Tuple(b String, c Tuple(d Nullable(UInt64), e Array(UInt32), f Array(Tuple(g String, h Map(String, Array(Tuple(i String, j UInt64))))), k Date), l Nullable(String))) ENGINE=Memory;
+DESCRIBE TABLE test FORMAT TSVRaw SETTINGS print_pretty_type_names=1;
+```
+
+```
+a Tuple(
+ b String,
+ c Tuple(
+ d Nullable(UInt64),
+ e Array(UInt32),
+ f Array(Tuple(
+ g String,
+ h Map(
+ String,
+ Array(Tuple(
+ i String,
+ j UInt64
+ ))
+ )
+ )),
+ k Date
+ ),
+ l Nullable(String)
+)
+```
diff --git a/docs/en/operations/system-tables/functions.md b/docs/en/operations/system-tables/functions.md
index 60bfa08975b..d52bf24f289 100644
--- a/docs/en/operations/system-tables/functions.md
+++ b/docs/en/operations/system-tables/functions.md
@@ -7,28 +7,34 @@ Contains information about normal and aggregate functions.
Columns:
-- `name`(`String`) – The name of the function.
-- `is_aggregate`(`UInt8`) — Whether the function is aggregate.
+- `name` ([String](../../sql-reference/data-types/string.md)) – The name of the function.
+- `is_aggregate` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Whether the function is an aggregate function.
+- `is_deterministic` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md))) - Whether the function is deterministic.
+- `case_insensitive`, ([UInt8](../../sql-reference/data-types/int-uint.md)) - Whether the function name can be used case-insensitively.
+- `alias_to`, ([String](../../sql-reference/data-types/string.md)) - The original function name, if the function name is an alias.
+- `create_query`, ([String](../../sql-reference/data-types/enum.md)) - Unused.
+- `origin`, ([Enum8](../../sql-reference/data-types/string.md)) - Unused.
+- `description`, ([String](../../sql-reference/data-types/string.md)) - A high-level description what the function does.
+- `syntax`, ([String](../../sql-reference/data-types/string.md)) - Signature of the function.
+- `arguments`, ([String](../../sql-reference/data-types/string.md)) - What arguments does the function take.
+- `returned_value`, ([String](../../sql-reference/data-types/string.md)) - What does the function return.
+- `examples`, ([String](../../sql-reference/data-types/string.md)) - Example usage of the function.
+- `categories`, ([String](../../sql-reference/data-types/string.md)) - The category of the function.
**Example**
```sql
- SELECT * FROM system.functions LIMIT 10;
+ SELECT name, is_aggregate, is_deterministic, case_insensitive, alias_to FROM system.functions LIMIT 5;
```
```text
-┌─name──────────────────┬─is_aggregate─┬─case_insensitive─┬─alias_to─┬─create_query─┬─origin─┐
-│ logTrace │ 0 │ 0 │ │ │ System │
-│ aes_decrypt_mysql │ 0 │ 0 │ │ │ System │
-│ aes_encrypt_mysql │ 0 │ 0 │ │ │ System │
-│ decrypt │ 0 │ 0 │ │ │ System │
-│ encrypt │ 0 │ 0 │ │ │ System │
-│ toBool │ 0 │ 0 │ │ │ System │
-│ windowID │ 0 │ 0 │ │ │ System │
-│ hopStart │ 0 │ 0 │ │ │ System │
-│ hop │ 0 │ 0 │ │ │ System │
-│ snowflakeToDateTime64 │ 0 │ 0 │ │ │ System │
-└───────────────────────┴──────────────┴──────────────────┴──────────┴──────────────┴────────┘
+┌─name─────────────────────┬─is_aggregate─┬─is_deterministic─┬─case_insensitive─┬─alias_to─┐
+│ BLAKE3 │ 0 │ 1 │ 0 │ │
+│ sipHash128Reference │ 0 │ 1 │ 0 │ │
+│ mapExtractKeyLike │ 0 │ 1 │ 0 │ │
+│ sipHash128ReferenceKeyed │ 0 │ 1 │ 0 │ │
+│ mapPartialSort │ 0 │ 1 │ 0 │ │
+└──────────────────────────┴──────────────┴──────────────────┴──────────────────┴──────────┘
-10 rows in set. Elapsed: 0.002 sec.
+5 rows in set. Elapsed: 0.002 sec.
```
diff --git a/docs/en/operations/system-tables/information_schema.md b/docs/en/operations/system-tables/information_schema.md
index bca37b47312..85f58efb240 100644
--- a/docs/en/operations/system-tables/information_schema.md
+++ b/docs/en/operations/system-tables/information_schema.md
@@ -198,8 +198,10 @@ Columns:
- `FOREIGN TABLE`
- `LOCAL TEMPORARY`
- `SYSTEM VIEW`
+- `data_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The size of
+ the data on-disk. NULL if it could not be determined.
+- `table_collation` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The table default collation. Always `utf8mb4_0900_ai_ci`.
- `table_comment` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The comment used when creating the table.
-- `table_collation` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The table default collation. Always `utf8mb4`.
**Example**
@@ -291,7 +293,7 @@ is_trigger_deletable: NO
is_trigger_insertable_into: NO
```
-## KEY_COLUMN_USAGE (#key_column_usage)
+## KEY_COLUMN_USAGE {#key_column_usage}
Contains columns from the [system.tables](../../operations/system-tables/tables.md) system table which are restricted by constraints.
@@ -350,7 +352,7 @@ referenced_table_name: ᴺᵁᴸᴸ
referenced_column_name: ᴺᵁᴸᴸ
```
-## REFERENTIAL_CONSTRAINTS (#referential_constraints)
+## REFERENTIAL_CONSTRAINTS {#referential_constraints}
Contains information about foreign keys. Currently returns an empty result (no rows) which is just enough to provide compatibility with 3rd party tools like Tableau Online.
diff --git a/docs/en/operations/system-tables/merge_tree_settings.md b/docs/en/operations/system-tables/merge_tree_settings.md
index 557835ce3b6..48217d63f9d 100644
--- a/docs/en/operations/system-tables/merge_tree_settings.md
+++ b/docs/en/operations/system-tables/merge_tree_settings.md
@@ -17,7 +17,7 @@ Columns:
- `0` — Current user can change the setting.
- `1` — Current user can’t change the setting.
- `type` ([String](../../sql-reference/data-types/string.md)) — Setting type (implementation specific string value).
-- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) _ Shows whether a setting is obsolete.
+- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) - Shows whether a setting is obsolete.
**Example**
```sql
diff --git a/docs/en/operations/system-tables/server_settings.md b/docs/en/operations/system-tables/server_settings.md
index df482261ae8..7efe605ccef 100644
--- a/docs/en/operations/system-tables/server_settings.md
+++ b/docs/en/operations/system-tables/server_settings.md
@@ -14,7 +14,7 @@ Columns:
- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether a setting was specified in `config.xml`
- `description` ([String](../../sql-reference/data-types/string.md)) — Short server setting description.
- `type` ([String](../../sql-reference/data-types/string.md)) — Server setting value type.
-- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) _ Shows whether a setting is obsolete.
+- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) - Shows whether a setting is obsolete.
**Example**
diff --git a/docs/en/operations/system-tables/settings.md b/docs/en/operations/system-tables/settings.md
index 7dd2345a2d0..a04e095e990 100644
--- a/docs/en/operations/system-tables/settings.md
+++ b/docs/en/operations/system-tables/settings.md
@@ -17,7 +17,7 @@ Columns:
- `0` — Current user can change the setting.
- `1` — Current user can’t change the setting.
- `default` ([String](../../sql-reference/data-types/string.md)) — Setting default value.
-- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) _ Shows whether a setting is obsolete.
+- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) - Shows whether a setting is obsolete.
**Example**
diff --git a/docs/en/sql-reference/aggregate-functions/reference/studentttest.md b/docs/en/sql-reference/aggregate-functions/reference/studentttest.md
index 29b43851f44..fa320b4e336 100644
--- a/docs/en/sql-reference/aggregate-functions/reference/studentttest.md
+++ b/docs/en/sql-reference/aggregate-functions/reference/studentttest.md
@@ -33,8 +33,8 @@ The null hypothesis is that means of populations are equal. Normal distribution
- calculated t-statistic. [Float64](../../../sql-reference/data-types/float.md).
- calculated p-value. [Float64](../../../sql-reference/data-types/float.md).
-- [calculated confidence-interval-low.] [Float64](../../../sql-reference/data-types/float.md).
-- [calculated confidence-interval-high.] [Float64](../../../sql-reference/data-types/float.md).
+- [calculated confidence-interval-low. [Float64](../../../sql-reference/data-types/float.md).]
+- [calculated confidence-interval-high. [Float64](../../../sql-reference/data-types/float.md).]
**Example**
diff --git a/docs/en/sql-reference/data-types/date.md b/docs/en/sql-reference/data-types/date.md
index 048466f7ae4..26e4610aec7 100644
--- a/docs/en/sql-reference/data-types/date.md
+++ b/docs/en/sql-reference/data-types/date.md
@@ -26,7 +26,12 @@ ENGINE = TinyLog;
```
``` sql
-INSERT INTO dt VALUES (1546300800, 1), ('2019-01-01', 2);
+-- Parse Date
+-- - from string,
+-- - from 'small' integer interpreted as number of days since 1970-01-01, and
+-- - from 'big' integer interpreted as number of seconds since 1970-01-01.
+INSERT INTO dt VALUES ('2019-01-01', 1), (17897, 2), (1546300800, 3);
+
SELECT * FROM dt;
```
@@ -34,6 +39,7 @@ SELECT * FROM dt;
┌──timestamp─┬─event_id─┐
│ 2019-01-01 │ 1 │
│ 2019-01-01 │ 2 │
+│ 2019-01-01 │ 3 │
└────────────┴──────────┘
```
diff --git a/docs/en/sql-reference/data-types/date32.md b/docs/en/sql-reference/data-types/date32.md
index 7cf8b1b95fe..38a07cd817d 100644
--- a/docs/en/sql-reference/data-types/date32.md
+++ b/docs/en/sql-reference/data-types/date32.md
@@ -13,7 +13,7 @@ A date. Supports the date range same with [DateTime64](../../sql-reference/data-
Creating a table with a `Date32`-type column and inserting data into it:
``` sql
-CREATE TABLE new
+CREATE TABLE dt32
(
`timestamp` Date32,
`event_id` UInt8
@@ -22,8 +22,13 @@ ENGINE = TinyLog;
```
``` sql
-INSERT INTO new VALUES (4102444800, 1), ('2100-01-01', 2);
-SELECT * FROM new;
+-- Parse Date
+-- - from string,
+-- - from 'small' integer interpreted as number of days since 1970-01-01, and
+-- - from 'big' integer interpreted as number of seconds since 1970-01-01.
+INSERT INTO dt32 VALUES ('2100-01-01', 1), (47482, 2), (4102444800, 3);
+
+SELECT * FROM dt32;
```
``` text
diff --git a/docs/en/sql-reference/data-types/datetime.md b/docs/en/sql-reference/data-types/datetime.md
index c99c8791542..42a1ca5aaac 100644
--- a/docs/en/sql-reference/data-types/datetime.md
+++ b/docs/en/sql-reference/data-types/datetime.md
@@ -48,17 +48,18 @@ ENGINE = TinyLog;
```
``` sql
-INSERT INTO dt Values (1546300800, 1), ('2019-01-01 00:00:00', 2);
-```
+-- Parse DateTime
+-- - from string,
+-- - from integer interpreted as number of seconds since 1970-01-01.
+INSERT INTO dt VALUES ('2019-01-01 00:00:00', 1), (1546300800, 3);
-``` sql
SELECT * FROM dt;
```
``` text
┌───────────timestamp─┬─event_id─┐
-│ 2019-01-01 03:00:00 │ 1 │
│ 2019-01-01 00:00:00 │ 2 │
+│ 2019-01-01 03:00:00 │ 1 │
└─────────────────────┴──────────┘
```
@@ -73,7 +74,7 @@ SELECT * FROM dt WHERE timestamp = toDateTime('2019-01-01 00:00:00', 'Asia/Istan
``` text
┌───────────timestamp─┬─event_id─┐
-│ 2019-01-01 00:00:00 │ 2 │
+│ 2019-01-01 00:00:00 │ 1 │
└─────────────────────┴──────────┘
```
@@ -85,7 +86,7 @@ SELECT * FROM dt WHERE timestamp = '2019-01-01 00:00:00'
``` text
┌───────────timestamp─┬─event_id─┐
-│ 2019-01-01 03:00:00 │ 1 │
+│ 2019-01-01 00:00:00 │ 1 │
└─────────────────────┴──────────┘
```
diff --git a/docs/en/sql-reference/data-types/datetime64.md b/docs/en/sql-reference/data-types/datetime64.md
index 3b80e8b1a8b..8c7fa17ae92 100644
--- a/docs/en/sql-reference/data-types/datetime64.md
+++ b/docs/en/sql-reference/data-types/datetime64.md
@@ -28,7 +28,7 @@ Note: The precision of the maximum value is 8. If the maximum precision of 9 dig
1. Creating a table with `DateTime64`-type column and inserting data into it:
``` sql
-CREATE TABLE dt
+CREATE TABLE dt64
(
`timestamp` DateTime64(3, 'Asia/Istanbul'),
`event_id` UInt8
@@ -37,11 +37,12 @@ ENGINE = TinyLog;
```
``` sql
-INSERT INTO dt Values (1546300800123, 1), (1546300800.123, 2), ('2019-01-01 00:00:00', 3);
-```
+-- Parse DateTime
+-- - from integer interpreted as number of seconds since 1970-01-01.
+-- - from string,
+INSERT INTO dt64 VALUES (1546300800123, 1), (1546300800.123, 2), ('2019-01-01 00:00:00', 3);
-``` sql
-SELECT * FROM dt;
+SELECT * FROM dt64;
```
``` text
@@ -58,7 +59,7 @@ SELECT * FROM dt;
2. Filtering on `DateTime64` values
``` sql
-SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul');
+SELECT * FROM dt64 WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul');
```
``` text
@@ -70,7 +71,7 @@ SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/
Unlike `DateTime`, `DateTime64` values are not converted from `String` automatically.
``` sql
-SELECT * FROM dt WHERE timestamp = toDateTime64(1546300800.123, 3);
+SELECT * FROM dt64 WHERE timestamp = toDateTime64(1546300800.123, 3);
```
``` text
@@ -101,7 +102,7 @@ SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS
SELECT
toDateTime64(timestamp, 3, 'Europe/London') as lon_time,
toDateTime64(timestamp, 3, 'Asia/Istanbul') as istanbul_time
-FROM dt;
+FROM dt64;
```
``` text
diff --git a/docs/en/sql-reference/functions/date-time-functions.md b/docs/en/sql-reference/functions/date-time-functions.md
index 0364a610404..a7acd8a6fb3 100644
--- a/docs/en/sql-reference/functions/date-time-functions.md
+++ b/docs/en/sql-reference/functions/date-time-functions.md
@@ -134,9 +134,57 @@ Like [makeDateTime](#makedatetime) but produces a [DateTime64](../../sql-referen
**Syntax**
``` sql
-makeDateTime32(year, month, day, hour, minute, second[, fraction[, precision[, timezone]]])
+makeDateTime64(year, month, day, hour, minute, second[, fraction[, precision[, timezone]]])
```
+## timestamp
+
+Converts the first argument 'expr' to type [DateTime64(6)](../../sql-reference/data-types/datetime64.md).
+If a second argument 'expr_time' is provided, it adds the specified time to the converted value.
+
+**Syntax**
+
+``` sql
+timestamp(expr[, expr_time])
+```
+
+Alias: `TIMESTAMP`
+
+**Arguments**
+
+- `expr` - Date or date with time. Type: [String](../../sql-reference/data-types/string.md).
+- `expr_time` - Optional parameter. Time to add. [String](../../sql-reference/data-types/string.md).
+
+**Examples**
+
+``` sql
+SELECT timestamp('2023-12-31') as ts;
+```
+
+Result:
+
+``` text
+┌─────────────────────────ts─┐
+│ 2023-12-31 00:00:00.000000 │
+└────────────────────────────┘
+```
+
+``` sql
+SELECT timestamp('2023-12-31 12:00:00', '12:00:00.11') as ts;
+```
+
+Result:
+
+``` text
+┌─────────────────────────ts─┐
+│ 2024-01-01 00:00:00.110000 │
+└────────────────────────────┘
+```
+
+**Returned value**
+
+- [DateTime64](../../sql-reference/data-types/datetime64.md)(6)
+
## timeZone
Returns the timezone of the current session, i.e. the value of setting [session_timezone](../../operations/settings/settings.md#session_timezone).
diff --git a/docs/en/sql-reference/functions/string-search-functions.md b/docs/en/sql-reference/functions/string-search-functions.md
index 8a2e257ed34..264708513fa 100644
--- a/docs/en/sql-reference/functions/string-search-functions.md
+++ b/docs/en/sql-reference/functions/string-search-functions.md
@@ -684,12 +684,12 @@ Like [hasSubsequenceUTF8](#hasSubsequenceUTF8) but searches case-insensitively.
## byteHammingDistance
-Calculates the hamming distance between two byte strings.
+Calculates the [hamming distance](https://en.wikipedia.org/wiki/Hamming_distance) between two byte strings.
**Syntax**
```sql
-byteHammingDistance(haystack, needle)
+byteHammingDistance(string2, string2)
```
**Examples**
@@ -708,53 +708,52 @@ Result:
- Alias: mismatches
-## byteJaccardIndex
+## jaccardIndex
-Calculates the jaccard similarity index between two byte strings.
+Calculates the [Jaccard similarity index](https://en.wikipedia.org/wiki/Jaccard_index) between two byte strings.
**Syntax**
```sql
-byteJaccardIndex(haystack, needle)
+byteJaccardIndex(string1, string2)
```
**Examples**
``` sql
-SELECT byteJaccardIndex('clickhouse', 'mouse');
+SELECT jaccardIndex('clickhouse', 'mouse');
```
Result:
``` text
-┌─byteJaccardIndex('clickhouse', 'mouse')─┐
+┌─jaccardIndex('clickhouse', 'mouse')─┐
│ 0.4 │
└─────────────────────────────────────────┘
```
-## byteEditDistance
+## editDistance
-Calculates the edit distance between two byte strings.
+Calculates the [edit distance](https://en.wikipedia.org/wiki/Edit_distance) between two byte strings.
**Syntax**
```sql
-byteEidtDistance(haystack, needle)
+editDistance(string1, string2)
```
**Examples**
``` sql
-SELECT byteEditDistance('clickhouse', 'mouse');
+SELECT editDistance('clickhouse', 'mouse');
```
Result:
``` text
-┌─byteEditDistance('clickhouse', 'mouse')─┐
+┌─editDistance('clickhouse', 'mouse')─┐
│ 6 │
└─────────────────────────────────────────┘
```
-- Alias: byteLevenshteinDistance
-
+- Alias: levenshteinDistance
diff --git a/docs/en/sql-reference/statements/alter/partition.md b/docs/en/sql-reference/statements/alter/partition.md
index a0aa74e6d25..114b8d5ffe3 100644
--- a/docs/en/sql-reference/statements/alter/partition.md
+++ b/docs/en/sql-reference/statements/alter/partition.md
@@ -113,6 +113,7 @@ For the query to run successfully, the following conditions must be met:
- Both tables must have the same structure.
- Both tables must have the same partition key, the same order by key and the same primary key.
+- Both tables must have the same indices and projections.
- Both tables must have the same storage policy.
## REPLACE PARTITION
@@ -132,6 +133,7 @@ For the query to run successfully, the following conditions must be met:
- Both tables must have the same structure.
- Both tables must have the same partition key, the same order by key and the same primary key.
+- Both tables must have the same indices and projections.
- Both tables must have the same storage policy.
## MOVE PARTITION TO TABLE
@@ -146,6 +148,7 @@ For the query to run successfully, the following conditions must be met:
- Both tables must have the same structure.
- Both tables must have the same partition key, the same order by key and the same primary key.
+- Both tables must have the same indices and projections.
- Both tables must have the same storage policy.
- Both tables must be the same engine family (replicated or non-replicated).
diff --git a/docs/en/sql-reference/statements/create/user.md b/docs/en/sql-reference/statements/create/user.md
index f6d1960a4f3..20cd9a47e98 100644
--- a/docs/en/sql-reference/statements/create/user.md
+++ b/docs/en/sql-reference/statements/create/user.md
@@ -12,7 +12,7 @@ Syntax:
``` sql
CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1]
[, name2 [ON CLUSTER cluster_name2] ...]
- [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']} | {WITH ssl_certificate CN 'common_name'}]
+ [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']} | {WITH ssl_certificate CN 'common_name'} | {WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa|...'}]
[HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
[VALID UNTIL datetime]
[IN access_storage_type]
@@ -39,6 +39,7 @@ There are multiple ways of user identification:
- `IDENTIFIED WITH ldap SERVER 'server_name'`
- `IDENTIFIED WITH kerberos` or `IDENTIFIED WITH kerberos REALM 'realm'`
- `IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'`
+- `IDENTIFIED WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa', KEY 'another_public_key' TYPE 'ssh-ed25519'`
- `IDENTIFIED BY 'qwerty'`
Password complexity requirements can be edited in [config.xml](/docs/en/operations/configuration-files). Below is an example configuration that requires passwords to be at least 12 characters long and contain 1 number. Each password complexity rule requires a regex to match against passwords and a description of the rule.
diff --git a/docs/en/sql-reference/statements/truncate.md b/docs/en/sql-reference/statements/truncate.md
index 4b46210aa09..029815a4392 100644
--- a/docs/en/sql-reference/statements/truncate.md
+++ b/docs/en/sql-reference/statements/truncate.md
@@ -25,7 +25,7 @@ If the `alter_sync` is set to `2` and some replicas are not active for more than
## TRUNCATE DATABASE
``` sql
-TRUNCATE DATBASE [IF EXISTS] [db.]name [ON CLUSTER cluster]
+TRUNCATE DATABASE [IF EXISTS] [db.]name [ON CLUSTER cluster]
```
Removes all tables from a database but keeps the database itself. When the clause `IF EXISTS` is omitted, the query returns an error if the database does not exist.
diff --git a/docs/en/sql-reference/table-functions/s3.md b/docs/en/sql-reference/table-functions/s3.md
index 07addafcf58..8649295e815 100644
--- a/docs/en/sql-reference/table-functions/s3.md
+++ b/docs/en/sql-reference/table-functions/s3.md
@@ -162,6 +162,28 @@ The below get data from all `test-data.csv.gz` files from any folder inside `my-
SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip');
```
+Note. It is possible to specify custom URL mappers in the server configuration file. Example:
+``` sql
+SELECT * FROM s3('s3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip');
+```
+The URL `'s3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz'` would be replaced to `'http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz'`
+
+
+Custom mapper can be added into `config.xml`:
+``` xml
+
+
+ https://{bucket}.s3.amazonaws.com
+
+
+ https://{bucket}.storage.googleapis.com
+
+
+ https://{bucket}.oss.aliyuncs.com
+
+
+```
+
## Partitioned Write
If you specify `PARTITION BY` expression when inserting data into `S3` table, a separate file is created for each partition value. Splitting the data into separate files helps to improve reading operations efficiency.
diff --git a/docs/ru/sql-reference/statements/create/user.md b/docs/ru/sql-reference/statements/create/user.md
index 9c1f25bf6d2..76cfdb251dc 100644
--- a/docs/ru/sql-reference/statements/create/user.md
+++ b/docs/ru/sql-reference/statements/create/user.md
@@ -13,7 +13,7 @@ sidebar_label: "Пользователь"
``` sql
CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1]
[, name2 [ON CLUSTER cluster_name2] ...]
- [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}]
+ [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']} | {WITH ssl_certificate CN 'common_name'} | {WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa|...'}]
[HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
[DEFAULT ROLE role [,...]]
[DEFAULT DATABASE database | NONE]
@@ -27,14 +27,19 @@ CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1]
Существует несколько способов идентификации пользователя:
-- `IDENTIFIED WITH no_password`
-- `IDENTIFIED WITH plaintext_password BY 'qwerty'`
-- `IDENTIFIED WITH sha256_password BY 'qwerty'` or `IDENTIFIED BY 'password'`
-- `IDENTIFIED WITH sha256_hash BY 'hash'` or `IDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'`
-- `IDENTIFIED WITH double_sha1_password BY 'qwerty'`
-- `IDENTIFIED WITH double_sha1_hash BY 'hash'`
-- `IDENTIFIED WITH ldap SERVER 'server_name'`
-- `IDENTIFIED WITH kerberos` or `IDENTIFIED WITH kerberos REALM 'realm'`
+- `IDENTIFIED WITH no_password`
+- `IDENTIFIED WITH plaintext_password BY 'qwerty'`
+- `IDENTIFIED WITH sha256_password BY 'qwerty'` or `IDENTIFIED BY 'password'`
+- `IDENTIFIED WITH sha256_hash BY 'hash'` or `IDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'`
+- `IDENTIFIED WITH double_sha1_password BY 'qwerty'`
+- `IDENTIFIED WITH double_sha1_hash BY 'hash'`
+- `IDENTIFIED WITH bcrypt_password BY 'qwerty'`
+- `IDENTIFIED WITH bcrypt_hash BY 'hash'`
+- `IDENTIFIED WITH ldap SERVER 'server_name'`
+- `IDENTIFIED WITH kerberos` or `IDENTIFIED WITH kerberos REALM 'realm'`
+- `IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'`
+- `IDENTIFIED WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa', KEY 'another_public_key' TYPE 'ssh-ed25519'`
+- `IDENTIFIED BY 'qwerty'`
Для идентификации с sha256_hash используя `SALT` - хэш должен быть вычислен от конкатенации 'password' и 'salt'.
diff --git a/packages/.gitignore b/packages/.gitignore
index 355164c1265..69cf3a785e4 100644
--- a/packages/.gitignore
+++ b/packages/.gitignore
@@ -1 +1,2 @@
*/
+!pre-build/
diff --git a/packages/pre-build/example.sh b/packages/pre-build/example.sh
new file mode 100755
index 00000000000..2e361d6ca44
--- /dev/null
+++ b/packages/pre-build/example.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+echo "This is an example pre-build script!"
diff --git a/programs/client/Client.cpp b/programs/client/Client.cpp
index 64823f9ec7f..ac5c9f99e0e 100644
--- a/programs/client/Client.cpp
+++ b/programs/client/Client.cpp
@@ -125,7 +125,7 @@ void Client::showWarnings()
std::cout << std::endl;
}
}
- catch (...)
+ catch (...) // NOLINT(bugprone-empty-catch)
{
/// Ignore exception
}
@@ -994,6 +994,8 @@ void Client::addOptions(OptionsDescription & options_description)
("user,u", po::value()->default_value("default"), "user")
("password", po::value(), "password")
("ask-password", "ask-password")
+ ("ssh-key-file", po::value(), "File containing ssh private key needed for authentication. If not set does password authentication.")
+ ("ssh-key-passphrase", po::value(), "Passphrase for imported ssh key.")
("quota_key", po::value(), "A string to differentiate quotas when the user have keyed quotas configured on server")
("max_client_network_bandwidth", po::value(), "the maximum speed of data exchange over the network for the client in bytes per second.")
@@ -1136,6 +1138,10 @@ void Client::processOptions(const OptionsDescription & options_description,
config().setString("password", options["password"].as());
if (options.count("ask-password"))
config().setBool("ask-password", true);
+ if (options.count("ssh-key-file"))
+ config().setString("ssh-key-file", options["ssh-key-file"].as());
+ if (options.count("ssh-key-passphrase"))
+ config().setString("ssh-key-passphrase", options["ssh-key-passphrase"].as());
if (options.count("quota_key"))
config().setString("quota_key", options["quota_key"].as());
if (options.count("max_client_network_bandwidth"))
diff --git a/programs/copier/ClusterCopier.cpp b/programs/copier/ClusterCopier.cpp
index 556eca808f6..29e31cf97e3 100644
--- a/programs/copier/ClusterCopier.cpp
+++ b/programs/copier/ClusterCopier.cpp
@@ -2025,7 +2025,7 @@ UInt64 ClusterCopier::executeQueryOnCluster(
{
connections.emplace_back(std::make_shared(
node.host_name, node.port, node.default_database,
- node.user, node.password, node.quota_key, node.cluster, node.cluster_secret,
+ node.user, node.password, ssh::SSHKey(), node.quota_key, node.cluster, node.cluster_secret,
"ClusterCopier", node.compression, node.secure
));
diff --git a/programs/diagnostics/testdata/configs/xml/config.xml b/programs/diagnostics/testdata/configs/xml/config.xml
index c9c0a824ef6..ae09d207091 100644
--- a/programs/diagnostics/testdata/configs/xml/config.xml
+++ b/programs/diagnostics/testdata/configs/xml/config.xml
@@ -760,27 +760,6 @@
-->
-
-
-
-
-
-
-
-
+
+
+ https://{bucket}.s3.amazonaws.com
+
+
+ https://{bucket}.storage.googleapis.com
+
+
+ https://{bucket}.oss.aliyuncs.com
+
+
+
@@ -1219,14 +1229,13 @@
system
toYYYYMM(event_date)
- 0
+ 7500
- -->
", report_text)
message_match = re.search("", report_text)
@@ -276,17 +256,12 @@ if __name__ == "__main__":
report_url = GITHUB_RUN_URL
- if uploaded["run.log"]:
- report_url = uploaded["run.log"]
-
- if uploaded["compare.log"]:
- report_url = uploaded["compare.log"]
-
- if uploaded["output.7z"]:
- report_url = uploaded["output.7z"]
-
- if uploaded["report.html"]:
- report_url = uploaded["report.html"]
+ report_url = (
+ uploaded["report.html"]
+ or uploaded["output.7z"]
+ or uploaded["compare.log"]
+ or uploaded["run.log"]
+ )
post_commit_status(
commit, status, report_url, message, check_name_with_group, pr_info
@@ -294,3 +269,7 @@ if __name__ == "__main__":
if status == "error":
sys.exit(1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tests/ci/pr_info.py b/tests/ci/pr_info.py
index 49c8bea142e..830aa936bea 100644
--- a/tests/ci/pr_info.py
+++ b/tests/ci/pr_info.py
@@ -2,7 +2,7 @@
import json
import logging
import os
-from typing import Dict, List, Set, Union
+from typing import Dict, List, Set, Union, Literal
from unidiff import PatchSet # type: ignore
@@ -310,57 +310,73 @@ class PRInfo:
return False
def can_skip_builds_and_use_version_from_master(self):
- # TODO: See a broken loop
if FORCE_TESTS_LABEL in self.labels:
return False
if self.changed_files is None or not self.changed_files:
return False
- for f in self.changed_files:
- # TODO: this logic is broken, should be fixed before using
- if (
- not f.startswith("tests/queries")
- or not f.startswith("tests/integration")
- or not f.startswith("tests/performance")
- ):
- return False
+ return not any(
+ f.startswith("programs")
+ or f.startswith("src")
+ or f.startswith("base")
+ or f.startswith("cmake")
+ or f.startswith("rust")
+ or f == "CMakeLists.txt"
+ or f == "tests/ci/build_check.py"
+ for f in self.changed_files
+ )
- return True
-
- def can_skip_integration_tests(self):
- # TODO: See a broken loop
+ def can_skip_integration_tests(self, versions: List[str]) -> bool:
if FORCE_TESTS_LABEL in self.labels:
return False
+ # If docker image(s) relevant to integration tests are updated
+ if any(self.sha in version for version in versions):
+ return False
+
if self.changed_files is None or not self.changed_files:
return False
- for f in self.changed_files:
- # TODO: this logic is broken, should be fixed before using
- if not f.startswith("tests/queries") or not f.startswith(
- "tests/performance"
- ):
- return False
+ if not self.can_skip_builds_and_use_version_from_master():
+ return False
- return True
+ # Integration tests can be skipped if integration tests are not changed
+ return not any(
+ f.startswith("tests/integration/")
+ or f == "tests/ci/integration_test_check.py"
+ for f in self.changed_files
+ )
- def can_skip_functional_tests(self):
- # TODO: See a broken loop
+ def can_skip_functional_tests(
+ self, version: str, test_type: Literal["stateless", "stateful"]
+ ) -> bool:
if FORCE_TESTS_LABEL in self.labels:
return False
+ # If docker image(s) relevant to functional tests are updated
+ if self.sha in version:
+ return False
+
if self.changed_files is None or not self.changed_files:
return False
- for f in self.changed_files:
- # TODO: this logic is broken, should be fixed before using
- if not f.startswith("tests/integration") or not f.startswith(
- "tests/performance"
- ):
- return False
+ if not self.can_skip_builds_and_use_version_from_master():
+ return False
- return True
+ # Functional tests can be skipped if queries tests are not changed
+ if test_type == "stateless":
+ return not any(
+ f.startswith("tests/queries/0_stateless")
+ or f == "tests/ci/functional_test_check.py"
+ for f in self.changed_files
+ )
+ else: # stateful
+ return not any(
+ f.startswith("tests/queries/1_stateful")
+ or f == "tests/ci/functional_test_check.py"
+ for f in self.changed_files
+ )
class FakePRInfo:
diff --git a/tests/ci/s3_helper.py b/tests/ci/s3_helper.py
index d8da702814e..bb047b4f4ef 100644
--- a/tests/ci/s3_helper.py
+++ b/tests/ci/s3_helper.py
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
import hashlib
import logging
-import os
import re
import shutil
import time
@@ -131,11 +130,7 @@ class S3Helper:
def fast_parallel_upload_dir(
self, dir_path: Path, s3_dir_path: str, bucket_name: str
) -> List[str]:
- all_files = []
-
- for root, _, files in os.walk(dir_path):
- for file in files:
- all_files.append(os.path.join(root, file))
+ all_files = [file for file in dir_path.rglob("*") if file.is_file()]
logging.info("Files found %s", len(all_files))
@@ -143,12 +138,13 @@ class S3Helper:
t = time.time()
sum_time = 0
- def upload_task(file_path: str) -> str:
+ def upload_task(file_path: Path) -> str:
nonlocal counter
nonlocal t
nonlocal sum_time
+ file_str = file_path.as_posix()
try:
- s3_path = file_path.replace(str(dir_path), s3_dir_path)
+ s3_path = file_str.replace(str(dir_path), s3_dir_path)
metadata = {}
if s3_path.endswith("html"):
metadata["ContentType"] = "text/html; charset=utf-8"
@@ -214,11 +210,11 @@ class S3Helper:
def task(file_path: Path) -> Union[str, List[str]]:
full_fs_path = file_path.absolute()
if keep_dirs_in_s3_path:
- full_s3_path = os.path.join(s3_directory_path, directory_path.name)
+ full_s3_path = "/".join((s3_directory_path, directory_path.name))
else:
full_s3_path = s3_directory_path
- if os.path.isdir(full_fs_path):
+ if full_fs_path.is_dir():
return self._upload_directory_to_s3(
full_fs_path,
full_s3_path,
diff --git a/tests/ci/sqlancer_check.py b/tests/ci/sqlancer_check.py
index 7c8ffbab7f7..47bc3b2c1e8 100644
--- a/tests/ci/sqlancer_check.py
+++ b/tests/ci/sqlancer_check.py
@@ -2,9 +2,8 @@
import logging
import subprocess
-import os
import sys
-from typing import List
+from pathlib import Path
from github import Github
@@ -16,7 +15,7 @@ from commit_status_helper import (
get_commit,
post_commit_status,
)
-from docker_pull_helper import get_image_with_version
+from docker_pull_helper import get_image_with_version, DockerImage
from env_helper import (
GITHUB_RUN_URL,
REPORTS_PATH,
@@ -27,21 +26,16 @@ from pr_info import PRInfo
from report import TestResults, TestResult
from s3_helper import S3Helper
from stopwatch import Stopwatch
+from tee_popen import TeePopen
from upload_result_helper import upload_results
IMAGE_NAME = "clickhouse/sqlancer-test"
-def get_pull_command(docker_image):
- return f"docker pull {docker_image}"
-
-
-def get_run_command(download_url, workspace_path, image):
+def get_run_command(download_url: str, workspace_path: Path, image: DockerImage) -> str:
return (
- f"docker run "
# For sysctl
- "--privileged "
- "--network=host "
+ "docker run --privileged --network=host "
f"--volume={workspace_path}:/workspace "
"--cap-add syslog --cap-add sys_admin --cap-add=SYS_PTRACE "
f'-e BINARY_URL_TO_DOWNLOAD="{download_url}" '
@@ -54,14 +48,13 @@ def main():
stopwatch = Stopwatch()
- temp_path = TEMP_PATH
- reports_path = REPORTS_PATH
+ temp_path = Path(TEMP_PATH)
+ temp_path.mkdir(parents=True, exist_ok=True)
+
+ reports_path = Path(REPORTS_PATH)
check_name = sys.argv[1]
- if not os.path.exists(temp_path):
- os.makedirs(temp_path)
-
pr_info = PRInfo()
gh = Github(get_best_robot_token(), per_page=100)
@@ -75,7 +68,6 @@ def main():
docker_image = get_image_with_version(reports_path, IMAGE_NAME)
build_name = get_build_name_for_check(check_name)
- print(build_name)
urls = read_build_urls(build_name, reports_path)
if not urls:
raise Exception("No build URLs found")
@@ -89,38 +81,19 @@ def main():
logging.info("Got build url %s", build_url)
- workspace_path = os.path.join(temp_path, "workspace")
- if not os.path.exists(workspace_path):
- os.makedirs(workspace_path)
-
- pull_command = get_pull_command(docker_image)
-
- logging.info("Going to pull image %s", pull_command)
-
- pull_log_path = os.path.join(workspace_path, "pull.log")
- with open(pull_log_path, "w", encoding="utf-8") as log:
- with subprocess.Popen(
- pull_command, shell=True, stderr=log, stdout=log
- ) as process:
- retcode = process.wait()
- if retcode == 0:
- logging.info("Pull successfully")
- else:
- logging.info("Pull failed")
+ workspace_path = temp_path / "workspace"
+ workspace_path.mkdir(parents=True, exist_ok=True)
run_command = get_run_command(build_url, workspace_path, docker_image)
logging.info("Going to run %s", run_command)
- run_log_path = os.path.join(workspace_path, "run.log")
- with open(run_log_path, "w", encoding="utf-8") as log:
- with subprocess.Popen(
- run_command, shell=True, stderr=log, stdout=log
- ) as process:
- retcode = process.wait()
- if retcode == 0:
- logging.info("Run successfully")
- else:
- logging.info("Run failed")
+ run_log_path = workspace_path / "run.log"
+ with TeePopen(run_command, run_log_path) as process:
+ retcode = process.wait()
+ if retcode == 0:
+ logging.info("Run successfully")
+ else:
+ logging.info("Run failed")
subprocess.check_call(f"sudo chown -R ubuntu:ubuntu {temp_path}", shell=True)
@@ -135,16 +108,12 @@ def main():
paths = [
run_log_path,
- pull_log_path,
- os.path.join(workspace_path, "clickhouse-server.log"),
- os.path.join(workspace_path, "stderr.log"),
- os.path.join(workspace_path, "stdout.log"),
+ workspace_path / "clickhouse-server.log",
+ workspace_path / "stderr.log",
+ workspace_path / "stdout.log",
]
- for t in tests:
- err_name = f"{t}.err"
- log_name = f"{t}.out"
- paths.append(os.path.join(workspace_path, err_name))
- paths.append(os.path.join(workspace_path, log_name))
+ paths += [workspace_path / f"{t}.err" for t in tests]
+ paths += [workspace_path / f"{t}.out" for t in tests]
s3_helper = S3Helper()
report_url = GITHUB_RUN_URL
@@ -153,22 +122,15 @@ def main():
test_results = [] # type: TestResults
# Try to get status message saved by the SQLancer
try:
- with open(
- os.path.join(workspace_path, "status.txt"), "r", encoding="utf-8"
- ) as status_f:
+ with open(workspace_path / "status.txt", "r", encoding="utf-8") as status_f:
status = status_f.readline().rstrip("\n")
- if os.path.exists(os.path.join(workspace_path, "server_crashed.log")):
+ if (workspace_path / "server_crashed.log").exists():
test_results.append(TestResult("Server crashed", "FAIL"))
- with open(
- os.path.join(workspace_path, "summary.tsv"), "r", encoding="utf-8"
- ) as summary_f:
+ with open(workspace_path / "summary.tsv", "r", encoding="utf-8") as summary_f:
for line in summary_f:
l = line.rstrip("\n").split("\t")
test_results.append(TestResult(l[0], l[1]))
-
- with open(
- os.path.join(workspace_path, "description.txt"), "r", encoding="utf-8"
- ) as desc_f:
+ with open(workspace_path / "description.txt", "r", encoding="utf-8") as desc_f:
description = desc_f.readline().rstrip("\n")
except:
status = "failure"
diff --git a/tests/ci/sqllogic_test.py b/tests/ci/sqllogic_test.py
index 942c9c60ee8..7650a4afa40 100755
--- a/tests/ci/sqllogic_test.py
+++ b/tests/ci/sqllogic_test.py
@@ -7,26 +7,26 @@ import os
import subprocess
import sys
from pathlib import Path
+from typing import List, Tuple
from github import Github
-from env_helper import TEMP_PATH, REPO_COPY, REPORTS_PATH
-from s3_helper import S3Helper
-from get_robot_token import get_best_robot_token
-from pr_info import FORCE_TESTS_LABEL, PRInfo
from build_download_helper import download_all_deb_packages
-from upload_result_helper import upload_results
-from docker_pull_helper import get_image_with_version
from commit_status_helper import (
RerunHelper,
get_commit,
override_status,
post_commit_status,
)
-from report import TestResults, read_test_results
-
+from docker_pull_helper import get_image_with_version, DockerImage
+from env_helper import TEMP_PATH, REPO_COPY, REPORTS_PATH
+from get_robot_token import get_best_robot_token
+from pr_info import PRInfo
+from report import OK, FAIL, ERROR, SUCCESS, TestResults, TestResult, read_test_results
+from s3_helper import S3Helper
from stopwatch import Stopwatch
from tee_popen import TeePopen
+from upload_result_helper import upload_results
NO_CHANGES_MSG = "Nothing to run"
@@ -34,43 +34,26 @@ IMAGE_NAME = "clickhouse/sqllogic-test"
def get_run_command(
- builds_path,
- repo_tests_path,
- result_path,
- server_log_path,
- kill_timeout,
- additional_envs,
- image,
-):
- envs = [
- f"-e MAX_RUN_TIME={int(0.9 * kill_timeout)}",
- ]
- envs += [f"-e {e}" for e in additional_envs]
-
- env_str = " ".join(envs)
-
+ builds_path: Path,
+ repo_tests_path: Path,
+ result_path: Path,
+ server_log_path: Path,
+ image: DockerImage,
+) -> str:
return (
f"docker run "
f"--volume={builds_path}:/package_folder "
f"--volume={repo_tests_path}:/clickhouse-tests "
f"--volume={result_path}:/test_output "
f"--volume={server_log_path}:/var/log/clickhouse-server "
- f"--cap-add=SYS_PTRACE {env_str} {image}"
+ f"--cap-add=SYS_PTRACE {image}"
)
-def __files_in_dir(dir_path):
- return [
- os.path.join(dir_path, f)
- for f in os.listdir(dir_path)
- if os.path.isfile(os.path.join(dir_path, f))
- ]
-
-
-def read_check_status(result_folder):
- status_path = os.path.join(result_folder, "check_status.tsv")
- if not os.path.exists(status_path):
- return "error", "Not found check_status.tsv"
+def read_check_status(result_folder: Path) -> Tuple[str, str]:
+ status_path = result_folder / "check_status.tsv"
+ if not status_path.exists():
+ return ERROR, "Not found check_status.tsv"
logging.info("Found check_status.tsv")
with open(status_path, "r", encoding="utf-8") as status_file:
@@ -78,32 +61,32 @@ def read_check_status(result_folder):
for row in status_rows:
if len(row) != 2:
- return "error", "Invalid check_status.tsv"
- if row[0] != "success":
+ return ERROR, "Invalid check_status.tsv"
+ if row[0] != SUCCESS:
return row[0], row[1]
return status_rows[-1][0], status_rows[-1][1]
-def parse_args():
+def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("check_name")
parser.add_argument("kill_timeout", type=int)
return parser.parse_args()
-if __name__ == "__main__":
+def main():
logging.basicConfig(level=logging.INFO)
stopwatch = Stopwatch()
- temp_path = TEMP_PATH
- repo_path = REPO_COPY
- reports_path = REPORTS_PATH
+ temp_path = Path(TEMP_PATH)
+ temp_path.mkdir(parents=True, exist_ok=True)
+ repo_path = Path(REPO_COPY)
+ reports_path = Path(REPORTS_PATH)
args = parse_args()
check_name = args.check_name
- kill_timeout = args.kill_timeout
pr_info = PRInfo()
gh = Github(get_best_robot_token(), per_page=100)
@@ -114,43 +97,33 @@ if __name__ == "__main__":
logging.info("Check is already finished according to github status, exiting")
sys.exit(0)
- if not os.path.exists(temp_path):
- os.makedirs(temp_path)
-
docker_image = get_image_with_version(reports_path, IMAGE_NAME)
- repo_tests_path = os.path.join(repo_path, "tests")
+ repo_tests_path = repo_path / "tests"
- packages_path = os.path.join(temp_path, "packages")
- if not os.path.exists(packages_path):
- os.makedirs(packages_path)
+ packages_path = temp_path / "packages"
+ packages_path.mkdir(parents=True, exist_ok=True)
download_all_deb_packages(check_name, reports_path, packages_path)
- server_log_path = os.path.join(temp_path, "server_log")
- if not os.path.exists(server_log_path):
- os.makedirs(server_log_path)
+ server_log_path = temp_path / "server_log"
+ server_log_path.mkdir(parents=True, exist_ok=True)
- result_path = os.path.join(temp_path, "result_path")
- if not os.path.exists(result_path):
- os.makedirs(result_path)
+ result_path = temp_path / "result_path"
+ result_path.mkdir(parents=True, exist_ok=True)
- run_log_path = os.path.join(result_path, "runlog.log")
-
- additional_envs = [] # type: ignore
+ run_log_path = result_path / "runlog.log"
run_command = get_run_command( # run script inside docker
packages_path,
repo_tests_path,
result_path,
server_log_path,
- kill_timeout,
- additional_envs,
docker_image,
)
logging.info("Going to run func tests: %s", run_command)
- with TeePopen(run_command, run_log_path) as process:
+ with TeePopen(run_command, run_log_path, timeout=args.kill_timeout) as process:
retcode = process.wait()
if retcode == 0:
logging.info("Run successfully")
@@ -166,12 +139,12 @@ if __name__ == "__main__":
status = None
description = None
- additional_logs = []
- if os.path.exists(result_path):
- additional_logs.extend(__files_in_dir(result_path))
+ additional_logs = [run_log_path]
+ if result_path.exists():
+ additional_logs.extend(p for p in result_path.iterdir() if p.is_file())
- if os.path.exists(server_log_path):
- additional_logs.extend(__files_in_dir(server_log_path))
+ if server_log_path.exists():
+ additional_logs.extend(p for p in server_log_path.iterdir() if p.is_file())
status, description = read_check_status(result_path)
@@ -181,21 +154,28 @@ if __name__ == "__main__":
logging.info("Found test_results.tsv")
test_results = read_test_results(test_results_path)
- if len(test_results) > 1000:
+ if len(test_results) > 3000:
test_results = test_results[:1000]
if len(test_results) == 0:
- status, description = "error", "Empty test_results.tsv"
+ status, description = ERROR, "Empty test_results.tsv"
assert status is not None
status = override_status(status, check_name)
+ test_results.append(
+ TestResult(
+ "All tests",
+ OK if status == SUCCESS else FAIL,
+ stopwatch.duration_seconds,
+ )
+ )
report_url = upload_results(
s3_helper,
pr_info.number,
pr_info.sha,
test_results,
- [run_log_path] + additional_logs,
+ additional_logs,
check_name,
)
@@ -208,10 +188,10 @@ if __name__ == "__main__":
# Until it pass all tests, do not block CI, report "success"
assert description is not None
- post_commit_status(commit, "success", report_url, description, check_name, pr_info)
+ # FIXME: force SUCCESS until all cases are fixed
+ status = SUCCESS
+ post_commit_status(commit, status, report_url, description, check_name, pr_info)
- if status != "success":
- if FORCE_TESTS_LABEL in pr_info.labels:
- print(f"'{FORCE_TESTS_LABEL}' enabled, will report success")
- else:
- sys.exit(1)
+
+if __name__ == "__main__":
+ main()
diff --git a/tests/ci/stress.py b/tests/ci/stress.py
index 2c566144f2c..8cc40839706 100755
--- a/tests/ci/stress.py
+++ b/tests/ci/stress.py
@@ -1,31 +1,31 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
+"""This script is used in docker images for stress tests and upgrade tests"""
from multiprocessing import cpu_count
+from pathlib import Path
from subprocess import Popen, call, check_output, STDOUT, PIPE
-import os
+from typing import List
import argparse
import logging
-import time
import random
+import time
-def get_options(i, upgrade_check):
+def get_options(i: int, upgrade_check: bool) -> str:
options = []
client_options = []
if i > 0:
options.append("--order=random")
if i % 3 == 2 and not upgrade_check:
- options.append(
- '''--db-engine="Replicated('/test/db/test_{}', 's1', 'r1')"'''.format(i)
- )
+ options.append(f'''--db-engine="Replicated('/test/db/test_{i}', 's1', 'r1')"''')
client_options.append("allow_experimental_database_replicated=1")
client_options.append("enable_deflate_qpl_codec=1")
# If database name is not specified, new database is created for each functional test.
# Run some threads with one database for all tests.
if i % 2 == 1:
- options.append(" --database=test_{}".format(i))
+ options.append(f" --database=test_{i}")
if i % 3 == 1:
client_options.append("join_use_nulls=1")
@@ -59,6 +59,12 @@ def get_options(i, upgrade_check):
client_options.append("implicit_transaction=1")
client_options.append("throw_on_unsupported_query_inside_transaction=0")
+ if random.random() < 0.1:
+ client_options.append("allow_experimental_partial_result=1")
+ client_options.append(
+ f"partial_result_update_duration_ms={random.randint(10, 1000)}"
+ )
+
if client_options:
options.append(" --client-option " + " ".join(client_options))
@@ -66,45 +72,43 @@ def get_options(i, upgrade_check):
def run_func_test(
- cmd,
- output_prefix,
- num_processes,
- skip_tests_option,
- global_time_limit,
- upgrade_check,
-):
+ cmd: str,
+ output_prefix: Path,
+ num_processes: int,
+ skip_tests_option: str,
+ global_time_limit: int,
+ upgrade_check: bool,
+) -> List[Popen]:
upgrade_check_option = "--upgrade-check" if upgrade_check else ""
- global_time_limit_option = ""
- if global_time_limit:
- global_time_limit_option = "--global_time_limit={}".format(global_time_limit)
+ global_time_limit_option = (
+ f"--global_time_limit={global_time_limit}" if global_time_limit else ""
+ )
output_paths = [
- os.path.join(output_prefix, "stress_test_run_{}.txt".format(i))
- for i in range(num_processes)
+ output_prefix / f"stress_test_run_{i}.txt" for i in range(num_processes)
]
pipes = []
for i, path in enumerate(output_paths):
- f = open(path, "w")
- full_command = "{} {} {} {} {}".format(
- cmd,
- get_options(i, upgrade_check),
- global_time_limit_option,
- skip_tests_option,
- upgrade_check_option,
- )
- logging.info("Run func tests '%s'", full_command)
- p = Popen(full_command, shell=True, stdout=f, stderr=f)
- pipes.append(p)
- time.sleep(0.5)
+ with open(path, "w") as op:
+ full_command = (
+ f"{cmd} {get_options(i, upgrade_check)} {global_time_limit_option} "
+ f"{skip_tests_option} {upgrade_check_option}"
+ )
+ logging.info("Run func tests '%s'", full_command)
+ pipes.append(Popen(full_command, shell=True, stdout=op, stderr=op))
+ time.sleep(0.5)
return pipes
-def compress_stress_logs(output_path, files_prefix):
- cmd = f"cd {output_path} && tar --zstd --create --file=stress_run_logs.tar.zst {files_prefix}* && rm {files_prefix}*"
+def compress_stress_logs(output_path: Path, files_prefix: str) -> None:
+ cmd = (
+ f"cd {output_path} && tar --zstd --create --file=stress_run_logs.tar.zst "
+ f"{files_prefix}* && rm {files_prefix}*"
+ )
check_output(cmd, shell=True)
-def call_with_retry(query, timeout=30, retry_count=5):
+def call_with_retry(query: str, timeout: int = 30, retry_count: int = 5) -> None:
for i in range(retry_count):
code = call(query, shell=True, stderr=STDOUT, timeout=timeout)
if code != 0:
@@ -113,11 +117,14 @@ def call_with_retry(query, timeout=30, retry_count=5):
break
-def make_query_command(query):
- return f"""clickhouse client -q "{query}" --max_untracked_memory=1Gi --memory_profiler_step=1Gi --max_memory_usage_for_user=0"""
+def make_query_command(query: str) -> str:
+ return (
+ f'clickhouse client -q "{query}" --max_untracked_memory=1Gi '
+ "--memory_profiler_step=1Gi --max_memory_usage_for_user=0"
+ )
-def prepare_for_hung_check(drop_databases):
+def prepare_for_hung_check(drop_databases: bool) -> bool:
# FIXME this function should not exist, but...
# We attach gdb to clickhouse-server before running tests
@@ -149,28 +156,33 @@ def prepare_for_hung_check(drop_databases):
call_with_retry(make_query_command("KILL QUERY WHERE upper(query) LIKE 'WATCH %'"))
# Kill other queries which known to be slow
- # It's query from 01232_preparing_sets_race_condition_long, it may take up to 1000 seconds in slow builds
+ # It's query from 01232_preparing_sets_race_condition_long,
+ # it may take up to 1000 seconds in slow builds
call_with_retry(
make_query_command("KILL QUERY WHERE query LIKE 'insert into tableB select %'")
)
# Long query from 00084_external_agregation
call_with_retry(
make_query_command(
- "KILL QUERY WHERE query LIKE 'SELECT URL, uniq(SearchPhrase) AS u FROM test.hits GROUP BY URL ORDER BY u %'"
+ "KILL QUERY WHERE query LIKE 'SELECT URL, uniq(SearchPhrase) AS u FROM "
+ "test.hits GROUP BY URL ORDER BY u %'"
)
)
# Long query from 02136_kill_scalar_queries
call_with_retry(
make_query_command(
- "KILL QUERY WHERE query LIKE 'SELECT (SELECT number FROM system.numbers WHERE number = 1000000000000)%'"
+ "KILL QUERY WHERE query LIKE "
+ "'SELECT (SELECT number FROM system.numbers WHERE number = 1000000000000)%'"
)
)
if drop_databases:
for i in range(5):
try:
- # Here we try to drop all databases in async mode. If some queries really hung, than drop will hung too.
- # Otherwise we will get rid of queries which wait for background pool. It can take a long time on slow builds (more than 900 seconds).
+ # Here we try to drop all databases in async mode.
+ # If some queries really hung, than drop will hung too.
+ # Otherwise we will get rid of queries which wait for background pool.
+ # It can take a long time on slow builds (more than 900 seconds).
#
# Also specify max_untracked_memory to allow 1GiB of memory to overcommit.
databases = (
@@ -195,7 +207,8 @@ def prepare_for_hung_check(drop_databases):
time.sleep(i)
else:
raise Exception(
- "Cannot drop databases after stress tests. Probably server consumed too much memory and cannot execute simple queries"
+ "Cannot drop databases after stress tests. Probably server consumed "
+ "too much memory and cannot execute simple queries"
)
# Wait for last queries to finish if any, not longer than 300 seconds
@@ -220,7 +233,7 @@ def prepare_for_hung_check(drop_databases):
# Even if all clickhouse-test processes are finished, there are probably some sh scripts,
# which still run some new queries. Let's ignore them.
try:
- query = """clickhouse client -q "SELECT count() FROM system.processes where elapsed > 300" """
+ query = 'clickhouse client -q "SELECT count() FROM system.processes where elapsed > 300" '
output = (
check_output(query, shell=True, stderr=STDOUT, timeout=30)
.decode("utf-8")
@@ -233,9 +246,12 @@ def prepare_for_hung_check(drop_databases):
return True
-def is_ubsan_build():
+def is_ubsan_build() -> bool:
try:
- query = """clickhouse client -q "SELECT value FROM system.build_options WHERE name = 'CXX_FLAGS'" """
+ query = (
+ 'clickhouse client -q "SELECT value FROM system.build_options '
+ "WHERE name = 'CXX_FLAGS'\" "
+ )
output = (
check_output(query, shell=True, stderr=STDOUT, timeout=30)
.decode("utf-8")
@@ -247,27 +263,34 @@ def is_ubsan_build():
return False
-if __name__ == "__main__":
- logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s")
+def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="ClickHouse script for running stresstest"
)
parser.add_argument("--test-cmd", default="/usr/bin/clickhouse-test")
parser.add_argument("--skip-func-tests", default="")
- parser.add_argument("--server-log-folder", default="/var/log/clickhouse-server")
- parser.add_argument("--output-folder")
+ parser.add_argument(
+ "--server-log-folder", default="/var/log/clickhouse-server", type=Path
+ )
+ parser.add_argument("--output-folder", type=Path)
parser.add_argument("--global-time-limit", type=int, default=1800)
parser.add_argument("--num-parallel", type=int, default=cpu_count())
parser.add_argument("--upgrade-check", action="store_true")
parser.add_argument("--hung-check", action="store_true", default=False)
# make sense only for hung check
parser.add_argument("--drop-databases", action="store_true", default=False)
+ return parser.parse_args()
+
+
+def main():
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s")
+ args = parse_args()
- args = parser.parse_args()
if args.drop_databases and not args.hung_check:
raise Exception("--drop-databases only used in hung check (--hung-check)")
- # FIXME Hung check with ubsan is temporarily disabled due to https://github.com/ClickHouse/ClickHouse/issues/45372
+ # FIXME Hung check with ubsan is temporarily disabled due to
+ # https://github.com/ClickHouse/ClickHouse/issues/45372
suppress_hung_check = is_ubsan_build()
func_pipes = []
@@ -329,7 +352,7 @@ if __name__ == "__main__":
"00001_select_1",
]
)
- hung_check_log = os.path.join(args.output_folder, "hung_check.log")
+ hung_check_log = args.output_folder / "hung_check.log" # type: Path
tee = Popen(["/usr/bin/tee", hung_check_log], stdin=PIPE)
res = call(cmd, shell=True, stdout=tee.stdin, stderr=STDOUT)
if tee.stdin is not None:
@@ -338,10 +361,12 @@ if __name__ == "__main__":
logging.info("Hung check failed with exit code %d", res)
else:
hung_check_status = "No queries hung\tOK\t\\N\t\n"
- with open(
- os.path.join(args.output_folder, "test_results.tsv"), "w+"
- ) as results:
+ with open(args.output_folder / "test_results.tsv", "w+") as results:
results.write(hung_check_status)
- os.remove(hung_check_log)
+ hung_check_log.unlink()
logging.info("Stress test finished")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tests/ci/stress_check.py b/tests/ci/stress_check.py
index 4d21791c904..b147b12f8ac 100644
--- a/tests/ci/stress_check.py
+++ b/tests/ci/stress_check.py
@@ -3,7 +3,6 @@
import csv
import logging
import subprocess
-import os
import sys
from pathlib import Path
from typing import List, Tuple
@@ -34,10 +33,10 @@ from upload_result_helper import upload_results
def get_run_command(
- build_path: str,
- result_path: str,
- repo_tests_path: str,
- server_log_path: str,
+ build_path: Path,
+ result_path: Path,
+ repo_tests_path: Path,
+ server_log_path: Path,
ci_logs_args: str,
image: DockerImage,
) -> str:
@@ -58,35 +57,25 @@ def get_run_command(
def process_results(
- result_folder: str, server_log_path: str, run_log_path: str
-) -> Tuple[str, str, TestResults, List[str]]:
+ result_directory: Path, server_log_path: Path, run_log_path: Path
+) -> Tuple[str, str, TestResults, List[Path]]:
test_results = [] # type: TestResults
additional_files = []
# Just upload all files from result_folder.
# If task provides processed results, then it's responsible for content
# of result_folder.
- if os.path.exists(result_folder):
- test_files = [
- f
- for f in os.listdir(result_folder)
- if os.path.isfile(os.path.join(result_folder, f))
- ]
- additional_files = [os.path.join(result_folder, f) for f in test_files]
+ if result_directory.exists():
+ additional_files = [p for p in result_directory.iterdir() if p.is_file()]
- if os.path.exists(server_log_path):
- server_log_files = [
- f
- for f in os.listdir(server_log_path)
- if os.path.isfile(os.path.join(server_log_path, f))
- ]
+ if server_log_path.exists():
additional_files = additional_files + [
- os.path.join(server_log_path, f) for f in server_log_files
+ p for p in server_log_path.iterdir() if p.is_file()
]
additional_files.append(run_log_path)
- status_path = os.path.join(result_folder, "check_status.tsv")
- if not os.path.exists(status_path):
+ status_path = result_directory / "check_status.tsv"
+ if not status_path.exists():
return (
"failure",
"check_status.tsv doesn't exists",
@@ -103,7 +92,7 @@ def process_results(
state, description = status[0][0], status[0][1]
try:
- results_path = Path(result_folder) / "test_results.tsv"
+ results_path = result_directory / "test_results.tsv"
test_results = read_test_results(results_path, True)
if len(test_results) == 0:
raise Exception("Empty results")
@@ -118,20 +107,18 @@ def process_results(
return state, description, test_results, additional_files
-def run_stress_test(docker_image_name):
+def run_stress_test(docker_image_name: str) -> None:
logging.basicConfig(level=logging.INFO)
stopwatch = Stopwatch()
- temp_path = TEMP_PATH
- repo_path = REPO_COPY
- repo_tests_path = os.path.join(repo_path, "tests")
- reports_path = REPORTS_PATH
+ temp_path = Path(TEMP_PATH)
+ temp_path.mkdir(parents=True, exist_ok=True)
+ repo_path = Path(REPO_COPY)
+ repo_tests_path = repo_path / "tests"
+ reports_path = Path(REPORTS_PATH)
check_name = sys.argv[1]
- if not os.path.exists(temp_path):
- os.makedirs(temp_path)
-
pr_info = PRInfo()
gh = Github(get_best_robot_token(), per_page=100)
@@ -144,22 +131,19 @@ def run_stress_test(docker_image_name):
docker_image = get_image_with_version(reports_path, docker_image_name)
- packages_path = os.path.join(temp_path, "packages")
- if not os.path.exists(packages_path):
- os.makedirs(packages_path)
+ packages_path = temp_path / "packages"
+ packages_path.mkdir(parents=True, exist_ok=True)
download_all_deb_packages(check_name, reports_path, packages_path)
- server_log_path = os.path.join(temp_path, "server_log")
- if not os.path.exists(server_log_path):
- os.makedirs(server_log_path)
+ server_log_path = temp_path / "server_log"
+ server_log_path.mkdir(parents=True, exist_ok=True)
- result_path = os.path.join(temp_path, "result_path")
- if not os.path.exists(result_path):
- os.makedirs(result_path)
+ result_path = temp_path / "result_path"
+ result_path.mkdir(parents=True, exist_ok=True)
- run_log_path = os.path.join(temp_path, "run.log")
- ci_logs_credentials = CiLogsCredentials(Path(temp_path) / "export-logs-config.sh")
+ run_log_path = temp_path / "run.log"
+ ci_logs_credentials = CiLogsCredentials(temp_path / "export-logs-config.sh")
ci_logs_args = ci_logs_credentials.get_docker_arguments(
pr_info, stopwatch.start_time_str, check_name
)
@@ -187,7 +171,7 @@ def run_stress_test(docker_image_name):
logging.info("Run failed")
subprocess.check_call(f"sudo chown -R ubuntu:ubuntu {temp_path}", shell=True)
- ci_logs_credentials.clean_ci_logs_from_credentials(Path(run_log_path))
+ ci_logs_credentials.clean_ci_logs_from_credentials(run_log_path)
s3_helper = S3Helper()
state, description, test_results, additional_logs = process_results(
diff --git a/tests/ci/style_check.py b/tests/ci/style_check.py
index 0871dd7ec6a..83dc54a57b8 100644
--- a/tests/ci/style_check.py
+++ b/tests/ci/style_check.py
@@ -21,7 +21,7 @@ from commit_status_helper import (
update_mergeable_check,
)
from docker_pull_helper import get_image_with_version
-from env_helper import GITHUB_WORKSPACE, RUNNER_TEMP
+from env_helper import GITHUB_WORKSPACE, TEMP_PATH
from get_robot_token import get_best_robot_token
from github_helper import GitHub
from git_helper import git_runner
@@ -43,34 +43,29 @@ GIT_PREFIX = ( # All commits to remote are done as robot-clickhouse
def process_result(
- result_folder: str,
-) -> Tuple[str, str, TestResults, List[str]]:
+ result_directory: Path,
+) -> Tuple[str, str, TestResults, List[Path]]:
test_results = [] # type: TestResults
additional_files = []
- # Just upload all files from result_folder.
+ # Just upload all files from result_directory.
# If task provides processed results, then it's responsible
- # for content of result_folder.
- if os.path.exists(result_folder):
- test_files = [
- f
- for f in os.listdir(result_folder)
- if os.path.isfile(os.path.join(result_folder, f))
- ]
- additional_files = [os.path.join(result_folder, f) for f in test_files]
+ # for content of result_directory.
+ if result_directory.exists():
+ additional_files = [p for p in result_directory.iterdir() if p.is_file()]
status = []
- status_path = os.path.join(result_folder, "check_status.tsv")
- if os.path.exists(status_path):
+ status_path = result_directory / "check_status.tsv"
+ if status_path.exists():
logging.info("Found check_status.tsv")
with open(status_path, "r", encoding="utf-8") as status_file:
status = list(csv.reader(status_file, delimiter="\t"))
if len(status) != 1 or len(status[0]) != 2:
- logging.info("Files in result folder %s", os.listdir(result_folder))
+ logging.info("Files in result folder %s", os.listdir(result_directory))
return "error", "Invalid check_status.tsv", test_results, additional_files
state, description = status[0][0], status[0][1]
try:
- results_path = Path(result_folder) / "test_results.tsv"
+ results_path = result_directory / "test_results.tsv"
test_results = read_test_results(results_path)
if len(test_results) == 0:
raise Exception("Empty results")
@@ -144,8 +139,9 @@ def main():
stopwatch = Stopwatch()
- repo_path = GITHUB_WORKSPACE
- temp_path = os.path.join(RUNNER_TEMP, "style_check")
+ repo_path = Path(GITHUB_WORKSPACE)
+ temp_path = Path(TEMP_PATH)
+ temp_path.mkdir(parents=True, exist_ok=True)
pr_info = PRInfo()
if args.push:
@@ -165,9 +161,6 @@ def main():
code = int(state != "success")
sys.exit(code)
- if not os.path.exists(temp_path):
- os.makedirs(temp_path)
-
docker_image = get_image_with_version(temp_path, "clickhouse/style-test")
s3_helper = S3Helper()
diff --git a/tests/ci/unit_tests_check.py b/tests/ci/unit_tests_check.py
index 1c3ee303b27..b9fdddfe74b 100644
--- a/tests/ci/unit_tests_check.py
+++ b/tests/ci/unit_tests_check.py
@@ -1,10 +1,12 @@
#!/usr/bin/env python3
+import json
import logging
import os
import sys
import subprocess
import atexit
+from pathlib import Path
from typing import List, Tuple
from github import Github
@@ -24,7 +26,7 @@ from docker_pull_helper import get_image_with_version
from env_helper import TEMP_PATH, REPORTS_PATH
from get_robot_token import get_best_robot_token
from pr_info import PRInfo
-from report import TestResults, TestResult
+from report import ERROR, FAILURE, FAIL, OK, SUCCESS, TestResults, TestResult
from s3_helper import S3Helper
from stopwatch import Stopwatch
from tee_popen import TeePopen
@@ -43,67 +45,128 @@ def get_test_name(line):
def process_results(
- result_folder: str,
-) -> Tuple[str, str, TestResults, List[str]]:
- OK_SIGN = "OK ]"
- FAILED_SIGN = "FAILED ]"
- SEGFAULT = "Segmentation fault"
- SIGNAL = "received signal SIG"
- PASSED = "PASSED"
+ result_directory: Path,
+) -> Tuple[str, str, TestResults]:
+ """The json is described by the next proto3 scheme:
+ (It's wrong, but that's a copy/paste from
+ https://google.github.io/googletest/advanced.html#generating-a-json-report)
+
+ syntax = "proto3";
+
+ package googletest;
+
+ import "google/protobuf/timestamp.proto";
+ import "google/protobuf/duration.proto";
+
+ message UnitTest {
+ int32 tests = 1;
+ int32 failures = 2;
+ int32 disabled = 3;
+ int32 errors = 4;
+ google.protobuf.Timestamp timestamp = 5;
+ google.protobuf.Duration time = 6;
+ string name = 7;
+ repeated TestCase testsuites = 8;
+ }
+
+ message TestCase {
+ string name = 1;
+ int32 tests = 2;
+ int32 failures = 3;
+ int32 disabled = 4;
+ int32 errors = 5;
+ google.protobuf.Duration time = 6;
+ repeated TestInfo testsuite = 7;
+ }
+
+ message TestInfo {
+ string name = 1;
+ string file = 6;
+ int32 line = 7;
+ enum Status {
+ RUN = 0;
+ NOTRUN = 1;
+ }
+ Status status = 2;
+ google.protobuf.Duration time = 3;
+ string classname = 4;
+ message Failure {
+ string failures = 1;
+ string type = 2;
+ }
+ repeated Failure failures = 5;
+ }"""
test_results = [] # type: TestResults
- total_counter = 0
- failed_counter = 0
- result_log_path = f"{result_folder}/test_result.txt"
- if not os.path.exists(result_log_path):
- logging.info("No output log on path %s", result_log_path)
- return "error", "No output log", test_results, []
+ report_path = result_directory / "test_result.json"
+ if not report_path.exists():
+ logging.info("No output log on path %s", report_path)
+ return ERROR, "No output log", test_results
+
+ with open(report_path, "r", encoding="utf-8") as j:
+ report = json.load(j)
+
+ total_counter = report["tests"]
+ failed_counter = report["failures"]
+ error_counter = report["errors"]
- status = "success"
description = ""
- passed = False
- with open(result_log_path, "r", encoding="utf-8") as test_result:
- for line in test_result:
- if OK_SIGN in line:
- logging.info("Found ok line: '%s'", line)
- test_name = get_test_name(line.strip())
- logging.info("Test name: '%s'", test_name)
- test_results.append(TestResult(test_name, "OK"))
- total_counter += 1
- elif FAILED_SIGN in line and "listed below" not in line and "ms)" in line:
- logging.info("Found fail line: '%s'", line)
- test_name = get_test_name(line.strip())
- logging.info("Test name: '%s'", test_name)
- test_results.append(TestResult(test_name, "FAIL"))
- total_counter += 1
- failed_counter += 1
- elif SEGFAULT in line:
- logging.info("Found segfault line: '%s'", line)
- status = "failure"
- description += "Segmentation fault. "
- break
- elif SIGNAL in line:
- logging.info("Received signal line: '%s'", line)
- status = "failure"
- description += "Exit on signal. "
- break
- elif PASSED in line:
- logging.info("PASSED record found: '%s'", line)
- passed = True
+ SEGFAULT = "Segmentation fault. "
+ SIGNAL = "Exit on signal. "
+ for suite in report["testsuites"]:
+ suite_name = suite["name"]
+ for test_case in suite["testsuite"]:
+ case_name = test_case["name"]
+ test_time = float(test_case["time"][:-1])
+ raw_logs = None
+ if "failures" in test_case:
+ raw_logs = ""
+ for failure in test_case["failures"]:
+ raw_logs += failure["failure"]
+ if (
+ "Segmentation fault" in raw_logs # type: ignore
+ and SEGFAULT not in description
+ ):
+ description += SEGFAULT
+ if (
+ "received signal SIG" in raw_logs # type: ignore
+ and SIGNAL not in description
+ ):
+ description += SIGNAL
+ if test_case["status"] == "NOTRUN":
+ test_status = "SKIPPED"
+ elif raw_logs is None:
+ test_status = OK
+ else:
+ test_status = FAIL
- if not passed:
- status = "failure"
- description += "PASSED record not found. "
+ test_results.append(
+ TestResult(
+ f"{suite_name}.{case_name}",
+ test_status,
+ test_time,
+ raw_logs=raw_logs,
+ )
+ )
- if failed_counter != 0:
- status = "failure"
+ check_status = SUCCESS
+ tests_status = OK
+ tests_time = float(report["time"][:-1])
+ if failed_counter:
+ check_status = FAILURE
+ test_status = FAIL
+ if error_counter:
+ check_status = ERROR
+ test_status = ERROR
+ test_results.append(TestResult(report["name"], tests_status, tests_time))
if not description:
description += (
- f"fail: {failed_counter}, passed: {total_counter - failed_counter}"
+ f"fail: {failed_counter + error_counter}, "
+ f"passed: {total_counter - failed_counter - error_counter}"
)
- return status, description, test_results, [result_log_path]
+ return check_status, description, test_results
def main():
@@ -113,8 +176,8 @@ def main():
check_name = sys.argv[1]
- if not os.path.exists(TEMP_PATH):
- os.makedirs(TEMP_PATH)
+ temp_path = Path(TEMP_PATH)
+ temp_path.mkdir(parents=True, exist_ok=True)
pr_info = PRInfo()
@@ -132,16 +195,18 @@ def main():
download_unit_tests(check_name, REPORTS_PATH, TEMP_PATH)
- tests_binary_path = os.path.join(TEMP_PATH, "unit_tests_dbms")
- os.chmod(tests_binary_path, 0o777)
+ tests_binary = temp_path / "unit_tests_dbms"
+ os.chmod(tests_binary, 0o777)
- test_output = os.path.join(TEMP_PATH, "test_output")
- if not os.path.exists(test_output):
- os.makedirs(test_output)
+ test_output = temp_path / "test_output"
+ test_output.mkdir(parents=True, exist_ok=True)
- run_command = f"docker run --cap-add=SYS_PTRACE --volume={tests_binary_path}:/unit_tests_dbms --volume={test_output}:/test_output {docker_image}"
+ run_command = (
+ f"docker run --cap-add=SYS_PTRACE --volume={tests_binary}:/unit_tests_dbms "
+ f"--volume={test_output}:/test_output {docker_image}"
+ )
- run_log_path = os.path.join(test_output, "run.log")
+ run_log_path = test_output / "run.log"
logging.info("Going to run func tests: %s", run_command)
@@ -155,7 +220,7 @@ def main():
subprocess.check_call(f"sudo chown -R ubuntu:ubuntu {TEMP_PATH}", shell=True)
s3_helper = S3Helper()
- state, description, test_results, additional_logs = process_results(test_output)
+ state, description, test_results = process_results(test_output)
ch_helper = ClickHouseHelper()
@@ -164,7 +229,7 @@ def main():
pr_info.number,
pr_info.sha,
test_results,
- [run_log_path] + additional_logs,
+ [run_log_path] + [p for p in test_output.iterdir() if not p.is_dir()],
check_name,
)
print(f"::notice ::Report url: {report_url}")
diff --git a/tests/ci/upload_result_helper.py b/tests/ci/upload_result_helper.py
index ef5f582dea5..bf52e6069dd 100644
--- a/tests/ci/upload_result_helper.py
+++ b/tests/ci/upload_result_helper.py
@@ -15,7 +15,7 @@ from s3_helper import S3Helper
def process_logs(
s3_client: S3Helper,
- additional_logs: List[str],
+ additional_logs: List[Path],
s3_path_prefix: str,
test_results: TestResults,
) -> List[str]:
@@ -41,10 +41,10 @@ def process_logs(
additional_urls = []
for log_path in additional_logs:
- if log_path:
+ if log_path.is_file():
additional_urls.append(
s3_client.upload_test_report_to_s3(
- Path(log_path), s3_path_prefix + "/" + os.path.basename(log_path)
+ log_path, s3_path_prefix + "/" + os.path.basename(log_path)
)
)
@@ -56,7 +56,7 @@ def upload_results(
pr_number: int,
commit_sha: str,
test_results: TestResults,
- additional_files: List[str],
+ additional_files: List[Path],
check_name: str,
additional_urls: Optional[List[str]] = None,
) -> str:
diff --git a/tests/clickhouse-test b/tests/clickhouse-test
index b9e2f4ddbe6..cab7d7e79ff 100755
--- a/tests/clickhouse-test
+++ b/tests/clickhouse-test
@@ -671,6 +671,8 @@ class MergeTreeSettingsRandomizer:
"compress_primary_key": lambda: random.randint(0, 1),
"marks_compress_block_size": lambda: random.randint(8000, 100000),
"primary_key_compress_block_size": lambda: random.randint(8000, 100000),
+ "replace_long_file_name_to_hash": lambda: random.randint(0, 1),
+ "max_file_name_length": threshold_generator(0.3, 0.3, 0, 128),
}
@staticmethod
diff --git a/tests/config/config.d/keeper_port.xml b/tests/config/config.d/keeper_port.xml
index beac507304f..1e646cd07a7 100644
--- a/tests/config/config.d/keeper_port.xml
+++ b/tests/config/config.d/keeper_port.xml
@@ -3,7 +3,7 @@
9181
1
- true
+ 1
10000
@@ -32,7 +32,10 @@
+ 1
+ 1
1
+ 1
diff --git a/tests/config/install.sh b/tests/config/install.sh
index b65f2cc8dd1..9e3b235515d 100755
--- a/tests/config/install.sh
+++ b/tests/config/install.sh
@@ -124,8 +124,8 @@ else
fi
# We randomize creating the snapshot on exit for Keeper to test out using older snapshots
-create_snapshot_on_exit=$(($RANDOM % 2))
-sed --follow-symlinks -i "s|true|$create_snapshot_on_exit|" $DEST_SERVER_PATH/config.d/keeper_port.xml
+value=$(($RANDOM % 2))
+sed --follow-symlinks -i "s|[01]|$value|" $DEST_SERVER_PATH/config.d/keeper_port.xml
if [[ -n "$USE_POLYMORPHIC_PARTS" ]] && [[ "$USE_POLYMORPHIC_PARTS" -eq 1 ]]; then
ln -sf $SRC_PATH/config.d/polymorphic_parts.xml $DEST_SERVER_PATH/config.d/
diff --git a/tests/integration/README.md b/tests/integration/README.md
index af973d2b9fa..e7ba37bfb56 100644
--- a/tests/integration/README.md
+++ b/tests/integration/README.md
@@ -46,7 +46,6 @@ sudo -H pip install \
hypothesis \
pyhdfs \
pika \
- meilisearch \
nats-py
```
diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py
index dfd964b04d2..932d3c073e3 100644
--- a/tests/integration/helpers/cluster.py
+++ b/tests/integration/helpers/cluster.py
@@ -31,7 +31,6 @@ try:
import pymysql
import nats
import ssl
- import meilisearch
import pyspark
from confluent_kafka.avro.cached_schema_registry_client import (
CachedSchemaRegistryClient,
@@ -432,7 +431,6 @@ class ClickHouseCluster:
self.with_kerberized_hdfs = False
self.with_mongo = False
self.with_mongo_secure = False
- self.with_meili = False
self.with_net_trics = False
self.with_redis = False
self.with_cassandra = False
@@ -510,12 +508,6 @@ class ClickHouseCluster:
self.mongo_no_cred_host = "mongo2"
self._mongo_no_cred_port = 0
- # available when with_meili == True
- self.meili_host = "meili1"
- self._meili_port = 0
- self.meili_secure_host = "meili_secure"
- self._meili_secure_port = 0
-
# available when with_cassandra == True
self.cassandra_host = "cassandra1"
self.cassandra_port = 9042
@@ -687,20 +679,6 @@ class ClickHouseCluster:
self._mongo_no_cred_port = get_free_port()
return self._mongo_no_cred_port
- @property
- def meili_port(self):
- if self._meili_port:
- return self._meili_port
- self._meili_port = get_free_port()
- return self._meili_port
-
- @property
- def meili_secure_port(self):
- if self._meili_secure_port:
- return self._meili_secure_port
- self._meili_secure_port = get_free_port()
- return self._meili_secure_port
-
@property
def redis_port(self):
if self._redis_port:
@@ -1363,30 +1341,6 @@ class ClickHouseCluster:
return self.base_coredns_cmd
- def setup_meili_cmd(self, instance, env_variables, docker_compose_yml_dir):
- self.with_meili = True
- env_variables["MEILI_HOST"] = self.meili_host
- env_variables["MEILI_EXTERNAL_PORT"] = str(self.meili_port)
- env_variables["MEILI_INTERNAL_PORT"] = "7700"
-
- env_variables["MEILI_SECURE_HOST"] = self.meili_secure_host
- env_variables["MEILI_SECURE_EXTERNAL_PORT"] = str(self.meili_secure_port)
- env_variables["MEILI_SECURE_INTERNAL_PORT"] = "7700"
-
- self.base_cmd.extend(
- ["--file", p.join(docker_compose_yml_dir, "docker_compose_meili.yml")]
- )
- self.base_meili_cmd = [
- "docker-compose",
- "--env-file",
- instance.env_file,
- "--project-name",
- self.project_name,
- "--file",
- p.join(docker_compose_yml_dir, "docker_compose_meili.yml"),
- ]
- return self.base_meili_cmd
-
def setup_minio_cmd(self, instance, env_variables, docker_compose_yml_dir):
self.with_minio = True
cert_d = p.join(self.minio_dir, "certs")
@@ -1524,7 +1478,6 @@ class ClickHouseCluster:
with_kerberized_hdfs=False,
with_mongo=False,
with_mongo_secure=False,
- with_meili=False,
with_nginx=False,
with_redis=False,
with_minio=False,
@@ -1623,7 +1576,6 @@ class ClickHouseCluster:
or with_kerberos_kdc
or with_kerberized_kafka,
with_mongo=with_mongo or with_mongo_secure,
- with_meili=with_meili,
with_redis=with_redis,
with_minio=with_minio,
with_azurite=with_azurite,
@@ -1815,11 +1767,6 @@ class ClickHouseCluster:
self.setup_coredns_cmd(instance, env_variables, docker_compose_yml_dir)
)
- if with_meili and not self.with_meili:
- cmds.append(
- self.setup_meili_cmd(instance, env_variables, docker_compose_yml_dir)
- )
-
if self.with_net_trics:
for cmd in cmds:
cmd.extend(
@@ -2415,30 +2362,6 @@ class ClickHouseCluster:
logging.debug("Can't connect to Mongo " + str(ex))
time.sleep(1)
- def wait_meili_to_start(self, timeout=30):
- connection_str = "http://{host}:{port}".format(
- host="localhost", port=self.meili_port
- )
- client = meilisearch.Client(connection_str)
-
- connection_str_secure = "http://{host}:{port}".format(
- host="localhost", port=self.meili_secure_port
- )
- client_secure = meilisearch.Client(connection_str_secure, "password")
-
- start = time.time()
- while time.time() - start < timeout:
- try:
- client.get_all_stats()
- client_secure.get_all_stats()
- logging.debug(
- f"Connected to MeiliSearch dbs: {client.get_all_stats()}\n{client_secure.get_all_stats()}"
- )
- return
- except Exception as ex:
- logging.debug("Can't connect to MeiliSearch " + str(ex))
- time.sleep(1)
-
def wait_minio_to_start(self, timeout=180, secure=False):
self.minio_ip = self.get_instance_ip(self.minio_host)
self.minio_redirect_ip = self.get_instance_ip(self.minio_redirect_host)
@@ -2836,12 +2759,6 @@ class ClickHouseCluster:
self.up_called = True
time.sleep(10)
- if self.with_meili and self.base_meili_cmd:
- logging.debug("Setup MeiliSearch")
- run_and_check(self.base_meili_cmd + common_opts)
- self.up_called = True
- self.wait_meili_to_start()
-
if self.with_redis and self.base_redis_cmd:
logging.debug("Setup Redis")
subprocess_check_call(self.base_redis_cmd + common_opts)
@@ -3163,7 +3080,6 @@ class ClickHouseInstance:
with_kerberized_hdfs,
with_secrets,
with_mongo,
- with_meili,
with_redis,
with_minio,
with_azurite,
@@ -3250,7 +3166,6 @@ class ClickHouseInstance:
self.with_kerberized_hdfs = with_kerberized_hdfs
self.with_secrets = with_secrets
self.with_mongo = with_mongo
- self.with_meili = with_meili
self.with_redis = with_redis
self.with_minio = with_minio
self.with_azurite = with_azurite
@@ -3918,7 +3833,11 @@ class ClickHouseInstance:
return None
def restart_with_original_version(
- self, stop_start_wait_sec=300, callback_onstop=None, signal=15
+ self,
+ stop_start_wait_sec=300,
+ callback_onstop=None,
+ signal=15,
+ clear_data_dir=False,
):
begin_time = time.time()
if not self.stay_alive:
@@ -3946,6 +3865,17 @@ class ClickHouseInstance:
if callback_onstop:
callback_onstop(self)
+
+ if clear_data_dir:
+ self.exec_in_container(
+ [
+ "bash",
+ "-c",
+ "rm -rf /var/lib/clickhouse/metadata && rm -rf /var/lib/clickhouse/data",
+ ],
+ user="root",
+ )
+
self.exec_in_container(
[
"bash",
diff --git a/tests/integration/runner b/tests/integration/runner
index 4c2b1054538..7be491a9a57 100755
--- a/tests/integration/runner
+++ b/tests/integration/runner
@@ -27,7 +27,7 @@ CONTAINER_NAME = f"{VOLUME_NAME}_{random_str()}"
CONFIG_DIR_IN_REPO = "programs/server"
INTEGRATION_DIR_IN_REPO = "tests/integration"
-SRC_DIR_IN_REPO = "src"
+UTILS_DIR_IN_REPO = "utils"
DIND_INTEGRATION_TESTS_IMAGE_NAME = "clickhouse/integration-tests-runner"
@@ -89,12 +89,16 @@ def check_args_and_update_paths(args):
)
logging.info("Cases dir is not set. Will use %s" % (args.cases_dir))
- if args.src_dir:
- if not os.path.isabs(args.src_dir):
- args.src_dir = os.path.abspath(os.path.join(CURRENT_WORK_DIR, args.src_dir))
+ if args.utils_dir:
+ if not os.path.isabs(args.utils_dir):
+ args.utils_dir = os.path.abspath(
+ os.path.join(CURRENT_WORK_DIR, args.utils_dir)
+ )
else:
- args.src_dir = os.path.abspath(os.path.join(CLICKHOUSE_ROOT, SRC_DIR_IN_REPO))
- logging.info("src dir is not set. Will use %s" % (args.src_dir))
+ args.utils_dir = os.path.abspath(
+ os.path.join(CLICKHOUSE_ROOT, UTILS_DIR_IN_REPO)
+ )
+ logging.info("utils dir is not set. Will use %s" % (args.utils_dir))
logging.info(
"base_configs_dir: {}, binary: {}, cases_dir: {} ".format(
@@ -115,7 +119,7 @@ def check_args_and_update_paths(args):
if args.dockerd_volume:
if not os.path.isabs(args.dockerd_volume):
- args.src_dir = os.path.abspath(
+ args.dockerd_volume = os.path.abspath(
os.path.join(CURRENT_WORK_DIR, args.dockerd_volume)
)
@@ -197,9 +201,9 @@ if __name__ == "__main__":
)
parser.add_argument(
- "--src-dir",
- default=os.environ.get("CLICKHOUSE_SRC_DIR"),
- help="Path to the 'src' directory in repository. Used to provide schemas (e.g. *.proto) for some tests when those schemas are located in the 'src' directory",
+ "--utils-dir",
+ default=os.environ.get("CLICKHOUSE_UTILS_DIR"),
+ help="Path to the 'utils' directory in repository. Used to provide Python modules for grpc protocol schemas which are located in the 'utils' directory",
)
parser.add_argument(
@@ -424,7 +428,7 @@ if __name__ == "__main__":
f"--volume={args.library_bridge_binary}:/clickhouse-library-bridge "
f"--volume={args.base_configs_dir}:/clickhouse-config "
f"--volume={args.cases_dir}:/ClickHouse/tests/integration "
- f"--volume={args.src_dir}/Server/grpc_protos:/ClickHouse/src/Server/grpc_protos "
+ f"--volume={args.utils_dir}/grpc-client/pb2:/ClickHouse/utils/grpc-client/pb2 "
f"--volume=/run:/run/host:ro {dockerd_internal_volume} {env_tags} {env_cleanup} "
f"-e DOCKER_CLIENT_TIMEOUT=300 -e COMPOSE_HTTP_TIMEOUT=600 {use_analyzer} -e PYTHONUNBUFFERED=1 "
f'-e PYTEST_ADDOPTS="{parallel_args} {pytest_opts} {tests_list} {rand_args} -vvv"'
diff --git a/tests/integration/test_backup_restore_s3/configs/s3_settings.xml b/tests/integration/test_backup_restore_s3/configs/s3_settings.xml
index 0c16cd9cd5a..981cf67bbe9 100644
--- a/tests/integration/test_backup_restore_s3/configs/s3_settings.xml
+++ b/tests/integration/test_backup_restore_s3/configs/s3_settings.xml
@@ -11,4 +11,6 @@
2
+ 1
+ 1
diff --git a/tests/integration/test_backward_compatibility/configs/wide_parts_only.xml b/tests/integration/test_backward_compatibility/configs/wide_parts_only.xml
index e9cf053f1c5..674ffff6c93 100644
--- a/tests/integration/test_backward_compatibility/configs/wide_parts_only.xml
+++ b/tests/integration/test_backward_compatibility/configs/wide_parts_only.xml
@@ -1,5 +1,6 @@
0
+ 0
diff --git a/tests/integration/test_backward_compatibility/test_aggregate_function_state.py b/tests/integration/test_backward_compatibility/test_aggregate_function_state.py
index 3a936239cc8..7789d13be0b 100644
--- a/tests/integration/test_backward_compatibility/test_aggregate_function_state.py
+++ b/tests/integration/test_backward_compatibility/test_aggregate_function_state.py
@@ -35,6 +35,12 @@ def start_cluster():
cluster.shutdown()
+@pytest.fixture(autouse=True)
+def cleanup():
+ yield
+ node1.restart_with_original_version(clear_data_dir=True)
+
+
# We will test that serialization of internal state of "avg" function is compatible between different versions.
# TODO Implement versioning of serialization format for aggregate function states.
# NOTE This test is too ad-hoc.
@@ -143,7 +149,7 @@ def test_backward_compatability_for_uniq_exact(start_cluster, uniq_keys):
== f"{uniq_keys}\n"
)
- node1.restart_with_latest_version()
+ node1.restart_with_latest_version(fix_metadata=True)
assert (
node1.query(f"SELECT uniqExactMerge(x) FROM state_{uniq_keys}")
@@ -216,7 +222,7 @@ def test_backward_compatability_for_uniq_exact_variadic(start_cluster, uniq_keys
== f"{uniq_keys}\n"
)
- node1.restart_with_latest_version()
+ node1.restart_with_latest_version(fix_metadata=True)
assert (
node1.query(f"SELECT uniqExactMerge(x) FROM state_{uniq_keys}")
diff --git a/tests/integration/test_backward_compatibility/test_functions.py b/tests/integration/test_backward_compatibility/test_functions.py
index 607ac74d725..94771a624e2 100644
--- a/tests/integration/test_backward_compatibility/test_functions.py
+++ b/tests/integration/test_backward_compatibility/test_functions.py
@@ -153,6 +153,8 @@ def test_string_functions(start_cluster):
# mandatory or optional). The former lib produces a value based on implicit padding, the latter lib throws an error.
"FROM_BASE64",
"base64Decode",
+ # Removed in 23.9
+ "meiliMatch",
]
functions = filter(lambda x: x not in excludes, functions)
diff --git a/tests/integration/test_broken_detached_part_clean_up/configs/store_cleanup.xml b/tests/integration/test_broken_detached_part_clean_up/configs/store_cleanup.xml
deleted file mode 100644
index 5fbe87cce00..00000000000
--- a/tests/integration/test_broken_detached_part_clean_up/configs/store_cleanup.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
- 0
- 60
- 1
-
-
-
- testkeeper
-
-
\ No newline at end of file
diff --git a/tests/integration/test_broken_detached_part_clean_up/test.py b/tests/integration/test_broken_detached_part_clean_up/test.py
deleted file mode 100644
index bdf993ddedf..00000000000
--- a/tests/integration/test_broken_detached_part_clean_up/test.py
+++ /dev/null
@@ -1,360 +0,0 @@
-import pytest
-
-from helpers.cluster import ClickHouseCluster
-from helpers.corrupt_part_data_on_disk import corrupt_part_data_on_disk
-from helpers.corrupt_part_data_on_disk import break_part
-import time
-
-cluster = ClickHouseCluster(__file__)
-
-node1 = cluster.add_instance(
- "node1", stay_alive=True, main_configs=["configs/store_cleanup.xml"]
-)
-
-path_to_data = "/var/lib/clickhouse/"
-
-
-@pytest.fixture(scope="module")
-def started_cluster():
- try:
- cluster.start()
- yield cluster
-
- finally:
- cluster.shutdown()
-
-
-def remove_broken_detached_part_impl(table, node, expect_broken_prefix):
- assert (
- node.query(
- f"SELECT COUNT() FROM system.parts WHERE table='{table}' AND active=1"
- )
- == "4\n"
- )
-
- path_to_detached = path_to_data + f"data/default/{table}/detached/"
-
- result = node.exec_in_container(["ls", path_to_detached])
- assert result.strip() == ""
-
- corrupt_part_data_on_disk(node, table, "all_3_3_0")
- break_part(node, table, "all_3_3_0")
- node.query(f"ALTER TABLE {table} DETACH PART 'all_1_1_0'")
- result = node.exec_in_container(["touch", f"{path_to_detached}trash"])
-
- node.exec_in_container(["mkdir", f"{path_to_detached}../broken_all_fake"])
- node.exec_in_container(
- ["touch", "-t", "1312031429.30", f"{path_to_detached}../broken_all_fake"]
- )
- result = node.exec_in_container(["stat", f"{path_to_detached}../broken_all_fake"])
- print(result)
- assert "Modify: 2013-12-03" in result
- node.exec_in_container(
- [
- "mv",
- f"{path_to_detached}../broken_all_fake",
- f"{path_to_detached}broken_all_fake",
- ]
- )
-
- for name in [
- "unexpected_all_42_1337_5",
- "deleting_all_123_456_7",
- "covered-by-broken_all_12_34_5",
- ]:
- node.exec_in_container(["mkdir", f"{path_to_detached}../{name}"])
- node.exec_in_container(
- [
- "touch",
- "-t",
- "1312031429.30",
- f"{path_to_detached}../{name}",
- ]
- )
- result = node.exec_in_container(["stat", f"{path_to_detached}../{name}"])
- print(result)
- assert "Modify: 2013-12-03" in result
- node.exec_in_container(
- [
- "mv",
- f"{path_to_detached}../{name}",
- f"{path_to_detached}{name}",
- ]
- )
-
- result = node.query(
- f"CHECK TABLE {table}", settings={"check_query_single_value_result": 0}
- )
- assert "all_3_3_0\t0" in result
-
- node.query(f"DETACH TABLE {table}")
- node.query(f"ATTACH TABLE {table}")
-
- node.wait_for_log_line(
- "Removing detached part deleting_all_123_456_7",
- timeout=90,
- look_behind_lines=1000000,
- )
- node.wait_for_log_line(
- f"Removed broken detached part {expect_broken_prefix}_all_3_3_0 due to a timeout",
- timeout=10,
- look_behind_lines=1000000,
- )
- node.wait_for_log_line(
- "Removed broken detached part unexpected_all_42_1337_5 due to a timeout",
- timeout=10,
- look_behind_lines=1000000,
- )
-
- result = node.exec_in_container(["ls", path_to_detached])
- print(result)
- assert f"{expect_broken_prefix}_all_3_3_0" not in result
- assert "all_1_1_0" in result
- assert "trash" in result
- assert "broken_all_fake" in result
- assert "covered-by-broken_all_12_34_5" in result
- assert "unexpected_all_42_1337_5" not in result
- assert "deleting_all_123_456_7" not in result
-
- node.query(
- f"ALTER TABLE {table} DROP DETACHED PART 'covered-by-broken_all_12_34_5'",
- settings={"allow_drop_detached": 1},
- )
- result = node.exec_in_container(["ls", path_to_detached])
- assert "covered-by-broken_all_12_34_5" not in result
-
- node.query(f"DROP TABLE {table} SYNC")
-
-
-def test_remove_broken_detached_part_merge_tree(started_cluster):
- node1.query(
- """
- CREATE TABLE
- mt(id UInt32, value Int32)
- ENGINE = MergeTree() ORDER BY id
- SETTINGS
- merge_tree_enable_clear_old_broken_detached=1,
- merge_tree_clear_old_broken_detached_parts_ttl_timeout_seconds=5;
- """
- )
-
- for i in range(4):
- node1.query(
- f"INSERT INTO mt SELECT number, number * number FROM numbers ({i * 100000}, 100000)"
- )
-
- remove_broken_detached_part_impl("mt", node1, "broken-on-start")
-
-
-def test_remove_broken_detached_part_replicated_merge_tree(started_cluster):
- node1.query(
- f"""
- CREATE TABLE
- replicated_mt(date Date, id UInt32, value Int32)
- ENGINE = ReplicatedMergeTree('/clickhouse/tables/replicated_mt', '{node1.name}') ORDER BY id
- SETTINGS
- merge_tree_enable_clear_old_broken_detached=1,
- merge_tree_clear_old_broken_detached_parts_ttl_timeout_seconds=5,
- cleanup_delay_period=1,
- cleanup_delay_period_random_add=0,
- cleanup_thread_preferred_points_per_iteration=0;
- """
- )
-
- for i in range(4):
- node1.query(
- f"INSERT INTO replicated_mt SELECT toDate('2019-10-01'), number, number * number FROM numbers ({i * 100000}, 100000)"
- )
-
- remove_broken_detached_part_impl("replicated_mt", node1, "broken")
-
-
-def test_store_cleanup(started_cluster):
- node1.query("CREATE DATABASE db UUID '10000000-1000-4000-8000-000000000001'")
- node1.query(
- "CREATE TABLE db.log UUID '10000000-1000-4000-8000-000000000002' ENGINE=Log AS SELECT 1"
- )
- node1.query(
- "CREATE TABLE db.mt UUID '10000000-1000-4000-8000-000000000003' ENGINE=MergeTree ORDER BY tuple() AS SELECT 1"
- )
- node1.query(
- "CREATE TABLE db.mem UUID '10000000-1000-4000-8000-000000000004' ENGINE=Memory AS SELECT 1"
- )
-
- node1.query("CREATE DATABASE db2 UUID '20000000-1000-4000-8000-000000000001'")
- node1.query(
- "CREATE TABLE db2.log UUID '20000000-1000-4000-8000-000000000002' ENGINE=Log AS SELECT 1"
- )
- node1.query("DETACH DATABASE db2")
-
- node1.query("CREATE DATABASE db3 UUID '30000000-1000-4000-8000-000000000001'")
- node1.query(
- "CREATE TABLE db3.log UUID '30000000-1000-4000-8000-000000000002' ENGINE=Log AS SELECT 1"
- )
- node1.query(
- "CREATE TABLE db3.log2 UUID '30000000-1000-4000-8000-000000000003' ENGINE=Log AS SELECT 1"
- )
- node1.query("DETACH TABLE db3.log")
- node1.query("DETACH TABLE db3.log2 PERMANENTLY")
-
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store"]
- )
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/100"]
- )
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/200"]
- )
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/300"]
- )
-
- node1.stop_clickhouse(kill=True)
- # All dirs related to `db` will be removed
- node1.exec_in_container(["rm", f"{path_to_data}/metadata/db.sql"])
-
- node1.exec_in_container(["mkdir", f"{path_to_data}/store/kek"])
- node1.exec_in_container(["touch", f"{path_to_data}/store/12"])
- try:
- node1.exec_in_container(["mkdir", f"{path_to_data}/store/456"])
- except Exception as e:
- print("Failed to create 456/:", str(e))
- node1.exec_in_container(["mkdir", f"{path_to_data}/store/456/testgarbage"])
- node1.exec_in_container(
- ["mkdir", f"{path_to_data}/store/456/30000000-1000-4000-8000-000000000003"]
- )
- node1.exec_in_container(
- ["touch", f"{path_to_data}/store/456/45600000-1000-4000-8000-000000000003"]
- )
- node1.exec_in_container(
- ["mkdir", f"{path_to_data}/store/456/45600000-1000-4000-8000-000000000004"]
- )
-
- node1.start_clickhouse()
- node1.query("DETACH DATABASE db2")
- node1.query("DETACH TABLE db3.log")
-
- node1.wait_for_log_line(
- "Removing access rights for unused directory",
- timeout=60,
- look_behind_lines=1000000,
- )
- node1.wait_for_log_line(
- "directories from store", timeout=60, look_behind_lines=1000000
- )
-
- store = node1.exec_in_container(["ls", f"{path_to_data}/store"])
- assert "100" in store
- assert "200" in store
- assert "300" in store
- assert "456" in store
- assert "kek" in store
- assert "12" in store
- assert "d---------" in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store"]
- )
- assert "d---------" in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/456"]
- )
-
- # Metadata is removed, so store/100 contains garbage
- store100 = node1.exec_in_container(["ls", f"{path_to_data}/store/100"])
- assert "10000000-1000-4000-8000-000000000001" in store100
- assert "10000000-1000-4000-8000-000000000002" in store100
- assert "10000000-1000-4000-8000-000000000003" in store100
- assert "d---------" in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/100"]
- )
-
- # Database is detached, nothing to clean up
- store200 = node1.exec_in_container(["ls", f"{path_to_data}/store/200"])
- assert "20000000-1000-4000-8000-000000000001" in store200
- assert "20000000-1000-4000-8000-000000000002" in store200
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/200"]
- )
-
- # Tables are detached, nothing to clean up
- store300 = node1.exec_in_container(["ls", f"{path_to_data}/store/300"])
- assert "30000000-1000-4000-8000-000000000001" in store300
- assert "30000000-1000-4000-8000-000000000002" in store300
- assert "30000000-1000-4000-8000-000000000003" in store300
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/300"]
- )
-
- # Manually created garbage
- store456 = node1.exec_in_container(["ls", f"{path_to_data}/store/456"])
- assert "30000000-1000-4000-8000-000000000003" in store456
- assert "45600000-1000-4000-8000-000000000003" in store456
- assert "45600000-1000-4000-8000-000000000004" in store456
- assert "testgarbage" in store456
- assert "----------" in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/456"]
- )
-
- node1.wait_for_log_line(
- "Removing unused directory", timeout=90, look_behind_lines=1000000
- )
- node1.wait_for_log_line(
- "directories from store", timeout=90, look_behind_lines=1000000
- )
- node1.wait_for_log_line(
- "Nothing to clean up from store/", timeout=90, look_behind_lines=1000000
- )
-
- store = node1.exec_in_container(["ls", f"{path_to_data}/store"])
- assert "100" in store
- assert "200" in store
- assert "300" in store
- assert "456" in store
- assert "kek" not in store # changed
- assert "\n12\n" not in store # changed
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store"]
- ) # changed
-
- # Metadata is removed, so store/100 contains garbage
- store100 = node1.exec_in_container(["ls", f"{path_to_data}/store/100"]) # changed
- assert "10000000-1000-4000-8000-000000000001" not in store100 # changed
- assert "10000000-1000-4000-8000-000000000002" not in store100 # changed
- assert "10000000-1000-4000-8000-000000000003" not in store100 # changed
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/100"]
- ) # changed
-
- # Database is detached, nothing to clean up
- store200 = node1.exec_in_container(["ls", f"{path_to_data}/store/200"])
- assert "20000000-1000-4000-8000-000000000001" in store200
- assert "20000000-1000-4000-8000-000000000002" in store200
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/200"]
- )
-
- # Tables are detached, nothing to clean up
- store300 = node1.exec_in_container(["ls", f"{path_to_data}/store/300"])
- assert "30000000-1000-4000-8000-000000000001" in store300
- assert "30000000-1000-4000-8000-000000000002" in store300
- assert "30000000-1000-4000-8000-000000000003" in store300
- assert "d---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/300"]
- )
-
- # Manually created garbage
- store456 = node1.exec_in_container(["ls", f"{path_to_data}/store/456"])
- assert "30000000-1000-4000-8000-000000000003" not in store456 # changed
- assert "45600000-1000-4000-8000-000000000003" not in store456 # changed
- assert "45600000-1000-4000-8000-000000000004" not in store456 # changed
- assert "testgarbage" not in store456 # changed
- assert "---------" not in node1.exec_in_container(
- ["ls", "-l", f"{path_to_data}/store/456"]
- ) # changed
-
- node1.query("ATTACH TABLE db3.log2")
- node1.query("ATTACH DATABASE db2")
- node1.query("ATTACH TABLE db3.log")
-
- assert "1\n" == node1.query("SELECT * FROM db3.log")
- assert "1\n" == node1.query("SELECT * FROM db3.log2")
- assert "1\n" == node1.query("SELECT * FROM db2.log")
diff --git a/tests/integration/test_checking_s3_blobs_paranoid/test.py b/tests/integration/test_checking_s3_blobs_paranoid/test.py
index c40e2a31a8b..eb791383fde 100644
--- a/tests/integration/test_checking_s3_blobs_paranoid/test.py
+++ b/tests/integration/test_checking_s3_blobs_paranoid/test.py
@@ -5,6 +5,7 @@ import pytest
from helpers.cluster import ClickHouseCluster
from helpers.mock_servers import start_s3_mock
+from helpers.test_tools import assert_eq_with_retry
@pytest.fixture(scope="module")
@@ -464,3 +465,60 @@ def test_when_s3_broken_pipe_at_upload_is_retried(cluster, broken_s3):
"DB::Exception: Poco::Exception. Code: 1000, e.code() = 32, I/O error: Broken pipe"
in error
), error
+
+
+def test_query_is_canceled_with_inf_retries(cluster, broken_s3):
+ node = cluster.instances["node"]
+
+ broken_s3.setup_at_part_upload(
+ count=10000000,
+ after=2,
+ action="connection_refused",
+ )
+
+ insert_query_id = f"TEST_QUERY_IS_CANCELED_WITH_INF_RETRIES"
+ request = node.get_query_request(
+ f"""
+ INSERT INTO
+ TABLE FUNCTION s3(
+ 'http://resolver:8083/root/data/test_query_is_canceled_with_inf_retries',
+ 'minio', 'minio123',
+ 'CSV', auto, 'none'
+ )
+ SELECT
+ *
+ FROM system.numbers
+ LIMIT 1000000
+ SETTINGS
+ s3_retry_attempts=1000000,
+ s3_max_single_part_upload_size=100,
+ s3_min_upload_part_size=10000,
+ s3_check_objects_after_upload=0
+ """,
+ query_id=insert_query_id,
+ )
+
+ assert_eq_with_retry(
+ node,
+ f"SELECT count() FROM system.processes WHERE query_id='{insert_query_id}'",
+ "1",
+ )
+
+ assert_eq_with_retry(
+ node,
+ f"SELECT ProfileEvents['S3WriteRequestsErrors'] > 10 FROM system.processes WHERE query_id='{insert_query_id}'",
+ "1",
+ retry_count=12,
+ sleep_time=10,
+ )
+
+ node.query(f"KILL QUERY WHERE query_id = '{insert_query_id}' ASYNC")
+
+ # no more than 2 minutes
+ assert_eq_with_retry(
+ node,
+ f"SELECT count() FROM system.processes WHERE query_id='{insert_query_id}'",
+ "0",
+ retry_count=120,
+ sleep_time=1,
+ )
diff --git a/tests/integration/test_compression_nested_columns/test.py b/tests/integration/test_compression_nested_columns/test.py
index 55d88174287..3541a9f6061 100644
--- a/tests/integration/test_compression_nested_columns/test.py
+++ b/tests/integration/test_compression_nested_columns/test.py
@@ -48,7 +48,7 @@ def test_nested_compression_codec(start_cluster):
column_array Array(Array(UInt64)) CODEC(T64, LZ4),
column_bad LowCardinality(Int64) CODEC(Delta)
) ENGINE = ReplicatedMergeTree('/t', '{}') ORDER BY tuple() PARTITION BY key
- SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0;
+ SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0, replace_long_file_name_to_hash = 0;
""".format(
i
),
diff --git a/tests/integration/test_config_xml_full/configs/config.xml b/tests/integration/test_config_xml_full/configs/config.xml
index d142df18af8..ac59b3428e8 100644
--- a/tests/integration/test_config_xml_full/configs/config.xml
+++ b/tests/integration/test_config_xml_full/configs/config.xml
@@ -674,27 +674,6 @@
-->
-
-
-
-
+
+
+
+ http://minio1:9001/root/{bucket}
+
+
+
diff --git a/tests/integration/test_storage_meilisearch/configs/users.xml b/tests/integration/test_s3_style_link/configs/users.d/users.xml
similarity index 100%
rename from tests/integration/test_storage_meilisearch/configs/users.xml
rename to tests/integration/test_s3_style_link/configs/users.d/users.xml
diff --git a/tests/integration/test_s3_style_link/test.py b/tests/integration/test_s3_style_link/test.py
new file mode 100644
index 00000000000..7ecf4e633e3
--- /dev/null
+++ b/tests/integration/test_s3_style_link/test.py
@@ -0,0 +1,57 @@
+import logging
+import pytest
+from helpers.cluster import ClickHouseCluster
+
+
+cluster = ClickHouseCluster(__file__)
+node = cluster.add_instance(
+ "node",
+ main_configs=[
+ "configs/config.d/minio.xml",
+ ],
+ user_configs=[
+ "configs/users.d/users.xml",
+ ],
+ with_minio=True,
+)
+
+
+@pytest.fixture(scope="module")
+def started_cluster():
+ try:
+ logging.info("Starting cluster...")
+ cluster.start()
+ logging.info("Cluster started")
+
+ yield cluster
+ finally:
+ logging.info("Stopping cluster")
+ cluster.shutdown()
+ logging.info("Cluster stopped")
+
+
+def test_s3_table_functions(started_cluster):
+ """
+ Simple test to check s3 table function functionalities
+ """
+ node.query(
+ """
+ INSERT INTO FUNCTION s3
+ (
+ 'minio://data/test_file.tsv.gz', 'minio', 'minio123'
+ )
+ SELECT * FROM numbers(1000000);
+ """
+ )
+
+ assert (
+ node.query(
+ """
+ SELECT count(*) FROM s3
+ (
+ 'minio://data/test_file.tsv.gz', 'minio', 'minio123'
+ );
+ """
+ )
+ == "1000000\n"
+ )
diff --git a/tests/integration/test_server_reload/grpc_protocol_pb2 b/tests/integration/test_server_reload/grpc_protocol_pb2
new file mode 120000
index 00000000000..27cc9a4f321
--- /dev/null
+++ b/tests/integration/test_server_reload/grpc_protocol_pb2
@@ -0,0 +1 @@
+../../../utils/grpc-client/pb2
\ No newline at end of file
diff --git a/tests/integration/test_server_reload/protos/clickhouse_grpc.proto b/tests/integration/test_server_reload/protos/clickhouse_grpc.proto
deleted file mode 120000
index 25d15f11e3b..00000000000
--- a/tests/integration/test_server_reload/protos/clickhouse_grpc.proto
+++ /dev/null
@@ -1 +0,0 @@
-../../../../src/Server/grpc_protos/clickhouse_grpc.proto
\ No newline at end of file
diff --git a/tests/integration/test_server_reload/test.py b/tests/integration/test_server_reload/test.py
index da5208799ac..655c83dd81f 100644
--- a/tests/integration/test_server_reload/test.py
+++ b/tests/integration/test_server_reload/test.py
@@ -22,6 +22,13 @@ from pathlib import Path
from requests.exceptions import ConnectionError
from urllib3.util.retry import Retry
+script_dir = os.path.dirname(os.path.realpath(__file__))
+grpc_protocol_pb2_dir = os.path.join(script_dir, "grpc_protocol_pb2")
+if grpc_protocol_pb2_dir not in sys.path:
+ sys.path.append(grpc_protocol_pb2_dir)
+import clickhouse_grpc_pb2, clickhouse_grpc_pb2_grpc # Execute grpc_protocol_pb2/generate.py to generate these modules.
+
+
cluster = ClickHouseCluster(__file__)
instance = cluster.add_instance(
"instance",
@@ -44,22 +51,6 @@ instance = cluster.add_instance(
LOADS_QUERY = "SELECT value FROM system.events WHERE event = 'MainConfigLoads'"
-# Use grpcio-tools to generate *pb2.py files from *.proto.
-
-proto_dir = Path(__file__).parent / "protos"
-gen_dir = Path(__file__).parent / "_gen"
-gen_dir.mkdir(exist_ok=True)
-run_and_check(
- f"python3 -m grpc_tools.protoc -I{proto_dir!s} --python_out={gen_dir!s} --grpc_python_out={gen_dir!s} \
- {proto_dir!s}/clickhouse_grpc.proto",
- shell=True,
-)
-
-sys.path.append(str(gen_dir))
-import clickhouse_grpc_pb2
-import clickhouse_grpc_pb2_grpc
-
-
@pytest.fixture(name="cluster", scope="module")
def fixture_cluster():
try:
diff --git a/tests/integration/test_session_log/grpc_protocol_pb2 b/tests/integration/test_session_log/grpc_protocol_pb2
new file mode 120000
index 00000000000..27cc9a4f321
--- /dev/null
+++ b/tests/integration/test_session_log/grpc_protocol_pb2
@@ -0,0 +1 @@
+../../../utils/grpc-client/pb2
\ No newline at end of file
diff --git a/tests/integration/test_session_log/protos/clickhouse_grpc.proto b/tests/integration/test_session_log/protos/clickhouse_grpc.proto
deleted file mode 120000
index 25d15f11e3b..00000000000
--- a/tests/integration/test_session_log/protos/clickhouse_grpc.proto
+++ /dev/null
@@ -1 +0,0 @@
-../../../../src/Server/grpc_protos/clickhouse_grpc.proto
\ No newline at end of file
diff --git a/tests/integration/test_session_log/test.py b/tests/integration/test_session_log/test.py
index 0c350e6c2c9..922e2557c50 100644
--- a/tests/integration/test_session_log/test.py
+++ b/tests/integration/test_session_log/test.py
@@ -8,27 +8,19 @@ import threading
from helpers.cluster import ClickHouseCluster, run_and_check
+script_dir = os.path.dirname(os.path.realpath(__file__))
+grpc_protocol_pb2_dir = os.path.join(script_dir, "grpc_protocol_pb2")
+if grpc_protocol_pb2_dir not in sys.path:
+ sys.path.append(grpc_protocol_pb2_dir)
+import clickhouse_grpc_pb2, clickhouse_grpc_pb2_grpc # Execute grpc_protocol_pb2/generate.py to generate these modules.
+
+
POSTGRES_SERVER_PORT = 5433
MYSQL_SERVER_PORT = 9001
GRPC_PORT = 9100
SESSION_LOG_MATCHING_FIELDS = "auth_id, auth_type, client_version_major, client_version_minor, client_version_patch, interface"
-
-SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
DEFAULT_ENCODING = "utf-8"
-# Use grpcio-tools to generate *pb2.py files from *.proto.
-proto_dir = os.path.join(SCRIPT_DIR, "./protos")
-gen_dir = os.path.join(SCRIPT_DIR, "./_gen")
-os.makedirs(gen_dir, exist_ok=True)
-run_and_check(
- f"python3 -m grpc_tools.protoc -I{proto_dir} --python_out={gen_dir} --grpc_python_out={gen_dir} {proto_dir}/clickhouse_grpc.proto",
- shell=True,
-)
-
-sys.path.append(gen_dir)
-
-import clickhouse_grpc_pb2
-import clickhouse_grpc_pb2_grpc
cluster = ClickHouseCluster(__file__)
instance = cluster.add_instance(
diff --git a/tests/integration/test_ssh_keys_authentication/__init__.py b/tests/integration/test_ssh_keys_authentication/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/integration/test_ssh_keys_authentication/configs/users.xml b/tests/integration/test_ssh_keys_authentication/configs/users.xml
new file mode 100644
index 00000000000..05b55a46598
--- /dev/null
+++ b/tests/integration/test_ssh_keys_authentication/configs/users.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+