diff --git a/.github/ISSUE_TEMPLATE/85_bug-report.md b/.github/ISSUE_TEMPLATE/85_bug-report.md index d78474670ff..87a2d877e30 100644 --- a/.github/ISSUE_TEMPLATE/85_bug-report.md +++ b/.github/ISSUE_TEMPLATE/85_bug-report.md @@ -9,7 +9,7 @@ assignees: '' > You have to provide the following information whenever possible. -**Describe the bug** +**Describe what's wrong** > A clear and concise description of what works not as it is supposed to. diff --git a/CMakeLists.txt b/CMakeLists.txt index 1aef8c9fc8d..8a5a6293f7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ include (cmake/arch.cmake) include (cmake/target.cmake) include (cmake/tools.cmake) include (cmake/analysis.cmake) +include (cmake/git_status.cmake) # Ignore export() since we don't use it, # but it gets broken with a global targets via link_libraries() diff --git a/SECURITY.md b/SECURITY.md index 906b2966348..846b7e8239c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,9 +1,11 @@ # Security Policy -## Supported Versions +## Security Announcements +Security fixes will be announced by posting them in the [security changelog](https://clickhouse.tech/docs/en/whats-new/security-changelog/) -The following versions of ClickHouse server are -currently being supported with security updates: +## Scope and Supported Versions + +The following versions of ClickHouse server are currently being supported with security updates: | Version | Supported | | ------- | ------------------ | @@ -11,18 +13,49 @@ currently being supported with security updates: | 18.x | :x: | | 19.x | :x: | | 20.1 | :x: | -| 20.3 | :white_check_mark: | +| 20.3 | :x: | | 20.4 | :x: | | 20.5 | :x: | | 20.6 | :x: | | 20.7 | :x: | -| 20.8 | :white_check_mark: | +| 20.8 | :x: | | 20.9 | :x: | | 20.10 | :x: | -| 20.11 | :white_check_mark: | -| 20.12 | :white_check_mark: | -| 21.1 | :white_check_mark: | +| 20.11 | :x: | +| 20.12 | :x: | +| 21.1 | :x: | +| 21.2 | :x: | +| 21.3 | ✅ | +| 21.4 | :x: | +| 21.5 | :x: | +| 21.6 | ✅ | +| 21.7 | ✅ | +| 21.8 | ✅ | ## Reporting a Vulnerability +We're extremely grateful for security researchers and users that report vulnerabilities to the ClickHouse Open Source Community. All reports are thoroughly investigated by developers. + To report a potential vulnerability in ClickHouse please send the details about it to [clickhouse-feedback@yandex-team.com](mailto:clickhouse-feedback@yandex-team.com). + +### When Should I Report a Vulnerability? + +- You think you discovered a potential security vulnerability in ClickHouse +- You are unsure how a vulnerability affects ClickHouse + +### When Should I NOT Report a Vulnerability? + +- You need help tuning ClickHouse components for security +- You need help applying security related updates +- Your issue is not security related + +## Security Vulnerability Response + +Each report is acknowledged and analyzed by ClickHouse maintainers within 5 working days. +As the security issue moves from triage, to identified fix, to release planning we will keep the reporter updated. + +## Public Disclosure Timing + +A public disclosure date is negotiated by the ClickHouse maintainers and the bug submitter. We prefer to fully disclose the bug as soon as possible once a user mitigation is available. It is reasonable to delay disclosure when the bug or the fix is not yet fully understood, the solution is not well-tested, or for vendor coordination. The timeframe for disclosure is from immediate (especially if it's already publicly known) to 90 days. For a vulnerability with a straightforward mitigation, we expect report date to disclosure date to be on the order of 7 days. + + diff --git a/base/common/insertAtEnd.h b/base/common/insertAtEnd.h new file mode 100644 index 00000000000..c4fef664511 --- /dev/null +++ b/base/common/insertAtEnd.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +/// Appends a specified vector with elements of another vector. +template +void insertAtEnd(std::vector & dest, const std::vector & src) +{ + if (src.empty()) + return; + dest.reserve(dest.size() + src.size()); + dest.insert(dest.end(), src.begin(), src.end()); +} + +template +void insertAtEnd(std::vector & dest, std::vector && src) +{ + if (src.empty()) + return; + if (dest.empty()) + { + dest.swap(src); + return; + } + dest.reserve(dest.size() + src.size()); + dest.insert(dest.end(), std::make_move_iterator(src.begin()), std::make_move_iterator(src.end())); + src.clear(); +} diff --git a/base/common/unit.h b/base/common/unit.h new file mode 100644 index 00000000000..d5c8d5c9027 --- /dev/null +++ b/base/common/unit.h @@ -0,0 +1,10 @@ +#pragma once +#include + +constexpr size_t KiB = 1024; +constexpr size_t MiB = 1024 * KiB; +constexpr size_t GiB = 1024 * MiB; + +constexpr size_t operator"" _KiB(unsigned long long val) { return val * KiB; } +constexpr size_t operator"" _MiB(unsigned long long val) { return val * MiB; } +constexpr size_t operator"" _GiB(unsigned long long val) { return val * GiB; } diff --git a/base/common/wide_integer_impl.h b/base/common/wide_integer_impl.h index 27efe18eedd..b8de5efb859 100644 --- a/base/common/wide_integer_impl.h +++ b/base/common/wide_integer_impl.h @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -39,6 +40,18 @@ static constexpr bool IntegralConcept() noexcept return std::is_integral_v || IsWideInteger::value; } +template +class IsTupleLike +{ + template + static auto check(U * p) -> decltype(std::tuple_size::value, int()); + template + static void check(...); + +public: + static constexpr const bool value = !std::is_void(nullptr))>::value; +}; + } namespace std @@ -227,6 +240,19 @@ struct integer::_impl self.items[i] = 0; } + template + constexpr static void wide_integer_from_tuple_like(integer & self, const TupleLike & tuple) noexcept + { + if constexpr (i < item_count) + { + if constexpr (i < std::tuple_size_v) + self.items[i] = std::get(tuple); + else + self.items[i] = 0; + wide_integer_from_tuple_like(self, tuple); + } + } + /** * N.B. t is constructed from double, so max(t) = max(double) ~ 2^310 * the recursive call happens when t / 2^64 > 2^64, so there won't be more than 5 of them. @@ -966,6 +992,8 @@ constexpr integer::integer(T rhs) noexcept { if constexpr (IsWideInteger::value) _impl::wide_integer_from_wide_integer(*this, rhs); + else if constexpr (IsTupleLike::value) + _impl::wide_integer_from_tuple_like(*this, rhs); else _impl::wide_integer_from_builtin(*this, rhs); } @@ -979,6 +1007,8 @@ constexpr integer::integer(std::initializer_list il) noexcept { if constexpr (IsWideInteger::value) _impl::wide_integer_from_wide_integer(*this, *il.begin()); + else if constexpr (IsTupleLike::value) + _impl::wide_integer_from_tuple_like(*this, *il.begin()); else _impl::wide_integer_from_builtin(*this, *il.begin()); } @@ -1007,7 +1037,10 @@ template template constexpr integer & integer::operator=(T rhs) noexcept { - _impl::wide_integer_from_builtin(*this, rhs); + if constexpr (IsTupleLike::value) + _impl::wide_integer_from_tuple_like(*this, rhs); + else + _impl::wide_integer_from_builtin(*this, rhs); return *this; } diff --git a/cmake/git_status.cmake b/cmake/git_status.cmake new file mode 100644 index 00000000000..8748aacfedd --- /dev/null +++ b/cmake/git_status.cmake @@ -0,0 +1,17 @@ +# Print the status of the git repository (if git is available). +# This is useful for troubleshooting build failure reports +find_package(Git) + +if (Git_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_ID + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "HEAD's commit hash ${GIT_COMMIT_ID}") + execute_process( + COMMAND ${GIT_EXECUTABLE} status + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) +else() + message(STATUS "The git program could not be found.") +endif() diff --git a/contrib/nanodbc b/contrib/nanodbc index 9fc45967551..df52a1232df 160000 --- a/contrib/nanodbc +++ b/contrib/nanodbc @@ -1 +1 @@ -Subproject commit 9fc459675515d491401727ec67fca38db721f28c +Subproject commit df52a1232dfa182f9af60974d001b91823afe9bc diff --git a/contrib/replxx b/contrib/replxx index c81be6c68b1..f97765df14f 160000 --- a/contrib/replxx +++ b/contrib/replxx @@ -1 +1 @@ -Subproject commit c81be6c68b146f15f2096b7ef80e3f21fe27004c +Subproject commit f97765df14f4a6236d69b8f14b53ef2051ebd95a diff --git a/docker/builder/Dockerfile b/docker/builder/Dockerfile index 199b5217d79..abe102e9c80 100644 --- a/docker/builder/Dockerfile +++ b/docker/builder/Dockerfile @@ -2,6 +2,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/client/Dockerfile b/docker/client/Dockerfile index 052e008fd56..1b398b43c32 100644 --- a/docker/client/Dockerfile +++ b/docker/client/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:18.04 ARG repository="deb https://repo.clickhouse.tech/deb/stable/ main/" ARG version=21.10.1.* +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install --yes --no-install-recommends \ apt-transport-https \ diff --git a/docker/packager/binary/Dockerfile b/docker/packager/binary/Dockerfile index 29225bbfeb8..0393669df48 100644 --- a/docker/packager/binary/Dockerfile +++ b/docker/packager/binary/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install \ apt-transport-https \ diff --git a/docker/packager/deb/Dockerfile b/docker/packager/deb/Dockerfile index 241b691cd23..294c8645455 100644 --- a/docker/packager/deb/Dockerfile +++ b/docker/packager/deb/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/packager/packager b/docker/packager/packager index b53220886b1..95b7fcd8568 100755 --- a/docker/packager/packager +++ b/docker/packager/packager @@ -173,9 +173,6 @@ def parse_env_variables(build_type, compiler, sanitizer, package_type, image_typ cmake_flags.append('-DUSE_GTEST=1') cmake_flags.append('-DENABLE_TESTS=1') cmake_flags.append('-DENABLE_EXAMPLES=1') - cmake_flags.append('-DENABLE_FUZZING=1') - # For fuzzing needs - cmake_flags.append('-DUSE_YAML_CPP=1') # Don't stop on first error to find more clang-tidy errors in one run. result.append('NINJA_FLAGS=-k0') diff --git a/docker/packager/unbundled/Dockerfile b/docker/packager/unbundled/Dockerfile index 07031aa2d1b..b2d9f555f19 100644 --- a/docker/packager/unbundled/Dockerfile +++ b/docker/packager/unbundled/Dockerfile @@ -5,6 +5,8 @@ RUN export CODENAME="$(lsb_release --codename --short | tr 'A-Z' 'a-z')" \ && wget -nv -O /tmp/arrow-keyring.deb "https://apache.jfrog.io/artifactory/arrow/ubuntu/apache-arrow-apt-source-latest-${CODENAME}.deb" \ && dpkg -i /tmp/arrow-keyring.deb +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + # Libraries from OS are only needed to test the "unbundled" build (that is not used in production). RUN apt-get update \ && apt-get install \ diff --git a/docker/server/Dockerfile b/docker/server/Dockerfile index 25f01230c5f..6307e74c633 100644 --- a/docker/server/Dockerfile +++ b/docker/server/Dockerfile @@ -26,6 +26,8 @@ ARG DEBIAN_FRONTEND=noninteractive # installed to prevent picking those uid / gid by some unrelated software. # The same uid / gid (101) is used both for alpine and ubuntu. +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN groupadd -r clickhouse --gid=101 \ && useradd -r -g clickhouse --uid=101 --home-dir=/var/lib/clickhouse --shell=/bin/bash clickhouse \ && apt-get update \ diff --git a/docker/test/base/Dockerfile b/docker/test/base/Dockerfile index 29ac7a925b8..611ef6b7702 100644 --- a/docker/test/base/Dockerfile +++ b/docker/test/base/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/test/codebrowser/Dockerfile b/docker/test/codebrowser/Dockerfile index bb35258bed8..33173ab90f9 100644 --- a/docker/test/codebrowser/Dockerfile +++ b/docker/test/codebrowser/Dockerfile @@ -2,6 +2,8 @@ # docker run --volume=path_to_repo:/repo_folder --volume=path_to_result:/test_output yandex/clickhouse-codebrowser FROM yandex/clickhouse-binary-builder +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update && apt-get --yes --allow-unauthenticated install clang-9 libllvm9 libclang-9-dev # repo versions doesn't work correctly with C++17 diff --git a/docker/test/fasttest/Dockerfile b/docker/test/fasttest/Dockerfile index 916c94e7311..2e0bbcd350f 100644 --- a/docker/test/fasttest/Dockerfile +++ b/docker/test/fasttest/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=11 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && apt-get install ca-certificates lsb-release wget gnupg apt-transport-https \ --yes --no-install-recommends --verbose-versions \ diff --git a/docker/test/fasttest/run.sh b/docker/test/fasttest/run.sh index 43c1add74cc..c4493de477c 100755 --- a/docker/test/fasttest/run.sh +++ b/docker/test/fasttest/run.sh @@ -393,6 +393,9 @@ function run_tests 01853_s2_cells_intersect 01854_s2_cap_contains 01854_s2_cap_union + + # needs s3 + 01944_insert_partition_by ) time clickhouse-test --hung-check -j 8 --order=random --use-skip-list \ diff --git a/docker/test/fuzzer/Dockerfile b/docker/test/fuzzer/Dockerfile index 57daba9cfd6..18684145636 100644 --- a/docker/test/fuzzer/Dockerfile +++ b/docker/test/fuzzer/Dockerfile @@ -5,6 +5,8 @@ ENV LANG=C.UTF-8 ENV TZ=Europe/Moscow RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \ ca-certificates \ diff --git a/docker/test/integration/runner/Dockerfile b/docker/test/integration/runner/Dockerfile index 6bde4ef60db..cb69a00fc63 100644 --- a/docker/test/integration/runner/Dockerfile +++ b/docker/test/integration/runner/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-integration-tests-runner . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \ ca-certificates \ @@ -77,8 +79,9 @@ RUN python3 -m pip install \ pytest-timeout \ pytest-xdist \ pytest-repeat \ + pytz \ redis \ - tzlocal \ + tzlocal==2.1 \ urllib3 \ requests-kerberos \ pyhdfs diff --git a/docker/test/performance-comparison/Dockerfile b/docker/test/performance-comparison/Dockerfile index 5ec048de657..1a61c4b274a 100644 --- a/docker/test/performance-comparison/Dockerfile +++ b/docker/test/performance-comparison/Dockerfile @@ -5,6 +5,8 @@ ENV LANG=C.UTF-8 ENV TZ=Europe/Moscow RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \ bash \ diff --git a/docker/test/sqlancer/Dockerfile b/docker/test/sqlancer/Dockerfile index 253ca1b729a..67236402352 100644 --- a/docker/test/sqlancer/Dockerfile +++ b/docker/test/sqlancer/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-sqlancer-test . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update --yes && env DEBIAN_FRONTEND=noninteractive apt-get install wget unzip git openjdk-14-jdk maven python3 --yes --no-install-recommends RUN wget https://github.com/sqlancer/sqlancer/archive/master.zip -O /sqlancer.zip RUN mkdir /sqlancer && \ diff --git a/docker/test/style/Dockerfile b/docker/test/style/Dockerfile index 86595a77a54..c0b3b0102cf 100644 --- a/docker/test/style/Dockerfile +++ b/docker/test/style/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-style-test . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \ shellcheck \ libxml2-utils \ diff --git a/docker/test/testflows/runner/Dockerfile b/docker/test/testflows/runner/Dockerfile index 264b98c669d..81d431635b7 100644 --- a/docker/test/testflows/runner/Dockerfile +++ b/docker/test/testflows/runner/Dockerfile @@ -1,6 +1,8 @@ # docker build -t yandex/clickhouse-testflows-runner . FROM ubuntu:20.04 +RUN sed -i 's|http://archive|http://ru.archive|g' /etc/apt/sources.list + RUN apt-get update \ && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \ ca-certificates \ @@ -35,7 +37,7 @@ RUN apt-get update \ ENV TZ=Europe/Moscow RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -RUN pip3 install urllib3 testflows==1.7.20 docker-compose==1.29.1 docker==5.0.0 dicttoxml kazoo tzlocal python-dateutil numpy +RUN pip3 install urllib3 testflows==1.7.20 docker-compose==1.29.1 docker==5.0.0 dicttoxml kazoo tzlocal==2.1 pytz python-dateutil numpy ENV DOCKER_CHANNEL stable ENV DOCKER_VERSION 20.10.6 diff --git a/docs/en/engines/database-engines/index.md b/docs/en/engines/database-engines/index.md index 1d1028cbeb5..dd8959d2700 100644 --- a/docs/en/engines/database-engines/index.md +++ b/docs/en/engines/database-engines/index.md @@ -23,3 +23,5 @@ You can also use the following database engines: - [PostgreSQL](../../engines/database-engines/postgresql.md) - [Replicated](../../engines/database-engines/replicated.md) + +- [SQLite](../../engines/database-engines/sqlite.md) diff --git a/docs/en/engines/database-engines/materialized-mysql.md b/docs/en/engines/database-engines/materialized-mysql.md index d329dff32c5..7e099ac3802 100644 --- a/docs/en/engines/database-engines/materialized-mysql.md +++ b/docs/en/engines/database-engines/materialized-mysql.md @@ -1,6 +1,6 @@ --- toc_priority: 29 -toc_title: "[experimental] MaterializedMySQL" +toc_title: MaterializedMySQL --- # [experimental] MaterializedMySQL {#materialized-mysql} diff --git a/docs/en/engines/database-engines/sqlite.md b/docs/en/engines/database-engines/sqlite.md new file mode 100644 index 00000000000..ee9db90859f --- /dev/null +++ b/docs/en/engines/database-engines/sqlite.md @@ -0,0 +1,80 @@ +--- +toc_priority: 32 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +Allows to connect to [SQLite](https://www.sqlite.org/index.html) database and perform `INSERT` and `SELECT` queries to exchange data between ClickHouse and SQLite. + +## Creating a Database {#creating-a-database} + +``` sql + CREATE DATABASE sqlite_database + ENGINE = SQLite('db_path') +``` + +**Engine Parameters** + +- `db_path` — Path to a file with SQLite database. + +## Data Types Support {#data_types-support} + +| SQLite | ClickHouse | +|---------------|---------------------------------------------------------| +| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) | +| REAL | [Float32](../../sql-reference/data-types/float.md) | +| TEXT | [String](../../sql-reference/data-types/string.md) | +| BLOB | [String](../../sql-reference/data-types/string.md) | + +## Specifics and Recommendations {#specifics-and-recommendations} + +SQLite stores the entire database (definitions, tables, indices, and the data itself) as a single cross-platform file on a host machine. During writing SQLite locks the entire database file, therefore write operations are performed sequentially. Read operations can be multitasked. +SQLite does not require service management (such as startup scripts) or access control based on `GRANT` and passwords. Access control is handled by means of file-system permissions given to the database file itself. + +## Usage Example {#usage-example} + +Database in ClickHouse, connected to the SQLite: + +``` sql +CREATE DATABASE sqlite_db ENGINE = SQLite('sqlite.db'); +SHOW TABLES FROM sqlite_db; +``` + +``` text +┌──name───┐ +│ table1 │ +│ table2 │ +└─────────┘ +``` + +Shows the tables: + +``` sql +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` +Inserting data into SQLite table from ClickHouse table: + +``` sql +CREATE TABLE clickhouse_table(`col1` String,`col2` Int16) ENGINE = MergeTree() ORDER BY col2; +INSERT INTO clickhouse_table VALUES ('text',10); +INSERT INTO sqlite_db.table1 SELECT * FROM clickhouse_table; +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +│ text │ 10 │ +└───────┴──────┘ +``` diff --git a/docs/en/engines/table-engines/integrations/index.md b/docs/en/engines/table-engines/integrations/index.md index eb1c5411e18..743d25ad616 100644 --- a/docs/en/engines/table-engines/integrations/index.md +++ b/docs/en/engines/table-engines/integrations/index.md @@ -19,3 +19,4 @@ List of supported integrations: - [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) diff --git a/docs/en/engines/table-engines/integrations/sqlite.md b/docs/en/engines/table-engines/integrations/sqlite.md new file mode 100644 index 00000000000..391f1696291 --- /dev/null +++ b/docs/en/engines/table-engines/integrations/sqlite.md @@ -0,0 +1,59 @@ +--- +toc_priority: 7 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +The engine allows to import and export data to SQLite and supports queries to SQLite tables directly from ClickHouse. + +## Creating a Table {#creating-a-table} + +``` sql + CREATE TABLE [IF NOT EXISTS] [db.]table_name + ( + name1 [type1], + name2 [type2], ... + ) ENGINE = SQLite('db_path', 'table') +``` + +**Engine Parameters** + +- `db_path` — Path to SQLite file with a database. +- `table` — Name of a table in the SQLite database. + +## Usage Example {#usage-example} + +Shows a query creating the SQLite table: + +```sql +SHOW CREATE TABLE sqlite_db.table2; +``` + +``` text +CREATE TABLE SQLite.table2 +( + `col1` Nullable(Int32), + `col2` Nullable(String) +) +ENGINE = SQLite('sqlite.db','table2'); +``` + +Returns the data from the table: + +``` sql +SELECT * FROM sqlite_db.table2 ORDER BY col1; +``` + +```text +┌─col1─┬─col2──┐ +│ 1 │ text1 │ +│ 2 │ text2 │ +│ 3 │ text3 │ +└──────┴───────┘ +``` + +**See Also** + +- [SQLite](../../../engines/database-engines/sqlite.md) engine +- [sqlite](../../../sql-reference/table-functions/sqlite.md) table function \ No newline at end of file diff --git a/docs/en/engines/table-engines/mergetree-family/mergetree.md b/docs/en/engines/table-engines/mergetree-family/mergetree.md index 1ca7725b35c..94ef48d8d72 100644 --- a/docs/en/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/mergetree.md @@ -99,7 +99,9 @@ For a description of parameters, see the [CREATE query description](../../../sql - `use_minimalistic_part_header_in_zookeeper` — Storage method of the data parts headers in ZooKeeper. If `use_minimalistic_part_header_in_zookeeper=1`, then ZooKeeper stores less data. For more information, see the [setting description](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) in “Server configuration parameters”. - `min_merge_bytes_to_use_direct_io` — The minimum data volume for merge operation that is required for using direct I/O access to the storage disk. When merging data parts, ClickHouse calculates the total storage volume of all the data to be merged. If the volume exceeds `min_merge_bytes_to_use_direct_io` bytes, ClickHouse reads and writes the data to the storage disk using the direct I/O interface (`O_DIRECT` option). If `min_merge_bytes_to_use_direct_io = 0`, then direct I/O is disabled. Default value: `10 * 1024 * 1024 * 1024` bytes. - - `merge_with_ttl_timeout` — Minimum delay in seconds before repeating a merge with TTL. Default value: 86400 (1 day). + - `merge_with_ttl_timeout` — Minimum delay in seconds before repeating a merge with delete TTL. Default value: `14400` seconds (4 hours). + - `merge_with_recompression_ttl_timeout` — Minimum delay in seconds before repeating a merge with recompression TTL. Default value: `14400` seconds (4 hours). + - `try_fetch_recompressed_part_timeout` — Timeout (in seconds) before starting merge with recompression. During this time ClickHouse tries to fetch recompressed part from replica which assigned this merge with recompression. Default value: `7200` seconds (2 hours). - `write_final_mark` — Enables or disables writing the final index mark at the end of data part (after the last byte). Default value: 1. Don’t turn it off. - `merge_max_block_size` — Maximum number of rows in block for merge operations. Default value: 8192. - `storage_policy` — Storage policy. See [Using Multiple Block Devices for Data Storage](#table_engine-mergetree-multiple-volumes). @@ -333,7 +335,7 @@ SELECT count() FROM table WHERE u64 * i32 == 10 AND u64 * length(s) >= 1234 The optional `false_positive` parameter is the probability of receiving a false positive response from the filter. Possible values: (0, 1). Default value: 0.025. - Supported data types: `Int*`, `UInt*`, `Float*`, `Enum`, `Date`, `DateTime`, `String`, `FixedString`, `Array`, `LowCardinality`, `Nullable`. + Supported data types: `Int*`, `UInt*`, `Float*`, `Enum`, `Date`, `DateTime`, `String`, `FixedString`, `Array`, `LowCardinality`, `Nullable`, `UUID`. The following functions can use it: [equals](../../../sql-reference/functions/comparison-functions.md), [notEquals](../../../sql-reference/functions/comparison-functions.md), [in](../../../sql-reference/functions/in-functions.md), [notIn](../../../sql-reference/functions/in-functions.md), [has](../../../sql-reference/functions/array-functions.md). @@ -416,18 +418,20 @@ Reading from a table is automatically parallelized. Determines the lifetime of values. -The `TTL` clause can be set for the whole table and for each individual column. Table-level TTL can also specify logic of automatic move of data between disks and volumes. +The `TTL` clause can be set for the whole table and for each individual column. Table-level `TTL` can also specify the logic of automatic moving data between disks and volumes, or recompressing parts where all the data has been expired. Expressions must evaluate to [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md) data type. -Example: +**Syntax** + +Setting time-to-live for a column: ``` sql TTL time_column TTL time_column + interval ``` -To define `interval`, use [time interval](../../../sql-reference/operators/index.md#operators-datetime) operators. +To define `interval`, use [time interval](../../../sql-reference/operators/index.md#operators-datetime) operators, for example: ``` sql TTL date_time + INTERVAL 1 MONTH @@ -440,9 +444,9 @@ When the values in the column expire, ClickHouse replaces them with the default The `TTL` clause can’t be used for key columns. -Examples: +**Examples** -Creating a table with TTL +Creating a table with `TTL`: ``` sql CREATE TABLE example_table @@ -475,11 +479,11 @@ ALTER TABLE example_table ### Table TTL {#mergetree-table-ttl} -Table can have an expression for removal of expired rows, and multiple expressions for automatic move of parts between [disks or volumes](#table_engine-mergetree-multiple-volumes). When rows in the table expire, ClickHouse deletes all corresponding rows. For parts moving feature, all rows of a part must satisfy the movement expression criteria. +Table can have an expression for removal of expired rows, and multiple expressions for automatic move of parts between [disks or volumes](#table_engine-mergetree-multiple-volumes). When rows in the table expire, ClickHouse deletes all corresponding rows. For parts moving or recompressing, all rows of a part must satisfy the `TTL` expression criteria. ``` sql TTL expr - [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'] ... + [DELETE|RECOMPRESS codec_name1|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|RECOMPRESS codec_name2|TO DISK 'aaa'|TO VOLUME 'bbb'] ... [WHERE conditions] [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ``` @@ -487,11 +491,12 @@ TTL expr Type of TTL rule may follow each TTL expression. It affects an action which is to be done once the expression is satisfied (reaches current time): - `DELETE` - delete expired rows (default action); +- `RECOMPRESS codec_name` - recompress data part with the `codec_name`; - `TO DISK 'aaa'` - move part to the disk `aaa`; - `TO VOLUME 'bbb'` - move part to the disk `bbb`; - `GROUP BY` - aggregate expired rows. -With `WHERE` clause you may specify which of the expired rows to delete or aggregate (it cannot be applied to moves). +With `WHERE` clause you may specify which of the expired rows to delete or aggregate (it cannot be applied to moves or recompression). `GROUP BY` expression must be a prefix of the table primary key. @@ -499,7 +504,7 @@ If a column is not part of the `GROUP BY` expression and is not set explicitly i **Examples** -Creating a table with TTL: +Creating a table with `TTL`: ``` sql CREATE TABLE example_table @@ -515,7 +520,7 @@ TTL d + INTERVAL 1 MONTH [DELETE], d + INTERVAL 2 WEEK TO DISK 'bbb'; ``` -Altering TTL of the table: +Altering `TTL` of the table: ``` sql ALTER TABLE example_table @@ -536,6 +541,21 @@ ORDER BY d TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1; ``` +Creating a table, where expired rows are recompressed: + +```sql +CREATE TABLE table_for_recompression +( + d DateTime, + key UInt64, + value String +) ENGINE MergeTree() +ORDER BY tuple() +PARTITION BY key +TTL d + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(17)), d + INTERVAL 1 YEAR RECOMPRESS CODEC(LZ4HC(10)) +SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0; +``` + Creating a table, where expired rows are aggregated. In result rows `x` contains the maximum value accross the grouped rows, `y` — the minimum value, and `d` — any occasional value from grouped rows. ``` sql @@ -552,14 +572,19 @@ ORDER BY (k1, k2) TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y); ``` -**Removing Data** +### Removing Expired Data {#mergetree-removing-expired-data} -Data with an expired TTL is removed when ClickHouse merges data parts. +Data with an expired `TTL` is removed when ClickHouse merges data parts. -When ClickHouse see that data is expired, it performs an off-schedule merge. To control the frequency of such merges, you can set `merge_with_ttl_timeout`. If the value is too low, it will perform many off-schedule merges that may consume a lot of resources. +When ClickHouse detects that data is expired, it performs an off-schedule merge. To control the frequency of such merges, you can set `merge_with_ttl_timeout`. If the value is too low, it will perform many off-schedule merges that may consume a lot of resources. If you perform the `SELECT` query between merges, you may get expired data. To avoid it, use the [OPTIMIZE](../../../sql-reference/statements/optimize.md) query before `SELECT`. +**See Also** + +- [ttl_only_drop_parts](../../../operations/settings/settings.md#ttl_only_drop_parts) setting + + ## Using Multiple Block Devices for Data Storage {#table_engine-mergetree-multiple-volumes} ### Introduction {#introduction} diff --git a/docs/en/engines/table-engines/special/file.md b/docs/en/engines/table-engines/special/file.md index 17eef2b4941..cb5baf368d2 100644 --- a/docs/en/engines/table-engines/special/file.md +++ b/docs/en/engines/table-engines/special/file.md @@ -24,7 +24,7 @@ The `Format` parameter specifies one of the available file formats. To perform `INSERT` queries – for output. The available formats are listed in the [Formats](../../../interfaces/formats.md#formats) section. -ClickHouse does not allow specifying filesystem path for`File`. It will use folder defined by [path](../../../operations/server-configuration-parameters/settings.md) setting in server configuration. +ClickHouse does not allow specifying filesystem path for `File`. It will use folder defined by [path](../../../operations/server-configuration-parameters/settings.md) setting in server configuration. When creating table using `File(Format)` it creates empty subdirectory in that folder. When data is written to that table, it’s put into `data.Format` file in that subdirectory. diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index 07bfe158a0a..a0a8a220ad6 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -2041,10 +2041,25 @@ Default value: 0. ## input_format_parallel_parsing {#input-format-parallel-parsing} -- Type: bool -- Default value: True +Enables or disables order-preserving parallel parsing of data formats. Supported only for [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) and [JSONEachRow](../../interfaces/formats.md#jsoneachrow) formats. -Enable order-preserving parallel parsing of data formats. Supported only for TSV, TKSV, CSV, and JSONEachRow formats. +Possible values: + +- 1 — Enabled. +- 0 — Disabled. + +Default value: `0`. + +## output_format_parallel_formatting {#output-format-parallel-formatting} + +Enables or disables parallel formatting of data formats. Supported only for [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) and [JSONEachRow](../../interfaces/formats.md#jsoneachrow) formats. + +Possible values: + +- 1 — Enabled. +- 0 — Disabled. + +Default value: `0`. ## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing} diff --git a/docs/en/sql-reference/data-types/date.md b/docs/en/sql-reference/data-types/date.md index 0cfac4d59fe..bd39de14d47 100644 --- a/docs/en/sql-reference/data-types/date.md +++ b/docs/en/sql-reference/data-types/date.md @@ -9,9 +9,9 @@ A date. Stored in two bytes as the number of days since 1970-01-01 (unsigned). A The date value is stored without the time zone. -## Examples {#examples} +**Example** -**1.** Creating a table with a `DateTime`-type column and inserting data into it: +Creating a table with a `Date`-type column and inserting data into it: ``` sql CREATE TABLE dt @@ -23,10 +23,7 @@ ENGINE = TinyLog; ``` ``` sql -INSERT INTO dt Values (1546300800, 1), ('2019-01-01', 2); -``` - -``` sql +INSERT INTO dt VALUES (1546300800, 1), ('2019-01-01', 2); SELECT * FROM dt; ``` @@ -37,11 +34,8 @@ SELECT * FROM dt; └────────────┴──────────┘ ``` -## See Also {#see-also} +**See Also** - [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) - [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) - [`DateTime` data type](../../sql-reference/data-types/datetime.md) - - -[Original article](https://clickhouse.tech/docs/en/data_types/date/) diff --git a/docs/en/sql-reference/data-types/date32.md b/docs/en/sql-reference/data-types/date32.md new file mode 100644 index 00000000000..592f952e1be --- /dev/null +++ b/docs/en/sql-reference/data-types/date32.md @@ -0,0 +1,40 @@ +--- +toc_priority: 48 +toc_title: Date32 +--- + +# Date32 {#data_type-datetime32} + +A date. Supports the date range same with [Datetime64](../../sql-reference/data-types/datetime64.md). Stored in four bytes as the number of days since 1925-01-01. Allows storing values till 2283-11-11. + +**Examples** + +Creating a table with a `Date32`-type column and inserting data into it: + +``` sql +CREATE TABLE new +( + `timestamp` Date32, + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +INSERT INTO new VALUES (4102444800, 1), ('2100-01-01', 2); +SELECT * FROM new; +``` + +``` text +┌──timestamp─┬─event_id─┐ +│ 2100-01-01 │ 1 │ +│ 2100-01-01 │ 2 │ +└────────────┴──────────┘ +``` + +**See Also** + +- [toDate32](../../sql-reference/functions/type-conversion-functions.md#todate32) +- [toDate32OrZero](../../sql-reference/functions/type-conversion-functions.md#todate32-or-zero) +- [toDate32OrNull](../../sql-reference/functions/type-conversion-functions.md#todate32-or-null) + diff --git a/docs/en/sql-reference/data-types/datetime64.md b/docs/en/sql-reference/data-types/datetime64.md index 1d3725b9fb3..112461535f7 100644 --- a/docs/en/sql-reference/data-types/datetime64.md +++ b/docs/en/sql-reference/data-types/datetime64.md @@ -17,7 +17,7 @@ DateTime64(precision, [timezone]) Internally, stores data as a number of ‘ticks’ since epoch start (1970-01-01 00:00:00 UTC) as Int64. The tick resolution is determined by the precision parameter. Additionally, the `DateTime64` type can store time zone that is the same for the entire column, that affects how the values of the `DateTime64` type values are displayed in text format and how the values specified as strings are parsed (‘2020-01-01 05:00:01.000’). The time zone is not stored in the rows of the table (or in resultset), but is stored in the column metadata. See details in [DateTime](../../sql-reference/data-types/datetime.md). -Supported range from January 1, 1925 till December 31, 2283. +Supported range from January 1, 1925 till November 11, 2283. ## Examples {#examples} diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index ad6edaea312..05f39e2d4e6 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -152,6 +152,104 @@ Alias: `DATE`. ## toDateTimeOrNull {#todatetimeornull} +## toDate32 {#todate32} + +Converts the argument to the [Date32](../../sql-reference/data-types/date32.md) data type. If the value is outside the range returns the border values supported by `Date32`. If the argument has [Date](../../sql-reference/data-types/date.md) type, borders of `Date` are taken into account. + +**Syntax** + +``` sql +toDate32(expr) +``` + +**Arguments** + +- `expr` — The value. [String](../../sql-reference/data-types/string.md), [UInt32](../../sql-reference/data-types/int-uint.md) or [Date](../../sql-reference/data-types/date.md). + +**Returned value** + +- A calendar date. + +Type: [Date32](../../sql-reference/data-types/date32.md). + +**Example** + +1. The value is within the range: + +``` sql +SELECT toDate32('1955-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1955-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +2. The value is outside the range: + +``` sql +SELECT toDate32('1924-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1925-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +3. With `Date`-type argument: + +``` sql +SELECT toDate32(toDate('1924-01-01')) AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32(toDate('1924-01-01')))─┐ +│ 1970-01-01 │ Date32 │ +└────────────┴────────────────────────────────────────────┘ +``` + +## toDate32OrZero {#todate32-or-zero} + +The same as [toDate32](#todate32) but returns the min value of [Date32](../../sql-reference/data-types/date32.md) if invalid argument is received. + +**Example** + +Query: + +``` sql +SELECT toDate32OrZero('1924-01-01'), toDate32OrZero(''); +``` + +Result: + +``` text +┌─toDate32OrZero('1924-01-01')─┬─toDate32OrZero('')─┐ +│ 1925-01-01 │ 1925-01-01 │ +└──────────────────────────────┴────────────────────┘ +``` + +## toDate32OrNull {#todate32-or-null} + +The same as [toDate32](#todate32) but returns `NULL` if invalid argument is received. + +**Example** + +Query: + +``` sql +SELECT toDate32OrNull('1955-01-01'), toDate32OrNull(''); +``` + +Result: + +``` text +┌─toDate32OrNull('1955-01-01')─┬─toDate32OrNull('')─┐ +│ 1955-01-01 │ ᴺᵁᴸᴸ │ +└──────────────────────────────┴────────────────────┘ +``` + ## toDecimal(32\|64\|128\|256) {#todecimal3264128256} Converts `value` to the [Decimal](../../sql-reference/data-types/decimal.md) data type with precision of `S`. The `value` can be a number or a string. The `S` (scale) parameter specifies the number of decimal places. diff --git a/docs/en/sql-reference/statements/select/join.md b/docs/en/sql-reference/statements/select/join.md index 0002e6db313..8f265bc3371 100644 --- a/docs/en/sql-reference/statements/select/join.md +++ b/docs/en/sql-reference/statements/select/join.md @@ -6,7 +6,7 @@ toc_title: JOIN Join produces a new table by combining columns from one or multiple tables by using values common to each. It is a common operation in databases with SQL support, which corresponds to [relational algebra](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators) join. The special case of one table join is often referred to as “self-join”. -Syntax: +**Syntax** ``` sql SELECT @@ -38,7 +38,7 @@ Additional join types available in ClickHouse: ## Settings {#join-settings} -The default join type can be overriden using [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness) setting. +The default join type can be overridden using [join_default_strictness](../../../operations/settings/settings.md#settings-join_default_strictness) setting. The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) setting. @@ -52,6 +52,61 @@ The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_ - [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge) - [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) +## ON Section Conditions {on-section-conditions} + +An `ON` section can contain several conditions combined using the `AND` operator. Conditions specifying join keys must refer both left and right tables and must use the equality operator. Other conditions may use other logical operators but they must refer either the left or the right table of a query. +Rows are joined if the whole complex condition is met. If the conditions are not met, still rows may be included in the result depending on the `JOIN` type. Note that if the same conditions are placed in a `WHERE` section and they are not met, then rows are always filtered out from the result. + +!!! note "Note" + The `OR` operator inside an `ON` section is not supported yet. + +!!! note "Note" + If a condition refers columns from different tables, then only the equality operator (`=`) is supported so far. + +**Example** + +Consider `table_1` and `table_2`: + +``` +┌─Id─┬─name─┐ ┌─Id─┬─text───────────┬─scores─┐ +│ 1 │ A │ │ 1 │ Text A │ 10 │ +│ 2 │ B │ │ 1 │ Another text A │ 12 │ +│ 3 │ C │ │ 2 │ Text B │ 15 │ +└────┴──────┘ └────┴────────────────┴────────┘ +``` + +Query with one join key condition and an additional condition for `table_2`: + +``` sql +SELECT name, text FROM table_1 LEFT OUTER JOIN table_2 + ON table_1.Id = table_2.Id AND startsWith(table_2.text, 'Text'); +``` + +Note that the result contains the row with the name `C` and the empty text column. It is included into the result because an `OUTER` type of a join is used. + +``` +┌─name─┬─text───┐ +│ A │ Text A │ +│ B │ Text B │ +│ C │ │ +└──────┴────────┘ +``` + +Query with `INNER` type of a join and multiple conditions: + +``` sql +SELECT name, text, scores FROM table_1 INNER JOIN table_2 + ON table_1.Id = table_2.Id AND table_2.scores > 10 AND startsWith(table_2.text, 'Text'); +``` + +Result: + +``` +┌─name─┬─text───┬─scores─┐ +│ B │ Text B │ 15 │ +└──────┴────────┴────────┘ +``` + ## ASOF JOIN Usage {#asof-join-usage} `ASOF JOIN` is useful when you need to join records that have no exact match. @@ -59,7 +114,7 @@ The behavior of ClickHouse server for `ANY JOIN` operations depends on the [any_ Algorithm requires the special column in tables. This column: - Must contain an ordered sequence. -- Can be one of the following types: [Int*, UInt*](../../../sql-reference/data-types/int-uint.md), [Float\*](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal\*](../../../sql-reference/data-types/decimal.md). +- Can be one of the following types: [Int, UInt](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal](../../../sql-reference/data-types/decimal.md). - Can’t be the only column in the `JOIN` clause. Syntax `ASOF JOIN ... ON`: @@ -84,7 +139,7 @@ ASOF JOIN table_2 USING (equi_column1, ... equi_columnN, asof_column) ``` -`ASOF JOIN` uses `equi_columnX` for joining on equality and `asof_column` for joining on the closest match with the `table_1.asof_column >= table_2.asof_column` condition. The `asof_column` column always the last one in the `USING` clause. +`ASOF JOIN` uses `equi_columnX` for joining on equality and `asof_column` for joining on the closest match with the `table_1.asof_column >= table_2.asof_column` condition. The `asof_column` column is always the last one in the `USING` clause. For example, consider the following tables: diff --git a/docs/en/sql-reference/table-functions/index.md b/docs/en/sql-reference/table-functions/index.md index d65a18ab985..64afe30ef18 100644 --- a/docs/en/sql-reference/table-functions/index.md +++ b/docs/en/sql-reference/table-functions/index.md @@ -14,7 +14,7 @@ You can use table functions in: The method for creating a temporary table that is available only in the current query. The table is deleted when the query finishes. -- [CREATE TABLE AS \](../../sql-reference/statements/create/table.md) query. +- [CREATE TABLE AS table_function()](../../sql-reference/statements/create/table.md) query. It's one of the methods of creating a table. @@ -34,5 +34,6 @@ You can use table functions in: | [odbc](../../sql-reference/table-functions/odbc.md) | Creates a [ODBC](../../engines/table-engines/integrations/odbc.md)-engine table. | | [hdfs](../../sql-reference/table-functions/hdfs.md) | Creates a [HDFS](../../engines/table-engines/integrations/hdfs.md)-engine table. | | [s3](../../sql-reference/table-functions/s3.md) | Creates a [S3](../../engines/table-engines/integrations/s3.md)-engine table. | +| [sqlite](../../sql-reference/table-functions/sqlite.md) | Creates a [sqlite](../../engines/table-engines/integrations/sqlite.md)-engine table. | [Original article](https://clickhouse.tech/docs/en/sql-reference/table-functions/) diff --git a/docs/en/sql-reference/table-functions/sqlite.md b/docs/en/sql-reference/table-functions/sqlite.md new file mode 100644 index 00000000000..be7bd92d7e7 --- /dev/null +++ b/docs/en/sql-reference/table-functions/sqlite.md @@ -0,0 +1,45 @@ +--- +toc_priority: 55 +toc_title: sqlite +--- + +## sqlite {#sqlite} + +Allows to perform queries on a data stored in an [SQLite](../../engines/database-engines/sqlite.md) database. + +**Syntax** + +``` sql + sqlite('db_path', 'table_name') +``` + +**Arguments** + +- `db_path` — Path to a file with an SQLite database. [String](../../sql-reference/data-types/string.md). +- `table_name` — Name of a table in the SQLite database. [String](../../sql-reference/data-types/string.md). + +**Returned value** + +- A table object with the same columns as in the original `SQLite` table. + +**Example** + +Query: + +``` sql +SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2; +``` + +Result: + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` + +**See Also** + +- [SQLite](../../engines/table-engines/integrations/sqlite.md) table engine \ No newline at end of file diff --git a/docs/ru/development/architecture.md b/docs/ru/development/architecture.md index d2cfc44b711..8317377b3db 100644 --- a/docs/ru/development/architecture.md +++ b/docs/ru/development/architecture.md @@ -36,7 +36,7 @@ ClickHouse - полноценная колоночная СУБД. Данные `IDataType` и `IColumn` слабо связаны друг с другом. Различные типы данных могут быть представлены в памяти с помощью одной реализации `IColumn`. Например, и `DataTypeUInt32`, и `DataTypeDateTime` в памяти представлены как `ColumnUInt32` или `ColumnConstUInt32`. В добавок к этому, один тип данных может быть представлен различными реализациями `IColumn`. Например, `DataTypeUInt8` может быть представлен как `ColumnUInt8` и `ColumnConstUInt8`. -`IDataType` хранит только метаданные. Например, `DataTypeUInt8` не хранить ничего (кроме скрытого указателя `vptr`), а `DataTypeFixedString` хранит только `N` (фиксированный размер строки). +`IDataType` хранит только метаданные. Например, `DataTypeUInt8` не хранит ничего (кроме скрытого указателя `vptr`), а `DataTypeFixedString` хранит только `N` (фиксированный размер строки). В `IDataType` есть вспомогательные методы для данных различного формата. Среди них методы сериализации значений, допускающих использование кавычек, сериализации значения в JSON или XML. Среди них нет прямого соответствия форматам данных. Например, различные форматы `Pretty` и `TabSeparated` могут использовать один вспомогательный метод `serializeTextEscaped` интерфейса `IDataType`. @@ -62,7 +62,7 @@ ClickHouse - полноценная колоночная СУБД. Данные > Потоки блоков используют «втягивающий» (pull) подход к управлению потоком выполнения: когда вы вытягиваете блок из первого потока, он, следовательно, вытягивает необходимые блоки из вложенных потоков, так и работает весь конвейер выполнения. Ни «pull» ни «push» не имеют явного преимущества, потому что поток управления неявный, и это ограничивает в реализации различных функций, таких как одновременное выполнение нескольких запросов (слияние нескольких конвейеров вместе). Это ограничение можно преодолеть с помощью сопрограмм (coroutines) или просто запуском дополнительных потоков, которые ждут друг друга. У нас может быть больше возможностей, если мы сделаем поток управления явным: если мы локализуем логику для передачи данных из одной расчетной единицы в другую вне этих расчетных единиц. Читайте эту [статью](http://journal.stuffwithstuff.com/2013/01/13/iteration-inside-and-out/) для углубленного изучения. -Следует отметить, что конвейер выполнения запроса создает временные данные на каждом шаге. Мы стараемся сохранить размер блока достаточно маленьким, чтобы временные данные помещались в кэш процессора. При таком допущении запись и чтение временных данных практически бесплатны по сравнению с другими расчетами. Мы могли бы рассмотреть альтернативу, которая заключается в том, чтобы объединить многие операции в конвеере вместе. Это может сделать конвейер как можно короче и удалить большую часть временных данных, что может быть преимуществом, но у такого подхода также есть недостатки. Например, разделенный конвейер позволяет легко реализовать кэширование промежуточных данных, использование промежуточных данных из аналогичных запросов, выполняемых одновременно, и объединение конвейеров для аналогичных запросов. +Следует отметить, что конвейер выполнения запроса создает временные данные на каждом шаге. Мы стараемся сохранить размер блока достаточно маленьким, чтобы временные данные помещались в кэш процессора. При таком допущении запись и чтение временных данных практически бесплатны по сравнению с другими расчетами. Мы могли бы рассмотреть альтернативу, которая заключается в том, чтобы объединить многие операции в конвейере вместе. Это может сделать конвейер как можно короче и удалить большую часть временных данных, что может быть преимуществом, но у такого подхода также есть недостатки. Например, разделенный конвейер позволяет легко реализовать кэширование промежуточных данных, использование промежуточных данных из аналогичных запросов, выполняемых одновременно, и объединение конвейеров для аналогичных запросов. ## Форматы {#formats} @@ -119,7 +119,7 @@ ClickHouse - полноценная колоночная СУБД. Данные Существуют обычные функции и агрегатные функции. Агрегатные функции смотрите в следующем разделе. -Обычный функции не изменяют число строк и работают так, как если бы обрабатывали каждую строку независимо. В действительности же, функции вызываются не к отдельным строкам, а блокам данных для реализации векторизованного выполнения запросов. +Обычные функции не изменяют число строк и работают так, как если бы обрабатывали каждую строку независимо. В действительности же, функции вызываются не к отдельным строкам, а блокам данных для реализации векторизованного выполнения запросов. Некоторые функции, такие как [blockSize](../sql-reference/functions/other-functions.md#function-blocksize), [rowNumberInBlock](../sql-reference/functions/other-functions.md#function-rownumberinblock), и [runningAccumulate](../sql-reference/functions/other-functions.md#runningaccumulate), эксплуатируют блочную обработку и нарушают независимость строк. @@ -162,7 +162,7 @@ ClickHouse имеет сильную типизацию, поэтому нет Сервера в кластере в основном независимы. Вы можете создать `Распределенную` (`Distributed`) таблицу на одном или всех серверах в кластере. Такая таблица сама по себе не хранит данные - она только предоставляет возможность "просмотра" всех локальных таблиц на нескольких узлах кластера. При выполнении `SELECT` распределенная таблица переписывает запрос, выбирает удаленные узлы в соответствии с настройками балансировки нагрузки и отправляет им запрос. Распределенная таблица просит удаленные сервера обработать запрос до той стадии, когда промежуточные результаты с разных серверов могут быть объединены. Затем он получает промежуточные результаты и объединяет их. Распределенная таблица пытается возложить как можно больше работы на удаленные серверы и сократить объем промежуточных данных, передаваемых по сети. -Ситуация усложняется, при использовании подзапросов в случае `IN` или `JOIN`, когда каждый из них использует таблицу `Distributed`. Есть разные стратегии для выполнения таких запросов. +Ситуация усложняется при использовании подзапросов в случае `IN` или `JOIN`, когда каждый из них использует таблицу `Distributed`. Есть разные стратегии для выполнения таких запросов. Глобального плана выполнения распределенных запросов не существует. Каждый узел имеет собственный локальный план для своей части работы. У нас есть простое однонаправленное выполнение распределенных запросов: мы отправляем запросы на удаленные узлы и затем объединяем результаты. Но это невозможно для сложных запросов `GROUP BY` высокой кардинальности или запросов с большим числом временных данных в `JOIN`: в таких случаях нам необходимо перераспределить («reshuffle») данные между серверами, что требует дополнительной координации. ClickHouse не поддерживает выполнение запросов такого рода, и нам нужно работать над этим. diff --git a/docs/ru/engines/database-engines/sqlite.md b/docs/ru/engines/database-engines/sqlite.md new file mode 100644 index 00000000000..987ac187429 --- /dev/null +++ b/docs/ru/engines/database-engines/sqlite.md @@ -0,0 +1,79 @@ +--- +toc_priority: 32 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +Движок баз данных позволяет подключаться к базе [SQLite](https://www.sqlite.org/index.html) и выполнять запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и SQLite. + +## Создание базы данных {#creating-a-database} + +``` sql + CREATE DATABASE sqlite_database + ENGINE = SQLite('db_path') +``` + +**Параметры движка** + +- `db_path` — путь к файлу с базой данных SQLite. + +## Поддерживаемые типы данных {#data_types-support} + +| SQLite | ClickHouse | +|---------------|---------------------------------------------------------| +| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) | +| REAL | [Float32](../../sql-reference/data-types/float.md) | +| TEXT | [String](../../sql-reference/data-types/string.md) | +| BLOB | [String](../../sql-reference/data-types/string.md) | + +## Особенности и рекомендации {#specifics-and-recommendations} + +SQLite хранит всю базу данных (определения, таблицы, индексы и сами данные) в виде единого кроссплатформенного файла на хост-машине. Во время записи SQLite блокирует весь файл базы данных, поэтому операции записи выполняются последовательно. Операции чтения могут быть многозадачными. +SQLite не требует управления службами (например, сценариями запуска) или контроля доступа на основе `GRANT` и паролей. Контроль доступа осуществляется с помощью разрешений файловой системы, предоставляемых самому файлу базы данных. + +## Примеры использования {#usage-example} + +Отобразим список таблиц базы данных в ClickHouse, подключенной к SQLite: + +``` sql +CREATE DATABASE sqlite_db ENGINE = SQLite('sqlite.db'); +SHOW TABLES FROM sqlite_db; +``` + +``` text +┌──name───┐ +│ table1 │ +│ table2 │ +└─────────┘ +``` +Отобразим содержимое таблицы: + +``` sql +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` +Вставим данные в таблицу SQLite из таблицы ClickHouse: + +``` sql +CREATE TABLE clickhouse_table(`col1` String,`col2` Int16) ENGINE = MergeTree() ORDER BY col2; +INSERT INTO clickhouse_table VALUES ('text',10); +INSERT INTO sqlite_db.table1 SELECT * FROM clickhouse_table; +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +│ text │ 10 │ +└───────┴──────┘ +``` diff --git a/docs/ru/engines/table-engines/integrations/sqlite.md b/docs/ru/engines/table-engines/integrations/sqlite.md new file mode 100644 index 00000000000..825b49cfde6 --- /dev/null +++ b/docs/ru/engines/table-engines/integrations/sqlite.md @@ -0,0 +1,59 @@ +--- +toc_priority: 7 +toc_title: SQLite +--- + +# SQLite {#sqlite} + +Движок позволяет импортировать и экспортировать данные из SQLite, а также поддерживает отправку запросов к таблицам SQLite напрямую из ClickHouse. + +## Создание таблицы {#creating-a-table} + +``` sql + CREATE TABLE [IF NOT EXISTS] [db.]table_name + ( + name1 [type1], + name2 [type2], ... + ) ENGINE = SQLite('db_path', 'table') +``` + +**Параметры движка** + +- `db_path` — путь к файлу с базой данных SQLite. +- `table` — имя таблицы в базе данных SQLite. + +## Примеры использования {#usage-example} + +Отобразим запрос, с помощью которого была создана таблица SQLite: + +```sql +SHOW CREATE TABLE sqlite_db.table2; +``` + +``` text +CREATE TABLE SQLite.table2 +( + `col1` Nullable(Int32), + `col2` Nullable(String) +) +ENGINE = SQLite('sqlite.db','table2'); +``` + +Получим данные из таблицы: + +``` sql +SELECT * FROM sqlite_db.table2 ORDER BY col1; +``` + +```text +┌─col1─┬─col2──┐ +│ 1 │ text1 │ +│ 2 │ text2 │ +│ 3 │ text3 │ +└──────┴───────┘ +``` + +**См. также** + +- [SQLite](../../../engines/database-engines/sqlite.md) движок баз данных +- [sqlite](../../../sql-reference/table-functions/sqlite.md) табличная функция diff --git a/docs/ru/engines/table-engines/mergetree-family/mergetree.md b/docs/ru/engines/table-engines/mergetree-family/mergetree.md index e688d726554..7e517be2d66 100644 --- a/docs/ru/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/ru/engines/table-engines/mergetree-family/mergetree.md @@ -86,7 +86,9 @@ ORDER BY expr - `enable_mixed_granularity_parts` — включает или выключает переход к ограничению размера гранул с помощью настройки `index_granularity_bytes`. Настройка `index_granularity_bytes` улучшает производительность ClickHouse при выборке данных из таблиц с большими (десятки и сотни мегабайтов) строками. Если у вас есть таблицы с большими строками, можно включить эту настройку, чтобы повысить эффективность запросов `SELECT`. - `use_minimalistic_part_header_in_zookeeper` — Способ хранения заголовков кусков данных в ZooKeeper. Если `use_minimalistic_part_header_in_zookeeper = 1`, то ZooKeeper хранит меньше данных. Подробнее читайте в [описании настройки](../../../operations/server-configuration-parameters/settings.md#server-settings-use_minimalistic_part_header_in_zookeeper) в разделе "Конфигурационные параметры сервера". - `min_merge_bytes_to_use_direct_io` — минимальный объём данных при слиянии, необходимый для прямого (небуферизованного) чтения/записи (direct I/O) на диск. При слиянии частей данных ClickHouse вычисляет общий объём хранения всех данных, подлежащих слиянию. Если общий объём хранения всех данных для чтения превышает `min_bytes_to_use_direct_io` байт, тогда ClickHouse использует флаг `O_DIRECT` при чтении данных с диска. Если `min_merge_bytes_to_use_direct_io = 0`, тогда прямой ввод-вывод отключен. Значение по умолчанию: `10 * 1024 * 1024 * 1024` байтов. - - `merge_with_ttl_timeout` — минимальное время в секундах перед повторным слиянием с TTL. По умолчанию — 86400 (1 день). + - `merge_with_ttl_timeout` — минимальное время в секундах перед повторным слиянием для удаления данных с истекшим TTL. По умолчанию: `14400` секунд (4 часа). + - `merge_with_recompression_ttl_timeout` — минимальное время в секундах перед повторным слиянием для повторного сжатия данных с истекшим TTL. По умолчанию: `14400` секунд (4 часа). + - `try_fetch_recompressed_part_timeout` — время ожидания (в секундах) перед началом слияния с повторным сжатием. В течение этого времени ClickHouse пытается извлечь сжатую часть из реплики, которая назначила это слияние. Значение по умолчанию: `7200` секунд (2 часа). - `write_final_mark` — включает или отключает запись последней засечки индекса в конце куска данных, указывающей за последний байт. По умолчанию — 1. Не отключайте её. - `merge_max_block_size` — максимальное количество строк в блоке для операций слияния. Значение по умолчанию: 8192. - `storage_policy` — политика хранения данных. Смотрите [Хранение данных таблицы на нескольких блочных устройствах](#table_engine-mergetree-multiple-volumes). @@ -401,20 +403,22 @@ INDEX b (u64 * length(str), i32 + f64 * 100, date, str) TYPE set(100) GRANULARIT ## TTL для столбцов и таблиц {#table_engine-mergetree-ttl} -Определяет время жизни значений, а также правила перемещения данных на другой диск или том. +Определяет время жизни значений. -Секция `TTL` может быть установлена как для всей таблицы, так и для каждого отдельного столбца. Правила `TTL` для таблицы позволяют указать целевые диски или тома для фонового перемещения на них частей данных. +Секция `TTL` может быть установлена как для всей таблицы, так и для каждого отдельного столбца. Для таблиц можно установить правила `TTL` для фонового перемещения кусков данных на целевые диски или тома, или правила повторного сжатия кусков данных. Выражения должны возвращать тип [Date](../../../engines/table-engines/mergetree-family/mergetree.md) или [DateTime](../../../engines/table-engines/mergetree-family/mergetree.md). -Для задания времени жизни столбца, например: +**Синтаксис** + +Для задания времени жизни столбца: ``` sql TTL time_column TTL time_column + interval ``` -Чтобы задать `interval`, используйте операторы [интервала времени](../../../engines/table-engines/mergetree-family/mergetree.md#operators-datetime). +Чтобы задать `interval`, используйте операторы [интервала времени](../../../engines/table-engines/mergetree-family/mergetree.md#operators-datetime), например: ``` sql TTL date_time + INTERVAL 1 MONTH @@ -423,13 +427,13 @@ TTL date_time + INTERVAL 15 HOUR ### TTL столбца {#mergetree-column-ttl} -Когда срок действия значений в столбце истечет, ClickHouse заменит их значениями по умолчанию для типа данных столбца. Если срок действия всех значений столбцов в части данных истек, ClickHouse удаляет столбец из куска данных в файловой системе. +Когда срок действия значений в столбце истечёт, ClickHouse заменит их значениями по умолчанию для типа данных столбца. Если срок действия всех значений столбцов в части данных истек, ClickHouse удаляет столбец из куска данных в файловой системе. Секцию `TTL` нельзя использовать для ключевых столбцов. -Примеры: +**Примеры** -Создание таблицы с TTL +Создание таблицы с `TTL`: ``` sql CREATE TABLE example_table @@ -444,7 +448,7 @@ PARTITION BY toYYYYMM(d) ORDER BY d; ``` -Добавление TTL на колонку существующей таблицы +Добавление `TTL` на колонку существующей таблицы: ``` sql ALTER TABLE example_table @@ -452,7 +456,7 @@ ALTER TABLE example_table c String TTL d + INTERVAL 1 DAY; ``` -Изменение TTL у колонки +Изменение `TTL` у колонки: ``` sql ALTER TABLE example_table @@ -462,23 +466,24 @@ ALTER TABLE example_table ### TTL таблицы {#mergetree-table-ttl} -Для таблицы можно задать одно выражение для устаревания данных, а также несколько выражений, по срабатывании которых данные переместятся на [некоторый диск или том](#table_engine-mergetree-multiple-volumes). Когда некоторые данные в таблице устаревают, ClickHouse удаляет все соответствующие строки. +Для таблицы можно задать одно выражение для устаревания данных, а также несколько выражений, при срабатывании которых данные будут перемещены на [некоторый диск или том](#table_engine-mergetree-multiple-volumes). Когда некоторые данные в таблице устаревают, ClickHouse удаляет все соответствующие строки. Операции перемещения или повторного сжатия данных выполняются только когда устаревают все данные в куске. ``` sql TTL expr - [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'] ... + [DELETE|RECOMPRESS codec_name1|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|RECOMPRESS codec_name2|TO DISK 'aaa'|TO VOLUME 'bbb'] ... [WHERE conditions] [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ``` -За каждым TTL выражением может следовать тип действия, которое выполняется после достижения времени, соответствующего результату TTL выражения: +За каждым `TTL` выражением может следовать тип действия, которое выполняется после достижения времени, соответствующего результату `TTL` выражения: - `DELETE` - удалить данные (действие по умолчанию); +- `RECOMPRESS codec_name` - повторно сжать данные с помощью кодека `codec_name`; - `TO DISK 'aaa'` - переместить данные на диск `aaa`; - `TO VOLUME 'bbb'` - переместить данные на том `bbb`; - `GROUP BY` - агрегировать данные. -В секции `WHERE` можно задать условие удаления или агрегирования устаревших строк (для перемещения условие `WHERE` не применимо). +В секции `WHERE` можно задать условие удаления или агрегирования устаревших строк (для перемещения и сжатия условие `WHERE` не применимо). Колонки, по которым агрегируются данные в `GROUP BY`, должны являться префиксом первичного ключа таблицы. @@ -486,7 +491,7 @@ TTL expr **Примеры** -Создание таблицы с TTL: +Создание таблицы с `TTL`: ``` sql CREATE TABLE example_table @@ -502,7 +507,7 @@ TTL d + INTERVAL 1 MONTH [DELETE], d + INTERVAL 2 WEEK TO DISK 'bbb'; ``` -Изменение TTL: +Изменение `TTL`: ``` sql ALTER TABLE example_table @@ -523,6 +528,21 @@ ORDER BY d TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1; ``` +Создание таблицы, в которой куски с устаревшими данными повторно сжимаются: + +```sql +CREATE TABLE table_for_recompression +( + d DateTime, + key UInt64, + value String +) ENGINE MergeTree() +ORDER BY tuple() +PARTITION BY key +TTL d + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(17)), d + INTERVAL 1 YEAR RECOMPRESS CODEC(LZ4HC(10)) +SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0; +``` + Создание таблицы, где устаревшие строки агрегируются. В результирующих строках колонка `x` содержит максимальное значение по сгруппированным строкам, `y` — минимальное значение, а `d` — случайное значение из одной из сгуппированных строк. ``` sql @@ -539,14 +559,18 @@ ORDER BY (k1, k2) TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y); ``` -**Удаление данных** +### Удаление устаревших данных {#mergetree-removing-expired-data} -Данные с истекшим TTL удаляются, когда ClickHouse мёржит куски данных. +Данные с истекшим `TTL` удаляются, когда ClickHouse мёржит куски данных. Когда ClickHouse видит, что некоторые данные устарели, он выполняет внеплановые мёржи. Для управление частотой подобных мёржей, можно задать настройку `merge_with_ttl_timeout`. Если её значение слишком низкое, придется выполнять много внеплановых мёржей, которые могут начать потреблять значительную долю ресурсов сервера. Если вы выполните запрос `SELECT` между слияниями вы можете получить устаревшие данные. Чтобы избежать этого используйте запрос [OPTIMIZE](../../../engines/table-engines/mergetree-family/mergetree.md#misc_operations-optimize) перед `SELECT`. +**См. также** + +- настройку [ttl_only_drop_parts](../../../operations/settings/settings.md#ttl_only_drop_parts) + ## Хранение данных таблицы на нескольких блочных устройствах {#table_engine-mergetree-multiple-volumes} ### Введение {#introduction} diff --git a/docs/ru/operations/settings/settings.md b/docs/ru/operations/settings/settings.md index 209c2e2001d..31cd3a15c86 100644 --- a/docs/ru/operations/settings/settings.md +++ b/docs/ru/operations/settings/settings.md @@ -1865,10 +1865,25 @@ ClickHouse генерирует исключение ## input_format_parallel_parsing {#input-format-parallel-parsing} -- Тип: bool -- Значение по умолчанию: True +Включает или отключает режим, при котором входящие данные разбиваются на части, парсинг каждой из которых осуществляется параллельно с сохранением исходного порядка. Поддерживается только для форматов [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) и [JSONEachRow](../../interfaces/formats.md#jsoneachrow). -Включает режим, при котором входящие данные парсятся параллельно, но с сохранением исходного порядка следования. Поддерживается только для форматов TSV, TKSV, CSV и JSONEachRow. +Возможные значения: + +- 1 — включен режим параллельного разбора. +- 0 — отключен режим параллельного разбора. + +Значение по умолчанию: `0`. + +## output_format_parallel_formatting {#output-format-parallel-formatting} + +Включает или отключает режим, при котором исходящие данные форматируются параллельно с сохранением исходного порядка. Поддерживается только для форматов [TSV](../../interfaces/formats.md#tabseparated), [TKSV](../../interfaces/formats.md#tskv), [CSV](../../interfaces/formats.md#csv) и [JSONEachRow](../../interfaces/formats.md#jsoneachrow). + +Возможные значения: + +- 1 — включен режим параллельного форматирования. +- 0 — отключен режим параллельного форматирования. + +Значение по умолчанию: `0`. ## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing} diff --git a/docs/ru/sql-reference/data-types/date.md b/docs/ru/sql-reference/data-types/date.md index 50508de96a3..17b4ec99d9a 100644 --- a/docs/ru/sql-reference/data-types/date.md +++ b/docs/ru/sql-reference/data-types/date.md @@ -9,9 +9,9 @@ toc_title: Date Дата хранится без учёта часового пояса. -## Примеры {#examples} +**Пример** -**1.** Создание таблицы и добавление в неё данных: +Создание таблицы и добавление в неё данных: ``` sql CREATE TABLE dt @@ -24,9 +24,6 @@ ENGINE = TinyLog; ``` sql INSERT INTO dt Values (1546300800, 1), ('2019-01-01', 2); -``` - -``` sql SELECT * FROM dt; ``` @@ -37,7 +34,7 @@ SELECT * FROM dt; └────────────┴──────────┘ ``` -## Смотрите также {#see-also} +**См. также** - [Функции для работы с датой и временем](../../sql-reference/functions/date-time-functions.md) - [Операторы для работы с датой и временем](../../sql-reference/operators/index.md#operators-datetime) diff --git a/docs/ru/sql-reference/data-types/date32.md b/docs/ru/sql-reference/data-types/date32.md new file mode 100644 index 00000000000..a335eba8e80 --- /dev/null +++ b/docs/ru/sql-reference/data-types/date32.md @@ -0,0 +1,40 @@ +--- +toc_priority: 48 +toc_title: Date32 +--- + +# Date32 {#data_type-datetime32} + +Дата. Поддерживается такой же диапазон дат, как для типа [Datetime64](../../sql-reference/data-types/datetime64.md). Значение хранится в четырех байтах и соответствует числу дней с 1925-01-01 по 2283-11-11. + +**Пример** + +Создание таблицы со столбцом типа `Date32`и добавление в нее данных: + +``` sql +CREATE TABLE new +( + `timestamp` Date32, + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +INSERT INTO new VALUES (4102444800, 1), ('2100-01-01', 2); +SELECT * FROM new; +``` + +``` text +┌──timestamp─┬─event_id─┐ +│ 2100-01-01 │ 1 │ +│ 2100-01-01 │ 2 │ +└────────────┴──────────┘ +``` + +**См. также** + +- [toDate32](../../sql-reference/functions/type-conversion-functions.md#todate32) +- [toDate32OrZero](../../sql-reference/functions/type-conversion-functions.md#todate32-or-zero) +- [toDate32OrNull](../../sql-reference/functions/type-conversion-functions.md#todate32-or-null) + diff --git a/docs/ru/sql-reference/data-types/datetime64.md b/docs/ru/sql-reference/data-types/datetime64.md index 3a08da75bb7..73daada3af3 100644 --- a/docs/ru/sql-reference/data-types/datetime64.md +++ b/docs/ru/sql-reference/data-types/datetime64.md @@ -17,7 +17,7 @@ DateTime64(precision, [timezone]) Данные хранятся в виде количества ‘тиков’, прошедших с момента начала эпохи (1970-01-01 00:00:00 UTC), в Int64. Размер тика определяется параметром precision. Дополнительно, тип `DateTime64` позволяет хранить часовой пояс, единый для всей колонки, который влияет на то, как будут отображаться значения типа `DateTime64` в текстовом виде и как будут парситься значения заданные в виде строк (‘2020-01-01 05:00:01.000’). Часовой пояс не хранится в строках таблицы (выборки), а хранится в метаданных колонки. Подробнее см. [DateTime](datetime.md). -Поддерживаются значения от 1 января 1925 г. и до 31 декабря 2283 г. +Поддерживаются значения от 1 января 1925 г. и до 11 ноября 2283 г. ## Примеры {#examples} diff --git a/docs/ru/sql-reference/functions/type-conversion-functions.md b/docs/ru/sql-reference/functions/type-conversion-functions.md index 757afca9588..16639386b67 100644 --- a/docs/ru/sql-reference/functions/type-conversion-functions.md +++ b/docs/ru/sql-reference/functions/type-conversion-functions.md @@ -152,6 +152,104 @@ Cиноним: `DATE`. ## toDateTimeOrNull {#todatetimeornull} +## toDate32 {#todate32} + +Конвертирует аргумент в значение типа [Date32](../../sql-reference/data-types/date32.md). Если значение выходит за границы диапазона, возвращается пограничное значение `Date32`. Если аргумент имеет тип [Date](../../sql-reference/data-types/date.md), учитываются границы типа `Date`. + +**Синтаксис** + +``` sql +toDate32(value) +``` + +**Аргументы** + +- `value` — Значение даты. [String](../../sql-reference/data-types/string.md), [UInt32](../../sql-reference/data-types/int-uint.md) или [Date](../../sql-reference/data-types/date.md). + +**Возвращаемое значение** + +- Календарная дата. + +Тип: [Date32](../../sql-reference/data-types/date32.md). + +**Пример** + +1. Значение находится в границах диапазона: + +``` sql +SELECT toDate32('1955-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1955-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +2. Значение выходит за границы диапазона: + +``` sql +SELECT toDate32('1924-01-01') AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1925-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +3. С аргументом типа `Date`: + +``` sql +SELECT toDate32(toDate('1924-01-01')) AS value, toTypeName(value); +``` + +``` text +┌──────value─┬─toTypeName(toDate32(toDate('1924-01-01')))─┐ +│ 1970-01-01 │ Date32 │ +└────────────┴────────────────────────────────────────────┘ +``` + +## toDate32OrZero {#todate32-or-zero} + +То же самое, что и [toDate32](#todate32), но возвращает минимальное значение типа [Date32](../../sql-reference/data-types/date32.md), если получен недопустимый аргумент. + +**Пример** + +Запрос: + +``` sql +SELECT toDate32OrZero('1924-01-01'), toDate32OrZero(''); +``` + +Результат: + +``` text +┌─toDate32OrZero('1924-01-01')─┬─toDate32OrZero('')─┐ +│ 1925-01-01 │ 1925-01-01 │ +└──────────────────────────────┴────────────────────┘ +``` + +## toDate32OrNull {#todate32-or-null} + +То же самое, что и [toDate32](#todate32), но возвращает `NULL`, если получен недопустимый аргумент. + +**Пример** + +Запрос: + +``` sql +SELECT toDate32OrNull('1955-01-01'), toDate32OrNull(''); +``` + +Результат: + +``` text +┌─toDate32OrNull('1955-01-01')─┬─toDate32OrNull('')─┐ +│ 1955-01-01 │ ᴺᵁᴸᴸ │ +└──────────────────────────────┴────────────────────┘ +``` + ## toDecimal(32\|64\|128\|256) {#todecimal3264128} Преобразует `value` к типу данных [Decimal](../../sql-reference/functions/type-conversion-functions.md) с точностью `S`. `value` может быть числом или строкой. Параметр `S` (scale) задаёт число десятичных знаков. diff --git a/docs/ru/sql-reference/statements/select/join.md b/docs/ru/sql-reference/statements/select/join.md index 03018a953ce..3cbd07326b3 100644 --- a/docs/ru/sql-reference/statements/select/join.md +++ b/docs/ru/sql-reference/statements/select/join.md @@ -6,7 +6,7 @@ toc_title: JOIN `JOIN` создаёт новую таблицу путем объединения столбцов из одной или нескольких таблиц с использованием общих для каждой из них значений. Это обычная операция в базах данных с поддержкой SQL, которая соответствует join из [реляционной алгебры](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators). Частный случай соединения одной таблицы часто называют self-join. -Синтаксис: +**Синтаксис** ``` sql SELECT @@ -19,7 +19,7 @@ FROM ## Поддерживаемые типы соединения {#select-join-types} -Все типы из стандартого [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) поддерживаются: +Все типы из стандартного [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) поддерживаются: - `INNER JOIN`, возвращаются только совпадающие строки. - `LEFT OUTER JOIN`, не совпадающие строки из левой таблицы возвращаются в дополнение к совпадающим строкам. @@ -33,7 +33,7 @@ FROM - `LEFT SEMI JOIN` и `RIGHT SEMI JOIN`, белый список по ключам соединения, не производит декартово произведение. - `LEFT ANTI JOIN` и `RIGHT ANTI JOIN`, черный список по ключам соединения, не производит декартово произведение. -- `LEFT ANY JOIN`, `RIGHT ANY JOIN` и `INNER ANY JOIN`, Частично (для противоположных сторон `LEFT` и `RIGHT`) или полностью (для `INNER` и `FULL`) отключает декартово произведение для стандартых видов `JOIN`. +- `LEFT ANY JOIN`, `RIGHT ANY JOIN` и `INNER ANY JOIN`, Частично (для противоположных сторон `LEFT` и `RIGHT`) или полностью (для `INNER` и `FULL`) отключает декартово произведение для стандартных видов `JOIN`. - `ASOF JOIN` и `LEFT ASOF JOIN`, Для соединения последовательностей по нечеткому совпадению. Использование `ASOF JOIN` описано ниже. ## Настройки {#join-settings} @@ -52,6 +52,61 @@ FROM - [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge) - [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) +## Условия в секции ON {on-section-conditions} + +Секция `ON` может содержать несколько условий, связанных оператором `AND`. Условия, задающие ключи соединения, должны содержать столбцы левой и правой таблицы и должны использовать оператор равенства. Прочие условия могут использовать другие логические операторы, но в отдельном условии могут использоваться столбцы либо только левой, либо только правой таблицы. +Строки объединяются только тогда, когда всё составное условие выполнено. Если оно не выполнено, то строки могут попасть в результат в зависимости от типа `JOIN`. Обратите внимание, что если то же самое условие поместить в секцию `WHERE`, то строки, для которых оно не выполняется, никогда не попаду в результат. + +!!! note "Примечание" + Оператор `OR` внутри секции `ON` пока не поддерживается. + +!!! note "Примечание" + Если в условии использованы столбцы из разных таблиц, то пока поддерживается только оператор равенства (`=`). + +**Пример** + +Рассмотрим `table_1` и `table_2`: + +``` +┌─Id─┬─name─┐ ┌─Id─┬─text───────────┬─scores─┐ +│ 1 │ A │ │ 1 │ Text A │ 10 │ +│ 2 │ B │ │ 1 │ Another text A │ 12 │ +│ 3 │ C │ │ 2 │ Text B │ 15 │ +└────┴──────┘ └────┴────────────────┴────────┘ +``` + +Запрос с одним условием, задающим ключ соединения, и дополнительным условием для `table_2`: + +``` sql +SELECT name, text FROM table_1 LEFT OUTER JOIN table_2 + ON table_1.Id = table_2.Id AND startsWith(table_2.text, 'Text'); +``` + +Обратите внимание, что результат содержит строку с именем `C` и пустым текстом. Строка включена в результат, потому что использован тип соединения `OUTER`. + +``` +┌─name─┬─text───┐ +│ A │ Text A │ +│ B │ Text B │ +│ C │ │ +└──────┴────────┘ +``` + +Запрос с типом соединения `INNER` и несколькими условиями: + +``` sql +SELECT name, text, scores FROM table_1 INNER JOIN table_2 + ON table_1.Id = table_2.Id AND table_2.scores > 10 AND startsWith(table_2.text, 'Text'); +``` + +Результат: + +``` +┌─name─┬─text───┬─scores─┐ +│ B │ Text B │ 15 │ +└──────┴────────┴────────┘ +``` + ## Использование ASOF JOIN {#asof-join-usage} `ASOF JOIN` применим в том случае, когда необходимо объединять записи, которые не имеют точного совпадения. @@ -59,7 +114,7 @@ FROM Для работы алгоритма необходим специальный столбец в таблицах. Этот столбец: - Должен содержать упорядоченную последовательность. -- Может быть одного из следующих типов: [Int*, UInt*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Date](../../data-types/date.md), [DateTime](../../data-types/datetime.md), [Decimal*](../../data-types/decimal.md). +- Может быть одного из следующих типов: [Int, UInt](../../data-types/int-uint.md), [Float](../../data-types/float.md), [Date](../../data-types/date.md), [DateTime](../../data-types/datetime.md), [Decimal](../../data-types/decimal.md). - Не может быть единственным столбцом в секции `JOIN`. Синтаксис `ASOF JOIN ... ON`: diff --git a/docs/ru/sql-reference/table-functions/sqlite.md b/docs/ru/sql-reference/table-functions/sqlite.md new file mode 100644 index 00000000000..3ff61455e62 --- /dev/null +++ b/docs/ru/sql-reference/table-functions/sqlite.md @@ -0,0 +1,45 @@ +--- +toc_priority: 55 +toc_title: sqlite +--- + +## sqlite {#sqlite} + +Позволяет выполнять запросы к данным, хранящимся в базе данных [SQLite](../../engines/database-engines/sqlite.md). + +**Синтаксис** + +``` sql + sqlite('db_path', 'table_name') +``` + +**Аргументы** + +- `db_path` — путь к файлу с базой данных SQLite. [String](../../sql-reference/data-types/string.md). +- `table_name` — имя таблицы в базе данных SQLite. [String](../../sql-reference/data-types/string.md). + +**Возвращаемое значение** + +- Объект таблицы с теми же столбцами, что и в исходной таблице `SQLite`. + +**Пример** + +Запрос: + +``` sql +SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2; +``` + +Результат: + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` + +**См. также** + +- [SQLite](../../engines/table-engines/integrations/sqlite.md) движок таблиц \ No newline at end of file diff --git a/programs/local/LocalServer.cpp b/programs/local/LocalServer.cpp index 957bda4d75c..b4496c121d5 100644 --- a/programs/local/LocalServer.cpp +++ b/programs/local/LocalServer.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -287,6 +288,12 @@ try /// Lock path directory before read status.emplace(path + "status", StatusFile::write_full_info); + fs::create_directories(fs::path(path) / "user_defined/"); + LOG_DEBUG(log, "Loading user defined objects from {}", path); + Poco::File(path + "user_defined/").createDirectories(); + UserDefinedObjectsLoader::instance().loadObjects(global_context); + LOG_DEBUG(log, "Loaded user defined objects."); + LOG_DEBUG(log, "Loading metadata from {}", path); fs::create_directories(fs::path(path) / "data/"); fs::create_directories(fs::path(path) / "metadata/"); @@ -376,8 +383,8 @@ void LocalServer::processQueries() throw Exception("Cannot parse and execute the following part of query: " + String(parse_res.first), ErrorCodes::SYNTAX_ERROR); /// Authenticate and create a context to execute queries. - Session session{global_context, ClientInfo::Interface::TCP}; - session.authenticate("default", "", Poco::Net::SocketAddress{}); + Session session{global_context, ClientInfo::Interface::LOCAL}; + session.authenticate("default", "", {}); /// Use the same context for all queries. auto context = session.makeQueryContext(); diff --git a/programs/server/Server.cpp b/programs/server/Server.cpp index 4e3f550f67d..8102675d102 100644 --- a/programs/server/Server.cpp +++ b/programs/server/Server.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -736,6 +737,10 @@ if (ThreadFuzzer::instance().isEffective()) setupTmpPath(log, disk->getPath()); } + /// Storage keeping all the backups. + fs::create_directories(path / "backups"); + global_context->setBackupsVolume(config().getString("backups_path", path / "backups"), config().getString("backups_policy", "")); + /** Directory with 'flags': files indicating temporary settings for the server set by system administrator. * Flags may be cleared automatically after being applied by the server. * Examples: do repair of local data; clone all replicated tables from replica. @@ -770,6 +775,7 @@ if (ThreadFuzzer::instance().isEffective()) { fs::create_directories(path / "data/"); fs::create_directories(path / "metadata/"); + fs::create_directories(path / "user_defined/"); /// Directory with metadata of tables, which was marked as dropped by Atomic database fs::create_directories(path / "metadata_dropped/"); @@ -1079,6 +1085,9 @@ if (ThreadFuzzer::instance().isEffective()) /// Wait server pool to avoid use-after-free of destroyed context in the handlers server_pool.joinAll(); + // Uses a raw pointer to global context for getting ZooKeeper. + main_config_reloader.reset(); + /** Explicitly destroy Context. It is more convenient than in destructor of Server, because logger is still available. * At this moment, no one could own shared part of Context. */ @@ -1091,6 +1100,18 @@ if (ThreadFuzzer::instance().isEffective()) /// system logs may copy global context. global_context->setCurrentDatabaseNameInGlobalContext(default_database); + LOG_INFO(log, "Loading user defined objects from {}", path_str); + try + { + UserDefinedObjectsLoader::instance().loadObjects(global_context); + } + catch (...) + { + tryLogCurrentException(log, "Caught exception while loading user defined objects"); + throw; + } + LOG_DEBUG(log, "Loaded user defined objects"); + LOG_INFO(log, "Loading metadata from {}", path_str); try @@ -1510,7 +1531,6 @@ if (ThreadFuzzer::instance().isEffective()) LOG_INFO(log, "Closed connections."); dns_cache_updater.reset(); - main_config_reloader.reset(); if (current_connections) { diff --git a/src/Access/AccessType.h b/src/Access/AccessType.h index 02d7e4982f9..b1b49a6ba75 100644 --- a/src/Access/AccessType.h +++ b/src/Access/AccessType.h @@ -87,6 +87,7 @@ enum class AccessType M(CREATE_DICTIONARY, "", DICTIONARY, CREATE) /* allows to execute {CREATE|ATTACH} DICTIONARY */\ M(CREATE_TEMPORARY_TABLE, "", GLOBAL, CREATE) /* allows to create and manipulate temporary tables; implicitly enabled by the grant CREATE_TABLE on any table */ \ + M(CREATE_FUNCTION, "", DATABASE, CREATE) /* allows to execute CREATE FUNCTION */ \ M(CREATE, "", GROUP, ALL) /* allows to execute {CREATE|ATTACH} */ \ \ M(DROP_DATABASE, "", DATABASE, DROP) /* allows to execute {DROP|DETACH} DATABASE */\ @@ -94,6 +95,7 @@ enum class AccessType M(DROP_VIEW, "", VIEW, DROP) /* allows to execute {DROP|DETACH} TABLE for views; implicitly enabled by the grant DROP_TABLE */\ M(DROP_DICTIONARY, "", DICTIONARY, DROP) /* allows to execute {DROP|DETACH} DICTIONARY */\ + M(DROP_FUNCTION, "", DATABASE, DROP) /* allows to execute DROP FUNCTION */\ M(DROP, "", GROUP, ALL) /* allows to execute {DROP|DETACH} */\ \ M(TRUNCATE, "TRUNCATE TABLE", TABLE, ALL) \ diff --git a/src/Access/tests/gtest_access_rights_ops.cpp b/src/Access/tests/gtest_access_rights_ops.cpp index 3d7b396a6f2..2881825dd17 100644 --- a/src/Access/tests/gtest_access_rights_ops.cpp +++ b/src/Access/tests/gtest_access_rights_ops.cpp @@ -45,7 +45,7 @@ TEST(AccessRights, Union) lhs.grant(AccessType::INSERT); rhs.grant(AccessType::ALL, "db1"); lhs.makeUnion(rhs); - ASSERT_EQ(lhs.toString(), "GRANT INSERT ON *.*, GRANT SHOW, SELECT, ALTER, CREATE DATABASE, CREATE TABLE, CREATE VIEW, CREATE DICTIONARY, DROP, TRUNCATE, OPTIMIZE, SYSTEM MERGES, SYSTEM TTL MERGES, SYSTEM FETCHES, SYSTEM MOVES, SYSTEM SENDS, SYSTEM REPLICATION QUEUES, SYSTEM DROP REPLICA, SYSTEM SYNC REPLICA, SYSTEM RESTART REPLICA, SYSTEM RESTORE REPLICA, SYSTEM FLUSH DISTRIBUTED, dictGet ON db1.*"); + ASSERT_EQ(lhs.toString(), "GRANT INSERT ON *.*, GRANT SHOW, SELECT, ALTER, CREATE DATABASE, CREATE TABLE, CREATE VIEW, CREATE DICTIONARY, CREATE FUNCTION, DROP, TRUNCATE, OPTIMIZE, SYSTEM MERGES, SYSTEM TTL MERGES, SYSTEM FETCHES, SYSTEM MOVES, SYSTEM SENDS, SYSTEM REPLICATION QUEUES, SYSTEM DROP REPLICA, SYSTEM SYNC REPLICA, SYSTEM RESTART REPLICA, SYSTEM RESTORE REPLICA, SYSTEM FLUSH DISTRIBUTED, dictGet ON db1.*"); } diff --git a/src/AggregateFunctions/AggregateFunctionIf.cpp b/src/AggregateFunctions/AggregateFunctionIf.cpp index d841fe8c06d..89688ce1ffd 100644 --- a/src/AggregateFunctions/AggregateFunctionIf.cpp +++ b/src/AggregateFunctions/AggregateFunctionIf.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include "AggregateFunctionNull.h" @@ -11,6 +11,7 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; extern const int ILLEGAL_TYPE_OF_ARGUMENT; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int ILLEGAL_AGGREGATION; } class AggregateFunctionCombinatorIf final : public IAggregateFunctionCombinator @@ -37,6 +38,10 @@ public: const DataTypes & arguments, const Array & params) const override { + if (nested_function->getName().find(getName()) != String::npos) + { + throw Exception(ErrorCodes::ILLEGAL_AGGREGATION, "nested function for {0}-combinator must not have {0}-combinator", getName()); + } return std::make_shared(nested_function, arguments, params); } }; diff --git a/src/AggregateFunctions/AggregateFunctionQuantile.cpp b/src/AggregateFunctions/AggregateFunctionQuantile.cpp index 11b14585653..5f84eb9b271 100644 --- a/src/AggregateFunctions/AggregateFunctionQuantile.cpp +++ b/src/AggregateFunctions/AggregateFunctionQuantile.cpp @@ -56,6 +56,8 @@ template using FuncQuantilesTDigestWeighted template using FuncQuantileBFloat16 = AggregateFunctionQuantile, NameQuantileBFloat16, false, std::conditional_t, false>; template using FuncQuantilesBFloat16 = AggregateFunctionQuantile, NameQuantilesBFloat16, false, std::conditional_t, true>; +template using FuncQuantileBFloat16Weighted = AggregateFunctionQuantile, NameQuantileBFloat16Weighted, true, std::conditional_t, false>; +template using FuncQuantilesBFloat16Weighted = AggregateFunctionQuantile, NameQuantilesBFloat16Weighted, true, std::conditional_t, true>; template