mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 09:32:01 +00:00
Merge branch 'master' into skip-trailing-empty-lines
This commit is contained in:
commit
edd47a2281
253
CHANGELOG.md
253
CHANGELOG.md
@ -1,4 +1,5 @@
|
|||||||
### Table of Contents
|
### Table of Contents
|
||||||
|
**[ClickHouse release v23.5, 2023-06-08](#235)**<br/>
|
||||||
**[ClickHouse release v23.4, 2023-04-26](#234)**<br/>
|
**[ClickHouse release v23.4, 2023-04-26](#234)**<br/>
|
||||||
**[ClickHouse release v23.3 LTS, 2023-03-30](#233)**<br/>
|
**[ClickHouse release v23.3 LTS, 2023-03-30](#233)**<br/>
|
||||||
**[ClickHouse release v23.2, 2023-02-23](#232)**<br/>
|
**[ClickHouse release v23.2, 2023-02-23](#232)**<br/>
|
||||||
@ -7,6 +8,258 @@
|
|||||||
|
|
||||||
# 2023 Changelog
|
# 2023 Changelog
|
||||||
|
|
||||||
|
### <a id="235"></a> ClickHouse release 23.5, 2023-06-08
|
||||||
|
|
||||||
|
#### Upgrade Notes
|
||||||
|
* Compress marks and primary key by default. It significantly reduces the cold query time. Upgrade notes: the support for compressed marks and primary key has been added in version 22.9. If you turned on compressed marks or primary key or installed version 23.5 or newer, which has compressed marks or primary key on by default, you will not be able to downgrade to version 22.8 or earlier. You can also explicitly disable compressed marks or primary keys by specifying the `compress_marks` and `compress_primary_key` settings in the `<merge_tree>` section of the server configuration file. **Upgrade notes:** If you upgrade from versions prior to 22.9, you should either upgrade all replicas at once or disable the compression before upgrade, or upgrade through an intermediate version, where the compressed marks are supported but not enabled by default, such as 23.3. [#42587](https://github.com/ClickHouse/ClickHouse/pull/42587) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Make local object storage work consistently with s3 object storage, fix problem with append (closes [#48465](https://github.com/ClickHouse/ClickHouse/issues/48465)), make it configurable as independent storage. The change is backward incompatible because the cache on top of local object storage is not compatible to previous versions. [#48791](https://github.com/ClickHouse/ClickHouse/pull/48791) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* The experimental feature "in-memory data parts" is removed. The data format is still supported, but the settings are no-op, and compact or wide parts will be used instead. This closes [#45409](https://github.com/ClickHouse/ClickHouse/issues/45409). [#49429](https://github.com/ClickHouse/ClickHouse/pull/49429) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Changed default values of settings `parallelize_output_from_storages` and `input_format_parquet_preserve_order`. This allows ClickHouse to reorder rows when reading from files (e.g. CSV or Parquet), greatly improving performance in many cases. To restore the old behavior of preserving order, use `parallelize_output_from_storages = 0`, `input_format_parquet_preserve_order = 1`. [#49479](https://github.com/ClickHouse/ClickHouse/pull/49479) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Make projections production-ready. Add the `optimize_use_projections` setting to control whether the projections will be selected for SELECT queries. The setting `allow_experimental_projection_optimization` is obsolete and does nothing. [#49719](https://github.com/ClickHouse/ClickHouse/pull/49719) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Mark `joinGet` as non-deterministic (so as `dictGet`). It allows using them in mutations without an extra setting. [#49843](https://github.com/ClickHouse/ClickHouse/pull/49843) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Revert the "`groupArray` returns cannot be nullable" change (due to binary compatibility breakage for `groupArray`/`groupArrayLast`/`groupArraySample` over `Nullable` types, which likely will lead to `TOO_LARGE_ARRAY_SIZE` or `CANNOT_READ_ALL_DATA`). [#49971](https://github.com/ClickHouse/ClickHouse/pull/49971) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Setting `enable_memory_bound_merging_of_aggregation_results` is enabled by default. If you update from version prior to 22.12, we recommend to set this flag to `false` until update is finished. [#50319](https://github.com/ClickHouse/ClickHouse/pull/50319) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
|
||||||
|
#### New Feature
|
||||||
|
* Added storage engine AzureBlobStorage and azureBlobStorage table function. The supported set of features is very similar to storage/table function S3 [#50604] (https://github.com/ClickHouse/ClickHouse/pull/50604) ([alesapin](https://github.com/alesapin)) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni).
|
||||||
|
* Added native ClickHouse Keeper CLI Client, it is available as `clickhouse keeper-client` [#47414](https://github.com/ClickHouse/ClickHouse/pull/47414) ([pufit](https://github.com/pufit)).
|
||||||
|
* Add `urlCluster` table function. Refactor all *Cluster table functions to reduce code duplication. Make schema inference work for all possible *Cluster function signatures and for named collections. Closes [#38499](https://github.com/ClickHouse/ClickHouse/issues/38499). [#45427](https://github.com/ClickHouse/ClickHouse/pull/45427) ([attack204](https://github.com/attack204)), Pavel Kruglov.
|
||||||
|
* The query cache can now be used for production workloads. [#47977](https://github.com/ClickHouse/ClickHouse/pull/47977) ([Robert Schulze](https://github.com/rschu1ze)). The query cache can now support queries with totals and extremes modifier. [#48853](https://github.com/ClickHouse/ClickHouse/pull/48853) ([Robert Schulze](https://github.com/rschu1ze)). Make `allow_experimental_query_cache` setting as obsolete for backward-compatibility. It was removed in https://github.com/ClickHouse/ClickHouse/pull/47977. [#49934](https://github.com/ClickHouse/ClickHouse/pull/49934) ([Timur Solodovnikov](https://github.com/tsolodov)).
|
||||||
|
* Geographical data types (`Point`, `Ring`, `Polygon`, and `MultiPolygon`) are production-ready. [#50022](https://github.com/ClickHouse/ClickHouse/pull/50022) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Add schema inference to PostgreSQL, MySQL, MeiliSearch, and SQLite table engines. Closes [#49972](https://github.com/ClickHouse/ClickHouse/issues/49972). [#50000](https://github.com/ClickHouse/ClickHouse/pull/50000) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Password type in queries like `CREATE USER u IDENTIFIED BY 'p'` will be automatically set according to the setting `default_password_type` in the `config.xml` on the server. Closes [#42915](https://github.com/ClickHouse/ClickHouse/issues/42915). [#44674](https://github.com/ClickHouse/ClickHouse/pull/44674) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Add bcrypt password authentication type. Closes [#34599](https://github.com/ClickHouse/ClickHouse/issues/34599). [#44905](https://github.com/ClickHouse/ClickHouse/pull/44905) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Introduces new keyword `INTO OUTFILE 'file.txt' APPEND`. [#48880](https://github.com/ClickHouse/ClickHouse/pull/48880) ([alekar](https://github.com/alekar)).
|
||||||
|
* Added `system.zookeeper_connection` table that shows information about Keeper connections. [#45245](https://github.com/ClickHouse/ClickHouse/pull/45245) ([mateng915](https://github.com/mateng0915)).
|
||||||
|
* Add new function `generateRandomStructure` that generates random table structure. It can be used in combination with table function `generateRandom`. [#47409](https://github.com/ClickHouse/ClickHouse/pull/47409) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Allow the use of `CASE` without an `ELSE` branch and extended `transform` to deal with more types. Also fix some issues that made transform() return incorrect results when decimal types were mixed with other numeric types. [#48300](https://github.com/ClickHouse/ClickHouse/pull/48300) ([Salvatore Mesoraca](https://github.com/aiven-sal)). This closes #2655. This closes #9596. This closes #38666.
|
||||||
|
* Added [server-side encryption using KMS keys](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) with S3 tables, and the `header` setting with S3 disks. Closes [#48723](https://github.com/ClickHouse/ClickHouse/issues/48723). [#48724](https://github.com/ClickHouse/ClickHouse/pull/48724) ([Johann Gan](https://github.com/johanngan)).
|
||||||
|
* Add MemoryTracker for the background tasks (merges and mutation). Introduces `merges_mutations_memory_usage_soft_limit` and `merges_mutations_memory_usage_to_ram_ratio` settings that represent the soft memory limit for merges and mutations. If this limit is reached ClickHouse won't schedule new merge or mutation tasks. Also `MergesMutationsMemoryTracking` metric is introduced to allow observing current memory usage of background tasks. Resubmit [#46089](https://github.com/ClickHouse/ClickHouse/issues/46089). Closes [#48774](https://github.com/ClickHouse/ClickHouse/issues/48774). [#48787](https://github.com/ClickHouse/ClickHouse/pull/48787) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Function `dotProduct` work for array. [#49050](https://github.com/ClickHouse/ClickHouse/pull/49050) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)).
|
||||||
|
* Support statement `SHOW INDEX` to improve compatibility with MySQL. [#49158](https://github.com/ClickHouse/ClickHouse/pull/49158) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Add virtual column `_file` and `_path` support to table function `url`. - Impove error message for table function `url`. - resolves [#49231](https://github.com/ClickHouse/ClickHouse/issues/49231) - resolves [#49232](https://github.com/ClickHouse/ClickHouse/issues/49232). [#49356](https://github.com/ClickHouse/ClickHouse/pull/49356) ([Ziyi Tan](https://github.com/Ziy1-Tan)).
|
||||||
|
* Adding the `grants` field in the users.xml file, which allows specifying grants for users. [#49381](https://github.com/ClickHouse/ClickHouse/pull/49381) ([pufit](https://github.com/pufit)).
|
||||||
|
* Support full/right join by using grace hash join algorithm. [#49483](https://github.com/ClickHouse/ClickHouse/pull/49483) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* `WITH FILL` modifier groups filling by sorting prefix. Controlled by `use_with_fill_by_sorting_prefix` setting (enabled by default). Related to [#33203](https://github.com/ClickHouse/ClickHouse/issues/33203)#issuecomment-1418736794. [#49503](https://github.com/ClickHouse/ClickHouse/pull/49503) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Clickhouse-client now accepts queries after "--multiquery" when "--query" (or "-q") is absent. example: clickhouse-client --multiquery "select 1; select 2;". [#49870](https://github.com/ClickHouse/ClickHouse/pull/49870) ([Alexey Gerasimchuk](https://github.com/Demilivor)).
|
||||||
|
* Add separate `handshake_timeout` for receiving Hello packet from replica. Closes [#48854](https://github.com/ClickHouse/ClickHouse/issues/48854). [#49948](https://github.com/ClickHouse/ClickHouse/pull/49948) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Added a function "space" which repeats a space as many times as specified. [#50103](https://github.com/ClickHouse/ClickHouse/pull/50103) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Added --input_format_csv_trim_whitespaces option. [#50215](https://github.com/ClickHouse/ClickHouse/pull/50215) ([Alexey Gerasimchuk](https://github.com/Demilivor)).
|
||||||
|
* Allow the `dictGetAll` function for regexp tree dictionaries to return values from multiple matches as arrays. Closes [#50254](https://github.com/ClickHouse/ClickHouse/issues/50254). [#50255](https://github.com/ClickHouse/ClickHouse/pull/50255) ([Johann Gan](https://github.com/johanngan)).
|
||||||
|
* Added `toLastDayOfWeek` function to round a date or a date with time up to the nearest Saturday or Sunday. [#50315](https://github.com/ClickHouse/ClickHouse/pull/50315) ([Victor Krasnov](https://github.com/sirvickr)).
|
||||||
|
* Ability to ignore a skip index by specifying `ignore_data_skipping_indices`. [#50329](https://github.com/ClickHouse/ClickHouse/pull/50329) ([Boris Kuschel](https://github.com/bkuschel)).
|
||||||
|
* Add `system.user_processes` table and `SHOW USER PROCESSES` query to show memory info and ProfileEvents on user level. [#50492](https://github.com/ClickHouse/ClickHouse/pull/50492) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
|
||||||
|
* Add server and format settings `display_secrets_in_show_and_select` for displaying secrets of tables, databases, table functions, and dictionaries. Add privilege `displaySecretsInShowAndSelect` controlling which users can view secrets. [#46528](https://github.com/ClickHouse/ClickHouse/pull/46528) ([Mike Kot](https://github.com/myrrc)).
|
||||||
|
* Allow to set up a ROW POLICY for all tables that belong to a DATABASE. [#47640](https://github.com/ClickHouse/ClickHouse/pull/47640) ([Ilya Golshtein](https://github.com/ilejn)).
|
||||||
|
|
||||||
|
#### Performance Improvement
|
||||||
|
* Compress marks and primary key by default. It significantly reduces the cold query time. Upgrade notes: the support for compressed marks and primary key has been added in version 22.9. If you turned on compressed marks or primary key or installed version 23.5 or newer, which has compressed marks or primary key on by default, you will not be able to downgrade to version 22.8 or earlier. You can also explicitly disable compressed marks or primary keys by specifying the `compress_marks` and `compress_primary_key` settings in the `<merge_tree>` section of the server configuration file. [#42587](https://github.com/ClickHouse/ClickHouse/pull/42587) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* New setting s3_max_inflight_parts_for_one_file sets the limit of concurrently loaded parts with multipart upload request in scope of one file. [#49961](https://github.com/ClickHouse/ClickHouse/pull/49961) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* When reading from multiple files reduce parallel parsing threads for each file. Resolves [#42192](https://github.com/ClickHouse/ClickHouse/issues/42192). [#46661](https://github.com/ClickHouse/ClickHouse/pull/46661) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Use aggregate projection only if it reads fewer granules than normal reading. It should help in case if query hits the PK of the table, but not the projection. Fixes [#49150](https://github.com/ClickHouse/ClickHouse/issues/49150). [#49417](https://github.com/ClickHouse/ClickHouse/pull/49417) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
* Do not store blocks in `ANY` hash join if nothing is inserted. [#48633](https://github.com/ClickHouse/ClickHouse/pull/48633) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Fixes aggregate combinator `-If` when JIT compiled, and enable JIT compilation for aggregate functions. Closes [#48120](https://github.com/ClickHouse/ClickHouse/issues/48120). [#49083](https://github.com/ClickHouse/ClickHouse/pull/49083) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* For reading from remote tables we use smaller tasks (instead of reading the whole part) to make tasks stealing work * task size is determined by size of columns to read * always use 1mb buffers for reading from s3 * boundaries of cache segments aligned to 1mb so they have decent size even with small tasks. it also should prevent fragmentation. [#49287](https://github.com/ClickHouse/ClickHouse/pull/49287) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Introduced settings: - `merge_max_block_size_bytes` to limit the amount of memory used for background operations. - `vertical_merge_algorithm_min_bytes_to_activate` to add another condition to activate vertical merges. [#49313](https://github.com/ClickHouse/ClickHouse/pull/49313) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Default size of a read buffer for reading from local filesystem changed to a slightly better value. Also two new settings are introduced: `max_read_buffer_size_local_fs` and `max_read_buffer_size_remote_fs`. [#49321](https://github.com/ClickHouse/ClickHouse/pull/49321) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Improve memory usage and speed of `SPARSE_HASHED`/`HASHED` dictionaries (e.g. `SPARSE_HASHED` now eats 2.6x less memory, and is ~2x faster). [#49380](https://github.com/ClickHouse/ClickHouse/pull/49380) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Optimize the `system.query_log` and `system.query_thread_log` tables by applying `LowCardinality` when appropriate. The queries over these tables will be faster. [#49530](https://github.com/ClickHouse/ClickHouse/pull/49530) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Better performance when reading local `Parquet` files (through parallel reading). [#49539](https://github.com/ClickHouse/ClickHouse/pull/49539) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Improve the performance of `RIGHT/FULL JOIN` by up to 2 times in certain scenarios, especially when joining a small left table with a large right table. [#49585](https://github.com/ClickHouse/ClickHouse/pull/49585) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* Improve performance of BLAKE3 by 11% by enabling LTO for Rust. [#49600](https://github.com/ClickHouse/ClickHouse/pull/49600) ([Azat Khuzhin](https://github.com/azat)). Now it is on par with C++.
|
||||||
|
* Optimize the structure of the `system.opentelemetry_span_log`. Use `LowCardinality` where appropriate. Although this table is generally stupid (it is using the Map data type even for common attributes), it will be slightly better. [#49647](https://github.com/ClickHouse/ClickHouse/pull/49647) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Try to reserve hash table's size in `grace_hash` join. [#49816](https://github.com/ClickHouse/ClickHouse/pull/49816) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* Parallel merge of `uniqExactIf` states. Closes [#49885](https://github.com/ClickHouse/ClickHouse/issues/49885). [#50285](https://github.com/ClickHouse/ClickHouse/pull/50285) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Keeper improvement: add `CheckNotExists` request to Keeper, which allows to improve the performance of Replicated tables. [#48897](https://github.com/ClickHouse/ClickHouse/pull/48897) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Keeper performance improvements: avoid serializing same request twice while processing. Cache deserialization results of large requests. Controlled by new coordination setting `min_request_size_for_cache`. [#49004](https://github.com/ClickHouse/ClickHouse/pull/49004) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Reduced number of `List` ZooKeeper requests when selecting parts to merge and a lot of partitions do not have anything to merge. [#49637](https://github.com/ClickHouse/ClickHouse/pull/49637) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Rework locking in the FS cache [#44985](https://github.com/ClickHouse/ClickHouse/pull/44985) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Disable pure parallel replicas if trivial count optimization is possible. [#50594](https://github.com/ClickHouse/ClickHouse/pull/50594) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Don't send head request for all keys in Iceberg schema inference, only for keys that are used for reaing data. [#50203](https://github.com/ClickHouse/ClickHouse/pull/50203) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Setting `enable_memory_bound_merging_of_aggregation_results` is enabled by default. [#50319](https://github.com/ClickHouse/ClickHouse/pull/50319) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
|
||||||
|
#### Experimental Feature
|
||||||
|
* `DEFLATE_QPL` codec lower the minimum simd version to SSE 4.2. [doc change in qpl](https://github.com/intel/qpl/commit/3f8f5cea27739f5261e8fd577dc233ffe88bf679) - Intel® QPL relies on a run-time kernels dispatcher and cpuid check to choose the best available implementation(sse/avx2/avx512) - restructured cmakefile for qpl build in clickhouse to align with latest upstream qpl. [#49811](https://github.com/ClickHouse/ClickHouse/pull/49811) ([jasperzhu](https://github.com/jinjunzh)).
|
||||||
|
* Add initial support to do JOINs with pure parallel replicas. [#49544](https://github.com/ClickHouse/ClickHouse/pull/49544) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* More parallelism on `Outdated` parts removal with "zero-copy replication". [#49630](https://github.com/ClickHouse/ClickHouse/pull/49630) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Parallel Replicas: 1) Fixed an error `NOT_FOUND_COLUMN_IN_BLOCK` in case of using parallel replicas with non-replicated storage with disabled setting `parallel_replicas_for_non_replicated_merge_tree` 2) Now `allow_experimental_parallel_reading_from_replicas` have 3 possible values - 0, 1 and 2. 0 - disabled, 1 - enabled, silently disable them in case of failure (in case of FINAL or JOIN), 2 - enabled, throw an expection in case of failure. 3) If FINAL modifier is used in SELECT query and parallel replicas are enabled, ClickHouse will try to disable them if `allow_experimental_parallel_reading_from_replicas` is set to 1 and throw an exception otherwise. [#50195](https://github.com/ClickHouse/ClickHouse/pull/50195) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* When parallel replicas are enabled they will always skip unavailable servers (the behavior is controlled by the setting `skip_unavailable_shards`, enabled by default and can be only disabled). This closes: [#48565](https://github.com/ClickHouse/ClickHouse/issues/48565). [#50293](https://github.com/ClickHouse/ClickHouse/pull/50293) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
|
||||||
|
#### Improvement
|
||||||
|
* The `BACKUP` command will not decrypt data from encrypted disks while making a backup. Instead the data will be stored in a backup in encrypted form. Such backups can be restored only to an encrypted disk with the same (or extended) list of encryption keys. [#48896](https://github.com/ClickHouse/ClickHouse/pull/48896) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Added possibility to use temporary tables in FROM part of ATTACH PARTITION FROM and REPLACE PARTITION FROM. [#49436](https://github.com/ClickHouse/ClickHouse/pull/49436) ([Roman Vasin](https://github.com/rvasin)).
|
||||||
|
* Added setting `async_insert` for `MergeTree` tables. It has the same meaning as query-level setting `async_insert` and enables asynchronous inserts for specific table. Note: it doesn't take effect for insert queries from `clickhouse-client`, use query-level setting in that case. [#49122](https://github.com/ClickHouse/ClickHouse/pull/49122) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Add support for size suffixes in quota creation statement parameters. [#49087](https://github.com/ClickHouse/ClickHouse/pull/49087) ([Eridanus](https://github.com/Eridanus117)).
|
||||||
|
* Extend `first_value` and `last_value` to accept NULL. [#46467](https://github.com/ClickHouse/ClickHouse/pull/46467) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* Add alias `str_to_map` and `mapFromString` for `extractKeyValuePairs`. closes https://github.com/clickhouse/clickhouse/issues/47185. [#49466](https://github.com/ClickHouse/ClickHouse/pull/49466) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Add support for CGroup version 2 for asynchronous metrics about the memory usage and availability. This closes [#37983](https://github.com/ClickHouse/ClickHouse/issues/37983). [#45999](https://github.com/ClickHouse/ClickHouse/pull/45999) ([sichenzhao](https://github.com/sichenzhao)).
|
||||||
|
* Cluster table functions should always skip unavailable shards. close [#46314](https://github.com/ClickHouse/ClickHouse/issues/46314). [#46765](https://github.com/ClickHouse/ClickHouse/pull/46765) ([zk_kiger](https://github.com/zk-kiger)).
|
||||||
|
* Allow CSV file to contain empty columns in its header. [#47496](https://github.com/ClickHouse/ClickHouse/pull/47496) ([你不要过来啊](https://github.com/iiiuwioajdks)).
|
||||||
|
* Add Google Cloud Storage S3 compatible table function `gcs`. Like the `oss` and `cosn` functions, it is just an alias over the `s3` table function, and it does not bring any new features. [#47815](https://github.com/ClickHouse/ClickHouse/pull/47815) ([Kuba Kaflik](https://github.com/jkaflik)).
|
||||||
|
* Add ability to use strict parts size for S3 (compatibility with CloudFlare R2 S3 Storage). [#48492](https://github.com/ClickHouse/ClickHouse/pull/48492) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Added new columns with info about `Replicated` database replicas to `system.clusters`: `database_shard_name`, `database_replica_name`, `is_active`. Added an optional `FROM SHARD` clause to `SYSTEM DROP DATABASE REPLICA` query. [#48548](https://github.com/ClickHouse/ClickHouse/pull/48548) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Add a new column `zookeeper_name` in system.replicas, to indicate on which (auxiliary) zookeeper cluster the replicated table's metadata is stored. [#48549](https://github.com/ClickHouse/ClickHouse/pull/48549) ([cangyin](https://github.com/cangyin)).
|
||||||
|
* `IN` operator support the comparison of `Date` and `Date32`. Closes [#48736](https://github.com/ClickHouse/ClickHouse/issues/48736). [#48806](https://github.com/ClickHouse/ClickHouse/pull/48806) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Support for erasure codes in `HDFS`, author: @M1eyu2018, @tomscut. [#48833](https://github.com/ClickHouse/ClickHouse/pull/48833) ([M1eyu](https://github.com/M1eyu2018)).
|
||||||
|
* Implement SYSTEM DROP REPLICA from auxillary ZooKeeper clusters, may be close [#48931](https://github.com/ClickHouse/ClickHouse/issues/48931). [#48932](https://github.com/ClickHouse/ClickHouse/pull/48932) ([wangxiaobo](https://github.com/wzb5212)).
|
||||||
|
* Add Array data type to MongoDB. Closes [#48598](https://github.com/ClickHouse/ClickHouse/issues/48598). [#48983](https://github.com/ClickHouse/ClickHouse/pull/48983) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Support storing `Interval` data types in tables. [#49085](https://github.com/ClickHouse/ClickHouse/pull/49085) ([larryluogit](https://github.com/larryluogit)).
|
||||||
|
* Allow using `ntile` window function without explicit window frame definition: `ntile(3) OVER (ORDER BY a)`, close [#46763](https://github.com/ClickHouse/ClickHouse/issues/46763). [#49093](https://github.com/ClickHouse/ClickHouse/pull/49093) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Added settings (`number_of_mutations_to_delay`, `number_of_mutations_to_throw`) to delay or throw `ALTER` queries that create mutations (`ALTER UPDATE`, `ALTER DELETE`, `ALTER MODIFY COLUMN`, ...) in case when table already has a lot of unfinished mutations. [#49117](https://github.com/ClickHouse/ClickHouse/pull/49117) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Catch exception from `create_directories` in filesystem cache. [#49203](https://github.com/ClickHouse/ClickHouse/pull/49203) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Copies embedded examples to a new field `example` in `system.functions` to supplement the field `description`. [#49222](https://github.com/ClickHouse/ClickHouse/pull/49222) ([Dan Roscigno](https://github.com/DanRoscigno)).
|
||||||
|
* Enable connection options for the MongoDB dictionary. Example: ``` xml <source> <mongodb> <host>localhost</host> <port>27017</port> <user></user> <password></password> <db>test</db> <collection>dictionary_source</collection> <options>ssl=true</options> </mongodb> </source> ``` ### Documentation entry for user-facing changes. [#49225](https://github.com/ClickHouse/ClickHouse/pull/49225) ([MikhailBurdukov](https://github.com/MikhailBurdukov)).
|
||||||
|
* Added an alias `asymptotic` for `asymp` computational method for `kolmogorovSmirnovTest`. Improved documentation. [#49286](https://github.com/ClickHouse/ClickHouse/pull/49286) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Aggregation function groupBitAnd/Or/Xor now work on signed integer data. This makes them consistent with the behavior of scalar functions bitAnd/Or/Xor. [#49292](https://github.com/ClickHouse/ClickHouse/pull/49292) ([exmy](https://github.com/exmy)).
|
||||||
|
* Split function-documentation into more fine-granular fields. [#49300](https://github.com/ClickHouse/ClickHouse/pull/49300) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Use multiple threads shared between all tables within a server to load outdated data parts. The the size of the pool and its queue is controlled by `max_outdated_parts_loading_thread_pool_size` and `outdated_part_loading_thread_pool_queue_size` settings. [#49317](https://github.com/ClickHouse/ClickHouse/pull/49317) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Don't overestimate the size of processed data for `LowCardinality` columns when they share dictionaries between blocks. This closes [#49322](https://github.com/ClickHouse/ClickHouse/issues/49322). See also [#48745](https://github.com/ClickHouse/ClickHouse/issues/48745). [#49323](https://github.com/ClickHouse/ClickHouse/pull/49323) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Parquet writer now uses reasonable row group size when invoked through `OUTFILE`. [#49325](https://github.com/ClickHouse/ClickHouse/pull/49325) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Allow restricted keywords like `ARRAY` as an alias if the alias is quoted. Closes [#49324](https://github.com/ClickHouse/ClickHouse/issues/49324). [#49360](https://github.com/ClickHouse/ClickHouse/pull/49360) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Data parts loading and deletion jobs were moved to shared server-wide pools instead of per-table pools. Pools sizes are controlled via settings `max_active_parts_loading_thread_pool_size`, `max_outdated_parts_loading_thread_pool_size` and `max_parts_cleaning_thread_pool_size` in top-level config. Table-level settings `max_part_loading_threads` and `max_part_removal_threads` became obsolete. [#49474](https://github.com/ClickHouse/ClickHouse/pull/49474) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Allow `?password=pass` in URL of the Play UI. Password is replaced in browser history. [#49505](https://github.com/ClickHouse/ClickHouse/pull/49505) ([Mike Kot](https://github.com/myrrc)).
|
||||||
|
* Allow reading zero-size objects from remote filesystems. (because empty files are not backup'd, so we might end up with zero blobs in metadata file). Closes [#49480](https://github.com/ClickHouse/ClickHouse/issues/49480). [#49519](https://github.com/ClickHouse/ClickHouse/pull/49519) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Attach thread MemoryTracker to `total_memory_tracker` after `ThreadGroup` detached. [#49527](https://github.com/ClickHouse/ClickHouse/pull/49527) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Fix parameterized views when a query parameter is used multiple times in the query. [#49556](https://github.com/ClickHouse/ClickHouse/pull/49556) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Release memory allocated for the last sent ProfileEvents snapshot in the context of a query. Followup [#47564](https://github.com/ClickHouse/ClickHouse/issues/47564). [#49561](https://github.com/ClickHouse/ClickHouse/pull/49561) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Function "makeDate" now provides a MySQL-compatible overload (year & day of the year argument). [#49603](https://github.com/ClickHouse/ClickHouse/pull/49603) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Support `dictionary` table function for `RegExpTreeDictionary`. [#49666](https://github.com/ClickHouse/ClickHouse/pull/49666) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Added weighted fair IO scheduling policy. Added dynamic resource manager, which allows IO scheduling hierarchy to be updated in runtime w/o server restarts. [#49671](https://github.com/ClickHouse/ClickHouse/pull/49671) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Add compose request after multipart upload to GCS. This enables the usage of copy operation on objects uploaded with the multipart upload. It's recommended to set `s3_strict_upload_part_size` to some value because compose request can fail on objects created with parts of different sizes. [#49693](https://github.com/ClickHouse/ClickHouse/pull/49693) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* For the `extractKeyValuePairs` function: improve the "best-effort" parsing logic to accept `key_value_delimiter` as a valid part of the value. This also simplifies branching and might even speed up things a bit. [#49760](https://github.com/ClickHouse/ClickHouse/pull/49760) ([Arthur Passos](https://github.com/arthurpassos)).
|
||||||
|
* Add `initial_query_id` field for system.processors_profile_log [#49777](https://github.com/ClickHouse/ClickHouse/pull/49777) ([helifu](https://github.com/helifu)).
|
||||||
|
* System log tables can now have custom sorting keys. [#49778](https://github.com/ClickHouse/ClickHouse/pull/49778) ([helifu](https://github.com/helifu)).
|
||||||
|
* A new field `partitions` to `system.query_log` is used to indicate which partitions are participating in the calculation. [#49779](https://github.com/ClickHouse/ClickHouse/pull/49779) ([helifu](https://github.com/helifu)).
|
||||||
|
* Added `enable_the_endpoint_id_with_zookeeper_name_prefix` setting for `ReplicatedMergeTree` (disabled by default). When enabled, it adds ZooKeeper cluster name to table's interserver communication endpoint. It avoids `Duplicate interserver IO endpoint` errors when having replicated tables with the same path, but different auxiliary ZooKeepers. [#49780](https://github.com/ClickHouse/ClickHouse/pull/49780) ([helifu](https://github.com/helifu)).
|
||||||
|
* Add query parameters to `clickhouse-local`. Closes [#46561](https://github.com/ClickHouse/ClickHouse/issues/46561). [#49785](https://github.com/ClickHouse/ClickHouse/pull/49785) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Allow loading dictionaries and functions from YAML by default. In previous versions, it required editing the `dictionaries_config` or `user_defined_executable_functions_config` in the configuration file, as they expected `*.xml` files. [#49812](https://github.com/ClickHouse/ClickHouse/pull/49812) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* The Kafka table engine now allows to use alias columns. [#49824](https://github.com/ClickHouse/ClickHouse/pull/49824) ([Aleksandr Musorin](https://github.com/AVMusorin)).
|
||||||
|
* Add setting to limit the max number of pairs produced by `extractKeyValuePairs`, a safeguard to avoid using way too much memory. [#49836](https://github.com/ClickHouse/ClickHouse/pull/49836) ([Arthur Passos](https://github.com/arthurpassos)).
|
||||||
|
* Add support for (an unusual) case where the arguments in the `IN` operator are single-element tuples. [#49844](https://github.com/ClickHouse/ClickHouse/pull/49844) ([MikhailBurdukov](https://github.com/MikhailBurdukov)).
|
||||||
|
* `bitHammingDistance` function support `String` and `FixedString` data type. Closes [#48827](https://github.com/ClickHouse/ClickHouse/issues/48827). [#49858](https://github.com/ClickHouse/ClickHouse/pull/49858) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Fix timeout resetting errors in the client on OS X. [#49863](https://github.com/ClickHouse/ClickHouse/pull/49863) ([alekar](https://github.com/alekar)).
|
||||||
|
* Add support for big integers, such as UInt128, Int128, UInt256, and Int256 in the function `bitCount`. This enables Hamming distance over large bit masks for AI applications. [#49867](https://github.com/ClickHouse/ClickHouse/pull/49867) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fingerprints to be used instead of key IDs in encrypted disks. This simplifies the configuration of encrypted disks. [#49882](https://github.com/ClickHouse/ClickHouse/pull/49882) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Add UUID data type to PostgreSQL. Closes [#49739](https://github.com/ClickHouse/ClickHouse/issues/49739). [#49894](https://github.com/ClickHouse/ClickHouse/pull/49894) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Function `toUnixTimestamp` now accepts `Date` and `Date32` arguments. [#49989](https://github.com/ClickHouse/ClickHouse/pull/49989) ([Victor Krasnov](https://github.com/sirvickr)).
|
||||||
|
* Charge only server memory for dictionaries. [#49995](https://github.com/ClickHouse/ClickHouse/pull/49995) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* The server will allow using the `SQL_*` settings such as `SQL_AUTO_IS_NULL` as no-ops for MySQL compatibility. This closes [#49927](https://github.com/ClickHouse/ClickHouse/issues/49927). [#50013](https://github.com/ClickHouse/ClickHouse/pull/50013) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Preserve initial_query_id for ON CLUSTER queries, which is useful for introspection (under `distributed_ddl_entry_format_version=5`). [#50015](https://github.com/ClickHouse/ClickHouse/pull/50015) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Preserve backward incompatibility for renamed settings by using aliases (`allow_experimental_projection_optimization` for `optimize_use_projections`, `allow_experimental_lightweight_delete` for `enable_lightweight_delete`). [#50044](https://github.com/ClickHouse/ClickHouse/pull/50044) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Support passing FQDN through setting my_hostname to register cluster node in keeper. Add setting of invisible to support multi compute groups. A compute group as a cluster, is invisible to other compute groups. [#50186](https://github.com/ClickHouse/ClickHouse/pull/50186) ([Yangkuan Liu](https://github.com/LiuYangkuan)).
|
||||||
|
* Fix PostgreSQL reading all the data even though `LIMIT n` could be specified. [#50187](https://github.com/ClickHouse/ClickHouse/pull/50187) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Add new profile events for queries with subqueries (`QueriesWithSubqueries`/`SelectQueriesWithSubqueries`/`InsertQueriesWithSubqueries`). [#50204](https://github.com/ClickHouse/ClickHouse/pull/50204) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Adding the roles field in the users.xml file, which allows specifying roles with grants via a config file. [#50278](https://github.com/ClickHouse/ClickHouse/pull/50278) ([pufit](https://github.com/pufit)).
|
||||||
|
* Report `CGroupCpuCfsPeriod` and `CGroupCpuCfsQuota` in AsynchronousMetrics. - Respect cgroup v2 memory limits during server startup. [#50379](https://github.com/ClickHouse/ClickHouse/pull/50379) ([alekar](https://github.com/alekar)).
|
||||||
|
* Add a signal handler for SIGQUIT to work the same way as SIGINT. Closes [#50298](https://github.com/ClickHouse/ClickHouse/issues/50298). [#50435](https://github.com/ClickHouse/ClickHouse/pull/50435) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* In case JSON parse fails due to the large size of the object output the last position to allow debugging. [#50474](https://github.com/ClickHouse/ClickHouse/pull/50474) ([Valentin Alexeev](https://github.com/valentinalexeev)).
|
||||||
|
* Support decimals with not fixed size. Closes [#49130](https://github.com/ClickHouse/ClickHouse/issues/49130). [#50586](https://github.com/ClickHouse/ClickHouse/pull/50586) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
|
||||||
|
#### Build/Testing/Packaging Improvement
|
||||||
|
* New and improved `keeper-bench`. Everything can be customized from YAML/XML file: - request generator - each type of request generator can have a specific set of fields - multi requests can be generated just by doing the same under `multi` key - for each request or subrequest in multi a `weight` field can be defined to control distribution - define trees that need to be setup for a test run - hosts can be defined with all timeouts customizable and it's possible to control how many sessions to generate for each host - integers defined with `min_value` and `max_value` fields are random number generators. [#48547](https://github.com/ClickHouse/ClickHouse/pull/48547) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Io_uring is not supported on macos, don't choose it when running tests on local to avoid occassional failures. [#49250](https://github.com/ClickHouse/ClickHouse/pull/49250) ([Frank Chen](https://github.com/FrankChen021)).
|
||||||
|
* Support named fault injection for testing. [#49361](https://github.com/ClickHouse/ClickHouse/pull/49361) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Allow running ClickHouse in the OS where the `prctl` (process control) syscall is not available, such as AWS Lambda. [#49538](https://github.com/ClickHouse/ClickHouse/pull/49538) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fixed the issue of build conflict between contrib/isa-l and isa-l in qpl [49296](https://github.com/ClickHouse/ClickHouse/issues/49296). [#49584](https://github.com/ClickHouse/ClickHouse/pull/49584) ([jasperzhu](https://github.com/jinjunzh)).
|
||||||
|
* Utilities are now only build if explicitly requested ("-DENABLE_UTILS=1") instead of by default, this reduces link times in typical development builds. [#49620](https://github.com/ClickHouse/ClickHouse/pull/49620) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Pull build description of idxd-config into a separate CMake file to avoid accidental removal in future. [#49651](https://github.com/ClickHouse/ClickHouse/pull/49651) ([jasperzhu](https://github.com/jinjunzh)).
|
||||||
|
* Add CI check with an enabled analyzer in the master. Follow-up [#49562](https://github.com/ClickHouse/ClickHouse/issues/49562). [#49668](https://github.com/ClickHouse/ClickHouse/pull/49668) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Switch to LLVM/clang 16. [#49678](https://github.com/ClickHouse/ClickHouse/pull/49678) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Allow building ClickHouse with clang-17. [#49851](https://github.com/ClickHouse/ClickHouse/pull/49851) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#50410](https://github.com/ClickHouse/ClickHouse/pull/50410) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* ClickHouse is now easier to be integrated into other cmake projects. [#49991](https://github.com/ClickHouse/ClickHouse/pull/49991) ([Amos Bird](https://github.com/amosbird)). (Which is strongly discouraged - Alexey Milovidov).
|
||||||
|
* Fix strange additional QEMU logging after [#47151](https://github.com/ClickHouse/ClickHouse/issues/47151), see https://s3.amazonaws.com/clickhouse-test-reports/50078/a4743996ee4f3583884d07bcd6501df0cfdaa346/stateless_tests__release__databasereplicated__[3_4].html. [#50442](https://github.com/ClickHouse/ClickHouse/pull/50442) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* ClickHouse can work on Linux RISC-V 6.1.22. This closes [#50456](https://github.com/ClickHouse/ClickHouse/issues/50456). [#50457](https://github.com/ClickHouse/ClickHouse/pull/50457) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Bump internal protobuf to v3.18 (fixes bogus CVE-2022-1941). [#50400](https://github.com/ClickHouse/ClickHouse/pull/50400) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Bump internal libxml2 to v2.10.4 (fixes bogus CVE-2023-28484 and bogus CVE-2023-29469). [#50402](https://github.com/ClickHouse/ClickHouse/pull/50402) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Bump c-ares to v1.19.1 (bogus CVE-2023-32067, bogus CVE-2023-31130, bogus CVE-2023-31147). [#50403](https://github.com/ClickHouse/ClickHouse/pull/50403) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix bogus CVE-2022-2469 in libgsasl. [#50404](https://github.com/ClickHouse/ClickHouse/pull/50404) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
|
||||||
|
#### Bug Fix (user-visible misbehavior in an official stable release)
|
||||||
|
|
||||||
|
* ActionsDAG: fix wrong optimization [#47584](https://github.com/ClickHouse/ClickHouse/pull/47584) ([Salvatore Mesoraca](https://github.com/aiven-sal)).
|
||||||
|
* Correctly handle concurrent snapshots in Keeper [#48466](https://github.com/ClickHouse/ClickHouse/pull/48466) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* MergeTreeMarksLoader holds DataPart instead of DataPartStorage [#48515](https://github.com/ClickHouse/ClickHouse/pull/48515) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Sequence state fix [#48603](https://github.com/ClickHouse/ClickHouse/pull/48603) ([Ilya Golshtein](https://github.com/ilejn)).
|
||||||
|
* Back/Restore concurrency check on previous fails [#48726](https://github.com/ClickHouse/ClickHouse/pull/48726) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Fix Attaching a table with non-existent ZK path does not increase the ReadonlyReplica metric [#48954](https://github.com/ClickHouse/ClickHouse/pull/48954) ([wangxiaobo](https://github.com/wzb5212)).
|
||||||
|
* Fix possible terminate called for uncaught exception in some places [#49112](https://github.com/ClickHouse/ClickHouse/pull/49112) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix key not found error for queries with multiple StorageJoin [#49137](https://github.com/ClickHouse/ClickHouse/pull/49137) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Fix wrong query result when using nullable primary key [#49172](https://github.com/ClickHouse/ClickHouse/pull/49172) ([Duc Canh Le](https://github.com/canhld94)).
|
||||||
|
* Fix reinterpretAs*() on big endian machines [#49198](https://github.com/ClickHouse/ClickHouse/pull/49198) ([Suzy Wang](https://github.com/SuzyWangIBMer)).
|
||||||
|
* (Experimental zero-copy replication) Lock zero copy parts more atomically [#49211](https://github.com/ClickHouse/ClickHouse/pull/49211) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix race on Outdated parts loading [#49223](https://github.com/ClickHouse/ClickHouse/pull/49223) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Fix all key value is null and group use rollup return wrong answer [#49282](https://github.com/ClickHouse/ClickHouse/pull/49282) ([Shuai li](https://github.com/loneylee)).
|
||||||
|
* Fix calculating load_factor for HASHED dictionaries with SHARDS [#49319](https://github.com/ClickHouse/ClickHouse/pull/49319) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Disallow configuring compression CODECs for alias columns [#49363](https://github.com/ClickHouse/ClickHouse/pull/49363) ([Timur Solodovnikov](https://github.com/tsolodov)).
|
||||||
|
* Fix bug in removal of existing part directory [#49365](https://github.com/ClickHouse/ClickHouse/pull/49365) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Properly fix GCS when HMAC is used [#49390](https://github.com/ClickHouse/ClickHouse/pull/49390) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix fuzz bug when subquery set is not built when reading from remote() [#49425](https://github.com/ClickHouse/ClickHouse/pull/49425) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Invert `shutdown_wait_unfinished_queries` [#49427](https://github.com/ClickHouse/ClickHouse/pull/49427) ([Konstantin Bogdanov](https://github.com/thevar1able)).
|
||||||
|
* (Experimental zero-copy replication) Fix another zero copy bug [#49473](https://github.com/ClickHouse/ClickHouse/pull/49473) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix postgres database setting [#49481](https://github.com/ClickHouse/ClickHouse/pull/49481) ([Mal Curtis](https://github.com/snikch)).
|
||||||
|
* Correctly handle `s3Cluster` arguments [#49490](https://github.com/ClickHouse/ClickHouse/pull/49490) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix bug in TraceCollector destructor. [#49508](https://github.com/ClickHouse/ClickHouse/pull/49508) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
|
||||||
|
* Fix AsynchronousReadIndirectBufferFromRemoteFS breaking on short seeks [#49525](https://github.com/ClickHouse/ClickHouse/pull/49525) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Fix dictionaries loading order [#49560](https://github.com/ClickHouse/ClickHouse/pull/49560) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Forbid the change of data type of Object('json') column [#49563](https://github.com/ClickHouse/ClickHouse/pull/49563) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Fix stress test (Logical error: Expected 7134 >= 11030) [#49623](https://github.com/ClickHouse/ClickHouse/pull/49623) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix bug in DISTINCT [#49628](https://github.com/ClickHouse/ClickHouse/pull/49628) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix: DISTINCT in order with zero values in non-sorted columns [#49636](https://github.com/ClickHouse/ClickHouse/pull/49636) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Fix one-off error in big integers found by UBSan with fuzzer [#49645](https://github.com/ClickHouse/ClickHouse/pull/49645) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix reading from sparse columns after restart [#49660](https://github.com/ClickHouse/ClickHouse/pull/49660) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix assert in SpanHolder::finish() with fibers [#49673](https://github.com/ClickHouse/ClickHouse/pull/49673) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix short circuit functions and mutations with sparse arguments [#49716](https://github.com/ClickHouse/ClickHouse/pull/49716) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix writing appended files to incremental backups [#49725](https://github.com/ClickHouse/ClickHouse/pull/49725) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Fix "There is no physical column _row_exists in table" error occurring during lightweight delete mutation on a table with Object column. [#49737](https://github.com/ClickHouse/ClickHouse/pull/49737) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Fix msan issue in randomStringUTF8(uneven number) [#49750](https://github.com/ClickHouse/ClickHouse/pull/49750) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix aggregate function kolmogorovSmirnovTest [#49768](https://github.com/ClickHouse/ClickHouse/pull/49768) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)).
|
||||||
|
* Fix settings aliases in native protocol [#49776](https://github.com/ClickHouse/ClickHouse/pull/49776) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix `arrayMap` with array of tuples with single argument [#49789](https://github.com/ClickHouse/ClickHouse/pull/49789) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix per-query IO/BACKUPs throttling settings [#49797](https://github.com/ClickHouse/ClickHouse/pull/49797) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix setting NULL in profile definition [#49831](https://github.com/ClickHouse/ClickHouse/pull/49831) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Fix a bug with projections and the aggregate_functions_null_for_empty setting (for query_plan_optimize_projection) [#49873](https://github.com/ClickHouse/ClickHouse/pull/49873) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* Fix processing pending batch for Distributed async INSERT after restart [#49884](https://github.com/ClickHouse/ClickHouse/pull/49884) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix assertion in CacheMetadata::doCleanup [#49914](https://github.com/ClickHouse/ClickHouse/pull/49914) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* fix `is_prefix` in OptimizeRegularExpression [#49919](https://github.com/ClickHouse/ClickHouse/pull/49919) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Fix metrics `WriteBufferFromS3Bytes`, `WriteBufferFromS3Microseconds` and `WriteBufferFromS3RequestsErrors` [#49930](https://github.com/ClickHouse/ClickHouse/pull/49930) ([Aleksandr Musorin](https://github.com/AVMusorin)).
|
||||||
|
* Fix IPv6 encoding in protobuf [#49933](https://github.com/ClickHouse/ClickHouse/pull/49933) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
|
||||||
|
* Fix possible Logical error on bad Nullable parsing for text formats [#49960](https://github.com/ClickHouse/ClickHouse/pull/49960) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Add setting output_format_parquet_compliant_nested_types to produce more compatible Parquet files [#50001](https://github.com/ClickHouse/ClickHouse/pull/50001) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Fix logical error in stress test "Not enough space to add ..." [#50021](https://github.com/ClickHouse/ClickHouse/pull/50021) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Avoid deadlock when starting table in attach thread of `ReplicatedMergeTree` [#50026](https://github.com/ClickHouse/ClickHouse/pull/50026) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix assert in SpanHolder::finish() with fibers attempt 2 [#50034](https://github.com/ClickHouse/ClickHouse/pull/50034) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Add proper escaping for DDL OpenTelemetry context serialization [#50045](https://github.com/ClickHouse/ClickHouse/pull/50045) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix reporting broken projection parts [#50052](https://github.com/ClickHouse/ClickHouse/pull/50052) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* JIT compilation not equals NaN fix [#50056](https://github.com/ClickHouse/ClickHouse/pull/50056) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Fix crashing in case of Replicated database without arguments [#50058](https://github.com/ClickHouse/ClickHouse/pull/50058) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix crash with `multiIf` and constant condition and nullable arguments [#50123](https://github.com/ClickHouse/ClickHouse/pull/50123) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix invalid index analysis for date related keys [#50153](https://github.com/ClickHouse/ClickHouse/pull/50153) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* do not allow modify order by when there are no order by cols [#50154](https://github.com/ClickHouse/ClickHouse/pull/50154) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Fix broken index analysis when binary operator contains a null constant argument [#50177](https://github.com/ClickHouse/ClickHouse/pull/50177) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* clickhouse-client: disallow usage of `--query` and `--queries-file` at the same time [#50210](https://github.com/ClickHouse/ClickHouse/pull/50210) ([Alexey Gerasimchuk](https://github.com/Demilivor)).
|
||||||
|
* Fix UB for INTO OUTFILE extensions (APPEND / AND STDOUT) and WATCH EVENTS [#50216](https://github.com/ClickHouse/ClickHouse/pull/50216) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix skipping spaces at end of row in CustomSeparatedIgnoreSpaces format [#50224](https://github.com/ClickHouse/ClickHouse/pull/50224) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix iceberg metadata parsing [#50232](https://github.com/ClickHouse/ClickHouse/pull/50232) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix nested distributed SELECT in WITH clause [#50234](https://github.com/ClickHouse/ClickHouse/pull/50234) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix msan issue in keyed siphash [#50245](https://github.com/ClickHouse/ClickHouse/pull/50245) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix bugs in Poco sockets in non-blocking mode, use true non-blocking sockets [#50252](https://github.com/ClickHouse/ClickHouse/pull/50252) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix checksum calculation for backup entries [#50264](https://github.com/ClickHouse/ClickHouse/pull/50264) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Comparison functions NaN fix [#50287](https://github.com/ClickHouse/ClickHouse/pull/50287) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* JIT aggregation nullable key fix [#50291](https://github.com/ClickHouse/ClickHouse/pull/50291) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Fix clickhouse-local crashing when writing empty Arrow or Parquet output [#50328](https://github.com/ClickHouse/ClickHouse/pull/50328) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Fix crash when Pool::Entry::disconnect() is called [#50334](https://github.com/ClickHouse/ClickHouse/pull/50334) ([Val Doroshchuk](https://github.com/valbok)).
|
||||||
|
* Improved fetch part by holding directory lock longer [#50339](https://github.com/ClickHouse/ClickHouse/pull/50339) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Fix bitShift* functions with both constant arguments [#50343](https://github.com/ClickHouse/ClickHouse/pull/50343) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix Keeper deadlock on exception when preprocessing requests. [#50387](https://github.com/ClickHouse/ClickHouse/pull/50387) ([frinkr](https://github.com/frinkr)).
|
||||||
|
* Fix hashing of const integer values [#50421](https://github.com/ClickHouse/ClickHouse/pull/50421) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix merge_tree_min_rows_for_seek/merge_tree_min_bytes_for_seek for data skipping indexes [#50432](https://github.com/ClickHouse/ClickHouse/pull/50432) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Limit the number of in-flight tasks for loading outdated parts [#50450](https://github.com/ClickHouse/ClickHouse/pull/50450) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Keeper fix: apply uncommitted state after snapshot install [#50483](https://github.com/ClickHouse/ClickHouse/pull/50483) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix incorrect constant folding [#50536](https://github.com/ClickHouse/ClickHouse/pull/50536) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix logical error in stress test (Not enough space to add ...) [#50583](https://github.com/ClickHouse/ClickHouse/pull/50583) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix converting Null to LowCardinality(Nullable) in values table function [#50637](https://github.com/ClickHouse/ClickHouse/pull/50637) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Revert invalid RegExpTreeDictionary optimization [#50642](https://github.com/ClickHouse/ClickHouse/pull/50642) ([Johann Gan](https://github.com/johanngan)).
|
||||||
|
|
||||||
### <a id="234"></a> ClickHouse release 23.4, 2023-04-26
|
### <a id="234"></a> ClickHouse release 23.4, 2023-04-26
|
||||||
|
|
||||||
#### Backward Incompatible Change
|
#### Backward Incompatible Change
|
||||||
|
@ -13,9 +13,10 @@ The following versions of ClickHouse server are currently being supported with s
|
|||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
|:-|:-|
|
|:-|:-|
|
||||||
|
| 23.5 | ✔️ |
|
||||||
| 23.4 | ✔️ |
|
| 23.4 | ✔️ |
|
||||||
| 23.3 | ✔️ |
|
| 23.3 | ✔️ |
|
||||||
| 23.2 | ✔️ |
|
| 23.2 | ❌ |
|
||||||
| 23.1 | ❌ |
|
| 23.1 | ❌ |
|
||||||
| 22.12 | ❌ |
|
| 22.12 | ❌ |
|
||||||
| 22.11 | ❌ |
|
| 22.11 | ❌ |
|
||||||
|
@ -117,6 +117,9 @@ public:
|
|||||||
void readRaw(char * buffer, std::streamsize length);
|
void readRaw(char * buffer, std::streamsize length);
|
||||||
/// Reads length bytes of raw data into buffer.
|
/// Reads length bytes of raw data into buffer.
|
||||||
|
|
||||||
|
void readCString(std::string& value);
|
||||||
|
/// Reads zero-terminated C-string into value.
|
||||||
|
|
||||||
void readBOM();
|
void readBOM();
|
||||||
/// Reads a byte-order mark from the stream and configures
|
/// Reads a byte-order mark from the stream and configures
|
||||||
/// the reader for the encountered byte order.
|
/// the reader for the encountered byte order.
|
||||||
|
@ -56,6 +56,8 @@ public:
|
|||||||
LITTLE_ENDIAN_BYTE_ORDER = 3 /// little-endian byte-order
|
LITTLE_ENDIAN_BYTE_ORDER = 3 /// little-endian byte-order
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const std::streamsize DEFAULT_MAX_CSTR_LENGTH { 1024 };
|
||||||
|
|
||||||
BinaryWriter(std::ostream & ostr, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER);
|
BinaryWriter(std::ostream & ostr, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER);
|
||||||
/// Creates the BinaryWriter.
|
/// Creates the BinaryWriter.
|
||||||
|
|
||||||
@ -131,6 +133,9 @@ public:
|
|||||||
void writeRaw(const char * buffer, std::streamsize length);
|
void writeRaw(const char * buffer, std::streamsize length);
|
||||||
/// Writes length raw bytes from the given buffer to the stream.
|
/// Writes length raw bytes from the given buffer to the stream.
|
||||||
|
|
||||||
|
void writeCString(const char* cString, std::streamsize maxLength = DEFAULT_MAX_CSTR_LENGTH);
|
||||||
|
/// Writes zero-terminated C-string.
|
||||||
|
|
||||||
void writeBOM();
|
void writeBOM();
|
||||||
/// Writes a byte-order mark to the stream. A byte order mark is
|
/// Writes a byte-order mark to the stream. A byte order mark is
|
||||||
/// a 16-bit integer with a value of 0xFEFF, written in host byte-order.
|
/// a 16-bit integer with a value of 0xFEFF, written in host byte-order.
|
||||||
|
@ -274,6 +274,31 @@ void BinaryReader::readRaw(char* buffer, std::streamsize length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BinaryReader::readCString(std::string& value)
|
||||||
|
{
|
||||||
|
value.clear();
|
||||||
|
if (!_istr.good())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
value.reserve(256);
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
_istr.get(c);
|
||||||
|
if (!_istr.good())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (c == '\0')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
value += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void BinaryReader::readBOM()
|
void BinaryReader::readBOM()
|
||||||
{
|
{
|
||||||
UInt16 bom;
|
UInt16 bom;
|
||||||
|
@ -271,7 +271,7 @@ BinaryWriter& BinaryWriter::operator << (const std::string& value)
|
|||||||
BinaryWriter& BinaryWriter::operator << (const char* value)
|
BinaryWriter& BinaryWriter::operator << (const char* value)
|
||||||
{
|
{
|
||||||
poco_check_ptr (value);
|
poco_check_ptr (value);
|
||||||
|
|
||||||
if (_pTextConverter)
|
if (_pTextConverter)
|
||||||
{
|
{
|
||||||
std::string converted;
|
std::string converted;
|
||||||
@ -332,6 +332,15 @@ void BinaryWriter::writeRaw(const char* buffer, std::streamsize length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BinaryWriter::writeCString(const char* cString, std::streamsize maxLength)
|
||||||
|
{
|
||||||
|
const std::size_t len = ::strnlen(cString, maxLength);
|
||||||
|
writeRaw(cString, len);
|
||||||
|
static const char zero = '\0';
|
||||||
|
_ostr.write(&zero, sizeof(zero));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void BinaryWriter::writeBOM()
|
void BinaryWriter::writeBOM()
|
||||||
{
|
{
|
||||||
UInt16 value = 0xFEFF;
|
UInt16 value = 0xFEFF;
|
||||||
|
@ -13,3 +13,4 @@ target_compile_options (_poco_mongodb
|
|||||||
|
|
||||||
target_include_directories (_poco_mongodb SYSTEM PUBLIC "include")
|
target_include_directories (_poco_mongodb SYSTEM PUBLIC "include")
|
||||||
target_link_libraries (_poco_mongodb PUBLIC Poco::Net)
|
target_link_libraries (_poco_mongodb PUBLIC Poco::Net)
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ namespace MongoDB
|
|||||||
/// This class represents a BSON Array.
|
/// This class represents a BSON Array.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SharedPtr<Array> Ptr;
|
using Ptr = SharedPtr<Array>;
|
||||||
|
|
||||||
Array();
|
Array();
|
||||||
/// Creates an empty Array.
|
/// Creates an empty Array.
|
||||||
@ -41,8 +41,31 @@ namespace MongoDB
|
|||||||
virtual ~Array();
|
virtual ~Array();
|
||||||
/// Destroys the Array.
|
/// Destroys the Array.
|
||||||
|
|
||||||
|
// Document template functions available for backward compatibility
|
||||||
|
using Document::add;
|
||||||
|
using Document::get;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T get(int pos) const
|
Document & add(T value)
|
||||||
|
/// Creates an element with the name from the current pos and value and
|
||||||
|
/// adds it to the array document.
|
||||||
|
///
|
||||||
|
/// The active document is returned to allow chaining of the add methods.
|
||||||
|
{
|
||||||
|
return Document::add<T>(Poco::NumberFormatter::format(size()), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
Document & add(const char * value)
|
||||||
|
/// Creates an element with a name from the current pos and value and
|
||||||
|
/// adds it to the array document.
|
||||||
|
///
|
||||||
|
/// The active document is returned to allow chaining of the add methods.
|
||||||
|
{
|
||||||
|
return Document::add(Poco::NumberFormatter::format(size()), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T get(std::size_t pos) const
|
||||||
/// Returns the element at the given index and tries to convert
|
/// Returns the element at the given index and tries to convert
|
||||||
/// it to the template type. If the element is not found, a
|
/// it to the template type. If the element is not found, a
|
||||||
/// Poco::NotFoundException will be thrown. If the element cannot be
|
/// Poco::NotFoundException will be thrown. If the element cannot be
|
||||||
@ -52,7 +75,7 @@ namespace MongoDB
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T get(int pos, const T & deflt) const
|
T get(std::size_t pos, const T & deflt) const
|
||||||
/// Returns the element at the given index and tries to convert
|
/// Returns the element at the given index and tries to convert
|
||||||
/// it to the template type. If the element is not found, or
|
/// it to the template type. If the element is not found, or
|
||||||
/// has the wrong type, the deflt argument will be returned.
|
/// has the wrong type, the deflt argument will be returned.
|
||||||
@ -60,12 +83,12 @@ namespace MongoDB
|
|||||||
return Document::get<T>(Poco::NumberFormatter::format(pos), deflt);
|
return Document::get<T>(Poco::NumberFormatter::format(pos), deflt);
|
||||||
}
|
}
|
||||||
|
|
||||||
Element::Ptr get(int pos) const;
|
Element::Ptr get(std::size_t pos) const;
|
||||||
/// Returns the element at the given index.
|
/// Returns the element at the given index.
|
||||||
/// An empty element will be returned if the element is not found.
|
/// An empty element will be returned if the element is not found.
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool isType(int pos) const
|
bool isType(std::size_t pos) const
|
||||||
/// Returns true if the type of the element equals the TypeId of ElementTrait,
|
/// Returns true if the type of the element equals the TypeId of ElementTrait,
|
||||||
/// otherwise false.
|
/// otherwise false.
|
||||||
{
|
{
|
||||||
@ -74,6 +97,9 @@ namespace MongoDB
|
|||||||
|
|
||||||
std::string toString(int indent = 0) const;
|
std::string toString(int indent = 0) const;
|
||||||
/// Returns a string representation of the Array.
|
/// Returns a string representation of the Array.
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend void BSONReader::read<Array::Ptr>(Array::Ptr & to);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ namespace MongoDB
|
|||||||
/// A Binary stores its data in a Poco::Buffer<unsigned char>.
|
/// A Binary stores its data in a Poco::Buffer<unsigned char>.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SharedPtr<Binary> Ptr;
|
using Ptr = SharedPtr<Binary>;
|
||||||
|
|
||||||
Binary();
|
Binary();
|
||||||
/// Creates an empty Binary with subtype 0.
|
/// Creates an empty Binary with subtype 0.
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#define MongoDB_Connection_INCLUDED
|
#define MongoDB_Connection_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/MongoDB/OpMsgMessage.h"
|
||||||
#include "Poco/MongoDB/RequestMessage.h"
|
#include "Poco/MongoDB/RequestMessage.h"
|
||||||
#include "Poco/MongoDB/ResponseMessage.h"
|
#include "Poco/MongoDB/ResponseMessage.h"
|
||||||
#include "Poco/Mutex.h"
|
#include "Poco/Mutex.h"
|
||||||
@ -39,7 +40,7 @@ namespace MongoDB
|
|||||||
/// for more information on the wire protocol.
|
/// for more information on the wire protocol.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef Poco::SharedPtr<Connection> Ptr;
|
using Ptr = Poco::SharedPtr<Connection>;
|
||||||
|
|
||||||
class MongoDB_API SocketFactory
|
class MongoDB_API SocketFactory
|
||||||
{
|
{
|
||||||
@ -90,7 +91,7 @@ namespace MongoDB
|
|||||||
|
|
||||||
Poco::Net::SocketAddress address() const;
|
Poco::Net::SocketAddress address() const;
|
||||||
/// Returns the address of the MongoDB server.
|
/// Returns the address of the MongoDB server.
|
||||||
|
|
||||||
const std::string & uri() const;
|
const std::string & uri() const;
|
||||||
/// Returns the uri on which the connection was made.
|
/// Returns the uri on which the connection was made.
|
||||||
|
|
||||||
@ -145,6 +146,21 @@ namespace MongoDB
|
|||||||
/// Use this when a response is expected: only a "query" or "getmore"
|
/// Use this when a response is expected: only a "query" or "getmore"
|
||||||
/// request will return a response.
|
/// request will return a response.
|
||||||
|
|
||||||
|
void sendRequest(OpMsgMessage & request, OpMsgMessage & response);
|
||||||
|
/// Sends a request to the MongoDB server and receives the response
|
||||||
|
/// using newer wire protocol with OP_MSG.
|
||||||
|
|
||||||
|
void sendRequest(OpMsgMessage & request);
|
||||||
|
/// Sends an unacknowledged request to the MongoDB server using newer
|
||||||
|
/// wire protocol with OP_MSG.
|
||||||
|
/// No response is sent by the server.
|
||||||
|
|
||||||
|
void readResponse(OpMsgMessage & response);
|
||||||
|
/// Reads additional response data when previous message's flag moreToCome
|
||||||
|
/// indicates that server will send more data.
|
||||||
|
/// NOTE: See comments in OpMsgCursor code.
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void connect();
|
void connect();
|
||||||
|
|
||||||
@ -164,7 +180,7 @@ namespace MongoDB
|
|||||||
}
|
}
|
||||||
inline const std::string & Connection::uri() const
|
inline const std::string & Connection::uri() const
|
||||||
{
|
{
|
||||||
return _uri;
|
return _uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,6 +40,9 @@ namespace MongoDB
|
|||||||
Cursor(const std::string & fullCollectionName, QueryRequest::Flags flags = QueryRequest::QUERY_DEFAULT);
|
Cursor(const std::string & fullCollectionName, QueryRequest::Flags flags = QueryRequest::QUERY_DEFAULT);
|
||||||
/// Creates a Cursor for the given database and collection ("database.collection"), using the specified flags.
|
/// Creates a Cursor for the given database and collection ("database.collection"), using the specified flags.
|
||||||
|
|
||||||
|
Cursor(const Document & aggregationResponse);
|
||||||
|
/// Creates a Cursor for the given aggregation query response.
|
||||||
|
|
||||||
virtual ~Cursor();
|
virtual ~Cursor();
|
||||||
/// Destroys the Cursor.
|
/// Destroys the Cursor.
|
||||||
|
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
#include "Poco/MongoDB/QueryRequest.h"
|
#include "Poco/MongoDB/QueryRequest.h"
|
||||||
#include "Poco/MongoDB/UpdateRequest.h"
|
#include "Poco/MongoDB/UpdateRequest.h"
|
||||||
|
|
||||||
|
#include "Poco/MongoDB/OpMsgCursor.h"
|
||||||
|
#include "Poco/MongoDB/OpMsgMessage.h"
|
||||||
|
|
||||||
namespace Poco
|
namespace Poco
|
||||||
{
|
{
|
||||||
@ -45,6 +47,9 @@ namespace MongoDB
|
|||||||
virtual ~Database();
|
virtual ~Database();
|
||||||
/// Destroys the Database.
|
/// Destroys the Database.
|
||||||
|
|
||||||
|
const std::string & name() const;
|
||||||
|
/// Database name
|
||||||
|
|
||||||
bool authenticate(
|
bool authenticate(
|
||||||
Connection & connection,
|
Connection & connection,
|
||||||
const std::string & username,
|
const std::string & username,
|
||||||
@ -62,34 +67,49 @@ namespace MongoDB
|
|||||||
/// May throw a Poco::ProtocolException if authentication fails for a reason other than
|
/// May throw a Poco::ProtocolException if authentication fails for a reason other than
|
||||||
/// invalid credentials.
|
/// invalid credentials.
|
||||||
|
|
||||||
|
Document::Ptr queryBuildInfo(Connection & connection) const;
|
||||||
|
/// Queries server build info (all wire protocols)
|
||||||
|
|
||||||
|
Document::Ptr queryServerHello(Connection & connection) const;
|
||||||
|
/// Queries hello response from server (all wire protocols)
|
||||||
|
|
||||||
Int64 count(Connection & connection, const std::string & collectionName) const;
|
Int64 count(Connection & connection, const std::string & collectionName) const;
|
||||||
/// Sends a count request for the given collection to MongoDB.
|
/// Sends a count request for the given collection to MongoDB. (old wire protocol)
|
||||||
///
|
///
|
||||||
/// If the command fails, -1 is returned.
|
/// If the command fails, -1 is returned.
|
||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> createCommand() const;
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> createCommand() const;
|
||||||
/// Creates a QueryRequest for a command.
|
/// Creates a QueryRequest for a command. (old wire protocol)
|
||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> createCountRequest(const std::string & collectionName) const;
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> createCountRequest(const std::string & collectionName) const;
|
||||||
/// Creates a QueryRequest to count the given collection.
|
/// Creates a QueryRequest to count the given collection.
|
||||||
/// The collectionname must not contain the database name.
|
/// The collectionname must not contain the database name. (old wire protocol)
|
||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::DeleteRequest> createDeleteRequest(const std::string & collectionName) const;
|
Poco::SharedPtr<Poco::MongoDB::DeleteRequest> createDeleteRequest(const std::string & collectionName) const;
|
||||||
/// Creates a DeleteRequest to delete documents in the given collection.
|
/// Creates a DeleteRequest to delete documents in the given collection.
|
||||||
/// The collectionname must not contain the database name.
|
/// The collectionname must not contain the database name. (old wire protocol)
|
||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::InsertRequest> createInsertRequest(const std::string & collectionName) const;
|
Poco::SharedPtr<Poco::MongoDB::InsertRequest> createInsertRequest(const std::string & collectionName) const;
|
||||||
/// Creates an InsertRequest to insert new documents in the given collection.
|
/// Creates an InsertRequest to insert new documents in the given collection.
|
||||||
/// The collectionname must not contain the database name.
|
/// The collectionname must not contain the database name. (old wire protocol)
|
||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> createQueryRequest(const std::string & collectionName) const;
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> createQueryRequest(const std::string & collectionName) const;
|
||||||
/// Creates a QueryRequest.
|
/// Creates a QueryRequest. (old wire protocol)
|
||||||
/// The collectionname must not contain the database name.
|
/// The collectionname must not contain the database name.
|
||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::UpdateRequest> createUpdateRequest(const std::string & collectionName) const;
|
Poco::SharedPtr<Poco::MongoDB::UpdateRequest> createUpdateRequest(const std::string & collectionName) const;
|
||||||
/// Creates an UpdateRequest.
|
/// Creates an UpdateRequest. (old wire protocol)
|
||||||
/// The collectionname must not contain the database name.
|
/// The collectionname must not contain the database name.
|
||||||
|
|
||||||
|
Poco::SharedPtr<Poco::MongoDB::OpMsgMessage> createOpMsgMessage(const std::string & collectionName) const;
|
||||||
|
/// Creates OpMsgMessage. (new wire protocol)
|
||||||
|
|
||||||
|
Poco::SharedPtr<Poco::MongoDB::OpMsgMessage> createOpMsgMessage() const;
|
||||||
|
/// Creates OpMsgMessage for database commands that do not require collection as an argument. (new wire protocol)
|
||||||
|
|
||||||
|
Poco::SharedPtr<Poco::MongoDB::OpMsgCursor> createOpMsgCursor(const std::string & collectionName) const;
|
||||||
|
/// Creates OpMsgCursor. (new wire protocol)
|
||||||
|
|
||||||
Poco::MongoDB::Document::Ptr ensureIndex(
|
Poco::MongoDB::Document::Ptr ensureIndex(
|
||||||
Connection & connection,
|
Connection & connection,
|
||||||
const std::string & collection,
|
const std::string & collection,
|
||||||
@ -100,14 +120,16 @@ namespace MongoDB
|
|||||||
int version = 0,
|
int version = 0,
|
||||||
int ttl = 0);
|
int ttl = 0);
|
||||||
/// Creates an index. The document returned is the result of a getLastError call.
|
/// Creates an index. The document returned is the result of a getLastError call.
|
||||||
/// For more info look at the ensureIndex information on the MongoDB website.
|
/// For more info look at the ensureIndex information on the MongoDB website. (old wire protocol)
|
||||||
|
|
||||||
Document::Ptr getLastErrorDoc(Connection & connection) const;
|
Document::Ptr getLastErrorDoc(Connection & connection) const;
|
||||||
/// Sends the getLastError command to the database and returns the error document.
|
/// Sends the getLastError command to the database and returns the error document.
|
||||||
|
/// (old wire protocol)
|
||||||
|
|
||||||
std::string getLastError(Connection & connection) const;
|
std::string getLastError(Connection & connection) const;
|
||||||
/// Sends the getLastError command to the database and returns the err element
|
/// Sends the getLastError command to the database and returns the err element
|
||||||
/// from the error document. When err is null, an empty string is returned.
|
/// from the error document. When err is null, an empty string is returned.
|
||||||
|
/// (old wire protocol)
|
||||||
|
|
||||||
static const std::string AUTH_MONGODB_CR;
|
static const std::string AUTH_MONGODB_CR;
|
||||||
/// Default authentication mechanism prior to MongoDB 3.0.
|
/// Default authentication mechanism prior to MongoDB 3.0.
|
||||||
@ -115,6 +137,27 @@ namespace MongoDB
|
|||||||
static const std::string AUTH_SCRAM_SHA1;
|
static const std::string AUTH_SCRAM_SHA1;
|
||||||
/// Default authentication mechanism for MongoDB 3.0.
|
/// Default authentication mechanism for MongoDB 3.0.
|
||||||
|
|
||||||
|
enum WireVersion
|
||||||
|
/// Wire version as reported by the command hello.
|
||||||
|
/// See details in MongoDB github, repository specifications.
|
||||||
|
/// @see queryServerHello
|
||||||
|
{
|
||||||
|
VER_26 = 1,
|
||||||
|
VER_26_2 = 2,
|
||||||
|
VER_30 = 3,
|
||||||
|
VER_32 = 4,
|
||||||
|
VER_34 = 5,
|
||||||
|
VER_36 = 6, ///< First wire version that supports OP_MSG
|
||||||
|
VER_40 = 7,
|
||||||
|
VER_42 = 8,
|
||||||
|
VER_44 = 9,
|
||||||
|
VER_50 = 13,
|
||||||
|
VER_51 = 14, ///< First wire version that supports only OP_MSG
|
||||||
|
VER_52 = 15,
|
||||||
|
VER_53 = 16,
|
||||||
|
VER_60 = 17
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool authCR(Connection & connection, const std::string & username, const std::string & password);
|
bool authCR(Connection & connection, const std::string & username, const std::string & password);
|
||||||
bool authSCRAM(Connection & connection, const std::string & username, const std::string & password);
|
bool authSCRAM(Connection & connection, const std::string & username, const std::string & password);
|
||||||
@ -127,6 +170,12 @@ namespace MongoDB
|
|||||||
//
|
//
|
||||||
// inlines
|
// inlines
|
||||||
//
|
//
|
||||||
|
inline const std::string & Database::name() const
|
||||||
|
{
|
||||||
|
return _dbname;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Poco::SharedPtr<Poco::MongoDB::QueryRequest> Database::createCommand() const
|
inline Poco::SharedPtr<Poco::MongoDB::QueryRequest> Database::createCommand() const
|
||||||
{
|
{
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> cmd = createQueryRequest("$cmd");
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> cmd = createQueryRequest("$cmd");
|
||||||
@ -158,6 +207,24 @@ namespace MongoDB
|
|||||||
return new Poco::MongoDB::UpdateRequest(_dbname + '.' + collectionName);
|
return new Poco::MongoDB::UpdateRequest(_dbname + '.' + collectionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -- New wire protocol commands
|
||||||
|
|
||||||
|
inline Poco::SharedPtr<Poco::MongoDB::OpMsgMessage> Database::createOpMsgMessage(const std::string & collectionName) const
|
||||||
|
{
|
||||||
|
return new Poco::MongoDB::OpMsgMessage(_dbname, collectionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Poco::SharedPtr<Poco::MongoDB::OpMsgMessage> Database::createOpMsgMessage() const
|
||||||
|
{
|
||||||
|
// Collection name for database commands is not needed.
|
||||||
|
return createOpMsgMessage("");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Poco::SharedPtr<Poco::MongoDB::OpMsgCursor> Database::createOpMsgCursor(const std::string & collectionName) const
|
||||||
|
{
|
||||||
|
return new Poco::MongoDB::OpMsgCursor(_dbname, collectionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} // namespace Poco::MongoDB
|
} // namespace Poco::MongoDB
|
||||||
|
@ -31,6 +31,7 @@ namespace Poco
|
|||||||
namespace MongoDB
|
namespace MongoDB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class Array;
|
||||||
|
|
||||||
class ElementFindByName
|
class ElementFindByName
|
||||||
{
|
{
|
||||||
@ -48,8 +49,8 @@ namespace MongoDB
|
|||||||
/// Represents a MongoDB (BSON) document.
|
/// Represents a MongoDB (BSON) document.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SharedPtr<Document> Ptr;
|
using Ptr = SharedPtr<Document>;
|
||||||
typedef std::vector<Document::Ptr> Vector;
|
using Vector = std::vector<Document::Ptr>;
|
||||||
|
|
||||||
Document();
|
Document();
|
||||||
/// Creates an empty Document.
|
/// Creates an empty Document.
|
||||||
@ -86,6 +87,10 @@ namespace MongoDB
|
|||||||
/// Unlike the other add methods, this method returns
|
/// Unlike the other add methods, this method returns
|
||||||
/// a reference to the new document.
|
/// a reference to the new document.
|
||||||
|
|
||||||
|
Array & addNewArray(const std::string & name);
|
||||||
|
/// Create a new array and add it to this document.
|
||||||
|
/// Method returns a reference to the new array.
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
/// Removes all elements from the document.
|
/// Removes all elements from the document.
|
||||||
|
|
||||||
@ -95,7 +100,7 @@ namespace MongoDB
|
|||||||
bool empty() const;
|
bool empty() const;
|
||||||
/// Returns true if the document doesn't contain any documents.
|
/// Returns true if the document doesn't contain any documents.
|
||||||
|
|
||||||
bool exists(const std::string & name);
|
bool exists(const std::string & name) const;
|
||||||
/// Returns true if the document has an element with the given name.
|
/// Returns true if the document has an element with the given name.
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -158,6 +163,9 @@ namespace MongoDB
|
|||||||
/// return an Int64. When the element is not found, a
|
/// return an Int64. When the element is not found, a
|
||||||
/// Poco::NotFoundException will be thrown.
|
/// Poco::NotFoundException will be thrown.
|
||||||
|
|
||||||
|
bool remove(const std::string & name);
|
||||||
|
/// Removes an element from the document.
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool isType(const std::string & name) const
|
bool isType(const std::string & name) const
|
||||||
/// Returns true when the type of the element equals the TypeId of ElementTrait.
|
/// Returns true when the type of the element equals the TypeId of ElementTrait.
|
||||||
@ -227,12 +235,23 @@ namespace MongoDB
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Document::exists(const std::string & name)
|
inline bool Document::exists(const std::string & name) const
|
||||||
{
|
{
|
||||||
return std::find_if(_elements.begin(), _elements.end(), ElementFindByName(name)) != _elements.end();
|
return std::find_if(_elements.begin(), _elements.end(), ElementFindByName(name)) != _elements.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Document::remove(const std::string & name)
|
||||||
|
{
|
||||||
|
auto it = std::find_if(_elements.begin(), _elements.end(), ElementFindByName(name));
|
||||||
|
if (it == _elements.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_elements.erase(it);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline std::size_t Document::size() const
|
inline std::size_t Document::size() const
|
||||||
{
|
{
|
||||||
return _elements.size();
|
return _elements.size();
|
||||||
|
@ -45,7 +45,7 @@ namespace MongoDB
|
|||||||
/// Represents an Element of a Document or an Array.
|
/// Represents an Element of a Document or an Array.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef Poco::SharedPtr<Element> Ptr;
|
using Ptr = Poco::SharedPtr<Element>;
|
||||||
|
|
||||||
explicit Element(const std::string & name);
|
explicit Element(const std::string & name);
|
||||||
/// Creates the Element with the given name.
|
/// Creates the Element with the given name.
|
||||||
@ -80,7 +80,7 @@ namespace MongoDB
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef std::list<Element::Ptr> ElementSet;
|
using ElementSet = std::list<Element::Ptr>;
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -266,7 +266,7 @@ namespace MongoDB
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef Nullable<unsigned char> NullValue;
|
using NullValue = Nullable<unsigned char>;
|
||||||
|
|
||||||
|
|
||||||
// BSON Null Value
|
// BSON Null Value
|
||||||
|
@ -35,7 +35,7 @@ namespace MongoDB
|
|||||||
/// Represents JavaScript type in BSON.
|
/// Represents JavaScript type in BSON.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SharedPtr<JavaScriptCode> Ptr;
|
using Ptr = SharedPtr<JavaScriptCode>;
|
||||||
|
|
||||||
JavaScriptCode();
|
JavaScriptCode();
|
||||||
/// Creates an empty JavaScriptCode object.
|
/// Creates an empty JavaScriptCode object.
|
||||||
|
@ -28,6 +28,9 @@ namespace MongoDB
|
|||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class Message; // Required to disambiguate friend declaration in MessageHeader.
|
||||||
|
|
||||||
|
|
||||||
class MongoDB_API MessageHeader
|
class MongoDB_API MessageHeader
|
||||||
/// Represents the message header which is always prepended to a
|
/// Represents the message header which is always prepended to a
|
||||||
/// MongoDB request or response message.
|
/// MongoDB request or response message.
|
||||||
@ -37,14 +40,18 @@ namespace MongoDB
|
|||||||
|
|
||||||
enum OpCode
|
enum OpCode
|
||||||
{
|
{
|
||||||
|
// Opcodes deprecated in MongoDB 5.0
|
||||||
OP_REPLY = 1,
|
OP_REPLY = 1,
|
||||||
OP_MSG = 1000,
|
|
||||||
OP_UPDATE = 2001,
|
OP_UPDATE = 2001,
|
||||||
OP_INSERT = 2002,
|
OP_INSERT = 2002,
|
||||||
OP_QUERY = 2004,
|
OP_QUERY = 2004,
|
||||||
OP_GET_MORE = 2005,
|
OP_GET_MORE = 2005,
|
||||||
OP_DELETE = 2006,
|
OP_DELETE = 2006,
|
||||||
OP_KILL_CURSORS = 2007
|
OP_KILL_CURSORS = 2007,
|
||||||
|
|
||||||
|
/// Opcodes supported in MongoDB 5.1 and later
|
||||||
|
OP_COMPRESSED = 2012,
|
||||||
|
OP_MSG = 2013
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit MessageHeader(OpCode);
|
explicit MessageHeader(OpCode);
|
||||||
|
@ -33,6 +33,13 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(POCO_DLL)
|
||||||
|
# if defined(MongoDB_EXPORTS)
|
||||||
|
# define MongoDB_API __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define MongoDB_API __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if !defined(MongoDB_API)
|
#if !defined(MongoDB_API)
|
||||||
@ -47,6 +54,11 @@
|
|||||||
//
|
//
|
||||||
// Automatically link MongoDB library.
|
// Automatically link MongoDB library.
|
||||||
//
|
//
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# if !defined(POCO_NO_AUTOMATIC_LIBS) && !defined(MongoDB_EXPORTS)
|
||||||
|
# pragma comment(lib, "PocoMongoDB" POCO_LIB_SUFFIX)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif // MongoDBMongoDB_INCLUDED
|
#endif // MongoDBMongoDB_INCLUDED
|
||||||
|
@ -44,7 +44,7 @@ namespace MongoDB
|
|||||||
/// as its value.
|
/// as its value.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SharedPtr<ObjectId> Ptr;
|
using Ptr = SharedPtr<ObjectId>;
|
||||||
|
|
||||||
explicit ObjectId(const std::string & id);
|
explicit ObjectId(const std::string & id);
|
||||||
/// Creates an ObjectId from a string.
|
/// Creates an ObjectId from a string.
|
||||||
|
96
base/poco/MongoDB/include/Poco/MongoDB/OpMsgCursor.h
Normal file
96
base/poco/MongoDB/include/Poco/MongoDB/OpMsgCursor.h
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
//
|
||||||
|
// OpMsgCursor.h
|
||||||
|
//
|
||||||
|
// Library: MongoDB
|
||||||
|
// Package: MongoDB
|
||||||
|
// Module: OpMsgCursor
|
||||||
|
//
|
||||||
|
// Definition of the OpMsgCursor class.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MongoDB_OpMsgCursor_INCLUDED
|
||||||
|
#define MongoDB_OpMsgCursor_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/MongoDB/Connection.h"
|
||||||
|
#include "Poco/MongoDB/MongoDB.h"
|
||||||
|
#include "Poco/MongoDB/OpMsgMessage.h"
|
||||||
|
|
||||||
|
namespace Poco
|
||||||
|
{
|
||||||
|
namespace MongoDB
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class MongoDB_API OpMsgCursor : public Document
|
||||||
|
/// OpMsgCursor is an helper class for querying multiple documents using OpMsgMessage.
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OpMsgCursor(const std::string & dbname, const std::string & collectionName);
|
||||||
|
/// Creates a OpMsgCursor for the given database and collection.
|
||||||
|
|
||||||
|
virtual ~OpMsgCursor();
|
||||||
|
/// Destroys the OpMsgCursor.
|
||||||
|
|
||||||
|
void setEmptyFirstBatch(bool empty);
|
||||||
|
/// Empty first batch is used to get error response faster with little server processing
|
||||||
|
|
||||||
|
bool emptyFirstBatch() const;
|
||||||
|
|
||||||
|
void setBatchSize(Int32 batchSize);
|
||||||
|
/// Set non-default batch size
|
||||||
|
|
||||||
|
Int32 batchSize() const;
|
||||||
|
/// Current batch size (zero or negative number indicates default batch size)
|
||||||
|
|
||||||
|
Int64 cursorID() const;
|
||||||
|
|
||||||
|
OpMsgMessage & next(Connection & connection);
|
||||||
|
/// Tries to get the next documents. As long as response message has a
|
||||||
|
/// cursor ID next can be called to retrieve the next bunch of documents.
|
||||||
|
///
|
||||||
|
/// The cursor must be killed (see kill()) when not all documents are needed.
|
||||||
|
|
||||||
|
OpMsgMessage & query();
|
||||||
|
/// Returns the associated query.
|
||||||
|
|
||||||
|
void kill(Connection & connection);
|
||||||
|
/// Kills the cursor and reset it so that it can be reused.
|
||||||
|
|
||||||
|
private:
|
||||||
|
OpMsgMessage _query;
|
||||||
|
OpMsgMessage _response;
|
||||||
|
|
||||||
|
bool _emptyFirstBatch{false};
|
||||||
|
Int32 _batchSize{-1};
|
||||||
|
/// Batch size used in the cursor. Zero or negative value means that default shall be used.
|
||||||
|
|
||||||
|
Int64 _cursorID{0};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// inlines
|
||||||
|
//
|
||||||
|
inline OpMsgMessage & OpMsgCursor::query()
|
||||||
|
{
|
||||||
|
return _query;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Int64 OpMsgCursor::cursorID() const
|
||||||
|
{
|
||||||
|
return _cursorID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
} // namespace Poco::MongoDB
|
||||||
|
|
||||||
|
|
||||||
|
#endif // MongoDB_OpMsgCursor_INCLUDED
|
163
base/poco/MongoDB/include/Poco/MongoDB/OpMsgMessage.h
Normal file
163
base/poco/MongoDB/include/Poco/MongoDB/OpMsgMessage.h
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
//
|
||||||
|
// OpMsgMessage.h
|
||||||
|
//
|
||||||
|
// Library: MongoDB
|
||||||
|
// Package: MongoDB
|
||||||
|
// Module: OpMsgMessage
|
||||||
|
//
|
||||||
|
// Definition of the OpMsgMessage class.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2022, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MongoDB_OpMsgMessage_INCLUDED
|
||||||
|
#define MongoDB_OpMsgMessage_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/MongoDB/Document.h"
|
||||||
|
#include "Poco/MongoDB/Message.h"
|
||||||
|
#include "Poco/MongoDB/MongoDB.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Poco
|
||||||
|
{
|
||||||
|
namespace MongoDB
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class MongoDB_API OpMsgMessage : public Message
|
||||||
|
/// This class represents a request/response (OP_MSG) to send requests and receive responses to/from MongoDB.
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Constants for most often used MongoDB commands that can be sent using OP_MSG
|
||||||
|
// For complete list see: https://www.mongodb.com/docs/manual/reference/command/
|
||||||
|
|
||||||
|
// Query and write
|
||||||
|
static const std::string CMD_INSERT;
|
||||||
|
static const std::string CMD_DELETE;
|
||||||
|
static const std::string CMD_UPDATE;
|
||||||
|
static const std::string CMD_FIND;
|
||||||
|
static const std::string CMD_FIND_AND_MODIFY;
|
||||||
|
static const std::string CMD_GET_MORE;
|
||||||
|
|
||||||
|
// Aggregation
|
||||||
|
static const std::string CMD_AGGREGATE;
|
||||||
|
static const std::string CMD_COUNT;
|
||||||
|
static const std::string CMD_DISTINCT;
|
||||||
|
static const std::string CMD_MAP_REDUCE;
|
||||||
|
|
||||||
|
// Replication and administration
|
||||||
|
static const std::string CMD_HELLO;
|
||||||
|
static const std::string CMD_REPL_SET_GET_STATUS;
|
||||||
|
static const std::string CMD_REPL_SET_GET_CONFIG;
|
||||||
|
|
||||||
|
static const std::string CMD_CREATE;
|
||||||
|
static const std::string CMD_CREATE_INDEXES;
|
||||||
|
static const std::string CMD_DROP;
|
||||||
|
static const std::string CMD_DROP_DATABASE;
|
||||||
|
static const std::string CMD_KILL_CURSORS;
|
||||||
|
static const std::string CMD_LIST_DATABASES;
|
||||||
|
static const std::string CMD_LIST_INDEXES;
|
||||||
|
|
||||||
|
// Diagnostic
|
||||||
|
static const std::string CMD_BUILD_INFO;
|
||||||
|
static const std::string CMD_COLL_STATS;
|
||||||
|
static const std::string CMD_DB_STATS;
|
||||||
|
static const std::string CMD_HOST_INFO;
|
||||||
|
|
||||||
|
|
||||||
|
enum Flags : UInt32
|
||||||
|
{
|
||||||
|
MSG_FLAGS_DEFAULT = 0,
|
||||||
|
|
||||||
|
MSG_CHECKSUM_PRESENT = (1 << 0),
|
||||||
|
|
||||||
|
MSG_MORE_TO_COME = (1 << 1),
|
||||||
|
/// Sender will send another message and is not prepared for overlapping messages
|
||||||
|
|
||||||
|
MSG_EXHAUST_ALLOWED = (1 << 16)
|
||||||
|
/// Client is prepared for multiple replies (using the moreToCome bit) to this request
|
||||||
|
};
|
||||||
|
|
||||||
|
OpMsgMessage();
|
||||||
|
/// Creates an OpMsgMessage for response.
|
||||||
|
|
||||||
|
OpMsgMessage(const std::string & databaseName, const std::string & collectionName, UInt32 flags = MSG_FLAGS_DEFAULT);
|
||||||
|
/// Creates an OpMsgMessage for requests.
|
||||||
|
|
||||||
|
virtual ~OpMsgMessage();
|
||||||
|
|
||||||
|
const std::string & databaseName() const;
|
||||||
|
|
||||||
|
const std::string & collectionName() const;
|
||||||
|
|
||||||
|
void setCommandName(const std::string & command);
|
||||||
|
/// Sets the command name and clears the command document
|
||||||
|
|
||||||
|
void setCursor(Poco::Int64 cursorID, Poco::Int32 batchSize = -1);
|
||||||
|
/// Sets the command "getMore" for the cursor id with batch size (if it is not negative).
|
||||||
|
|
||||||
|
const std::string & commandName() const;
|
||||||
|
/// Current command name.
|
||||||
|
|
||||||
|
void setAcknowledgedRequest(bool ack);
|
||||||
|
/// Set false to create request that does not return response.
|
||||||
|
/// It has effect only for commands that write or delete documents.
|
||||||
|
/// Default is true (request returns acknowledge response).
|
||||||
|
|
||||||
|
bool acknowledgedRequest() const;
|
||||||
|
|
||||||
|
UInt32 flags() const;
|
||||||
|
|
||||||
|
Document & body();
|
||||||
|
/// Access to body document.
|
||||||
|
/// Additional query arguments shall be added after setting the command name.
|
||||||
|
|
||||||
|
const Document & body() const;
|
||||||
|
|
||||||
|
Document::Vector & documents();
|
||||||
|
/// Documents prepared for request or retrieved in response.
|
||||||
|
|
||||||
|
const Document::Vector & documents() const;
|
||||||
|
/// Documents prepared for request or retrieved in response.
|
||||||
|
|
||||||
|
bool responseOk() const;
|
||||||
|
/// Reads "ok" status from the response message.
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
/// Clears the message.
|
||||||
|
|
||||||
|
void send(std::ostream & ostr);
|
||||||
|
/// Writes the request to stream.
|
||||||
|
|
||||||
|
void read(std::istream & istr);
|
||||||
|
/// Reads the response from the stream.
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum PayloadType : UInt8
|
||||||
|
{
|
||||||
|
PAYLOAD_TYPE_0 = 0,
|
||||||
|
PAYLOAD_TYPE_1 = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string _databaseName;
|
||||||
|
std::string _collectionName;
|
||||||
|
UInt32 _flags{MSG_FLAGS_DEFAULT};
|
||||||
|
std::string _commandName;
|
||||||
|
bool _acknowledged{true};
|
||||||
|
|
||||||
|
Document _body;
|
||||||
|
Document::Vector _documents;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
} // namespace Poco::MongoDB
|
||||||
|
|
||||||
|
|
||||||
|
#endif // MongoDB_OpMsgMessage_INCLUDED
|
@ -94,7 +94,23 @@ namespace MongoDB
|
|||||||
|
|
||||||
operator Connection::Ptr() { return _connection; }
|
operator Connection::Ptr() { return _connection; }
|
||||||
|
|
||||||
|
#if defined(POCO_ENABLE_CPP11)
|
||||||
|
// Disable copy to prevent unwanted release of resources: C++11 way
|
||||||
|
PooledConnection(const PooledConnection &) = delete;
|
||||||
|
PooledConnection & operator=(const PooledConnection &) = delete;
|
||||||
|
|
||||||
|
// Enable move semantics
|
||||||
|
PooledConnection(PooledConnection && other) = default;
|
||||||
|
PooledConnection & operator=(PooledConnection &&) = default;
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#if !defined(POCO_ENABLE_CPP11)
|
||||||
|
// Disable copy to prevent unwanted release of resources: pre C++11 way
|
||||||
|
PooledConnection(const PooledConnection &);
|
||||||
|
PooledConnection & operator=(const PooledConnection &);
|
||||||
|
#endif
|
||||||
|
|
||||||
Poco::ObjectPool<Connection, Connection::Ptr> & _pool;
|
Poco::ObjectPool<Connection, Connection::Ptr> & _pool;
|
||||||
Connection::Ptr _connection;
|
Connection::Ptr _connection;
|
||||||
};
|
};
|
||||||
|
@ -33,7 +33,7 @@ namespace MongoDB
|
|||||||
/// Represents a regular expression in BSON format.
|
/// Represents a regular expression in BSON format.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SharedPtr<RegularExpression> Ptr;
|
using Ptr = SharedPtr<RegularExpression>;
|
||||||
|
|
||||||
RegularExpression();
|
RegularExpression();
|
||||||
/// Creates an empty RegularExpression.
|
/// Creates an empty RegularExpression.
|
||||||
|
@ -38,6 +38,9 @@ namespace MongoDB
|
|||||||
ResponseMessage();
|
ResponseMessage();
|
||||||
/// Creates an empty ResponseMessage.
|
/// Creates an empty ResponseMessage.
|
||||||
|
|
||||||
|
ResponseMessage(const Int64 & cursorID);
|
||||||
|
/// Creates an ResponseMessage for existing cursor ID.
|
||||||
|
|
||||||
virtual ~ResponseMessage();
|
virtual ~ResponseMessage();
|
||||||
/// Destroys the ResponseMessage.
|
/// Destroys the ResponseMessage.
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ namespace Poco {
|
|||||||
namespace MongoDB {
|
namespace MongoDB {
|
||||||
|
|
||||||
|
|
||||||
Array::Array():
|
Array::Array():
|
||||||
Document()
|
Document()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -31,7 +31,7 @@ Array::~Array()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Element::Ptr Array::get(int pos) const
|
Element::Ptr Array::get(std::size_t pos) const
|
||||||
{
|
{
|
||||||
std::string name = Poco::NumberFormatter::format(pos);
|
std::string name = Poco::NumberFormatter::format(pos);
|
||||||
return Document::get(name);
|
return Document::get(name);
|
||||||
|
@ -319,4 +319,30 @@ void Connection::sendRequest(RequestMessage& request, ResponseMessage& response)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Connection::sendRequest(OpMsgMessage& request, OpMsgMessage& response)
|
||||||
|
{
|
||||||
|
Poco::Net::SocketOutputStream sos(_socket);
|
||||||
|
request.send(sos);
|
||||||
|
|
||||||
|
response.clear();
|
||||||
|
readResponse(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Connection::sendRequest(OpMsgMessage& request)
|
||||||
|
{
|
||||||
|
request.setAcknowledgedRequest(false);
|
||||||
|
Poco::Net::SocketOutputStream sos(_socket);
|
||||||
|
request.send(sos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Connection::readResponse(OpMsgMessage& response)
|
||||||
|
{
|
||||||
|
Poco::Net::SocketInputStream sis(_socket);
|
||||||
|
response.read(sis);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} } // Poco::MongoDB
|
} } // Poco::MongoDB
|
||||||
|
@ -33,6 +33,12 @@ Cursor::Cursor(const std::string& fullCollectionName, QueryRequest::Flags flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Cursor::Cursor(const Document& aggregationResponse) :
|
||||||
|
_query(aggregationResponse.get<Poco::MongoDB::Document::Ptr>("cursor")->get<std::string>("ns")),
|
||||||
|
_response(aggregationResponse.get<Poco::MongoDB::Document::Ptr>("cursor")->get<Int64>("id"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
Cursor::~Cursor()
|
Cursor::~Cursor()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -334,6 +334,50 @@ bool Database::authSCRAM(Connection& connection, const std::string& username, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Document::Ptr Database::queryBuildInfo(Connection& connection) const
|
||||||
|
{
|
||||||
|
// build info can be issued on "config" system database
|
||||||
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = createCommand();
|
||||||
|
request->selector().add("buildInfo", 1);
|
||||||
|
|
||||||
|
Poco::MongoDB::ResponseMessage response;
|
||||||
|
connection.sendRequest(*request, response);
|
||||||
|
|
||||||
|
Document::Ptr buildInfo;
|
||||||
|
if ( response.documents().size() > 0 )
|
||||||
|
{
|
||||||
|
buildInfo = response.documents()[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw Poco::ProtocolException("Didn't get a response from the buildinfo command");
|
||||||
|
}
|
||||||
|
return buildInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Document::Ptr Database::queryServerHello(Connection& connection) const
|
||||||
|
{
|
||||||
|
// hello can be issued on "config" system database
|
||||||
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = createCommand();
|
||||||
|
request->selector().add("hello", 1);
|
||||||
|
|
||||||
|
Poco::MongoDB::ResponseMessage response;
|
||||||
|
connection.sendRequest(*request, response);
|
||||||
|
|
||||||
|
Document::Ptr hello;
|
||||||
|
if ( response.documents().size() > 0 )
|
||||||
|
{
|
||||||
|
hello = response.documents()[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw Poco::ProtocolException("Didn't get a response from the hello command");
|
||||||
|
}
|
||||||
|
return hello;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Int64 Database::count(Connection& connection, const std::string& collectionName) const
|
Int64 Database::count(Connection& connection, const std::string& collectionName) const
|
||||||
{
|
{
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> countRequest = createCountRequest(collectionName);
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> countRequest = createCountRequest(collectionName);
|
||||||
@ -390,7 +434,7 @@ Document::Ptr Database::getLastErrorDoc(Connection& connection) const
|
|||||||
{
|
{
|
||||||
Document::Ptr errorDoc;
|
Document::Ptr errorDoc;
|
||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = createQueryRequest("$cmd");
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = createCommand();
|
||||||
request->setNumberToReturn(1);
|
request->setNumberToReturn(1);
|
||||||
request->selector().add("getLastError", 1);
|
request->selector().add("getLastError", 1);
|
||||||
|
|
||||||
@ -420,7 +464,7 @@ std::string Database::getLastError(Connection& connection) const
|
|||||||
|
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> Database::createCountRequest(const std::string& collectionName) const
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> Database::createCountRequest(const std::string& collectionName) const
|
||||||
{
|
{
|
||||||
Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = createQueryRequest("$cmd");
|
Poco::SharedPtr<Poco::MongoDB::QueryRequest> request = createCommand();
|
||||||
request->setNumberToReturn(1);
|
request->setNumberToReturn(1);
|
||||||
request->selector().add("count", collectionName);
|
request->selector().add("count", collectionName);
|
||||||
return request;
|
return request;
|
||||||
|
@ -20,8 +20,8 @@ namespace MongoDB {
|
|||||||
|
|
||||||
|
|
||||||
DeleteRequest::DeleteRequest(const std::string& collectionName, DeleteRequest::Flags flags):
|
DeleteRequest::DeleteRequest(const std::string& collectionName, DeleteRequest::Flags flags):
|
||||||
RequestMessage(MessageHeader::OP_DELETE),
|
RequestMessage(MessageHeader::OP_DELETE),
|
||||||
_flags(flags),
|
_flags(flags),
|
||||||
_fullCollectionName(collectionName),
|
_fullCollectionName(collectionName),
|
||||||
_selector()
|
_selector()
|
||||||
{
|
{
|
||||||
|
@ -35,6 +35,14 @@ Document::~Document()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Array& Document::addNewArray(const std::string& name)
|
||||||
|
{
|
||||||
|
Array::Ptr newArray = new Array();
|
||||||
|
add(name, newArray);
|
||||||
|
return *newArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Element::Ptr Document::get(const std::string& name) const
|
Element::Ptr Document::get(const std::string& name) const
|
||||||
{
|
{
|
||||||
Element::Ptr element;
|
Element::Ptr element;
|
||||||
@ -84,7 +92,7 @@ void Document::read(BinaryReader& reader)
|
|||||||
while (type != '\0')
|
while (type != '\0')
|
||||||
{
|
{
|
||||||
Element::Ptr element;
|
Element::Ptr element;
|
||||||
|
|
||||||
std::string name = BSONReader(reader).readCString();
|
std::string name = BSONReader(reader).readCString();
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
@ -198,7 +206,7 @@ void Document::write(BinaryWriter& writer)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::stringstream sstream;
|
std::stringstream sstream;
|
||||||
Poco::BinaryWriter tempWriter(sstream);
|
Poco::BinaryWriter tempWriter(sstream, BinaryWriter::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
for (ElementSet::iterator it = _elements.begin(); it != _elements.end(); ++it)
|
for (ElementSet::iterator it = _elements.begin(); it != _elements.end(); ++it)
|
||||||
{
|
{
|
||||||
tempWriter << static_cast<unsigned char>((*it)->type());
|
tempWriter << static_cast<unsigned char>((*it)->type());
|
||||||
@ -207,7 +215,7 @@ void Document::write(BinaryWriter& writer)
|
|||||||
element->write(tempWriter);
|
element->write(tempWriter);
|
||||||
}
|
}
|
||||||
tempWriter.flush();
|
tempWriter.flush();
|
||||||
|
|
||||||
Poco::Int32 len = static_cast<Poco::Int32>(5 + sstream.tellp()); /* 5 = sizeof(len) + 0-byte */
|
Poco::Int32 len = static_cast<Poco::Int32>(5 + sstream.tellp()); /* 5 = sizeof(len) + 0-byte */
|
||||||
writer << len;
|
writer << len;
|
||||||
writer.writeRaw(sstream.str());
|
writer.writeRaw(sstream.str());
|
||||||
|
@ -24,7 +24,7 @@ Element::Element(const std::string& name) : _name(name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Element::~Element()
|
Element::~Element()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ namespace MongoDB {
|
|||||||
|
|
||||||
|
|
||||||
GetMoreRequest::GetMoreRequest(const std::string& collectionName, Int64 cursorID):
|
GetMoreRequest::GetMoreRequest(const std::string& collectionName, Int64 cursorID):
|
||||||
RequestMessage(MessageHeader::OP_GET_MORE),
|
RequestMessage(MessageHeader::OP_GET_MORE),
|
||||||
_fullCollectionName(collectionName),
|
_fullCollectionName(collectionName),
|
||||||
_numberToReturn(100),
|
_numberToReturn(100),
|
||||||
_cursorID(cursorID)
|
_cursorID(cursorID)
|
||||||
|
@ -20,7 +20,7 @@ namespace MongoDB {
|
|||||||
|
|
||||||
|
|
||||||
InsertRequest::InsertRequest(const std::string& collectionName, Flags flags):
|
InsertRequest::InsertRequest(const std::string& collectionName, Flags flags):
|
||||||
RequestMessage(MessageHeader::OP_INSERT),
|
RequestMessage(MessageHeader::OP_INSERT),
|
||||||
_flags(flags),
|
_flags(flags),
|
||||||
_fullCollectionName(collectionName)
|
_fullCollectionName(collectionName)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@ void KillCursorsRequest::buildRequest(BinaryWriter& writer)
|
|||||||
for (std::vector<Int64>::iterator it = _cursors.begin(); it != _cursors.end(); ++it)
|
for (std::vector<Int64>::iterator it = _cursors.begin(); it != _cursors.end(); ++it)
|
||||||
{
|
{
|
||||||
writer << *it;
|
writer << *it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ namespace Poco {
|
|||||||
namespace MongoDB {
|
namespace MongoDB {
|
||||||
|
|
||||||
|
|
||||||
Message::Message(MessageHeader::OpCode opcode):
|
Message::Message(MessageHeader::OpCode opcode):
|
||||||
_header(opcode)
|
_header(opcode)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -20,10 +20,10 @@ namespace Poco {
|
|||||||
namespace MongoDB {
|
namespace MongoDB {
|
||||||
|
|
||||||
|
|
||||||
MessageHeader::MessageHeader(OpCode opCode):
|
MessageHeader::MessageHeader(OpCode opCode):
|
||||||
_messageLength(0),
|
_messageLength(0),
|
||||||
_requestID(0),
|
_requestID(0),
|
||||||
_responseTo(0),
|
_responseTo(0),
|
||||||
_opCode(opCode)
|
_opCode(opCode)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -42,7 +42,7 @@ void MessageHeader::read(BinaryReader& reader)
|
|||||||
|
|
||||||
Int32 opCode;
|
Int32 opCode;
|
||||||
reader >> opCode;
|
reader >> opCode;
|
||||||
_opCode = (OpCode) opCode;
|
_opCode = static_cast<OpCode>(opCode);
|
||||||
|
|
||||||
if (!reader.good())
|
if (!reader.good())
|
||||||
{
|
{
|
||||||
@ -56,7 +56,7 @@ void MessageHeader::write(BinaryWriter& writer)
|
|||||||
writer << _messageLength;
|
writer << _messageLength;
|
||||||
writer << _requestID;
|
writer << _requestID;
|
||||||
writer << _responseTo;
|
writer << _responseTo;
|
||||||
writer << (Int32) _opCode;
|
writer << static_cast<Int32>(_opCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ ObjectId::ObjectId(const std::string& id)
|
|||||||
poco_assert_dbg(id.size() == 24);
|
poco_assert_dbg(id.size() == 24);
|
||||||
|
|
||||||
const char* p = id.c_str();
|
const char* p = id.c_str();
|
||||||
for (std::size_t i = 0; i < 12; ++i)
|
for (std::size_t i = 0; i < 12; ++i)
|
||||||
{
|
{
|
||||||
_id[i] = fromHex(p);
|
_id[i] = fromHex(p);
|
||||||
p += 2;
|
p += 2;
|
||||||
|
187
base/poco/MongoDB/src/OpMsgCursor.cpp
Normal file
187
base/poco/MongoDB/src/OpMsgCursor.cpp
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
//
|
||||||
|
// OpMsgCursor.cpp
|
||||||
|
//
|
||||||
|
// Library: MongoDB
|
||||||
|
// Package: MongoDB
|
||||||
|
// Module: OpMsgCursor
|
||||||
|
//
|
||||||
|
// Copyright (c) 2022, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/MongoDB/OpMsgCursor.h"
|
||||||
|
#include "Poco/MongoDB/Array.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE:
|
||||||
|
//
|
||||||
|
// MongoDB specification indicates that the flag MSG_EXHAUST_ALLOWED shall be
|
||||||
|
// used in the request when the receiver is ready to receive multiple messages
|
||||||
|
// without sending additional requests in between. Sender (MongoDB) indicates
|
||||||
|
// that more messages follow with flag MSG_MORE_TO_COME.
|
||||||
|
//
|
||||||
|
// It seems that this does not work properly. MSG_MORE_TO_COME is set and reading
|
||||||
|
// next messages sometimes works, however often the data is missing in response
|
||||||
|
// or the message header contains wrong message length and reading blocks.
|
||||||
|
// Opcode in the header is correct.
|
||||||
|
//
|
||||||
|
// Using MSG_EXHAUST_ALLOWED is therefore currently disabled.
|
||||||
|
//
|
||||||
|
// It seems that related JIRA ticket is:
|
||||||
|
//
|
||||||
|
// https://jira.mongodb.org/browse/SERVER-57297
|
||||||
|
//
|
||||||
|
// https://github.com/mongodb/specifications/blob/master/source/message/OP_MSG.rst
|
||||||
|
//
|
||||||
|
|
||||||
|
#define MONGODB_EXHAUST_ALLOWED_WORKS false
|
||||||
|
|
||||||
|
namespace Poco {
|
||||||
|
namespace MongoDB {
|
||||||
|
|
||||||
|
|
||||||
|
static const std::string keyCursor {"cursor"};
|
||||||
|
static const std::string keyFirstBatch {"firstBatch"};
|
||||||
|
static const std::string keyNextBatch {"nextBatch"};
|
||||||
|
|
||||||
|
static Poco::Int64 cursorIdFromResponse(const MongoDB::Document& doc);
|
||||||
|
|
||||||
|
|
||||||
|
OpMsgCursor::OpMsgCursor(const std::string& db, const std::string& collection):
|
||||||
|
#if MONGODB_EXHAUST_ALLOWED_WORKS
|
||||||
|
_query(db, collection, OpMsgMessage::MSG_EXHAUST_ALLOWED)
|
||||||
|
#else
|
||||||
|
_query(db, collection)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
OpMsgCursor::~OpMsgCursor()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
poco_assert_dbg(_cursorID == 0);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgCursor::setEmptyFirstBatch(bool empty)
|
||||||
|
{
|
||||||
|
_emptyFirstBatch = empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool OpMsgCursor::emptyFirstBatch() const
|
||||||
|
{
|
||||||
|
return _emptyFirstBatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgCursor::setBatchSize(Int32 batchSize)
|
||||||
|
{
|
||||||
|
_batchSize = batchSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Int32 OpMsgCursor::batchSize() const
|
||||||
|
{
|
||||||
|
return _batchSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
OpMsgMessage& OpMsgCursor::next(Connection& connection)
|
||||||
|
{
|
||||||
|
if (_cursorID == 0)
|
||||||
|
{
|
||||||
|
_response.clear();
|
||||||
|
|
||||||
|
if (_emptyFirstBatch || _batchSize > 0)
|
||||||
|
{
|
||||||
|
Int32 bsize = _emptyFirstBatch ? 0 : _batchSize;
|
||||||
|
if (_query.commandName() == OpMsgMessage::CMD_FIND)
|
||||||
|
{
|
||||||
|
_query.body().add("batchSize", bsize);
|
||||||
|
}
|
||||||
|
else if (_query.commandName() == OpMsgMessage::CMD_AGGREGATE)
|
||||||
|
{
|
||||||
|
auto& cursorDoc = _query.body().addNewDocument("cursor");
|
||||||
|
cursorDoc.add("batchSize", bsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
connection.sendRequest(_query, _response);
|
||||||
|
|
||||||
|
const auto& rdoc = _response.body();
|
||||||
|
_cursorID = cursorIdFromResponse(rdoc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if MONGODB_EXHAUST_ALLOWED_WORKS
|
||||||
|
std::cout << "Response flags: " << _response.flags() << std::endl;
|
||||||
|
if (_response.flags() & OpMsgMessage::MSG_MORE_TO_COME)
|
||||||
|
{
|
||||||
|
std::cout << "More to come. Reading more response: " << std::endl;
|
||||||
|
_response.clear();
|
||||||
|
connection.readResponse(_response);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
_response.clear();
|
||||||
|
_query.setCursor(_cursorID, _batchSize);
|
||||||
|
connection.sendRequest(_query, _response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& rdoc = _response.body();
|
||||||
|
_cursorID = cursorIdFromResponse(rdoc);
|
||||||
|
|
||||||
|
return _response;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgCursor::kill(Connection& connection)
|
||||||
|
{
|
||||||
|
_response.clear();
|
||||||
|
if (_cursorID != 0)
|
||||||
|
{
|
||||||
|
_query.setCommandName(OpMsgMessage::CMD_KILL_CURSORS);
|
||||||
|
|
||||||
|
MongoDB::Array::Ptr cursors = new MongoDB::Array();
|
||||||
|
cursors->add<Poco::Int64>(_cursorID);
|
||||||
|
_query.body().add("cursors", cursors);
|
||||||
|
|
||||||
|
connection.sendRequest(_query, _response);
|
||||||
|
|
||||||
|
const auto killed = _response.body().get<MongoDB::Array::Ptr>("cursorsKilled", nullptr);
|
||||||
|
if (!killed || killed->size() != 1 || killed->get<Poco::Int64>(0, -1) != _cursorID)
|
||||||
|
{
|
||||||
|
throw Poco::ProtocolException("Cursor not killed as expected: " + std::to_string(_cursorID));
|
||||||
|
}
|
||||||
|
|
||||||
|
_cursorID = 0;
|
||||||
|
_query.clear();
|
||||||
|
_response.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Poco::Int64 cursorIdFromResponse(const MongoDB::Document& doc)
|
||||||
|
{
|
||||||
|
Poco::Int64 id {0};
|
||||||
|
auto cursorDoc = doc.get<Document::Ptr>(keyCursor, nullptr);
|
||||||
|
if(cursorDoc)
|
||||||
|
{
|
||||||
|
id = cursorDoc->get<Poco::Int64>("id", 0);
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} } // Namespace Poco::MongoDB
|
412
base/poco/MongoDB/src/OpMsgMessage.cpp
Normal file
412
base/poco/MongoDB/src/OpMsgMessage.cpp
Normal file
@ -0,0 +1,412 @@
|
|||||||
|
//
|
||||||
|
// OpMsgMessage.cpp
|
||||||
|
//
|
||||||
|
// Library: MongoDB
|
||||||
|
// Package: MongoDB
|
||||||
|
// Module: OpMsgMessage
|
||||||
|
//
|
||||||
|
// Copyright (c) 2022, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Poco/MongoDB/OpMsgMessage.h"
|
||||||
|
#include "Poco/MongoDB/MessageHeader.h"
|
||||||
|
#include "Poco/MongoDB/Array.h"
|
||||||
|
#include "Poco/StreamCopier.h"
|
||||||
|
#include "Poco/Logger.h"
|
||||||
|
|
||||||
|
#define POCO_MONGODB_DUMP false
|
||||||
|
|
||||||
|
namespace Poco {
|
||||||
|
namespace MongoDB {
|
||||||
|
|
||||||
|
// Query and write
|
||||||
|
const std::string OpMsgMessage::CMD_INSERT { "insert" };
|
||||||
|
const std::string OpMsgMessage::CMD_DELETE { "delete" };
|
||||||
|
const std::string OpMsgMessage::CMD_UPDATE { "update" };
|
||||||
|
const std::string OpMsgMessage::CMD_FIND { "find" };
|
||||||
|
const std::string OpMsgMessage::CMD_FIND_AND_MODIFY { "findAndModify" };
|
||||||
|
const std::string OpMsgMessage::CMD_GET_MORE { "getMore" };
|
||||||
|
|
||||||
|
// Aggregation
|
||||||
|
const std::string OpMsgMessage::CMD_AGGREGATE { "aggregate" };
|
||||||
|
const std::string OpMsgMessage::CMD_COUNT { "count" };
|
||||||
|
const std::string OpMsgMessage::CMD_DISTINCT { "distinct" };
|
||||||
|
const std::string OpMsgMessage::CMD_MAP_REDUCE { "mapReduce" };
|
||||||
|
|
||||||
|
// Replication and administration
|
||||||
|
const std::string OpMsgMessage::CMD_HELLO { "hello" };
|
||||||
|
const std::string OpMsgMessage::CMD_REPL_SET_GET_STATUS { "replSetGetStatus" };
|
||||||
|
const std::string OpMsgMessage::CMD_REPL_SET_GET_CONFIG { "replSetGetConfig" };
|
||||||
|
|
||||||
|
const std::string OpMsgMessage::CMD_CREATE { "create" };
|
||||||
|
const std::string OpMsgMessage::CMD_CREATE_INDEXES { "createIndexes" };
|
||||||
|
const std::string OpMsgMessage::CMD_DROP { "drop" };
|
||||||
|
const std::string OpMsgMessage::CMD_DROP_DATABASE { "dropDatabase" };
|
||||||
|
const std::string OpMsgMessage::CMD_KILL_CURSORS { "killCursors" };
|
||||||
|
const std::string OpMsgMessage::CMD_LIST_DATABASES { "listDatabases" };
|
||||||
|
const std::string OpMsgMessage::CMD_LIST_INDEXES { "listIndexes" };
|
||||||
|
|
||||||
|
// Diagnostic
|
||||||
|
const std::string OpMsgMessage::CMD_BUILD_INFO { "buildInfo" };
|
||||||
|
const std::string OpMsgMessage::CMD_COLL_STATS { "collStats" };
|
||||||
|
const std::string OpMsgMessage::CMD_DB_STATS { "dbStats" };
|
||||||
|
const std::string OpMsgMessage::CMD_HOST_INFO { "hostInfo" };
|
||||||
|
|
||||||
|
|
||||||
|
static const std::string& commandIdentifier(const std::string& command);
|
||||||
|
/// Commands have different names for the payload that is sent in a separate section
|
||||||
|
|
||||||
|
|
||||||
|
static const std::string keyCursor {"cursor"};
|
||||||
|
static const std::string keyFirstBatch {"firstBatch"};
|
||||||
|
static const std::string keyNextBatch {"nextBatch"};
|
||||||
|
|
||||||
|
|
||||||
|
OpMsgMessage::OpMsgMessage() :
|
||||||
|
Message(MessageHeader::OP_MSG)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
OpMsgMessage::OpMsgMessage(const std::string& databaseName, const std::string& collectionName, UInt32 flags) :
|
||||||
|
Message(MessageHeader::OP_MSG),
|
||||||
|
_databaseName(databaseName),
|
||||||
|
_collectionName(collectionName),
|
||||||
|
_flags(flags)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
OpMsgMessage::~OpMsgMessage()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& OpMsgMessage::databaseName() const
|
||||||
|
{
|
||||||
|
return _databaseName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const std::string& OpMsgMessage::collectionName() const
|
||||||
|
{
|
||||||
|
return _collectionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgMessage::setCommandName(const std::string& command)
|
||||||
|
{
|
||||||
|
_commandName = command;
|
||||||
|
_body.clear();
|
||||||
|
|
||||||
|
// IMPORTANT: Command name must be first
|
||||||
|
if (_collectionName.empty())
|
||||||
|
{
|
||||||
|
// Collection is not specified. It is assumed that this particular command does
|
||||||
|
// not need it.
|
||||||
|
_body.add(_commandName, Int32(1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_body.add(_commandName, _collectionName);
|
||||||
|
}
|
||||||
|
_body.add("$db", _databaseName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgMessage::setCursor(Poco::Int64 cursorID, Poco::Int32 batchSize)
|
||||||
|
{
|
||||||
|
_commandName = OpMsgMessage::CMD_GET_MORE;
|
||||||
|
_body.clear();
|
||||||
|
|
||||||
|
// IMPORTANT: Command name must be first
|
||||||
|
_body.add(_commandName, cursorID);
|
||||||
|
_body.add("$db", _databaseName);
|
||||||
|
_body.add("collection", _collectionName);
|
||||||
|
if (batchSize > 0)
|
||||||
|
{
|
||||||
|
_body.add("batchSize", batchSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const std::string& OpMsgMessage::commandName() const
|
||||||
|
{
|
||||||
|
return _commandName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgMessage::setAcknowledgedRequest(bool ack)
|
||||||
|
{
|
||||||
|
const auto& id = commandIdentifier(_commandName);
|
||||||
|
if (id.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
_acknowledged = ack;
|
||||||
|
|
||||||
|
auto writeConcern = _body.get<Document::Ptr>("writeConcern", nullptr);
|
||||||
|
if (writeConcern)
|
||||||
|
writeConcern->remove("w");
|
||||||
|
|
||||||
|
if (ack)
|
||||||
|
{
|
||||||
|
_flags = _flags & (~MSG_MORE_TO_COME);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_flags = _flags | MSG_MORE_TO_COME;
|
||||||
|
if (!writeConcern)
|
||||||
|
_body.addNewDocument("writeConcern").add("w", 0);
|
||||||
|
else
|
||||||
|
writeConcern->add("w", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool OpMsgMessage::acknowledgedRequest() const
|
||||||
|
{
|
||||||
|
return _acknowledged;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UInt32 OpMsgMessage::flags() const
|
||||||
|
{
|
||||||
|
return _flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Document& OpMsgMessage::body()
|
||||||
|
{
|
||||||
|
return _body;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const Document& OpMsgMessage::body() const
|
||||||
|
{
|
||||||
|
return _body;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Document::Vector& OpMsgMessage::documents()
|
||||||
|
{
|
||||||
|
return _documents;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const Document::Vector& OpMsgMessage::documents() const
|
||||||
|
{
|
||||||
|
return _documents;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool OpMsgMessage::responseOk() const
|
||||||
|
{
|
||||||
|
Poco::Int64 ok {false};
|
||||||
|
if (_body.exists("ok"))
|
||||||
|
{
|
||||||
|
ok = _body.getInteger("ok");
|
||||||
|
}
|
||||||
|
return (ok != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgMessage::clear()
|
||||||
|
{
|
||||||
|
_flags = MSG_FLAGS_DEFAULT;
|
||||||
|
_commandName.clear();
|
||||||
|
_body.clear();
|
||||||
|
_documents.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgMessage::send(std::ostream& ostr)
|
||||||
|
{
|
||||||
|
BinaryWriter socketWriter(ostr, BinaryWriter::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
|
|
||||||
|
// Serialise the body
|
||||||
|
std::stringstream ss;
|
||||||
|
BinaryWriter writer(ss, BinaryWriter::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
|
writer << _flags;
|
||||||
|
|
||||||
|
writer << PAYLOAD_TYPE_0;
|
||||||
|
_body.write(writer);
|
||||||
|
|
||||||
|
if (!_documents.empty())
|
||||||
|
{
|
||||||
|
// Serialise attached documents
|
||||||
|
|
||||||
|
std::stringstream ssdoc;
|
||||||
|
BinaryWriter wdoc(ssdoc, BinaryWriter::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
|
for (auto& doc: _documents)
|
||||||
|
{
|
||||||
|
doc->write(wdoc);
|
||||||
|
}
|
||||||
|
wdoc.flush();
|
||||||
|
|
||||||
|
const std::string& identifier = commandIdentifier(_commandName);
|
||||||
|
const Poco::Int32 size = static_cast<Poco::Int32>(sizeof(size) + identifier.size() + 1 + ssdoc.tellp());
|
||||||
|
writer << PAYLOAD_TYPE_1;
|
||||||
|
writer << size;
|
||||||
|
writer.writeCString(identifier.c_str());
|
||||||
|
StreamCopier::copyStream(ssdoc, ss);
|
||||||
|
}
|
||||||
|
writer.flush();
|
||||||
|
|
||||||
|
#if POCO_MONGODB_DUMP
|
||||||
|
const std::string section = ss.str();
|
||||||
|
std::string dump;
|
||||||
|
Logger::formatDump(dump, section.data(), section.length());
|
||||||
|
std::cout << dump << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
messageLength(static_cast<Poco::Int32>(ss.tellp()));
|
||||||
|
|
||||||
|
_header.write(socketWriter);
|
||||||
|
StreamCopier::copyStream(ss, ostr);
|
||||||
|
|
||||||
|
ostr.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OpMsgMessage::read(std::istream& istr)
|
||||||
|
{
|
||||||
|
std::string message;
|
||||||
|
{
|
||||||
|
BinaryReader reader(istr, BinaryReader::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
|
_header.read(reader);
|
||||||
|
|
||||||
|
poco_assert_dbg(_header.opCode() == _header.OP_MSG);
|
||||||
|
|
||||||
|
const std::streamsize remainingSize {_header.getMessageLength() - _header.MSG_HEADER_SIZE };
|
||||||
|
message.reserve(remainingSize);
|
||||||
|
|
||||||
|
#if POCO_MONGODB_DUMP
|
||||||
|
std::cout
|
||||||
|
<< "Message hdr: " << _header.getMessageLength() << " " << remainingSize << " "
|
||||||
|
<< _header.opCode() << " " << _header.getRequestID() << " " << _header.responseTo()
|
||||||
|
<< std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
reader.readRaw(remainingSize, message);
|
||||||
|
|
||||||
|
#if POCO_MONGODB_DUMP
|
||||||
|
std::string dump;
|
||||||
|
Logger::formatDump(dump, message.data(), message.length());
|
||||||
|
std::cout << dump << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
// Read complete message and then interpret it.
|
||||||
|
|
||||||
|
std::istringstream msgss(message);
|
||||||
|
BinaryReader reader(msgss, BinaryReader::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
|
|
||||||
|
Poco::UInt8 payloadType {0xFF};
|
||||||
|
|
||||||
|
reader >> _flags;
|
||||||
|
reader >> payloadType;
|
||||||
|
poco_assert_dbg(payloadType == PAYLOAD_TYPE_0);
|
||||||
|
|
||||||
|
_body.read(reader);
|
||||||
|
|
||||||
|
// Read next sections from the buffer
|
||||||
|
while (msgss.good())
|
||||||
|
{
|
||||||
|
// NOTE: Not tested yet with database, because it returns everything in the body.
|
||||||
|
// Does MongoDB ever return documents as Payload type 1?
|
||||||
|
reader >> payloadType;
|
||||||
|
if (!msgss.good())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
poco_assert_dbg(payloadType == PAYLOAD_TYPE_1);
|
||||||
|
#if POCO_MONGODB_DUMP
|
||||||
|
std::cout << "section payload: " << payloadType << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Poco::Int32 sectionSize {0};
|
||||||
|
reader >> sectionSize;
|
||||||
|
poco_assert_dbg(sectionSize > 0);
|
||||||
|
|
||||||
|
#if POCO_MONGODB_DUMP
|
||||||
|
std::cout << "section size: " << sectionSize << std::endl;
|
||||||
|
#endif
|
||||||
|
std::streamoff offset = sectionSize - sizeof(sectionSize);
|
||||||
|
std::streampos endOfSection = msgss.tellg() + offset;
|
||||||
|
|
||||||
|
std::string identifier;
|
||||||
|
reader.readCString(identifier);
|
||||||
|
#if POCO_MONGODB_DUMP
|
||||||
|
std::cout << "section identifier: " << identifier << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Loop to read documents from this section.
|
||||||
|
while (msgss.tellg() < endOfSection)
|
||||||
|
{
|
||||||
|
#if POCO_MONGODB_DUMP
|
||||||
|
std::cout << "section doc: " << msgss.tellg() << " " << endOfSection << std::endl;
|
||||||
|
#endif
|
||||||
|
Document::Ptr doc = new Document();
|
||||||
|
doc->read(reader);
|
||||||
|
_documents.push_back(doc);
|
||||||
|
if (msgss.tellg() < 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract documents from the cursor batch if they are there.
|
||||||
|
MongoDB::Array::Ptr batch;
|
||||||
|
auto curDoc = _body.get<MongoDB::Document::Ptr>(keyCursor, nullptr);
|
||||||
|
if (curDoc)
|
||||||
|
{
|
||||||
|
batch = curDoc->get<MongoDB::Array::Ptr>(keyFirstBatch, nullptr);
|
||||||
|
if (!batch)
|
||||||
|
{
|
||||||
|
batch = curDoc->get<MongoDB::Array::Ptr>(keyNextBatch, nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (batch)
|
||||||
|
{
|
||||||
|
for(std::size_t i = 0; i < batch->size(); i++)
|
||||||
|
{
|
||||||
|
const auto& d = batch->get<MongoDB::Document::Ptr>(i, nullptr);
|
||||||
|
if (d)
|
||||||
|
{
|
||||||
|
_documents.push_back(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& commandIdentifier(const std::string& command)
|
||||||
|
{
|
||||||
|
// Names of identifiers for commands that send bulk documents in the request
|
||||||
|
// The identifier is set in the section type 1.
|
||||||
|
static std::map<std::string, std::string> identifiers {
|
||||||
|
{ OpMsgMessage::CMD_INSERT, "documents" },
|
||||||
|
{ OpMsgMessage::CMD_DELETE, "deletes" },
|
||||||
|
{ OpMsgMessage::CMD_UPDATE, "updates" },
|
||||||
|
|
||||||
|
// Not sure if create index can send document section
|
||||||
|
{ OpMsgMessage::CMD_CREATE_INDEXES, "indexes" }
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto i = identifiers.find(command);
|
||||||
|
if (i != identifiers.end())
|
||||||
|
{
|
||||||
|
return i->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This likely means that documents are incorrectly set for a command
|
||||||
|
// that does not send list of documents in section type 1.
|
||||||
|
static const std::string emptyIdentifier;
|
||||||
|
return emptyIdentifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} } // namespace Poco::MongoDB
|
@ -20,10 +20,10 @@ namespace MongoDB {
|
|||||||
|
|
||||||
|
|
||||||
QueryRequest::QueryRequest(const std::string& collectionName, QueryRequest::Flags flags):
|
QueryRequest::QueryRequest(const std::string& collectionName, QueryRequest::Flags flags):
|
||||||
RequestMessage(MessageHeader::OP_QUERY),
|
RequestMessage(MessageHeader::OP_QUERY),
|
||||||
_flags(flags),
|
_flags(flags),
|
||||||
_fullCollectionName(collectionName),
|
_fullCollectionName(collectionName),
|
||||||
_numberToSkip(0),
|
_numberToSkip(0),
|
||||||
_numberToReturn(100),
|
_numberToReturn(100),
|
||||||
_selector(),
|
_selector(),
|
||||||
_returnFieldSelector()
|
_returnFieldSelector()
|
||||||
|
@ -25,8 +25,8 @@ RegularExpression::RegularExpression()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RegularExpression::RegularExpression(const std::string& pattern, const std::string& options):
|
RegularExpression::RegularExpression(const std::string& pattern, const std::string& options):
|
||||||
_pattern(pattern),
|
_pattern(pattern),
|
||||||
_options(options)
|
_options(options)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ namespace Poco {
|
|||||||
namespace MongoDB {
|
namespace MongoDB {
|
||||||
|
|
||||||
|
|
||||||
ReplicaSet::ReplicaSet(const std::vector<Net::SocketAddress> &addresses):
|
ReplicaSet::ReplicaSet(const std::vector<Net::SocketAddress> &addresses):
|
||||||
_addresses(addresses)
|
_addresses(addresses)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -81,8 +81,8 @@ Connection::Ptr ReplicaSet::isMaster(const Net::SocketAddress& address)
|
|||||||
{
|
{
|
||||||
conn = 0;
|
conn = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ namespace Poco {
|
|||||||
namespace MongoDB {
|
namespace MongoDB {
|
||||||
|
|
||||||
|
|
||||||
RequestMessage::RequestMessage(MessageHeader::OpCode opcode):
|
RequestMessage::RequestMessage(MessageHeader::OpCode opcode):
|
||||||
Message(opcode)
|
Message(opcode)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ RequestMessage::~RequestMessage()
|
|||||||
void RequestMessage::send(std::ostream& ostr)
|
void RequestMessage::send(std::ostream& ostr)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
BinaryWriter requestWriter(ss);
|
BinaryWriter requestWriter(ss, BinaryWriter::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
buildRequest(requestWriter);
|
buildRequest(requestWriter);
|
||||||
requestWriter.flush();
|
requestWriter.flush();
|
||||||
|
|
||||||
|
@ -21,10 +21,20 @@ namespace MongoDB {
|
|||||||
|
|
||||||
|
|
||||||
ResponseMessage::ResponseMessage():
|
ResponseMessage::ResponseMessage():
|
||||||
Message(MessageHeader::OP_REPLY),
|
Message(MessageHeader::OP_REPLY),
|
||||||
_responseFlags(0),
|
_responseFlags(0),
|
||||||
_cursorID(0),
|
_cursorID(0),
|
||||||
_startingFrom(0),
|
_startingFrom(0),
|
||||||
|
_numberReturned(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ResponseMessage::ResponseMessage(const Int64& cursorID):
|
||||||
|
Message(MessageHeader::OP_REPLY),
|
||||||
|
_responseFlags(0),
|
||||||
|
_cursorID(cursorID),
|
||||||
|
_startingFrom(0),
|
||||||
_numberReturned(0)
|
_numberReturned(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -50,7 +60,7 @@ void ResponseMessage::read(std::istream& istr)
|
|||||||
clear();
|
clear();
|
||||||
|
|
||||||
BinaryReader reader(istr, BinaryReader::LITTLE_ENDIAN_BYTE_ORDER);
|
BinaryReader reader(istr, BinaryReader::LITTLE_ENDIAN_BYTE_ORDER);
|
||||||
|
|
||||||
_header.read(reader);
|
_header.read(reader);
|
||||||
|
|
||||||
reader >> _responseFlags;
|
reader >> _responseFlags;
|
||||||
|
@ -20,7 +20,7 @@ namespace MongoDB {
|
|||||||
|
|
||||||
|
|
||||||
UpdateRequest::UpdateRequest(const std::string& collectionName, UpdateRequest::Flags flags):
|
UpdateRequest::UpdateRequest(const std::string& collectionName, UpdateRequest::Flags flags):
|
||||||
RequestMessage(MessageHeader::OP_UPDATE),
|
RequestMessage(MessageHeader::OP_UPDATE),
|
||||||
_flags(flags),
|
_flags(flags),
|
||||||
_fullCollectionName(collectionName),
|
_fullCollectionName(collectionName),
|
||||||
_selector(),
|
_selector(),
|
||||||
|
@ -127,6 +127,9 @@ namespace Net
|
|||||||
|
|
||||||
void setResolvedHost(std::string resolved_host) { _resolved_host.swap(resolved_host); }
|
void setResolvedHost(std::string resolved_host) { _resolved_host.swap(resolved_host); }
|
||||||
|
|
||||||
|
std::string getResolvedHost() const { return _resolved_host; }
|
||||||
|
/// Returns the resolved IP address of the target HTTP server.
|
||||||
|
|
||||||
Poco::UInt16 getPort() const;
|
Poco::UInt16 getPort() const;
|
||||||
/// Returns the port number of the target HTTP server.
|
/// Returns the port number of the target HTTP server.
|
||||||
|
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
# NOTE: has nothing common with DBMS_TCP_PROTOCOL_VERSION,
|
# NOTE: has nothing common with DBMS_TCP_PROTOCOL_VERSION,
|
||||||
# only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes.
|
# only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes.
|
||||||
SET(VERSION_REVISION 54474)
|
SET(VERSION_REVISION 54475)
|
||||||
SET(VERSION_MAJOR 23)
|
SET(VERSION_MAJOR 23)
|
||||||
SET(VERSION_MINOR 5)
|
SET(VERSION_MINOR 6)
|
||||||
SET(VERSION_PATCH 1)
|
SET(VERSION_PATCH 1)
|
||||||
SET(VERSION_GITHASH 3920eb987f7ed837ada5de8907284adf123f0583)
|
SET(VERSION_GITHASH 2fec796e73efda10a538a03af3205ce8ffa1b2de)
|
||||||
SET(VERSION_DESCRIBE v23.5.1.1-testing)
|
SET(VERSION_DESCRIBE v23.6.1.1-testing)
|
||||||
SET(VERSION_STRING 23.5.1.1)
|
SET(VERSION_STRING 23.6.1.1)
|
||||||
# end of autochange
|
# end of autochange
|
||||||
|
2
contrib/NuRaft
vendored
2
contrib/NuRaft
vendored
@ -1 +1 @@
|
|||||||
Subproject commit b56784be1aec568fb72aff47f281097c017623cb
|
Subproject commit 491eaf592d950e0e37accbe8b3f217e068c9fecf
|
@ -1,6 +1,6 @@
|
|||||||
option (ENABLE_AZURE_BLOB_STORAGE "Enable Azure blob storage" ${ENABLE_LIBRARIES})
|
option (ENABLE_AZURE_BLOB_STORAGE "Enable Azure blob storage" ${ENABLE_LIBRARIES})
|
||||||
|
|
||||||
if (NOT ENABLE_AZURE_BLOB_STORAGE OR BUILD_STANDALONE_KEEPER OR OS_FREEBSD)
|
if (NOT ENABLE_AZURE_BLOB_STORAGE OR BUILD_STANDALONE_KEEPER OR OS_FREEBSD OR (NOT ARCH_AMD64))
|
||||||
message(STATUS "Not using Azure blob storage")
|
message(STATUS "Not using Azure blob storage")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
2
contrib/lz4
vendored
2
contrib/lz4
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 4c9431e9af596af0556e5da0ae99305bafb2b10b
|
Subproject commit e82198428c8061372d5adef1f9bfff4203f6081e
|
@ -32,7 +32,7 @@ RUN arch=${TARGETARCH:-amd64} \
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
ARG REPOSITORY="https://s3.amazonaws.com/clickhouse-builds/22.4/31c367d3cd3aefd316778601ff6565119fe36682/package_release"
|
ARG REPOSITORY="https://s3.amazonaws.com/clickhouse-builds/22.4/31c367d3cd3aefd316778601ff6565119fe36682/package_release"
|
||||||
ARG VERSION="23.4.2.11"
|
ARG VERSION="23.5.2.7"
|
||||||
ARG PACKAGES="clickhouse-keeper"
|
ARG PACKAGES="clickhouse-keeper"
|
||||||
|
|
||||||
# user/group precreated explicitly with fixed uid/gid on purpose.
|
# user/group precreated explicitly with fixed uid/gid on purpose.
|
||||||
|
@ -33,7 +33,7 @@ RUN arch=${TARGETARCH:-amd64} \
|
|||||||
# lts / testing / prestable / etc
|
# lts / testing / prestable / etc
|
||||||
ARG REPO_CHANNEL="stable"
|
ARG REPO_CHANNEL="stable"
|
||||||
ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}"
|
ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}"
|
||||||
ARG VERSION="23.4.2.11"
|
ARG VERSION="23.5.2.7"
|
||||||
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
||||||
|
|
||||||
# user/group precreated explicitly with fixed uid/gid on purpose.
|
# user/group precreated explicitly with fixed uid/gid on purpose.
|
||||||
|
@ -22,7 +22,7 @@ RUN sed -i "s|http://archive.ubuntu.com|${apt_archive}|g" /etc/apt/sources.list
|
|||||||
|
|
||||||
ARG REPO_CHANNEL="stable"
|
ARG REPO_CHANNEL="stable"
|
||||||
ARG REPOSITORY="deb https://packages.clickhouse.com/deb ${REPO_CHANNEL} main"
|
ARG REPOSITORY="deb https://packages.clickhouse.com/deb ${REPO_CHANNEL} main"
|
||||||
ARG VERSION="23.4.2.11"
|
ARG VERSION="23.5.2.7"
|
||||||
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static"
|
||||||
|
|
||||||
# set non-empty deb_location_url url to create a docker image
|
# set non-empty deb_location_url url to create a docker image
|
||||||
|
@ -16,6 +16,11 @@ For more information and documentation see https://clickhouse.com/.
|
|||||||
- The tag `head` is built from the latest commit to the default branch.
|
- The tag `head` is built from the latest commit to the default branch.
|
||||||
- Each tag has optional `-alpine` suffix to reflect that it's built on top of `alpine`.
|
- Each tag has optional `-alpine` suffix to reflect that it's built on top of `alpine`.
|
||||||
|
|
||||||
|
### Compatibility
|
||||||
|
|
||||||
|
- The amd64 image requires support for [SSE3 instructions](https://en.wikipedia.org/wiki/SSE3). Virtually all x86 CPUs after 2005 support SSE3.
|
||||||
|
- The arm64 image requires support for the [ARMv8.2-A architecture](https://en.wikipedia.org/wiki/AArch64#ARMv8.2-A). Most ARM CPUs after 2017 support ARMv8.2-A. A notable exception is Raspberry Pi 4 from 2019 whose CPU only supports ARMv8.0-A.
|
||||||
|
|
||||||
## How to use this image
|
## How to use this image
|
||||||
|
|
||||||
### start server instance
|
### start server instance
|
||||||
|
@ -59,12 +59,6 @@ install_packages previous_release_package_folder
|
|||||||
# available for dump via clickhouse-local
|
# available for dump via clickhouse-local
|
||||||
configure
|
configure
|
||||||
|
|
||||||
# local_blob_storage disk type does not exist in older versions
|
|
||||||
sudo cat /etc/clickhouse-server/config.d/storage_conf.xml \
|
|
||||||
| sed "s|<type>local_blob_storage</type>|<type>local</type>|" \
|
|
||||||
> /etc/clickhouse-server/config.d/storage_conf.xml.tmp
|
|
||||||
sudo mv /etc/clickhouse-server/config.d/storage_conf.xml.tmp /etc/clickhouse-server/config.d/storage_conf.xml
|
|
||||||
|
|
||||||
# it contains some new settings, but we can safely remove it
|
# it contains some new settings, but we can safely remove it
|
||||||
rm /etc/clickhouse-server/config.d/merge_tree.xml
|
rm /etc/clickhouse-server/config.d/merge_tree.xml
|
||||||
|
|
||||||
@ -92,11 +86,6 @@ export USE_S3_STORAGE_FOR_MERGE_TREE=1
|
|||||||
export ZOOKEEPER_FAULT_INJECTION=0
|
export ZOOKEEPER_FAULT_INJECTION=0
|
||||||
configure
|
configure
|
||||||
|
|
||||||
sudo cat /etc/clickhouse-server/config.d/storage_conf.xml \
|
|
||||||
| sed "s|<type>local_blob_storage</type>|<type>local</type>|" \
|
|
||||||
> /etc/clickhouse-server/config.d/storage_conf.xml.tmp
|
|
||||||
sudo mv /etc/clickhouse-server/config.d/storage_conf.xml.tmp /etc/clickhouse-server/config.d/storage_conf.xml
|
|
||||||
|
|
||||||
# it contains some new settings, but we can safely remove it
|
# it contains some new settings, but we can safely remove it
|
||||||
rm /etc/clickhouse-server/config.d/merge_tree.xml
|
rm /etc/clickhouse-server/config.d/merge_tree.xml
|
||||||
|
|
||||||
|
35
docs/changelogs/v23.2.7.32-stable.md
Normal file
35
docs/changelogs/v23.2.7.32-stable.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: 2023
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2023 Changelog
|
||||||
|
|
||||||
|
### ClickHouse release v23.2.7.32-stable (934f6a2aa0e) FIXME as compared to v23.2.6.34-stable (570190045b0)
|
||||||
|
|
||||||
|
#### Performance Improvement
|
||||||
|
* Backported in [#49218](https://github.com/ClickHouse/ClickHouse/issues/49218): Fixed excessive reading in queries with `FINAL`. [#47801](https://github.com/ClickHouse/ClickHouse/pull/47801) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
|
||||||
|
#### Build/Testing/Packaging Improvement
|
||||||
|
* Backported in [#49208](https://github.com/ClickHouse/ClickHouse/issues/49208): Fix glibc compatibility check: replace `preadv` from musl. [#49144](https://github.com/ClickHouse/ClickHouse/pull/49144) ([alesapin](https://github.com/alesapin)).
|
||||||
|
|
||||||
|
#### Bug Fix (user-visible misbehavior in an official stable release)
|
||||||
|
|
||||||
|
* Fix key not found error for queries with multiple StorageJoin [#49137](https://github.com/ClickHouse/ClickHouse/pull/49137) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Fix race on Outdated parts loading [#49223](https://github.com/ClickHouse/ClickHouse/pull/49223) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Fix bug in DISTINCT [#49628](https://github.com/ClickHouse/ClickHouse/pull/49628) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix msan issue in randomStringUTF8(<uneven number>) [#49750](https://github.com/ClickHouse/ClickHouse/pull/49750) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix IPv6 encoding in protobuf [#49933](https://github.com/ClickHouse/ClickHouse/pull/49933) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
|
||||||
|
* Avoid deadlock when starting table in attach thread of `ReplicatedMergeTree` [#50026](https://github.com/ClickHouse/ClickHouse/pull/50026) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* JIT compilation not equals NaN fix [#50056](https://github.com/ClickHouse/ClickHouse/pull/50056) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Fix crash with `multiIf` and constant condition and nullable arguments [#50123](https://github.com/ClickHouse/ClickHouse/pull/50123) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix Keeper deadlock on exception when preprocessing requests. [#50387](https://github.com/ClickHouse/ClickHouse/pull/50387) ([frinkr](https://github.com/frinkr)).
|
||||||
|
|
||||||
|
#### NOT FOR CHANGELOG / INSIGNIFICANT
|
||||||
|
|
||||||
|
* Improve test reports [#49151](https://github.com/ClickHouse/ClickHouse/pull/49151) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Fallback auth gh api [#49314](https://github.com/ClickHouse/ClickHouse/pull/49314) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Improve CI: status commit, auth for get_gh_api [#49388](https://github.com/ClickHouse/ClickHouse/pull/49388) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Update github.com/distribution/distribution [#50114](https://github.com/ClickHouse/ClickHouse/pull/50114) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Catch issues with dockerd during the build [#50700](https://github.com/ClickHouse/ClickHouse/pull/50700) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
|
599
docs/changelogs/v23.5.1.3174-stable.md
Normal file
599
docs/changelogs/v23.5.1.3174-stable.md
Normal file
@ -0,0 +1,599 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: 2023
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2023 Changelog
|
||||||
|
|
||||||
|
### ClickHouse release v23.5.1.3174-stable (2fec796e73e) FIXME as compared to v23.4.1.1943-stable (3920eb987f7)
|
||||||
|
|
||||||
|
#### Backward Incompatible Change
|
||||||
|
* Make local object storage work consistently with s3 object storage, fix problem with append (closes [#48465](https://github.com/ClickHouse/ClickHouse/issues/48465)), make it configurable as independent storage. The change is backward incompatible because cache on top of local object storage is not incompatible to previous versions. [#48791](https://github.com/ClickHouse/ClickHouse/pull/48791) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Date_trunc function to always return datetime type. [#48851](https://github.com/ClickHouse/ClickHouse/pull/48851) ([Shane Andrade](https://github.com/mauidude)).
|
||||||
|
* Remove the experimental feature "in-memory data parts". The data format is still supported, but the settings are no-op, and compact or wide parts will be used instead. This closes [#45409](https://github.com/ClickHouse/ClickHouse/issues/45409). [#49429](https://github.com/ClickHouse/ClickHouse/pull/49429) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Changed default values of settings parallelize_output_from_storages and input_format_parquet_preserve_order. This allows ClickHouse to reorder rows when reading from files (e.g. CSV or Parquet), greatly improving performance in many cases. To restore the old behavior of preserving order, use `parallelize_output_from_storages = 0`, `input_format_parquet_preserve_order = 1`. [#49479](https://github.com/ClickHouse/ClickHouse/pull/49479) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Make projections production-ready. Add the `optimize_use_projections` setting to control whether the projections will be selected for SELECT queries. The setting `allow_experimental_projection_optimization` is obsolete and does nothing. [#49719](https://github.com/ClickHouse/ClickHouse/pull/49719) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Mark joinGet() as non deterministic (so as dictGet). [#49843](https://github.com/ClickHouse/ClickHouse/pull/49843) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Revert "`groupArray` returns cannot be nullable" (due to binary compatibility breakage for `groupArray`/`groupArrayLast`/`groupArraySample` over `Nullable` types, which likely will lead to `TOO_LARGE_ARRAY_SIZE` or `CANNOT_READ_ALL_DATA`). [#49971](https://github.com/ClickHouse/ClickHouse/pull/49971) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
|
||||||
|
#### New Feature
|
||||||
|
* Password type in queries like `CREATE USER u IDENTIFIED BY 'p'` will be automatically set according to the setting `default_password_type` in the `config.xml` on the server. Closes [#42915](https://github.com/ClickHouse/ClickHouse/issues/42915). [#44674](https://github.com/ClickHouse/ClickHouse/pull/44674) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Add bcrypt password authentication type. Closes [#34599](https://github.com/ClickHouse/ClickHouse/issues/34599). [#44905](https://github.com/ClickHouse/ClickHouse/pull/44905) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Added `system.zookeeper_connection` table that shows information about ZooKeeper connections. [#45245](https://github.com/ClickHouse/ClickHouse/pull/45245) ([mateng915](https://github.com/mateng0915)).
|
||||||
|
* Add urlCluster table function. Refactor all *Cluster table functions to reduce code duplication. Make schema inference work for all possible *Cluster function signatures and for named collections. Closes [#38499](https://github.com/ClickHouse/ClickHouse/issues/38499). [#45427](https://github.com/ClickHouse/ClickHouse/pull/45427) ([attack204](https://github.com/attack204)).
|
||||||
|
* Extend `first_value` and `last_value` to accept null. [#46467](https://github.com/ClickHouse/ClickHouse/pull/46467) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* Add server and format settings `display_secrets_in_show_and_select` for displaying secrets of tables, databases, table functions, and dictionaries. Add privilege `displaySecretsInShowAndSelect` controlling which users can view secrets. [#46528](https://github.com/ClickHouse/ClickHouse/pull/46528) ([Mike Kot](https://github.com/myrrc)).
|
||||||
|
* Add new function `generateRandomStructure` that generates random table structure. It can be used in combination with table function `generateRandom`. [#47409](https://github.com/ClickHouse/ClickHouse/pull/47409) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Added native ClickHouse Keeper CLI Client. [#47414](https://github.com/ClickHouse/ClickHouse/pull/47414) ([pufit](https://github.com/pufit)).
|
||||||
|
* The query cache can now be used for production workloads. [#47977](https://github.com/ClickHouse/ClickHouse/pull/47977) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix a bug that prevented the use of `CASE` without an `ELSE` branch and extended `transform` to deal with more types. Also fix some bugs that made transform() return incorrect results when decimal types were mixed with other numeric types. [#48300](https://github.com/ClickHouse/ClickHouse/pull/48300) ([Salvatore Mesoraca](https://github.com/aiven-sal)).
|
||||||
|
* Added [server-side encryption using KMS keys](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) with S3 tables, and the `header` setting with S3 disks. Closes [#48723](https://github.com/ClickHouse/ClickHouse/issues/48723). [#48724](https://github.com/ClickHouse/ClickHouse/pull/48724) ([Johann Gan](https://github.com/johanngan)).
|
||||||
|
* Add MemoryTracker for the background tasks (merges and mutation). Introduces `merges_mutations_memory_usage_soft_limit` and `merges_mutations_memory_usage_to_ram_ratio` settings that represent the soft memory limit for merges and mutations. If this limit is reached ClickHouse won't schedule new merge or mutation tasks. Also `MergesMutationsMemoryTracking` metric is introduced to allow observing current memory usage of background tasks. Resubmit [#46089](https://github.com/ClickHouse/ClickHouse/issues/46089). Closes [#48774](https://github.com/ClickHouse/ClickHouse/issues/48774). [#48787](https://github.com/ClickHouse/ClickHouse/pull/48787) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Function `dotProduct` work for array. [#49050](https://github.com/ClickHouse/ClickHouse/pull/49050) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)).
|
||||||
|
* Support statement `SHOW INDEX` to improve compatibility with MySQL. [#49158](https://github.com/ClickHouse/ClickHouse/pull/49158) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Add virtual column `_file` and `_path` support to table function `url`. - Impove error message for table function `url`. - resolves [#49231](https://github.com/ClickHouse/ClickHouse/issues/49231) - resolves [#49232](https://github.com/ClickHouse/ClickHouse/issues/49232). [#49356](https://github.com/ClickHouse/ClickHouse/pull/49356) ([Ziyi Tan](https://github.com/Ziy1-Tan)).
|
||||||
|
* Adding the `grants` field in the users.xml file, which allows specifying grants for users. [#49381](https://github.com/ClickHouse/ClickHouse/pull/49381) ([pufit](https://github.com/pufit)).
|
||||||
|
* Add alias `str_to_map` and `mapfromstring` for `extractkeyvaluepairs`. closes [#47185](https://github.com/ClickHouse/ClickHouse/issues/47185). [#49466](https://github.com/ClickHouse/ClickHouse/pull/49466) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Support full/right join by using grace hash join algorithm. [#49483](https://github.com/ClickHouse/ClickHouse/pull/49483) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* `WITH FILL` modifier groups filling by sorting prefix. Controlled by `use_with_fill_by_sorting_prefix` setting (enabled by default). Related to [#33203](https://github.com/ClickHouse/ClickHouse/issues/33203)#issuecomment-1418736794. [#49503](https://github.com/ClickHouse/ClickHouse/pull/49503) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Add SQL functions for entropy-learned hashing. [#49656](https://github.com/ClickHouse/ClickHouse/pull/49656) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Clickhouse-client now accepts queries after "--multiquery" when "--query" (or "-q") is absent. example: clickhouse-client --multiquery "select 1; select 2;". [#49870](https://github.com/ClickHouse/ClickHouse/pull/49870) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
|
||||||
|
* Add separate `handshake_timeout` for receiving Hello packet from replica. Closes [#48854](https://github.com/ClickHouse/ClickHouse/issues/48854). [#49948](https://github.com/ClickHouse/ClickHouse/pull/49948) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* New setting s3_max_inflight_parts_for_one_file sets the limit of concurrently loaded parts with multipart upload request in scope of one file. [#49961](https://github.com/ClickHouse/ClickHouse/pull/49961) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Geographical data types (`Point`, `Ring`, `Polygon`, and `MultiPolygon`) are production-ready. [#50022](https://github.com/ClickHouse/ClickHouse/pull/50022) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Added a function "space()" which repeats a space as many times as specified. [#50103](https://github.com/ClickHouse/ClickHouse/pull/50103) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Added --input_format_csv_trim_whitespaces option. [#50215](https://github.com/ClickHouse/ClickHouse/pull/50215) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
|
||||||
|
* Added the dictGetAll function for regexp tree dictionaries to return values from multiple matches as arrays. Closes [#50254](https://github.com/ClickHouse/ClickHouse/issues/50254). [#50255](https://github.com/ClickHouse/ClickHouse/pull/50255) ([Johann Gan](https://github.com/johanngan)).
|
||||||
|
* Added toLastDayOfWeek() function to round a date or a date with time up to the nearest Saturday or Sunday. [#50315](https://github.com/ClickHouse/ClickHouse/pull/50315) ([Victor Krasnov](https://github.com/sirvickr)).
|
||||||
|
* Ability to ignore a skip index by specifying `ignore_data_skipping_indices`. [#50329](https://github.com/ClickHouse/ClickHouse/pull/50329) ([Boris Kuschel](https://github.com/bkuschel)).
|
||||||
|
* Revert 'Add SQL functions for entropy-learned hashing'. [#50416](https://github.com/ClickHouse/ClickHouse/pull/50416) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Add `system.user_processes` table and `SHOW USER PROCESSES` query to show memory info and ProfileEvents on user level. [#50492](https://github.com/ClickHouse/ClickHouse/pull/50492) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)).
|
||||||
|
* Added storage engine `AzureBlobStorage` and `azure_blob_storage` table function. The supported set of features is very similar to storage/table function `S3`. Implements [#19307](https://github.com/ClickHouse/ClickHouse/issues/19307). [#50604](https://github.com/ClickHouse/ClickHouse/pull/50604) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
|
||||||
|
#### Performance Improvement
|
||||||
|
* Compress marks and primary key by default. It significantly reduces the cold query time. Upgrade notes: the support for compressed marks and primary key has been added in version 22.9. If you turned on compressed marks or primary key or installed version 23.5 or newer, which has compressed marks or primary key on by default, you will not be able to downgrade to version 22.8 or earlier. You can also explicitly disable compressed marks or primary keys by specifying the `compress_marks` and `compress_primary_key` settings in the `<merge_tree>` section of the server configuration file. **Upgrade notes:** If you upgrade from versions prior to 22.9, you should either upgrade all replicas at once or disable the compression before upgrade, or upgrade through an intermediate version, where the compressed marks are supported but not enabled by default, such as 23.3. [#42587](https://github.com/ClickHouse/ClickHouse/pull/42587) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* When reading from multiple files reduce parallel parsing threads for each file resolves [#42192](https://github.com/ClickHouse/ClickHouse/issues/42192). [#46661](https://github.com/ClickHouse/ClickHouse/pull/46661) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Do not store blocks in `ANY` hash join if nothing is inserted. [#48633](https://github.com/ClickHouse/ClickHouse/pull/48633) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Fixes aggregate combinator `-If` when JIT compiled. Closes [#48120](https://github.com/ClickHouse/ClickHouse/issues/48120). [#49083](https://github.com/ClickHouse/ClickHouse/pull/49083) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* For reading from remote tables we use smaller tasks (instead of reading the whole part) to make tasks stealing work * task size is determined by size of columns to read * always use 1mb buffers for reading from s3 * boundaries of cache segments aligned to 1mb so they have decent size even with small tasks. it also should prevent fragmentation. [#49287](https://github.com/ClickHouse/ClickHouse/pull/49287) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Default size of a read buffer for reading from local filesystem changed to a slightly better value. Also two new settings are introduced: `max_read_buffer_size_local_fs` and `max_read_buffer_size_remote_fs`. [#49321](https://github.com/ClickHouse/ClickHouse/pull/49321) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Improve memory usage and speed of `SPARSE_HASHED`/`HASHED` dictionaries (e.g. `SPARSE_HASHED` now eats 2.6x less memory, and is ~2x faster). [#49380](https://github.com/ClickHouse/ClickHouse/pull/49380) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Use aggregate projection only if it reads fewer granules than normal reading. It should help in case if query hits the PK of the table, but not the projection. Fixes [#49150](https://github.com/ClickHouse/ClickHouse/issues/49150). [#49417](https://github.com/ClickHouse/ClickHouse/pull/49417) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
* Optimize PODArray::resize_fill() callers. [#49459](https://github.com/ClickHouse/ClickHouse/pull/49459) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Optimize the system.query_log and system.query_thread_log tables by applying LowCardinality when appropriate. The queries over these tables will be faster. [#49530](https://github.com/ClickHouse/ClickHouse/pull/49530) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Better performance when reading local Parquet files (through parallel reading). [#49539](https://github.com/ClickHouse/ClickHouse/pull/49539) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Improve the performance of `RIGHT/FULL JOIN` by up to 2 times in certain scenarios, especially when joining a small left table with a large right table. [#49585](https://github.com/ClickHouse/ClickHouse/pull/49585) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* Improve performance of BLAKE3 by 11% by enabling LTO for Rust. [#49600](https://github.com/ClickHouse/ClickHouse/pull/49600) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Optimize the structure of the `system.opentelemetry_span_log`. Use `LowCardinality` where appropriate. Although this table is generally stupid (it is using the Map data type even for common attributes), it will be slightly better. [#49647](https://github.com/ClickHouse/ClickHouse/pull/49647) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Try to reserve hash table's size in `grace_hash` join. [#49816](https://github.com/ClickHouse/ClickHouse/pull/49816) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* As is addresed in issue [#49748](https://github.com/ClickHouse/ClickHouse/issues/49748), the predicates with date converters, such as **toYear, toYYYYMM**, could be rewritten with the equivalent date (YYYY-MM-DD) comparisons at the AST level. And this transformation could bring performance improvement as it is free from the expensive date converter and the comparison between dates (or integers in the low level representation) is quite low-cost. The [prototype](https://github.com/ZhiguoZh/ClickHouse/commit/c7f1753f0c9363a19d95fa46f1cfed1d9f505ee0) shows that, with all identified date converters optimized, the overall QPS of the 13 queries is enhanced by **~11%** on the ICX server (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads). [#50062](https://github.com/ClickHouse/ClickHouse/pull/50062) ([Zhiguo Zhou](https://github.com/ZhiguoZh)).
|
||||||
|
* Parallel merge of `uniqExactIf` states. Closes [#49885](https://github.com/ClickHouse/ClickHouse/issues/49885). [#50285](https://github.com/ClickHouse/ClickHouse/pull/50285) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* As is addresed in issue [#49748](https://github.com/ClickHouse/ClickHouse/issues/49748), the predicates with date converters, such as toYear, toYYYYMM, could be rewritten with the equivalent date (YYYY-MM-DD) comparisons at the AST level. And this transformation could bring performance improvement as it is free from the expensive date converter and the comparison between dates (or integers in the low level representation) is quite low-cost. [#50307](https://github.com/ClickHouse/ClickHouse/pull/50307) ([Zhiguo Zhou](https://github.com/ZhiguoZh)).
|
||||||
|
* Parallel merging supported for `uniqExact` with modifiers `-Array`, `-Merge`, `-OrNull`, `-State`. [#50413](https://github.com/ClickHouse/ClickHouse/pull/50413) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Enable LZ4_FAST_DEC_LOOP for Arm LZ4 to get 5% of decompression speed. [#50588](https://github.com/ClickHouse/ClickHouse/pull/50588) ([Daniel Kutenin](https://github.com/danlark1)).
|
||||||
|
|
||||||
|
#### Improvement
|
||||||
|
* Add support for CGroup version 2 for asynchronous metrics about the memory usage and availability. This closes [#37983](https://github.com/ClickHouse/ClickHouse/issues/37983). [#45999](https://github.com/ClickHouse/ClickHouse/pull/45999) ([sichenzhao](https://github.com/sichenzhao)).
|
||||||
|
* Cluster table functions should always skip unavailable shards. close [#46314](https://github.com/ClickHouse/ClickHouse/issues/46314). [#46765](https://github.com/ClickHouse/ClickHouse/pull/46765) ([zk_kiger](https://github.com/zk-kiger)).
|
||||||
|
* When your csv file contains empty columns, like: ```. [#47496](https://github.com/ClickHouse/ClickHouse/pull/47496) ([你不要过来啊](https://github.com/iiiuwioajdks)).
|
||||||
|
* ROW POLICY for all tables that belong to a DATABASE. [#47640](https://github.com/ClickHouse/ClickHouse/pull/47640) ([Ilya Golshtein](https://github.com/ilejn)).
|
||||||
|
* Add Google Cloud Storage S3 compatible table function `gcs`. Like the `oss` and `cosn` functions, it is just an alias over the `s3` table function, and it does not bring any new features. [#47815](https://github.com/ClickHouse/ClickHouse/pull/47815) ([Kuba Kaflik](https://github.com/jkaflik)).
|
||||||
|
* Add ability to use strict parts size for S3 (compatibility with CloudFlare R2 S3 Storage). [#48492](https://github.com/ClickHouse/ClickHouse/pull/48492) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Added new columns with info about `Replicated` database replicas to `system.clusters`: `database_shard_name`, `database_replica_name`, `is_active`. Added an optional `FROM SHARD` clause to `SYSTEM DROP DATABASE REPLICA` query. [#48548](https://github.com/ClickHouse/ClickHouse/pull/48548) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Add a new column `zookeeper_name` in system.replicas, to indicate on which (auxiliary) zookeeper cluster the replicated table's metadata is stored. [#48549](https://github.com/ClickHouse/ClickHouse/pull/48549) ([cangyin](https://github.com/cangyin)).
|
||||||
|
* `IN` operator support compare `Date` and `Date32`. Closes [#48736](https://github.com/ClickHouse/ClickHouse/issues/48736). [#48806](https://github.com/ClickHouse/ClickHouse/pull/48806) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Support for erasure codes in HDFS, author: @M1eyu2018, @tomscut. [#48833](https://github.com/ClickHouse/ClickHouse/pull/48833) ([M1eyu](https://github.com/M1eyu2018)).
|
||||||
|
* The query cache can now supports queries with totals and extremes modifier. [#48853](https://github.com/ClickHouse/ClickHouse/pull/48853) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Introduces new keyword `INTO OUTFILE 'file.txt' APPEND`. [#48880](https://github.com/ClickHouse/ClickHouse/pull/48880) ([alekar](https://github.com/alekar)).
|
||||||
|
* The `BACKUP` command will not decrypt data from encrypted disks while making a backup. Instead the data will be stored in a backup in encrypted form. Such backups can be restored only to an encrypted disk with the same (or extended) list of encryption keys. [#48896](https://github.com/ClickHouse/ClickHouse/pull/48896) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Keeper improvement: add `CheckNotExists` request to Keeper. [#48897](https://github.com/ClickHouse/ClickHouse/pull/48897) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Implement SYSTEM DROP REPLICA from auxillary ZooKeeper clusters, may be close [#48931](https://github.com/ClickHouse/ClickHouse/issues/48931). [#48932](https://github.com/ClickHouse/ClickHouse/pull/48932) ([wangxiaobo](https://github.com/wzb5212)).
|
||||||
|
* Add Array data type to MongoDB. Closes [#48598](https://github.com/ClickHouse/ClickHouse/issues/48598). [#48983](https://github.com/ClickHouse/ClickHouse/pull/48983) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Keeper performance improvements: avoid serializing same request twice while processing. Cache deserialization results of large requests. Controlled by new coordination setting `min_request_size_for_cache`. [#49004](https://github.com/ClickHouse/ClickHouse/pull/49004) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Support storing `Interval` data types in tables. [#49085](https://github.com/ClickHouse/ClickHouse/pull/49085) ([larryluogit](https://github.com/larryluogit)).
|
||||||
|
* Add support for size suffixes in quota creation statement parameters. [#49087](https://github.com/ClickHouse/ClickHouse/pull/49087) ([Eridanus](https://github.com/Eridanus117)).
|
||||||
|
* Allow using `ntile` window function without explicit window frame definition: `ntile(3) OVER (ORDER BY a)`, close [#46763](https://github.com/ClickHouse/ClickHouse/issues/46763). [#49093](https://github.com/ClickHouse/ClickHouse/pull/49093) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Added settings (`number_of_mutations_to_delay`, `number_of_mutations_to_throw`) to delay or throw `ALTER` queries that create mutations (`ALTER UPDATE`, `ALTER DELETE`, `ALTER MODIFY COLUMN`, ...) in case when table already has a lot of unfinished mutations. [#49117](https://github.com/ClickHouse/ClickHouse/pull/49117) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Added setting `async_insert` for `MergeTables`. It has the same meaning as query-level setting `async_insert` and enables asynchronous inserts for specific table. Note: it doesn't take effect for insert queries from `clickhouse-client`, use query-level setting in that case. [#49122](https://github.com/ClickHouse/ClickHouse/pull/49122) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Catch exception from `create_directories` in filesystem cache. [#49203](https://github.com/ClickHouse/ClickHouse/pull/49203) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Copies embedded examples to a new field `example` in `system.functions` to supplement the field `description`. [#49222](https://github.com/ClickHouse/ClickHouse/pull/49222) ([Dan Roscigno](https://github.com/DanRoscigno)).
|
||||||
|
* Enable connection options for the MongoDB dictionary. Example: ``` xml <source> <mongodb> <host>localhost</host> <port>27017</port> <user></user> <password></password> <db>test</db> <collection>dictionary_source</collection> <options>ssl=true</options> </mongodb> </source> ``` ### Documentation entry for user-facing changes. [#49225](https://github.com/ClickHouse/ClickHouse/pull/49225) ([MikhailBurdukov](https://github.com/MikhailBurdukov)).
|
||||||
|
* Added an alias `asymptotic` for `asymp` computational method for `kolmogorovSmirnovTest`. Improved documentation. [#49286](https://github.com/ClickHouse/ClickHouse/pull/49286) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Aggregation function groupBitAnd/Or/Xor now work on signed integer data. This makes them consistent with the behavior of scalar functions bitAnd/Or/Xor. [#49292](https://github.com/ClickHouse/ClickHouse/pull/49292) ([exmy](https://github.com/exmy)).
|
||||||
|
* Split function-documentation into more fine-granular fields. [#49300](https://github.com/ClickHouse/ClickHouse/pull/49300) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Introduced settings: - `merge_max_block_size_bytes` to limit the amount of memory used for background operations. - `vertical_merge_algorithm_min_bytes_to_activate` to add another condition to activate vertical merges. [#49313](https://github.com/ClickHouse/ClickHouse/pull/49313) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Use multiple threads shared between all tables within a server to load outdated data parts. The the size of the pool and its queue is controlled by `max_outdated_parts_loading_thread_pool_size` and `outdated_part_loading_thread_pool_queue_size` settings. [#49317](https://github.com/ClickHouse/ClickHouse/pull/49317) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Don't overestimate the size of processed data for `LowCardinality` columns when they share dictionaries between blocks. This closes [#49322](https://github.com/ClickHouse/ClickHouse/issues/49322). See also [#48745](https://github.com/ClickHouse/ClickHouse/issues/48745). [#49323](https://github.com/ClickHouse/ClickHouse/pull/49323) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Parquet writer now uses reasonable row group size when invoked through OUTFILE. [#49325](https://github.com/ClickHouse/ClickHouse/pull/49325) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Allow restricted keywords like `ARRAY` as an alias if the alias is quoted. Closes [#49324](https://github.com/ClickHouse/ClickHouse/issues/49324). [#49360](https://github.com/ClickHouse/ClickHouse/pull/49360) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Added possibility to use temporary tables in FROM part of ATTACH PARTITION FROM and REPLACE PARTITION FROM. [#49436](https://github.com/ClickHouse/ClickHouse/pull/49436) ([Roman Vasin](https://github.com/rvasin)).
|
||||||
|
* Data parts loading and deletion jobs were moved to shared server-wide pools instead of per-table pools. Pools sizes are controlled via settings `max_active_parts_loading_thread_pool_size`, `max_outdated_parts_loading_thread_pool_size` and `max_parts_cleaning_thread_pool_size` in top-level config. Table-level settings `max_part_loading_threads` and `max_part_removal_threads` became obsolete. [#49474](https://github.com/ClickHouse/ClickHouse/pull/49474) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Allow `?password=pass` in URL. Password is replaced in browser history. [#49505](https://github.com/ClickHouse/ClickHouse/pull/49505) ([Mike Kot](https://github.com/myrrc)).
|
||||||
|
* Allow zero objects in ReadBufferFromRemoteFSGather (because empty files are not backuped, so we might end up with zero blobs in metadata file). Closes [#49480](https://github.com/ClickHouse/ClickHouse/issues/49480). [#49519](https://github.com/ClickHouse/ClickHouse/pull/49519) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Attach thread MemoryTracker to `total_memory_tracker` after `ThreadGroup` detached. [#49527](https://github.com/ClickHouse/ClickHouse/pull/49527) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Make `Pretty` formats prettier: squash blocks if not much time passed since the output of the previous block. This is controlled by a new setting `output_format_pretty_squash_ms` (100ms by default). This closes [#49153](https://github.com/ClickHouse/ClickHouse/issues/49153). [#49537](https://github.com/ClickHouse/ClickHouse/pull/49537) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Add initial support to do JOINs with pure parallel replicas. [#49544](https://github.com/ClickHouse/ClickHouse/pull/49544) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Fix parameterized views when query parameter used multiple times in the query. [#49556](https://github.com/ClickHouse/ClickHouse/pull/49556) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Release memory allocated for the last sent ProfileEvents snapshot in the context of a query. Followup [#47564](https://github.com/ClickHouse/ClickHouse/issues/47564). [#49561](https://github.com/ClickHouse/ClickHouse/pull/49561) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Function "makeDate" now provides a MySQL-compatible overload (year & day of the year argument). [#49603](https://github.com/ClickHouse/ClickHouse/pull/49603) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* More parallelism on `Outdated` parts removal with "zero-copy replication". [#49630](https://github.com/ClickHouse/ClickHouse/pull/49630) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Reduced number of `List` ZooKeeper requests when selecting parts to merge and a lot of partitions do not have anything to merge. [#49637](https://github.com/ClickHouse/ClickHouse/pull/49637) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Support `dictionary` table function for `RegExpTreeDictionary`. [#49666](https://github.com/ClickHouse/ClickHouse/pull/49666) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Added weighted fair IO scheduling policy. Added dynamic resource manager, which allows IO scheduling hierarchy to be updated in runtime w/o server restarts. [#49671](https://github.com/ClickHouse/ClickHouse/pull/49671) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Add compose request after multipart upload to GCS. This enables the usage of copy operation on objects uploaded with the multipart upload. It's recommended to set `s3_strict_upload_part_size` to some value because compose request can fail on objects created with parts of different sizes. [#49693](https://github.com/ClickHouse/ClickHouse/pull/49693) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Improve the "best-effort" parsing logic to accept `key_value_delimiter` as a valid part of the value. This also simplifies branching and might even speed up things a bit. [#49760](https://github.com/ClickHouse/ClickHouse/pull/49760) ([Arthur Passos](https://github.com/arthurpassos)).
|
||||||
|
* Facilitate profile data association and aggregation for the same query. [#49777](https://github.com/ClickHouse/ClickHouse/pull/49777) ([helifu](https://github.com/helifu)).
|
||||||
|
* System log tables can now have custom sorting keys. [#49778](https://github.com/ClickHouse/ClickHouse/pull/49778) ([helifu](https://github.com/helifu)).
|
||||||
|
* A new field 'partitions' is used to indicate which partitions are participating in the calculation. [#49779](https://github.com/ClickHouse/ClickHouse/pull/49779) ([helifu](https://github.com/helifu)).
|
||||||
|
* Added `enable_the_endpoint_id_with_zookeeper_name_prefix` setting for `ReplicatedMergeTree` (disabled by default). When enabled, it adds ZooKeeper cluster name to table's interserver communication endpoint. It avoids `Duplicate interserver IO endpoint` errors when having replicated tables with the same path, but different auxiliary ZooKeepers. [#49780](https://github.com/ClickHouse/ClickHouse/pull/49780) ([helifu](https://github.com/helifu)).
|
||||||
|
* Add query parameters to clickhouse-local. Closes [#46561](https://github.com/ClickHouse/ClickHouse/issues/46561). [#49785](https://github.com/ClickHouse/ClickHouse/pull/49785) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Qpl_deflate codec lower the minimum simd version to sse 4.2. [doc change in qpl](https://github.com/intel/qpl/commit/3f8f5cea27739f5261e8fd577dc233ffe88bf679) - intel® qpl relies on a run-time kernels dispatcher and cpuid check to choose the best available implementation(sse/avx2/avx512) - restructured cmakefile for qpl build in clickhouse to align with latest upstream qpl. [#49811](https://github.com/ClickHouse/ClickHouse/pull/49811) ([jasperzhu](https://github.com/jinjunzh)).
|
||||||
|
* Allow loading dictionaries and functions from YAML by default. In previous versions, it required editing the `dictionaries_config` or `user_defined_executable_functions_config` in the configuration file, as they expected `*.xml` files. [#49812](https://github.com/ClickHouse/ClickHouse/pull/49812) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* The Kafka table engine now allows to use alias columns. [#49824](https://github.com/ClickHouse/ClickHouse/pull/49824) ([Aleksandr Musorin](https://github.com/AVMusorin)).
|
||||||
|
* Add setting to limit the max number of pairs produced by extractKeyValuePairs, safeguard to avoid using way too much memory. [#49836](https://github.com/ClickHouse/ClickHouse/pull/49836) ([Arthur Passos](https://github.com/arthurpassos)).
|
||||||
|
* Add support for (an unusual) case where the arguments in the `IN` operator are single-element tuples. [#49844](https://github.com/ClickHouse/ClickHouse/pull/49844) ([MikhailBurdukov](https://github.com/MikhailBurdukov)).
|
||||||
|
* `bitHammingDistance` function support `String` and `FixedString` data type. Closes [#48827](https://github.com/ClickHouse/ClickHouse/issues/48827). [#49858](https://github.com/ClickHouse/ClickHouse/pull/49858) ([flynn](https://github.com/ucasfl)).
|
||||||
|
* Fix timeout resetting errors in the client on OS X. [#49863](https://github.com/ClickHouse/ClickHouse/pull/49863) ([alekar](https://github.com/alekar)).
|
||||||
|
* Add support for big integers, such as UInt128, Int128, UInt256, and Int256 in the function `bitCount`. This enables Hamming distance over large bit masks for AI applications. [#49867](https://github.com/ClickHouse/ClickHouse/pull/49867) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* This PR makes fingerprints to be used instead of key IDs in encrypted disks. [#49882](https://github.com/ClickHouse/ClickHouse/pull/49882) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Add UUID data type to PostgreSQL. Closes [#49739](https://github.com/ClickHouse/ClickHouse/issues/49739). [#49894](https://github.com/ClickHouse/ClickHouse/pull/49894) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Make `allow_experimental_query_cache` setting as obsolete for backward-compatibility. It was removed in https://github.com/ClickHouse/ClickHouse/pull/47977. [#49934](https://github.com/ClickHouse/ClickHouse/pull/49934) ([Timur Solodovnikov](https://github.com/tsolodov)).
|
||||||
|
* Function toUnixTimestamp() now accepts Date and Date32 arguments. [#49989](https://github.com/ClickHouse/ClickHouse/pull/49989) ([Victor Krasnov](https://github.com/sirvickr)).
|
||||||
|
* Charge only server memory for dictionaries. [#49995](https://github.com/ClickHouse/ClickHouse/pull/49995) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Add schema inference to PostgreSQL, MySQL, MeiliSearch, and SQLite table engines. Closes [#49972](https://github.com/ClickHouse/ClickHouse/issues/49972). [#50000](https://github.com/ClickHouse/ClickHouse/pull/50000) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* The server will allow using the `SQL_*` settings such as `SQL_AUTO_IS_NULL` as no-ops for MySQL compatibility. This closes [#49927](https://github.com/ClickHouse/ClickHouse/issues/49927). [#50013](https://github.com/ClickHouse/ClickHouse/pull/50013) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Preserve initial_query_id for ON CLUSTER queries, which is useful for introspection (under `distributed_ddl_entry_format_version=5`). [#50015](https://github.com/ClickHouse/ClickHouse/pull/50015) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Preserve backward incompatibility for renamed settings by using aliases (`allow_experimental_projection_optimization` for `optimize_use_projections`, `allow_experimental_lightweight_delete` for `enable_lightweight_delete`). [#50044](https://github.com/ClickHouse/ClickHouse/pull/50044) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Support cross-replication in distributed queries using the new infrastructure. [#50097](https://github.com/ClickHouse/ClickHouse/pull/50097) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Support passing fqdn through setting my_hostname to register cluster node in keeper. Add setting of invisible to support multi compute groups. A compute group as a cluster, is invisible to other compute groups. [#50186](https://github.com/ClickHouse/ClickHouse/pull/50186) ([Yangkuan Liu](https://github.com/LiuYangkuan)).
|
||||||
|
* Fix PostgreSQL reading all the data even though `LIMIT n` could be specified. [#50187](https://github.com/ClickHouse/ClickHouse/pull/50187) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* 1) Fixed an error `NOT_FOUND_COLUMN_IN_BLOCK` in case of using parallel replicas with non-replicated storage with disabled setting `parallel_replicas_for_non_replicated_merge_tree` 2) Now `allow_experimental_parallel_reading_from_replicas` have 3 possible values - 0, 1 and 2. 0 - disabled, 1 - enabled, silently disable them in case of failure (in case of FINAL or JOIN), 2 - enabled, throw an expection in case of failure. 3) If FINAL modifier is used in SELECT query and parallel replicas are enabled, ClickHouse will try to disable them if `allow_experimental_parallel_reading_from_replicas` is set to 1 and throw an exception otherwise. [#50195](https://github.com/ClickHouse/ClickHouse/pull/50195) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Don't send head request for all keys in Iceberg schema inference, only for keys that are used for reaing data. [#50203](https://github.com/ClickHouse/ClickHouse/pull/50203) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Add new profile events for queries with subqueries (`QueriesWithSubqueries`/`SelectQueriesWithSubqueries`/`InsertQueriesWithSubqueries`). [#50204](https://github.com/ClickHouse/ClickHouse/pull/50204) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Adding the roles field in the users.xml file, which allows specifying roles with grants via a config file. [#50278](https://github.com/ClickHouse/ClickHouse/pull/50278) ([pufit](https://github.com/pufit)).
|
||||||
|
* When parallel replicas are enabled they will always skip unavailable servers (the behavior is controlled by the setting `skip_unavailable_shards`, enabled by default and can be only disabled). This closes: [#48565](https://github.com/ClickHouse/ClickHouse/issues/48565). [#50293](https://github.com/ClickHouse/ClickHouse/pull/50293) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Fix a typo. [#50306](https://github.com/ClickHouse/ClickHouse/pull/50306) ([helifu](https://github.com/helifu)).
|
||||||
|
* Setting `enable_memory_bound_merging_of_aggregation_results` is enabled by default. If you update from version prior to 22.12, we recommend to set this flag to `false` until update is finished. [#50319](https://github.com/ClickHouse/ClickHouse/pull/50319) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Report `CGroupCpuCfsPeriod` and `CGroupCpuCfsQuota` in AsynchronousMetrics. - Respect cgroup v2 memory limits during server startup. [#50379](https://github.com/ClickHouse/ClickHouse/pull/50379) ([alekar](https://github.com/alekar)).
|
||||||
|
* Bump internal protobuf to v3.18 (fixes CVE-2022-1941). [#50400](https://github.com/ClickHouse/ClickHouse/pull/50400) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Bump internal libxml2 to v2.10.4 (fixes CVE-2023-28484 and CVE-2023-29469). [#50402](https://github.com/ClickHouse/ClickHouse/pull/50402) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Bump c-ares to v1.19.1 (CVE-2023-32067, CVE-2023-31130, CVE-2023-31147). [#50403](https://github.com/ClickHouse/ClickHouse/pull/50403) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix CVE-2022-2469 in libgsasl. [#50404](https://github.com/ClickHouse/ClickHouse/pull/50404) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Make filter push down through cross join. [#50430](https://github.com/ClickHouse/ClickHouse/pull/50430) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Add a signal handler for SIGQUIT to work the same way as SIGINT. Closes [#50298](https://github.com/ClickHouse/ClickHouse/issues/50298). [#50435](https://github.com/ClickHouse/ClickHouse/pull/50435) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* In case JSON parse fails due to the large size of the object output the last position to allow debugging. [#50474](https://github.com/ClickHouse/ClickHouse/pull/50474) ([Valentin Alexeev](https://github.com/valentinalexeev)).
|
||||||
|
* Support decimals with not fixed size. Closes [#49130](https://github.com/ClickHouse/ClickHouse/issues/49130). [#50586](https://github.com/ClickHouse/ClickHouse/pull/50586) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Disable pure parallel replicas if trivial count optimization is possible. [#50594](https://github.com/ClickHouse/ClickHouse/pull/50594) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Added support of TRUNCATE db.table additional to TRUNCATE TABLE db.table in MaterializedMySQL. [#50624](https://github.com/ClickHouse/ClickHouse/pull/50624) ([Val Doroshchuk](https://github.com/valbok)).
|
||||||
|
* Disable parallel replicas automatically when the estimated number of granules is less than threshold. The behavior is controlled by a setting `parallel_replicas_min_number_of_granules_to_enable`. [#50639](https://github.com/ClickHouse/ClickHouse/pull/50639) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* When creating skipping indexes via "ALTER TABLE table ADD INDEX", the "GRANULARITY" clause can now be omitted. In that case, GRANULARITY is assumed to be 1. [#50658](https://github.com/ClickHouse/ClickHouse/pull/50658) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix slow cache in presence of big inserts. [#50680](https://github.com/ClickHouse/ClickHouse/pull/50680) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Set default max_elements limit in filesystem cache to 10000000. [#50682](https://github.com/ClickHouse/ClickHouse/pull/50682) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* SHOW INDICES is now an alias of statement SHOW INDEX/INDEXES/KEYS. [#50713](https://github.com/ClickHouse/ClickHouse/pull/50713) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
|
||||||
|
#### Build/Testing/Packaging Improvement
|
||||||
|
* New and improved keeper-bench. Everything can be customized from yaml/XML file: - request generator - each type of request generator can have a specific set of fields - multi requests can be generated just by doing the same under `multi` key - for each request or subrequest in multi a `weight` field can be defined to control distribution - define trees that need to be setup for a test run - hosts can be defined with all timeouts customizable and it's possible to control how many sessions to generate for each host - integers defined with `min_value` and `max_value` fields are random number generators. [#48547](https://github.com/ClickHouse/ClickHouse/pull/48547) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* ... Add a test to check max_rows_to_read_leaf behaviour. [#48950](https://github.com/ClickHouse/ClickHouse/pull/48950) ([Sean Haynes](https://github.com/seandhaynes)).
|
||||||
|
* Io_uring is not supported on macos, don't choose it when running tests on local to avoid occassional failures. [#49250](https://github.com/ClickHouse/ClickHouse/pull/49250) ([Frank Chen](https://github.com/FrankChen021)).
|
||||||
|
* Support named fault injection for testing. [#49361](https://github.com/ClickHouse/ClickHouse/pull/49361) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Fix the 01193_metadata_loading test to match the query execution time specific to s390x. [#49455](https://github.com/ClickHouse/ClickHouse/pull/49455) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)).
|
||||||
|
* Use the RapidJSONParser library to parse the JSON float values in case of s390x. [#49457](https://github.com/ClickHouse/ClickHouse/pull/49457) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)).
|
||||||
|
* Allow running ClickHouse in the OS where the `prctl` (process control) syscall is not available, such as AWS Lambda. [#49538](https://github.com/ClickHouse/ClickHouse/pull/49538) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Improve CI check with an enabled analyzer. Now it should be green if only tests from `tests/broken_tests.txt` are broken. [#49562](https://github.com/ClickHouse/ClickHouse/pull/49562) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Fixed the issue of build conflict between contrib/isa-l and isa-l in qpl [49296](https://github.com/ClickHouse/ClickHouse/issues/49296). [#49584](https://github.com/ClickHouse/ClickHouse/pull/49584) ([jasperzhu](https://github.com/jinjunzh)).
|
||||||
|
* Utilities are now only build if explicitly requested ("-DENABLE_UTILS=1") instead of by default, this reduces link times in typical development builds. [#49620](https://github.com/ClickHouse/ClickHouse/pull/49620) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Pull build description of idxd-config into a separate CMake file to avoid accidental removal in future. [#49651](https://github.com/ClickHouse/ClickHouse/pull/49651) ([jasperzhu](https://github.com/jinjunzh)).
|
||||||
|
* Add CI check with an enabled analyzer in the master. Followup [#49562](https://github.com/ClickHouse/ClickHouse/issues/49562). [#49668](https://github.com/ClickHouse/ClickHouse/pull/49668) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Switch to LLVM/clang 16. [#49678](https://github.com/ClickHouse/ClickHouse/pull/49678) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fixed DefaultHash64 for non-64 bit integers on s390x. [#49833](https://github.com/ClickHouse/ClickHouse/pull/49833) ([Harry Lee](https://github.com/HarryLeeIBM)).
|
||||||
|
* Allow building ClickHouse with clang-17. [#49851](https://github.com/ClickHouse/ClickHouse/pull/49851) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* ClickHouse is now easier to be integrated into other cmake projects. [#49991](https://github.com/ClickHouse/ClickHouse/pull/49991) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* Link `boost::context` library to `clickhouse_common_io`. This closes: [#50381](https://github.com/ClickHouse/ClickHouse/issues/50381). [#50385](https://github.com/ClickHouse/ClickHouse/pull/50385) ([HaiBo Li](https://github.com/marising)).
|
||||||
|
* Add support for building with clang-17. [#50410](https://github.com/ClickHouse/ClickHouse/pull/50410) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix strange additional QEMU logging after [#47151](https://github.com/ClickHouse/ClickHouse/issues/47151), see https://s3.amazonaws.com/clickhouse-test-reports/50078/a4743996ee4f3583884d07bcd6501df0cfdaa346/stateless_tests__release__databasereplicated__[3_4].html. [#50442](https://github.com/ClickHouse/ClickHouse/pull/50442) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* ClickHouse can work on Linux RISC-V 6.1.22. This closes [#50456](https://github.com/ClickHouse/ClickHouse/issues/50456). [#50457](https://github.com/ClickHouse/ClickHouse/pull/50457) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
|
||||||
|
#### Bug Fix (user-visible misbehavior in an official stable release)
|
||||||
|
|
||||||
|
* ActionsDAG: fix wrong optimization [#47584](https://github.com/ClickHouse/ClickHouse/pull/47584) ([Salvatore Mesoraca](https://github.com/aiven-sal)).
|
||||||
|
* Correctly handle concurrent snapshots in Keeper [#48466](https://github.com/ClickHouse/ClickHouse/pull/48466) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* MergeTreeMarksLoader holds DataPart instead of DataPartStorage [#48515](https://github.com/ClickHouse/ClickHouse/pull/48515) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* sequence state fix [#48603](https://github.com/ClickHouse/ClickHouse/pull/48603) ([Ilya Golshtein](https://github.com/ilejn)).
|
||||||
|
* Back/Restore concurrency check on previous fails [#48726](https://github.com/ClickHouse/ClickHouse/pull/48726) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Fix Attaching a table with non-existent ZK path does not increase the ReadonlyReplica metric [#48954](https://github.com/ClickHouse/ClickHouse/pull/48954) ([wangxiaobo](https://github.com/wzb5212)).
|
||||||
|
* Fix possible terminate called for uncaught exception in some places [#49112](https://github.com/ClickHouse/ClickHouse/pull/49112) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix key not found error for queries with multiple StorageJoin [#49137](https://github.com/ClickHouse/ClickHouse/pull/49137) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Fix wrong query result when using nullable primary key [#49172](https://github.com/ClickHouse/ClickHouse/pull/49172) ([Duc Canh Le](https://github.com/canhld94)).
|
||||||
|
* Revert "Fix GCS native copy ([#48981](https://github.com/ClickHouse/ClickHouse/issues/48981))" [#49194](https://github.com/ClickHouse/ClickHouse/pull/49194) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Fix reinterpretAs*() on big endian machines [#49198](https://github.com/ClickHouse/ClickHouse/pull/49198) ([Suzy Wang](https://github.com/SuzyWangIBMer)).
|
||||||
|
* Lock zero copy parts more atomically [#49211](https://github.com/ClickHouse/ClickHouse/pull/49211) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix race on Outdated parts loading [#49223](https://github.com/ClickHouse/ClickHouse/pull/49223) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Fix all key value is null and group use rollup return wrong answer [#49282](https://github.com/ClickHouse/ClickHouse/pull/49282) ([Shuai li](https://github.com/loneylee)).
|
||||||
|
* Fix calculating load_factor for HASHED dictionaries with SHARDS [#49319](https://github.com/ClickHouse/ClickHouse/pull/49319) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Disallow configuring compression CODECs for alias columns [#49363](https://github.com/ClickHouse/ClickHouse/pull/49363) ([Timur Solodovnikov](https://github.com/tsolodov)).
|
||||||
|
* Fix bug in removal of existing part directory [#49365](https://github.com/ClickHouse/ClickHouse/pull/49365) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Properly fix GCS when HMAC is used [#49390](https://github.com/ClickHouse/ClickHouse/pull/49390) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix fuzz bug when subquery set is not built when reading from remote() [#49425](https://github.com/ClickHouse/ClickHouse/pull/49425) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Invert `shutdown_wait_unfinished_queries` [#49427](https://github.com/ClickHouse/ClickHouse/pull/49427) ([Konstantin Bogdanov](https://github.com/thevar1able)).
|
||||||
|
* Fix another zero copy bug [#49473](https://github.com/ClickHouse/ClickHouse/pull/49473) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix postgres database setting [#49481](https://github.com/ClickHouse/ClickHouse/pull/49481) ([Mal Curtis](https://github.com/snikch)).
|
||||||
|
* Correctly handle s3Cluster arguments [#49490](https://github.com/ClickHouse/ClickHouse/pull/49490) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix bug in TraceCollector destructor. [#49508](https://github.com/ClickHouse/ClickHouse/pull/49508) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
|
||||||
|
* Fix AsynchronousReadIndirectBufferFromRemoteFS breaking on short seeks [#49525](https://github.com/ClickHouse/ClickHouse/pull/49525) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Fix dictionaries loading order [#49560](https://github.com/ClickHouse/ClickHouse/pull/49560) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Forbid the change of data type of Object('json') column [#49563](https://github.com/ClickHouse/ClickHouse/pull/49563) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Fix stress test (Logical error: Expected 7134 >= 11030) [#49623](https://github.com/ClickHouse/ClickHouse/pull/49623) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix bug in DISTINCT [#49628](https://github.com/ClickHouse/ClickHouse/pull/49628) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix: DISTINCT in order with zero values in non-sorted columns [#49636](https://github.com/ClickHouse/ClickHouse/pull/49636) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Fix one-off error in big integers found by UBSan with fuzzer [#49645](https://github.com/ClickHouse/ClickHouse/pull/49645) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix reading from sparse columns after restart [#49660](https://github.com/ClickHouse/ClickHouse/pull/49660) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix assert in SpanHolder::finish() with fibers [#49673](https://github.com/ClickHouse/ClickHouse/pull/49673) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix short circuit functions and mutations with sparse arguments [#49716](https://github.com/ClickHouse/ClickHouse/pull/49716) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix writing appended files to incremental backups [#49725](https://github.com/ClickHouse/ClickHouse/pull/49725) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Ignore LWD column in checkPartDynamicColumns [#49737](https://github.com/ClickHouse/ClickHouse/pull/49737) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Fix msan issue in randomStringUTF8(<uneven number>) [#49750](https://github.com/ClickHouse/ClickHouse/pull/49750) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix aggregate function kolmogorovSmirnovTest [#49768](https://github.com/ClickHouse/ClickHouse/pull/49768) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)).
|
||||||
|
* Fix settings aliases in native protocol [#49776](https://github.com/ClickHouse/ClickHouse/pull/49776) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix `arrayMap` with array of tuples with single argument [#49789](https://github.com/ClickHouse/ClickHouse/pull/49789) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix per-query IO/BACKUPs throttling settings [#49797](https://github.com/ClickHouse/ClickHouse/pull/49797) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix setting NULL in profile definition [#49831](https://github.com/ClickHouse/ClickHouse/pull/49831) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Fix a bug with projections and the aggregate_functions_null_for_empty setting (for query_plan_optimize_projection) [#49873](https://github.com/ClickHouse/ClickHouse/pull/49873) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* Fix processing pending batch for Distributed async INSERT after restart [#49884](https://github.com/ClickHouse/ClickHouse/pull/49884) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix assertion in CacheMetadata::doCleanup [#49914](https://github.com/ClickHouse/ClickHouse/pull/49914) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* fix `is_prefix` in OptimizeRegularExpression [#49919](https://github.com/ClickHouse/ClickHouse/pull/49919) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Fix metrics `WriteBufferFromS3Bytes`, `WriteBufferFromS3Microseconds` and `WriteBufferFromS3RequestsErrors` [#49930](https://github.com/ClickHouse/ClickHouse/pull/49930) ([Aleksandr Musorin](https://github.com/AVMusorin)).
|
||||||
|
* Fix IPv6 encoding in protobuf [#49933](https://github.com/ClickHouse/ClickHouse/pull/49933) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)).
|
||||||
|
* Fix possible Logical error on bad Nullable parsing for text formats [#49960](https://github.com/ClickHouse/ClickHouse/pull/49960) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Add setting output_format_parquet_compliant_nested_types to produce more compatible Parquet files [#50001](https://github.com/ClickHouse/ClickHouse/pull/50001) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Fix logical error in stress test "Not enough space to add ..." [#50021](https://github.com/ClickHouse/ClickHouse/pull/50021) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Avoid deadlock when starting table in attach thread of `ReplicatedMergeTree` [#50026](https://github.com/ClickHouse/ClickHouse/pull/50026) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix assert in SpanHolder::finish() with fibers attempt 2 [#50034](https://github.com/ClickHouse/ClickHouse/pull/50034) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Add proper escaping for DDL OpenTelemetry context serialization [#50045](https://github.com/ClickHouse/ClickHouse/pull/50045) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix reporting broken projection parts [#50052](https://github.com/ClickHouse/ClickHouse/pull/50052) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* JIT compilation not equals NaN fix [#50056](https://github.com/ClickHouse/ClickHouse/pull/50056) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Fix crashing in case of Replicated database without arguments [#50058](https://github.com/ClickHouse/ClickHouse/pull/50058) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix crash with `multiIf` and constant condition and nullable arguments [#50123](https://github.com/ClickHouse/ClickHouse/pull/50123) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix invalid index analysis for date related keys [#50153](https://github.com/ClickHouse/ClickHouse/pull/50153) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* do not allow modify order by when there are no order by cols [#50154](https://github.com/ClickHouse/ClickHouse/pull/50154) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Fix broken index analysis when binary operator contains a null constant argument [#50177](https://github.com/ClickHouse/ClickHouse/pull/50177) ([Amos Bird](https://github.com/amosbird)).
|
||||||
|
* clickhouse-client: disallow usage of `--query` and `--queries-file` at the same time [#50210](https://github.com/ClickHouse/ClickHouse/pull/50210) ([Alexey Gerasimchuck](https://github.com/Demilivor)).
|
||||||
|
* Fix UB for INTO OUTFILE extensions (APPEND / AND STDOUT) and WATCH EVENTS [#50216](https://github.com/ClickHouse/ClickHouse/pull/50216) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix skipping spaces at end of row in CustomSeparatedIgnoreSpaces format [#50224](https://github.com/ClickHouse/ClickHouse/pull/50224) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix iceberg metadata parsing [#50232](https://github.com/ClickHouse/ClickHouse/pull/50232) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix nested distributed SELECT in WITH clause [#50234](https://github.com/ClickHouse/ClickHouse/pull/50234) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix reconnecting of HTTPS session when target host IP was changed [#50240](https://github.com/ClickHouse/ClickHouse/pull/50240) ([Aleksei Filatov](https://github.com/aalexfvk)).
|
||||||
|
* Fix msan issue in keyed siphash [#50245](https://github.com/ClickHouse/ClickHouse/pull/50245) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix bugs in Poco sockets in non-blocking mode, use true non-blocking sockets [#50252](https://github.com/ClickHouse/ClickHouse/pull/50252) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix checksum calculation for backup entries [#50264](https://github.com/ClickHouse/ClickHouse/pull/50264) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Fixed type conversion from Date/Date32 to DateTime64 when querying with DateTime64 index [#50280](https://github.com/ClickHouse/ClickHouse/pull/50280) ([Lucas Chang](https://github.com/lucas-tubi)).
|
||||||
|
* Comparison functions NaN fix [#50287](https://github.com/ClickHouse/ClickHouse/pull/50287) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* JIT aggregation nullable key fix [#50291](https://github.com/ClickHouse/ClickHouse/pull/50291) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Fix clickhouse-local crashing when writing empty Arrow or Parquet output [#50328](https://github.com/ClickHouse/ClickHouse/pull/50328) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Fix crash when Pool::Entry::disconnect() is called [#50334](https://github.com/ClickHouse/ClickHouse/pull/50334) ([Val Doroshchuk](https://github.com/valbok)).
|
||||||
|
* Improved fetch part by holding directory lock longer [#50339](https://github.com/ClickHouse/ClickHouse/pull/50339) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Fix bitShift* functions with both constant arguments [#50343](https://github.com/ClickHouse/ClickHouse/pull/50343) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix Keeper deadlock on exception when preprocessing requests. [#50387](https://github.com/ClickHouse/ClickHouse/pull/50387) ([frinkr](https://github.com/frinkr)).
|
||||||
|
* Fix hashing of const integer values [#50421](https://github.com/ClickHouse/ClickHouse/pull/50421) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix excessive memory usage for FINAL (due to too much streams usage) [#50429](https://github.com/ClickHouse/ClickHouse/pull/50429) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix merge_tree_min_rows_for_seek/merge_tree_min_bytes_for_seek for data skipping indexes [#50432](https://github.com/ClickHouse/ClickHouse/pull/50432) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Limit the number of in-flight tasks for loading outdated parts [#50450](https://github.com/ClickHouse/ClickHouse/pull/50450) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Keeper fix: apply uncommitted state after snapshot install [#50483](https://github.com/ClickHouse/ClickHouse/pull/50483) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix incorrect constant folding [#50536](https://github.com/ClickHouse/ClickHouse/pull/50536) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix logical error in stress test (Not enough space to add ...) [#50583](https://github.com/ClickHouse/ClickHouse/pull/50583) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix converting Null to LowCardinality(Nullable) in values table function [#50637](https://github.com/ClickHouse/ClickHouse/pull/50637) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Fix crash in anti/semi join [#50638](https://github.com/ClickHouse/ClickHouse/pull/50638) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Revert invalid RegExpTreeDictionary optimization [#50642](https://github.com/ClickHouse/ClickHouse/pull/50642) ([Johann Gan](https://github.com/johanngan)).
|
||||||
|
* Correctly disable async insert with deduplication when it's not needed [#50663](https://github.com/ClickHouse/ClickHouse/pull/50663) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
|
||||||
|
#### Build Improvement
|
||||||
|
|
||||||
|
* Fixed Functional Test 00870_t64_codec, 00871_t64_codec_signed, 00872_t64_bit_codec. [#49658](https://github.com/ClickHouse/ClickHouse/pull/49658) ([Sanjam Panda](https://github.com/saitama951)).
|
||||||
|
|
||||||
|
#### NO CL ENTRY
|
||||||
|
|
||||||
|
* NO CL ENTRY: 'Fix user MemoryTracker counter in async inserts'. [#47630](https://github.com/ClickHouse/ClickHouse/pull/47630) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* NO CL ENTRY: 'Revert "Make `Pretty` formats even prettier."'. [#49850](https://github.com/ClickHouse/ClickHouse/pull/49850) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* NO CL ENTRY: 'Update first_value.md:remove redundant 's''. [#50331](https://github.com/ClickHouse/ClickHouse/pull/50331) ([sslouis](https://github.com/savezed)).
|
||||||
|
* NO CL ENTRY: 'Revert "less logs in WriteBufferFromS3"'. [#50390](https://github.com/ClickHouse/ClickHouse/pull/50390) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
|
||||||
|
#### NOT FOR CHANGELOG / INSIGNIFICANT
|
||||||
|
|
||||||
|
* Attempt to fix the "system.stack_trace" test [#44627](https://github.com/ClickHouse/ClickHouse/pull/44627) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* rework WriteBufferFromS3, add tests, add abortion [#44869](https://github.com/ClickHouse/ClickHouse/pull/44869) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Rework locking in fs cache [#44985](https://github.com/ClickHouse/ClickHouse/pull/44985) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Update ubuntu_ami_for_ci.sh [#47151](https://github.com/ClickHouse/ClickHouse/pull/47151) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
* Implement status comment [#48468](https://github.com/ClickHouse/ClickHouse/pull/48468) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Update curl to 8.0.1 (for CVEs) [#48765](https://github.com/ClickHouse/ClickHouse/pull/48765) ([Boris Kuschel](https://github.com/bkuschel)).
|
||||||
|
* Fix some tests [#48792](https://github.com/ClickHouse/ClickHouse/pull/48792) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Bug Fix for 02432_s3_parallel_parts_cleanup.sql with zero copy replication [#48865](https://github.com/ClickHouse/ClickHouse/pull/48865) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Add AsyncLoader with dependency tracking and runtime prioritization [#48923](https://github.com/ClickHouse/ClickHouse/pull/48923) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Fix incorrect createColumn call on join clause [#48998](https://github.com/ClickHouse/ClickHouse/pull/48998) ([Ongkong](https://github.com/ongkong)).
|
||||||
|
* Try fix flaky 01346_alter_enum_partition_key_replicated_zookeeper_long [#49099](https://github.com/ClickHouse/ClickHouse/pull/49099) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Fix possible logical error "Cannot cancel. Either no query sent or already cancelled" [#49106](https://github.com/ClickHouse/ClickHouse/pull/49106) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Refactor ColumnLowCardinality::cutAndCompact [#49111](https://github.com/ClickHouse/ClickHouse/pull/49111) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
* Fix tests with enabled analyzer [#49116](https://github.com/ClickHouse/ClickHouse/pull/49116) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Use `SharedMutex` instead of `UpgradableMutex` [#49139](https://github.com/ClickHouse/ClickHouse/pull/49139) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Don't add metadata_version file if it doesn't exist [#49146](https://github.com/ClickHouse/ClickHouse/pull/49146) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* clearing s3 between tests in a robust way [#49157](https://github.com/ClickHouse/ClickHouse/pull/49157) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Align connect timeout with aws sdk default [#49161](https://github.com/ClickHouse/ClickHouse/pull/49161) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Fix test_encrypted_disk_replication [#49193](https://github.com/ClickHouse/ClickHouse/pull/49193) ([Vitaly Baranov](https://github.com/vitlibar)).
|
||||||
|
* Allow using function `concat` with `Map` type [#49200](https://github.com/ClickHouse/ClickHouse/pull/49200) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Slight improvements to coordinator logging [#49204](https://github.com/ClickHouse/ClickHouse/pull/49204) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Fix some typos in conversion functions [#49221](https://github.com/ClickHouse/ClickHouse/pull/49221) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* CMake: Remove some GCC-specific code [#49224](https://github.com/ClickHouse/ClickHouse/pull/49224) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix oss-fuzz build errors [#49236](https://github.com/ClickHouse/ClickHouse/pull/49236) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Update version after release [#49237](https://github.com/ClickHouse/ClickHouse/pull/49237) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Update version_date.tsv and changelogs after v23.4.1.1943-stable [#49239](https://github.com/ClickHouse/ClickHouse/pull/49239) ([robot-clickhouse](https://github.com/robot-clickhouse)).
|
||||||
|
* Merge [#24050](https://github.com/ClickHouse/ClickHouse/issues/24050) [#49240](https://github.com/ClickHouse/ClickHouse/pull/49240) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Add file name to exception raised during decompression [#49241](https://github.com/ClickHouse/ClickHouse/pull/49241) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Disable ISA-L on aarch64 architectures [#49256](https://github.com/ClickHouse/ClickHouse/pull/49256) ([Jordi Villar](https://github.com/jrdi)).
|
||||||
|
* Add a comment in FileCache.cpp [#49260](https://github.com/ClickHouse/ClickHouse/pull/49260) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix garbage [#48719](https://github.com/ClickHouse/ClickHouse/issues/48719) [#49263](https://github.com/ClickHouse/ClickHouse/pull/49263) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Update build for nasm [#49288](https://github.com/ClickHouse/ClickHouse/pull/49288) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix race in `waitForProcessingQueue` [#49302](https://github.com/ClickHouse/ClickHouse/pull/49302) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Fix stress test [#49309](https://github.com/ClickHouse/ClickHouse/pull/49309) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix 02516_join_with_totals_and_subquery_bug with new analyzer [#49310](https://github.com/ClickHouse/ClickHouse/pull/49310) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Fallback auth gh api [#49314](https://github.com/ClickHouse/ClickHouse/pull/49314) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Unpoison stack frame ptrs from libunwind for msan [#49316](https://github.com/ClickHouse/ClickHouse/pull/49316) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Respect projections in 01600_parts [#49318](https://github.com/ClickHouse/ClickHouse/pull/49318) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
* move pipe compute into initializePipeline [#49326](https://github.com/ClickHouse/ClickHouse/pull/49326) ([Konstantin Morozov](https://github.com/k-morozov)).
|
||||||
|
* Fix compiling average example (suppress -Wframe-larger-than) [#49358](https://github.com/ClickHouse/ClickHouse/pull/49358) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix join_use_nulls in analyzer [#49359](https://github.com/ClickHouse/ClickHouse/pull/49359) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Fix 02680_mysql_ast_logical_err in analyzer [#49362](https://github.com/ClickHouse/ClickHouse/pull/49362) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Remove wrong assertion in cache [#49376](https://github.com/ClickHouse/ClickHouse/pull/49376) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* A better way of excluding ISA-L on non-x86 [#49378](https://github.com/ClickHouse/ClickHouse/pull/49378) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix decimal aggregates test for s390x [#49382](https://github.com/ClickHouse/ClickHouse/pull/49382) ([Harry Lee](https://github.com/HarryLeeIBM)).
|
||||||
|
* Move logging one line higher [#49387](https://github.com/ClickHouse/ClickHouse/pull/49387) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Improve CI: status commit, auth for get_gh_api [#49388](https://github.com/ClickHouse/ClickHouse/pull/49388) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Fix printing hung queries in clickhouse-test. [#49389](https://github.com/ClickHouse/ClickHouse/pull/49389) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
* Correctly stop CNF convert for too many atomics in new analyzer [#49402](https://github.com/ClickHouse/ClickHouse/pull/49402) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Remove 02707_complex_query_fails_analyzer test [#49403](https://github.com/ClickHouse/ClickHouse/pull/49403) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Update FileSegment.cpp [#49411](https://github.com/ClickHouse/ClickHouse/pull/49411) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Switch Block::NameMap to google::dense_hash_map over HashMap [#49412](https://github.com/ClickHouse/ClickHouse/pull/49412) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Slightly reduce inter-header dependencies [#49413](https://github.com/ClickHouse/ClickHouse/pull/49413) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Update WithFileName.cpp [#49414](https://github.com/ClickHouse/ClickHouse/pull/49414) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Fix some assertions failing in stress test [#49415](https://github.com/ClickHouse/ClickHouse/pull/49415) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Correctly cleanup sequential node in ZooKeeperWithFaultInjection [#49418](https://github.com/ClickHouse/ClickHouse/pull/49418) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Throw an exception for non-parametric functions in new analyzer [#49419](https://github.com/ClickHouse/ClickHouse/pull/49419) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Fix some bad error messages [#49420](https://github.com/ClickHouse/ClickHouse/pull/49420) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Update version_date.tsv and changelogs after v23.4.2.11-stable [#49422](https://github.com/ClickHouse/ClickHouse/pull/49422) ([robot-clickhouse](https://github.com/robot-clickhouse)).
|
||||||
|
* Remove trash [#49423](https://github.com/ClickHouse/ClickHouse/pull/49423) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Whitespaces [#49424](https://github.com/ClickHouse/ClickHouse/pull/49424) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Remove dependency from DB::Context in remote/cache readers [#49426](https://github.com/ClickHouse/ClickHouse/pull/49426) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Merging [#49066](https://github.com/ClickHouse/ClickHouse/issues/49066) (Better error handling during loading of parts) [#49430](https://github.com/ClickHouse/ClickHouse/pull/49430) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* all s3-blobs removed when merge aborted, remove part from failed fetch without unlock keper [#49432](https://github.com/ClickHouse/ClickHouse/pull/49432) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Make INSERT do more things in parallel to avoid getting bottlenecked on one thread [#49434](https://github.com/ClickHouse/ClickHouse/pull/49434) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Make 'exceptions shorter than 30' test less noisy [#49435](https://github.com/ClickHouse/ClickHouse/pull/49435) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Build fixes for ENABLE_LIBRARIES=OFF [#49437](https://github.com/ClickHouse/ClickHouse/pull/49437) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Add image for docker-server jepsen [#49452](https://github.com/ClickHouse/ClickHouse/pull/49452) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Follow-up to [#48792](https://github.com/ClickHouse/ClickHouse/issues/48792) [#49458](https://github.com/ClickHouse/ClickHouse/pull/49458) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Add method `getCurrentAvailabilityZone` to `AWSEC2MetadataClient` [#49464](https://github.com/ClickHouse/ClickHouse/pull/49464) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Add an integration test for `shutdown_wait_unfinished_queries` [#49469](https://github.com/ClickHouse/ClickHouse/pull/49469) ([Konstantin Bogdanov](https://github.com/thevar1able)).
|
||||||
|
* Replace `NO DELAY` with `SYNC` in tests [#49470](https://github.com/ClickHouse/ClickHouse/pull/49470) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Check the PRs body directly in lambda, without rerun. Fix RCE in the CI [#49475](https://github.com/ClickHouse/ClickHouse/pull/49475) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Minor changes for setThreadName [#49476](https://github.com/ClickHouse/ClickHouse/pull/49476) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Static cast std::atomic<size_t> to uint64_t to serialize. [#49482](https://github.com/ClickHouse/ClickHouse/pull/49482) ([alekar](https://github.com/alekar)).
|
||||||
|
* Fix logical error in stress test, add some logging [#49491](https://github.com/ClickHouse/ClickHouse/pull/49491) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fixes in server jepsen image [#49492](https://github.com/ClickHouse/ClickHouse/pull/49492) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix UserTimeMicroseconds and SystemTimeMicroseconds descriptions [#49521](https://github.com/ClickHouse/ClickHouse/pull/49521) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Remove garbage from HDFS [#49531](https://github.com/ClickHouse/ClickHouse/pull/49531) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Split ReadWriteBufferFromHTTP.h into .h and .cpp file [#49533](https://github.com/ClickHouse/ClickHouse/pull/49533) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Remove garbage from Pretty format [#49534](https://github.com/ClickHouse/ClickHouse/pull/49534) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Make input_format_parquet_preserve_order imply !parallelize_output_from_storages [#49536](https://github.com/ClickHouse/ClickHouse/pull/49536) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Remove extra semicolons [#49545](https://github.com/ClickHouse/ClickHouse/pull/49545) ([Bulat Gaifullin](https://github.com/bgaifullin)).
|
||||||
|
* Fix 00597_push_down_predicate_long for analyzer [#49551](https://github.com/ClickHouse/ClickHouse/pull/49551) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Fix stress test (assertion 'key_metadata.lock()') [#49554](https://github.com/ClickHouse/ClickHouse/pull/49554) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix writeAnyEscapedString if quote_character is a meta character [#49558](https://github.com/ClickHouse/ClickHouse/pull/49558) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Add CMake option for BOOST_USE_UCONTEXT [#49564](https://github.com/ClickHouse/ClickHouse/pull/49564) ([ltrk2](https://github.com/ltrk2)).
|
||||||
|
* Fix 01655_plan_optimizations_optimize_read_in_window_order for analyzer [#49565](https://github.com/ClickHouse/ClickHouse/pull/49565) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Fix `ThreadPool::wait` [#49572](https://github.com/ClickHouse/ClickHouse/pull/49572) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Query cache: disable for internal queries [#49573](https://github.com/ClickHouse/ClickHouse/pull/49573) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Remove `test_merge_tree_s3_restore` [#49576](https://github.com/ClickHouse/ClickHouse/pull/49576) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix bad test [#49578](https://github.com/ClickHouse/ClickHouse/pull/49578) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Remove obsolete test about deprecated feature [#49579](https://github.com/ClickHouse/ClickHouse/pull/49579) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Avoid error found by AST Fuzzer [#49580](https://github.com/ClickHouse/ClickHouse/pull/49580) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix wrong assert [#49581](https://github.com/ClickHouse/ClickHouse/pull/49581) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Flaky test 02723_zookeeper_name.sql [#49592](https://github.com/ClickHouse/ClickHouse/pull/49592) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Query Cache: Safeguard against empty chunks [#49593](https://github.com/ClickHouse/ClickHouse/pull/49593) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* 02723_zookeeper_name: Force a deterministic result order [#49594](https://github.com/ClickHouse/ClickHouse/pull/49594) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Remove dangerous code (stringstream) [#49595](https://github.com/ClickHouse/ClickHouse/pull/49595) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Remove some code [#49596](https://github.com/ClickHouse/ClickHouse/pull/49596) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Remove "locale" [#49597](https://github.com/ClickHouse/ClickHouse/pull/49597) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* CMake: Cleanup utils build [#49598](https://github.com/ClickHouse/ClickHouse/pull/49598) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Follow-up for [#49580](https://github.com/ClickHouse/ClickHouse/issues/49580) [#49604](https://github.com/ClickHouse/ClickHouse/pull/49604) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix typo [#49605](https://github.com/ClickHouse/ClickHouse/pull/49605) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix bad test 01660_system_parts_smoke [#49611](https://github.com/ClickHouse/ClickHouse/pull/49611) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Minor changes [#49612](https://github.com/ClickHouse/ClickHouse/pull/49612) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Follow-up for [#49576](https://github.com/ClickHouse/ClickHouse/issues/49576) [#49615](https://github.com/ClickHouse/ClickHouse/pull/49615) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix error in [#48300](https://github.com/ClickHouse/ClickHouse/issues/48300) [#49616](https://github.com/ClickHouse/ClickHouse/pull/49616) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix typo: "as much slots" -> "as many slots" [#49617](https://github.com/ClickHouse/ClickHouse/pull/49617) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Better concurrent parts removal with zero copy [#49619](https://github.com/ClickHouse/ClickHouse/pull/49619) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* CMake: Remove legacy switch for ccache [#49627](https://github.com/ClickHouse/ClickHouse/pull/49627) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Try to fix integration test 'test_ssl_cert_authentication' [#49632](https://github.com/ClickHouse/ClickHouse/pull/49632) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Unflake 01660_system_parts_smoke [#49633](https://github.com/ClickHouse/ClickHouse/pull/49633) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Add trash [#49634](https://github.com/ClickHouse/ClickHouse/pull/49634) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Remove commented code [#49635](https://github.com/ClickHouse/ClickHouse/pull/49635) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Add flaky test [#49646](https://github.com/ClickHouse/ClickHouse/pull/49646) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix race in `Context::createCopy` [#49663](https://github.com/ClickHouse/ClickHouse/pull/49663) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Disable 01710_projection_aggregation_in_order.sql [#49667](https://github.com/ClickHouse/ClickHouse/pull/49667) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Fix flaky 02684_bson.sql [#49674](https://github.com/ClickHouse/ClickHouse/pull/49674) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Some cache cleanup after rework locking [#49675](https://github.com/ClickHouse/ClickHouse/pull/49675) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Correctly update log pointer during database replica recovery [#49676](https://github.com/ClickHouse/ClickHouse/pull/49676) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Enable distinct in order after fix [#49636](https://github.com/ClickHouse/ClickHouse/issues/49636) [#49677](https://github.com/ClickHouse/ClickHouse/pull/49677) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Build fixes for RISCV64 [#49688](https://github.com/ClickHouse/ClickHouse/pull/49688) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Add some logging [#49690](https://github.com/ClickHouse/ClickHouse/pull/49690) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix a wrong built generator removal, use `depth=1` [#49692](https://github.com/ClickHouse/ClickHouse/pull/49692) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Fix member call on null pointer in AST fuzzer [#49696](https://github.com/ClickHouse/ClickHouse/pull/49696) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Improve woboq codebrowser pipeline [#49701](https://github.com/ClickHouse/ClickHouse/pull/49701) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Enable `do_not_evict_index_and_mark_files` by default [#49702](https://github.com/ClickHouse/ClickHouse/pull/49702) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Backport fix for UBSan error in musl/logf.c [#49705](https://github.com/ClickHouse/ClickHouse/pull/49705) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Fix flaky test for `kolmogorovSmirnovTest` function [#49710](https://github.com/ClickHouse/ClickHouse/pull/49710) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Update clickhouse-test [#49712](https://github.com/ClickHouse/ClickHouse/pull/49712) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* IBM s390x: ip encoding fix [#49713](https://github.com/ClickHouse/ClickHouse/pull/49713) ([Suzy Wang](https://github.com/SuzyWangIBMer)).
|
||||||
|
* Remove not used ErrorCodes [#49715](https://github.com/ClickHouse/ClickHouse/pull/49715) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Disable mmap for StorageFile in clickhouse-server [#49717](https://github.com/ClickHouse/ClickHouse/pull/49717) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix typo [#49718](https://github.com/ClickHouse/ClickHouse/pull/49718) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Do not launch workflows for PRs w/o "can be tested" [#49726](https://github.com/ClickHouse/ClickHouse/pull/49726) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Move assertions after logging [#49729](https://github.com/ClickHouse/ClickHouse/pull/49729) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Docs: Fix sidebar label for dictionary table function [#49730](https://github.com/ClickHouse/ClickHouse/pull/49730) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Do not allocate own buffer in CachedOnDiskReadBufferFromFile when `use_external_buffer == true` [#49733](https://github.com/ClickHouse/ClickHouse/pull/49733) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* fix convertation [#49749](https://github.com/ClickHouse/ClickHouse/pull/49749) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* fix flaky test 02504_regexp_dictionary_ua_parser [#49753](https://github.com/ClickHouse/ClickHouse/pull/49753) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Fix unit test `ExceptionFromWait` [#49755](https://github.com/ClickHouse/ClickHouse/pull/49755) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Add forgotten lock (addition to [#49117](https://github.com/ClickHouse/ClickHouse/issues/49117)) [#49757](https://github.com/ClickHouse/ClickHouse/pull/49757) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Fix typo [#49762](https://github.com/ClickHouse/ClickHouse/pull/49762) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Fix build of `libfiu` on clang-16 [#49766](https://github.com/ClickHouse/ClickHouse/pull/49766) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Update README.md [#49782](https://github.com/ClickHouse/ClickHouse/pull/49782) ([Tyler Hannan](https://github.com/tylerhannan)).
|
||||||
|
* Analyzer: fix column not found for optimized prewhere with sample by [#49784](https://github.com/ClickHouse/ClickHouse/pull/49784) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Typo: demange.cpp --> demangle.cpp [#49799](https://github.com/ClickHouse/ClickHouse/pull/49799) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Analyzer: apply _CAST to constants only once [#49800](https://github.com/ClickHouse/ClickHouse/pull/49800) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Use CLOCK_MONOTONIC_RAW over CLOCK_MONOTONIC on Linux (fixes non monotonic clock) [#49819](https://github.com/ClickHouse/ClickHouse/pull/49819) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* README.md: 4 --> 5 [#49822](https://github.com/ClickHouse/ClickHouse/pull/49822) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Allow ASOF JOIN over nullable right column [#49826](https://github.com/ClickHouse/ClickHouse/pull/49826) ([vdimir](https://github.com/vdimir)).
|
||||||
|
* Make 01533_multiple_nested test more reliable [#49828](https://github.com/ClickHouse/ClickHouse/pull/49828) ([Salvatore Mesoraca](https://github.com/aiven-sal)).
|
||||||
|
* What happens if I remove everything in msan_suppressions? [#49829](https://github.com/ClickHouse/ClickHouse/pull/49829) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Update README.md [#49832](https://github.com/ClickHouse/ClickHouse/pull/49832) ([AnneClickHouse](https://github.com/AnneClickHouse)).
|
||||||
|
* Randomize enable_multiple_prewhere_read_steps setting [#49834](https://github.com/ClickHouse/ClickHouse/pull/49834) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Analyzer: do not optimize GROUP BY keys with ROLLUP and CUBE [#49838](https://github.com/ClickHouse/ClickHouse/pull/49838) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Clearable hash table and zero values [#49846](https://github.com/ClickHouse/ClickHouse/pull/49846) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Reset vectorscan reference to an "official" repo [#49848](https://github.com/ClickHouse/ClickHouse/pull/49848) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Enable few slow clang-tidy checks for clangd [#49855](https://github.com/ClickHouse/ClickHouse/pull/49855) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Update QPL docs [#49857](https://github.com/ClickHouse/ClickHouse/pull/49857) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Small-ish .clang-tidy update [#49859](https://github.com/ClickHouse/ClickHouse/pull/49859) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Follow-up for clang-tidy [#49861](https://github.com/ClickHouse/ClickHouse/pull/49861) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix "reference to local binding" after fixes for clang-17 [#49874](https://github.com/ClickHouse/ClickHouse/pull/49874) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* fix typo [#49876](https://github.com/ClickHouse/ClickHouse/pull/49876) ([JackyWoo](https://github.com/JackyWoo)).
|
||||||
|
* Log with warning if the server was terminated forcefully [#49881](https://github.com/ClickHouse/ClickHouse/pull/49881) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix some tests [#49889](https://github.com/ClickHouse/ClickHouse/pull/49889) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* use chassert in MergeTreeDeduplicationLog to have better log info [#49891](https://github.com/ClickHouse/ClickHouse/pull/49891) ([Han Fei](https://github.com/hanfei1991)).
|
||||||
|
* Multiple pools support for AsyncLoader [#49893](https://github.com/ClickHouse/ClickHouse/pull/49893) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Fix stack-use-after-scope in resource manager test [#49908](https://github.com/ClickHouse/ClickHouse/pull/49908) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Retry connection expired in test_rename_column/test.py [#49911](https://github.com/ClickHouse/ClickHouse/pull/49911) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Try to fix flaky test_distributed_load_balancing tests [#49912](https://github.com/ClickHouse/ClickHouse/pull/49912) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Remove unused code [#49918](https://github.com/ClickHouse/ClickHouse/pull/49918) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix flakiness of test_distributed_load_balancing test [#49921](https://github.com/ClickHouse/ClickHouse/pull/49921) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Add some logging [#49925](https://github.com/ClickHouse/ClickHouse/pull/49925) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Support hardlinking parts transactionally [#49931](https://github.com/ClickHouse/ClickHouse/pull/49931) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Fix for analyzer: 02377_ optimize_sorting_by_input_stream_properties_e… [#49943](https://github.com/ClickHouse/ClickHouse/pull/49943) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Follow up to [#49429](https://github.com/ClickHouse/ClickHouse/issues/49429) [#49964](https://github.com/ClickHouse/ClickHouse/pull/49964) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix flaky test_ssl_cert_authentication to use urllib3 [#49982](https://github.com/ClickHouse/ClickHouse/pull/49982) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
* Fix woboq codebrowser build with -Wno-poison-system-directories [#49992](https://github.com/ClickHouse/ClickHouse/pull/49992) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* test for [#46128](https://github.com/ClickHouse/ClickHouse/issues/46128) [#49993](https://github.com/ClickHouse/ClickHouse/pull/49993) ([Denny Crane](https://github.com/den-crane)).
|
||||||
|
* Fix test_insert_same_partition_and_merge failing if one Azure request attempt fails [#49996](https://github.com/ClickHouse/ClickHouse/pull/49996) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Check return value of `ftruncate` in Keeper [#50020](https://github.com/ClickHouse/ClickHouse/pull/50020) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Add some assertions [#50025](https://github.com/ClickHouse/ClickHouse/pull/50025) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Update 02441_alter_delete_and_drop_column.sql [#50027](https://github.com/ClickHouse/ClickHouse/pull/50027) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Move some common code to common [#50028](https://github.com/ClickHouse/ClickHouse/pull/50028) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Add method getCredentials() to S3::Client [#50030](https://github.com/ClickHouse/ClickHouse/pull/50030) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Update query_log.md [#50032](https://github.com/ClickHouse/ClickHouse/pull/50032) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Get rid of indirect write buffer in object storages [#50033](https://github.com/ClickHouse/ClickHouse/pull/50033) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Load balancing bugfixes [#50036](https://github.com/ClickHouse/ClickHouse/pull/50036) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Update S3 sdk to v1.11.61 [#50037](https://github.com/ClickHouse/ClickHouse/pull/50037) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Fix 02735_system_zookeeper_connection for DatabaseReplicated [#50047](https://github.com/ClickHouse/ClickHouse/pull/50047) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Add more profile events for distributed connections [#50051](https://github.com/ClickHouse/ClickHouse/pull/50051) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* FileCache: simple tryReserve() cleanup [#50059](https://github.com/ClickHouse/ClickHouse/pull/50059) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Fix hashed/sparse_hashed dictionaries max_load_factor upper range [#50065](https://github.com/ClickHouse/ClickHouse/pull/50065) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Clearer coordinator log [#50101](https://github.com/ClickHouse/ClickHouse/pull/50101) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Analyzer: Do not execute table functions multiple times [#50105](https://github.com/ClickHouse/ClickHouse/pull/50105) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Update default settings for Replicated database [#50108](https://github.com/ClickHouse/ClickHouse/pull/50108) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Make async prefetched buffer work with arbitrary impl [#50109](https://github.com/ClickHouse/ClickHouse/pull/50109) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Update github.com/distribution/distribution [#50114](https://github.com/ClickHouse/ClickHouse/pull/50114) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Docs: Update clickhouse-local arguments [#50138](https://github.com/ClickHouse/ClickHouse/pull/50138) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Change fields destruction order in AsyncTaskExecutor [#50151](https://github.com/ClickHouse/ClickHouse/pull/50151) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Follow-up to [#49889](https://github.com/ClickHouse/ClickHouse/issues/49889) [#50152](https://github.com/ClickHouse/ClickHouse/pull/50152) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Clarification comment on retries controller behavior [#50155](https://github.com/ClickHouse/ClickHouse/pull/50155) ([Igor Nikonov](https://github.com/devcrafter)).
|
||||||
|
* Switch to upstream repository of vectorscan [#50159](https://github.com/ClickHouse/ClickHouse/pull/50159) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Refactor lambdas, prepare to prio runners [#50160](https://github.com/ClickHouse/ClickHouse/pull/50160) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Speed-up the shellcheck with parallel xargs [#50164](https://github.com/ClickHouse/ClickHouse/pull/50164) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Update an exception message [#50180](https://github.com/ClickHouse/ClickHouse/pull/50180) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Upgrade boost submodule [#50188](https://github.com/ClickHouse/ClickHouse/pull/50188) ([ltrk2](https://github.com/ltrk2)).
|
||||||
|
* Implement a uniform way to query processor core IDs [#50190](https://github.com/ClickHouse/ClickHouse/pull/50190) ([ltrk2](https://github.com/ltrk2)).
|
||||||
|
* Don't replicate delete through DDL worker if there is just 1 shard [#50193](https://github.com/ClickHouse/ClickHouse/pull/50193) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Fix codebrowser by using clang-15 image [#50197](https://github.com/ClickHouse/ClickHouse/pull/50197) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Add comments to build reports [#50200](https://github.com/ClickHouse/ClickHouse/pull/50200) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Automatic backports of important fixes to cloud-release [#50202](https://github.com/ClickHouse/ClickHouse/pull/50202) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Unify priorities: lower value means higher priority [#50205](https://github.com/ClickHouse/ClickHouse/pull/50205) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Use transactions for encrypted disks [#50206](https://github.com/ClickHouse/ClickHouse/pull/50206) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Get detailed error instead of unknown error for function test [#50207](https://github.com/ClickHouse/ClickHouse/pull/50207) ([Suzy Wang](https://github.com/SuzyWangIBMer)).
|
||||||
|
* README.md: Remove Berlin Meetup from upcoming events [#50218](https://github.com/ClickHouse/ClickHouse/pull/50218) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Minor adjustment of clickhouse-client/local parameter docs [#50219](https://github.com/ClickHouse/ClickHouse/pull/50219) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Unify priorities: rework IO scheduling subsystem [#50231](https://github.com/ClickHouse/ClickHouse/pull/50231) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Add new metrics BrokenDistributedBytesToInsert/DistributedBytesToInsert [#50238](https://github.com/ClickHouse/ClickHouse/pull/50238) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Fix URL in backport comment [#50241](https://github.com/ClickHouse/ClickHouse/pull/50241) ([pufit](https://github.com/pufit)).
|
||||||
|
* Fix `02535_max_parallel_replicas_custom_key` [#50242](https://github.com/ClickHouse/ClickHouse/pull/50242) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fixes for MergeTree with readonly disks [#50244](https://github.com/ClickHouse/ClickHouse/pull/50244) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Yet another refactoring [#50257](https://github.com/ClickHouse/ClickHouse/pull/50257) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Unify priorities: rework AsyncLoader [#50272](https://github.com/ClickHouse/ClickHouse/pull/50272) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* buffers d-tor finalize free [#50275](https://github.com/ClickHouse/ClickHouse/pull/50275) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Fix 02767_into_outfile_extensions_msan under analyzer [#50290](https://github.com/ClickHouse/ClickHouse/pull/50290) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* QPL: Add a comment about isal [#50308](https://github.com/ClickHouse/ClickHouse/pull/50308) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Avoid clang 15 crash [#50310](https://github.com/ClickHouse/ClickHouse/pull/50310) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Cleanup Annoy index [#50312](https://github.com/ClickHouse/ClickHouse/pull/50312) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix flaky `AsyncLoader.StaticPriorities` unit test [#50313](https://github.com/ClickHouse/ClickHouse/pull/50313) ([Sergei Trifonov](https://github.com/serxa)).
|
||||||
|
* Update gtest_async_loader.cpp [#50317](https://github.com/ClickHouse/ClickHouse/pull/50317) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Fix IS (NOT) NULL operator priority [#50327](https://github.com/ClickHouse/ClickHouse/pull/50327) ([Nikolay Degterinsky](https://github.com/evillique)).
|
||||||
|
* Update README.md [#50340](https://github.com/ClickHouse/ClickHouse/pull/50340) ([Tyler Hannan](https://github.com/tylerhannan)).
|
||||||
|
* do not fix the event list in test [#50342](https://github.com/ClickHouse/ClickHouse/pull/50342) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* less logs in WriteBufferFromS3 [#50347](https://github.com/ClickHouse/ClickHouse/pull/50347) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Remove legacy install scripts superseded by universal.sh [#50360](https://github.com/ClickHouse/ClickHouse/pull/50360) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fail perf tests when too many queries slowed down [#50361](https://github.com/ClickHouse/ClickHouse/pull/50361) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Fix after [#50109](https://github.com/ClickHouse/ClickHouse/issues/50109) [#50362](https://github.com/ClickHouse/ClickHouse/pull/50362) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix log message [#50363](https://github.com/ClickHouse/ClickHouse/pull/50363) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Compare functions NaN update test [#50366](https://github.com/ClickHouse/ClickHouse/pull/50366) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Add re-creation for cherry-pick PRs [#50373](https://github.com/ClickHouse/ClickHouse/pull/50373) ([pufit](https://github.com/pufit)).
|
||||||
|
* Without applying `prepareRightBlock` will cause mismatch block structrue [#50383](https://github.com/ClickHouse/ClickHouse/pull/50383) ([lgbo](https://github.com/lgbo-ustc)).
|
||||||
|
* fix hung in unit tests [#50391](https://github.com/ClickHouse/ClickHouse/pull/50391) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Fix poll timeout in MaterializedMySQL [#50392](https://github.com/ClickHouse/ClickHouse/pull/50392) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Compile aggregate expressions enable by default [#50401](https://github.com/ClickHouse/ClickHouse/pull/50401) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Update app.py [#50407](https://github.com/ClickHouse/ClickHouse/pull/50407) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* reuse s3_mocks, rewrite test test_paranoid_check_in_logs [#50408](https://github.com/ClickHouse/ClickHouse/pull/50408) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* test for [#42610](https://github.com/ClickHouse/ClickHouse/issues/42610) [#50409](https://github.com/ClickHouse/ClickHouse/pull/50409) ([Denny Crane](https://github.com/den-crane)).
|
||||||
|
* Remove something [#50411](https://github.com/ClickHouse/ClickHouse/pull/50411) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Mark the builds without results as pending [#50415](https://github.com/ClickHouse/ClickHouse/pull/50415) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Revert "Fix msan issue in keyed siphash" [#50426](https://github.com/ClickHouse/ClickHouse/pull/50426) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Revert "Revert "less logs in WriteBufferFromS3" ([#50390](https://github.com/ClickHouse/ClickHouse/issues/50390))" [#50444](https://github.com/ClickHouse/ClickHouse/pull/50444) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Paranoid fix for removing parts from ZooKeeper [#50448](https://github.com/ClickHouse/ClickHouse/pull/50448) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Add timeout for unit tests [#50449](https://github.com/ClickHouse/ClickHouse/pull/50449) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Changes related to an internal feature [#50453](https://github.com/ClickHouse/ClickHouse/pull/50453) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Don't crash if config doesn't have logger section [#50455](https://github.com/ClickHouse/ClickHouse/pull/50455) ([Michael Kolupaev](https://github.com/al13n321)).
|
||||||
|
* Update function docs [#50466](https://github.com/ClickHouse/ClickHouse/pull/50466) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Revert "make filter push down through cross join" [#50467](https://github.com/ClickHouse/ClickHouse/pull/50467) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Add some assertions [#50470](https://github.com/ClickHouse/ClickHouse/pull/50470) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* CI: Enable aspell on nested docs [#50476](https://github.com/ClickHouse/ClickHouse/pull/50476) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Try fix flaky test test_async_query_sending [#50480](https://github.com/ClickHouse/ClickHouse/pull/50480) ([Kruglov Pavel](https://github.com/Avogar)).
|
||||||
|
* Disable 00534_functions_bad_arguments with msan [#50481](https://github.com/ClickHouse/ClickHouse/pull/50481) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||||
|
* Typos: Follow-up to [#50476](https://github.com/ClickHouse/ClickHouse/issues/50476) [#50482](https://github.com/ClickHouse/ClickHouse/pull/50482) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Remove unneeded Keeper test [#50485](https://github.com/ClickHouse/ClickHouse/pull/50485) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Fix KeyError in cherry-pick [#50493](https://github.com/ClickHouse/ClickHouse/pull/50493) ([pufit](https://github.com/pufit)).
|
||||||
|
* Make typeid_cast for pointers noexcept [#50495](https://github.com/ClickHouse/ClickHouse/pull/50495) ([Sergey Kazmin ](https://github.com/yerseg)).
|
||||||
|
* less traces in logs [#50518](https://github.com/ClickHouse/ClickHouse/pull/50518) ([Sema Checherinda](https://github.com/CheSema)).
|
||||||
|
* Implement endianness-independent serialization for UUID [#50519](https://github.com/ClickHouse/ClickHouse/pull/50519) ([ltrk2](https://github.com/ltrk2)).
|
||||||
|
* Remove strange object storage methods [#50521](https://github.com/ClickHouse/ClickHouse/pull/50521) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix low quality code around metadata in RocksDB (experimental feature never used in production) [#50527](https://github.com/ClickHouse/ClickHouse/pull/50527) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Function if constant folding [#50529](https://github.com/ClickHouse/ClickHouse/pull/50529) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Add profile events for fs cache eviction [#50533](https://github.com/ClickHouse/ClickHouse/pull/50533) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* QueryNode small fix [#50535](https://github.com/ClickHouse/ClickHouse/pull/50535) ([Maksim Kita](https://github.com/kitaisreal)).
|
||||||
|
* Control memory usage in generateRandom [#50538](https://github.com/ClickHouse/ClickHouse/pull/50538) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Disable skim (Rust library) under memory sanitizer [#50539](https://github.com/ClickHouse/ClickHouse/pull/50539) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* MSan support for Rust [#50541](https://github.com/ClickHouse/ClickHouse/pull/50541) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Make 01565_query_loop_after_client_error slightly more robust [#50542](https://github.com/ClickHouse/ClickHouse/pull/50542) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Resize BufferFromVector underlying vector only pos_offset == vector.size() [#50546](https://github.com/ClickHouse/ClickHouse/pull/50546) ([auxten](https://github.com/auxten)).
|
||||||
|
* Add async iteration to object storage [#50548](https://github.com/ClickHouse/ClickHouse/pull/50548) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* skip extracting darwin toolchain in builder when unncessary [#50550](https://github.com/ClickHouse/ClickHouse/pull/50550) ([SuperDJY](https://github.com/cmsxbc)).
|
||||||
|
* Remove flaky test [#50558](https://github.com/ClickHouse/ClickHouse/pull/50558) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||||
|
* Revert "Disable skim (Rust library) under memory sanitizer" [#50574](https://github.com/ClickHouse/ClickHouse/pull/50574) ([Azat Khuzhin](https://github.com/azat)).
|
||||||
|
* Analyzer: fix 01487_distributed_in_not_default_db [#50587](https://github.com/ClickHouse/ClickHouse/pull/50587) ([Dmitry Novik](https://github.com/novikd)).
|
||||||
|
* Fix commit for DiskObjectStorage [#50599](https://github.com/ClickHouse/ClickHouse/pull/50599) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Fix Jepsen runs in PRs [#50615](https://github.com/ClickHouse/ClickHouse/pull/50615) ([Antonio Andelic](https://github.com/antonio2368)).
|
||||||
|
* Revert incorrect optimizations [#50629](https://github.com/ClickHouse/ClickHouse/pull/50629) ([Raúl Marín](https://github.com/Algunenano)).
|
||||||
|
* Disable 01676_clickhouse_client_autocomplete under UBSan [#50636](https://github.com/ClickHouse/ClickHouse/pull/50636) ([Nikita Taranov](https://github.com/nickitat)).
|
||||||
|
* Merging [#50329](https://github.com/ClickHouse/ClickHouse/issues/50329) [#50660](https://github.com/ClickHouse/ClickHouse/pull/50660) ([Anton Popov](https://github.com/CurtizJ)).
|
||||||
|
* Revert "date_trunc function to always return DateTime type" [#50670](https://github.com/ClickHouse/ClickHouse/pull/50670) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)).
|
||||||
|
* Fix flaky test 02461_prewhere_row_level_policy_lightweight_delete [#50674](https://github.com/ClickHouse/ClickHouse/pull/50674) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Fix asan issue with analyzer and prewhere [#50685](https://github.com/ClickHouse/ClickHouse/pull/50685) ([Alexander Gololobov](https://github.com/davenger)).
|
||||||
|
* Catch issues with dockerd during the build [#50700](https://github.com/ClickHouse/ClickHouse/pull/50700) ([Mikhail f. Shiryaev](https://github.com/Felixoid)).
|
||||||
|
* Temporarily disable annoy index tests (flaky for analyzer) [#50714](https://github.com/ClickHouse/ClickHouse/pull/50714) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
* Fix assertion from stress test [#50718](https://github.com/ClickHouse/ClickHouse/pull/50718) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Fix flaky unit test [#50719](https://github.com/ClickHouse/ClickHouse/pull/50719) ([Kseniia Sumarokova](https://github.com/kssenii)).
|
||||||
|
* Show correct sharing state in system.query_cache [#50728](https://github.com/ClickHouse/ClickHouse/pull/50728) ([Robert Schulze](https://github.com/rschu1ze)).
|
||||||
|
|
18
docs/changelogs/v23.5.2.7-stable.md
Normal file
18
docs/changelogs/v23.5.2.7-stable.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: 2023
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2023 Changelog
|
||||||
|
|
||||||
|
### ClickHouse release v23.5.2.7-stable (5751aa1ab9f) FIXME as compared to v23.5.1.3174-stable (2fec796e73e)
|
||||||
|
|
||||||
|
#### Bug Fix (user-visible misbehavior in an official stable release)
|
||||||
|
|
||||||
|
* Do not read all the columns from right GLOBAL JOIN table. [#50721](https://github.com/ClickHouse/ClickHouse/pull/50721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)).
|
||||||
|
|
||||||
|
#### NOT FOR CHANGELOG / INSIGNIFICANT
|
||||||
|
|
||||||
|
* Fix build for aarch64 (temporary disable azure) [#50770](https://github.com/ClickHouse/ClickHouse/pull/50770) ([alesapin](https://github.com/alesapin)).
|
||||||
|
* Rename azure_blob_storage to azureBlobStorage [#50812](https://github.com/ClickHouse/ClickHouse/pull/50812) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
|
||||||
|
|
@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
slug: /en/engines/table-engines/integrations/azureBlobStorage
|
||||||
|
sidebar_label: Azure Blob Storage
|
||||||
|
---
|
||||||
|
|
||||||
|
# AzureBlobStorage Table Engine
|
||||||
|
|
||||||
|
This engine provides an integration with [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs) ecosystem.
|
||||||
|
|
||||||
|
## Create Table
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE azure_blob_storage_table (name String, value UInt32)
|
||||||
|
ENGINE = AzureBlobStorage(connection_string|storage_account_url, container_name, blobpath, [account_name, account_key, format, compression])
|
||||||
|
[PARTITION BY expr]
|
||||||
|
[SETTINGS ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Engine parameters
|
||||||
|
|
||||||
|
- `connection_string|storage_account_url` — connection_string includes account name & key ([Create connection string](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json#configure-a-connection-string-for-an-azure-storage-account)) or you could also provide the storage account url here and account name & account key as separate parameters (see parameters account_name & account_key)
|
||||||
|
- `container_name` - Container name
|
||||||
|
- `blobpath` - file path. Supports following wildcards in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc'`, `'def'` — strings.
|
||||||
|
- `account_name` - if storage_account_url is used, then account name can be specified here
|
||||||
|
- `account_key` - if storage_account_url is used, then account key can be specified here
|
||||||
|
- `format` — The [format](/docs/en/interfaces/formats.md) of the file.
|
||||||
|
- `compression` — Supported values: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. By default, it will autodetect compression by file extension. (same as setting to `auto`).
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE test_table (key UInt64, data String)
|
||||||
|
ENGINE = AzureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;',
|
||||||
|
'test_container', 'test_table', 'CSV');
|
||||||
|
|
||||||
|
INSERT INTO test_table VALUES (1, 'a'), (2, 'b'), (3, 'c');
|
||||||
|
|
||||||
|
SELECT * FROM test_table;
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─key──┬─data──┐
|
||||||
|
│ 1 │ a │
|
||||||
|
│ 2 │ b │
|
||||||
|
│ 3 │ c │
|
||||||
|
└──────┴───────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[Azure Blob Storage Table Function](/docs/en/sql-reference/table-functions/azureBlobStorage.md)
|
@ -6,24 +6,5 @@ sidebar_label: Integrations
|
|||||||
|
|
||||||
# Table Engines for Integrations
|
# Table Engines for Integrations
|
||||||
|
|
||||||
ClickHouse provides various means for integrating with external systems, including table engines. Like with all other table engines, the configuration is done using `CREATE TABLE` or `ALTER TABLE` queries. Then from a user perspective, the configured integration looks like a normal table, but queries to it are proxied to the external system. This transparent querying is one of the key advantages of this approach over alternative integration methods, like dictionaries or table functions, which require to use custom query methods on each use.
|
ClickHouse provides various means for integrating with external systems, including table engines. Like with all other table engines, the configuration is done using `CREATE TABLE` or `ALTER TABLE` queries. Then from a user perspective, the configured integration looks like a normal table, but queries to it are proxied to the external system. This transparent querying is one of the key advantages of this approach over alternative integration methods, like dictionaries or table functions, which require the use of custom query methods on each use.
|
||||||
|
|
||||||
List of supported integrations:
|
|
||||||
|
|
||||||
- [ODBC](../../../engines/table-engines/integrations/odbc.md)
|
|
||||||
- [JDBC](../../../engines/table-engines/integrations/jdbc.md)
|
|
||||||
- [MySQL](../../../engines/table-engines/integrations/mysql.md)
|
|
||||||
- [MongoDB](../../../engines/table-engines/integrations/mongodb.md)
|
|
||||||
- [HDFS](../../../engines/table-engines/integrations/hdfs.md)
|
|
||||||
- [S3](../../../engines/table-engines/integrations/s3.md)
|
|
||||||
- [Kafka](../../../engines/table-engines/integrations/kafka.md)
|
|
||||||
- [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md)
|
|
||||||
- [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md)
|
|
||||||
- [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md)
|
|
||||||
- [SQLite](../../../engines/table-engines/integrations/sqlite.md)
|
|
||||||
- [Hive](../../../engines/table-engines/integrations/hive.md)
|
|
||||||
- [ExternalDistributed](../../../engines/table-engines/integrations/ExternalDistributed.md)
|
|
||||||
- [MaterializedPostgreSQL](../../../engines/table-engines/integrations/materialized-postgresql.md)
|
|
||||||
- [NATS](../../../engines/table-engines/integrations/nats.md)
|
|
||||||
- [DeltaLake](../../../engines/table-engines/integrations/deltalake.md)
|
|
||||||
- [Hudi](../../../engines/table-engines/integrations/hudi.md)
|
|
||||||
|
@ -1192,7 +1192,7 @@ DESC format(JSONEachRow, '{"id" : 1, "age" : 25, "name" : "Josh", "status" : nul
|
|||||||
#### schema_inference_make_columns_nullable
|
#### schema_inference_make_columns_nullable
|
||||||
|
|
||||||
Controls making inferred types `Nullable` in schema inference for formats without information about nullability.
|
Controls making inferred types `Nullable` in schema inference for formats without information about nullability.
|
||||||
If the setting is enabled, all inferred type will be `Nullable`, if disabled, the inferred type will be `Nullable` only if the column contains `NULL` in a sample that is parsed during schema inference.
|
If the setting is enabled, all inferred type will be `Nullable`, if disabled, the inferred type will be `Nullable` only if `input_format_null_as_default` is disabled and the column contains `NULL` in a sample that is parsed during schema inference.
|
||||||
|
|
||||||
Enabled by default.
|
Enabled by default.
|
||||||
|
|
||||||
@ -1215,7 +1215,8 @@ DESC format(JSONEachRow, $$
|
|||||||
└─────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
|
└─────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
|
||||||
```
|
```
|
||||||
```sql
|
```sql
|
||||||
SET schema_inference_make_columns_nullable = 0
|
SET schema_inference_make_columns_nullable = 0;
|
||||||
|
SET input_format_null_as_default = 0;
|
||||||
DESC format(JSONEachRow, $$
|
DESC format(JSONEachRow, $$
|
||||||
{"id" : 1, "age" : 25, "name" : "Josh", "status" : null, "hobbies" : ["football", "cooking"]}
|
{"id" : 1, "age" : 25, "name" : "Josh", "status" : null, "hobbies" : ["football", "cooking"]}
|
||||||
{"id" : 2, "age" : 19, "name" : "Alan", "status" : "married", "hobbies" : ["tennis", "art"]}
|
{"id" : 2, "age" : 19, "name" : "Alan", "status" : "married", "hobbies" : ["tennis", "art"]}
|
||||||
@ -1232,6 +1233,25 @@ DESC format(JSONEachRow, $$
|
|||||||
└─────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
|
└─────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SET schema_inference_make_columns_nullable = 0;
|
||||||
|
SET input_format_null_as_default = 1;
|
||||||
|
DESC format(JSONEachRow, $$
|
||||||
|
{"id" : 1, "age" : 25, "name" : "Josh", "status" : null, "hobbies" : ["football", "cooking"]}
|
||||||
|
{"id" : 2, "age" : 19, "name" : "Alan", "status" : "married", "hobbies" : ["tennis", "art"]}
|
||||||
|
$$)
|
||||||
|
```
|
||||||
|
```response
|
||||||
|
|
||||||
|
┌─name────┬─type──────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
|
||||||
|
│ id │ Int64 │ │ │ │ │ │
|
||||||
|
│ age │ Int64 │ │ │ │ │ │
|
||||||
|
│ name │ String │ │ │ │ │ │
|
||||||
|
│ status │ String │ │ │ │ │ │
|
||||||
|
│ hobbies │ Array(String) │ │ │ │ │ │
|
||||||
|
└─────────┴───────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
#### input_format_try_infer_integers
|
#### input_format_try_infer_integers
|
||||||
|
|
||||||
If enabled, ClickHouse will try to infer integers instead of floats in schema inference for text formats.
|
If enabled, ClickHouse will try to infer integers instead of floats in schema inference for text formats.
|
||||||
|
@ -1881,6 +1881,32 @@ The default server configuration file `config.xml` contains the following settin
|
|||||||
</trace_log>
|
</trace_log>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## asynchronous_insert_log {#server_configuration_parameters-asynchronous_insert_log}
|
||||||
|
|
||||||
|
Settings for the [asynchronous_insert_log](../../operations/system-tables/asynchronous_insert_log.md#system_tables-asynchronous_insert_log) system table for logging async inserts.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
- `database` — Database name.
|
||||||
|
- `table` — Table name.
|
||||||
|
- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined.
|
||||||
|
- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined.
|
||||||
|
- `flush_interval_milliseconds` — Interval for flushing data from the buffer in memory to the table.
|
||||||
|
- `storage_policy` – Name of storage policy to use for the table (optional)
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
```xml
|
||||||
|
<clickhouse>
|
||||||
|
<asynchronous_insert_log>
|
||||||
|
<database>system</database>
|
||||||
|
<table>asynchronous_insert_log</table>
|
||||||
|
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
|
||||||
|
<partition_by>toYYYYMM(event_date)</partition_by>
|
||||||
|
<!-- <engine>Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + INTERVAL 30 day</engine> -->
|
||||||
|
</asynchronous_insert_log>
|
||||||
|
</clickhouse>
|
||||||
|
```
|
||||||
|
|
||||||
## query_masking_rules {#query-masking-rules}
|
## query_masking_rules {#query-masking-rules}
|
||||||
|
|
||||||
Regexp-based rules, which will be applied to queries as well as all log messages before storing them in server logs,
|
Regexp-based rules, which will be applied to queries as well as all log messages before storing them in server logs,
|
||||||
|
@ -535,8 +535,6 @@ Possible values:
|
|||||||
|
|
||||||
The first phase of a grace join reads the right table and splits it into N buckets depending on the hash value of key columns (initially, N is `grace_hash_join_initial_buckets`). This is done in a way to ensure that each bucket can be processed independently. Rows from the first bucket are added to an in-memory hash table while the others are saved to disk. If the hash table grows beyond the memory limit (e.g., as set by [`max_bytes_in_join`](/docs/en/operations/settings/query-complexity.md/#settings-max_bytes_in_join)), the number of buckets is increased and the assigned bucket for each row. Any rows which don’t belong to the current bucket are flushed and reassigned.
|
The first phase of a grace join reads the right table and splits it into N buckets depending on the hash value of key columns (initially, N is `grace_hash_join_initial_buckets`). This is done in a way to ensure that each bucket can be processed independently. Rows from the first bucket are added to an in-memory hash table while the others are saved to disk. If the hash table grows beyond the memory limit (e.g., as set by [`max_bytes_in_join`](/docs/en/operations/settings/query-complexity.md/#settings-max_bytes_in_join)), the number of buckets is increased and the assigned bucket for each row. Any rows which don’t belong to the current bucket are flushed and reassigned.
|
||||||
|
|
||||||
Supports `INNER/LEFT/RIGHT/FULL ALL/ANY JOIN`.
|
|
||||||
|
|
||||||
- hash
|
- hash
|
||||||
|
|
||||||
[Hash join algorithm](https://en.wikipedia.org/wiki/Hash_join) is used. The most generic implementation that supports all combinations of kind and strictness and multiple join keys that are combined with `OR` in the `JOIN ON` section.
|
[Hash join algorithm](https://en.wikipedia.org/wiki/Hash_join) is used. The most generic implementation that supports all combinations of kind and strictness and multiple join keys that are combined with `OR` in the `JOIN ON` section.
|
||||||
@ -3238,7 +3236,7 @@ Possible values:
|
|||||||
- Positive integer.
|
- Positive integer.
|
||||||
- 0 or 1 — Disabled. `SELECT` queries are executed in a single thread.
|
- 0 or 1 — Disabled. `SELECT` queries are executed in a single thread.
|
||||||
|
|
||||||
Default value: `16`.
|
Default value: `max_threads`.
|
||||||
|
|
||||||
## opentelemetry_start_trace_probability {#opentelemetry-start-trace-probability}
|
## opentelemetry_start_trace_probability {#opentelemetry-start-trace-probability}
|
||||||
|
|
||||||
|
64
docs/en/operations/system-tables/asynchronous_insert_log.md
Normal file
64
docs/en/operations/system-tables/asynchronous_insert_log.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
---
|
||||||
|
slug: /en/operations/system-tables/asynchronous_insert_log
|
||||||
|
---
|
||||||
|
# asynchronous_insert_log
|
||||||
|
|
||||||
|
Contains information about async inserts. Each entry represents an insert query buffered into an async insert query.
|
||||||
|
|
||||||
|
To start logging configure parameters in the [asynchronous_insert_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-asynchronous_insert_log) section.
|
||||||
|
|
||||||
|
The flushing period of data is set in `flush_interval_milliseconds` parameter of the [asynchronous_insert_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-asynchronous_insert_log) server settings section. To force flushing, use the [SYSTEM FLUSH LOGS](../../sql-reference/statements/system.md#query_language-system-flush_logs) query.
|
||||||
|
|
||||||
|
ClickHouse does not delete data from the table automatically. See [Introduction](../../operations/system-tables/index.md#system-tables-introduction) for more details.
|
||||||
|
|
||||||
|
Columns:
|
||||||
|
|
||||||
|
- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the async insert happened.
|
||||||
|
- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the async insert finished execution.
|
||||||
|
- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the async insert finished execution with microseconds precision.
|
||||||
|
- `query` ([String](../../sql-reference/data-types/string.md)) — Query string.
|
||||||
|
- `database` ([String](../../sql-reference/data-types/string.md)) — The name of the database the table is in.
|
||||||
|
- `table` ([String](../../sql-reference/data-types/string.md)) — Table name.
|
||||||
|
- `format` ([String](/docs/en/sql-reference/data-types/string.md)) — Format name.
|
||||||
|
- `query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query.
|
||||||
|
- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of inserted bytes.
|
||||||
|
- `exception` ([String](../../sql-reference/data-types/string.md)) — Exception message.
|
||||||
|
- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Status of the view. Values:
|
||||||
|
- `'Ok' = 1` — Successful insert.
|
||||||
|
- `'ParsingError' = 2` — Exception when parsing the data.
|
||||||
|
- `'FlushError' = 3` — Exception when flushing the data.
|
||||||
|
- `flush_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the flush happened.
|
||||||
|
- `flush_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the flush happened with microseconds precision.
|
||||||
|
- `flush_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the flush query.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM system.asynchronous_insert_log LIMIT 1 \G;
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
event_date: 2023-06-08
|
||||||
|
event_time: 2023-06-08 10:08:53
|
||||||
|
event_time_microseconds: 2023-06-08 10:08:53.199516
|
||||||
|
query: INSERT INTO public.data_guess (user_id, datasource_id, timestamp, path, type, num, str) FORMAT CSV
|
||||||
|
database: public
|
||||||
|
table: data_guess
|
||||||
|
format: CSV
|
||||||
|
query_id: b46cd4c4-0269-4d0b-99f5-d27668c6102e
|
||||||
|
bytes: 133223
|
||||||
|
exception:
|
||||||
|
status: Ok
|
||||||
|
flush_time: 2023-06-08 10:08:55
|
||||||
|
flush_time_microseconds: 2023-06-08 10:08:55.139676
|
||||||
|
flush_query_id: cd2c1e43-83f5-49dc-92e4-2fbc7f8d3716
|
||||||
|
```
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution.
|
||||||
|
- [system.asynchronous_inserts](../../operations/system-tables/asynchronous_inserts.md#system_tables-asynchronous_inserts) — This table contains information about pending asynchronous inserts in queue.
|
45
docs/en/operations/system-tables/asynchronous_inserts.md
Normal file
45
docs/en/operations/system-tables/asynchronous_inserts.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
slug: /en/operations/system-tables/asynchronous_inserts
|
||||||
|
---
|
||||||
|
# asynchronous_inserts
|
||||||
|
|
||||||
|
Contains information about pending asynchronous inserts in queue.
|
||||||
|
|
||||||
|
Columns:
|
||||||
|
|
||||||
|
- `query` ([String](../../sql-reference/data-types/string.md)) — Query string.
|
||||||
|
- `database` ([String](../../sql-reference/data-types/string.md)) — The name of the database the table is in.
|
||||||
|
- `table` ([String](../../sql-reference/data-types/string.md)) — Table name.
|
||||||
|
- `format` ([String](/docs/en/sql-reference/data-types/string.md)) — Format name.
|
||||||
|
- `first_update` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — First insert time with microseconds resolution.
|
||||||
|
- `total_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Total number of bytes waiting in the queue.
|
||||||
|
- `entries.query_id` ([Array(String)](../../sql-reference/data-types/array.md)) - Array of query ids of the inserts waiting in the queue.
|
||||||
|
- `entries.bytes` ([Array(UInt64)](../../sql-reference/data-types/array.md)) - Array of bytes of each insert query waiting in the queue.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM system.asynchronous_inserts LIMIT 1 \G;
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
query: INSERT INTO public.data_guess (user_id, datasource_id, timestamp, path, type, num, str) FORMAT CSV
|
||||||
|
database: public
|
||||||
|
table: data_guess
|
||||||
|
format: CSV
|
||||||
|
first_update: 2023-06-08 10:08:54.199606
|
||||||
|
total_bytes: 133223
|
||||||
|
entries.query_id: ['b46cd4c4-0269-4d0b-99f5-d27668c6102e']
|
||||||
|
entries.bytes: [133223]
|
||||||
|
```
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution.
|
||||||
|
- [system.asynchronous_insert_log](../../operations/system-tables/asynchronous_insert_log.md#system_tables-asynchronous_insert_log) — This table contains information about async inserts performed.
|
@ -142,11 +142,11 @@ The following operations with [projections](/docs/en/engines/table-engines/merge
|
|||||||
|
|
||||||
## ADD PROJECTION
|
## ADD PROJECTION
|
||||||
|
|
||||||
`ALTER TABLE [db].name ADD PROJECTION name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] )` - Adds projection description to tables metadata.
|
`ALTER TABLE [db].name ADD PROJECTION [IF NOT EXISTS] name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] )` - Adds projection description to tables metadata.
|
||||||
|
|
||||||
## DROP PROJECTION
|
## DROP PROJECTION
|
||||||
|
|
||||||
`ALTER TABLE [db].name DROP PROJECTION name` - Removes projection description from tables metadata and deletes projection files from disk. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations).
|
`ALTER TABLE [db].name DROP PROJECTION [IF EXISTS] name` - Removes projection description from tables metadata and deletes projection files from disk. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations).
|
||||||
|
|
||||||
## MATERIALIZE PROJECTION
|
## MATERIALIZE PROJECTION
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ The following operations with [projections](/docs/en/engines/table-engines/merge
|
|||||||
|
|
||||||
## CLEAR PROJECTION
|
## CLEAR PROJECTION
|
||||||
|
|
||||||
`ALTER TABLE [db.]table CLEAR PROJECTION name IN PARTITION partition_name` - Deletes projection files from disk without removing description. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations).
|
`ALTER TABLE [db.]table CLEAR PROJECTION [IF EXISTS] name IN PARTITION partition_name` - Deletes projection files from disk without removing description. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations).
|
||||||
|
|
||||||
|
|
||||||
The commands `ADD`, `DROP` and `CLEAR` are lightweight in a sense that they only change metadata or remove files.
|
The commands `ADD`, `DROP` and `CLEAR` are lightweight in a sense that they only change metadata or remove files.
|
||||||
|
@ -273,7 +273,7 @@ SHOW DICTIONARIES FROM db LIKE '%reg%' LIMIT 2
|
|||||||
Displays a list of primary and data skipping indexes of a table.
|
Displays a list of primary and data skipping indexes of a table.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SHOW [EXTENDED] {INDEX | INDEXES | KEYS } {FROM | IN} <table> [{FROM | IN} <db>] [WHERE <expr>] [INTO OUTFILE <filename>] [FORMAT <format>]
|
SHOW [EXTENDED] {INDEX | INDEXES | INDICES | KEYS } {FROM | IN} <table> [{FROM | IN} <db>] [WHERE <expr>] [INTO OUTFILE <filename>] [FORMAT <format>]
|
||||||
```
|
```
|
||||||
|
|
||||||
The database and table name can be specified in abbreviated form as `<db>.<table>`, i.e. `FROM tab FROM db` and `FROM db.tab` are
|
The database and table name can be specified in abbreviated form as `<db>.<table>`, i.e. `FROM tab FROM db` and `FROM db.tab` are
|
||||||
|
71
docs/en/sql-reference/table-functions/azureBlobStorage.md
Normal file
71
docs/en/sql-reference/table-functions/azureBlobStorage.md
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
---
|
||||||
|
slug: /en/sql-reference/table-functions/azure_blob_storage
|
||||||
|
sidebar_label: azure_blob_storage
|
||||||
|
keywords: [azure blob storage]
|
||||||
|
---
|
||||||
|
|
||||||
|
# azure\_blob\_storage Table Function
|
||||||
|
|
||||||
|
Provides a table-like interface to select/insert files in [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs). This table function is similar to the [s3 function](../../sql-reference/table-functions/s3.md).
|
||||||
|
|
||||||
|
**Syntax**
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
azureBlobStorage(- connection_string|storage_account_url, container_name, blobpath, [account_name, account_key, format, compression, structure])
|
||||||
|
```
|
||||||
|
|
||||||
|
**Arguments**
|
||||||
|
|
||||||
|
- `connection_string|storage_account_url` — connection_string includes account name & key ([Create connection string](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json#configure-a-connection-string-for-an-azure-storage-account)) or you could also provide the storage account url here and account name & account key as separate parameters (see parameters account_name & account_key)
|
||||||
|
- `container_name` - Container name
|
||||||
|
- `blobpath` - file path. Supports following wildcards in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc'`, `'def'` — strings.
|
||||||
|
- `account_name` - if storage_account_url is used, then account name can be specified here
|
||||||
|
- `account_key` - if storage_account_url is used, then account key can be specified here
|
||||||
|
- `format` — The [format](../../interfaces/formats.md#formats) of the file.
|
||||||
|
- `compression` — Supported values: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. By default, it will autodetect compression by file extension. (same as setting to `auto`).
|
||||||
|
- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`.
|
||||||
|
|
||||||
|
**Returned value**
|
||||||
|
|
||||||
|
A table with the specified structure for reading or writing data in the specified file.
|
||||||
|
|
||||||
|
**Examples**
|
||||||
|
|
||||||
|
Write data into azure blob storage using the following :
|
||||||
|
|
||||||
|
```sql
|
||||||
|
INSERT INTO TABLE FUNCTION azureBlobStorage('http://azurite1:10000/devstoreaccount1',
|
||||||
|
'test_container', 'test_{_partition_id}.csv', 'devstoreaccount1', 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==',
|
||||||
|
'CSV', 'auto', 'column1 UInt32, column2 UInt32, column3 UInt32') PARTITION BY column3 VALUES (1, 2, 3), (3, 2, 1), (78, 43, 3);
|
||||||
|
```
|
||||||
|
|
||||||
|
And then it can be read using
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT * FROM azureBlobStorage('http://azurite1:10000/devstoreaccount1',
|
||||||
|
'test_container', 'test_1.csv', 'devstoreaccount1', 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==',
|
||||||
|
'CSV', 'auto', 'column1 UInt32, column2 UInt32, column3 UInt32');
|
||||||
|
```
|
||||||
|
|
||||||
|
```response
|
||||||
|
┌───column1─┬────column2─┬───column3─┐
|
||||||
|
│ 3 │ 2 │ 1 │
|
||||||
|
└───────────┴────────────┴───────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
or using connection_string
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT count(*) FROM azureBlobStorage('DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;EndPointSuffix=core.windows.net',
|
||||||
|
'test_container', 'test_3.csv', 'CSV', 'auto' , 'column1 UInt32, column2 UInt32, column3 UInt32');
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─count()─┐
|
||||||
|
│ 2 │
|
||||||
|
└─────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- [AzureBlobStorage Table Engine](/docs/en/engines/table-engines/integrations/azureBlobStorage.md)
|
@ -8,13 +8,13 @@ sidebar_label: PROJECTION
|
|||||||
|
|
||||||
Доступны следующие операции с [проекциями](../../../engines/table-engines/mergetree-family/mergetree.md#projections):
|
Доступны следующие операции с [проекциями](../../../engines/table-engines/mergetree-family/mergetree.md#projections):
|
||||||
|
|
||||||
- `ALTER TABLE [db].name ADD PROJECTION name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] )` — добавляет описание проекции в метаданные.
|
- `ALTER TABLE [db].name ADD PROJECTION [IF NOT EXISTS] name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] )` — добавляет описание проекции в метаданные.
|
||||||
|
|
||||||
- `ALTER TABLE [db].name DROP PROJECTION name` — удаляет описание проекции из метаданных и удаляет файлы проекции с диска.
|
- `ALTER TABLE [db].name DROP PROJECTION [IF EXISTS] name` — удаляет описание проекции из метаданных и удаляет файлы проекции с диска.
|
||||||
|
|
||||||
- `ALTER TABLE [db.]table MATERIALIZE PROJECTION name IN PARTITION partition_name` — перестраивает проекцию в указанной партиции. Реализовано как [мутация](../../../sql-reference/statements/alter/index.md#mutations).
|
- `ALTER TABLE [db.]table MATERIALIZE PROJECTION name IN PARTITION partition_name` — перестраивает проекцию в указанной партиции. Реализовано как [мутация](../../../sql-reference/statements/alter/index.md#mutations).
|
||||||
|
|
||||||
- `ALTER TABLE [db.]table CLEAR PROJECTION name IN PARTITION partition_name` — удаляет файлы проекции с диска без удаления описания.
|
- `ALTER TABLE [db.]table CLEAR PROJECTION [IF EXISTS] name IN PARTITION partition_name` — удаляет файлы проекции с диска без удаления описания.
|
||||||
|
|
||||||
Команды `ADD`, `DROP` и `CLEAR` — легковесны, поскольку они только меняют метаданные или удаляют файлы.
|
Команды `ADD`, `DROP` и `CLEAR` — легковесны, поскольку они только меняют метаданные или удаляют файлы.
|
||||||
|
|
||||||
@ -22,4 +22,4 @@ sidebar_label: PROJECTION
|
|||||||
|
|
||||||
:::note
|
:::note
|
||||||
Манипуляции с проекциями поддерживаются только для таблиц с движком [`*MergeTree`](../../../engines/table-engines/mergetree-family/mergetree.md) (включая [replicated](../../../engines/table-engines/mergetree-family/replication.md) варианты).
|
Манипуляции с проекциями поддерживаются только для таблиц с движком [`*MergeTree`](../../../engines/table-engines/mergetree-family/mergetree.md) (включая [replicated](../../../engines/table-engines/mergetree-family/replication.md) варианты).
|
||||||
:::
|
:::
|
||||||
|
@ -210,6 +210,7 @@ enum class AccessType
|
|||||||
M(HDFS, "", GLOBAL, SOURCES) \
|
M(HDFS, "", GLOBAL, SOURCES) \
|
||||||
M(S3, "", GLOBAL, SOURCES) \
|
M(S3, "", GLOBAL, SOURCES) \
|
||||||
M(HIVE, "", GLOBAL, SOURCES) \
|
M(HIVE, "", GLOBAL, SOURCES) \
|
||||||
|
M(AZURE, "", GLOBAL, SOURCES) \
|
||||||
M(SOURCES, "", GROUP, ALL) \
|
M(SOURCES, "", GROUP, ALL) \
|
||||||
\
|
\
|
||||||
M(CLUSTER, "", GLOBAL, ALL) /* ON CLUSTER queries */ \
|
M(CLUSTER, "", GLOBAL, ALL) /* ON CLUSTER queries */ \
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
#include <Common/CurrentThread.h>
|
#include <Common/CurrentThread.h>
|
||||||
#include <Common/HashTable/HashSet.h>
|
#include <Common/HashTable/HashSet.h>
|
||||||
#include <Common/ThreadPool.h>
|
#include <Common/ThreadPool.h>
|
||||||
#include <Common/setThreadName.h>
|
|
||||||
#include <Common/scope_guard_safe.h>
|
#include <Common/scope_guard_safe.h>
|
||||||
|
#include <Common/setThreadName.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -48,30 +49,38 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto next_bucket_to_merge = std::make_shared<std::atomic_uint32_t>(0);
|
try
|
||||||
|
|
||||||
auto thread_func = [&lhs, &rhs, next_bucket_to_merge, thread_group = CurrentThread::getGroup()]()
|
|
||||||
{
|
{
|
||||||
SCOPE_EXIT_SAFE(
|
auto next_bucket_to_merge = std::make_shared<std::atomic_uint32_t>(0);
|
||||||
if (thread_group)
|
|
||||||
CurrentThread::detachFromGroupIfNotDetached();
|
|
||||||
);
|
|
||||||
if (thread_group)
|
|
||||||
CurrentThread::attachToGroupIfDetached(thread_group);
|
|
||||||
setThreadName("UniqExactMerger");
|
|
||||||
|
|
||||||
while (true)
|
auto thread_func = [&lhs, &rhs, next_bucket_to_merge, thread_group = CurrentThread::getGroup()]()
|
||||||
{
|
{
|
||||||
const auto bucket = next_bucket_to_merge->fetch_add(1);
|
SCOPE_EXIT_SAFE(
|
||||||
if (bucket >= rhs.NUM_BUCKETS)
|
if (thread_group)
|
||||||
return;
|
CurrentThread::detachFromGroupIfNotDetached();
|
||||||
lhs.impls[bucket].merge(rhs.impls[bucket]);
|
);
|
||||||
}
|
if (thread_group)
|
||||||
};
|
CurrentThread::attachToGroupIfDetached(thread_group);
|
||||||
|
setThreadName("UniqExactMerger");
|
||||||
|
|
||||||
for (size_t i = 0; i < std::min<size_t>(thread_pool->getMaxThreads(), rhs.NUM_BUCKETS); ++i)
|
while (true)
|
||||||
thread_pool->scheduleOrThrowOnError(thread_func);
|
{
|
||||||
thread_pool->wait();
|
const auto bucket = next_bucket_to_merge->fetch_add(1);
|
||||||
|
if (bucket >= rhs.NUM_BUCKETS)
|
||||||
|
return;
|
||||||
|
lhs.impls[bucket].merge(rhs.impls[bucket]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < std::min<size_t>(thread_pool->getMaxThreads(), rhs.NUM_BUCKETS); ++i)
|
||||||
|
thread_pool->scheduleOrThrowOnError(thread_func);
|
||||||
|
thread_pool->wait();
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
thread_pool->wait();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -313,6 +313,11 @@ MutableColumnPtr ColumnLowCardinality::cloneResized(size_t size) const
|
|||||||
MutableColumnPtr ColumnLowCardinality::cloneNullable() const
|
MutableColumnPtr ColumnLowCardinality::cloneNullable() const
|
||||||
{
|
{
|
||||||
auto res = cloneFinalized();
|
auto res = cloneFinalized();
|
||||||
|
/* Compact required not to share dictionary.
|
||||||
|
* If `shared` flag is not set `cloneFinalized` will return shallow copy
|
||||||
|
* and `nestedToNullable` will mutate source column.
|
||||||
|
*/
|
||||||
|
assert_cast<ColumnLowCardinality &>(*res).compactInplace();
|
||||||
assert_cast<ColumnLowCardinality &>(*res).nestedToNullable();
|
assert_cast<ColumnLowCardinality &>(*res).nestedToNullable();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -48,3 +48,16 @@ TEST(ColumnLowCardinality, Insert)
|
|||||||
testLowCardinalityNumberInsert<Float32>(std::make_shared<DataTypeFloat32>());
|
testLowCardinalityNumberInsert<Float32>(std::make_shared<DataTypeFloat32>());
|
||||||
testLowCardinalityNumberInsert<Float64>(std::make_shared<DataTypeFloat64>());
|
testLowCardinalityNumberInsert<Float64>(std::make_shared<DataTypeFloat64>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ColumnLowCardinality, Clone)
|
||||||
|
{
|
||||||
|
auto data_type = std::make_shared<DataTypeInt32>();
|
||||||
|
auto low_cardinality_type = std::make_shared<DataTypeLowCardinality>(data_type);
|
||||||
|
auto column = low_cardinality_type->createColumn();
|
||||||
|
ASSERT_FALSE(assert_cast<const ColumnLowCardinality &>(*column).nestedIsNullable());
|
||||||
|
|
||||||
|
auto nullable_column = assert_cast<const ColumnLowCardinality &>(*column).cloneNullable();
|
||||||
|
|
||||||
|
ASSERT_TRUE(assert_cast<const ColumnLowCardinality &>(*nullable_column).nestedIsNullable());
|
||||||
|
ASSERT_FALSE(assert_cast<const ColumnLowCardinality &>(*column).nestedIsNullable());
|
||||||
|
}
|
||||||
|
@ -348,6 +348,9 @@ The server successfully detected this situation and will download merged part fr
|
|||||||
M(S3PutObject, "Number of S3 API PutObject calls.") \
|
M(S3PutObject, "Number of S3 API PutObject calls.") \
|
||||||
M(S3GetObject, "Number of S3 API GetObject calls.") \
|
M(S3GetObject, "Number of S3 API GetObject calls.") \
|
||||||
\
|
\
|
||||||
|
M(AzureDeleteObjects, "Number of Azure blob storage API DeleteObject(s) calls.") \
|
||||||
|
M(AzureListObjects, "Number of Azure blob storage API ListObjects calls.") \
|
||||||
|
\
|
||||||
M(DiskS3DeleteObjects, "Number of DiskS3 API DeleteObject(s) calls.") \
|
M(DiskS3DeleteObjects, "Number of DiskS3 API DeleteObject(s) calls.") \
|
||||||
M(DiskS3CopyObject, "Number of DiskS3 API CopyObject calls.") \
|
M(DiskS3CopyObject, "Number of DiskS3 API CopyObject calls.") \
|
||||||
M(DiskS3ListObjects, "Number of DiskS3 API ListObjects calls.") \
|
M(DiskS3ListObjects, "Number of DiskS3 API ListObjects calls.") \
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <Common/logger_useful.h>
|
#include <Common/logger_useful.h>
|
||||||
#include <IO/WriteBufferFromFile.h>
|
#include <IO/WriteBufferFromFile.h>
|
||||||
#include <base/errnoToString.h>
|
#include <base/errnoToString.h>
|
||||||
|
#include <libnuraft/log_val_type.hxx>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -479,7 +480,7 @@ public:
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/// Create log entry for read data
|
/// Create log entry for read data
|
||||||
auto log_entry = nuraft::cs_new<nuraft::log_entry>(record.header.term, record.blob, record.header.value_type);
|
auto log_entry = nuraft::cs_new<nuraft::log_entry>(record.header.term, record.blob, static_cast<nuraft::log_val_type>(record.header.value_type));
|
||||||
if (result.first_read_index == 0)
|
if (result.first_read_index == 0)
|
||||||
result.first_read_index = record.header.index;
|
result.first_read_index = record.header.index;
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ struct ChangelogRecordHeader
|
|||||||
ChangelogVersion version = CURRENT_CHANGELOG_VERSION;
|
ChangelogVersion version = CURRENT_CHANGELOG_VERSION;
|
||||||
uint64_t index = 0; /// entry log number
|
uint64_t index = 0; /// entry log number
|
||||||
uint64_t term = 0;
|
uint64_t term = 0;
|
||||||
nuraft::log_val_type value_type{};
|
int32_t value_type{};
|
||||||
uint64_t blob_size = 0;
|
uint64_t blob_size = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <libnuraft/raft_server.hxx>
|
#include <libnuraft/raft_server.hxx>
|
||||||
#include <Poco/Util/AbstractConfiguration.h>
|
#include <Poco/Util/AbstractConfiguration.h>
|
||||||
#include <Poco/Util/Application.h>
|
#include <Poco/Util/Application.h>
|
||||||
|
#include <Common/Exception.h>
|
||||||
#include <Common/LockMemoryExceptionInThread.h>
|
#include <Common/LockMemoryExceptionInThread.h>
|
||||||
#include <Common/ZooKeeper/ZooKeeperIO.h>
|
#include <Common/ZooKeeper/ZooKeeperIO.h>
|
||||||
#include <Common/Stopwatch.h>
|
#include <Common/Stopwatch.h>
|
||||||
@ -607,12 +608,30 @@ nuraft::cb_func::ReturnCode KeeperServer::callbackFunc(nuraft::cb_func::Type typ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto follower_preappend = [&](const auto & entry)
|
||||||
|
{
|
||||||
|
if (entry->get_val_type() != nuraft::app_log)
|
||||||
|
return nuraft::cb_func::ReturnCode::Ok;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
state_machine->parseRequest(entry->get_buf(), /*final=*/false);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
tryLogCurrentException(log, "Failed to parse request from log entry");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
return nuraft::cb_func::ReturnCode::Ok;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
if (initialized_flag)
|
if (initialized_flag)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
// This event is called before a single log is appended to the entry on the leader node
|
// This event is called before a single log is appended to the entry on the leader node
|
||||||
case nuraft::cb_func::PreAppendLog:
|
case nuraft::cb_func::PreAppendLogLeader:
|
||||||
{
|
{
|
||||||
// we are relying on the fact that request are being processed under a mutex
|
// we are relying on the fact that request are being processed under a mutex
|
||||||
// and not a RW lock
|
// and not a RW lock
|
||||||
@ -665,7 +684,12 @@ nuraft::cb_func::ReturnCode KeeperServer::callbackFunc(nuraft::cb_func::Type typ
|
|||||||
if (request_for_session->digest->version != KeeperStorage::NO_DIGEST)
|
if (request_for_session->digest->version != KeeperStorage::NO_DIGEST)
|
||||||
writeIntBinary(request_for_session->digest->value, write_buf);
|
writeIntBinary(request_for_session->digest->value, write_buf);
|
||||||
|
|
||||||
break;
|
return nuraft::cb_func::ReturnCode::Ok;
|
||||||
|
}
|
||||||
|
case nuraft::cb_func::PreAppendLogFollower:
|
||||||
|
{
|
||||||
|
const auto & entry = *static_cast<LogEntryPtr *>(param->ctx);
|
||||||
|
return follower_preappend(entry);
|
||||||
}
|
}
|
||||||
case nuraft::cb_func::AppendLogFailed:
|
case nuraft::cb_func::AppendLogFailed:
|
||||||
{
|
{
|
||||||
@ -678,13 +702,11 @@ nuraft::cb_func::ReturnCode KeeperServer::callbackFunc(nuraft::cb_func::Type typ
|
|||||||
auto & entry_buf = entry->get_buf();
|
auto & entry_buf = entry->get_buf();
|
||||||
auto request_for_session = state_machine->parseRequest(entry_buf, true);
|
auto request_for_session = state_machine->parseRequest(entry_buf, true);
|
||||||
state_machine->rollbackRequest(*request_for_session, true);
|
state_machine->rollbackRequest(*request_for_session, true);
|
||||||
break;
|
return nuraft::cb_func::ReturnCode::Ok;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
return nuraft::cb_func::ReturnCode::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nuraft::cb_func::ReturnCode::Ok;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t last_commited = state_machine->last_commit_index();
|
size_t last_commited = state_machine->last_commit_index();
|
||||||
@ -737,6 +759,11 @@ nuraft::cb_func::ReturnCode KeeperServer::callbackFunc(nuraft::cb_func::Type typ
|
|||||||
initial_batch_committed = true;
|
initial_batch_committed = true;
|
||||||
return nuraft::cb_func::ReturnCode::Ok;
|
return nuraft::cb_func::ReturnCode::Ok;
|
||||||
}
|
}
|
||||||
|
case nuraft::cb_func::PreAppendLogFollower:
|
||||||
|
{
|
||||||
|
const auto & entry = *static_cast<LogEntryPtr *>(param->ctx);
|
||||||
|
return follower_preappend(entry);
|
||||||
|
}
|
||||||
default: /// ignore other events
|
default: /// ignore other events
|
||||||
return nuraft::cb_func::ReturnCode::Ok;
|
return nuraft::cb_func::ReturnCode::Ok;
|
||||||
}
|
}
|
||||||
|
@ -272,9 +272,8 @@ bool KeeperStateMachine::preprocess(const KeeperStorage::RequestForSession & req
|
|||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
tryLogCurrentException(__PRETTY_FUNCTION__);
|
tryLogCurrentException(__PRETTY_FUNCTION__, "Failed to preprocess stored log, aborting to avoid inconsistent state");
|
||||||
rollbackRequestNoLock(request_for_session, true);
|
std::abort();
|
||||||
throw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keeper_context->digest_enabled && request_for_session.digest)
|
if (keeper_context->digest_enabled && request_for_session.digest)
|
||||||
|
@ -81,7 +81,9 @@ class IColumn;
|
|||||||
M(UInt64, s3_upload_part_size_multiply_parts_count_threshold, 500, "Each time this number of parts was uploaded to S3 s3_min_upload_part_size multiplied by s3_upload_part_size_multiply_factor.", 0) \
|
M(UInt64, s3_upload_part_size_multiply_parts_count_threshold, 500, "Each time this number of parts was uploaded to S3 s3_min_upload_part_size multiplied by s3_upload_part_size_multiply_factor.", 0) \
|
||||||
M(UInt64, s3_max_inflight_parts_for_one_file, 20, "The maximum number of a concurrent loaded parts in multipart upload request. 0 means unlimited. You ", 0) \
|
M(UInt64, s3_max_inflight_parts_for_one_file, 20, "The maximum number of a concurrent loaded parts in multipart upload request. 0 means unlimited. You ", 0) \
|
||||||
M(UInt64, s3_max_single_part_upload_size, 32*1024*1024, "The maximum size of object to upload using singlepart upload to S3.", 0) \
|
M(UInt64, s3_max_single_part_upload_size, 32*1024*1024, "The maximum size of object to upload using singlepart upload to S3.", 0) \
|
||||||
|
M(UInt64, azure_max_single_part_upload_size, 100*1024*1024, "The maximum size of object to upload using singlepart upload to Azure blob storage.", 0) \
|
||||||
M(UInt64, s3_max_single_read_retries, 4, "The maximum number of retries during single S3 read.", 0) \
|
M(UInt64, s3_max_single_read_retries, 4, "The maximum number of retries during single S3 read.", 0) \
|
||||||
|
M(UInt64, azure_max_single_read_retries, 4, "The maximum number of retries during single Azure blob storage read.", 0) \
|
||||||
M(UInt64, s3_max_unexpected_write_error_retries, 4, "The maximum number of retries in case of unexpected errors during S3 write.", 0) \
|
M(UInt64, s3_max_unexpected_write_error_retries, 4, "The maximum number of retries in case of unexpected errors during S3 write.", 0) \
|
||||||
M(UInt64, s3_max_redirects, 10, "Max number of S3 redirects hops allowed.", 0) \
|
M(UInt64, s3_max_redirects, 10, "Max number of S3 redirects hops allowed.", 0) \
|
||||||
M(UInt64, s3_max_connections, 1024, "The maximum number of connections per server.", 0) \
|
M(UInt64, s3_max_connections, 1024, "The maximum number of connections per server.", 0) \
|
||||||
@ -90,8 +92,11 @@ class IColumn;
|
|||||||
M(UInt64, s3_max_put_rps, 0, "Limit on S3 PUT request per second rate before throttling. Zero means unlimited.", 0) \
|
M(UInt64, s3_max_put_rps, 0, "Limit on S3 PUT request per second rate before throttling. Zero means unlimited.", 0) \
|
||||||
M(UInt64, s3_max_put_burst, 0, "Max number of requests that can be issued simultaneously before hitting request per second limit. By default (0) equals to `s3_max_put_rps`", 0) \
|
M(UInt64, s3_max_put_burst, 0, "Max number of requests that can be issued simultaneously before hitting request per second limit. By default (0) equals to `s3_max_put_rps`", 0) \
|
||||||
M(UInt64, s3_list_object_keys_size, 1000, "Maximum number of files that could be returned in batch by ListObject request", 0) \
|
M(UInt64, s3_list_object_keys_size, 1000, "Maximum number of files that could be returned in batch by ListObject request", 0) \
|
||||||
|
M(UInt64, azure_list_object_keys_size, 1000, "Maximum number of files that could be returned in batch by ListObject request", 0) \
|
||||||
M(Bool, s3_truncate_on_insert, false, "Enables or disables truncate before insert in s3 engine tables.", 0) \
|
M(Bool, s3_truncate_on_insert, false, "Enables or disables truncate before insert in s3 engine tables.", 0) \
|
||||||
|
M(Bool, azure_truncate_on_insert, false, "Enables or disables truncate before insert in azure engine tables.", 0) \
|
||||||
M(Bool, s3_create_new_file_on_insert, false, "Enables or disables creating a new file on each insert in s3 engine tables", 0) \
|
M(Bool, s3_create_new_file_on_insert, false, "Enables or disables creating a new file on each insert in s3 engine tables", 0) \
|
||||||
|
M(Bool, azure_create_new_file_on_insert, false, "Enables or disables creating a new file on each insert in azure engine tables", 0) \
|
||||||
M(Bool, s3_check_objects_after_upload, false, "Check each uploaded object to s3 with head request to be sure that upload was successful", 0) \
|
M(Bool, s3_check_objects_after_upload, false, "Check each uploaded object to s3 with head request to be sure that upload was successful", 0) \
|
||||||
M(Bool, s3_allow_parallel_part_upload, true, "Use multiple threads for s3 multipart upload. It may lead to slightly higher memory usage", 0) \
|
M(Bool, s3_allow_parallel_part_upload, true, "Use multiple threads for s3 multipart upload. It may lead to slightly higher memory usage", 0) \
|
||||||
M(Bool, s3_throw_on_zero_files_match, false, "Throw an error, when ListObjects request cannot match any files", 0) \
|
M(Bool, s3_throw_on_zero_files_match, false, "Throw an error, when ListObjects request cannot match any files", 0) \
|
||||||
@ -147,6 +152,7 @@ class IColumn;
|
|||||||
M(Bool, enable_memory_bound_merging_of_aggregation_results, true, "Enable memory bound merging strategy for aggregation.", 0) \
|
M(Bool, enable_memory_bound_merging_of_aggregation_results, true, "Enable memory bound merging strategy for aggregation.", 0) \
|
||||||
M(Bool, enable_positional_arguments, true, "Enable positional arguments in ORDER BY, GROUP BY and LIMIT BY", 0) \
|
M(Bool, enable_positional_arguments, true, "Enable positional arguments in ORDER BY, GROUP BY and LIMIT BY", 0) \
|
||||||
M(Bool, enable_extended_results_for_datetime_functions, false, "Enable date functions like toLastDayOfMonth return Date32 results (instead of Date results) for Date32/DateTime64 arguments.", 0) \
|
M(Bool, enable_extended_results_for_datetime_functions, false, "Enable date functions like toLastDayOfMonth return Date32 results (instead of Date results) for Date32/DateTime64 arguments.", 0) \
|
||||||
|
M(Bool, allow_nonconst_timezone_arguments, false, "Allow non-const timezone arguments in certain time-related functions like toTimeZone(), fromUnixTimestamp*(), snowflakeToDateTime*()", 0) \
|
||||||
\
|
\
|
||||||
M(Bool, group_by_use_nulls, false, "Treat columns mentioned in ROLLUP, CUBE or GROUPING SETS as Nullable", 0) \
|
M(Bool, group_by_use_nulls, false, "Treat columns mentioned in ROLLUP, CUBE or GROUPING SETS as Nullable", 0) \
|
||||||
\
|
\
|
||||||
@ -708,6 +714,7 @@ class IColumn;
|
|||||||
\
|
\
|
||||||
M(Bool, schema_inference_use_cache_for_file, true, "Use cache in schema inference while using file table function", 0) \
|
M(Bool, schema_inference_use_cache_for_file, true, "Use cache in schema inference while using file table function", 0) \
|
||||||
M(Bool, schema_inference_use_cache_for_s3, true, "Use cache in schema inference while using s3 table function", 0) \
|
M(Bool, schema_inference_use_cache_for_s3, true, "Use cache in schema inference while using s3 table function", 0) \
|
||||||
|
M(Bool, schema_inference_use_cache_for_azure, true, "Use cache in schema inference while using azure table function", 0) \
|
||||||
M(Bool, schema_inference_use_cache_for_hdfs, true, "Use cache in schema inference while using hdfs table function", 0) \
|
M(Bool, schema_inference_use_cache_for_hdfs, true, "Use cache in schema inference while using hdfs table function", 0) \
|
||||||
M(Bool, schema_inference_use_cache_for_url, true, "Use cache in schema inference while using url table function", 0) \
|
M(Bool, schema_inference_use_cache_for_url, true, "Use cache in schema inference while using url table function", 0) \
|
||||||
M(Bool, schema_inference_cache_require_modification_time_for_url, true, "Use schema from cache for URL with last modification time validation (for urls with Last-Modified header)", 0) \
|
M(Bool, schema_inference_cache_require_modification_time_for_url, true, "Use schema from cache for URL with last modification time validation (for urls with Last-Modified header)", 0) \
|
||||||
|
@ -85,6 +85,7 @@ static std::map<ClickHouseVersion, SettingsChangesHistory::SettingsChanges> sett
|
|||||||
{"use_with_fill_by_sorting_prefix", false, true, "Columns preceding WITH FILL columns in ORDER BY clause form sorting prefix. Rows with different values in sorting prefix are filled independently"},
|
{"use_with_fill_by_sorting_prefix", false, true, "Columns preceding WITH FILL columns in ORDER BY clause form sorting prefix. Rows with different values in sorting prefix are filled independently"},
|
||||||
{"output_format_parquet_compliant_nested_types", false, true, "Change an internal field name in output Parquet file schema."}}},
|
{"output_format_parquet_compliant_nested_types", false, true, "Change an internal field name in output Parquet file schema."}}},
|
||||||
{"23.4", {{"allow_suspicious_indices", true, false, "If true, index can defined with identical expressions"},
|
{"23.4", {{"allow_suspicious_indices", true, false, "If true, index can defined with identical expressions"},
|
||||||
|
{"allow_nonconst_timezone_arguments", true, false, "Allow non-const timezone arguments in certain time-related functions like toTimeZone(), fromUnixTimestamp*(), snowflakeToDateTime*()."},
|
||||||
{"connect_timeout_with_failover_ms", 50, 1000, "Increase default connect timeout because of async connect"},
|
{"connect_timeout_with_failover_ms", 50, 1000, "Increase default connect timeout because of async connect"},
|
||||||
{"connect_timeout_with_failover_secure_ms", 100, 1000, "Increase default secure connect timeout because of async connect"},
|
{"connect_timeout_with_failover_secure_ms", 100, 1000, "Increase default secure connect timeout because of async connect"},
|
||||||
{"hedged_connection_timeout_ms", 100, 50, "Start new connection in hedged requests after 50 ms instead of 100 to correspond with previous connect timeout"}}},
|
{"hedged_connection_timeout_ms", 100, 50, "Start new connection in hedged requests after 50 ms instead of 100 to correspond with previous connect timeout"}}},
|
||||||
|
@ -170,7 +170,7 @@ MongoDBDictionarySource::~MongoDBDictionarySource() = default;
|
|||||||
|
|
||||||
QueryPipeline MongoDBDictionarySource::loadAll()
|
QueryPipeline MongoDBDictionarySource::loadAll()
|
||||||
{
|
{
|
||||||
return QueryPipeline(std::make_shared<MongoDBSource>(connection, createCursor(db, collection, sample_block), sample_block, max_block_size));
|
return QueryPipeline(std::make_shared<MongoDBSource>(connection, db, collection, Poco::MongoDB::Document{}, sample_block, max_block_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryPipeline MongoDBDictionarySource::loadIds(const std::vector<UInt64> & ids)
|
QueryPipeline MongoDBDictionarySource::loadIds(const std::vector<UInt64> & ids)
|
||||||
@ -178,7 +178,7 @@ QueryPipeline MongoDBDictionarySource::loadIds(const std::vector<UInt64> & ids)
|
|||||||
if (!dict_struct.id)
|
if (!dict_struct.id)
|
||||||
throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "'id' is required for selective loading");
|
throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "'id' is required for selective loading");
|
||||||
|
|
||||||
auto cursor = createCursor(db, collection, sample_block);
|
Poco::MongoDB::Document query;
|
||||||
|
|
||||||
/** NOTE: While building array, Poco::MongoDB requires passing of different unused element names, along with values.
|
/** NOTE: While building array, Poco::MongoDB requires passing of different unused element names, along with values.
|
||||||
* In general, Poco::MongoDB is quite inefficient and bulky.
|
* In general, Poco::MongoDB is quite inefficient and bulky.
|
||||||
@ -188,9 +188,9 @@ QueryPipeline MongoDBDictionarySource::loadIds(const std::vector<UInt64> & ids)
|
|||||||
for (const UInt64 id : ids)
|
for (const UInt64 id : ids)
|
||||||
ids_array->add(DB::toString(id), static_cast<Int32>(id));
|
ids_array->add(DB::toString(id), static_cast<Int32>(id));
|
||||||
|
|
||||||
cursor->query().selector().addNewDocument(dict_struct.id->name).add("$in", ids_array);
|
query.addNewDocument(dict_struct.id->name).add("$in", ids_array);
|
||||||
|
|
||||||
return QueryPipeline(std::make_shared<MongoDBSource>(connection, std::move(cursor), sample_block, max_block_size));
|
return QueryPipeline(std::make_shared<MongoDBSource>(connection, db, collection, query, sample_block, max_block_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -199,8 +199,7 @@ QueryPipeline MongoDBDictionarySource::loadKeys(const Columns & key_columns, con
|
|||||||
if (!dict_struct.key)
|
if (!dict_struct.key)
|
||||||
throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "'key' is required for selective loading");
|
throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "'key' is required for selective loading");
|
||||||
|
|
||||||
auto cursor = createCursor(db, collection, sample_block);
|
Poco::MongoDB::Document query;
|
||||||
|
|
||||||
Poco::MongoDB::Array::Ptr keys_array(new Poco::MongoDB::Array);
|
Poco::MongoDB::Array::Ptr keys_array(new Poco::MongoDB::Array);
|
||||||
|
|
||||||
for (const auto row_idx : requested_rows)
|
for (const auto row_idx : requested_rows)
|
||||||
@ -254,9 +253,9 @@ QueryPipeline MongoDBDictionarySource::loadKeys(const Columns & key_columns, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// If more than one key we should use $or
|
/// If more than one key we should use $or
|
||||||
cursor->query().selector().add("$or", keys_array);
|
query.add("$or", keys_array);
|
||||||
|
|
||||||
return QueryPipeline(std::make_shared<MongoDBSource>(connection, std::move(cursor), sample_block, max_block_size));
|
return QueryPipeline(std::make_shared<MongoDBSource>(connection, db, collection, query, sample_block, max_block_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MongoDBDictionarySource::toString() const
|
std::string MongoDBDictionarySource::toString() const
|
||||||
|
@ -16,7 +16,6 @@ namespace Util
|
|||||||
namespace MongoDB
|
namespace MongoDB
|
||||||
{
|
{
|
||||||
class Connection;
|
class Connection;
|
||||||
class Cursor;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ ReadBufferFromAzureBlobStorage::ReadBufferFromAzureBlobStorage(
|
|||||||
size_t max_single_read_retries_,
|
size_t max_single_read_retries_,
|
||||||
size_t max_single_download_retries_,
|
size_t max_single_download_retries_,
|
||||||
bool use_external_buffer_,
|
bool use_external_buffer_,
|
||||||
|
bool restricted_seek_,
|
||||||
size_t read_until_position_)
|
size_t read_until_position_)
|
||||||
: ReadBufferFromFileBase(use_external_buffer_ ? 0 : read_settings_.remote_fs_buffer_size, nullptr, 0)
|
: ReadBufferFromFileBase(use_external_buffer_ ? 0 : read_settings_.remote_fs_buffer_size, nullptr, 0)
|
||||||
, blob_container_client(blob_container_client_)
|
, blob_container_client(blob_container_client_)
|
||||||
@ -44,6 +45,7 @@ ReadBufferFromAzureBlobStorage::ReadBufferFromAzureBlobStorage(
|
|||||||
, read_settings(read_settings_)
|
, read_settings(read_settings_)
|
||||||
, tmp_buffer_size(read_settings.remote_fs_buffer_size)
|
, tmp_buffer_size(read_settings.remote_fs_buffer_size)
|
||||||
, use_external_buffer(use_external_buffer_)
|
, use_external_buffer(use_external_buffer_)
|
||||||
|
, restricted_seek(restricted_seek_)
|
||||||
, read_until_position(read_until_position_)
|
, read_until_position(read_until_position_)
|
||||||
{
|
{
|
||||||
if (!use_external_buffer)
|
if (!use_external_buffer)
|
||||||
@ -54,6 +56,22 @@ ReadBufferFromAzureBlobStorage::ReadBufferFromAzureBlobStorage(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ReadBufferFromAzureBlobStorage::setReadUntilEnd()
|
||||||
|
{
|
||||||
|
if (read_until_position)
|
||||||
|
{
|
||||||
|
read_until_position = 0;
|
||||||
|
if (initialized)
|
||||||
|
{
|
||||||
|
offset = getPosition();
|
||||||
|
resetWorkingBuffer();
|
||||||
|
initialized = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void ReadBufferFromAzureBlobStorage::setReadUntilPosition(size_t position)
|
void ReadBufferFromAzureBlobStorage::setReadUntilPosition(size_t position)
|
||||||
{
|
{
|
||||||
read_until_position = position;
|
read_until_position = position;
|
||||||
@ -118,8 +136,17 @@ bool ReadBufferFromAzureBlobStorage::nextImpl()
|
|||||||
|
|
||||||
off_t ReadBufferFromAzureBlobStorage::seek(off_t offset_, int whence)
|
off_t ReadBufferFromAzureBlobStorage::seek(off_t offset_, int whence)
|
||||||
{
|
{
|
||||||
if (initialized)
|
if (offset_ == getPosition() && whence == SEEK_SET)
|
||||||
throw Exception(ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Seek is allowed only before first read attempt from the buffer.");
|
return offset_;
|
||||||
|
|
||||||
|
if (initialized && restricted_seek)
|
||||||
|
{
|
||||||
|
throw Exception(
|
||||||
|
ErrorCodes::CANNOT_SEEK_THROUGH_FILE,
|
||||||
|
"Seek is allowed only before first read attempt from the buffer (current offset: "
|
||||||
|
"{}, new offset: {}, reading until position: {}, available: {})",
|
||||||
|
getPosition(), offset_, read_until_position, available());
|
||||||
|
}
|
||||||
|
|
||||||
if (whence != SEEK_SET)
|
if (whence != SEEK_SET)
|
||||||
throw Exception(ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Only SEEK_SET mode is allowed.");
|
throw Exception(ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Only SEEK_SET mode is allowed.");
|
||||||
@ -127,8 +154,36 @@ off_t ReadBufferFromAzureBlobStorage::seek(off_t offset_, int whence)
|
|||||||
if (offset_ < 0)
|
if (offset_ < 0)
|
||||||
throw Exception(ErrorCodes::SEEK_POSITION_OUT_OF_BOUND, "Seek position is out of bounds. Offset: {}", offset_);
|
throw Exception(ErrorCodes::SEEK_POSITION_OUT_OF_BOUND, "Seek position is out of bounds. Offset: {}", offset_);
|
||||||
|
|
||||||
offset = offset_;
|
if (!restricted_seek)
|
||||||
|
{
|
||||||
|
if (!working_buffer.empty()
|
||||||
|
&& static_cast<size_t>(offset_) >= offset - working_buffer.size()
|
||||||
|
&& offset_ < offset)
|
||||||
|
{
|
||||||
|
pos = working_buffer.end() - (offset - offset_);
|
||||||
|
assert(pos >= working_buffer.begin());
|
||||||
|
assert(pos < working_buffer.end());
|
||||||
|
|
||||||
|
return getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t position = getPosition();
|
||||||
|
if (initialized && offset_ > position)
|
||||||
|
{
|
||||||
|
size_t diff = offset_ - position;
|
||||||
|
if (diff < read_settings.remote_read_min_bytes_for_seek)
|
||||||
|
{
|
||||||
|
ignore(diff);
|
||||||
|
return offset_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resetWorkingBuffer();
|
||||||
|
if (initialized)
|
||||||
|
initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = offset_;
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,7 +207,8 @@ void ReadBufferFromAzureBlobStorage::initialize()
|
|||||||
|
|
||||||
download_options.Range = {static_cast<int64_t>(offset), length};
|
download_options.Range = {static_cast<int64_t>(offset), length};
|
||||||
|
|
||||||
blob_client = std::make_unique<Azure::Storage::Blobs::BlobClient>(blob_container_client->GetBlobClient(path));
|
if (!blob_client)
|
||||||
|
blob_client = std::make_unique<Azure::Storage::Blobs::BlobClient>(blob_container_client->GetBlobClient(path));
|
||||||
|
|
||||||
size_t sleep_time_with_backoff_milliseconds = 100;
|
size_t sleep_time_with_backoff_milliseconds = 100;
|
||||||
for (size_t i = 0; i < max_single_download_retries; ++i)
|
for (size_t i = 0; i < max_single_download_retries; ++i)
|
||||||
@ -182,6 +238,18 @@ void ReadBufferFromAzureBlobStorage::initialize()
|
|||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t ReadBufferFromAzureBlobStorage::getFileSize()
|
||||||
|
{
|
||||||
|
if (!blob_client)
|
||||||
|
blob_client = std::make_unique<Azure::Storage::Blobs::BlobClient>(blob_container_client->GetBlobClient(path));
|
||||||
|
|
||||||
|
if (file_size.has_value())
|
||||||
|
return *file_size;
|
||||||
|
|
||||||
|
file_size = blob_client->GetProperties().Value.BlobSize;
|
||||||
|
return *file_size;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,6 +24,7 @@ public:
|
|||||||
size_t max_single_read_retries_,
|
size_t max_single_read_retries_,
|
||||||
size_t max_single_download_retries_,
|
size_t max_single_download_retries_,
|
||||||
bool use_external_buffer_ = false,
|
bool use_external_buffer_ = false,
|
||||||
|
bool restricted_seek_ = false,
|
||||||
size_t read_until_position_ = 0);
|
size_t read_until_position_ = 0);
|
||||||
|
|
||||||
off_t seek(off_t off, int whence) override;
|
off_t seek(off_t off, int whence) override;
|
||||||
@ -37,9 +38,12 @@ public:
|
|||||||
String getFileName() const override { return path; }
|
String getFileName() const override { return path; }
|
||||||
|
|
||||||
void setReadUntilPosition(size_t position) override;
|
void setReadUntilPosition(size_t position) override;
|
||||||
|
void setReadUntilEnd() override;
|
||||||
|
|
||||||
bool supportsRightBoundedReads() const override { return true; }
|
bool supportsRightBoundedReads() const override { return true; }
|
||||||
|
|
||||||
|
size_t getFileSize() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
@ -55,6 +59,12 @@ private:
|
|||||||
std::vector<char> tmp_buffer;
|
std::vector<char> tmp_buffer;
|
||||||
size_t tmp_buffer_size;
|
size_t tmp_buffer_size;
|
||||||
bool use_external_buffer;
|
bool use_external_buffer;
|
||||||
|
|
||||||
|
/// There is different seek policy for disk seek and for non-disk seek
|
||||||
|
/// (non-disk seek is applied for seekable input formats: orc, arrow, parquet).
|
||||||
|
bool restricted_seek;
|
||||||
|
|
||||||
|
|
||||||
off_t read_until_position = 0;
|
off_t read_until_position = 0;
|
||||||
|
|
||||||
off_t offset = 0;
|
off_t offset = 0;
|
||||||
|
@ -22,13 +22,15 @@ ReadBufferFromRemoteFSGather::ReadBufferFromRemoteFSGather(
|
|||||||
ReadBufferCreator && read_buffer_creator_,
|
ReadBufferCreator && read_buffer_creator_,
|
||||||
const StoredObjects & blobs_to_read_,
|
const StoredObjects & blobs_to_read_,
|
||||||
const ReadSettings & settings_,
|
const ReadSettings & settings_,
|
||||||
std::shared_ptr<FilesystemCacheLog> cache_log_)
|
std::shared_ptr<FilesystemCacheLog> cache_log_,
|
||||||
: ReadBufferFromFileBase(0, nullptr, 0)
|
bool use_external_buffer_)
|
||||||
|
: ReadBufferFromFileBase(use_external_buffer_ ? 0 : settings_.remote_fs_buffer_size, nullptr, 0)
|
||||||
, settings(settings_)
|
, settings(settings_)
|
||||||
, blobs_to_read(blobs_to_read_)
|
, blobs_to_read(blobs_to_read_)
|
||||||
, read_buffer_creator(std::move(read_buffer_creator_))
|
, read_buffer_creator(std::move(read_buffer_creator_))
|
||||||
, cache_log(settings.enable_filesystem_cache_log ? cache_log_ : nullptr)
|
, cache_log(settings.enable_filesystem_cache_log ? cache_log_ : nullptr)
|
||||||
, query_id(CurrentThread::isInitialized() && CurrentThread::get().getQueryContext() != nullptr ? CurrentThread::getQueryId() : "")
|
, query_id(CurrentThread::isInitialized() && CurrentThread::get().getQueryContext() != nullptr ? CurrentThread::getQueryId() : "")
|
||||||
|
, use_external_buffer(use_external_buffer_)
|
||||||
, log(&Poco::Logger::get("ReadBufferFromRemoteFSGather"))
|
, log(&Poco::Logger::get("ReadBufferFromRemoteFSGather"))
|
||||||
{
|
{
|
||||||
if (!blobs_to_read.empty())
|
if (!blobs_to_read.empty())
|
||||||
@ -36,7 +38,9 @@ ReadBufferFromRemoteFSGather::ReadBufferFromRemoteFSGather(
|
|||||||
|
|
||||||
with_cache = settings.remote_fs_cache
|
with_cache = settings.remote_fs_cache
|
||||||
&& settings.enable_filesystem_cache
|
&& settings.enable_filesystem_cache
|
||||||
&& (!query_id.empty() || settings.read_from_filesystem_cache_if_exists_otherwise_bypass_cache || !settings.avoid_readthrough_cache_outside_query_context);
|
&& (!query_id.empty()
|
||||||
|
|| settings.read_from_filesystem_cache_if_exists_otherwise_bypass_cache
|
||||||
|
|| !settings.avoid_readthrough_cache_outside_query_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
SeekableReadBufferPtr ReadBufferFromRemoteFSGather::createImplementationBuffer(const StoredObject & object)
|
SeekableReadBufferPtr ReadBufferFromRemoteFSGather::createImplementationBuffer(const StoredObject & object)
|
||||||
@ -235,22 +239,49 @@ void ReadBufferFromRemoteFSGather::reset()
|
|||||||
|
|
||||||
off_t ReadBufferFromRemoteFSGather::seek(off_t offset, int whence)
|
off_t ReadBufferFromRemoteFSGather::seek(off_t offset, int whence)
|
||||||
{
|
{
|
||||||
if (whence != SEEK_SET)
|
if (offset == getPosition() && whence == SEEK_SET)
|
||||||
throw Exception(ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Only seeking with SEEK_SET is allowed");
|
return offset;
|
||||||
|
|
||||||
|
if (whence != SEEK_SET)
|
||||||
|
throw Exception(ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Only SEEK_SET mode is allowed.");
|
||||||
|
|
||||||
|
if (use_external_buffer)
|
||||||
|
{
|
||||||
|
/// In case use_external_buffer == true, the buffer manages seeks itself.
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!working_buffer.empty()
|
||||||
|
&& static_cast<size_t>(offset) >= file_offset_of_buffer_end - working_buffer.size()
|
||||||
|
&& static_cast<size_t>(offset) < file_offset_of_buffer_end)
|
||||||
|
{
|
||||||
|
pos = working_buffer.end() - (file_offset_of_buffer_end - offset);
|
||||||
|
assert(pos >= working_buffer.begin());
|
||||||
|
assert(pos < working_buffer.end());
|
||||||
|
|
||||||
|
return getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t position = getPosition();
|
||||||
|
if (current_buf && offset > position)
|
||||||
|
{
|
||||||
|
size_t diff = offset - position;
|
||||||
|
if (diff < settings.remote_read_min_bytes_for_seek)
|
||||||
|
{
|
||||||
|
ignore(diff);
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resetWorkingBuffer();
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
reset();
|
|
||||||
file_offset_of_buffer_end = offset;
|
file_offset_of_buffer_end = offset;
|
||||||
return file_offset_of_buffer_end;
|
return file_offset_of_buffer_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ReadBufferFromRemoteFSGather::getImplementationBufferOffset() const
|
|
||||||
{
|
|
||||||
if (!current_buf)
|
|
||||||
return file_offset_of_buffer_end;
|
|
||||||
|
|
||||||
return current_buf->getFileOffsetOfBufferEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadBufferFromRemoteFSGather::~ReadBufferFromRemoteFSGather()
|
ReadBufferFromRemoteFSGather::~ReadBufferFromRemoteFSGather()
|
||||||
{
|
{
|
||||||
if (!with_cache)
|
if (!with_cache)
|
||||||
|
@ -27,7 +27,8 @@ public:
|
|||||||
ReadBufferCreator && read_buffer_creator_,
|
ReadBufferCreator && read_buffer_creator_,
|
||||||
const StoredObjects & blobs_to_read_,
|
const StoredObjects & blobs_to_read_,
|
||||||
const ReadSettings & settings_,
|
const ReadSettings & settings_,
|
||||||
std::shared_ptr<FilesystemCacheLog> cache_log_);
|
std::shared_ptr<FilesystemCacheLog> cache_log_,
|
||||||
|
bool use_external_buffer_);
|
||||||
|
|
||||||
~ReadBufferFromRemoteFSGather() override;
|
~ReadBufferFromRemoteFSGather() override;
|
||||||
|
|
||||||
@ -37,16 +38,14 @@ public:
|
|||||||
|
|
||||||
void setReadUntilPosition(size_t position) override;
|
void setReadUntilPosition(size_t position) override;
|
||||||
|
|
||||||
|
void setReadUntilEnd() override { return setReadUntilPosition(getFileSize()); }
|
||||||
|
|
||||||
IAsynchronousReader::Result readInto(char * data, size_t size, size_t offset, size_t ignore) override;
|
IAsynchronousReader::Result readInto(char * data, size_t size, size_t offset, size_t ignore) override;
|
||||||
|
|
||||||
size_t getFileSize() override { return getTotalSize(blobs_to_read); }
|
size_t getFileSize() override { return getTotalSize(blobs_to_read); }
|
||||||
|
|
||||||
size_t getFileOffsetOfBufferEnd() const override { return file_offset_of_buffer_end; }
|
size_t getFileOffsetOfBufferEnd() const override { return file_offset_of_buffer_end; }
|
||||||
|
|
||||||
bool initialized() const { return current_buf != nullptr; }
|
|
||||||
|
|
||||||
size_t getImplementationBufferOffset() const;
|
|
||||||
|
|
||||||
off_t seek(off_t offset, int whence) override;
|
off_t seek(off_t offset, int whence) override;
|
||||||
|
|
||||||
off_t getPosition() override { return file_offset_of_buffer_end - available() + bytes_to_ignore; }
|
off_t getPosition() override { return file_offset_of_buffer_end - available() + bytes_to_ignore; }
|
||||||
@ -71,6 +70,7 @@ private:
|
|||||||
const ReadBufferCreator read_buffer_creator;
|
const ReadBufferCreator read_buffer_creator;
|
||||||
const std::shared_ptr<FilesystemCacheLog> cache_log;
|
const std::shared_ptr<FilesystemCacheLog> cache_log;
|
||||||
const String query_id;
|
const String query_id;
|
||||||
|
const bool use_external_buffer;
|
||||||
bool with_cache;
|
bool with_cache;
|
||||||
|
|
||||||
size_t read_until_position = 0;
|
size_t read_until_position = 0;
|
||||||
|
@ -12,8 +12,6 @@ namespace DB
|
|||||||
|
|
||||||
/* Read buffer, which reads via http, but is used as ReadBufferFromFileBase.
|
/* Read buffer, which reads via http, but is used as ReadBufferFromFileBase.
|
||||||
* Used to read files, hosted on a web server with static files.
|
* Used to read files, hosted on a web server with static files.
|
||||||
*
|
|
||||||
* Usage: ReadIndirectBufferFromRemoteFS -> SeekAvoidingReadBuffer -> ReadBufferFromWebServer -> ReadWriteBufferFromHTTP.
|
|
||||||
*/
|
*/
|
||||||
class ReadBufferFromWebServer : public ReadBufferFromFileBase
|
class ReadBufferFromWebServer : public ReadBufferFromFileBase
|
||||||
{
|
{
|
||||||
|
@ -1,118 +0,0 @@
|
|||||||
#include "ReadIndirectBufferFromRemoteFS.h"
|
|
||||||
|
|
||||||
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
|
||||||
{
|
|
||||||
|
|
||||||
namespace ErrorCodes
|
|
||||||
{
|
|
||||||
extern const int CANNOT_SEEK_THROUGH_FILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ReadIndirectBufferFromRemoteFS::ReadIndirectBufferFromRemoteFS(
|
|
||||||
std::shared_ptr<ReadBufferFromRemoteFSGather> impl_, const ReadSettings & settings)
|
|
||||||
: ReadBufferFromFileBase(settings.remote_fs_buffer_size, nullptr, 0)
|
|
||||||
, impl(impl_)
|
|
||||||
, read_settings(settings)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t ReadIndirectBufferFromRemoteFS::getFileSize()
|
|
||||||
{
|
|
||||||
return impl->getFileSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
off_t ReadIndirectBufferFromRemoteFS::getPosition()
|
|
||||||
{
|
|
||||||
return impl->file_offset_of_buffer_end - available();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
String ReadIndirectBufferFromRemoteFS::getFileName() const
|
|
||||||
{
|
|
||||||
return impl->getFileName();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ReadIndirectBufferFromRemoteFS::setReadUntilPosition(size_t position)
|
|
||||||
{
|
|
||||||
impl->setReadUntilPosition(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ReadIndirectBufferFromRemoteFS::setReadUntilEnd()
|
|
||||||
{
|
|
||||||
impl->setReadUntilPosition(impl->getFileSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
off_t ReadIndirectBufferFromRemoteFS::seek(off_t offset_, int whence)
|
|
||||||
{
|
|
||||||
if (whence == SEEK_CUR)
|
|
||||||
{
|
|
||||||
/// If position within current working buffer - shift pos.
|
|
||||||
if (!working_buffer.empty() && size_t(getPosition() + offset_) < impl->file_offset_of_buffer_end)
|
|
||||||
{
|
|
||||||
pos += offset_;
|
|
||||||
return getPosition();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
impl->file_offset_of_buffer_end += offset_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (whence == SEEK_SET)
|
|
||||||
{
|
|
||||||
/// If position within current working buffer - shift pos.
|
|
||||||
if (!working_buffer.empty()
|
|
||||||
&& size_t(offset_) >= impl->file_offset_of_buffer_end - working_buffer.size()
|
|
||||||
&& size_t(offset_) < impl->file_offset_of_buffer_end)
|
|
||||||
{
|
|
||||||
pos = working_buffer.end() - (impl->file_offset_of_buffer_end - offset_);
|
|
||||||
return getPosition();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
impl->file_offset_of_buffer_end = offset_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw Exception(ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Only SEEK_SET or SEEK_CUR modes are allowed.");
|
|
||||||
|
|
||||||
impl->seek(impl->file_offset_of_buffer_end, SEEK_SET);
|
|
||||||
resetWorkingBuffer();
|
|
||||||
|
|
||||||
file_offset_of_buffer_end = impl->file_offset_of_buffer_end;
|
|
||||||
return impl->file_offset_of_buffer_end;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ReadIndirectBufferFromRemoteFS::nextImpl()
|
|
||||||
{
|
|
||||||
chassert(internal_buffer.size() == read_settings.remote_fs_buffer_size);
|
|
||||||
chassert(file_offset_of_buffer_end <= impl->getFileSize());
|
|
||||||
|
|
||||||
auto [size, offset, _] = impl->readInto(internal_buffer.begin(), internal_buffer.size(), file_offset_of_buffer_end, /* ignore */0);
|
|
||||||
|
|
||||||
chassert(offset <= size);
|
|
||||||
chassert(size <= internal_buffer.size());
|
|
||||||
|
|
||||||
size_t bytes_read = size - offset;
|
|
||||||
if (bytes_read)
|
|
||||||
working_buffer = Buffer(internal_buffer.begin() + offset, internal_buffer.begin() + size);
|
|
||||||
|
|
||||||
file_offset_of_buffer_end = impl->getFileOffsetOfBufferEnd();
|
|
||||||
|
|
||||||
/// In case of multiple files for the same file in clickhouse (i.e. log family)
|
|
||||||
/// file_offset_of_buffer_end will not match getImplementationBufferOffset()
|
|
||||||
/// so we use [impl->getImplementationBufferOffset(), impl->getFileSize()]
|
|
||||||
chassert(file_offset_of_buffer_end >= impl->getImplementationBufferOffset());
|
|
||||||
chassert(file_offset_of_buffer_end <= impl->getFileSize());
|
|
||||||
|
|
||||||
return bytes_read;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include <IO/ReadBufferFromFile.h>
|
|
||||||
#include <IO/ReadSettings.h>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
|
||||||
{
|
|
||||||
|
|
||||||
class ReadBufferFromRemoteFSGather;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reads data from S3/HDFS/Web using stored paths in metadata.
|
|
||||||
* There is asynchronous version of this class -- AsynchronousReadIndirectBufferFromRemoteFS.
|
|
||||||
*/
|
|
||||||
class ReadIndirectBufferFromRemoteFS : public ReadBufferFromFileBase
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit ReadIndirectBufferFromRemoteFS(std::shared_ptr<ReadBufferFromRemoteFSGather> impl_, const ReadSettings & settings);
|
|
||||||
|
|
||||||
off_t seek(off_t offset_, int whence) override;
|
|
||||||
|
|
||||||
off_t getPosition() override;
|
|
||||||
|
|
||||||
String getFileName() const override;
|
|
||||||
|
|
||||||
void setReadUntilPosition(size_t position) override;
|
|
||||||
|
|
||||||
void setReadUntilEnd() override;
|
|
||||||
|
|
||||||
size_t getFileSize() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool nextImpl() override;
|
|
||||||
|
|
||||||
std::shared_ptr<ReadBufferFromRemoteFSGather> impl;
|
|
||||||
|
|
||||||
ReadSettings read_settings;
|
|
||||||
|
|
||||||
size_t file_offset_of_buffer_end = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -57,14 +57,22 @@ void validateContainerName(const String & container_name)
|
|||||||
|
|
||||||
AzureBlobStorageEndpoint processAzureBlobStorageEndpoint(const Poco::Util::AbstractConfiguration & config, const String & config_prefix)
|
AzureBlobStorageEndpoint processAzureBlobStorageEndpoint(const Poco::Util::AbstractConfiguration & config, const String & config_prefix)
|
||||||
{
|
{
|
||||||
String storage_account_url = config.getString(config_prefix + ".storage_account_url");
|
std::string storage_url;
|
||||||
validateStorageAccountUrl(storage_account_url);
|
if (config.has(config_prefix + ".storage_account_url"))
|
||||||
|
{
|
||||||
|
storage_url = config.getString(config_prefix + ".storage_account_url");
|
||||||
|
validateStorageAccountUrl(storage_url);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
storage_url = config.getString(config_prefix + ".connection_string");
|
||||||
|
}
|
||||||
String container_name = config.getString(config_prefix + ".container_name", "default-container");
|
String container_name = config.getString(config_prefix + ".container_name", "default-container");
|
||||||
validateContainerName(container_name);
|
validateContainerName(container_name);
|
||||||
std::optional<bool> container_already_exists {};
|
std::optional<bool> container_already_exists {};
|
||||||
if (config.has(config_prefix + ".container_already_exists"))
|
if (config.has(config_prefix + ".container_already_exists"))
|
||||||
container_already_exists = {config.getBool(config_prefix + ".container_already_exists")};
|
container_already_exists = {config.getBool(config_prefix + ".container_already_exists")};
|
||||||
return {storage_account_url, container_name, container_already_exists};
|
return {storage_url, container_name, container_already_exists};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -136,10 +144,7 @@ std::unique_ptr<BlobContainerClient> getAzureBlobContainerClient(
|
|||||||
/// If container_already_exists is not set (in config), ignore already exists error.
|
/// If container_already_exists is not set (in config), ignore already exists error.
|
||||||
/// (Conflict - The specified container already exists)
|
/// (Conflict - The specified container already exists)
|
||||||
if (!endpoint.container_already_exists.has_value() && e.StatusCode == Azure::Core::Http::HttpStatusCode::Conflict)
|
if (!endpoint.container_already_exists.has_value() && e.StatusCode == Azure::Core::Http::HttpStatusCode::Conflict)
|
||||||
{
|
|
||||||
tryLogCurrentException("Container already exists, returning the existing container");
|
|
||||||
return getAzureBlobStorageClientWithAuth<BlobContainerClient>(final_url, container_name, config, config_prefix);
|
return getAzureBlobStorageClientWithAuth<BlobContainerClient>(final_url, container_name, config, config_prefix);
|
||||||
}
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
#include <Common/getRandomASCIIString.h>
|
#include <Common/getRandomASCIIString.h>
|
||||||
#include <Disks/IO/ReadBufferFromAzureBlobStorage.h>
|
#include <Disks/IO/ReadBufferFromAzureBlobStorage.h>
|
||||||
#include <Disks/IO/WriteBufferFromAzureBlobStorage.h>
|
#include <Disks/IO/WriteBufferFromAzureBlobStorage.h>
|
||||||
#include <IO/SeekAvoidingReadBuffer.h>
|
|
||||||
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
||||||
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
||||||
|
|
||||||
@ -57,6 +56,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
bool getBatchAndCheckNext(RelativePathsWithMetadata & batch) override
|
bool getBatchAndCheckNext(RelativePathsWithMetadata & batch) override
|
||||||
{
|
{
|
||||||
|
batch.clear();
|
||||||
auto outcome = client->ListBlobs(options);
|
auto outcome = client->ListBlobs(options);
|
||||||
auto blob_list_response = client->ListBlobs(options);
|
auto blob_list_response = client->ListBlobs(options);
|
||||||
auto blobs_list = blob_list_response.Blobs;
|
auto blobs_list = blob_list_response.Blobs;
|
||||||
@ -73,11 +73,11 @@ private:
|
|||||||
{}});
|
{}});
|
||||||
}
|
}
|
||||||
|
|
||||||
options.ContinuationToken = blob_list_response.NextPageToken;
|
if (!blob_list_response.NextPageToken.HasValue() || blob_list_response.NextPageToken.Value().empty())
|
||||||
if (blob_list_response.HasPage())
|
return false;
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
options.ContinuationToken = blob_list_response.NextPageToken;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<const Azure::Storage::Blobs::BlobContainerClient> client;
|
std::shared_ptr<const Azure::Storage::Blobs::BlobContainerClient> client;
|
||||||
@ -215,27 +215,37 @@ std::unique_ptr<ReadBufferFromFileBase> AzureObjectStorage::readObjects( /// NOL
|
|||||||
settings_ptr->max_single_read_retries,
|
settings_ptr->max_single_read_retries,
|
||||||
settings_ptr->max_single_download_retries,
|
settings_ptr->max_single_download_retries,
|
||||||
/* use_external_buffer */true,
|
/* use_external_buffer */true,
|
||||||
|
/* restricted_seek */true,
|
||||||
read_until_position);
|
read_until_position);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto reader_impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
switch (read_settings.remote_fs_method)
|
||||||
std::move(read_buffer_creator),
|
{
|
||||||
objects,
|
case RemoteFSReadMethod::read:
|
||||||
disk_read_settings,
|
{
|
||||||
global_context->getFilesystemCacheLog());
|
return std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
|
std::move(read_buffer_creator),
|
||||||
|
objects,
|
||||||
|
disk_read_settings,
|
||||||
|
global_context->getFilesystemCacheLog(),
|
||||||
|
/* use_external_buffer */false);
|
||||||
|
|
||||||
if (disk_read_settings.remote_fs_method == RemoteFSReadMethod::threadpool)
|
}
|
||||||
{
|
case RemoteFSReadMethod::threadpool:
|
||||||
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
{
|
||||||
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
auto impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
std::move(reader_impl), reader, disk_read_settings,
|
std::move(read_buffer_creator),
|
||||||
global_context->getAsyncReadCounters(),
|
objects,
|
||||||
global_context->getFilesystemReadPrefetchesLog());
|
disk_read_settings,
|
||||||
}
|
global_context->getFilesystemCacheLog(),
|
||||||
else
|
/* use_external_buffer */true);
|
||||||
{
|
|
||||||
auto buf = std::make_unique<ReadIndirectBufferFromRemoteFS>(std::move(reader_impl), disk_read_settings);
|
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
||||||
return std::make_unique<SeekAvoidingReadBuffer>(std::move(buf), settings_ptr->min_bytes_for_seek);
|
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
||||||
|
std::move(impl), reader, disk_read_settings,
|
||||||
|
global_context->getAsyncReadCounters(),
|
||||||
|
global_context->getFilesystemReadPrefetchesLog());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,13 +5,9 @@
|
|||||||
|
|
||||||
#include <Disks/ObjectStorages/DiskObjectStorageCommon.h>
|
#include <Disks/ObjectStorages/DiskObjectStorageCommon.h>
|
||||||
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
||||||
#include <Disks/IO/ReadIndirectBufferFromRemoteFS.h>
|
|
||||||
#include <Disks/ObjectStorages/IObjectStorage.h>
|
#include <Disks/ObjectStorages/IObjectStorage.h>
|
||||||
#include <Common/MultiVersion.h>
|
#include <Common/MultiVersion.h>
|
||||||
|
|
||||||
#if USE_AZURE_BLOB_STORAGE
|
|
||||||
#include <azure/storage/blobs.hpp>
|
#include <azure/storage/blobs.hpp>
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace Poco
|
namespace Poco
|
||||||
{
|
{
|
||||||
@ -37,11 +33,13 @@ struct AzureObjectStorageSettings
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t max_single_part_upload_size; /// NOTE: on 32-bit machines it will be at most 4GB, but size_t is also used in BufferBase for offset
|
AzureObjectStorageSettings() = default;
|
||||||
uint64_t min_bytes_for_seek;
|
|
||||||
size_t max_single_read_retries;
|
size_t max_single_part_upload_size = 100 * 1024 * 1024; /// NOTE: on 32-bit machines it will be at most 4GB, but size_t is also used in BufferBase for offset
|
||||||
size_t max_single_download_retries;
|
uint64_t min_bytes_for_seek = 1024 * 1024;
|
||||||
int list_object_keys_size;
|
size_t max_single_read_retries = 3;
|
||||||
|
size_t max_single_download_retries = 3;
|
||||||
|
int list_object_keys_size = 1000;
|
||||||
};
|
};
|
||||||
|
|
||||||
using AzureClient = Azure::Storage::Blobs::BlobContainerClient;
|
using AzureClient = Azure::Storage::Blobs::BlobContainerClient;
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
#include <Disks/ObjectStorages/HDFS/HDFSObjectStorage.h>
|
#include <Disks/ObjectStorages/HDFS/HDFSObjectStorage.h>
|
||||||
|
|
||||||
#include <IO/SeekAvoidingReadBuffer.h>
|
|
||||||
#include <IO/copyData.h>
|
#include <IO/copyData.h>
|
||||||
|
|
||||||
#include <Storages/HDFS/WriteBufferFromHDFS.h>
|
#include <Storages/HDFS/WriteBufferFromHDFS.h>
|
||||||
#include <Storages/HDFS/HDFSCommon.h>
|
#include <Storages/HDFS/HDFSCommon.h>
|
||||||
|
|
||||||
#include <Storages/HDFS/ReadBufferFromHDFS.h>
|
#include <Storages/HDFS/ReadBufferFromHDFS.h>
|
||||||
#include <Disks/IO/ReadIndirectBufferFromRemoteFS.h>
|
|
||||||
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
||||||
#include <Common/getRandomASCIIString.h>
|
#include <Common/getRandomASCIIString.h>
|
||||||
|
|
||||||
@ -72,9 +69,8 @@ std::unique_ptr<ReadBufferFromFileBase> HDFSObjectStorage::readObjects( /// NOLI
|
|||||||
hdfs_uri, hdfs_path, config, disk_read_settings, /* read_until_position */0, /* use_external_buffer */true);
|
hdfs_uri, hdfs_path, config, disk_read_settings, /* read_until_position */0, /* use_external_buffer */true);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto hdfs_impl = std::make_unique<ReadBufferFromRemoteFSGather>(std::move(read_buffer_creator), objects, disk_read_settings, nullptr);
|
return std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
auto buf = std::make_unique<ReadIndirectBufferFromRemoteFS>(std::move(hdfs_impl), read_settings);
|
std::move(read_buffer_creator), objects, disk_read_settings, nullptr, /* use_external_buffer */false);
|
||||||
return std::make_unique<SeekAvoidingReadBuffer>(std::move(buf), settings->min_bytes_for_seek);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<WriteBufferFromFileBase> HDFSObjectStorage::writeObject( /// NOLINT
|
std::unique_ptr<WriteBufferFromFileBase> HDFSObjectStorage::writeObject( /// NOLINT
|
||||||
|
@ -4,11 +4,9 @@
|
|||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Common/filesystemHelpers.h>
|
#include <Common/filesystemHelpers.h>
|
||||||
#include <Common/logger_useful.h>
|
#include <Common/logger_useful.h>
|
||||||
#include <Disks/IO/ReadIndirectBufferFromRemoteFS.h>
|
|
||||||
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
||||||
#include <Disks/IO/createReadBufferFromFileBase.h>
|
#include <Disks/IO/createReadBufferFromFileBase.h>
|
||||||
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
||||||
#include <IO/SeekAvoidingReadBuffer.h>
|
|
||||||
#include <IO/WriteBufferFromFile.h>
|
#include <IO/WriteBufferFromFile.h>
|
||||||
#include <IO/copyData.h>
|
#include <IO/copyData.h>
|
||||||
#include <Common/getRandomASCIIString.h>
|
#include <Common/getRandomASCIIString.h>
|
||||||
@ -59,25 +57,26 @@ std::unique_ptr<ReadBufferFromFileBase> LocalObjectStorage::readObjects( /// NOL
|
|||||||
return createReadBufferFromFileBase(file_path, modified_settings, read_hint, file_size);
|
return createReadBufferFromFileBase(file_path, modified_settings, read_hint, file_size);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
switch (read_settings.remote_fs_method)
|
||||||
std::move(read_buffer_creator), objects, modified_settings,
|
{
|
||||||
global_context->getFilesystemCacheLog());
|
case RemoteFSReadMethod::read:
|
||||||
|
{
|
||||||
|
return std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
|
std::move(read_buffer_creator), objects, modified_settings,
|
||||||
|
global_context->getFilesystemCacheLog(), /* use_external_buffer */false);
|
||||||
|
}
|
||||||
|
case RemoteFSReadMethod::threadpool:
|
||||||
|
{
|
||||||
|
auto impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
|
std::move(read_buffer_creator), objects, modified_settings,
|
||||||
|
global_context->getFilesystemCacheLog(), /* use_external_buffer */true);
|
||||||
|
|
||||||
/// We use `remove_fs_method` (not `local_fs_method`) because we are about to use
|
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
||||||
/// AsynchronousBoundedReadBuffer which works by the remote_fs_* settings.
|
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
||||||
if (modified_settings.remote_fs_method == RemoteFSReadMethod::threadpool)
|
std::move(impl), reader, read_settings,
|
||||||
{
|
global_context->getAsyncReadCounters(),
|
||||||
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
global_context->getFilesystemReadPrefetchesLog());
|
||||||
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
}
|
||||||
std::move(impl), reader, modified_settings,
|
|
||||||
global_context->getAsyncReadCounters(),
|
|
||||||
global_context->getFilesystemReadPrefetchesLog());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
auto buf = std::make_unique<ReadIndirectBufferFromRemoteFS>(std::move(impl), modified_settings);
|
|
||||||
return std::make_unique<SeekAvoidingReadBuffer>(
|
|
||||||
std::move(buf), modified_settings.remote_read_min_bytes_for_seek);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ namespace ErrorCodes
|
|||||||
extern const int LOGICAL_ERROR;
|
extern const int LOGICAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
RelativePathWithMetadata ObjectStorageIteratorFromList::current() const
|
RelativePathWithMetadata ObjectStorageIteratorFromList::current()
|
||||||
{
|
{
|
||||||
if (!isValid())
|
if (!isValid())
|
||||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Trying to access invalid iterator");
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "Trying to access invalid iterator");
|
||||||
|
@ -10,8 +10,10 @@ class IObjectStorageIterator
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void next() = 0;
|
virtual void next() = 0;
|
||||||
virtual bool isValid() const = 0;
|
virtual void nextBatch() = 0;
|
||||||
virtual RelativePathWithMetadata current() const = 0;
|
virtual bool isValid() = 0;
|
||||||
|
virtual RelativePathWithMetadata current() = 0;
|
||||||
|
virtual RelativePathsWithMetadata currentBatch() = 0;
|
||||||
virtual size_t getAccumulatedSize() const = 0;
|
virtual size_t getAccumulatedSize() const = 0;
|
||||||
|
|
||||||
virtual ~IObjectStorageIterator() = default;
|
virtual ~IObjectStorageIterator() = default;
|
||||||
@ -34,12 +36,22 @@ public:
|
|||||||
++batch_iterator;
|
++batch_iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() const override
|
void nextBatch() override
|
||||||
|
{
|
||||||
|
batch_iterator = batch.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValid() override
|
||||||
{
|
{
|
||||||
return batch_iterator != batch.end();
|
return batch_iterator != batch.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
RelativePathWithMetadata current() const override;
|
RelativePathWithMetadata current() override;
|
||||||
|
|
||||||
|
RelativePathsWithMetadata currentBatch() override
|
||||||
|
{
|
||||||
|
return batch;
|
||||||
|
}
|
||||||
|
|
||||||
size_t getAccumulatedSize() const override
|
size_t getAccumulatedSize() const override
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include <Disks/ObjectStorages/ObjectStorageIteratorAsync.h>
|
#include <Disks/ObjectStorages/ObjectStorageIteratorAsync.h>
|
||||||
|
|
||||||
|
#include <Common/logger_useful.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -8,6 +10,33 @@ namespace ErrorCodes
|
|||||||
extern const int LOGICAL_ERROR;
|
extern const int LOGICAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IObjectStorageIteratorAsync::nextBatch()
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
|
if (!is_finished)
|
||||||
|
{
|
||||||
|
if (!is_initialized)
|
||||||
|
{
|
||||||
|
outcome_future = scheduleBatch();
|
||||||
|
is_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BatchAndHasNext next_batch = outcome_future.get();
|
||||||
|
current_batch = std::move(next_batch.batch);
|
||||||
|
accumulated_size.fetch_add(current_batch.size(), std::memory_order_relaxed);
|
||||||
|
current_batch_iterator = current_batch.begin();
|
||||||
|
if (next_batch.has_next)
|
||||||
|
outcome_future = scheduleBatch();
|
||||||
|
else
|
||||||
|
is_finished = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current_batch.clear();
|
||||||
|
current_batch_iterator = current_batch.begin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IObjectStorageIteratorAsync::next()
|
void IObjectStorageIteratorAsync::next()
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
@ -43,19 +72,34 @@ std::future<IObjectStorageIteratorAsync::BatchAndHasNext> IObjectStorageIterator
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool IObjectStorageIteratorAsync::isValid() const
|
bool IObjectStorageIteratorAsync::isValid()
|
||||||
{
|
{
|
||||||
|
if (!is_initialized)
|
||||||
|
nextBatch();
|
||||||
|
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
return current_batch_iterator != current_batch.end();
|
return current_batch_iterator != current_batch.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
RelativePathWithMetadata IObjectStorageIteratorAsync::current() const
|
RelativePathWithMetadata IObjectStorageIteratorAsync::current()
|
||||||
{
|
{
|
||||||
if (!isValid())
|
if (!isValid())
|
||||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Trying to access invalid iterator");
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "Trying to access invalid iterator");
|
||||||
|
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
return *current_batch_iterator;
|
return *current_batch_iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RelativePathsWithMetadata IObjectStorageIteratorAsync::currentBatch()
|
||||||
|
{
|
||||||
|
if (!isValid())
|
||||||
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "Trying to access invalid iterator");
|
||||||
|
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
|
return current_batch;
|
||||||
|
}
|
||||||
|
|
||||||
size_t IObjectStorageIteratorAsync::getAccumulatedSize() const
|
size_t IObjectStorageIteratorAsync::getAccumulatedSize() const
|
||||||
{
|
{
|
||||||
return accumulated_size.load(std::memory_order_relaxed);
|
return accumulated_size.load(std::memory_order_relaxed);
|
||||||
|
@ -22,8 +22,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void next() override;
|
void next() override;
|
||||||
bool isValid() const override;
|
void nextBatch() override;
|
||||||
RelativePathWithMetadata current() const override;
|
bool isValid() override;
|
||||||
|
RelativePathWithMetadata current() override;
|
||||||
|
RelativePathsWithMetadata currentBatch() override;
|
||||||
size_t getAccumulatedSize() const override;
|
size_t getAccumulatedSize() const override;
|
||||||
|
|
||||||
~IObjectStorageIteratorAsync() override
|
~IObjectStorageIteratorAsync() override
|
||||||
@ -43,9 +45,10 @@ protected:
|
|||||||
|
|
||||||
std::future<BatchAndHasNext> scheduleBatch();
|
std::future<BatchAndHasNext> scheduleBatch();
|
||||||
|
|
||||||
|
bool is_initialized{false};
|
||||||
bool is_finished{false};
|
bool is_finished{false};
|
||||||
|
|
||||||
std::mutex mutex;
|
mutable std::mutex mutex;
|
||||||
ThreadPool list_objects_pool;
|
ThreadPool list_objects_pool;
|
||||||
ThreadPoolCallbackRunner<BatchAndHasNext> list_objects_scheduler;
|
ThreadPoolCallbackRunner<BatchAndHasNext> list_objects_scheduler;
|
||||||
std::future<BatchAndHasNext> outcome_future;
|
std::future<BatchAndHasNext> outcome_future;
|
||||||
|
@ -8,11 +8,9 @@
|
|||||||
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
||||||
#include <Disks/ObjectStorages/DiskObjectStorageCommon.h>
|
#include <Disks/ObjectStorages/DiskObjectStorageCommon.h>
|
||||||
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
||||||
#include <Disks/IO/ReadIndirectBufferFromRemoteFS.h>
|
|
||||||
#include <Disks/IO/ThreadPoolRemoteFSReader.h>
|
#include <Disks/IO/ThreadPoolRemoteFSReader.h>
|
||||||
#include <IO/WriteBufferFromS3.h>
|
#include <IO/WriteBufferFromS3.h>
|
||||||
#include <IO/ReadBufferFromS3.h>
|
#include <IO/ReadBufferFromS3.h>
|
||||||
#include <IO/SeekAvoidingReadBuffer.h>
|
|
||||||
#include <IO/S3/getObjectInfo.h>
|
#include <IO/S3/getObjectInfo.h>
|
||||||
#include <IO/S3/copyS3File.h>
|
#include <IO/S3/copyS3File.h>
|
||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
@ -182,24 +180,33 @@ std::unique_ptr<ReadBufferFromFileBase> S3ObjectStorage::readObjects( /// NOLINT
|
|||||||
/* restricted_seek */true);
|
/* restricted_seek */true);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto s3_impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
switch (read_settings.remote_fs_method)
|
||||||
std::move(read_buffer_creator),
|
{
|
||||||
objects,
|
case RemoteFSReadMethod::read:
|
||||||
disk_read_settings,
|
{
|
||||||
global_context->getFilesystemCacheLog());
|
return std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
|
std::move(read_buffer_creator),
|
||||||
|
objects,
|
||||||
|
disk_read_settings,
|
||||||
|
global_context->getFilesystemCacheLog(),
|
||||||
|
/* use_external_buffer */false);
|
||||||
|
|
||||||
if (read_settings.remote_fs_method == RemoteFSReadMethod::threadpool)
|
}
|
||||||
{
|
case RemoteFSReadMethod::threadpool:
|
||||||
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
{
|
||||||
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
auto impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
std::move(s3_impl), reader, disk_read_settings,
|
std::move(read_buffer_creator),
|
||||||
global_context->getAsyncReadCounters(),
|
objects,
|
||||||
global_context->getFilesystemReadPrefetchesLog());
|
disk_read_settings,
|
||||||
}
|
global_context->getFilesystemCacheLog(),
|
||||||
else
|
/* use_external_buffer */true);
|
||||||
{
|
|
||||||
auto buf = std::make_unique<ReadIndirectBufferFromRemoteFS>(std::move(s3_impl), disk_read_settings);
|
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
||||||
return std::make_unique<SeekAvoidingReadBuffer>(std::move(buf), settings_ptr->min_bytes_for_seek);
|
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
||||||
|
std::move(impl), reader, disk_read_settings,
|
||||||
|
global_context->getAsyncReadCounters(),
|
||||||
|
global_context->getFilesystemReadPrefetchesLog());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,11 +4,9 @@
|
|||||||
#include <Common/escapeForFileName.h>
|
#include <Common/escapeForFileName.h>
|
||||||
|
|
||||||
#include <IO/ReadWriteBufferFromHTTP.h>
|
#include <IO/ReadWriteBufferFromHTTP.h>
|
||||||
#include <IO/SeekAvoidingReadBuffer.h>
|
|
||||||
#include <IO/ReadHelpers.h>
|
#include <IO/ReadHelpers.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
|
|
||||||
#include <Disks/IO/ReadIndirectBufferFromRemoteFS.h>
|
|
||||||
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
#include <Disks/IO/AsynchronousBoundedReadBuffer.h>
|
||||||
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
#include <Disks/IO/ReadBufferFromRemoteFSGather.h>
|
||||||
#include <Disks/IO/ReadBufferFromWebServer.h>
|
#include <Disks/IO/ReadBufferFromWebServer.h>
|
||||||
@ -181,24 +179,33 @@ std::unique_ptr<ReadBufferFromFileBase> WebObjectStorage::readObject( /// NOLINT
|
|||||||
};
|
};
|
||||||
|
|
||||||
auto global_context = Context::getGlobalContextInstance();
|
auto global_context = Context::getGlobalContextInstance();
|
||||||
auto web_impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
|
||||||
std::move(read_buffer_creator),
|
|
||||||
StoredObjects{object},
|
|
||||||
read_settings,
|
|
||||||
global_context->getFilesystemCacheLog());
|
|
||||||
|
|
||||||
if (read_settings.remote_fs_method == RemoteFSReadMethod::threadpool)
|
switch (read_settings.remote_fs_method)
|
||||||
{
|
{
|
||||||
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
case RemoteFSReadMethod::read:
|
||||||
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
{
|
||||||
std::move(web_impl), reader, read_settings,
|
return std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
global_context->getAsyncReadCounters(),
|
std::move(read_buffer_creator),
|
||||||
global_context->getFilesystemReadPrefetchesLog());
|
StoredObjects{object},
|
||||||
}
|
read_settings,
|
||||||
else
|
global_context->getFilesystemCacheLog(),
|
||||||
{
|
/* use_external_buffer */false);
|
||||||
auto buf = std::make_unique<ReadIndirectBufferFromRemoteFS>(std::move(web_impl), read_settings);
|
}
|
||||||
return std::make_unique<SeekAvoidingReadBuffer>(std::move(buf), min_bytes_for_seek);
|
case RemoteFSReadMethod::threadpool:
|
||||||
|
{
|
||||||
|
auto impl = std::make_unique<ReadBufferFromRemoteFSGather>(
|
||||||
|
std::move(read_buffer_creator),
|
||||||
|
StoredObjects{object},
|
||||||
|
read_settings,
|
||||||
|
global_context->getFilesystemCacheLog(),
|
||||||
|
/* use_external_buffer */true);
|
||||||
|
|
||||||
|
auto & reader = global_context->getThreadPoolReader(FilesystemReaderType::ASYNCHRONOUS_REMOTE_FS_READER);
|
||||||
|
return std::make_unique<AsynchronousBoundedReadBuffer>(
|
||||||
|
std::move(impl), reader, read_settings,
|
||||||
|
global_context->getAsyncReadCounters(),
|
||||||
|
global_context->getFilesystemReadPrefetchesLog());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -679,7 +679,7 @@ public:
|
|||||||
}
|
}
|
||||||
else if constexpr (std::is_same_v<ResultDataType, DataTypeDateTime>)
|
else if constexpr (std::is_same_v<ResultDataType, DataTypeDateTime>)
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeDateTime>(extractTimeZoneNameFromFunctionArguments(arguments, 2, 0));
|
return std::make_shared<DataTypeDateTime>(extractTimeZoneNameFromFunctionArguments(arguments, 2, 0, false));
|
||||||
}
|
}
|
||||||
else if constexpr (std::is_same_v<ResultDataType, DataTypeDateTime64>)
|
else if constexpr (std::is_same_v<ResultDataType, DataTypeDateTime64>)
|
||||||
{
|
{
|
||||||
@ -696,7 +696,7 @@ public:
|
|||||||
return {};
|
return {};
|
||||||
});
|
});
|
||||||
|
|
||||||
auto timezone = extractTimeZoneNameFromFunctionArguments(arguments, 2, 0);
|
auto timezone = extractTimeZoneNameFromFunctionArguments(arguments, 2, 0, false);
|
||||||
if (const auto* datetime64_type = typeid_cast<const DataTypeDateTime64 *>(arguments[0].type.get()))
|
if (const auto* datetime64_type = typeid_cast<const DataTypeDateTime64 *>(arguments[0].type.get()))
|
||||||
{
|
{
|
||||||
const auto from_scale = datetime64_type->getScale();
|
const auto from_scale = datetime64_type->getScale();
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user