Merge branch 'master' into add-compression-sorts-optimization

This commit is contained in:
Igor Markelov 2024-05-22 10:28:31 +00:00
commit 9916692ec1
241 changed files with 1241 additions and 658 deletions

View File

@ -22,6 +22,7 @@ Checks: [
'-bugprone-exception-escape', '-bugprone-exception-escape',
'-bugprone-forward-declaration-namespace', '-bugprone-forward-declaration-namespace',
'-bugprone-implicit-widening-of-multiplication-result', '-bugprone-implicit-widening-of-multiplication-result',
'-bugprone-multi-level-implicit-pointer-conversion',
'-bugprone-narrowing-conversions', '-bugprone-narrowing-conversions',
'-bugprone-not-null-terminated-result', '-bugprone-not-null-terminated-result',
'-bugprone-reserved-identifier', # useful but too slow, TODO retry when https://reviews.llvm.org/rG1c282052624f9d0bd273bde0b47b30c96699c6c7 is merged '-bugprone-reserved-identifier', # useful but too slow, TODO retry when https://reviews.llvm.org/rG1c282052624f9d0bd273bde0b47b30c96699c6c7 is merged
@ -98,6 +99,7 @@ Checks: [
'-modernize-use-nodiscard', '-modernize-use-nodiscard',
'-modernize-use-trailing-return-type', '-modernize-use-trailing-return-type',
'-performance-enum-size',
'-performance-inefficient-string-concatenation', '-performance-inefficient-string-concatenation',
'-performance-no-int-to-ptr', '-performance-no-int-to-ptr',
'-performance-avoid-endl', '-performance-avoid-endl',
@ -105,6 +107,7 @@ Checks: [
'-portability-simd-intrinsics', '-portability-simd-intrinsics',
'-readability-avoid-nested-conditional-operator',
'-readability-avoid-unconditional-preprocessor-if', '-readability-avoid-unconditional-preprocessor-if',
'-readability-braces-around-statements', '-readability-braces-around-statements',
'-readability-convert-member-functions-to-static', '-readability-convert-member-functions-to-static',
@ -118,6 +121,12 @@ Checks: [
'-readability-magic-numbers', '-readability-magic-numbers',
'-readability-named-parameter', '-readability-named-parameter',
'-readability-redundant-declaration', '-readability-redundant-declaration',
'-readability-redundant-inline-specifier',
'-readability-redundant-member-init', # Useful but triggers another problem. Imagine a struct S with multiple String members. Structs are often instantiated via designated
# initializer S s{.s1 = [...], .s2 = [...], [...]}. In this case, compiler warning `missing-field-initializers` requires to specify all members which are not in-struct
# initialized (example: s1 in struct S { String s1; String s2{};}; is not in-struct initialized, therefore it must be specified at instantiation time). As explicitly
# specifying all members is tedious for large structs, `missing-field-initializers` makes programmers initialize as many members as possible in-struct. Clang-tidy
# warning `readability-redundant-member-init` does the opposite thing, both are not compatible with each other.
'-readability-simplify-boolean-expr', '-readability-simplify-boolean-expr',
'-readability-suspicious-call-argument', '-readability-suspicious-call-argument',
'-readability-uppercase-literal-suffix', '-readability-uppercase-literal-suffix',
@ -125,17 +134,6 @@ Checks: [
'-zircon-*', '-zircon-*',
# These are new in clang-18, and we have to sort them out:
'-readability-avoid-nested-conditional-operator',
'-modernize-use-designated-initializers',
'-performance-enum-size',
'-readability-redundant-inline-specifier',
'-readability-redundant-member-init',
'-bugprone-crtp-constructor-accessibility',
'-bugprone-suspicious-stringview-data-usage',
'-bugprone-multi-level-implicit-pointer-conversion',
'-cert-err33-c',
# This is a good check, but clang-tidy crashes, see https://github.com/llvm/llvm-project/issues/91872 # This is a good check, but clang-tidy crashes, see https://github.com/llvm/llvm-project/issues/91872
'-modernize-use-constraints', '-modernize-use-constraints',
# https://github.com/abseil/abseil-cpp/issues/1667 # https://github.com/abseil/abseil-cpp/issues/1667

View File

@ -130,15 +130,21 @@ jobs:
with: with:
stage: Tests_2 stage: Tests_2
data: ${{ needs.RunConfig.outputs.data }} data: ${{ needs.RunConfig.outputs.data }}
# stage for jobs that do not prohibit merge
Tests_3:
needs: [RunConfig, Tests_1, Tests_2]
if: ${{ !failure() && !cancelled() && contains(fromJson(needs.RunConfig.outputs.data).stages_data.stages_to_do, 'Tests_3') }}
uses: ./.github/workflows/reusable_test_stage.yml
with:
stage: Tests_3
data: ${{ needs.RunConfig.outputs.data }}
################################# Reports ################################# ################################# Reports #################################
# Reports should by run even if Builds_1/2 fail, so put them separatly in wf (not in Tests_1/2) # Reports should by run even if Builds_1/2 fail, so put them separately in wf (not in Tests_1/2)
Builds_1_Report: Builds_1_Report:
# run report check for failed builds to indicate the CI error # run report check for failed builds to indicate the CI error
if: ${{ !cancelled() && contains(fromJson(needs.RunConfig.outputs.data).jobs_data.jobs_to_do, 'ClickHouse build check') }} if: ${{ !cancelled() && needs.StyleCheck.result == 'success' && contains(fromJson(needs.RunConfig.outputs.data).jobs_data.jobs_to_do, 'ClickHouse build check') }}
needs: needs: [RunConfig, StyleCheck, Builds_1]
- RunConfig
- Builds_1
uses: ./.github/workflows/reusable_test.yml uses: ./.github/workflows/reusable_test.yml
with: with:
test_name: ClickHouse build check test_name: ClickHouse build check
@ -146,25 +152,39 @@ jobs:
data: ${{ needs.RunConfig.outputs.data }} data: ${{ needs.RunConfig.outputs.data }}
Builds_2_Report: Builds_2_Report:
# run report check for failed builds to indicate the CI error # run report check for failed builds to indicate the CI error
if: ${{ !cancelled() && contains(fromJson(needs.RunConfig.outputs.data).jobs_data.jobs_to_do, 'ClickHouse special build check') }} if: ${{ !cancelled() && needs.StyleCheck.result == 'success' && contains(fromJson(needs.RunConfig.outputs.data).jobs_data.jobs_to_do, 'ClickHouse special build check') }}
needs: needs: [RunConfig, StyleCheck, Builds_2]
- RunConfig
- Builds_2
uses: ./.github/workflows/reusable_test.yml uses: ./.github/workflows/reusable_test.yml
with: with:
test_name: ClickHouse special build check test_name: ClickHouse special build check
runner_type: style-checker-aarch64 runner_type: style-checker-aarch64
data: ${{ needs.RunConfig.outputs.data }} data: ${{ needs.RunConfig.outputs.data }}
CheckReadyForMerge:
if: ${{ !cancelled() && needs.StyleCheck.result == 'success' }}
needs: [RunConfig, BuildDockers, StyleCheck, FastTest, Builds_1, Builds_2, Builds_1_Report, Builds_2_Report, Tests_1, Tests_2]
runs-on: [self-hosted, style-checker-aarch64]
steps:
- name: Check out repository code
uses: ClickHouse/checkout@v1
with:
filter: tree:0
- name: Check and set merge status
run: |
cd "$GITHUB_WORKSPACE/tests/ci"
python3 merge_pr.py --set-ci-status --wf-status ${{ contains(needs.*.result, 'failure') && 'failure' || 'success' }}
################################# Stage Final ################################# ################################# Stage Final #################################
# #
FinishCheck: FinishCheck:
if: ${{ !failure() && !cancelled() }} if: ${{ !failure() && !cancelled() }}
needs: [RunConfig, BuildDockers, StyleCheck, FastTest, Builds_1, Builds_2, Builds_1_Report, Builds_2_Report, Tests_1, Tests_2] needs: [RunConfig, BuildDockers, StyleCheck, FastTest, Builds_1, Builds_2, Builds_1_Report, Builds_2_Report, Tests_1, Tests_2, Tests_3]
runs-on: [self-hosted, style-checker] runs-on: [self-hosted, style-checker]
steps: steps:
- name: Check out repository code - name: Check out repository code
uses: ClickHouse/checkout@v1 uses: ClickHouse/checkout@v1
with:
filter: tree:0
- name: Finish label - name: Finish label
run: | run: |
cd "$GITHUB_WORKSPACE/tests/ci" cd "$GITHUB_WORKSPACE/tests/ci"

View File

@ -61,9 +61,11 @@ if (ENABLE_CHECK_HEAVY_BUILDS)
# set CPU time limit to 1000 seconds # set CPU time limit to 1000 seconds
set (RLIMIT_CPU 1000) set (RLIMIT_CPU 1000)
# Sanitizers are too heavy # Sanitizers are too heavy. Some architectures too.
if (SANITIZE OR SANITIZE_COVERAGE OR WITH_COVERAGE) if (SANITIZE OR SANITIZE_COVERAGE OR WITH_COVERAGE OR ARCH_RISCV64 OR ARCH_LOONGARCH64)
set (RLIMIT_DATA 10000000000) # 10G # Twice as large
set (RLIMIT_DATA 10000000000)
set (RLIMIT_AS 20000000000)
endif() endif()
# For some files currently building RISCV64 might be too slow. TODO: Improve compilation times per file # For some files currently building RISCV64 might be too slow. TODO: Improve compilation times per file

View File

@ -9,11 +9,18 @@
bool cgroupsV2Enabled() bool cgroupsV2Enabled()
{ {
#if defined(OS_LINUX) #if defined(OS_LINUX)
/// This file exists iff the host has cgroups v2 enabled. try
auto controllers_file = default_cgroups_mount / "cgroup.controllers"; {
if (!std::filesystem::exists(controllers_file)) /// This file exists iff the host has cgroups v2 enabled.
return false; auto controllers_file = default_cgroups_mount / "cgroup.controllers";
return true; if (!std::filesystem::exists(controllers_file))
return false;
return true;
}
catch (const std::filesystem::filesystem_error &) /// all "underlying OS API errors", typically: permission denied
{
return false; /// not logging the exception as most callers fall back to cgroups v1
}
#else #else
return false; return false;
#endif #endif

2
contrib/libunwind vendored

@ -1 +1 @@
Subproject commit 854538ce337d631b619010528adff22cd58f9dce Subproject commit d6a01c46327e56fd86beb8aaa31591fcd9a6b7df

View File

@ -160,10 +160,17 @@ function clone_submodules
git submodule sync git submodule sync
git submodule init git submodule init
# --jobs does not work as fast as real parallel running
printf '%s\0' "${SUBMODULES_TO_UPDATE[@]}" | \ # Network is unreliable
xargs --max-procs=100 --null --no-run-if-empty --max-args=1 \ for _ in {1..10}
git submodule update --depth 1 --single-branch do
# --jobs does not work as fast as real parallel running
printf '%s\0' "${SUBMODULES_TO_UPDATE[@]}" | \
xargs --max-procs=100 --null --no-run-if-empty --max-args=1 \
git submodule update --depth 1 --single-branch && break
sleep 1
done
git submodule foreach git reset --hard git submodule foreach git reset --hard
git submodule foreach git checkout @ -f git submodule foreach git checkout @ -f
git submodule foreach git clean -xfd git submodule foreach git clean -xfd

View File

@ -22,7 +22,7 @@ description: In order to effectively mitigate possible human errors, you should
TEMPORARY TABLE table_name [AS table_name_in_backup] | TEMPORARY TABLE table_name [AS table_name_in_backup] |
VIEW view_name [AS view_name_in_backup] VIEW view_name [AS view_name_in_backup]
ALL TEMPORARY TABLES [EXCEPT ...] | ALL TEMPORARY TABLES [EXCEPT ...] |
ALL DATABASES [EXCEPT ...] } [,...] ALL [EXCEPT ...] } [,...]
[ON CLUSTER 'cluster_name'] [ON CLUSTER 'cluster_name']
TO|FROM File('<path>/<filename>') | Disk('<disk_name>', '<path>/') | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>') TO|FROM File('<path>/<filename>') | Disk('<disk_name>', '<path>/') | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')
[SETTINGS base_backup = File('<path>/<filename>') | Disk(...) | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')] [SETTINGS base_backup = File('<path>/<filename>') | Disk(...) | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')]

View File

@ -7,27 +7,27 @@ title: "External Disks for Storing Data"
Data, processed in ClickHouse, is usually stored in the local file system — on the same machine with the ClickHouse server. That requires large-capacity disks, which can be expensive enough. To avoid that you can store the data remotely. Various storages are supported: Data, processed in ClickHouse, is usually stored in the local file system — on the same machine with the ClickHouse server. That requires large-capacity disks, which can be expensive enough. To avoid that you can store the data remotely. Various storages are supported:
1. [Amazon S3](https://aws.amazon.com/s3/) object storage. 1. [Amazon S3](https://aws.amazon.com/s3/) object storage.
2. The Hadoop Distributed File System ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)) 2. [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs).
3. [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs). 3. Unsupported: The Hadoop Distributed File System ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html))
:::note ClickHouse also has support for external table engines, which are different from external storage option described on this page as they allow to read data stored in some general file format (like Parquet), while on this page we are describing storage configuration for ClickHouse `MergeTree` family or `Log` family tables. :::note ClickHouse also has support for external table engines, which are different from external storage option described on this page as they allow to read data stored in some general file format (like Parquet), while on this page we are describing storage configuration for ClickHouse `MergeTree` family or `Log` family tables.
1. to work with data stored on `Amazon S3` disks, use [S3](/docs/en/engines/table-engines/integrations/s3.md) table engine. 1. to work with data stored on `Amazon S3` disks, use [S3](/docs/en/engines/table-engines/integrations/s3.md) table engine.
2. to work with data in the Hadoop Distributed File System — [HDFS](/docs/en/engines/table-engines/integrations/hdfs.md) table engine. 2. to work with data stored in Azure Blob Storage use [AzureBlobStorage](/docs/en/engines/table-engines/integrations/azureBlobStorage.md) table engine.
3. to work with data stored in Azure Blob Storage use [AzureBlobStorage](/docs/en/engines/table-engines/integrations/azureBlobStorage.md) table engine. 3. Unsupported: to work with data in the Hadoop Distributed File System — [HDFS](/docs/en/engines/table-engines/integrations/hdfs.md) table engine.
::: :::
## Configuring external storage {#configuring-external-storage} ## Configuring external storage {#configuring-external-storage}
[MergeTree](/docs/en/engines/table-engines/mergetree-family/mergetree.md) and [Log](/docs/en/engines/table-engines/log-family/log.md) family table engines can store data to `S3`, `AzureBlobStorage`, `HDFS` using a disk with types `s3`, `azure_blob_storage`, `hdfs` accordingly. [MergeTree](/docs/en/engines/table-engines/mergetree-family/mergetree.md) and [Log](/docs/en/engines/table-engines/log-family/log.md) family table engines can store data to `S3`, `AzureBlobStorage`, `HDFS` (unsupported) using a disk with types `s3`, `azure_blob_storage`, `hdfs` (unsupported) accordingly.
Disk configuration requires: Disk configuration requires:
1. `type` section, equal to one of `s3`, `azure_blob_storage`, `hdfs`, `local_blob_storage`, `web`. 1. `type` section, equal to one of `s3`, `azure_blob_storage`, `hdfs` (unsupported), `local_blob_storage`, `web`.
2. Configuration of a specific external storage type. 2. Configuration of a specific external storage type.
Starting from 24.1 clickhouse version, it is possible to use a new configuration option. Starting from 24.1 clickhouse version, it is possible to use a new configuration option.
It requires to specify: It requires to specify:
1. `type` equal to `object_storage` 1. `type` equal to `object_storage`
2. `object_storage_type`, equal to one of `s3`, `azure_blob_storage` (or just `azure` from `24.3`), `hdfs`, `local_blob_storage` (or just `local` from `24.3`), `web`. 2. `object_storage_type`, equal to one of `s3`, `azure_blob_storage` (or just `azure` from `24.3`), `hdfs` (unsupported), `local_blob_storage` (or just `local` from `24.3`), `web`.
Optionally, `metadata_type` can be specified (it is equal to `local` by default), but it can also be set to `plain`, `web` and, starting from `24.4`, `plain_rewritable`. Optionally, `metadata_type` can be specified (it is equal to `local` by default), but it can also be set to `plain`, `web` and, starting from `24.4`, `plain_rewritable`.
Usage of `plain` metadata type is described in [plain storage section](/docs/en/operations/storing-data.md/#storing-data-on-webserver), `web` metadata type can be used only with `web` object storage type, `local` metadata type stores metadata files locally (each metadata files contains mapping to files in object storage and some additional meta information about them). Usage of `plain` metadata type is described in [plain storage section](/docs/en/operations/storing-data.md/#storing-data-on-webserver), `web` metadata type can be used only with `web` object storage type, `local` metadata type stores metadata files locally (each metadata files contains mapping to files in object storage and some additional meta information about them).
@ -328,7 +328,7 @@ Configuration:
</s3_plain> </s3_plain>
``` ```
Starting from `24.1` it is possible configure any object storage disk (`s3`, `azure`, `hdfs`, `local`) using `plain` metadata type. Starting from `24.1` it is possible configure any object storage disk (`s3`, `azure`, `hdfs` (unsupported), `local`) using `plain` metadata type.
Configuration: Configuration:
``` xml ``` xml
@ -428,12 +428,14 @@ Examples of working configurations can be found in integration tests directory (
Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use. Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use.
::: :::
## Using HDFS storage {#hdfs-storage} ## Using HDFS storage (Unsupported)
In this sample configuration: In this sample configuration:
- the disk is of type `hdfs` - the disk is of type `hdfs` (unsupported)
- the data is hosted at `hdfs://hdfs1:9000/clickhouse/` - the data is hosted at `hdfs://hdfs1:9000/clickhouse/`
By the way, HDFS is unsupported and therefore there might be issues when using it. Feel free to make a pull request with the fix if any issue arises.
```xml ```xml
<clickhouse> <clickhouse>
<storage_configuration> <storage_configuration>
@ -464,9 +466,11 @@ In this sample configuration:
</clickhouse> </clickhouse>
``` ```
Keep in mind that HDFS may not work in corner cases.
### Using Data Encryption {#encrypted-virtual-file-system} ### Using Data Encryption {#encrypted-virtual-file-system}
You can encrypt the data stored on [S3](/docs/en/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3), or [HDFS](#configuring-hdfs) external disks, or on a local disk. To turn on the encryption mode, in the configuration file you must define a disk with the type `encrypted` and choose a disk on which the data will be saved. An `encrypted` disk ciphers all written files on the fly, and when you read files from an `encrypted` disk it deciphers them automatically. So you can work with an `encrypted` disk like with a normal one. You can encrypt the data stored on [S3](/docs/en/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3), or [HDFS](#configuring-hdfs) (unsupported) external disks, or on a local disk. To turn on the encryption mode, in the configuration file you must define a disk with the type `encrypted` and choose a disk on which the data will be saved. An `encrypted` disk ciphers all written files on the fly, and when you read files from an `encrypted` disk it deciphers them automatically. So you can work with an `encrypted` disk like with a normal one.
Example of disk configuration: Example of disk configuration:
@ -529,7 +533,7 @@ Example of disk configuration:
It is possible to configure local cache over disks in storage configuration starting from version 22.3. It is possible to configure local cache over disks in storage configuration starting from version 22.3.
For versions 22.3 - 22.7 cache is supported only for `s3` disk type. For versions >= 22.8 cache is supported for any disk type: S3, Azure, Local, Encrypted, etc. For versions 22.3 - 22.7 cache is supported only for `s3` disk type. For versions >= 22.8 cache is supported for any disk type: S3, Azure, Local, Encrypted, etc.
For versions >= 23.5 cache is supported only for remote disk types: S3, Azure, HDFS. For versions >= 23.5 cache is supported only for remote disk types: S3, Azure, HDFS (unsupported).
Cache uses `LRU` cache policy. Cache uses `LRU` cache policy.
@ -971,7 +975,7 @@ Use [http_max_single_read_retries](/docs/en/operations/settings/settings.md/#htt
### Zero-copy Replication (not ready for production) {#zero-copy} ### Zero-copy Replication (not ready for production) {#zero-copy}
Zero-copy replication is possible, but not recommended, with `S3` and `HDFS` disks. Zero-copy replication means that if the data is stored remotely on several machines and needs to be synchronized, then only the metadata is replicated (paths to the data parts), but not the data itself. Zero-copy replication is possible, but not recommended, with `S3` and `HDFS` (unsupported) disks. Zero-copy replication means that if the data is stored remotely on several machines and needs to be synchronized, then only the metadata is replicated (paths to the data parts), but not the data itself.
:::note Zero-copy replication is not ready for production :::note Zero-copy replication is not ready for production
Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use. Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use.

View File

@ -0,0 +1,45 @@
---
slug: /en/sql-reference/aggregate-functions/reference/analysis_of_variance
sidebar_position: 6
---
# analysisOfVariance
Provides a statistical test for one-way analysis of variance (ANOVA test). It is a test over several groups of normally distributed observations to find out whether all groups have the same mean or not.
**Syntax**
```sql
analysisOfVariance(val, group_no)
```
Aliases: `anova`
**Parameters**
- `val`: value.
- `group_no` : group number that `val` belongs to.
:::note
Groups are enumerated starting from 0 and there should be at least two groups to perform a test.
There should be at least one group with the number of observations greater than one.
:::
**Returned value**
- `(f_statistic, p_value)`. [Tuple](../../data-types/tuple.md)([Float64](../../data-types/float.md), [Float64](../../data-types/float.md)).
**Example**
Query:
```sql
SELECT analysisOfVariance(number, number % 2) FROM numbers(1048575);
```
Result:
```response
┌─analysisOfVariance(number, modulo(number, 2))─┐
│ (0,1) │
└───────────────────────────────────────────────┘
```

View File

@ -37,6 +37,7 @@ Standard aggregate functions:
ClickHouse-specific aggregate functions: ClickHouse-specific aggregate functions:
- [analysisOfVariance](/docs/en/sql-reference/aggregate-functions/reference/analysis_of_variance.md)
- [any](/docs/en/sql-reference/aggregate-functions/reference/any_respect_nulls.md) - [any](/docs/en/sql-reference/aggregate-functions/reference/any_respect_nulls.md)
- [anyHeavy](/docs/en/sql-reference/aggregate-functions/reference/anyheavy.md) - [anyHeavy](/docs/en/sql-reference/aggregate-functions/reference/anyheavy.md)
- [anyLast](/docs/en/sql-reference/aggregate-functions/reference/anylast.md) - [anyLast](/docs/en/sql-reference/aggregate-functions/reference/anylast.md)

View File

@ -998,17 +998,170 @@ SELECT version()
Returns the build ID generated by a compiler for the running ClickHouse server binary. Returns the build ID generated by a compiler for the running ClickHouse server binary.
If executed in the context of a distributed table, this function generates a normal column with values relevant to each shard. Otherwise it produces a constant value. If executed in the context of a distributed table, this function generates a normal column with values relevant to each shard. Otherwise it produces a constant value.
## blockNumber() ## blockNumber
Returns the sequence number of the data block where the row is located. Returns a monotonically increasing sequence number of the [block](../../development/architecture.md#block) containing the row.
The returned block number is updated on a best-effort basis, i.e. it may not be fully accurate.
## rowNumberInBlock() {#rowNumberInBlock} **Syntax**
```sql
blockNumber()
```
**Returned value**
- Sequence number of the data block where the row is located. [UInt64](../data-types/int-uint.md).
**Example**
Query:
```sql
SELECT blockNumber()
FROM
(
SELECT *
FROM system.numbers
LIMIT 10
) SETTINGS max_block_size = 2
```
Result:
```response
┌─blockNumber()─┐
│ 7 │
│ 7 │
└───────────────┘
┌─blockNumber()─┐
│ 8 │
│ 8 │
└───────────────┘
┌─blockNumber()─┐
│ 9 │
│ 9 │
└───────────────┘
┌─blockNumber()─┐
│ 10 │
│ 10 │
└───────────────┘
┌─blockNumber()─┐
│ 11 │
│ 11 │
└───────────────┘
```
## rowNumberInBlock {#rowNumberInBlock}
Returns for each [block](../../development/architecture.md#block) processed by `rowNumberInBlock` the number of the current row.
The returned number starts for each block at 0.
**Syntax**
```sql
rowNumberInBlock()
```
**Returned value**
- Ordinal number of the row in the data block starting from 0. [UInt64](../data-types/int-uint.md).
**Example**
Query:
```sql
SELECT rowNumberInBlock()
FROM
(
SELECT *
FROM system.numbers_mt
LIMIT 10
) SETTINGS max_block_size = 2
```
Result:
```response
┌─rowNumberInBlock()─┐
│ 0 │
│ 1 │
└────────────────────┘
┌─rowNumberInBlock()─┐
│ 0 │
│ 1 │
└────────────────────┘
┌─rowNumberInBlock()─┐
│ 0 │
│ 1 │
└────────────────────┘
┌─rowNumberInBlock()─┐
│ 0 │
│ 1 │
└────────────────────┘
┌─rowNumberInBlock()─┐
│ 0 │
│ 1 │
└────────────────────┘
```
## rowNumberInAllBlocks
Returns a unique row number for each row processed by `rowNumberInAllBlocks`. The returned numbers start at 0.
**Syntax**
```sql
rowNumberInAllBlocks()
```
**Returned value**
- Ordinal number of the row in the data block starting from 0. [UInt64](../data-types/int-uint.md).
**Example**
Query:
```sql
SELECT rowNumberInAllBlocks()
FROM
(
SELECT *
FROM system.numbers_mt
LIMIT 10
)
SETTINGS max_block_size = 2
```
Result:
```response
┌─rowNumberInAllBlocks()─┐
│ 0 │
│ 1 │
└────────────────────────┘
┌─rowNumberInAllBlocks()─┐
│ 4 │
│ 5 │
└────────────────────────┘
┌─rowNumberInAllBlocks()─┐
│ 2 │
│ 3 │
└────────────────────────┘
┌─rowNumberInAllBlocks()─┐
│ 6 │
│ 7 │
└────────────────────────┘
┌─rowNumberInAllBlocks()─┐
│ 8 │
│ 9 │
└────────────────────────┘
```
Returns the ordinal number of the row in the data block. Different data blocks are always recalculated.
## rowNumberInAllBlocks()
Returns the ordinal number of the row in the data block. This function only considers the affected data blocks.
## neighbor ## neighbor

View File

@ -162,7 +162,7 @@ if (ARCH_AMD64 AND OS_LINUX AND NOT OS_ANDROID)
set (HARMFUL_LIB harmful) set (HARMFUL_LIB harmful)
endif () endif ()
target_link_libraries (clickhouse PRIVATE clickhouse_common_io string_utils ${HARMFUL_LIB}) target_link_libraries (clickhouse PRIVATE clickhouse_common_io ${HARMFUL_LIB})
target_include_directories (clickhouse PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories (clickhouse PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
if (ENABLE_CLICKHOUSE_KEEPER) if (ENABLE_CLICKHOUSE_KEEPER)

View File

@ -10,7 +10,6 @@ set (CLICKHOUSE_CLIENT_LINK
clickhouse_common_io clickhouse_common_io
clickhouse_functions clickhouse_functions
clickhouse_parsers clickhouse_parsers
string_utils
) )
if (TARGET ch_rust::skim) if (TARGET ch_rust::skim)

View File

@ -15,7 +15,7 @@
#include <Parsers/obfuscateQueries.h> #include <Parsers/obfuscateQueries.h>
#include <Parsers/parseQuery.h> #include <Parsers/parseQuery.h>
#include <Common/ErrorCodes.h> #include <Common/ErrorCodes.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/TerminalSize.h> #include <Common/TerminalSize.h>
#include <Core/BaseSettingsProgramOptions.h> #include <Core/BaseSettingsProgramOptions.h>

View File

@ -14,7 +14,7 @@
#include <Common/TerminalSize.h> #include <Common/TerminalSize.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/SipHash.h> #include <Common/SipHash.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/ShellCommand.h> #include <Common/ShellCommand.h>
#include <Common/re2.h> #include <Common/re2.h>
#include <base/find_symbols.h> #include <base/find_symbols.h>

View File

@ -1,4 +1,4 @@
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include "config_tools.h" #include "config_tools.h"

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Core/Block.h> #include <Core/Block.h>
#include <base/range.h> #include <base/range.h>

View File

@ -15,7 +15,7 @@
#include "config_tools.h" #include "config_tools.h"
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/getHashOfLoadedBinary.h> #include <Common/getHashOfLoadedBinary.h>
#include <Common/IO.h> #include <Common/IO.h>

View File

@ -19,7 +19,7 @@
#include <Processors/LimitTransform.h> #include <Processors/LimitTransform.h>
#include <Common/SipHash.h> #include <Common/SipHash.h>
#include <Common/UTF8Helpers.h> #include <Common/UTF8Helpers.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/HashTable/HashMap.h> #include <Common/HashTable/HashMap.h>
#include <Common/typeid_cast.h> #include <Common/typeid_cast.h>
#include <Common/assert_cast.h> #include <Common/assert_cast.h>

View File

@ -4,7 +4,7 @@
#include <Poco/String.h> #include <Poco/String.h>
#include <base/find_symbols.h> #include <base/find_symbols.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include "validateODBCConnectionString.h" #include "validateODBCConnectionString.h"

View File

@ -13,7 +13,6 @@ set (CLICKHOUSE_SERVER_LINK
clickhouse_parsers clickhouse_parsers
clickhouse_storages_system clickhouse_storages_system
clickhouse_table_functions clickhouse_table_functions
string_utils
${LINK_RESOURCE_LIB} ${LINK_RESOURCE_LIB}

View File

@ -1,5 +1,5 @@
#include <Access/User.h> #include <Access/User.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Core/Protocol.h> #include <Core/Protocol.h>
#include <base/insertAtEnd.h> #include <base/insertAtEnd.h>

View File

@ -10,7 +10,7 @@
#include <Dictionaries/IDictionary.h> #include <Dictionaries/IDictionary.h>
#include <Common/Config/ConfigReloader.h> #include <Common/Config/ConfigReloader.h>
#include <Common/SSHWrapper.h> #include <Common/SSHWrapper.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/quoteString.h> #include <Common/quoteString.h>
#include <Common/transformEndianness.h> #include <Common/transformEndianness.h>
#include <Core/Settings.h> #include <Core/Settings.h>

View File

@ -1,6 +1,6 @@
#include "AggregateFunctionCombinatorFactory.h" #include "AggregateFunctionCombinatorFactory.h"
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
namespace DB namespace DB
{ {

View File

@ -42,7 +42,7 @@ private:
return; return;
const auto & storage = table_node ? table_node->getStorage() : table_function_node->getStorage(); const auto & storage = table_node ? table_node->getStorage() : table_function_node->getStorage();
bool is_final_supported = storage && storage->supportsFinal(); bool is_final_supported = storage && !storage->isRemote() && storage->supportsFinal();
if (!is_final_supported) if (!is_final_supported)
return; return;

View File

@ -192,7 +192,7 @@ void QueryTreePassManager::run(QueryTreeNodePtr query_tree_node)
void QueryTreePassManager::runOnlyResolve(QueryTreeNodePtr query_tree_node) void QueryTreePassManager::runOnlyResolve(QueryTreeNodePtr query_tree_node)
{ {
// Run only QueryAnalysisPass and GroupingFunctionsResolvePass passes. // Run only QueryAnalysisPass and GroupingFunctionsResolvePass passes.
run(query_tree_node, 2); run(query_tree_node, 3);
} }
void QueryTreePassManager::run(QueryTreeNodePtr query_tree_node, size_t up_to_pass_index) void QueryTreePassManager::run(QueryTreeNodePtr query_tree_node, size_t up_to_pass_index)
@ -249,6 +249,7 @@ void addQueryTreePasses(QueryTreePassManager & manager, bool only_analyze)
{ {
manager.addPass(std::make_unique<QueryAnalysisPass>(only_analyze)); manager.addPass(std::make_unique<QueryAnalysisPass>(only_analyze));
manager.addPass(std::make_unique<GroupingFunctionsResolvePass>()); manager.addPass(std::make_unique<GroupingFunctionsResolvePass>());
manager.addPass(std::make_unique<AutoFinalOnQueryPass>());
manager.addPass(std::make_unique<RemoveUnusedProjectionColumnsPass>()); manager.addPass(std::make_unique<RemoveUnusedProjectionColumnsPass>());
manager.addPass(std::make_unique<FunctionToSubcolumnsPass>()); manager.addPass(std::make_unique<FunctionToSubcolumnsPass>());
@ -294,7 +295,6 @@ void addQueryTreePasses(QueryTreePassManager & manager, bool only_analyze)
manager.addPass(std::make_unique<LogicalExpressionOptimizerPass>()); manager.addPass(std::make_unique<LogicalExpressionOptimizerPass>());
manager.addPass(std::make_unique<AutoFinalOnQueryPass>());
manager.addPass(std::make_unique<CrossToInnerJoinPass>()); manager.addPass(std::make_unique<CrossToInnerJoinPass>());
manager.addPass(std::make_unique<ShardNumColumnToFunctionPass>()); manager.addPass(std::make_unique<ShardNumColumnToFunctionPass>());

View File

@ -36,7 +36,7 @@ BackupReaderAzureBlobStorage::BackupReaderAzureBlobStorage(
const WriteSettings & write_settings_, const WriteSettings & write_settings_,
const ContextPtr & context_) const ContextPtr & context_)
: BackupReaderDefault(read_settings_, write_settings_, getLogger("BackupReaderAzureBlobStorage")) : BackupReaderDefault(read_settings_, write_settings_, getLogger("BackupReaderAzureBlobStorage"))
, data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::Azure, MetadataStorageType::None, configuration_.getConnectionURLWithContainer(), false, false} , data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::Azure, MetadataStorageType::None, configuration_.getConnectionURL().toString(), false, false}
, configuration(configuration_) , configuration(configuration_)
{ {
auto client_ptr = StorageAzureBlob::createClient(configuration, /* is_read_only */ false); auto client_ptr = StorageAzureBlob::createClient(configuration, /* is_read_only */ false);
@ -47,7 +47,7 @@ BackupReaderAzureBlobStorage::BackupReaderAzureBlobStorage(
std::move(client_ptr), std::move(client_ptr),
StorageAzureBlob::createSettings(context_), StorageAzureBlob::createSettings(context_),
configuration.container, configuration.container,
configuration.getConnectionURLWithContainer()); configuration.getConnectionURL().toString());
client = object_storage->getAzureBlobStorageClient(); client = object_storage->getAzureBlobStorageClient();
auto settings_copy = *object_storage->getSettings(); auto settings_copy = *object_storage->getSettings();
@ -128,7 +128,7 @@ BackupWriterAzureBlobStorage::BackupWriterAzureBlobStorage(
const ContextPtr & context_, const ContextPtr & context_,
bool attempt_to_create_container) bool attempt_to_create_container)
: BackupWriterDefault(read_settings_, write_settings_, getLogger("BackupWriterAzureBlobStorage")) : BackupWriterDefault(read_settings_, write_settings_, getLogger("BackupWriterAzureBlobStorage"))
, data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::Azure, MetadataStorageType::None, configuration_.getConnectionURLWithContainer(), false, false} , data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::Azure, MetadataStorageType::None, configuration_.getConnectionURL().toString(), false, false}
, configuration(configuration_) , configuration(configuration_)
{ {
auto client_ptr = StorageAzureBlob::createClient(configuration, /* is_read_only */ false, attempt_to_create_container); auto client_ptr = StorageAzureBlob::createClient(configuration, /* is_read_only */ false, attempt_to_create_container);
@ -138,7 +138,7 @@ BackupWriterAzureBlobStorage::BackupWriterAzureBlobStorage(
std::move(client_ptr), std::move(client_ptr),
StorageAzureBlob::createSettings(context_), StorageAzureBlob::createSettings(context_),
configuration_.container, configuration_.container,
configuration.getConnectionURLWithContainer()); configuration_.getConnectionURL().toString());
client = object_storage->getAzureBlobStorageClient(); client = object_storage->getAzureBlobStorageClient();
auto settings_copy = *object_storage->getSettings(); auto settings_copy = *object_storage->getSettings();
settings_copy.use_native_copy = allow_azure_native_copy; settings_copy.use_native_copy = allow_azure_native_copy;

View File

@ -4,7 +4,7 @@
#include <Backups/BackupIO.h> #include <Backups/BackupIO.h>
#include <Backups/IBackupEntry.h> #include <Backups/IBackupEntry.h>
#include <Common/ProfileEvents.h> #include <Common/ProfileEvents.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <base/hex.h> #include <base/hex.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <Common/quoteString.h> #include <Common/quoteString.h>

View File

@ -6,7 +6,7 @@
#include <Common/ErrorHandlers.h> #include <Common/ErrorHandlers.h>
#include <Common/SensitiveDataMasker.h> #include <Common/SensitiveDataMasker.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <Formats/registerFormats.h> #include <Formats/registerFormats.h>
#include <IO/ReadHelpers.h> #include <IO/ReadHelpers.h>

View File

@ -307,7 +307,6 @@ endif()
target_link_libraries (clickhouse_common_io target_link_libraries (clickhouse_common_io
PRIVATE PRIVATE
string_utils
widechar_width widechar_width
${LINK_LIBRARIES_ONLY_ON_X86_64} ${LINK_LIBRARIES_ONLY_ON_X86_64}
PUBLIC PUBLIC
@ -320,7 +319,6 @@ target_link_libraries (clickhouse_common_io
target_link_libraries (clickhouse_compression target_link_libraries (clickhouse_compression
PUBLIC PUBLIC
string_utils
pcg_random pcg_random
clickhouse_parsers clickhouse_parsers
PRIVATE PRIVATE
@ -410,7 +408,6 @@ dbms_target_link_libraries (
clickhouse_parsers clickhouse_parsers
ch_contrib::lz4 ch_contrib::lz4
Poco::JSON Poco::JSON
string_utils
PUBLIC PUBLIC
boost::system boost::system
clickhouse_common_io clickhouse_common_io
@ -645,7 +642,6 @@ if (ENABLE_TESTS)
dbms dbms
clickhouse_common_config clickhouse_common_config
clickhouse_common_zookeeper clickhouse_common_zookeeper
string_utils
hilite_comparator) hilite_comparator)
if (TARGET ch_contrib::simdjson) if (TARGET ch_contrib::simdjson)

View File

@ -18,7 +18,7 @@
#include <Common/typeid_cast.h> #include <Common/typeid_cast.h>
#include <Common/TerminalSize.h> #include <Common/TerminalSize.h>
#include <Common/clearPasswordFromCommandLine.h> #include <Common/clearPasswordFromCommandLine.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/filesystemHelpers.h> #include <Common/filesystemHelpers.h>
#include <Common/NetException.h> #include <Common/NetException.h>
#include <Columns/ColumnString.h> #include <Columns/ColumnString.h>

View File

@ -20,7 +20,7 @@
#include <Common/NetException.h> #include <Common/NetException.h>
#include <Common/CurrentMetrics.h> #include <Common/CurrentMetrics.h>
#include <Common/DNSResolver.h> #include <Common/DNSResolver.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/OpenSSLHelpers.h> #include <Common/OpenSSLHelpers.h>
#include <Common/randomSeed.h> #include <Common/randomSeed.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>

View File

@ -1,5 +1,3 @@
add_subdirectory(StringUtils)
if (ENABLE_BENCHMARKS) if (ENABLE_BENCHMARKS)
add_subdirectory(benchmarks) add_subdirectory(benchmarks)
endif() endif()

View File

@ -13,8 +13,6 @@ target_link_libraries(clickhouse_common_config
clickhouse_common_zookeeper clickhouse_common_zookeeper
common common
Poco::XML Poco::XML
PRIVATE
string_utils
) )
add_library(clickhouse_common_config_no_zookeeper_log ${SRCS}) add_library(clickhouse_common_config_no_zookeeper_log ${SRCS})
@ -23,8 +21,6 @@ target_link_libraries(clickhouse_common_config_no_zookeeper_log
clickhouse_common_zookeeper_no_log clickhouse_common_zookeeper_no_log
common common
Poco::XML Poco::XML
PRIVATE
string_utils
) )
if (TARGET ch_contrib::yaml_cpp) if (TARGET ch_contrib::yaml_cpp)

View File

@ -18,7 +18,7 @@
#include <Poco/NumberParser.h> #include <Poco/NumberParser.h>
#include <Common/ZooKeeper/ZooKeeperNodeCache.h> #include <Common/ZooKeeper/ZooKeeperNodeCache.h>
#include <Common/ZooKeeper/KeeperException.h> #include <Common/ZooKeeper/KeeperException.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/XMLUtils.h> #include <Common/XMLUtils.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>

View File

@ -12,7 +12,7 @@
#include <Common/Arena.h> #include <Common/Arena.h>
#include <Common/HashTable/HashMap.h> #include <Common/HashTable/HashMap.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <IO/ReadBufferFromFile.h> #include <IO/ReadBufferFromFile.h>
#include <IO/ReadBufferFromString.h> #include <IO/ReadBufferFromString.h>
#include <IO/ReadHelpers.h> #include <IO/ReadHelpers.h>

View File

@ -1,5 +1,5 @@
#include <Common/HTTPHeaderFilter.h> #include <Common/HTTPHeaderFilter.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/re2.h> #include <Common/re2.h>

View File

@ -360,6 +360,7 @@ The server successfully detected this situation and will download merged part fr
M(QueryProfilerSignalOverruns, "Number of times we drop processing of a query profiler signal due to overrun plus the number of signals that OS has not delivered due to overrun.") \ M(QueryProfilerSignalOverruns, "Number of times we drop processing of a query profiler signal due to overrun plus the number of signals that OS has not delivered due to overrun.") \
M(QueryProfilerConcurrencyOverruns, "Number of times we drop processing of a query profiler signal due to too many concurrent query profilers in other threads, which may indicate overload.") \ M(QueryProfilerConcurrencyOverruns, "Number of times we drop processing of a query profiler signal due to too many concurrent query profilers in other threads, which may indicate overload.") \
M(QueryProfilerRuns, "Number of times QueryProfiler had been run.") \ M(QueryProfilerRuns, "Number of times QueryProfiler had been run.") \
M(QueryProfilerErrors, "Invalid memory accesses during asynchronous stack unwinding.") \
\ \
M(CreatedLogEntryForMerge, "Successfully created log entry to merge parts in ReplicatedMergeTree.") \ M(CreatedLogEntryForMerge, "Successfully created log entry to merge parts in ReplicatedMergeTree.") \
M(NotCreatedLogEntryForMerge, "Log entry to merge parts in ReplicatedMergeTree is not created due to concurrent log update by another replica.") \ M(NotCreatedLogEntryForMerge, "Log entry to merge parts in ReplicatedMergeTree is not created due to concurrent log update by another replica.") \

View File

@ -4,7 +4,7 @@
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/ProxyListConfigurationResolver.h> #include <Common/ProxyListConfigurationResolver.h>
#include <Common/RemoteProxyConfigurationResolver.h> #include <Common/RemoteProxyConfigurationResolver.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
namespace DB namespace DB

View File

@ -1,6 +1,6 @@
#include <Common/ProxyListConfigurationResolver.h> #include <Common/ProxyListConfigurationResolver.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <Poco/URI.h> #include <Poco/URI.h>

View File

@ -12,7 +12,6 @@
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <Common/thread_local_rng.h> #include <Common/thread_local_rng.h>
#include <random>
namespace CurrentMetrics namespace CurrentMetrics
{ {
@ -25,6 +24,7 @@ namespace ProfileEvents
extern const Event QueryProfilerSignalOverruns; extern const Event QueryProfilerSignalOverruns;
extern const Event QueryProfilerConcurrencyOverruns; extern const Event QueryProfilerConcurrencyOverruns;
extern const Event QueryProfilerRuns; extern const Event QueryProfilerRuns;
extern const Event QueryProfilerErrors;
} }
namespace DB namespace DB
@ -84,11 +84,29 @@ namespace
#endif #endif
const auto signal_context = *reinterpret_cast<ucontext_t *>(context); const auto signal_context = *reinterpret_cast<ucontext_t *>(context);
const StackTrace stack_trace(signal_context); std::optional<StackTrace> stack_trace;
#if defined(SANITIZER)
constexpr bool sanitizer = true;
#else
constexpr bool sanitizer = false;
#endif
asynchronous_stack_unwinding = true;
if (sanitizer || 0 == sigsetjmp(asynchronous_stack_unwinding_signal_jump_buffer, 1))
{
stack_trace.emplace(signal_context);
}
else
{
ProfileEvents::incrementNoTrace(ProfileEvents::QueryProfilerErrors);
}
asynchronous_stack_unwinding = false;
if (stack_trace)
TraceSender::send(trace_type, *stack_trace, {});
TraceSender::send(trace_type, stack_trace, {});
ProfileEvents::incrementNoTrace(ProfileEvents::QueryProfilerRuns); ProfileEvents::incrementNoTrace(ProfileEvents::QueryProfilerRuns);
errno = saved_errno; errno = saved_errno;
} }

View File

@ -1,7 +1,7 @@
#include <Poco/URI.h> #include <Poco/URI.h>
#include <Poco/Util/AbstractConfiguration.h> #include <Poco/Util/AbstractConfiguration.h>
#include <Common/RemoteHostFilter.h> #include <Common/RemoteHostFilter.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/re2.h> #include <Common/re2.h>
#include <IO/WriteHelpers.h> #include <IO/WriteHelpers.h>

View File

@ -5,7 +5,7 @@
#include <Common/Scheduler/ISchedulerQueue.h> #include <Common/Scheduler/ISchedulerQueue.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <map> #include <map>
#include <tuple> #include <tuple>

View File

@ -10,7 +10,7 @@
#include <Common/re2.h> #include <Common/re2.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/ProfileEvents.h> #include <Common/ProfileEvents.h>
#ifndef NDEBUG #ifndef NDEBUG

View File

@ -560,3 +560,7 @@ void StackTrace::dropCache()
std::lock_guard lock{stacktrace_cache_mutex}; std::lock_guard lock{stacktrace_cache_mutex};
cacheInstance().clear(); cacheInstance().clear();
} }
thread_local bool asynchronous_stack_unwinding = false;
thread_local sigjmp_buf asynchronous_stack_unwinding_signal_jump_buffer;

View File

@ -8,6 +8,7 @@
#include <optional> #include <optional>
#include <functional> #include <functional>
#include <csignal> #include <csignal>
#include <csetjmp>
#ifdef OS_DARWIN #ifdef OS_DARWIN
// ucontext is not available without _XOPEN_SOURCE // ucontext is not available without _XOPEN_SOURCE
@ -87,3 +88,8 @@ protected:
}; };
std::string signalToErrorMessage(int sig, const siginfo_t & info, const ucontext_t & context); std::string signalToErrorMessage(int sig, const siginfo_t & info, const ucontext_t & context);
/// Special handling for errors during asynchronous stack unwinding,
/// Which is used in Query Profiler
extern thread_local bool asynchronous_stack_unwinding;
extern thread_local sigjmp_buf asynchronous_stack_unwinding_signal_jump_buffer;

View File

@ -2,7 +2,7 @@
#include <base/getPageSize.h> #include <base/getPageSize.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/UTF8Helpers.h> #include <Common/UTF8Helpers.h>
#include <Core/Defines.h> #include <Core/Defines.h>
#include <Poco/Unicode.h> #include <Poco/Unicode.h>

View File

@ -0,0 +1,87 @@
#include <Common/StringUtils.h>
#include <Common/TargetSpecific.h>
#if USE_MULTITARGET_CODE
#include <immintrin.h>
#endif
namespace impl
{
bool startsWith(const std::string & s, const char * prefix, size_t prefix_size)
{
return s.size() >= prefix_size && 0 == memcmp(s.data(), prefix, prefix_size);
}
bool endsWith(const std::string & s, const char * suffix, size_t suffix_size)
{
return s.size() >= suffix_size && 0 == memcmp(s.data() + s.size() - suffix_size, suffix, suffix_size);
}
}
DECLARE_DEFAULT_CODE(
bool isAllASCII(const UInt8 * data, size_t size)
{
UInt8 mask = 0;
for (size_t i = 0; i < size; ++i)
mask |= data[i];
return !(mask & 0x80);
})
DECLARE_SSE42_SPECIFIC_CODE(
/// Copy from https://github.com/lemire/fastvalidate-utf-8/blob/master/include/simdasciicheck.h
bool isAllASCII(const UInt8 * data, size_t size)
{
__m128i masks = _mm_setzero_si128();
size_t i = 0;
for (; i + 16 <= size; i += 16)
{
__m128i bytes = _mm_loadu_si128(reinterpret_cast<const __m128i *>(data + i));
masks = _mm_or_si128(masks, bytes);
}
int mask = _mm_movemask_epi8(masks);
UInt8 tail_mask = 0;
for (; i < size; i++)
tail_mask |= data[i];
mask |= (tail_mask & 0x80);
return !mask;
})
DECLARE_AVX2_SPECIFIC_CODE(
bool isAllASCII(const UInt8 * data, size_t size)
{
__m256i masks = _mm256_setzero_si256();
size_t i = 0;
for (; i + 32 <= size; i += 32)
{
__m256i bytes = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(data + i));
masks = _mm256_or_si256(masks, bytes);
}
int mask = _mm256_movemask_epi8(masks);
UInt8 tail_mask = 0;
for (; i < size; i++)
tail_mask |= data[i];
mask |= (tail_mask & 0x80);
return !mask;
})
bool isAllASCII(const UInt8 * data, size_t size)
{
#if USE_MULTITARGET_CODE
if (isArchSupported(DB::TargetArch::AVX2))
return TargetSpecific::AVX2::isAllASCII(data, size);
if (isArchSupported(DB::TargetArch::SSE42))
return TargetSpecific::SSE42::isAllASCII(data, size);
#endif
return TargetSpecific::Default::isAllASCII(data, size);
}

View File

@ -7,8 +7,10 @@
#include <cstdint> #include <cstdint>
#include <type_traits> #include <type_traits>
#include <base/types.h>
namespace detail
namespace impl
{ {
bool startsWith(const std::string & s, const char * prefix, size_t prefix_size); bool startsWith(const std::string & s, const char * prefix, size_t prefix_size);
bool endsWith(const std::string & s, const char * suffix, size_t suffix_size); bool endsWith(const std::string & s, const char * suffix, size_t suffix_size);
@ -17,12 +19,12 @@ namespace detail
inline bool startsWith(const std::string & s, const std::string & prefix) inline bool startsWith(const std::string & s, const std::string & prefix)
{ {
return detail::startsWith(s, prefix.data(), prefix.size()); return impl::startsWith(s, prefix.data(), prefix.size());
} }
inline bool endsWith(const std::string & s, const std::string & suffix) inline bool endsWith(const std::string & s, const std::string & suffix)
{ {
return detail::endsWith(s, suffix.data(), suffix.size()); return impl::endsWith(s, suffix.data(), suffix.size());
} }
@ -30,12 +32,12 @@ inline bool endsWith(const std::string & s, const std::string & suffix)
/// string that is known at compile time. /// string that is known at compile time.
inline bool startsWith(const std::string & s, const char * prefix) inline bool startsWith(const std::string & s, const char * prefix)
{ {
return detail::startsWith(s, prefix, strlen(prefix)); return impl::startsWith(s, prefix, strlen(prefix));
} }
inline bool endsWith(const std::string & s, const char * suffix) inline bool endsWith(const std::string & s, const char * suffix)
{ {
return detail::endsWith(s, suffix, strlen(suffix)); return impl::endsWith(s, suffix, strlen(suffix));
} }
/// Given an integer, return the adequate suffix for /// Given an integer, return the adequate suffix for
@ -315,6 +317,9 @@ inline void trim(std::string & str, char c = ' ')
trimLeft(str, c); trimLeft(str, c);
} }
/// If all characters in the string are ASCII, return true
bool isAllASCII(const UInt8 * data, size_t size);
constexpr bool containsGlobs(const std::string & str) constexpr bool containsGlobs(const std::string & str)
{ {
return str.find_first_of("*?{") != std::string::npos; return str.find_first_of("*?{") != std::string::npos;

View File

@ -1,8 +0,0 @@
# These files are located in separate library, because they are used by separate products
# in places when no dependency on whole "dbms" library is possible.
include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake")
add_headers_and_sources(clickhouse_common_stringutils .)
add_library(string_utils ${clickhouse_common_stringutils_headers} ${clickhouse_common_stringutils_sources})

View File

@ -1,17 +0,0 @@
#include "StringUtils.h"
namespace detail
{
bool startsWith(const std::string & s, const char * prefix, size_t prefix_size)
{
return s.size() >= prefix_size && 0 == memcmp(s.data(), prefix, prefix_size);
}
bool endsWith(const std::string & s, const char * suffix, size_t suffix_size)
{
return s.size() >= suffix_size && 0 == memcmp(s.data() + s.size() - suffix_size, suffix, suffix_size);
}
}

View File

@ -1,5 +1,5 @@
#include <Common/TLDListsHolder.h> #include <Common/TLDListsHolder.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <IO/ReadBufferFromFile.h> #include <IO/ReadBufferFromFile.h>
#include <IO/ReadHelpers.h> #include <IO/ReadHelpers.h>

View File

@ -1,14 +1,9 @@
#include <Common/StringUtils/StringUtils.h>
#include <Common/TargetSpecific.h>
#include <Common/UTF8Helpers.h> #include <Common/UTF8Helpers.h>
#include <Common/StringUtils.h>
#include <widechar_width.h> #include <widechar_width.h>
#include <bit> #include <bit>
#if USE_MULTITARGET_CODE
#include <immintrin.h>
#endif
namespace DB namespace DB
{ {
namespace UTF8 namespace UTF8
@ -208,7 +203,6 @@ size_t computeWidthImpl(const UInt8 * data, size_t size, size_t prefix, size_t l
} }
size_t computeWidth(const UInt8 * data, size_t size, size_t prefix) noexcept size_t computeWidth(const UInt8 * data, size_t size, size_t prefix) noexcept
{ {
return computeWidthImpl<Width>(data, size, prefix, 0); return computeWidthImpl<Width>(data, size, prefix, 0);
@ -219,71 +213,5 @@ size_t computeBytesBeforeWidth(const UInt8 * data, size_t size, size_t prefix, s
return computeWidthImpl<BytesBeforeLimit>(data, size, prefix, limit); return computeWidthImpl<BytesBeforeLimit>(data, size, prefix, limit);
} }
DECLARE_DEFAULT_CODE(
bool isAllASCII(const UInt8 * data, size_t size)
{
UInt8 mask = 0;
for (size_t i = 0; i < size; ++i)
mask |= data[i];
return !(mask & 0x80);
})
DECLARE_SSE42_SPECIFIC_CODE(
/// Copy from https://github.com/lemire/fastvalidate-utf-8/blob/master/include/simdasciicheck.h
bool isAllASCII(const UInt8 * data, size_t size)
{
__m128i masks = _mm_setzero_si128();
size_t i = 0;
for (; i + 16 <= size; i += 16)
{
__m128i bytes = _mm_loadu_si128(reinterpret_cast<const __m128i *>(data + i));
masks = _mm_or_si128(masks, bytes);
}
int mask = _mm_movemask_epi8(masks);
UInt8 tail_mask = 0;
for (; i < size; i++)
tail_mask |= data[i];
mask |= (tail_mask & 0x80);
return !mask;
})
DECLARE_AVX2_SPECIFIC_CODE(
bool isAllASCII(const UInt8 * data, size_t size)
{
__m256i masks = _mm256_setzero_si256();
size_t i = 0;
for (; i + 32 <= size; i += 32)
{
__m256i bytes = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(data + i));
masks = _mm256_or_si256(masks, bytes);
}
int mask = _mm256_movemask_epi8(masks);
UInt8 tail_mask = 0;
for (; i < size; i++)
tail_mask |= data[i];
mask |= (tail_mask & 0x80);
return !mask;
})
bool isAllASCII(const UInt8* data, size_t size)
{
#if USE_MULTITARGET_CODE
if (isArchSupported(TargetArch::AVX2))
return TargetSpecific::AVX2::isAllASCII(data, size);
if (isArchSupported(TargetArch::SSE42))
return TargetSpecific::SSE42::isAllASCII(data, size);
#endif
return TargetSpecific::Default::isAllASCII(data, size);
}
} }
} }

View File

@ -136,10 +136,6 @@ size_t computeWidth(const UInt8 * data, size_t size, size_t prefix = 0) noexcept
*/ */
size_t computeBytesBeforeWidth(const UInt8 * data, size_t size, size_t prefix, size_t limit) noexcept; size_t computeBytesBeforeWidth(const UInt8 * data, size_t size, size_t prefix, size_t limit) noexcept;
/// If all the characters in the string are ASCII, return true.
bool isAllASCII(const UInt8* data, size_t size);
} }
} }

View File

@ -7,7 +7,7 @@
#include <base/types.h> #include <base/types.h>
#include <Poco/Unicode.h> #include <Poco/Unicode.h>
#include <Common/StringSearcher.h> #include <Common/StringSearcher.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/UTF8Helpers.h> #include <Common/UTF8Helpers.h>
#include <base/unaligned.h> #include <base/unaligned.h>

View File

@ -12,8 +12,6 @@ target_link_libraries (clickhouse_common_zookeeper
clickhouse_common_io clickhouse_common_io
clickhouse_compression clickhouse_compression
common common
PRIVATE
string_utils
) )
# for examples -- no logging (to avoid extra dependencies) # for examples -- no logging (to avoid extra dependencies)
@ -23,8 +21,6 @@ target_link_libraries (clickhouse_common_zookeeper_no_log
clickhouse_common_io clickhouse_common_io
clickhouse_compression clickhouse_compression
common common
PRIVATE
string_utils
) )
if (ENABLE_EXAMPLES) if (ENABLE_EXAMPLES)
add_subdirectory(examples) add_subdirectory(examples)

View File

@ -1,7 +1,7 @@
#include "Common/ZooKeeper/IKeeper.h" #include "Common/ZooKeeper/IKeeper.h"
#include <Common/ZooKeeper/TestKeeper.h> #include <Common/ZooKeeper/TestKeeper.h>
#include <Common/setThreadName.h> #include <Common/setThreadName.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <base/types.h> #include <base/types.h>
#include <functional> #include <functional>

View File

@ -19,7 +19,7 @@
#include <Core/ServerUUID.h> #include <Core/ServerUUID.h>
#include "Common/ZooKeeper/IKeeper.h" #include "Common/ZooKeeper/IKeeper.h"
#include <Common/DNSResolver.h> #include <Common/DNSResolver.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Poco/Net/NetException.h> #include <Poco/Net/NetException.h>

View File

@ -4,7 +4,7 @@
#include <base/getFQDNOrHostName.h> #include <base/getFQDNOrHostName.h>
#include <Poco/Util/AbstractConfiguration.h> #include <Poco/Util/AbstractConfiguration.h>
#include <Common/isLocalAddress.h> #include <Common/isLocalAddress.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Poco/String.h> #include <Poco/String.h>
namespace DB namespace DB

View File

@ -7,7 +7,6 @@ clickhouse_add_executable(zkutil_test_commands_new_lib zkutil_test_commands_new_
target_link_libraries(zkutil_test_commands_new_lib PRIVATE target_link_libraries(zkutil_test_commands_new_lib PRIVATE
clickhouse_common_zookeeper_no_log clickhouse_common_zookeeper_no_log
clickhouse_compression clickhouse_compression
string_utils
dbms) dbms)
clickhouse_add_executable(zkutil_test_async zkutil_test_async.cpp) clickhouse_add_executable(zkutil_test_async zkutil_test_async.cpp)

View File

@ -1,7 +1,7 @@
#include <Poco/ConsoleChannel.h> #include <Poco/ConsoleChannel.h>
#include <Poco/Logger.h> #include <Poco/Logger.h>
#include <Poco/Event.h> #include <Poco/Event.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/ZooKeeper/ZooKeeperImpl.h> #include <Common/ZooKeeper/ZooKeeperImpl.h>
#include <Common/typeid_cast.h> #include <Common/typeid_cast.h>
#include <iostream> #include <iostream>

View File

@ -1,5 +1,5 @@
#include <base/hex.h> #include <base/hex.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/escapeForFileName.h> #include <Common/escapeForFileName.h>
namespace DB namespace DB

View File

@ -87,3 +87,6 @@ if (ENABLE_SSL)
clickhouse_add_executable (encrypt_decrypt encrypt_decrypt.cpp) clickhouse_add_executable (encrypt_decrypt encrypt_decrypt.cpp)
target_link_libraries (encrypt_decrypt PRIVATE dbms) target_link_libraries (encrypt_decrypt PRIVATE dbms)
endif() endif()
clickhouse_add_executable (check_pointer_valid check_pointer_valid.cpp)
target_link_libraries (check_pointer_valid PRIVATE clickhouse_common_io)

View File

@ -0,0 +1,53 @@
#include <csetjmp>
#include <csignal>
#include <cstring>
#include <iostream>
/// This example demonstrates how is it possible to check if a pointer to memory is readable using a signal handler.
thread_local bool checking_pointer = false;
thread_local jmp_buf signal_jump_buffer;
void signalHandler(int sig, siginfo_t *, void *)
{
if (checking_pointer && sig == SIGSEGV)
siglongjmp(signal_jump_buffer, 1);
}
bool isPointerValid(const void * ptr)
{
checking_pointer = true;
if (0 == sigsetjmp(signal_jump_buffer, 1))
{
char res;
memcpy(&res, ptr, 1);
__asm__ __volatile__("" :: "r"(res) : "memory");
checking_pointer = false;
return true;
}
else
{
checking_pointer = false;
return false;
}
}
int main(int, char **)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = signalHandler;
sa.sa_flags = SA_SIGINFO;
if (sigemptyset(&sa.sa_mask)
|| sigaddset(&sa.sa_mask, SIGSEGV)
|| sigaction(SIGSEGV, &sa, nullptr))
return 1;
std::cerr << isPointerValid(reinterpret_cast<const void *>(0x123456789)) << "\n";
std::cerr << isPointerValid(&sa) << "\n";
return 0;
}

View File

@ -3,7 +3,7 @@
#include <base/types.h> #include <base/types.h>
#include <Common/Exception.h> #include <Common/Exception.h>
#include <Common/PODArray.h> #include <Common/PODArray.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
namespace DB namespace DB
{ {

View File

@ -1,6 +1,6 @@
#include <Common/formatIPv6.h> #include <Common/formatIPv6.h>
#include <base/hex.h> #include <base/hex.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <base/range.h> #include <base/range.h>
#include <array> #include <array>

View File

@ -7,7 +7,7 @@
#include <base/hex.h> #include <base/hex.h>
#include <base/types.h> #include <base/types.h>
#include <base/unaligned.h> #include <base/unaligned.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
constexpr size_t IPV4_BINARY_LENGTH = 4; constexpr size_t IPV4_BINARY_LENGTH = 4;
constexpr size_t IPV6_BINARY_LENGTH = 16; constexpr size_t IPV6_BINARY_LENGTH = 16;

View File

@ -3,7 +3,7 @@
#if defined(OS_LINUX) #if defined(OS_LINUX)
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <base/hex.h> #include <base/hex.h>
#include <IO/ReadBufferFromFile.h> #include <IO/ReadBufferFromFile.h>
#include <IO/ReadHelpers.h> #include <IO/ReadHelpers.h>

View File

@ -1,7 +1,7 @@
#include <Common/getMultipleKeysFromConfig.h> #include <Common/getMultipleKeysFromConfig.h>
#include <Poco/Util/AbstractConfiguration.h> #include <Poco/Util/AbstractConfiguration.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
namespace DB namespace DB
{ {

View File

@ -8,7 +8,7 @@
#include <Poco/Path.h> #include <Poco/Path.h>
#include <Common/getCurrentProcessFDCount.h> #include <Common/getCurrentProcessFDCount.h>
#include <Common/getMaxFileDescriptorCount.h> #include <Common/getMaxFileDescriptorCount.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/config_version.h> #include <Common/config_version.h>
#include "Coordination/KeeperFeatureFlags.h" #include "Coordination/KeeperFeatureFlags.h"
#include <Coordination/Keeper4LWInfo.h> #include <Coordination/Keeper4LWInfo.h>

View File

@ -11,7 +11,7 @@
#include <Common/ZooKeeper/ZooKeeperCommon.h> #include <Common/ZooKeeper/ZooKeeperCommon.h>
#include <Common/SipHash.h> #include <Common/SipHash.h>
#include <Common/ZooKeeper/ZooKeeperConstants.h> #include <Common/ZooKeeper/ZooKeeperConstants.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/ZooKeeper/IKeeper.h> #include <Common/ZooKeeper/IKeeper.h>
#include <base/hex.h> #include <base/hex.h>
#include <base/scope_guard.h> #include <base/scope_guard.h>

View File

@ -92,7 +92,7 @@ void applySettingsQuirks(Settings & settings, LoggerPtr log)
void doSettingsSanityCheckClamp(Settings & current_settings, LoggerPtr log) void doSettingsSanityCheckClamp(Settings & current_settings, LoggerPtr log)
{ {
auto getCurrentValue = [&current_settings](const std::string_view name) -> Field auto get_current_value = [&current_settings](const std::string_view name) -> Field
{ {
Field current_value; Field current_value;
bool has_current_value = current_settings.tryGet(name, current_value); bool has_current_value = current_settings.tryGet(name, current_value);
@ -100,7 +100,7 @@ void doSettingsSanityCheckClamp(Settings & current_settings, LoggerPtr log)
return current_value; return current_value;
}; };
UInt64 max_threads = getCurrentValue("max_threads").get<UInt64>(); UInt64 max_threads = get_current_value("max_threads").get<UInt64>();
UInt64 max_threads_max_value = 256 * getNumberOfPhysicalCPUCores(); UInt64 max_threads_max_value = 256 * getNumberOfPhysicalCPUCores();
if (max_threads > max_threads_max_value) if (max_threads > max_threads_max_value)
{ {
@ -109,7 +109,7 @@ void doSettingsSanityCheckClamp(Settings & current_settings, LoggerPtr log)
current_settings.set("max_threads", max_threads_max_value); current_settings.set("max_threads", max_threads_max_value);
} }
constexpr UInt64 max_sane_block_rows_size = 4294967296; // 2^32 static constexpr UInt64 max_sane_block_rows_size = 4294967296; // 2^32
std::unordered_set<String> block_rows_settings{ std::unordered_set<String> block_rows_settings{
"max_block_size", "max_block_size",
"max_insert_block_size", "max_insert_block_size",
@ -120,13 +120,21 @@ void doSettingsSanityCheckClamp(Settings & current_settings, LoggerPtr log)
"input_format_parquet_max_block_size"}; "input_format_parquet_max_block_size"};
for (auto const & setting : block_rows_settings) for (auto const & setting : block_rows_settings)
{ {
auto block_size = getCurrentValue(setting).get<UInt64>(); if (auto block_size = get_current_value(setting).get<UInt64>();
if (block_size > max_sane_block_rows_size) block_size > max_sane_block_rows_size)
{ {
if (log) if (log)
LOG_WARNING(log, "Sanity check: '{}' value is too high ({}). Reduced to {}", setting, block_size, max_sane_block_rows_size); LOG_WARNING(log, "Sanity check: '{}' value is too high ({}). Reduced to {}", setting, block_size, max_sane_block_rows_size);
current_settings.set(setting, max_sane_block_rows_size); current_settings.set(setting, max_sane_block_rows_size);
} }
} }
if (auto max_block_size = get_current_value("max_block_size").get<UInt64>(); max_block_size == 0)
{
if (log)
LOG_WARNING(log, "Sanity check: 'max_block_size' cannot be 0. Set to default value {}", DEFAULT_BLOCK_SIZE);
current_settings.set("max_block_size", DEFAULT_BLOCK_SIZE);
}
} }
} }

View File

@ -144,6 +144,9 @@ static std::atomic_flag fatal_error_printed;
*/ */
static void signalHandler(int sig, siginfo_t * info, void * context) static void signalHandler(int sig, siginfo_t * info, void * context)
{ {
if (asynchronous_stack_unwinding && sig == SIGSEGV)
siglongjmp(asynchronous_stack_unwinding_signal_jump_buffer, 1);
DENY_ALLOCATIONS_IN_SCOPE; DENY_ALLOCATIONS_IN_SCOPE;
auto saved_errno = errno; /// We must restore previous value of errno in signal handler. auto saved_errno = errno; /// We must restore previous value of errno in signal handler.
@ -185,6 +188,7 @@ static void signalHandler(int sig, siginfo_t * info, void * context)
errno = saved_errno; errno = saved_errno;
} }
static bool getenvBool(const char * name) static bool getenvBool(const char * name)
{ {
bool res = false; bool res = false;

View File

@ -7,7 +7,7 @@
#include <Parsers/ASTLiteral.h> #include <Parsers/ASTLiteral.h>
#include <Common/typeid_cast.h> #include <Common/typeid_cast.h>
#include <Poco/String.h> #include <Poco/String.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <IO/WriteHelpers.h> #include <IO/WriteHelpers.h>
#include <Core/Defines.h> #include <Core/Defines.h>
#include <Common/CurrentThread.h> #include <Common/CurrentThread.h>

View File

@ -1,5 +1,5 @@
#include <base/map.h> #include <base/map.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Columns/ColumnMap.h> #include <Columns/ColumnMap.h>
#include <Core/Field.h> #include <Core/Field.h>
#include <DataTypes/DataTypeMap.h> #include <DataTypes/DataTypeMap.h>

View File

@ -1,6 +1,6 @@
#include <base/map.h> #include <base/map.h>
#include <base/range.h> #include <base/range.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Columns/ColumnTuple.h> #include <Columns/ColumnTuple.h>
#include <Columns/ColumnConst.h> #include <Columns/ColumnConst.h>
#include <Core/Field.h> #include <Core/Field.h>

View File

@ -3,7 +3,7 @@
#include <Common/typeid_cast.h> #include <Common/typeid_cast.h>
#include <Common/assert_cast.h> #include <Common/assert_cast.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include "Columns/IColumn.h" #include "Columns/IColumn.h"
#include <DataTypes/DataTypeArray.h> #include <DataTypes/DataTypeArray.h>

View File

@ -2,7 +2,7 @@
#include <DataTypes/Serializations/SerializationNullable.h> #include <DataTypes/Serializations/SerializationNullable.h>
#include <DataTypes/DataTypeMap.h> #include <DataTypes/DataTypeMap.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Columns/ColumnMap.h> #include <Columns/ColumnMap.h>
#include <Core/Field.h> #include <Core/Field.h>
#include <Formats/FormatSettings.h> #include <Formats/FormatSettings.h>

View File

@ -76,6 +76,20 @@ static void setReplicatedEngine(ASTCreateQuery * create_query, ContextPtr contex
String replica_path = server_settings.default_replica_path; String replica_path = server_settings.default_replica_path;
String replica_name = server_settings.default_replica_name; String replica_name = server_settings.default_replica_name;
/// Check that replica path doesn't exist
Macros::MacroExpansionInfo info;
StorageID table_id = StorageID(create_query->getDatabase(), create_query->getTable(), create_query->uuid);
info.table_id = table_id;
info.expand_special_macros_only = false;
String zookeeper_path = context->getMacros()->expand(replica_path, info);
if (context->getZooKeeper()->exists(zookeeper_path))
throw Exception(
ErrorCodes::LOGICAL_ERROR,
"Found existing ZooKeeper path {} while trying to convert table {} to replicated. Table will not be converted.",
zookeeper_path, backQuote(table_id.getFullTableName())
);
auto args = std::make_shared<ASTExpressionList>(); auto args = std::make_shared<ASTExpressionList>();
args->children.push_back(std::make_shared<ASTLiteral>(replica_path)); args->children.push_back(std::make_shared<ASTLiteral>(replica_path));
args->children.push_back(std::make_shared<ASTLiteral>(replica_name)); args->children.push_back(std::make_shared<ASTLiteral>(replica_name));

View File

@ -944,6 +944,13 @@ void DatabaseReplicated::recoverLostReplica(const ZooKeeperPtr & current_zookeep
query_context->setSetting("allow_hyperscan", 1); query_context->setSetting("allow_hyperscan", 1);
query_context->setSetting("allow_simdjson", 1); query_context->setSetting("allow_simdjson", 1);
query_context->setSetting("allow_deprecated_syntax_for_merge_tree", 1); query_context->setSetting("allow_deprecated_syntax_for_merge_tree", 1);
query_context->setSetting("allow_suspicious_primary_key", 1);
query_context->setSetting("allow_suspicious_ttl_expressions", 1);
query_context->setSetting("allow_suspicious_variant_types", 1);
query_context->setSetting("enable_deflate_qpl_codec", 1);
query_context->setSetting("enable_zstd_qat_codec", 1);
query_context->setSetting("allow_create_index_without_type", 1);
query_context->setSetting("allow_experimental_s3queue", 1);
auto txn = std::make_shared<ZooKeeperMetadataTransaction>(current_zookeeper, zookeeper_path, false, ""); auto txn = std::make_shared<ZooKeeperMetadataTransaction>(current_zookeeper, zookeeper_path, false, "");
query_context->initZooKeeperMetadataTransaction(txn); query_context->initZooKeeperMetadataTransaction(txn);

View File

@ -39,7 +39,6 @@ target_link_libraries(clickhouse_dictionaries
Poco::Data Poco::Data
Poco::MongoDB Poco::MongoDB
Poco::Redis Poco::Redis
string_utils
) )
target_link_libraries(clickhouse_dictionaries PUBLIC ch_contrib::abseil_swiss_tables) target_link_libraries(clickhouse_dictionaries PUBLIC ch_contrib::abseil_swiss_tables)

View File

@ -7,7 +7,7 @@
#include <IO/WriteHelpers.h> #include <IO/WriteHelpers.h>
#include <IO/Operators.h> #include <IO/Operators.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Formats/FormatSettings.h> #include <Formats/FormatSettings.h>
#include <Columns/IColumn.h> #include <Columns/IColumn.h>

View File

@ -1,6 +1,6 @@
#include "FileDictionarySource.h" #include "FileDictionarySource.h"
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/filesystemHelpers.h> #include <Common/filesystemHelpers.h>
#include <IO/ReadBufferFromFile.h> #include <IO/ReadBufferFromFile.h>
#include <Interpreters/Context.h> #include <Interpreters/Context.h>

View File

@ -32,8 +32,16 @@ bool DataSourceDescription::operator==(const DataSourceDescription & other) cons
bool DataSourceDescription::sameKind(const DataSourceDescription & other) const bool DataSourceDescription::sameKind(const DataSourceDescription & other) const
{ {
return std::tie(type, object_storage_type, description) std::string_view our_description = description;
== std::tie(other.type, other.object_storage_type, other.description); if (our_description.ends_with('/') && our_description.length() > 1)
our_description = our_description.substr(0, our_description.length() - 1);
std::string_view other_description = other.description;
if (other_description.ends_with('/') && other_description.length() > 1)
other_description = other_description.substr(0, other_description.length() - 1);
return std::tie(type, object_storage_type, our_description)
== std::tie(other.type, other.object_storage_type, other_description);
} }
std::string DataSourceDescription::toString() const std::string DataSourceDescription::toString() const

View File

@ -1,6 +1,6 @@
#include "IVolume.h" #include "IVolume.h"
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/quoteString.h> #include <Common/quoteString.h>
#include <memory> #include <memory>

View File

@ -173,7 +173,9 @@ private:
MultiVersion<Azure::Storage::Blobs::BlobContainerClient> client; MultiVersion<Azure::Storage::Blobs::BlobContainerClient> client;
MultiVersion<AzureObjectStorageSettings> settings; MultiVersion<AzureObjectStorageSettings> settings;
const String object_namespace; /// container + prefix const String object_namespace; /// container + prefix
const String description; /// url + container
/// We use source url without container and prefix as description, because in Azure there are no limitations for operations between different containers.
const String description;
LoggerPtr log; LoggerPtr log;
}; };

View File

@ -306,14 +306,13 @@ void registerAzureObjectStorage(ObjectStorageFactory & factory)
bool /* skip_access_check */) -> ObjectStoragePtr bool /* skip_access_check */) -> ObjectStoragePtr
{ {
AzureBlobStorageEndpoint endpoint = processAzureBlobStorageEndpoint(config, config_prefix); AzureBlobStorageEndpoint endpoint = processAzureBlobStorageEndpoint(config, config_prefix);
std::string endpoint_string = endpoint.getEndpoint();
return createObjectStorage<AzureObjectStorage>( return createObjectStorage<AzureObjectStorage>(
ObjectStorageType::Azure, config, config_prefix, name, ObjectStorageType::Azure, config, config_prefix, name,
getAzureBlobContainerClient(config, config_prefix), getAzureBlobContainerClient(config, config_prefix),
getAzureBlobStorageSettings(config, config_prefix, context), getAzureBlobStorageSettings(config, config_prefix, context),
endpoint.prefix.empty() ? endpoint.container_name : endpoint.container_name + "/" + endpoint.prefix, endpoint.prefix.empty() ? endpoint.container_name : endpoint.container_name + "/" + endpoint.prefix,
endpoint.prefix.empty() ? endpoint_string : endpoint_string.substr(0, endpoint_string.length() - endpoint.prefix.length())); endpoint.getEndpointWithoutContainer());
}; };
factory.registerObjectStorageType("azure_blob_storage", creator); factory.registerObjectStorageType("azure_blob_storage", creator);
factory.registerObjectStorageType("azure", creator); factory.registerObjectStorageType("azure", creator);

View File

@ -20,7 +20,7 @@
#include <Disks/ObjectStorages/S3/diskSettings.h> #include <Disks/ObjectStorages/S3/diskSettings.h>
#include <Common/ProfileEvents.h> #include <Common/ProfileEvents.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <Common/MultiVersion.h> #include <Common/MultiVersion.h>
#include <Common/Macros.h> #include <Common/Macros.h>

View File

@ -4,7 +4,7 @@
#if USE_AWS_S3 #if USE_AWS_S3
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <Common/Throttler.h> #include <Common/Throttler.h>
#include <Common/ProxyConfigurationResolverProvider.h> #include <Common/ProxyConfigurationResolverProvider.h>

View File

@ -1,6 +1,6 @@
#include "VolumeJBOD.h" #include "VolumeJBOD.h"
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/formatReadable.h> #include <Common/formatReadable.h>
#include <Common/quoteString.h> #include <Common/quoteString.h>
#include <Common/logger_useful.h> #include <Common/logger_useful.h>

View File

@ -9,7 +9,7 @@
#include <DataTypes/DataTypesNumber.h> #include <DataTypes/DataTypesNumber.h>
#include <DataTypes/DataTypeString.h> #include <DataTypes/DataTypeString.h>
#include <DataTypes/IDataType.h> #include <DataTypes/IDataType.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <boost/algorithm/string/join.hpp> #include <boost/algorithm/string/join.hpp>
#include <capnp/schema.h> #include <capnp/schema.h>
#include <capnp/schema-parser.h> #include <capnp/schema-parser.h>

View File

@ -7,7 +7,7 @@
#include <DataTypes/DataTypeMap.h> #include <DataTypes/DataTypeMap.h>
#include <DataTypes/DataTypeTuple.h> #include <DataTypes/DataTypeTuple.h>
#include <DataTypes/DataTypeEnum.h> #include <DataTypes/DataTypeEnum.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/randomSeed.h> #include <Common/randomSeed.h>
#include <pcg_random.hpp> #include <pcg_random.hpp>

View File

@ -7,7 +7,7 @@
#include <DataTypes/DataTypeMap.h> #include <DataTypes/DataTypeMap.h>
#include <DataTypes/DataTypeTuple.h> #include <DataTypes/DataTypeTuple.h>
#include <DataTypes/DataTypeEnum.h> #include <DataTypes/DataTypeEnum.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
namespace DB namespace DB
{ {

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <Common/PODArray.h> #include <Common/PODArray.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/UTF8Helpers.h> #include <Common/UTF8Helpers.h>
#include <algorithm> #include <algorithm>

View File

@ -14,7 +14,7 @@
#include <Interpreters/Context.h> #include <Interpreters/Context.h>
#include <IO/WriteHelpers.h> #include <IO/WriteHelpers.h>
#include <Interpreters/castColumn.h> #include <Interpreters/castColumn.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Common/assert_cast.h> #include <Common/assert_cast.h>
#include <Common/typeid_cast.h> #include <Common/typeid_cast.h>

View File

@ -2,7 +2,7 @@
#if USE_NLP #if USE_NLP
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Functions/FunctionFactory.h> #include <Functions/FunctionFactory.h>
#include <Functions/FunctionsTextClassification.h> #include <Functions/FunctionsTextClassification.h>

View File

@ -2,7 +2,7 @@
#if USE_NLP #if USE_NLP
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
#include <Functions/FunctionFactory.h> #include <Functions/FunctionFactory.h>
#include <Functions/FunctionsTextClassification.h> #include <Functions/FunctionsTextClassification.h>

View File

@ -5,7 +5,7 @@
#include <Parsers/ASTIdentifier_fwd.h> #include <Parsers/ASTIdentifier_fwd.h>
#include <Parsers/ExpressionElementParsers.h> #include <Parsers/ExpressionElementParsers.h>
#include <Parsers/Lexer.h> #include <Parsers/Lexer.h>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
namespace DB namespace DB
{ {

View File

@ -3,6 +3,7 @@
#include <Functions/LowerUpperImpl.h> #include <Functions/LowerUpperImpl.h>
#include <base/defines.h> #include <base/defines.h>
#include <Poco/UTF8Encoding.h> #include <Poco/UTF8Encoding.h>
#include <Common/StringUtils.h>
#include <Common/UTF8Helpers.h> #include <Common/UTF8Helpers.h>
#ifdef __SSE2__ #ifdef __SSE2__
@ -94,7 +95,7 @@ struct LowerUpperUTF8Impl
if (data.empty()) if (data.empty())
return; return;
bool all_ascii = UTF8::isAllASCII(data.data(), data.size()); bool all_ascii = isAllASCII(data.data(), data.size());
if (all_ascii) if (all_ascii)
{ {
LowerUpperImpl<not_case_lower_bound, not_case_upper_bound>::vector(data, offsets, res_data, res_offsets); LowerUpperImpl<not_case_lower_bound, not_case_upper_bound>::vector(data, offsets, res_data, res_offsets);

View File

@ -3,7 +3,7 @@
#include "protocol.h" #include "protocol.h"
#include <base/find_symbols.h> #include <base/find_symbols.h>
#include <cstring> #include <cstring>
#include <Common/StringUtils/StringUtils.h> #include <Common/StringUtils.h>
namespace DB namespace DB
{ {

Some files were not shown because too many files have changed in this diff Show More